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.
Files changed (248) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/COMMERCIAL-LICENSE.md +13 -0
  3. package/LICENSE +661 -0
  4. package/NOTICE +70 -0
  5. package/README.md +448 -0
  6. package/bin/arcane-test.mjs +741 -0
  7. package/bin/arcane.mjs +5 -0
  8. package/docs/architecture.md +234 -0
  9. package/docs/compatibility.md +36 -0
  10. package/docs/event-manager.md +166 -0
  11. package/docs/platform-targets.md +108 -0
  12. package/docs/publishing.md +203 -0
  13. package/docs/reference/README.md +117 -0
  14. package/docs/reference/arcane-ollama.md +288 -0
  15. package/docs/reference/availability-and-normalization.md +123 -0
  16. package/docs/reference/behavioral-testing.md +86 -0
  17. package/docs/reference/cli.md +569 -0
  18. package/docs/reference/core/README.md +62 -0
  19. package/docs/reference/core/arcane-ai-contracts.md +873 -0
  20. package/docs/reference/core/arcane-api.md +601 -0
  21. package/docs/reference/core/arcane-entities.md +65 -0
  22. package/docs/reference/core/arcane-events.md +134 -0
  23. package/docs/reference/core/ollama-module.md +181 -0
  24. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +1909 -0
  25. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +1057 -0
  26. package/docs/reference/core/reference/arcane-api/core-and-events.md +320 -0
  27. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +610 -0
  28. package/docs/reference/core/reference/arcane-api/namespaces.md +1157 -0
  29. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +1423 -0
  30. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +315 -0
  31. package/docs/reference/event-manager.md +957 -0
  32. package/docs/reference/inventory/package-api.json +2632 -0
  33. package/docs/reference/inventory/runtime-components.json +934 -0
  34. package/docs/reference/inventory/runtime-entities.json +26 -0
  35. package/docs/reference/inventory/runtime-modules.json +1249 -0
  36. package/docs/reference/protocols.md +242 -0
  37. package/docs/reference/runtime-components.md +1098 -0
  38. package/docs/reference/runtime-entities.md +303 -0
  39. package/docs/reference/runtime-modules.md +2010 -0
  40. package/docs/reference/sdk-api.md +4901 -0
  41. package/docs/roadmap.md +79 -0
  42. package/docs/work-amplification.md +124 -0
  43. package/node_modules/event-pubsub/CHANGELOG.md +55 -0
  44. package/node_modules/event-pubsub/MIGRATION.md +70 -0
  45. package/node_modules/event-pubsub/README.md +363 -0
  46. package/node_modules/event-pubsub/SECURITY.md +37 -0
  47. package/node_modules/event-pubsub/index.js +141 -0
  48. package/node_modules/event-pubsub/licence +21 -0
  49. package/node_modules/event-pubsub/package.json +59 -0
  50. package/node_modules/strong-type/README.md +408 -0
  51. package/node_modules/strong-type/assets/strong-type-header.png +0 -0
  52. package/node_modules/strong-type/index.js +1151 -0
  53. package/node_modules/strong-type/licence +21 -0
  54. package/node_modules/strong-type/node.js +125 -0
  55. package/node_modules/strong-type/package.json +61 -0
  56. package/package.json +95 -0
  57. package/runtime/ARCANE_RUNTIME_RELEASE.json +791 -0
  58. package/runtime/arcane/components/app-bar.html +468 -0
  59. package/runtime/arcane/components/assistant-panel.html +715 -0
  60. package/runtime/arcane/components/calculator.html +8 -0
  61. package/runtime/arcane/components/chart.html +655 -0
  62. package/runtime/arcane/components/chat.html +1225 -0
  63. package/runtime/arcane/components/conversation-view.html +13 -0
  64. package/runtime/arcane/components/dashboard-config.html +341 -0
  65. package/runtime/arcane/components/data-maintenance.html +112 -0
  66. package/runtime/arcane/components/data-view.html +92 -0
  67. package/runtime/arcane/components/directory-picker.html +197 -0
  68. package/runtime/arcane/components/document-inspector.html +252 -0
  69. package/runtime/arcane/components/file-drop.html +264 -0
  70. package/runtime/arcane/components/file-inspector.html +293 -0
  71. package/runtime/arcane/components/file-manager.html +1715 -0
  72. package/runtime/arcane/components/header.html +142 -0
  73. package/runtime/arcane/components/integration-settings.html +14 -0
  74. package/runtime/arcane/components/local-ai-status.html +360 -0
  75. package/runtime/arcane/components/markdown-document.html +1048 -0
  76. package/runtime/arcane/components/markdown-editor.html +360 -0
  77. package/runtime/arcane/components/media-embed.html +8 -0
  78. package/runtime/arcane/components/modal.html +402 -0
  79. package/runtime/arcane/components/output-panel.html +259 -0
  80. package/runtime/arcane/components/preferences-form.html +135 -0
  81. package/runtime/arcane/components/record-timeline.html +105 -0
  82. package/runtime/arcane/components/relationship-board.html +116 -0
  83. package/runtime/arcane/components/screen-capture.html +8 -0
  84. package/runtime/arcane/components/source-code-viewer.html +441 -0
  85. package/runtime/arcane/components/source-explanation.html +124 -0
  86. package/runtime/arcane/components/speech.html +365 -0
  87. package/runtime/arcane/components/summary-strip.html +177 -0
  88. package/runtime/arcane/components/table.html +77 -0
  89. package/runtime/arcane/components/task-progress.html +282 -0
  90. package/runtime/arcane/components/terminal-workspace.html +65 -0
  91. package/runtime/arcane/components/theme-editor.html +41 -0
  92. package/runtime/arcane/components/theme-switcher.html +46 -0
  93. package/runtime/arcane/components/unified-inbox.html +20 -0
  94. package/runtime/arcane/components/voice-transcription.html +476 -0
  95. package/runtime/arcane/components/weather-widget.html +8 -0
  96. package/runtime/arcane/components/web-navigator.html +239 -0
  97. package/runtime/arcane/css/communications.css +1 -0
  98. package/runtime/arcane/css/dashboard-config.css +45 -0
  99. package/runtime/arcane/css/document-site.css +981 -0
  100. package/runtime/arcane/css/layout.css +438 -0
  101. package/runtime/arcane/css/primitives.css +321 -0
  102. package/runtime/arcane/css/theme.css +112 -0
  103. package/runtime/arcane/css/utility-workspace.css +1 -0
  104. package/runtime/arcane/entities/ApiModelRecord.js +20 -0
  105. package/runtime/arcane/entities/Calculation.js +13 -0
  106. package/runtime/arcane/entities/Chat.js +581 -0
  107. package/runtime/arcane/entities/CommunicationMessage.js +29 -0
  108. package/runtime/arcane/entities/CommunicationThread.js +21 -0
  109. package/runtime/arcane/entities/Document.js +10 -0
  110. package/runtime/arcane/entities/File.js +143 -0
  111. package/runtime/arcane/entities/Image.js +135 -0
  112. package/runtime/arcane/entities/IntentEnvelope.js +834 -0
  113. package/runtime/arcane/entities/Preference.js +83 -0
  114. package/runtime/arcane/entities/TWiNPolicyDecision.js +1092 -0
  115. package/runtime/arcane/entities/TerminalSession.js +46 -0
  116. package/runtime/arcane/entities/Theme.js +107 -0
  117. package/runtime/arcane/entities/User.js +1046 -0
  118. package/runtime/arcane/entities/Weather.js +23 -0
  119. package/runtime/arcane/img/arcane-os-everywhere.png +0 -0
  120. package/runtime/arcane/img/arrow-left.png +0 -0
  121. package/runtime/arcane/img/arrow-right.png +0 -0
  122. package/runtime/arcane/img/doc.svg +5 -0
  123. package/runtime/arcane/img/folder.svg +4 -0
  124. package/runtime/arcane/img/image.svg +5 -0
  125. package/runtime/arcane/img/refresh.png +0 -0
  126. package/runtime/arcane/img/send.svg +9 -0
  127. package/runtime/arcane/img/trash.svg +5 -0
  128. package/runtime/arcane/img/upload.svg +5 -0
  129. package/runtime/arcane/modules/AI.js +2048 -0
  130. package/runtime/arcane/modules/AIPreferenceRuntime.js +32 -0
  131. package/runtime/arcane/modules/AIPreferenceTuple.js +92 -0
  132. package/runtime/arcane/modules/AIResponseLength.js +42 -0
  133. package/runtime/arcane/modules/AIResponseURLPolicy.js +626 -0
  134. package/runtime/arcane/modules/AnsiText.js +53 -0
  135. package/runtime/arcane/modules/ApiModelDatabase.js +25 -0
  136. package/runtime/arcane/modules/AppDataScope.js +245 -0
  137. package/runtime/arcane/modules/AppearancePreferences.js +28 -0
  138. package/runtime/arcane/modules/ArcaneCommunicationBridge.js +22 -0
  139. package/runtime/arcane/modules/ArcaneNavigationPolicy.js +135 -0
  140. package/runtime/arcane/modules/ArcaneNetworkPolicy.js +255 -0
  141. package/runtime/arcane/modules/AsyncBoundary.js +161 -0
  142. package/runtime/arcane/modules/BrowserTestSuite.js +326 -0
  143. package/runtime/arcane/modules/CalculatorEngine.js +20 -0
  144. package/runtime/arcane/modules/CaseEvidenceIndexer.js +134 -0
  145. package/runtime/arcane/modules/ChartLibrary.js +35 -0
  146. package/runtime/arcane/modules/ChatRecords.js +13 -0
  147. package/runtime/arcane/modules/CommunicationAppController.js +43 -0
  148. package/runtime/arcane/modules/CommunicationHub.js +16 -0
  149. package/runtime/arcane/modules/CommunicationPreferences.js +13 -0
  150. package/runtime/arcane/modules/CommunicationProviderRegistry.js +16 -0
  151. package/runtime/arcane/modules/ComponentContracts.js +586 -0
  152. package/runtime/arcane/modules/ConfiguredAIChatSession.js +288 -0
  153. package/runtime/arcane/modules/ConversationActionItems.js +488 -0
  154. package/runtime/arcane/modules/ConversationClosingReport.js +274 -0
  155. package/runtime/arcane/modules/ConversationTimebox.js +527 -0
  156. package/runtime/arcane/modules/CoreLocalModelCatalog.js +255 -0
  157. package/runtime/arcane/modules/DBLS.js +171 -0
  158. package/runtime/arcane/modules/DBOPFS.js +1154 -0
  159. package/runtime/arcane/modules/DBOPFSWorker.js +116 -0
  160. package/runtime/arcane/modules/DataMaintenance.js +91 -0
  161. package/runtime/arcane/modules/DevelopmentWorkspace.js +74 -0
  162. package/runtime/arcane/modules/DirectoryPicker.js +109 -0
  163. package/runtime/arcane/modules/DocumentNavigation.js +223 -0
  164. package/runtime/arcane/modules/Errors.js +1025 -0
  165. package/runtime/arcane/modules/GifEncoder.js +29 -0
  166. package/runtime/arcane/modules/HTMLImport.js +114 -0
  167. package/runtime/arcane/modules/InMemoryCommunicationProvider.js +14 -0
  168. package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +275 -0
  169. package/runtime/arcane/modules/LocalAIReadiness.js +870 -0
  170. package/runtime/arcane/modules/LocalAIReadinessController.js +156 -0
  171. package/runtime/arcane/modules/MD.js +111 -0
  172. package/runtime/arcane/modules/Mail.js +352 -0
  173. package/runtime/arcane/modules/MailTransport.mjs +180 -0
  174. package/runtime/arcane/modules/Marked.min.js +71 -0
  175. package/runtime/arcane/modules/MemoryRecords.js +44 -0
  176. package/runtime/arcane/modules/MessageAdvisory.js +38 -0
  177. package/runtime/arcane/modules/ModelDefinition.js +189 -0
  178. package/runtime/arcane/modules/Ollama.js +74 -0
  179. package/runtime/arcane/modules/OllamaModelIdentifier.js +21 -0
  180. package/runtime/arcane/modules/OllamaSettings.js +24 -0
  181. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +14 -0
  182. package/runtime/arcane/modules/PreferenceStore.js +109 -0
  183. package/runtime/arcane/modules/QRCode.min.js +1 -0
  184. package/runtime/arcane/modules/Questionnaire.js +61 -0
  185. package/runtime/arcane/modules/RecordLinkIndex.js +24 -0
  186. package/runtime/arcane/modules/RecordPassageIndex.js +222 -0
  187. package/runtime/arcane/modules/RecordReviewStore.js +94 -0
  188. package/runtime/arcane/modules/RevocableProjectionLedger.js +1623 -0
  189. package/runtime/arcane/modules/RiskSignalAnalyzer.js +37 -0
  190. package/runtime/arcane/modules/ScamRiskPolicy.js +62 -0
  191. package/runtime/arcane/modules/ScopedOPFSCache.js +183 -0
  192. package/runtime/arcane/modules/ScreenCapture.js +20 -0
  193. package/runtime/arcane/modules/SpeechPlayback.js +581 -0
  194. package/runtime/arcane/modules/StaticDocumentCatalog.js +1248 -0
  195. package/runtime/arcane/modules/SystemAppearance.js +20 -0
  196. package/runtime/arcane/modules/SystemPlatformPresentation.js +51 -0
  197. package/runtime/arcane/modules/SystemToolRegistry.js +28 -0
  198. package/runtime/arcane/modules/TerminalClient.js +52 -0
  199. package/runtime/arcane/modules/TerminalCommandRegistry.js +50 -0
  200. package/runtime/arcane/modules/ThemeBootstrap.js +26 -0
  201. package/runtime/arcane/modules/ThemeManager.js +131 -0
  202. package/runtime/arcane/modules/TimeGuard.js +149 -0
  203. package/runtime/arcane/modules/ToolCallRouter.js +83 -0
  204. package/runtime/arcane/modules/WaitForComponent.js +102 -0
  205. package/runtime/arcane/modules/YouTubeMedia.js +16 -0
  206. package/runtime/arcane/modules/uPlot.LICENSE.txt +21 -0
  207. package/runtime/arcane/modules/uPlot.iife.min.js +2 -0
  208. package/runtime/arcane/modules/uPlot.min.css +1 -0
  209. package/runtime/arcane/security/arcane-network-policy.json +6 -0
  210. package/runtime/strong-type/index.js +352 -0
  211. package/runtime/strong-type/licence +21 -0
  212. package/runtime/strong-type/package.json +45 -0
  213. package/schemas/arcane-app-bundle.schema.json +125 -0
  214. package/schemas/arcane-app.schema.json +329 -0
  215. package/schemas/arcane-lock.schema.json +86 -0
  216. package/schemas/arcane-package.schema.json +224 -0
  217. package/schemas/cli-event.schema.json +122 -0
  218. package/schemas/event-stack.schema.json +152 -0
  219. package/schemas/native-build-plan.schema.json +176 -0
  220. package/schemas/target-adapter.schema.json +117 -0
  221. package/src/app-descriptor.mjs +500 -0
  222. package/src/cli/main.mjs +561 -0
  223. package/src/constants.mjs +31 -0
  224. package/src/dev-server.mjs +718 -0
  225. package/src/doctor.mjs +315 -0
  226. package/src/dom-event-instrumentation.mjs +594 -0
  227. package/src/errors.mjs +75 -0
  228. package/src/event-manager.mjs +1342 -0
  229. package/src/event-queue.mjs +138 -0
  230. package/src/events.mjs +219 -0
  231. package/src/index.mjs +177 -0
  232. package/src/integrated-provider-loader.mjs +432 -0
  233. package/src/native-plan.mjs +698 -0
  234. package/src/native-provider-loader.mjs +1126 -0
  235. package/src/packager/core.mjs +2691 -0
  236. package/src/process.mjs +353 -0
  237. package/src/release-bundle.mjs +2523 -0
  238. package/src/repository.mjs +90 -0
  239. package/src/runtime.mjs +452 -0
  240. package/src/scaffold.mjs +380 -0
  241. package/src/targets/index.mjs +436 -0
  242. package/src/templates/assets/app-icon.png +0 -0
  243. package/src/templates/workspace-template.mjs +388 -0
  244. package/src/testing-loader.mjs +9 -0
  245. package/src/testing.mjs +427 -0
  246. package/src/toolchain.mjs +1335 -0
  247. package/src/update-check.mjs +307 -0
  248. 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
+ }