arcane-os 0.3.0 → 0.3.2

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 (153) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +86 -117
  3. package/bin/arcane-test.mjs +170 -46
  4. package/browser-runtime/ai/browser-speech-artifacts.mjs +887 -909
  5. package/browser-runtime/ai/browser-speech-providers.mjs +96 -152
  6. package/browser-runtime/ai/browser-wasm-llm-provider.mjs +627 -819
  7. package/browser-runtime/ai/browser-wasm.mjs +24 -35
  8. package/browser-runtime/ai/browser-wllama-runtime.mjs +64 -316
  9. package/browser-runtime/ai/model-controller.mjs +584 -181
  10. package/browser-runtime/ai/speech-worker-client.mjs +8 -146
  11. package/browser-runtime/ai/speech-worker-runtime.mjs +643 -363
  12. package/browser-runtime/dom-event-instrumentation.mjs +55 -147
  13. package/browser-runtime/event-manager.mjs +239 -624
  14. package/package.json +5 -6
  15. package/runtime/arcane/components/app-bar.html +3 -15
  16. package/runtime/arcane/components/assistant-panel.html +10 -10
  17. package/runtime/arcane/components/calculator.html +1 -1
  18. package/runtime/arcane/components/chat.html +1359 -135
  19. package/runtime/arcane/components/conversation-view.html +2 -2
  20. package/runtime/arcane/components/document-inspector.html +11 -17
  21. package/runtime/arcane/components/file-manager.html +13 -56
  22. package/runtime/arcane/components/markdown-document.html +82 -281
  23. package/runtime/arcane/components/markdown-editor.html +7 -10
  24. package/runtime/arcane/components/media-embed.html +6 -6
  25. package/runtime/arcane/components/screen-capture.html +4 -4
  26. package/runtime/arcane/components/source-explanation.html +2 -2
  27. package/runtime/arcane/components/speech.html +112 -68
  28. package/runtime/arcane/components/terminal-workspace.html +4 -4
  29. package/runtime/arcane/components/theme-editor.html +1 -1
  30. package/runtime/arcane/components/unified-inbox.html +2 -2
  31. package/runtime/arcane/components/voice-transcription.html +31 -21
  32. package/runtime/arcane/entities/Calculation.js +2 -3
  33. package/runtime/arcane/entities/Chat.js +228 -43
  34. package/runtime/arcane/entities/Preference.js +3 -5
  35. package/runtime/arcane/entities/Weather.js +5 -5
  36. package/runtime/arcane/modules/AI.js +1050 -427
  37. package/runtime/arcane/modules/AIProviderRuntime.js +658 -363
  38. package/runtime/arcane/modules/AIResponseLength.js +9 -19
  39. package/runtime/arcane/modules/AIRuntimeState.js +109 -72
  40. package/runtime/arcane/modules/ArcaneNavigationPolicy.js +45 -32
  41. package/runtime/arcane/modules/BrowserTestSuite.js +78 -122
  42. package/runtime/arcane/modules/CalculatorEngine.js +9 -9
  43. package/runtime/arcane/modules/CommunicationAppController.js +3 -7
  44. package/runtime/arcane/modules/ComponentContracts.js +30 -32
  45. package/runtime/arcane/modules/ConfiguredAIChatSession.js +281 -230
  46. package/runtime/arcane/modules/ConversationActionItems.js +26 -59
  47. package/runtime/arcane/modules/ConversationClosingReport.js +34 -61
  48. package/runtime/arcane/modules/ConversationTimebox.js +27 -15
  49. package/runtime/arcane/modules/DBOPFSDocumentLibrary.js +152 -344
  50. package/runtime/arcane/modules/DocumentLexicalSearch.js +25 -91
  51. package/runtime/arcane/modules/HTMLImport.js +54 -1
  52. package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +40 -203
  53. package/runtime/arcane/modules/LocalAIReadiness.js +40 -60
  54. package/runtime/arcane/modules/LocalAIReadinessController.js +15 -13
  55. package/runtime/arcane/modules/MD.js +1 -45
  56. package/runtime/arcane/modules/Mail.js +51 -103
  57. package/runtime/arcane/modules/MailOutbox.mjs +95 -193
  58. package/runtime/arcane/modules/MailTransport.mjs +36 -57
  59. package/runtime/arcane/modules/ModelDefinition.js +22 -106
  60. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +39 -101
  61. package/runtime/arcane/modules/PersistentAIChatSession.js +281 -18
  62. package/runtime/arcane/modules/PreferenceStore.js +102 -30
  63. package/runtime/arcane/modules/RiskSignalAnalyzer.js +8 -9
  64. package/runtime/arcane/modules/ScopedOPFSCache.js +7 -42
  65. package/runtime/arcane/modules/ScreenCapture.js +175 -128
  66. package/runtime/arcane/modules/SpeechPlayback.js +46 -149
  67. package/runtime/arcane/modules/StaticDocumentCatalog.js +173 -407
  68. package/runtime/arcane/modules/ToolCallRouter.js +25 -12
  69. package/runtime/arcane/modules/YouTubeMedia.js +6 -5
  70. package/schemas/arcane-app-bundle.schema.json +13 -78
  71. package/schemas/arcane-app.schema.json +9 -25
  72. package/schemas/arcane-lock.schema.json +18 -151
  73. package/schemas/arcane-package.schema.json +2 -16
  74. package/schemas/native-build-plan.schema.json +119 -122
  75. package/src/app-descriptor.mjs +75 -132
  76. package/src/application-tests.mjs +200 -0
  77. package/src/cli/main.mjs +27 -46
  78. package/src/constants.mjs +3 -4
  79. package/src/dev-server.mjs +30 -324
  80. package/src/doctor.mjs +92 -154
  81. package/src/dom-event-instrumentation.mjs +55 -147
  82. package/src/errors.mjs +2 -3
  83. package/src/event-manager.mjs +239 -624
  84. package/src/event-queue.mjs +3 -3
  85. package/src/import-map.mjs +273 -1028
  86. package/src/index.mjs +14 -16
  87. package/src/installed-sdk-runtime.mjs +40 -62
  88. package/src/integrated-provider-loader.mjs +53 -382
  89. package/src/mail-api.mjs +0 -2
  90. package/src/mail-server.mjs +224 -580
  91. package/src/mail.mjs +4 -10
  92. package/src/native-plan.mjs +163 -598
  93. package/src/native-provider-loader.mjs +104 -1063
  94. package/src/packager/core.mjs +485 -3229
  95. package/src/process.mjs +5 -10
  96. package/src/release-bundle.mjs +292 -2405
  97. package/src/runtime.mjs +76 -396
  98. package/src/scaffold.mjs +30 -80
  99. package/src/sdk-browser-runtime.mjs +70 -626
  100. package/src/source-server.mjs +588 -0
  101. package/src/targets/index.mjs +78 -188
  102. package/src/templates/workspace-template.mjs +19 -135
  103. package/src/testing-loader.mjs +164 -0
  104. package/src/testing.mjs +1 -1
  105. package/src/toolchain.mjs +131 -544
  106. package/src/update-check.mjs +26 -64
  107. package/src/workspace-operation-lock.mjs +139 -430
  108. package/src/workspace-runtime.mjs +112 -779
  109. package/src/workspace.mjs +40 -302
  110. package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +0 -218
  111. package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +0 -203
  112. package/browser-runtime/ai/ARCANE_AI_BROWSER_WASM_COMPONENTS.json +0 -80
  113. package/browser-runtime/ai/internal/sha256.mjs +0 -166
  114. package/docs/architecture.md +0 -344
  115. package/docs/compatibility.md +0 -36
  116. package/docs/event-manager.md +0 -294
  117. package/docs/platform-targets.md +0 -108
  118. package/docs/publishing.md +0 -201
  119. package/docs/reference/README.md +0 -187
  120. package/docs/reference/ai/browser-speech-package-authority.json +0 -835
  121. package/docs/reference/ai/browser-speech.md +0 -1252
  122. package/docs/reference/ai/browser-wasm.md +0 -530
  123. package/docs/reference/arcane-ollama.md +0 -288
  124. package/docs/reference/availability-and-normalization.md +0 -183
  125. package/docs/reference/behavioral-testing.md +0 -133
  126. package/docs/reference/cli.md +0 -779
  127. package/docs/reference/core/README.md +0 -62
  128. package/docs/reference/core/arcane-ai-contracts.md +0 -907
  129. package/docs/reference/core/arcane-api.md +0 -601
  130. package/docs/reference/core/arcane-entities.md +0 -65
  131. package/docs/reference/core/arcane-events.md +0 -134
  132. package/docs/reference/core/ollama-module.md +0 -181
  133. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +0 -1909
  134. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +0 -1057
  135. package/docs/reference/core/reference/arcane-api/core-and-events.md +0 -320
  136. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +0 -610
  137. package/docs/reference/core/reference/arcane-api/namespaces.md +0 -1157
  138. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +0 -1423
  139. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +0 -315
  140. package/docs/reference/event-manager.md +0 -1511
  141. package/docs/reference/inventory/package-api.json +0 -3284
  142. package/docs/reference/inventory/runtime-components.json +0 -1011
  143. package/docs/reference/inventory/runtime-entities.json +0 -26
  144. package/docs/reference/inventory/runtime-modules.json +0 -1431
  145. package/docs/reference/mail.md +0 -316
  146. package/docs/reference/protocols.md +0 -677
  147. package/docs/reference/runtime-components.md +0 -1366
  148. package/docs/reference/runtime-entities.md +0 -303
  149. package/docs/reference/runtime-modules.md +0 -2960
  150. package/docs/reference/sdk-api.md +0 -6694
  151. package/docs/roadmap.md +0 -79
  152. package/docs/work-amplification.md +0 -129
  153. package/runtime/ARCANE_RUNTIME_RELEASE.json +0 -826
