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,436 @@
|
|
|
1
|
+
import {packageApp,verifyApp} from '../packager/core.mjs';
|
|
2
|
+
import {startDevServer} from '../dev-server.mjs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import {
|
|
5
|
+
TARGET_ADAPTER_PROTOCOL,
|
|
6
|
+
TARGET_IDS
|
|
7
|
+
} from '../constants.mjs';
|
|
8
|
+
import {ArcaneError,ERROR_CODES,throwIfAborted} from '../errors.mjs';
|
|
9
|
+
import {
|
|
10
|
+
createNativeBuildPlan,
|
|
11
|
+
executeNativeBuildPlan,
|
|
12
|
+
validateNativeBuilder
|
|
13
|
+
} from '../native-plan.mjs';
|
|
14
|
+
|
|
15
|
+
const DEFINITIONS=Object.freeze([
|
|
16
|
+
Object.freeze({
|
|
17
|
+
id:'browser',
|
|
18
|
+
displayName:'Browser/static',
|
|
19
|
+
status:'available',
|
|
20
|
+
platforms:['any'],
|
|
21
|
+
architectures:['any'],
|
|
22
|
+
formats:['directory'],
|
|
23
|
+
signingModes:['none'],
|
|
24
|
+
reason:null
|
|
25
|
+
}),
|
|
26
|
+
Object.freeze({
|
|
27
|
+
id:'portable',
|
|
28
|
+
displayName:'Portable native application',
|
|
29
|
+
status:'pairing-required',
|
|
30
|
+
platforms:['windows','linux'],
|
|
31
|
+
architectures:['x64','arm64'],
|
|
32
|
+
formats:['portable'],
|
|
33
|
+
signingModes:['unsigned-local-test'],
|
|
34
|
+
reason:'Portable output is available only when explicitly paired to a compatible Arcane OS checkout with --arcane-root.'
|
|
35
|
+
}),
|
|
36
|
+
Object.freeze({
|
|
37
|
+
id:'windows-x64',
|
|
38
|
+
displayName:'Windows x64 executable',
|
|
39
|
+
status:'pairing-required',
|
|
40
|
+
platforms:['windows'],
|
|
41
|
+
architectures:['x64'],
|
|
42
|
+
formats:['exe'],
|
|
43
|
+
signingModes:['unsigned-local-test'],
|
|
44
|
+
reason:'Windows output requires explicit pairing to a compatible Arcane OS checkout with --arcane-root.'
|
|
45
|
+
}),
|
|
46
|
+
Object.freeze({
|
|
47
|
+
id:'linux-x64',
|
|
48
|
+
displayName:'Linux x64 executable',
|
|
49
|
+
status:'pairing-required',
|
|
50
|
+
platforms:['linux'],
|
|
51
|
+
architectures:['x64'],
|
|
52
|
+
formats:['deb'],
|
|
53
|
+
signingModes:['unsigned-local-test'],
|
|
54
|
+
reason:'Linux x64 output requires explicit pairing to a compatible Arcane OS checkout with --arcane-root.'
|
|
55
|
+
}),
|
|
56
|
+
Object.freeze({
|
|
57
|
+
id:'linux-arm64',
|
|
58
|
+
displayName:'Linux ARM64 executable',
|
|
59
|
+
status:'pairing-required',
|
|
60
|
+
platforms:['linux'],
|
|
61
|
+
architectures:['arm64'],
|
|
62
|
+
formats:['deb'],
|
|
63
|
+
signingModes:['unsigned-local-test'],
|
|
64
|
+
reason:'Linux ARM64 output requires explicit pairing to a compatible Arcane OS checkout with --arcane-root and a native ARM64 toolchain.'
|
|
65
|
+
}),
|
|
66
|
+
Object.freeze({
|
|
67
|
+
id:'android-arm64',
|
|
68
|
+
displayName:'Android ARM64 application',
|
|
69
|
+
status:'pairing-required',
|
|
70
|
+
platforms:['android'],
|
|
71
|
+
architectures:['arm64'],
|
|
72
|
+
formats:['apk'],
|
|
73
|
+
signingModes:['development'],
|
|
74
|
+
reason:'Android APK output requires explicit pairing to a compatible Arcane OS checkout with --arcane-root and the Android development toolchain.'
|
|
75
|
+
})
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
function describe(definition){
|
|
79
|
+
return {
|
|
80
|
+
protocol:TARGET_ADAPTER_PROTOCOL,
|
|
81
|
+
...definition,
|
|
82
|
+
platforms:[...definition.platforms],
|
|
83
|
+
architectures:[...definition.architectures],
|
|
84
|
+
formats:[...definition.formats],
|
|
85
|
+
signingModes:[...definition.signingModes],
|
|
86
|
+
methods:['describe','doctor','prepare','plan','build','verify','run']
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function deferredError(definition){
|
|
91
|
+
const state=definition.status==='pairing-required'
|
|
92
|
+
?`requires explicit pairing. ${definition.reason}`
|
|
93
|
+
:`is deferred. ${definition.reason}`;
|
|
94
|
+
return new ArcaneError(
|
|
95
|
+
ERROR_CODES.targetDeferred,
|
|
96
|
+
`Target ${definition.id} ${state}`,
|
|
97
|
+
{details:describe(definition)}
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function createDeferredAdapter(definition){
|
|
102
|
+
const unavailable=async options=>{
|
|
103
|
+
throwIfAborted(options?.signal);
|
|
104
|
+
throw deferredError(definition);
|
|
105
|
+
};
|
|
106
|
+
return Object.freeze({
|
|
107
|
+
protocol:TARGET_ADAPTER_PROTOCOL,
|
|
108
|
+
id:definition.id,
|
|
109
|
+
describe:async()=>describe(definition),
|
|
110
|
+
doctor:async()=>({
|
|
111
|
+
target:definition.id,
|
|
112
|
+
status:definition.status,
|
|
113
|
+
ready:false,
|
|
114
|
+
reason:definition.reason
|
|
115
|
+
}),
|
|
116
|
+
prepare:unavailable,
|
|
117
|
+
plan:unavailable,
|
|
118
|
+
build:unavailable,
|
|
119
|
+
verify:unavailable,
|
|
120
|
+
run:unavailable
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const browserDefinition=DEFINITIONS[0];
|
|
125
|
+
const browserAdapter=Object.freeze({
|
|
126
|
+
protocol:TARGET_ADAPTER_PROTOCOL,
|
|
127
|
+
id:'browser',
|
|
128
|
+
describe:async()=>describe(browserDefinition),
|
|
129
|
+
doctor:async()=>({target:'browser',status:'available',ready:true}),
|
|
130
|
+
async prepare({signal}={}){
|
|
131
|
+
throwIfAborted(signal);
|
|
132
|
+
return {target:'browser',status:'available',ready:true,required:false};
|
|
133
|
+
},
|
|
134
|
+
async plan({workspaceRoot,appId,format='directory',signing='none',signal}={}){
|
|
135
|
+
throwIfAborted(signal);
|
|
136
|
+
if(format!=='directory'){
|
|
137
|
+
throw new ArcaneError(
|
|
138
|
+
ERROR_CODES.targetUnavailable,
|
|
139
|
+
`Browser target format ${format} is unavailable; use directory.`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
if(signing!=='none'){
|
|
143
|
+
throw new ArcaneError(
|
|
144
|
+
ERROR_CODES.targetUnavailable,
|
|
145
|
+
'The browser/static development target does not use a signing profile.'
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
protocol:TARGET_ADAPTER_PROTOCOL,
|
|
150
|
+
target:'browser',
|
|
151
|
+
workspaceRoot,
|
|
152
|
+
appId,
|
|
153
|
+
format,
|
|
154
|
+
signing,
|
|
155
|
+
operations:['verify-sdk-runtime','validate-workspace','package-selected-app']
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
async build({
|
|
159
|
+
workspaceRoot,
|
|
160
|
+
appId,
|
|
161
|
+
format='directory',
|
|
162
|
+
signing='none',
|
|
163
|
+
dryRun=false,
|
|
164
|
+
signal,
|
|
165
|
+
onEvent,
|
|
166
|
+
validateSourceState
|
|
167
|
+
}={}){
|
|
168
|
+
await this.plan({workspaceRoot,appId,format,signing,signal});
|
|
169
|
+
throwIfAborted(signal);
|
|
170
|
+
const release=await packageApp({
|
|
171
|
+
workspaceRoot,
|
|
172
|
+
appId,
|
|
173
|
+
dryRun,
|
|
174
|
+
signal,
|
|
175
|
+
onEvent,
|
|
176
|
+
validateSourceState
|
|
177
|
+
});
|
|
178
|
+
return {target:'browser',format,signing,release};
|
|
179
|
+
},
|
|
180
|
+
async verify({workspaceRoot,appId,signal,onEvent}={}){
|
|
181
|
+
throwIfAborted(signal);
|
|
182
|
+
return {target:'browser',release:await verifyApp({workspaceRoot,appId,signal,onEvent})};
|
|
183
|
+
},
|
|
184
|
+
async run({workspaceRoot,appId,host='127.0.0.1',port=0,signal,onEvent}={}){
|
|
185
|
+
throwIfAborted(signal);
|
|
186
|
+
const verified=await verifyApp({workspaceRoot,appId,signal,onEvent});
|
|
187
|
+
const server=await startDevServer({
|
|
188
|
+
workspaceRoot,
|
|
189
|
+
appId,
|
|
190
|
+
mode:'packaged',
|
|
191
|
+
releaseRoot:path.join(workspaceRoot,'dist',appId),
|
|
192
|
+
releaseReceipt:verified.receipt,
|
|
193
|
+
host,
|
|
194
|
+
port,
|
|
195
|
+
signal,
|
|
196
|
+
onEvent
|
|
197
|
+
});
|
|
198
|
+
return {...server,target:'browser',verified};
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const adapters=new Map([
|
|
203
|
+
['browser',browserAdapter],
|
|
204
|
+
...DEFINITIONS.slice(1).map(definition=>[
|
|
205
|
+
definition.id,
|
|
206
|
+
createDeferredAdapter(definition)
|
|
207
|
+
])
|
|
208
|
+
]);
|
|
209
|
+
|
|
210
|
+
function nativeDefinition(targetId){
|
|
211
|
+
const definition=DEFINITIONS.find(item=>item.id===targetId);
|
|
212
|
+
if(!definition||definition.id==='browser'){
|
|
213
|
+
throw new ArcaneError(
|
|
214
|
+
ERROR_CODES.targetUnavailable,
|
|
215
|
+
`A native target adapter cannot be paired for ${String(targetId)}.`
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return definition;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function selectedNativeRequest(targetId,targetRequest){
|
|
222
|
+
if(targetRequest?.target!==targetId){
|
|
223
|
+
throw new ArcaneError(
|
|
224
|
+
ERROR_CODES.targetUnavailable,
|
|
225
|
+
`The injected native adapter for ${targetId} requires an explicit matching targetRequest.`
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
return targetRequest;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function selectedArtifactReceipt(artifactReceipt){
|
|
232
|
+
if(!artifactReceipt||typeof artifactReceipt!=='object'||Array.isArray(artifactReceipt)){
|
|
233
|
+
throw new ArcaneError(
|
|
234
|
+
ERROR_CODES.integrityFailed,
|
|
235
|
+
'An explicit native artifact receipt is required.'
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
return artifactReceipt;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export function createNativeTargetAdapter({targetId,nativeBuilder}={}){
|
|
242
|
+
const definition=nativeDefinition(targetId);
|
|
243
|
+
const provider=validateNativeBuilder(nativeBuilder);
|
|
244
|
+
let providerDescriptionPromise;
|
|
245
|
+
|
|
246
|
+
async function requireProviderTarget(){
|
|
247
|
+
providerDescriptionPromise??=Promise.resolve(provider.describe()).then(description=>{
|
|
248
|
+
if(!description||description.protocol!=='arcane-native-builder/1'
|
|
249
|
+
||!Array.isArray(description.targets)||!description.targets.includes(targetId)){
|
|
250
|
+
throw new ArcaneError(
|
|
251
|
+
ERROR_CODES.targetUnavailable,
|
|
252
|
+
`The selected native provider does not declare support for target ${targetId}.`
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
return description;
|
|
256
|
+
});
|
|
257
|
+
return providerDescriptionPromise;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function plan({
|
|
261
|
+
toolchainRoot,
|
|
262
|
+
toolchainReceipt,
|
|
263
|
+
appReleaseRoot,
|
|
264
|
+
appReleaseReceipt,
|
|
265
|
+
appDescriptor,
|
|
266
|
+
dependencyReleases,
|
|
267
|
+
providerGeneration,
|
|
268
|
+
minimumCoreVersion,
|
|
269
|
+
protectedRoots,
|
|
270
|
+
outputRoot,
|
|
271
|
+
targetRequest,
|
|
272
|
+
signal,
|
|
273
|
+
onEvent
|
|
274
|
+
}={}){
|
|
275
|
+
await requireProviderTarget();
|
|
276
|
+
return createNativeBuildPlan({
|
|
277
|
+
nativeBuilder:provider,
|
|
278
|
+
toolchainRoot,
|
|
279
|
+
toolchainReceipt,
|
|
280
|
+
appReleaseRoot,
|
|
281
|
+
appReleaseReceipt,
|
|
282
|
+
appDescriptor,
|
|
283
|
+
dependencyReleases,
|
|
284
|
+
providerGeneration:providerGeneration??provider.providerGeneration,
|
|
285
|
+
minimumCoreVersion,
|
|
286
|
+
protectedRoots,
|
|
287
|
+
outputRoot,
|
|
288
|
+
targetRequest:selectedNativeRequest(targetId,targetRequest),
|
|
289
|
+
signal,
|
|
290
|
+
onEvent
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return Object.freeze({
|
|
295
|
+
protocol:TARGET_ADAPTER_PROTOCOL,
|
|
296
|
+
id:definition.id,
|
|
297
|
+
describe:async()=>{
|
|
298
|
+
await requireProviderTarget();
|
|
299
|
+
return {
|
|
300
|
+
...describe(definition),
|
|
301
|
+
status:'available',
|
|
302
|
+
reason:null
|
|
303
|
+
};
|
|
304
|
+
},
|
|
305
|
+
async doctor({toolchainRoot,toolchainReceipt,targetRequest,signal,onEvent}={}){
|
|
306
|
+
throwIfAborted(signal);
|
|
307
|
+
await requireProviderTarget();
|
|
308
|
+
return provider.doctor({
|
|
309
|
+
toolchainRoot,
|
|
310
|
+
toolchainReceipt,
|
|
311
|
+
targetRequest:selectedNativeRequest(targetId,targetRequest),
|
|
312
|
+
signal,
|
|
313
|
+
onEvent
|
|
314
|
+
});
|
|
315
|
+
},
|
|
316
|
+
async prepare({toolchainRoot,targetRequest,signal,onEvent}={}){
|
|
317
|
+
throwIfAborted(signal);
|
|
318
|
+
await requireProviderTarget();
|
|
319
|
+
return provider.prepare({
|
|
320
|
+
toolchainRoot,
|
|
321
|
+
targetRequest:selectedNativeRequest(targetId,targetRequest),
|
|
322
|
+
signal,
|
|
323
|
+
onEvent
|
|
324
|
+
});
|
|
325
|
+
},
|
|
326
|
+
plan,
|
|
327
|
+
async build({nativePlan,...options}={}){
|
|
328
|
+
throwIfAborted(options.signal);
|
|
329
|
+
await requireProviderTarget();
|
|
330
|
+
const selectedPlan=nativePlan??await plan(options);
|
|
331
|
+
const result=await executeNativeBuildPlan(selectedPlan,{
|
|
332
|
+
expectedNativeBuilder:provider,
|
|
333
|
+
expectedTarget:targetId,
|
|
334
|
+
signal:options.signal,
|
|
335
|
+
onEvent:options.onEvent
|
|
336
|
+
});
|
|
337
|
+
return {
|
|
338
|
+
...result,
|
|
339
|
+
target:targetId,
|
|
340
|
+
platform:selectedPlan.targetRequest.platform,
|
|
341
|
+
architecture:selectedPlan.targetRequest.architecture,
|
|
342
|
+
format:selectedPlan.targetRequest.format,
|
|
343
|
+
signing:selectedPlan.targetRequest.signing,
|
|
344
|
+
plan:selectedPlan
|
|
345
|
+
};
|
|
346
|
+
},
|
|
347
|
+
async verify({
|
|
348
|
+
toolchainRoot,
|
|
349
|
+
toolchainReceipt,
|
|
350
|
+
artifactReceipt,
|
|
351
|
+
targetRequest,
|
|
352
|
+
signal,
|
|
353
|
+
onEvent
|
|
354
|
+
}={}){
|
|
355
|
+
throwIfAborted(signal);
|
|
356
|
+
await requireProviderTarget();
|
|
357
|
+
const selectedReceipt=selectedArtifactReceipt(artifactReceipt);
|
|
358
|
+
const result=await provider.verify({
|
|
359
|
+
toolchainRoot,
|
|
360
|
+
toolchainReceipt,
|
|
361
|
+
artifactReceipt:selectedReceipt,
|
|
362
|
+
targetRequest:selectedNativeRequest(targetId,targetRequest),
|
|
363
|
+
signal,
|
|
364
|
+
onEvent
|
|
365
|
+
});
|
|
366
|
+
if(!result||result.verified!==true){
|
|
367
|
+
throw new ArcaneError(
|
|
368
|
+
ERROR_CODES.integrityFailed,
|
|
369
|
+
`The native provider did not verify the ${targetId} artifact.`
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
target:targetId,
|
|
374
|
+
targetRequest,
|
|
375
|
+
artifactReceipt:selectedReceipt,
|
|
376
|
+
verification:result
|
|
377
|
+
};
|
|
378
|
+
},
|
|
379
|
+
async run({
|
|
380
|
+
toolchainRoot,
|
|
381
|
+
toolchainReceipt,
|
|
382
|
+
artifactReceipt,
|
|
383
|
+
targetRequest,
|
|
384
|
+
signal,
|
|
385
|
+
onEvent
|
|
386
|
+
}={}){
|
|
387
|
+
throwIfAborted(signal);
|
|
388
|
+
await requireProviderTarget();
|
|
389
|
+
const selectedReceipt=selectedArtifactReceipt(artifactReceipt);
|
|
390
|
+
const result=await provider.run({
|
|
391
|
+
toolchainRoot,
|
|
392
|
+
toolchainReceipt,
|
|
393
|
+
artifactReceipt:selectedReceipt,
|
|
394
|
+
targetRequest:selectedNativeRequest(targetId,targetRequest),
|
|
395
|
+
signal,
|
|
396
|
+
onEvent
|
|
397
|
+
});
|
|
398
|
+
return {
|
|
399
|
+
target:targetId,
|
|
400
|
+
targetRequest,
|
|
401
|
+
artifactReceipt:selectedReceipt,
|
|
402
|
+
result
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
export function listTargets(){
|
|
409
|
+
return DEFINITIONS.map(describe);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export function getTargetAdapter(targetId){
|
|
413
|
+
if(!TARGET_IDS.includes(targetId)||!adapters.has(targetId)){
|
|
414
|
+
throw new ArcaneError(
|
|
415
|
+
ERROR_CODES.targetUnavailable,
|
|
416
|
+
`Unknown Arcane target: ${String(targetId)}.`,
|
|
417
|
+
{details:{available:[...TARGET_IDS]}}
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
return adapters.get(targetId);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
export async function buildTarget(options={}){
|
|
424
|
+
const adapter=getTargetAdapter(options.target);
|
|
425
|
+
return adapter.build(options);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export async function verifyTarget(options={}){
|
|
429
|
+
const adapter=getTargetAdapter(options.target);
|
|
430
|
+
return adapter.verify(options);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
export async function runTarget(options={}){
|
|
434
|
+
const adapter=getTargetAdapter(options.target);
|
|
435
|
+
return adapter.run(options);
|
|
436
|
+
}
|
|
Binary file
|