arcane-os 0.1.0-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +154 -0
- package/COMMERCIAL-LICENSE.md +13 -0
- package/LICENSE +661 -0
- package/NOTICE +70 -0
- package/README.md +448 -0
- package/bin/arcane-test.mjs +741 -0
- package/bin/arcane.mjs +5 -0
- package/docs/architecture.md +234 -0
- package/docs/compatibility.md +36 -0
- package/docs/event-manager.md +166 -0
- package/docs/platform-targets.md +108 -0
- package/docs/publishing.md +203 -0
- package/docs/reference/README.md +117 -0
- package/docs/reference/arcane-ollama.md +288 -0
- package/docs/reference/availability-and-normalization.md +123 -0
- package/docs/reference/behavioral-testing.md +86 -0
- package/docs/reference/cli.md +569 -0
- package/docs/reference/core/README.md +62 -0
- package/docs/reference/core/arcane-ai-contracts.md +873 -0
- package/docs/reference/core/arcane-api.md +601 -0
- package/docs/reference/core/arcane-entities.md +65 -0
- package/docs/reference/core/arcane-events.md +134 -0
- package/docs/reference/core/ollama-module.md +181 -0
- package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +1909 -0
- package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +1057 -0
- package/docs/reference/core/reference/arcane-api/core-and-events.md +320 -0
- package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +610 -0
- package/docs/reference/core/reference/arcane-api/namespaces.md +1157 -0
- package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +1423 -0
- package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +315 -0
- package/docs/reference/event-manager.md +957 -0
- package/docs/reference/inventory/package-api.json +2632 -0
- package/docs/reference/inventory/runtime-components.json +934 -0
- package/docs/reference/inventory/runtime-entities.json +26 -0
- package/docs/reference/inventory/runtime-modules.json +1249 -0
- package/docs/reference/protocols.md +242 -0
- package/docs/reference/runtime-components.md +1098 -0
- package/docs/reference/runtime-entities.md +303 -0
- package/docs/reference/runtime-modules.md +2010 -0
- package/docs/reference/sdk-api.md +4901 -0
- package/docs/roadmap.md +79 -0
- package/docs/work-amplification.md +124 -0
- package/node_modules/event-pubsub/CHANGELOG.md +55 -0
- package/node_modules/event-pubsub/MIGRATION.md +70 -0
- package/node_modules/event-pubsub/README.md +363 -0
- package/node_modules/event-pubsub/SECURITY.md +37 -0
- package/node_modules/event-pubsub/index.js +141 -0
- package/node_modules/event-pubsub/licence +21 -0
- package/node_modules/event-pubsub/package.json +59 -0
- package/node_modules/strong-type/README.md +408 -0
- package/node_modules/strong-type/assets/strong-type-header.png +0 -0
- package/node_modules/strong-type/index.js +1151 -0
- package/node_modules/strong-type/licence +21 -0
- package/node_modules/strong-type/node.js +125 -0
- package/node_modules/strong-type/package.json +61 -0
- package/package.json +95 -0
- package/runtime/ARCANE_RUNTIME_RELEASE.json +791 -0
- package/runtime/arcane/components/app-bar.html +468 -0
- package/runtime/arcane/components/assistant-panel.html +715 -0
- package/runtime/arcane/components/calculator.html +8 -0
- package/runtime/arcane/components/chart.html +655 -0
- package/runtime/arcane/components/chat.html +1225 -0
- package/runtime/arcane/components/conversation-view.html +13 -0
- package/runtime/arcane/components/dashboard-config.html +341 -0
- package/runtime/arcane/components/data-maintenance.html +112 -0
- package/runtime/arcane/components/data-view.html +92 -0
- package/runtime/arcane/components/directory-picker.html +197 -0
- package/runtime/arcane/components/document-inspector.html +252 -0
- package/runtime/arcane/components/file-drop.html +264 -0
- package/runtime/arcane/components/file-inspector.html +293 -0
- package/runtime/arcane/components/file-manager.html +1715 -0
- package/runtime/arcane/components/header.html +142 -0
- package/runtime/arcane/components/integration-settings.html +14 -0
- package/runtime/arcane/components/local-ai-status.html +360 -0
- package/runtime/arcane/components/markdown-document.html +1048 -0
- package/runtime/arcane/components/markdown-editor.html +360 -0
- package/runtime/arcane/components/media-embed.html +8 -0
- package/runtime/arcane/components/modal.html +402 -0
- package/runtime/arcane/components/output-panel.html +259 -0
- package/runtime/arcane/components/preferences-form.html +135 -0
- package/runtime/arcane/components/record-timeline.html +105 -0
- package/runtime/arcane/components/relationship-board.html +116 -0
- package/runtime/arcane/components/screen-capture.html +8 -0
- package/runtime/arcane/components/source-code-viewer.html +441 -0
- package/runtime/arcane/components/source-explanation.html +124 -0
- package/runtime/arcane/components/speech.html +365 -0
- package/runtime/arcane/components/summary-strip.html +177 -0
- package/runtime/arcane/components/table.html +77 -0
- package/runtime/arcane/components/task-progress.html +282 -0
- package/runtime/arcane/components/terminal-workspace.html +65 -0
- package/runtime/arcane/components/theme-editor.html +41 -0
- package/runtime/arcane/components/theme-switcher.html +46 -0
- package/runtime/arcane/components/unified-inbox.html +20 -0
- package/runtime/arcane/components/voice-transcription.html +476 -0
- package/runtime/arcane/components/weather-widget.html +8 -0
- package/runtime/arcane/components/web-navigator.html +239 -0
- package/runtime/arcane/css/communications.css +1 -0
- package/runtime/arcane/css/dashboard-config.css +45 -0
- package/runtime/arcane/css/document-site.css +981 -0
- package/runtime/arcane/css/layout.css +438 -0
- package/runtime/arcane/css/primitives.css +321 -0
- package/runtime/arcane/css/theme.css +112 -0
- package/runtime/arcane/css/utility-workspace.css +1 -0
- package/runtime/arcane/entities/ApiModelRecord.js +20 -0
- package/runtime/arcane/entities/Calculation.js +13 -0
- package/runtime/arcane/entities/Chat.js +581 -0
- package/runtime/arcane/entities/CommunicationMessage.js +29 -0
- package/runtime/arcane/entities/CommunicationThread.js +21 -0
- package/runtime/arcane/entities/Document.js +10 -0
- package/runtime/arcane/entities/File.js +143 -0
- package/runtime/arcane/entities/Image.js +135 -0
- package/runtime/arcane/entities/IntentEnvelope.js +834 -0
- package/runtime/arcane/entities/Preference.js +83 -0
- package/runtime/arcane/entities/TWiNPolicyDecision.js +1092 -0
- package/runtime/arcane/entities/TerminalSession.js +46 -0
- package/runtime/arcane/entities/Theme.js +107 -0
- package/runtime/arcane/entities/User.js +1046 -0
- package/runtime/arcane/entities/Weather.js +23 -0
- package/runtime/arcane/img/arcane-os-everywhere.png +0 -0
- package/runtime/arcane/img/arrow-left.png +0 -0
- package/runtime/arcane/img/arrow-right.png +0 -0
- package/runtime/arcane/img/doc.svg +5 -0
- package/runtime/arcane/img/folder.svg +4 -0
- package/runtime/arcane/img/image.svg +5 -0
- package/runtime/arcane/img/refresh.png +0 -0
- package/runtime/arcane/img/send.svg +9 -0
- package/runtime/arcane/img/trash.svg +5 -0
- package/runtime/arcane/img/upload.svg +5 -0
- package/runtime/arcane/modules/AI.js +2048 -0
- package/runtime/arcane/modules/AIPreferenceRuntime.js +32 -0
- package/runtime/arcane/modules/AIPreferenceTuple.js +92 -0
- package/runtime/arcane/modules/AIResponseLength.js +42 -0
- package/runtime/arcane/modules/AIResponseURLPolicy.js +626 -0
- package/runtime/arcane/modules/AnsiText.js +53 -0
- package/runtime/arcane/modules/ApiModelDatabase.js +25 -0
- package/runtime/arcane/modules/AppDataScope.js +245 -0
- package/runtime/arcane/modules/AppearancePreferences.js +28 -0
- package/runtime/arcane/modules/ArcaneCommunicationBridge.js +22 -0
- package/runtime/arcane/modules/ArcaneNavigationPolicy.js +135 -0
- package/runtime/arcane/modules/ArcaneNetworkPolicy.js +255 -0
- package/runtime/arcane/modules/AsyncBoundary.js +161 -0
- package/runtime/arcane/modules/BrowserTestSuite.js +326 -0
- package/runtime/arcane/modules/CalculatorEngine.js +20 -0
- package/runtime/arcane/modules/CaseEvidenceIndexer.js +134 -0
- package/runtime/arcane/modules/ChartLibrary.js +35 -0
- package/runtime/arcane/modules/ChatRecords.js +13 -0
- package/runtime/arcane/modules/CommunicationAppController.js +43 -0
- package/runtime/arcane/modules/CommunicationHub.js +16 -0
- package/runtime/arcane/modules/CommunicationPreferences.js +13 -0
- package/runtime/arcane/modules/CommunicationProviderRegistry.js +16 -0
- package/runtime/arcane/modules/ComponentContracts.js +586 -0
- package/runtime/arcane/modules/ConfiguredAIChatSession.js +288 -0
- package/runtime/arcane/modules/ConversationActionItems.js +488 -0
- package/runtime/arcane/modules/ConversationClosingReport.js +274 -0
- package/runtime/arcane/modules/ConversationTimebox.js +527 -0
- package/runtime/arcane/modules/CoreLocalModelCatalog.js +255 -0
- package/runtime/arcane/modules/DBLS.js +171 -0
- package/runtime/arcane/modules/DBOPFS.js +1154 -0
- package/runtime/arcane/modules/DBOPFSWorker.js +116 -0
- package/runtime/arcane/modules/DataMaintenance.js +91 -0
- package/runtime/arcane/modules/DevelopmentWorkspace.js +74 -0
- package/runtime/arcane/modules/DirectoryPicker.js +109 -0
- package/runtime/arcane/modules/DocumentNavigation.js +223 -0
- package/runtime/arcane/modules/Errors.js +1025 -0
- package/runtime/arcane/modules/GifEncoder.js +29 -0
- package/runtime/arcane/modules/HTMLImport.js +114 -0
- package/runtime/arcane/modules/InMemoryCommunicationProvider.js +14 -0
- package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +275 -0
- package/runtime/arcane/modules/LocalAIReadiness.js +870 -0
- package/runtime/arcane/modules/LocalAIReadinessController.js +156 -0
- package/runtime/arcane/modules/MD.js +111 -0
- package/runtime/arcane/modules/Mail.js +352 -0
- package/runtime/arcane/modules/MailTransport.mjs +180 -0
- package/runtime/arcane/modules/Marked.min.js +71 -0
- package/runtime/arcane/modules/MemoryRecords.js +44 -0
- package/runtime/arcane/modules/MessageAdvisory.js +38 -0
- package/runtime/arcane/modules/ModelDefinition.js +189 -0
- package/runtime/arcane/modules/Ollama.js +74 -0
- package/runtime/arcane/modules/OllamaModelIdentifier.js +21 -0
- package/runtime/arcane/modules/OllamaSettings.js +24 -0
- package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +14 -0
- package/runtime/arcane/modules/PreferenceStore.js +109 -0
- package/runtime/arcane/modules/QRCode.min.js +1 -0
- package/runtime/arcane/modules/Questionnaire.js +61 -0
- package/runtime/arcane/modules/RecordLinkIndex.js +24 -0
- package/runtime/arcane/modules/RecordPassageIndex.js +222 -0
- package/runtime/arcane/modules/RecordReviewStore.js +94 -0
- package/runtime/arcane/modules/RevocableProjectionLedger.js +1623 -0
- package/runtime/arcane/modules/RiskSignalAnalyzer.js +37 -0
- package/runtime/arcane/modules/ScamRiskPolicy.js +62 -0
- package/runtime/arcane/modules/ScopedOPFSCache.js +183 -0
- package/runtime/arcane/modules/ScreenCapture.js +20 -0
- package/runtime/arcane/modules/SpeechPlayback.js +581 -0
- package/runtime/arcane/modules/StaticDocumentCatalog.js +1248 -0
- package/runtime/arcane/modules/SystemAppearance.js +20 -0
- package/runtime/arcane/modules/SystemPlatformPresentation.js +51 -0
- package/runtime/arcane/modules/SystemToolRegistry.js +28 -0
- package/runtime/arcane/modules/TerminalClient.js +52 -0
- package/runtime/arcane/modules/TerminalCommandRegistry.js +50 -0
- package/runtime/arcane/modules/ThemeBootstrap.js +26 -0
- package/runtime/arcane/modules/ThemeManager.js +131 -0
- package/runtime/arcane/modules/TimeGuard.js +149 -0
- package/runtime/arcane/modules/ToolCallRouter.js +83 -0
- package/runtime/arcane/modules/WaitForComponent.js +102 -0
- package/runtime/arcane/modules/YouTubeMedia.js +16 -0
- package/runtime/arcane/modules/uPlot.LICENSE.txt +21 -0
- package/runtime/arcane/modules/uPlot.iife.min.js +2 -0
- package/runtime/arcane/modules/uPlot.min.css +1 -0
- package/runtime/arcane/security/arcane-network-policy.json +6 -0
- package/runtime/strong-type/index.js +352 -0
- package/runtime/strong-type/licence +21 -0
- package/runtime/strong-type/package.json +45 -0
- package/schemas/arcane-app-bundle.schema.json +125 -0
- package/schemas/arcane-app.schema.json +329 -0
- package/schemas/arcane-lock.schema.json +86 -0
- package/schemas/arcane-package.schema.json +224 -0
- package/schemas/cli-event.schema.json +122 -0
- package/schemas/event-stack.schema.json +152 -0
- package/schemas/native-build-plan.schema.json +176 -0
- package/schemas/target-adapter.schema.json +117 -0
- package/src/app-descriptor.mjs +500 -0
- package/src/cli/main.mjs +561 -0
- package/src/constants.mjs +31 -0
- package/src/dev-server.mjs +718 -0
- package/src/doctor.mjs +315 -0
- package/src/dom-event-instrumentation.mjs +594 -0
- package/src/errors.mjs +75 -0
- package/src/event-manager.mjs +1342 -0
- package/src/event-queue.mjs +138 -0
- package/src/events.mjs +219 -0
- package/src/index.mjs +177 -0
- package/src/integrated-provider-loader.mjs +432 -0
- package/src/native-plan.mjs +698 -0
- package/src/native-provider-loader.mjs +1126 -0
- package/src/packager/core.mjs +2691 -0
- package/src/process.mjs +353 -0
- package/src/release-bundle.mjs +2523 -0
- package/src/repository.mjs +90 -0
- package/src/runtime.mjs +452 -0
- package/src/scaffold.mjs +380 -0
- package/src/targets/index.mjs +436 -0
- package/src/templates/assets/app-icon.png +0 -0
- package/src/templates/workspace-template.mjs +388 -0
- package/src/testing-loader.mjs +9 -0
- package/src/testing.mjs +427 -0
- package/src/toolchain.mjs +1335 -0
- package/src/update-check.mjs +307 -0
- package/src/workspace.mjs +449 -0
|
@@ -0,0 +1,320 @@
|
|
|
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
|
+
```
|