@@ -1,320 +0,0 @@
1
- # Arcane API core and event guides
2
-
3
- These guides cover the synchronous renderer snapshot and the four event
4
- subscription and completion-observation methods. For individual event payloads,
5
- see the [Arcane event catalog](../../arcane-events.md).
6
-
7
- ## Arcane.runtime.current()
8
-
9
- ### Overview
10
-
11
- `Arcane.runtime.current()` synchronously describes the Arcane transport surface
12
- detected for the current document. It performs no RPC and returns a frozen
13
- snapshot immediately.
14
-
15
- ```javascript
16
- const runtime = Arcane.runtime.current();
17
- ```
18
- The result has this exact shape:
19
-
20
- | Property | Type | Meaning |
21
- | --- | --- | --- |
22
- | `connected` | `boolean` | `true` when this document initialized a callable Arcane messaging transport. |
23
- | `transport` | `string` | One of `webview2`, `webkitgtk`, `android-webview`, `development-http`, or `standalone`. |
24
- | `native` | `boolean` | `true` for WebView2, WebKitGTK, and Android WebView hosts. |
25
- | `managedLocalAI` | `boolean` | `true` only for the WebView2 and WebKitGTK desktop host classes that can mediate Arcane-managed local services. |
26
-
27
- `connected` is a transport fact, not a health, authority, or readiness claim. It
28
- does not mean Core answered a request, that the current application is admitted
29
- for a method, or that a dependency is installed. Likewise, `managedLocalAI`
30
- describes a host capability class; it does not report that Ollama, speech, or a
31
- model is installed or healthy.
32
-
33
- Use `Arcane.capabilities.list()` to inspect the bound application and admitted
34
- methods, and use the relevant namespace status method for dependency state.
35
-
36
- ### Runtime snapshot
37
-
38
- The method returns a frozen object. It does not return a `Promise`, does not
39
- initialize a new request, and has no asynchronous rejection path.
40
-
41
- The transport values mean:
42
-
43
- | Value | Environment |
44
- | --- | --- |
45
- | `webview2` | Native Microsoft NT WebView2 host. |
46
- | `webkitgtk` | Native Linux WebKitGTK host. |
47
- | `android-webview` | Native Android WebView host. |
48
- | `development-http` | Development HTTP bridge; not a native renderer host. |
49
- | `standalone` | No callable Arcane host transport was selected. |
50
-
51
- ### Example
52
-
53
- ```javascript
54
- const runtime = globalThis.Arcane?.runtime?.current?.();
55
-
56
- if (!runtime) {
57
- throw new Error('The Arcane API is not loaded in this document.');
58
- }
59
-
60
- console.table(runtime);
61
-
62
- if (!runtime.connected) {
63
- console.info('Open this application through an Arcane host to use native methods.');
64
- } else if (runtime.native) {
65
- console.info(`Running through the native ${runtime.transport} transport.`);
66
- } else {
67
- console.info(`Running through the ${runtime.transport} development transport.`);
68
- }
69
- ```
70
-
71
- ## Arcane.events.on()
72
-
73
- ### Overview
74
-
75
- `Arcane.events.on(eventName, listener)` subscribes to every future matching
76
- event. It is synchronous and returns an unsubscribe function.
77
-
78
- For a named event, the listener receives the event's data payload directly:
79
-
80
- ```javascript
81
- const off = Arcane.events.on('terminal.output', function logTerminalOutput(data) {
82
- console.log(data.sessionId, data.stream, data.data);
83
- });
84
- ```
85
-
86
- The special event name `"*"` subscribes to all future events. Its listener
87
- receives `{ event, data }`, not the named event's data alone:
88
-
89
- ```javascript
90
- const off = Arcane.events.on('*', function logAnyArcaneEvent({event, data}) {
91
- console.debug(event, data);
92
- });
93
- ```
94
-
95
- Event names and payloads are defined in the
96
- [Arcane event catalog](../../arcane-events.md).
97
-
98
- ### Parameters and return value
99
-
100
- | Parameter | Type | Description |
101
- | --- | --- | --- |
102
- | `eventName` | `string` | A documented event name, or `"*"` for live wildcard observation. |
103
- | `listener` | `function` | Called for each future matching event. |
104
-
105
- The returned `unsubscribe()` function removes that listener. Retain it and call
106
- it during component or document teardown. Repeating the call is harmless.
107
-
108
- Passing a non-function `listener` throws a synchronous `TypeError`. An unknown
109
- event name does not itself throw; it simply has no delivery unless the host later
110
- emits that exact name.
111
-
112
- ### Delivery and failure behavior
113
-
114
- `on()` is future-only. It does not replay ordinary events or an already observed
115
- durable completion. Use `when()` when a late subscriber must observe
116
- `transport.ready` or `core.ready`.
117
-
118
- Listener exceptions are caught and logged. Delivery continues to the other
119
- listeners, and the exception is not sent back to the native event producer.
120
- Handle expected listener failures inside the callback when the application must
121
- surface them.
122
-
123
- ### Example
124
-
125
- ```javascript
126
- const events = globalThis.Arcane?.events;
127
-
128
- if (!events?.on) {
129
- throw new Error('Arcane events are unavailable.');
130
- }
131
-
132
- const offOutput = events.on('terminal.output', function writeTerminalOutput(payload) {
133
- const write = payload.stream === 'stderr' ? console.error : console.log;
134
- write(`[${payload.sessionId}] ${payload.data}`);
135
- });
136
-
137
- const offAll = events.on('*', function logObservedArcaneEvent({event}) {
138
- console.debug('Observed Arcane event', event);
139
- });
140
-
141
- function cleanup() {
142
- offOutput();
143
- offAll();
144
- }
145
-
146
- globalThis.addEventListener('pagehide', cleanup, {once: true});
147
- ```
148
-
149
- ## Arcane.events.once()
150
-
151
- ### Overview
152
-
153
- `Arcane.events.once(eventName, listener)` subscribes to the next future matching
154
- event. The subscription removes itself before invoking the listener, so at most
155
- one future delivery reaches that callback. It returns an unsubscribe function
156
- that can cancel the subscription before the event occurs.
157
-
158
- `once()` is future-only for every event, including `transport.ready` and
159
- `core.ready`. It never replays a completion that occurred before registration.
160
- Use `when()` for durable completion observation. Event names and payloads are in
161
- the [Arcane event catalog](../../arcane-events.md).
162
-
163
- ### Parameters and return value
164
-
165
- | Parameter | Type | Description |
166
- | --- | --- | --- |
167
- | `eventName` | `string` | The exact future event to observe. |
168
- | `listener` | `function` | Called once with the named event's data payload. |
169
-
170
- The result is an `unsubscribe()` function. Call it when the owner is disposed or
171
- when the application no longer needs to wait.
172
-
173
- The listener must be callable. Unlike `on()` and `when()`, the current `once()`
174
- surface does not synchronously validate the original listener. A non-function
175
- listener therefore fails inside guarded event delivery and is logged rather than
176
- producing a useful registration-time `TypeError`. Treat a non-function listener
177
- as invalid input and always pass a function.
178
-
179
- Listener exceptions are otherwise isolated in the same way as `on()` listener
180
- exceptions: they are logged and do not interrupt other event subscribers.
181
-
182
- ### Example
183
-
184
- ```javascript
185
- const events = globalThis.Arcane?.events;
186
-
187
- if (!events?.once) {
188
- throw new Error('Arcane events are unavailable.');
189
- }
190
-
191
- let timeout = null;
192
- const cancelExitWait = events.once('terminal.exit', function reportNextTerminalExit(payload) {
193
- clearTimeout(timeout);
194
- console.log(
195
- `Session ${payload.sessionId} exited`,
196
- payload.exitCode,
197
- payload.signal
198
- );
199
- });
200
-
201
- timeout = setTimeout(function cancelTimedOutExitWait() {
202
- cancelExitWait();
203
- console.warn('Stopped waiting for the next terminal exit.');
204
- }, 30_000);
205
-
206
- globalThis.addEventListener('pagehide', function cleanupExitWait() {
207
- clearTimeout(timeout);
208
- cancelExitWait();
209
- }, {once: true});
210
- ```
211
-
212
- ## Arcane.events.when()
213
-
214
- ### Overview
215
-
216
- `Arcane.events.when(eventName, listener)` observes a designated durable
217
- completion. Exactly two event names are durable:
218
-
219
- | Event | Hosts | First payload |
220
- | --- | --- | --- |
221
- | `transport.ready` | Every initialized Arcane transport. | `{ protocol, transport }` identifies the selected wire protocol and transport. |
222
- | `core.ready` | Core-backed Microsoft NT, Linux, and development HTTP hosts. | `{ pid, version, app, platform, elevated, simulation }` describes the ready Core process and its public host context. |
223
-
224
- If the completion has not occurred, `when()` behaves as a one-time future
225
- subscription. If it already occurred, `when()` queues the stored first payload
226
- for asynchronous listener delivery. The callback never runs in the same call
227
- stack as a late `when()` registration.
228
-
229
- The first completion payload is snapshotted and recursively frozen before live
230
- callbacks run. Repeated events with the same durable name do not replace the
231
- stored value. Wildcard subscriptions can observe the original live completion,
232
- but they do not receive historical replays triggered by `when()`.
233
-
234
- See the [Arcane event catalog](../../arcane-events.md) for both completion
235
- payloads and their limits.
236
-
237
- ### Parameters and return value
238
-
239
- | Parameter | Type | Description |
240
- | --- | --- | --- |
241
- | `eventName` | `string` | The durable completion to observe: `transport.ready` or `core.ready`. |
242
- | `listener` | `function` | Called once with the immutable first completion payload. |
243
-
244
- The return value is an unsubscribe function. For a queued late replay, calling
245
- it before the next microtask prevents callback delivery.
246
-
247
- Passing an event other than `transport.ready` or `core.ready` throws a
248
- synchronous `TypeError`. Passing a non-function listener for a valid durable
249
- event also throws a synchronous `TypeError`.
250
-
251
- `transport.ready` alone does not prove host health, application authority,
252
- capability grants, publisher trust, or service readiness. Use the relevant API
253
- for each of those facts.
254
-
255
- ### Example
256
-
257
- ```javascript
258
- const events = globalThis.Arcane?.events;
259
-
260
- if (!events?.when) {
261
- throw new Error('Arcane completion events are unavailable.');
262
- }
263
-
264
- const offTransport = events.when('transport.ready', function reportTransportReady(payload) {
265
- console.log('Transport selected', payload.protocol, payload.transport);
266
- });
267
-
268
- const offCore = events.when('core.ready', function reportCoreReady(payload) {
269
- console.log('Core ready', payload.version, payload.app, payload.platform);
270
- });
271
-
272
- globalThis.addEventListener('pagehide', function cleanupReadinessSubscriptions() {
273
- offTransport();
274
- offCore();
275
- }, {once: true});
276
- ```
277
-
278
- ## Arcane.events.completed()
279
-
280
- ### Overview
281
-
282
- `Arcane.events.completed(eventName)` synchronously reports whether this document
283
- has already observed the first occurrence of a designated durable completion.
284
- It returns `true` only for an observed `transport.ready` or `core.ready` event.
285
-
286
- It returns `false` for a durable event that has not occurred, for an ordinary
287
- event, and for an unknown name. It does not throw for an unknown name and does
288
- not initiate transport or host work. Use `when()` to act when the completion is
289
- available instead of polling this method.
290
-
291
- The [Arcane event catalog](../../arcane-events.md) distinguishes durable
292
- completions from future-only events.
293
-
294
- ### Parameters and return value
295
-
296
- | Parameter | Type | Description |
297
- | --- | --- | --- |
298
- | `eventName` | `string` | The completion name to inspect. |
299
-
300
- The return value is a synchronous `boolean`.
301
-
302
- ### Example
303
-
304
- ```javascript
305
- const events = globalThis.Arcane?.events;
306
-
307
- if (!events?.completed || !events?.when) {
308
- throw new Error('Arcane completion events are unavailable.');
309
- }
310
-
311
- if (events.completed('core.ready')) {
312
- console.log('Core readiness was already observed in this document.');
313
- } else {
314
- const stopWaiting = events.when('core.ready', function reportCoreReady(payload) {
315
- console.log('Core became ready', payload.version);
316
- });
317
-
318
- globalThis.addEventListener('pagehide', stopWaiting, {once: true});
319
- }
320
- ```