arcane-os 0.5.9 → 0.5.11

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 (55) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +117 -26
  3. package/browser-runtime/ai/browser-speech-providers.mjs +1 -1
  4. package/browser-runtime/ai/browser-wasm-llm-provider.mjs +63 -39
  5. package/docs/architecture.md +303 -0
  6. package/docs/compatibility.md +38 -0
  7. package/docs/event-manager.md +263 -0
  8. package/docs/platform-targets.md +104 -0
  9. package/docs/publishing.md +126 -0
  10. package/docs/reference/README.md +206 -0
  11. package/docs/reference/ai/browser-speech.md +813 -0
  12. package/docs/reference/ai/browser-wasm.md +637 -0
  13. package/docs/reference/ai/twin-cloud.md +156 -0
  14. package/docs/reference/arcane-ollama.md +288 -0
  15. package/docs/reference/availability-and-normalization.md +224 -0
  16. package/docs/reference/behavioral-testing.md +129 -0
  17. package/docs/reference/cli.md +820 -0
  18. package/docs/reference/core/README.md +61 -0
  19. package/docs/reference/core/arcane-ai-contracts.md +907 -0
  20. package/docs/reference/core/arcane-api.md +601 -0
  21. package/docs/reference/core/arcane-entities.md +59 -0
  22. package/docs/reference/core/arcane-events.md +134 -0
  23. package/docs/reference/core/ollama-module.md +181 -0
  24. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +1909 -0
  25. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +1057 -0
  26. package/docs/reference/core/reference/arcane-api/core-and-events.md +320 -0
  27. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +610 -0
  28. package/docs/reference/core/reference/arcane-api/namespaces.md +1157 -0
  29. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +1423 -0
  30. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +315 -0
  31. package/docs/reference/event-manager.md +1409 -0
  32. package/docs/reference/inventory/package-api.json +3194 -0
  33. package/docs/reference/inventory/runtime-components.json +1015 -0
  34. package/docs/reference/inventory/runtime-entities.json +25 -0
  35. package/docs/reference/inventory/runtime-modules.json +1367 -0
  36. package/docs/reference/mail.md +309 -0
  37. package/docs/reference/protocols.md +749 -0
  38. package/docs/reference/runtime-components.md +1529 -0
  39. package/docs/reference/runtime-entities.md +305 -0
  40. package/docs/reference/runtime-modules.md +3275 -0
  41. package/docs/reference/sdk-api.md +6733 -0
  42. package/docs/roadmap.md +79 -0
  43. package/docs/work-amplification.md +66 -0
  44. package/examples/wasm-ai-demo/README.md +80 -0
  45. package/examples/wasm-ai-demo/app.js +787 -0
  46. package/examples/wasm-ai-demo/index.html +343 -0
  47. package/examples/wasm-ai-demo/profile-tools.js +217 -0
  48. package/examples/wasm-ai-demo/profiles/BOSS.Modelfile +106 -0
  49. package/examples/wasm-ai-demo/profiles/PreCrisis.Modelfile +693 -0
  50. package/examples/wasm-ai-demo/rag/boss-library.json +3006 -0
  51. package/examples/wasm-ai-demo/rag.js +295 -0
  52. package/examples/wasm-ai-demo/server.mjs +71 -0
  53. package/package.json +11 -2
  54. package/runtime/arcane/modules/AI.js +1 -1
  55. package/runtime/arcane/modules/AIProviderRuntime.js +26 -5
