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.
- package/CHANGELOG.md +27 -0
- package/README.md +86 -117
- package/bin/arcane-test.mjs +170 -46
- package/browser-runtime/ai/browser-speech-artifacts.mjs +887 -909
- package/browser-runtime/ai/browser-speech-providers.mjs +96 -152
- package/browser-runtime/ai/browser-wasm-llm-provider.mjs +627 -819
- package/browser-runtime/ai/browser-wasm.mjs +24 -35
- package/browser-runtime/ai/browser-wllama-runtime.mjs +64 -316
- package/browser-runtime/ai/model-controller.mjs +584 -181
- package/browser-runtime/ai/speech-worker-client.mjs +8 -146
- package/browser-runtime/ai/speech-worker-runtime.mjs +643 -363
- package/browser-runtime/dom-event-instrumentation.mjs +55 -147
- package/browser-runtime/event-manager.mjs +239 -624
- package/package.json +5 -6
- package/runtime/arcane/components/app-bar.html +3 -15
- package/runtime/arcane/components/assistant-panel.html +10 -10
- package/runtime/arcane/components/calculator.html +1 -1
- package/runtime/arcane/components/chat.html +1359 -135
- package/runtime/arcane/components/conversation-view.html +2 -2
- package/runtime/arcane/components/document-inspector.html +11 -17
- package/runtime/arcane/components/file-manager.html +13 -56
- package/runtime/arcane/components/markdown-document.html +82 -281
- package/runtime/arcane/components/markdown-editor.html +7 -10
- package/runtime/arcane/components/media-embed.html +6 -6
- package/runtime/arcane/components/screen-capture.html +4 -4
- package/runtime/arcane/components/source-explanation.html +2 -2
- package/runtime/arcane/components/speech.html +112 -68
- package/runtime/arcane/components/terminal-workspace.html +4 -4
- package/runtime/arcane/components/theme-editor.html +1 -1
- package/runtime/arcane/components/unified-inbox.html +2 -2
- package/runtime/arcane/components/voice-transcription.html +31 -21
- package/runtime/arcane/entities/Calculation.js +2 -3
- package/runtime/arcane/entities/Chat.js +228 -43
- package/runtime/arcane/entities/Preference.js +3 -5
- package/runtime/arcane/entities/Weather.js +5 -5
- package/runtime/arcane/modules/AI.js +1050 -427
- package/runtime/arcane/modules/AIProviderRuntime.js +658 -363
- package/runtime/arcane/modules/AIResponseLength.js +9 -19
- package/runtime/arcane/modules/AIRuntimeState.js +109 -72
- package/runtime/arcane/modules/ArcaneNavigationPolicy.js +45 -32
- package/runtime/arcane/modules/BrowserTestSuite.js +78 -122
- package/runtime/arcane/modules/CalculatorEngine.js +9 -9
- package/runtime/arcane/modules/CommunicationAppController.js +3 -7
- package/runtime/arcane/modules/ComponentContracts.js +30 -32
- package/runtime/arcane/modules/ConfiguredAIChatSession.js +281 -230
- package/runtime/arcane/modules/ConversationActionItems.js +26 -59
- package/runtime/arcane/modules/ConversationClosingReport.js +34 -61
- package/runtime/arcane/modules/ConversationTimebox.js +27 -15
- package/runtime/arcane/modules/DBOPFSDocumentLibrary.js +152 -344
- package/runtime/arcane/modules/DocumentLexicalSearch.js +25 -91
- package/runtime/arcane/modules/HTMLImport.js +54 -1
- package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +40 -203
- package/runtime/arcane/modules/LocalAIReadiness.js +40 -60
- package/runtime/arcane/modules/LocalAIReadinessController.js +15 -13
- package/runtime/arcane/modules/MD.js +1 -45
- package/runtime/arcane/modules/Mail.js +51 -103
- package/runtime/arcane/modules/MailOutbox.mjs +95 -193
- package/runtime/arcane/modules/MailTransport.mjs +36 -57
- package/runtime/arcane/modules/ModelDefinition.js +22 -106
- package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +39 -101
- package/runtime/arcane/modules/PersistentAIChatSession.js +281 -18
- package/runtime/arcane/modules/PreferenceStore.js +102 -30
- package/runtime/arcane/modules/RiskSignalAnalyzer.js +8 -9
- package/runtime/arcane/modules/ScopedOPFSCache.js +7 -42
- package/runtime/arcane/modules/ScreenCapture.js +175 -128
- package/runtime/arcane/modules/SpeechPlayback.js +46 -149
- package/runtime/arcane/modules/StaticDocumentCatalog.js +173 -407
- package/runtime/arcane/modules/ToolCallRouter.js +25 -12
- package/runtime/arcane/modules/YouTubeMedia.js +6 -5
- package/schemas/arcane-app-bundle.schema.json +13 -78
- package/schemas/arcane-app.schema.json +9 -25
- package/schemas/arcane-lock.schema.json +18 -151
- package/schemas/arcane-package.schema.json +2 -16
- package/schemas/native-build-plan.schema.json +119 -122
- package/src/app-descriptor.mjs +75 -132
- package/src/application-tests.mjs +200 -0
- package/src/cli/main.mjs +27 -46
- package/src/constants.mjs +3 -4
- package/src/dev-server.mjs +30 -324
- package/src/doctor.mjs +92 -154
- package/src/dom-event-instrumentation.mjs +55 -147
- package/src/errors.mjs +2 -3
- package/src/event-manager.mjs +239 -624
- package/src/event-queue.mjs +3 -3
- package/src/import-map.mjs +273 -1028
- package/src/index.mjs +14 -16
- package/src/installed-sdk-runtime.mjs +40 -62
- package/src/integrated-provider-loader.mjs +53 -382
- package/src/mail-api.mjs +0 -2
- package/src/mail-server.mjs +224 -580
- package/src/mail.mjs +4 -10
- package/src/native-plan.mjs +163 -598
- package/src/native-provider-loader.mjs +104 -1063
- package/src/packager/core.mjs +485 -3229
- package/src/process.mjs +5 -10
- package/src/release-bundle.mjs +292 -2405
- package/src/runtime.mjs +76 -396
- package/src/scaffold.mjs +30 -80
- package/src/sdk-browser-runtime.mjs +70 -626
- package/src/source-server.mjs +588 -0
- package/src/targets/index.mjs +78 -188
- package/src/templates/workspace-template.mjs +19 -135
- package/src/testing-loader.mjs +164 -0
- package/src/testing.mjs +1 -1
- package/src/toolchain.mjs +131 -544
- package/src/update-check.mjs +26 -64
- package/src/workspace-operation-lock.mjs +139 -430
- package/src/workspace-runtime.mjs +112 -779
- package/src/workspace.mjs +40 -302
- package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +0 -218
- package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +0 -203
- package/browser-runtime/ai/ARCANE_AI_BROWSER_WASM_COMPONENTS.json +0 -80
- package/browser-runtime/ai/internal/sha256.mjs +0 -166
- package/docs/architecture.md +0 -344
- package/docs/compatibility.md +0 -36
- package/docs/event-manager.md +0 -294
- package/docs/platform-targets.md +0 -108
- package/docs/publishing.md +0 -201
- package/docs/reference/README.md +0 -187
- package/docs/reference/ai/browser-speech-package-authority.json +0 -835
- package/docs/reference/ai/browser-speech.md +0 -1252
- package/docs/reference/ai/browser-wasm.md +0 -530
- package/docs/reference/arcane-ollama.md +0 -288
- package/docs/reference/availability-and-normalization.md +0 -183
- package/docs/reference/behavioral-testing.md +0 -133
- package/docs/reference/cli.md +0 -779
- package/docs/reference/core/README.md +0 -62
- package/docs/reference/core/arcane-ai-contracts.md +0 -907
- package/docs/reference/core/arcane-api.md +0 -601
- package/docs/reference/core/arcane-entities.md +0 -65
- package/docs/reference/core/arcane-events.md +0 -134
- package/docs/reference/core/ollama-module.md +0 -181
- package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +0 -1909
- package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +0 -1057
- package/docs/reference/core/reference/arcane-api/core-and-events.md +0 -320
- package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +0 -610
- package/docs/reference/core/reference/arcane-api/namespaces.md +0 -1157
- package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +0 -1423
- package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +0 -315
- package/docs/reference/event-manager.md +0 -1511
- package/docs/reference/inventory/package-api.json +0 -3284
- package/docs/reference/inventory/runtime-components.json +0 -1011
- package/docs/reference/inventory/runtime-entities.json +0 -26
- package/docs/reference/inventory/runtime-modules.json +0 -1431
- package/docs/reference/mail.md +0 -316
- package/docs/reference/protocols.md +0 -677
- package/docs/reference/runtime-components.md +0 -1366
- package/docs/reference/runtime-entities.md +0 -303
- package/docs/reference/runtime-modules.md +0 -2960
- package/docs/reference/sdk-api.md +0 -6694
- package/docs/roadmap.md +0 -79
- package/docs/work-amplification.md +0 -129
- package/runtime/ARCANE_RUNTIME_RELEASE.json +0 -826
package/src/update-check.mjs
CHANGED
|
@@ -5,9 +5,7 @@ import {SDK_NAME,SDK_VERSION} from './constants.mjs';
|
|
|
5
5
|
export const SDK_UPDATE_REGISTRY='https://registry.npmjs.org/';
|
|
6
6
|
export const SDK_UPDATE_TIMEOUT_MS=2500;
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
const MAX_DIST_TAGS=64;
|
|
10
|
-
const DIST_TAG_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
8
|
+
const DIST_TAG_PATTERN=/^[A-Za-z0-9][A-Za-z0-9._-]*$/u;
|
|
11
9
|
const FORBIDDEN_DIST_TAG_KEYS=new Set(['__proto__','constructor','prototype']);
|
|
12
10
|
|
|
13
11
|
function updateFailure(message,{cause,details}={}){
|
|
@@ -25,25 +23,15 @@ function canonicalPackageName(value){
|
|
|
25
23
|
return value;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
|
-
export function validateUpdateRegistry(value
|
|
29
|
-
allowedHosts=new Set(['registry.npmjs.org'])
|
|
30
|
-
}={}){
|
|
26
|
+
export function validateUpdateRegistry(value){
|
|
31
27
|
let registry;
|
|
32
28
|
try{
|
|
33
29
|
registry=new URL(value);
|
|
34
30
|
}catch(error){
|
|
35
31
|
throw updateFailure('The SDK update registry URL is invalid.',{cause:error});
|
|
36
32
|
}
|
|
37
|
-
if(
|
|
38
|
-
|
|
39
|
-
||registry.search||registry.hash
|
|
40
|
-
||registry.pathname!=='/'
|
|
41
|
-
||(registry.port&®istry.port!=='443')
|
|
42
|
-
||!allowedHosts.has(registry.hostname.toLowerCase())){
|
|
43
|
-
throw updateFailure(
|
|
44
|
-
'The SDK update registry must be an approved credential-free HTTPS origin.',
|
|
45
|
-
{details:{registryOrigin:registry.origin}}
|
|
46
|
-
);
|
|
33
|
+
if(!['http:','https:'].includes(registry.protocol)){
|
|
34
|
+
throw updateFailure('The SDK update registry must use HTTP or HTTPS.');
|
|
47
35
|
}
|
|
48
36
|
return registry;
|
|
49
37
|
}
|
|
@@ -53,8 +41,8 @@ function registryEndpoint(registry,packageName){
|
|
|
53
41
|
}
|
|
54
42
|
|
|
55
43
|
function validateTimeout(value){
|
|
56
|
-
if(!Number.isSafeInteger(value)||value<
|
|
57
|
-
throw updateFailure('The SDK update timeout must be
|
|
44
|
+
if(!Number.isSafeInteger(value)||value<1){
|
|
45
|
+
throw updateFailure('The SDK update timeout must be a positive integer of milliseconds.');
|
|
58
46
|
}
|
|
59
47
|
return value;
|
|
60
48
|
}
|
|
@@ -83,51 +71,34 @@ function linkedAbortSignal(signal,timeoutMs,{schedule=setTimeout,cancel=clearTim
|
|
|
83
71
|
};
|
|
84
72
|
}
|
|
85
73
|
|
|
86
|
-
async function
|
|
74
|
+
async function responseText(response){
|
|
87
75
|
const contentType=response.headers?.get?.('content-type')??'';
|
|
88
76
|
if(!/^(?:application\/json|application\/[A-Za-z0-9.+-]+\+json)(?:\s*;|$)/iu.test(contentType)){
|
|
89
77
|
throw updateFailure('The npm registry returned a non-JSON update response.');
|
|
90
78
|
}
|
|
91
|
-
const declared=response.headers?.get?.('content-length');
|
|
92
|
-
if(declared!==null&&declared!==undefined&&declared!==''){
|
|
93
|
-
if(!/^\d+$/u.test(declared)||Number(declared)>MAX_RESPONSE_BYTES){
|
|
94
|
-
throw updateFailure('The npm registry update response exceeded the byte limit.');
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
79
|
if(!response.body||typeof response.body.getReader!=='function'){
|
|
98
80
|
throw updateFailure('The npm registry returned no readable update response.');
|
|
99
81
|
}
|
|
100
82
|
const reader=response.body.getReader();
|
|
101
|
-
const
|
|
102
|
-
let
|
|
83
|
+
const decoder=new TextDecoder('utf-8',{fatal:true});
|
|
84
|
+
let text='';
|
|
103
85
|
try{
|
|
104
86
|
while(true){
|
|
105
87
|
const {done,value}=await reader.read();
|
|
106
88
|
if(done)break;
|
|
107
89
|
if(!(value instanceof Uint8Array)){
|
|
108
90
|
await reader.cancel();
|
|
109
|
-
throw updateFailure('The npm registry update response was not a
|
|
91
|
+
throw updateFailure('The npm registry update response was not a readable stream.');
|
|
110
92
|
}
|
|
111
|
-
|
|
112
|
-
if(total>MAX_RESPONSE_BYTES){
|
|
113
|
-
await reader.cancel();
|
|
114
|
-
throw updateFailure('The npm registry update response exceeded the byte limit.');
|
|
115
|
-
}
|
|
116
|
-
chunks.push(value);
|
|
93
|
+
text+=decoder.decode(value,{stream:true});
|
|
117
94
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
const bytes=new Uint8Array(total);
|
|
122
|
-
let offset=0;
|
|
123
|
-
for(const chunk of chunks){
|
|
124
|
-
bytes.set(chunk,offset);
|
|
125
|
-
offset+=chunk.byteLength;
|
|
126
|
-
}
|
|
127
|
-
try{
|
|
128
|
-
return new TextDecoder('utf-8',{fatal:true}).decode(bytes);
|
|
95
|
+
text+=decoder.decode();
|
|
96
|
+
return text;
|
|
129
97
|
}catch(error){
|
|
98
|
+
if(error instanceof ArcaneError)throw error;
|
|
130
99
|
throw updateFailure('The npm registry update response was not valid UTF-8.',{cause:error});
|
|
100
|
+
}finally{
|
|
101
|
+
reader.releaseLock?.();
|
|
131
102
|
}
|
|
132
103
|
}
|
|
133
104
|
|
|
@@ -136,13 +107,13 @@ function canonicalDistTags(value){
|
|
|
136
107
|
throw updateFailure('The npm registry update response was not a dist-tag object.');
|
|
137
108
|
}
|
|
138
109
|
const entries=Object.entries(value);
|
|
139
|
-
if(entries.length<1
|
|
110
|
+
if(entries.length<1){
|
|
140
111
|
throw updateFailure('The npm registry update response contained an invalid dist-tag count.');
|
|
141
112
|
}
|
|
142
113
|
const tags=Object.create(null);
|
|
143
114
|
for(const [tag,version] of entries){
|
|
144
115
|
if(!DIST_TAG_PATTERN.test(tag)||FORBIDDEN_DIST_TAG_KEYS.has(tag)
|
|
145
|
-
||typeof version!=='string'
|
|
116
|
+
||typeof version!=='string'){
|
|
146
117
|
throw updateFailure('The npm registry update response contained an invalid dist-tag.');
|
|
147
118
|
}
|
|
148
119
|
try{
|
|
@@ -152,7 +123,7 @@ function canonicalDistTags(value){
|
|
|
152
123
|
}
|
|
153
124
|
tags[tag]=version;
|
|
154
125
|
}
|
|
155
|
-
return
|
|
126
|
+
return tags;
|
|
156
127
|
}
|
|
157
128
|
|
|
158
129
|
function comparePrerelease(left,right){
|
|
@@ -199,7 +170,6 @@ export async function checkForSdkUpdate({
|
|
|
199
170
|
packageName=SDK_NAME,
|
|
200
171
|
currentVersion=SDK_VERSION,
|
|
201
172
|
registry=SDK_UPDATE_REGISTRY,
|
|
202
|
-
allowedRegistryHosts,
|
|
203
173
|
timeoutMs=SDK_UPDATE_TIMEOUT_MS,
|
|
204
174
|
fetchImpl=globalThis.fetch,
|
|
205
175
|
signal,
|
|
@@ -208,9 +178,7 @@ export async function checkForSdkUpdate({
|
|
|
208
178
|
}={}){
|
|
209
179
|
throwIfAborted(signal);
|
|
210
180
|
const selectedPackage=canonicalPackageName(packageName);
|
|
211
|
-
const selectedRegistry=validateUpdateRegistry(registry
|
|
212
|
-
...(allowedRegistryHosts===undefined?{}:{allowedHosts:allowedRegistryHosts})
|
|
213
|
-
});
|
|
181
|
+
const selectedRegistry=validateUpdateRegistry(registry);
|
|
214
182
|
const selectedTimeout=validateTimeout(timeoutMs);
|
|
215
183
|
if(typeof fetchImpl!=='function'){
|
|
216
184
|
throw updateFailure('The SDK update HTTP client is unavailable.');
|
|
@@ -226,18 +194,12 @@ export async function checkForSdkUpdate({
|
|
|
226
194
|
try{
|
|
227
195
|
const response=await fetchImpl(endpoint,{
|
|
228
196
|
method:'GET',
|
|
229
|
-
headers:
|
|
230
|
-
redirect:'error',
|
|
231
|
-
cache:'no-store',
|
|
232
|
-
credentials:'omit',
|
|
233
|
-
referrerPolicy:'no-referrer',
|
|
197
|
+
headers:{accept:'application/json'},
|
|
234
198
|
signal:linked.signal
|
|
235
199
|
});
|
|
236
200
|
throwIfAborted(signal);
|
|
237
|
-
if(!response||typeof response.status!=='number'
|
|
238
|
-
|
|
239
|
-
||(response.url&&response.url!==endpoint.href)){
|
|
240
|
-
throw updateFailure('The npm registry update response changed origin or request identity.');
|
|
201
|
+
if(!response||typeof response.status!=='number'){
|
|
202
|
+
throw updateFailure('The npm registry update response is unavailable.');
|
|
241
203
|
}
|
|
242
204
|
if(response.status!==200){
|
|
243
205
|
throw updateFailure(
|
|
@@ -245,7 +207,7 @@ export async function checkForSdkUpdate({
|
|
|
245
207
|
{details:{status:response.status}}
|
|
246
208
|
);
|
|
247
209
|
}
|
|
248
|
-
const body=await
|
|
210
|
+
const body=await responseText(response);
|
|
249
211
|
let document;
|
|
250
212
|
try{
|
|
251
213
|
document=JSON.parse(body);
|
|
@@ -265,7 +227,7 @@ export async function checkForSdkUpdate({
|
|
|
265
227
|
throw updateFailure('The installed or registry SDK version is invalid.',{cause:error});
|
|
266
228
|
}
|
|
267
229
|
const status=comparison<0?'update-available':comparison===0?'current':'ahead';
|
|
268
|
-
const result=
|
|
230
|
+
const result={
|
|
269
231
|
packageName:selectedPackage,
|
|
270
232
|
currentVersion,
|
|
271
233
|
registryVersion,
|
|
@@ -274,7 +236,7 @@ export async function checkForSdkUpdate({
|
|
|
274
236
|
updateAvailable:status==='update-available',
|
|
275
237
|
registry:selectedRegistry.origin,
|
|
276
238
|
checkedAt:clock().toISOString()
|
|
277
|
-
}
|
|
239
|
+
};
|
|
278
240
|
await onEvent?.({
|
|
279
241
|
type:'update.check.completed',
|
|
280
242
|
message:status==='update-available'
|