@@ -0,0 +1,1529 @@
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()`. This includes decode and playback-start failures that
363
+ settle after `streamTTS()` has already resolved. Runtime mute, cancellation,
364
+ permission waiting, and stale generations remain non-errors.
365
+
366
+ Each visible model chunk is still forwarded to `AI.streamTTS()` in arrival
367
+ order. The AI owner preserves exact segmentation, admits completed segments to
368
+ bounded synthesis immediately, and schedules the contiguous ready audio prefix
369
+ on the audio clock. Chat neither creates a second queue nor reorders, combines,
370
+ or rewrites speech text.
371
+
372
+ Events: `chat-ready`, `chat-session-bound`, `chat-session-message`,
373
+ `chat-session-error`, `chat-send-message`, `chat-send-error`,
374
+ `chat-file-uploaded`, `chat-file-upload-error`, `chat-language-changed`,
375
+ `chat-language-change-error`, `chat-ai-activation-request`,
376
+ `chat-ai-activation-error`, `chat-speech-synthesis-error`, and
377
+ `conversation-timebox-error`.
378
+
379
+ All chat operation ids have the form
380
+ `<component-instance-id>:<kind>:<sequence>`. The stable public reasons are
381
+ `chat-ready`, `message-submission-requested`,
382
+ `message-submission-cancelled`, `caller-signal-aborted`,
383
+ `component-destroyed`, `host-message-submission-rejected`,
384
+ `file-storage-completed`, `file-storage-rejected`,
385
+ `language-change-requested`, `language-change-callback-rejected`,
386
+ `language-model-activation-requested`,
387
+ `language-model-activation-rejected`, `speech-synthesis-rejected`, and
388
+ `conversation-timebox-delivery-rejected`.
389
+
390
+ The stable chat boundary codes are:
391
+
392
+ - `ARCANE_CHAT_MESSAGE_SUBMISSION_ABORTED` for the owned submission signal;
393
+ - `ARCANE_CHAT_LANGUAGE_MODEL_ACTIVATION_REQUEST_REJECTED`;
394
+ - `ARCANE_CHAT_HOST_MESSAGE_SUBMISSION_REJECTED`;
395
+ - `ARCANE_CHAT_FILE_STORAGE_REJECTED`;
396
+ - `ARCANE_CHAT_LANGUAGE_CHANGE_CALLBACK_REJECTED`;
397
+ - `ARCANE_CHAT_SPEECH_SYNTHESIS_REQUEST_REJECTED`;
398
+ - `ARCANE_CHAT_CONVERSATION_TIMEBOX_DELIVERY_REJECTED`.
399
+
400
+ Error projections preserve the complete error detail, with the boundary `code`
401
+ and any distinct dependency `causeCode`. File projections preserve the complete
402
+ live `File` and its authored metadata. Language and LLM activation requests are
403
+ cancelable before their host callbacks. Every public detail remains mutable.
404
+
405
+ 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).
406
+
407
+ ### Availability and normalization
408
+
409
+ **Browser and supported native WebViews.** UI and provider-runtime state are
410
+ normalized; AI/storage/media behavior remains mixed. The component emits no
411
+ activation request on import or startup. After the user operates the visible
412
+ control and the component event is not canceled, it publishes a
413
+ capability-neutral user intent; a provider/runtime owner decides whether and
414
+ how to execute the requested load or unload. HTMLImport + DOM; injected
415
+ Arcane/provider modules where listed. Native methods remain subject to the
416
+ bound app's capabilities. [Deep protocol details](protocols.md).
417
+
418
+ ### Example
419
+
420
+ ```html
421
+ <html-import
422
+ id="chat.html"
423
+ href="/arcane/components/chat.html">
424
+ </html-import>
425
+ ```
426
+
427
+ ## conversation-view.html
428
+
429
+ ### Overview
430
+
431
+ Provider-neutral conversation display, advisory actions, composer, busy state, and status.
432
+
433
+ ### Public surface
434
+
435
+ Methods/properties: `setConversation()`, `setBusy()`, `setStatus()`, `clearComposer()`, `destroy()`.
436
+
437
+ Events: `conversation-view-ready`, `communication-send`, `communication-advisory-action`.
438
+
439
+ ### Availability and normalization
440
+
441
+ **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).
442
+
443
+ ### Example
444
+
445
+ ```html
446
+ <html-import
447
+ id="conversation-view.html"
448
+ href="/arcane/components/conversation-view.html">
449
+ </html-import>
450
+ ```
451
+
452
+ ## dashboard-config.html
453
+
454
+ ### Overview
455
+
456
+ Selects which normalized chart definitions are visible on a dashboard.
457
+
458
+ ### Public surface
459
+
460
+ Methods/properties: `configure()`, `setDefinitions()`, `setVisibility()`, `getChartOptions()`, `getEffectiveVisibility()`, `open()`, `close()`, `destroy()`.
461
+
462
+ Events: `dashboard-config-ready`, `dashboard-config-opened`, `dashboard-config-closed`, `dashboard-config-change`.
463
+
464
+ Shared dependencies: [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
465
+
466
+ ### Availability and normalization
467
+
468
+ **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).
469
+
470
+ ### Example
471
+
472
+ ```html
473
+ <html-import
474
+ id="dashboard-config.html"
475
+ href="/arcane/components/dashboard-config.html">
476
+ </html-import>
477
+ ```
478
+
479
+ ## data-maintenance.html
480
+
481
+ ### Overview
482
+
483
+ Runs destructive cleanup of empty chats and memories inside the current app data scope.
484
+
485
+ ### Public surface
486
+
487
+ Methods/properties: `open()`, `destroy()`.
488
+
489
+ Events: `data-maintenance-ready`, `data-maintenance-complete`.
490
+
491
+ Shared dependencies: [`DataMaintenance.js`](runtime-modules.md#datamaintenancejs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
492
+
493
+ ### Availability and normalization
494
+
495
+ **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).
496
+
497
+ ### Example
498
+
499
+ ```html
500
+ <html-import
501
+ id="data-maintenance.html"
502
+ href="/arcane/components/data-maintenance.html">
503
+ </html-import>
504
+ ```
505
+
506
+ ## data-view.html
507
+
508
+ ### Overview
509
+
510
+ Opens a generic modal-style data view around an injected provider.
511
+
512
+ ### Public surface
513
+
514
+ Methods/properties: `beforeOpen()`, `open()`, `destroy()`.
515
+
516
+ Events: `data-view-ready`.
517
+
518
+ Shared dependencies: [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
519
+
520
+ ### Availability and normalization
521
+
522
+ **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).
523
+
524
+ ### Example
525
+
526
+ ```html
527
+ <html-import
528
+ id="data-view.html"
529
+ href="/arcane/components/data-view.html">
530
+ </html-import>
531
+ ```
532
+
533
+ ## directory-picker.html
534
+
535
+ ### Overview
536
+
537
+ Presents the provider-owned OS directory chooser with change/cancel/error states.
538
+
539
+ ### Public surface
540
+
541
+ Methods/properties: `configure()`, `focus()`, `select()`, `destroy()`.
542
+
543
+ Events: `directory-picker-ready`, `directory-picker-change`, `directory-picker-cancel`, `directory-picker-error`.
544
+
545
+ Shared dependencies: [`DirectoryPicker.js`](runtime-modules.md#directorypickerjs).
546
+
547
+ ### Availability and normalization
548
+
549
+ **Browser and supported native WebViews.** Complete directory paths and native
550
+ selection/error content are preserved without trimming, character caps, or a
551
+ generic control-character gate. The provider or operating system owns any
552
+ platform-specific path failure. HTMLImport + DOM; injected Arcane/provider
553
+ modules where listed. Native methods remain subject to the bound app's
554
+ capabilities. [Deep protocol details](protocols.md).
555
+
556
+ ### Example
557
+
558
+ ```html
559
+ <html-import
560
+ id="directory-picker.html"
561
+ href="/arcane/components/directory-picker.html">
562
+ </html-import>
563
+ ```
564
+
565
+ ## document-inspector.html
566
+
567
+ ### Overview
568
+
569
+ Inspects PDF, text, or source documents and records review state.
570
+
571
+ ### Public surface
572
+
573
+ Methods/properties: `loadDocument()`, `selectView()`, `markSaved()`, `destroy()`.
574
+
575
+ Events: `document-inspector-ready`, `document-review-change`.
576
+
577
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs).
578
+
579
+ ### Availability and normalization
580
+
581
+ **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).
582
+
583
+ ### Example
584
+
585
+ ```html
586
+ <html-import
587
+ id="document-inspector.html"
588
+ href="/arcane/components/document-inspector.html">
589
+ </html-import>
590
+ ```
591
+
592
+ ## file-drop.html
593
+
594
+ ### Overview
595
+
596
+ Acquires files by drag/drop or picker and presents busy, progress, error, and cleared state.
597
+
598
+ ### Public surface
599
+
600
+ Methods/properties: `configure()`, `openPicker()`, `clear()`, `setBusy()`, `setError()`, `setProgress()`, `destroy()`.
601
+
602
+ Events: `file-drop-ready`, `file-drop-selected`, `file-drop-progress`, `file-drop-state`, `file-drop-error`.
603
+
604
+ ### Availability and normalization
605
+
606
+ **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).
607
+
608
+ ### Example
609
+
610
+ ```html
611
+ <html-import
612
+ id="file-drop.html"
613
+ href="/arcane/components/file-drop.html">
614
+ </html-import>
615
+ ```
616
+
617
+ ## file-inspector.html
618
+
619
+ ### Overview
620
+
621
+ Displays file metadata, preview, busy/error state, and caller-defined actions.
622
+
623
+ ### Public surface
624
+
625
+ Methods/properties: `configure()`, `show()`, `clear()`, `setActions()`, `setBusy()`, `setError()`, `setPreview()`, `destroy()`.
626
+
627
+ Events: `file-inspector-ready`, `file-inspector-action`, `file-inspector-change`, `file-inspector-cleared`, `file-inspector-error`.
628
+
629
+ Slots: `title`, `preview`, `metadata`, `actions`.
630
+
631
+ ### Availability and normalization
632
+
633
+ **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).
634
+
635
+ ### Example
636
+
637
+ ```html
638
+ <html-import
639
+ id="file-inspector.html"
640
+ href="/arcane/components/file-inspector.html">
641
+ </html-import>
642
+ ```
643
+
644
+ ## file-manager.html
645
+
646
+ ### Overview
647
+
648
+ Browses, filters, selects, opens, and acts on app-scoped files.
649
+
650
+ ### Public surface
651
+
652
+ Methods/properties: `setProvider()`, `loadAll()`, `setFilter()`, `select()`, `clearSelection()`, `destroy()`.
653
+
654
+ Events: `file-manager-ready`, `file-manager-select`, `file-manager-open`, `file-manager-action`.
655
+
656
+ Shared dependencies: [`DBOPFS.js`](runtime-modules.md#dbopfsjs), [`File.js`](runtime-entities.md#filejs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
657
+
658
+ ### Availability and normalization
659
+
660
+ **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).
661
+
662
+ ### Example
663
+
664
+ ```html
665
+ <html-import
666
+ id="file-manager.html"
667
+ href="/arcane/components/file-manager.html">
668
+ </html-import>
669
+ ```
670
+
671
+ ## header.html
672
+
673
+ ### Overview
674
+
675
+ Shared title bar with history, reload, online marker, presentation labels, and 988 link.
676
+
677
+ ### Public surface
678
+
679
+ This fragment declares no public host method.
680
+
681
+ This fragment declares no component-specific readiness or action event; use the loader's `html-import-ready` only to know that import execution completed.
682
+
683
+ ### Availability and normalization
684
+
685
+ **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).
686
+
687
+ ### Example
688
+
689
+ ```html
690
+ <html-import
691
+ id="header.html"
692
+ href="/arcane/components/header.html">
693
+ </html-import>
694
+ ```
695
+
696
+ ## integration-settings.html
697
+
698
+ ### Overview
699
+
700
+ Edits non-secret communication service configuration and service actions.
701
+
702
+ ### Public surface
703
+
704
+ Methods/properties: `configure()`, `getValues()`, `setStatus()`, `destroy()`.
705
+
706
+ Events: `integration-settings-ready`, `integration-settings-save`, `integration-settings-close`, `integration-action`.
707
+
708
+ ### Availability and normalization
709
+
710
+ **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).
711
+
712
+ ### Example
713
+
714
+ ```html
715
+ <html-import
716
+ id="integration-settings.html"
717
+ href="/arcane/components/integration-settings.html">
718
+ </html-import>
719
+ ```
720
+
721
+ ## local-ai-status.html
722
+
723
+ ### Overview
724
+
725
+ Presents local-AI standby, failure, recovery, guidance, retry, and dismissal states.
726
+
727
+ ### Public surface
728
+
729
+ Methods/properties: `configure()`, `begin()`, `present()`, `destroy()`, and the `hidden` property.
730
+
731
+ Events: `local-ai-status-ready`, `local-ai-status-dismissed`, `local-ai-retry`.
732
+
733
+ Shared dependencies: [`LocalAIReadiness.js`](runtime-modules.md#localaireadinessjs).
734
+
735
+ ### Availability and normalization
736
+
737
+ **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).
738
+
739
+ ### Example
740
+
741
+ ```html
742
+ <html-import
743
+ id="local-ai-status.html"
744
+ href="/arcane/components/local-ai-status.html">
745
+ </html-import>
746
+ ```
747
+
748
+ ## markdown-document.html
749
+
750
+ ### Overview
751
+
752
+ Renders and navigates a complete Markdown document with focusable fragments.
753
+
754
+ ### Public surface
755
+
756
+ Methods/properties: `configure()`, `load()`, `render()`, `clear()`, `fail()`, `focus()`, `focusFragment()`, `destroy()`.
757
+
758
+ Events: `markdown-document-ready`, `markdown-document-state`,
759
+ `markdown-document-loading`, `markdown-document-rendered`,
760
+ `markdown-document-empty`, `markdown-document-error`, and
761
+ `markdown-document-navigate`.
762
+
763
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs).
764
+
765
+ ### Availability and normalization
766
+
767
+ **Browser and supported native WebViews.** Complete Markdown and state are
768
+ normalized; malformed input and Marked/DOM failures remain visible. HTMLImport
769
+ + DOM; injected Arcane/provider modules where listed. Native methods remain
770
+ subject to the bound app's capabilities. [Deep protocol details](protocols.md).
771
+
772
+ ### Example
773
+
774
+ ```html
775
+ <html-import
776
+ id="markdown-document.html"
777
+ href="/arcane/components/markdown-document.html">
778
+ </html-import>
779
+ ```
780
+
781
+ ## markdown-editor.html
782
+
783
+ ### Overview
784
+
785
+ Configurable Markdown authoring, toolbar, preview, title, and save surface.
786
+
787
+ ### Public surface
788
+
789
+ Methods/properties: `configure()`, `focus()`, `clear()`, `saveEntry()`, `destroy()`.
790
+
791
+ Events: `markdown-editor-ready`, `markdown-editor-change`, `markdown-editor-saved`.
792
+
793
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs), [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs).
794
+
795
+ ### Availability and normalization
796
+
797
+ **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).
798
+
799
+ ### Example
800
+
801
+ ```html
802
+ <html-import
803
+ id="markdown-editor.html"
804
+ href="/arcane/components/markdown-editor.html">
805
+ </html-import>
806
+ ```
807
+
808
+ ## media-embed.html
809
+
810
+ ### Overview
811
+
812
+ Loads a parsed YouTube video or playlist embed and exposes an external-platform
813
+ action. Ordinary YouTube hosting is the default; `configure({privacyEnhanced:true})`
814
+ explicitly selects the privacy-enhanced host.
815
+
816
+ ### Public surface
817
+
818
+ Methods/properties: `configure()`, `load()`, `destroy()`.
819
+
820
+ Events: `media-embed-ready`, `media-load`, `media-error`, `media-open-platform`.
821
+
822
+ Shared dependencies: [`YouTubeMedia.js`](runtime-modules.md#youtubemediajs).
823
+
824
+ ### Availability and normalization
825
+
826
+ **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).
827
+
828
+ ### Example
829
+
830
+ ```html
831
+ <html-import
832
+ id="media-embed.html"
833
+ href="/arcane/components/media-embed.html">
834
+ </html-import>
835
+ ```
836
+
837
+ ## modal.html
838
+
839
+ ### Overview
840
+
841
+ Generic modal with population, open/close, actions, and sequential task execution.
842
+
843
+ ### Public surface
844
+
845
+ Methods/properties: `populate()`, `open()`, `close()`, `runTasks()`, `destroy()`.
846
+
847
+ Events: `modal-ready`, `modal-opened`, `modal-closed`, `modal-action`.
848
+
849
+ Slots: `header`, `body`, `footer`.
850
+
851
+ ### Availability and normalization
852
+
853
+ **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).
854
+
855
+ ### Example
856
+
857
+ ```html
858
+ <html-import
859
+ id="modal.html"
860
+ href="/arcane/components/modal.html">
861
+ </html-import>
862
+ ```
863
+
864
+ ## output-panel.html
865
+
866
+ ### Overview
867
+
868
+ Presents status, output, body, coverage, actions, pending, error, and cleared states.
869
+
870
+ ### Public surface
871
+
872
+ Methods/properties: `configure()`, `setOutput()`, `setBody()`, `setCoverage()`, `setActions()`, `setPending()`, `setStatus()`, `setError()`, `clear()`, `destroy()`.
873
+
874
+ Events: `output-panel-ready`, `output-panel-state`, `output-panel-change`, `output-panel-action`, `output-panel-error`, `output-panel-cleared`.
875
+
876
+ Slots: `title`, `header-actions`, `body`, `coverage`, `actions`.
877
+
878
+ ### Availability and normalization
879
+
880
+ **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).
881
+
882
+ ### Example
883
+
884
+ ```html
885
+ <html-import
886
+ id="output-panel.html"
887
+ href="/arcane/components/output-panel.html">
888
+ </html-import>
889
+ ```
890
+
891
+ ## preferences-form.html
892
+
893
+ ### Overview
894
+
895
+ Builds a schema-driven preferences form with submit, reset, busy, and status behavior.
896
+
897
+ ### Public surface
898
+
899
+ Methods/properties: `configure()`, `getValues()`, `setValues()`, `setBusy()`, `setStatus()`, `destroy()`.
900
+
901
+ Events: `preferences-form-ready`, `preferences-change`, `preferences-submit`, `preferences-reset`.
902
+
903
+ ### Availability and normalization
904
+
905
+ **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).
906
+
907
+ ### Example
908
+
909
+ ```html
910
+ <html-import
911
+ id="preferences-form.html"
912
+ href="/arcane/components/preferences-form.html">
913
+ </html-import>
914
+ ```
915
+
916
+ ## record-timeline.html
917
+
918
+ ### Overview
919
+
920
+ Displays chronological records/evidence and emits open actions.
921
+
922
+ ### Public surface
923
+
924
+ Methods/properties: `setItems()`, `populate()`, `destroy()`.
925
+
926
+ Events: `record-timeline-ready`, `record-timeline-open`.
927
+
928
+ ### Availability and normalization
929
+
930
+ **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).
931
+
932
+ ### Example
933
+
934
+ ```html
935
+ <html-import
936
+ id="record-timeline.html"
937
+ href="/arcane/components/record-timeline.html">
938
+ </html-import>
939
+ ```
940
+
941
+ ## relationship-board.html
942
+
943
+ ### Overview
944
+
945
+ Displays normalized relationship nodes/edges in graph and list forms.
946
+
947
+ ### Public surface
948
+
949
+ Methods/properties: `setGraph()`, `populate()`, `destroy()`.
950
+
951
+ Events: `relationship-board-ready`, `relationship-node-open`, `relationship-edge-open`.
952
+
953
+ ### Availability and normalization
954
+
955
+ **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).
956
+
957
+ ### Example
958
+
959
+ ```html
960
+ <html-import
961
+ id="relationship-board.html"
962
+ href="/arcane/components/relationship-board.html">
963
+ </html-import>
964
+ ```
965
+
966
+ ## screen-capture.html
967
+
968
+ ### Overview
969
+
970
+ Presents image, video, or GIF display-capture workflow.
971
+
972
+ ### Public surface
973
+
974
+ Methods/properties: `capture` (the component-owned `ScreenCapture` instance) and `destroy()`.
975
+
976
+ Events: `screen-capture-ready`, `screen-capture-result`.
977
+
978
+ Ready uses operation id `screen-capture-ready-<component-instance-id>`;
979
+ capture results use the current instance-owned generation. `destroy()`
980
+ invalidates that generation, aborts UI listeners, revokes the preview URL,
981
+ destroys the `ScreenCapture` instance, disposes the source, marks the host
982
+ unready, and returns `true`; repeated calls return `false`.
983
+
984
+ Shared dependencies: [`ScreenCapture.js`](runtime-modules.md#screencapturejs).
985
+
986
+ ### Availability and normalization
987
+
988
+ **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).
989
+
990
+ ### Example
991
+
992
+ ```html
993
+ <html-import
994
+ id="screen-capture.html"
995
+ href="/arcane/components/screen-capture.html">
996
+ </html-import>
997
+ ```
998
+
999
+ ## source-code-viewer.html
1000
+
1001
+ ### Overview
1002
+
1003
+ Renders line-addressable source code with load, error, focus, and state behavior.
1004
+
1005
+ ### Public surface
1006
+
1007
+ Methods/properties: `configure()`, `load()`, `render()`, `clear()`, `fail()`, `focus()`, `focusLine()`, `destroy()`.
1008
+
1009
+ Events: `source-code-viewer-ready`, `source-code-viewer-state`,
1010
+ `source-code-viewer-state-loading`, `source-code-viewer-state-ready`,
1011
+ `source-code-viewer-state-empty`, and `source-code-viewer-state-error`.
1012
+
1013
+ ### Availability and normalization
1014
+
1015
+ **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).
1016
+
1017
+ ### Example
1018
+
1019
+ ```html
1020
+ <html-import
1021
+ id="source-code-viewer.html"
1022
+ href="/arcane/components/source-code-viewer.html">
1023
+ </html-import>
1024
+ ```
1025
+
1026
+ ## source-explanation.html
1027
+
1028
+ ### Overview
1029
+
1030
+ Presents an evidence finding, source selection, explanation, and save state.
1031
+
1032
+ ### Public surface
1033
+
1034
+ Methods/properties: `showFinding()`, `populate()`, `selectSource()`, `markSaved()`, `destroy()`.
1035
+
1036
+ Events: `source-explanation-ready`, `source-explanation-save`, `source-explanation-source-selected`.
1037
+
1038
+ ### Availability and normalization
1039
+
1040
+ **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).
1041
+
1042
+ ### Example
1043
+
1044
+ ```html
1045
+ <html-import
1046
+ id="source-explanation.html"
1047
+ href="/arcane/components/source-explanation.html">
1048
+ </html-import>
1049
+ ```
1050
+
1051
+ ## speech.html
1052
+
1053
+ ### Overview
1054
+
1055
+ Coordinates explicit speech-to-text activation, speech controls, transcription
1056
+ completion, mute state, and microphone availability.
1057
+
1058
+ ### Public surface
1059
+
1060
+ Methods/properties: `configure()`, `setMuted()`,
1061
+ `reportTTSError(error,boundary='synthesis')`, `requestSTTActivation()`,
1062
+ `destroy()`, `availability`, `muted`, `initialMuted`, and `componentReady`.
1063
+
1064
+ Events: `speech-ready`, `speech-transcription-complete`,
1065
+ `speech-transcription-error`, `speech-transcription-cancelled`,
1066
+ `speech-microphone-unavailable`, `speech-stt-activation-request`,
1067
+ `speech-stt-activation-error`, `speech-tts-lifecycle-error`, and
1068
+ `speech-synthesis-error`.
1069
+
1070
+ Shared dependencies: [`AI.js`](runtime-modules.md#aijs),
1071
+ [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs),
1072
+ [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs), and
1073
+ [`DBLS.js`](runtime-modules.md#dblsjs).
1074
+
1075
+ The Hold to talk control remains disabled unless sticky STT state is `ready`,
1076
+ the role is not busy, and microphone capture is available. For an explicitly
1077
+ selected STT route, a separate keyboard-operable control presents Start
1078
+ transcription while `unloaded`, Cancel loading while `loading`, a disabled
1079
+ Canceling state while `unloading`, and Try again with the sticky error while
1080
+ `error`. Selected-unloaded, busy, and error states are shown as distinct facts;
1081
+ none is treated as ready.
1082
+
1083
+ Only captured microphone input that completes the selected STT route emits
1084
+ `speech-transcription-complete`. A transient capture rejection reports
1085
+ `speech-microphone-unavailable` but remains locally retryable; an observed
1086
+ permission-denied state disables capture until the browser reports that the
1087
+ permission is available again, at which point the microphone-owned status is
1088
+ cleared.
1089
+
1090
+ The default `requestSTTActivation(intent)` forwards the mutable
1091
+ `{role:'stt',action:'load'|'unload',reason:'user'}` record to
1092
+ `requestAIRuntimeIntent()`. Before calling it, the component emits a bubbling,
1093
+ composed, cancelable `speech-stt-activation-request` event with mutable complete
1094
+ `{intent,state}` detail. `preventDefault()` suppresses the callback and intent.
1095
+ Callback failure emits `speech-stt-activation-error` with mutable complete
1096
+ `{request,error,message}` detail. Cancel loading publishes an `unload` intent;
1097
+ only subsequent sticky `unloading` or `unloaded` state confirms lifecycle
1098
+ progress, and callback return never proves provider work stopped.
1099
+
1100
+ Provider and runtime failures use generic visible speech status unless their
1101
+ Error owner explicitly marks nonblank copy with `userSafe:true`. Complete
1102
+ unknown diagnostics remain available through the developer console and error
1103
+ events; they do not become control labels or status text by default. The same
1104
+ boundary applies to STT activation, transcription, TTS lifecycle, synthesis,
1105
+ and playback failures.
1106
+
1107
+ `reportTTSError()` recognizes `synthesis`, `decode`, `playback-start`, and
1108
+ `playback-resume`. It mutes and stops the failed operation, preserves sticky
1109
+ provider readiness, and emits `speech-synthesis-error` with the exact boundary,
1110
+ stable reason/code, generic user-safe status, and complete Error in the local
1111
+ event detail.
1112
+
1113
+ - `synthesis`: `tts-synthesis-rejected` / `ARCANE_SPEECH_TTS_SYNTHESIS_REQUEST_REJECTED`;
1114
+ - `decode`: `tts-decode-rejected` / `ARCANE_SPEECH_TTS_DECODE_REJECTED`;
1115
+ - `playback-start`: `tts-playback-start-rejected` / `ARCANE_SPEECH_TTS_PLAYBACK_START_REJECTED`;
1116
+ - `playback-resume`: `tts-playback-resume-rejected` / `ARCANE_SPEECH_TTS_PLAYBACK_RESUME_REJECTED`.
1117
+
1118
+ The component emits no activation request on import or state observation.
1119
+ Provider registration and selection remain inert, and default
1120
+ `startTranscription=false` does not request STT during runtime startup. The
1121
+ provider/runtime owner decides whether and how to execute a user intent; the
1122
+ component never selects a runtime or model, downloads artifacts, reloads after
1123
+ failure, or falls back to another provider.
1124
+
1125
+ Each transcription request owns an `AbortController`; its signal is passed as
1126
+ the second argument to `AI.fetchSTT()`. Cancel, a newer capture, and `destroy()`
1127
+ abort that controller and suppress late results. This proves request delivery
1128
+ was canceled, not that an uncooperative provider stopped underlying work.
1129
+
1130
+ Each microphone attempt also owns one capture generation and one operation id
1131
+ from the initial `getUserMedia()` request through transcription settlement. A
1132
+ release while permission is still pending retires only that generation because
1133
+ the browser request cannot be canceled synchronously. If that stale request
1134
+ later resolves, the component stops its returned stream without clearing a
1135
+ newer press, status, operation id, or retry. Active capture finalization checks
1136
+ both the generation and operation id, and successful transcription retains the
1137
+ same capture operation id rather than inventing a second correlation boundary.
1138
+
1139
+ User Unmute calls the shared `AI.setSpeechMuted(false)` lifecycle owner before
1140
+ or with publishing the TTS load intent, so the runtime can legally load TTS.
1141
+ Configured `initialMuted:false` records that same unmute intent even when the
1142
+ TTS route is still unselected or loading; the component remains publicly muted
1143
+ until the selected role reaches `ready`, then applies the preserved intent.
1144
+ Mute calls `AI.setSpeechMuted(true)`, stops playback, cancels active TTS work,
1145
+ and unloads the selected TTS role. Lifecycle failures remain visible through
1146
+ `speech-tts-lifecycle-error` and sticky role state.
1147
+
1148
+ A BFCache-persisted `pagehide` retains the component, active provider state,
1149
+ microphone permission observation, and listeners. On persisted `pageshow`, the
1150
+ component resynchronizes the current AI mute state and rerenders its controls
1151
+ and status without duplicating activation or provider work. Nonpersisted
1152
+ `pagehide` remains terminal and destroys the component.
1153
+
1154
+ Speech operation ids are
1155
+ `<component-instance-id>:<kind>:<sequence>`. Canonical cancellation reasons are
1156
+ `stt-role-unready`, `stt-provider-transcription-cancelled`, `stt-role-busy`,
1157
+ `microphone-unavailable`, `component-destroyed`, and
1158
+ `stt-transcription-cancelled`. Microphone capture-failure reasons are
1159
+ `microphone-input-missing`, `microphone-input-unavailable`,
1160
+ `microphone-capture-denied`, and `microphone-capture-rejected`. Component
1161
+ boundary codes are `ARCANE_SPEECH_MICROPHONE_CAPTURE_REJECTED`,
1162
+ `ARCANE_SPEECH_STT_TRANSCRIPTION_REQUEST_REJECTED`,
1163
+ `ARCANE_SPEECH_TTS_LOAD_REJECTED`, `ARCANE_SPEECH_TTS_UNLOAD_REJECTED`,
1164
+ `ARCANE_SPEECH_TTS_SYNTHESIS_REQUEST_REJECTED`,
1165
+ `ARCANE_SPEECH_TTS_DECODE_REJECTED`,
1166
+ `ARCANE_SPEECH_TTS_PLAYBACK_START_REJECTED`, and
1167
+ `ARCANE_SPEECH_TTS_PLAYBACK_RESUME_REJECTED`. Each of those component-boundary
1168
+ public projections keeps the exact boundary in `code` and preserves a distinct
1169
+ string code from the browser, runtime, or provider additively as `causeCode`.
1170
+ A missing STT method therefore uses boundary
1171
+ `ARCANE_SPEECH_STT_TRANSCRIPTION_REQUEST_REJECTED` with
1172
+ `causeCode:'ARCANE_SPEECH_STT_RUNTIME_METHOD_UNAVAILABLE'`.
1173
+
1174
+ Stable rejection reasons are `stt-transcription-rejected`,
1175
+ `tts-load-rejected`, `tts-unload-rejected`, `tts-synthesis-rejected`,
1176
+ `tts-decode-rejected`, `tts-playback-start-rejected`, and
1177
+ `tts-playback-resume-rejected`. Shared activation rejection uses
1178
+ `ARCANE_STT_ACTIVATION_REQUEST_REJECTED` and `activation-request-rejected`.
1179
+
1180
+ ### Availability and normalization
1181
+
1182
+ **Browser and supported native WebViews.** UI/runtime state and explicit user
1183
+ STT activation intent are normalized; provider/model authority and media
1184
+ behavior remain external. HTMLImport + DOM; injected Arcane/provider modules
1185
+ where listed. Native methods remain subject to the bound app's capabilities.
1186
+ [Deep protocol details](protocols.md).
1187
+
1188
+ ### Example
1189
+
1190
+ ```html
1191
+ <html-import
1192
+ id="speech.html"
1193
+ href="/arcane/components/speech.html">
1194
+ </html-import>
1195
+ ```
1196
+
1197
+ ## summary-strip.html
1198
+
1199
+ ### Overview
1200
+
1201
+ Displays compact selectable KPI or summary items.
1202
+
1203
+ ### Public surface
1204
+
1205
+ Methods/properties: `configure()`, `setItems()`, `updateItem()`, `clear()`, `destroy()`.
1206
+
1207
+ Events: `summary-strip-ready`, `summary-strip-change`, `summary-strip-select`.
1208
+
1209
+ ### Availability and normalization
1210
+
1211
+ **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).
1212
+
1213
+ ### Example
1214
+
1215
+ ```html
1216
+ <html-import
1217
+ id="summary-strip.html"
1218
+ href="/arcane/components/summary-strip.html">
1219
+ </html-import>
1220
+ ```
1221
+
1222
+ ## table.html
1223
+
1224
+ ### Overview
1225
+
1226
+ Builds and updates a simple header/body table.
1227
+
1228
+ ### Public surface
1229
+
1230
+ Methods/properties: `buildHeader()`, `buildTable()`, `destroy()`.
1231
+
1232
+ Events: `table-ready`, `header-update`, `body-update`.
1233
+
1234
+ ### Availability and normalization
1235
+
1236
+ **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).
1237
+
1238
+ ### Example
1239
+
1240
+ ```html
1241
+ <html-import
1242
+ id="table.html"
1243
+ href="/arcane/components/table.html">
1244
+ </html-import>
1245
+ ```
1246
+
1247
+ ## task-progress.html
1248
+
1249
+ ### Overview
1250
+
1251
+ Runs and displays a task list with started/change/complete/error state.
1252
+
1253
+ ### Public surface
1254
+
1255
+ Methods/properties: `configure()`, `setTasks()`, `updateTask()`, `runTasks()`, `clear()`, `destroy()`.
1256
+
1257
+ Events: `task-progress-ready`, `task-progress-started`, `task-progress-change`, `task-progress-complete`, `task-progress-error`.
1258
+
1259
+ ### Availability and normalization
1260
+
1261
+ **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).
1262
+
1263
+ ### Example
1264
+
1265
+ ```html
1266
+ <html-import
1267
+ id="task-progress.html"
1268
+ href="/arcane/components/task-progress.html">
1269
+ </html-import>
1270
+ ```
1271
+
1272
+ ## terminal-workspace.html
1273
+
1274
+ ### Overview
1275
+
1276
+ Presents multiple terminal sessions, output, active selection, theme, and terminal actions.
1277
+
1278
+ ### Public surface
1279
+
1280
+ Methods/properties: `configure()`, `addSession()`, `removeSession()`, `activateSession()`, `append()`, `clear()`, `setState()`, `setTheme()`, `focus()`, `destroy()`.
1281
+
1282
+ Events: `terminal-workspace-ready`, `terminal-submit`, `terminal-interrupt`, `terminal-clear`, `terminal-session-new`, `terminal-session-close`, `terminal-session-select`, `terminal-settings`.
1283
+
1284
+ Shared dependencies: [`AnsiText.js`](runtime-modules.md#ansitextjs).
1285
+
1286
+ ### Availability and normalization
1287
+
1288
+ **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).
1289
+
1290
+ ### Example
1291
+
1292
+ ```html
1293
+ <html-import
1294
+ id="terminal-workspace.html"
1295
+ href="/arcane/components/terminal-workspace.html">
1296
+ </html-import>
1297
+ ```
1298
+
1299
+ ## theme-editor.html
1300
+
1301
+ ### Overview
1302
+
1303
+ Edits, previews, saves, and resets semantic custom theme tokens.
1304
+
1305
+ ### Public surface
1306
+
1307
+ Methods/properties: `configure()`, `getTheme()`, `setTheme()`, `setBusy()`, `setStatus()`, `destroy()`.
1308
+
1309
+ Events: `theme-editor-ready`, `theme-preview`, `theme-save`, `theme-reset`.
1310
+
1311
+ Shared dependencies: [`Theme.js`](runtime-entities.md#themejs).
1312
+
1313
+ ### Availability and normalization
1314
+
1315
+ **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).
1316
+
1317
+ ### Example
1318
+
1319
+ ```html
1320
+ <html-import
1321
+ id="theme-editor.html"
1322
+ href="/arcane/components/theme-editor.html">
1323
+ </html-import>
1324
+ ```
1325
+
1326
+ ## theme-switcher.html
1327
+
1328
+ ### Overview
1329
+
1330
+ Selects and refreshes system, light, dark, or custom theme mode.
1331
+
1332
+ ### Public surface
1333
+
1334
+ Methods/properties: `setMode()`, `refresh()`.
1335
+
1336
+ This fragment declares no component-specific readiness or action event; use the loader's `html-import-ready` only to know that import execution completed.
1337
+
1338
+ Shared dependencies: [`ThemeManager.js`](runtime-modules.md#thememanagerjs).
1339
+
1340
+ ### Availability and normalization
1341
+
1342
+ **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).
1343
+
1344
+ ### Example
1345
+
1346
+ ```html
1347
+ <html-import
1348
+ id="theme-switcher.html"
1349
+ href="/arcane/components/theme-switcher.html">
1350
+ </html-import>
1351
+ ```
1352
+
1353
+ ## unified-inbox.html
1354
+
1355
+ ### Overview
1356
+
1357
+ Displays provider-neutral communication threads with active/loading state.
1358
+
1359
+ ### Public surface
1360
+
1361
+ Methods/properties: `configure()`, `setThreads()`, `setActive()`, `setLoading()`, `destroy()`.
1362
+
1363
+ Events: `unified-inbox-ready`, `inbox-refresh`, `thread-select`.
1364
+
1365
+ ### Availability and normalization
1366
+
1367
+ **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).
1368
+
1369
+ ### Example
1370
+
1371
+ ```html
1372
+ <html-import
1373
+ id="unified-inbox.html"
1374
+ href="/arcane/components/unified-inbox.html">
1375
+ </html-import>
1376
+ ```
1377
+
1378
+ ## voice-transcription.html
1379
+
1380
+ ### Overview
1381
+
1382
+ Records segmented microphone audio only after authoritative STT readiness,
1383
+ exposes explicit selected-STT activation, transcribes with cancellation,
1384
+ persists, and completes a combined transcript.
1385
+
1386
+ ### Public surface
1387
+
1388
+ Methods/properties: `configure()`, `requestSTTActivation()`, `startRecording()`,
1389
+ `stopRecording()`, `save()`, `completeTranscription()/complete()`, `clear()`,
1390
+ `reset()`, `destroy()`.
1391
+
1392
+ Events: `voice-transcription-ready`, `voice-transcription-state`,
1393
+ `voice-transcription-segment`, `voice-transcription-change`,
1394
+ `voice-transcription-complete`, `speech-transcription-complete`,
1395
+ `speech-transcription-cancelled`, `speech-stt-activation-request`, and
1396
+ `speech-stt-activation-error`.
1397
+
1398
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs),
1399
+ [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs),
1400
+ [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs), and
1401
+ [`AI.js`](runtime-modules.md#aijs).
1402
+
1403
+ ### Availability and normalization
1404
+
1405
+ **Browser and supported native WebViews.** The component subscribes
1406
+ synchronously to sticky `AIRuntimeState.roles.stt`; its recording Start button
1407
+ and public `startRecording()` both remain unavailable unless that role is exactly
1408
+ `ready` and not busy. A configured `transcribe(file,context)` callback remains
1409
+ request plumbing rather than readiness authority. Its context now includes the
1410
+ owned `signal` additively. The default route calls `AI.fetchSTT(file,signal)` so
1411
+ readiness loss or destruction can abort delivery.
1412
+
1413
+ For a selected `unloaded`, `loading`, `unloading`, or `error` role, the component
1414
+ keeps recording Start disabled and presents the same keyboard-operable Start
1415
+ transcription/Try again or Cancel loading control as `speech.html`. Both use the
1416
+ shared `createSTTActivationController()` contract. User operation emits the
1417
+ cancelable `speech-stt-activation-request` event with mutable complete `{intent,state}`;
1418
+ `preventDefault()` suppresses the callback. The default
1419
+ `requestSTTActivation(intent)` publishes the mutable
1420
+ `{role:'stt',action:'load'|'unload',reason:'user'}` intent. Callback failure emits
1421
+ `speech-stt-activation-error` with mutable complete `{request,error,message}`. Import and
1422
+ state observation emit no activation request and never begin a model download.
1423
+ Unknown provider/runtime diagnostics remain complete in the developer console
1424
+ and error events, while controls use generic visible outcomes unless the Error
1425
+ owner explicitly marks nonblank copy with `userSafe:true`.
1426
+
1427
+ If sticky readiness is lost during microphone acquisition, capture, or the STT
1428
+ request, the component invalidates the session, aborts the owned request signal,
1429
+ releases media, discards late completion, and emits
1430
+ `speech-transcription-cancelled`. Its source-local reason is
1431
+ `runtime-unready`, while its canonical/public reason is `stt-role-unready`. A
1432
+ busy role uses `stt-role-busy` in both views. A current provider cancellation
1433
+ returns the component workflow to `idle` with local
1434
+ `stt-provider-request-cancelled` and canonical/public
1435
+ `stt-provider-transcription-cancelled`; destruction uses
1436
+ `component-destroyed` in both views. Replacing configuration without an
1437
+ `initialValue` during active work uses `configuration-replaced` in both views.
1438
+ Stale teardown results remain suppressed. A
1439
+ current save failure, including `AbortError`, enters the visible `error` state.
1440
+ Readiness loss after transcription has finished does not invalidate an already
1441
+ pending application save or completion callback: its settlement remains
1442
+ observable, while any new recording remains gated by current sticky readiness.
1443
+ Assigning `value` or calling `configure({initialValue})` explicitly supersedes
1444
+ an in-flight microphone start, STT request, save, or completion. The component
1445
+ advances its generation, aborts owned STT delivery, releases owned media, emits
1446
+ `speech-transcription-cancelled` with
1447
+ `reason:'transcript-replaced'`, and suppresses
1448
+ late settlement before publishing the assigned transcript. Assigning transcript
1449
+ text during active recording preserves that recording and changes the transcript
1450
+ to which the captured segment will be appended.
1451
+ On a BFCache-persisted `pagehide`, the component and its owned state remain
1452
+ live. A persisted `pageshow` rerenders the retained authoritative state without
1453
+ restarting capture, transcription, or activation. Nonpersisted `pagehide`
1454
+ retains terminal destruction.
1455
+ `destroy()` aborts the state subscription, cancels active work, removes the
1456
+ activation listener, sets component `ready` to `false`, and returns `true`;
1457
+ repeated destruction is
1458
+ idempotent. Destruction is terminal: Start, activation, and Complete remain
1459
+ disabled and status remains unavailable. `voice-transcription-state` detail is
1460
+ the mutable complete `{message,state,stt}` record, where `state` remains the component
1461
+ workflow and `stt` is the authoritative mutable role record. Transcript
1462
+ completion stays available when STT is unavailable before destruction.
1463
+ State/text, explicit activation, and request cancellation are normalized;
1464
+ provider/model authority and media behavior remain external. HTMLImport + DOM;
1465
+ injected Arcane/provider modules where listed.
1466
+ Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1467
+
1468
+ ### Example
1469
+
1470
+ ```html
1471
+ <html-import
1472
+ id="voice-transcription.html"
1473
+ href="/arcane/components/voice-transcription.html">
1474
+ </html-import>
1475
+ ```
1476
+
1477
+ ## weather-widget.html
1478
+
1479
+ ### Overview
1480
+
1481
+ Displays normalized current and daily weather with refresh intent.
1482
+
1483
+ ### Public surface
1484
+
1485
+ Methods/properties: `setWeather()`, `clear()`, `destroy()`.
1486
+
1487
+ Events: `weather-widget-ready`, `weather-refresh`.
1488
+
1489
+ ### Availability and normalization
1490
+
1491
+ **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).
1492
+
1493
+ ### Example
1494
+
1495
+ ```html
1496
+ <html-import
1497
+ id="weather-widget.html"
1498
+ href="/arcane/components/weather-widget.html">
1499
+ </html-import>
1500
+ ```
1501
+
1502
+ ## web-navigator.html
1503
+
1504
+ ### Overview
1505
+
1506
+ Guards embedded/external navigation and surfaces allow/block/open intents.
1507
+
1508
+ ### Public surface
1509
+
1510
+ Methods/properties: `configure()`, `navigate()`, `currentUrl()`, `destroy()`.
1511
+
1512
+ Events: `web-navigator-ready`, `web-navigate`, `web-navigation-blocked`, `web-open-external`.
1513
+
1514
+ ### Availability and normalization
1515
+
1516
+ **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).
1517
+
1518
+ ### Example
1519
+
1520
+ ```html
1521
+ <html-import
1522
+ id="web-navigator.html"
1523
+ href="/arcane/components/web-navigator.html">
1524
+ </html-import>
1525
+ ```
1526
+
1527
+ ## Readiness caveats
1528
+
1529
+ `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.