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,388 @@
1
+ import {SDK_NAME,SDK_VERSION} from '../constants.mjs';
2
+
3
+ function json(value){
4
+ return `${JSON.stringify(value,null,2)}\n`;
5
+ }
6
+
7
+ function html(value){
8
+ return String(value)
9
+ .replaceAll('&','&')
10
+ .replaceAll('<','&lt;')
11
+ .replaceAll('>','&gt;')
12
+ .replaceAll('"','&quot;')
13
+ .replaceAll("'",'&#39;');
14
+ }
15
+
16
+ function titleCase(appId){
17
+ return appId.split('-')
18
+ .map(part=>`${part.slice(0,1).toUpperCase()}${part.slice(1)}`)
19
+ .join(' ');
20
+ }
21
+
22
+ export function workspaceTemplate({
23
+ appId,
24
+ displayName,
25
+ runtimeRelease,
26
+ appOnly=false,
27
+ minimumCoreVersion='0.8.12',
28
+ target='browser',
29
+ appIcon
30
+ }){
31
+ const supportedTargets=['browser','portable','windows-x64','linux-x64','linux-arm64','android-arm64'];
32
+ if(!supportedTargets.includes(target)){
33
+ throw new Error(`Unsupported scaffold target: ${String(target)}.`);
34
+ }
35
+ const native=target!=='browser';
36
+ const buildTarget=native?target:'browser';
37
+ const runTarget=native&&target!=='portable'?target:'browser';
38
+ if(native&&!(appIcon instanceof Uint8Array)){
39
+ throw new Error(`The ${target} scaffold requires its bundled raster icon.`);
40
+ }
41
+ const name=displayName||`Arcane ${titleCase(appId)}`;
42
+ const packageName=`arcane-${appId}`;
43
+ const runtimeContentSha256=runtimeRelease?.contentSha256;
44
+ const upstreamCommit=runtimeRelease?.source?.commit;
45
+ const packageInclude=[`${appId}.css`,'index.html'];
46
+ if(native)packageInclude.push('img/icon.png');
47
+ packageInclude.push('manifest.json','modules');
48
+ const nativeGuide=native?`
49
+ ## ${target} native target
50
+
51
+ This scaffold declares both the browser and ${target} targets and includes the
52
+ required raster application icon.
53
+ Pair it with one explicit Arcane OS checkout:
54
+
55
+ \`\`\`sh
56
+ npm exec -- arcane native-doctor --target ${target} --arcane-root "<path-to-Arcane-OS>"
57
+ npm run build -- --arcane-root "<path-to-Arcane-OS>"
58
+ ${target==='portable'?'':`npm run run -- --arcane-root "<path-to-Arcane-OS>"\n`}
59
+ \`\`\`
60
+
61
+ The selected Arcane provider must support this target or the command fails without
62
+ substituting a browser package. Native output defaults to \`build/${target}/\`.
63
+ ${target==='portable'?'The portable result is an app-scoped Core directory, not a directly runnable executable.\n':''}
64
+ The generated \`img/icon.png\` is an Arcane OS SDK template asset governed by
65
+ the SDK's license terms; replace it with your own raster application icon when
66
+ appropriate.
67
+ `:'';
68
+
69
+ if(!appOnly&&(typeof runtimeContentSha256!=='string'||!/^[a-f0-9]{64}$/.test(runtimeContentSha256))){
70
+ throw new Error('The SDK runtime release does not contain a valid contentSha256.');
71
+ }
72
+ if(!appOnly&&(typeof upstreamCommit!=='string'||!/^[a-f0-9]{40}$/.test(upstreamCommit))){
73
+ throw new Error('The SDK runtime release does not contain a valid upstream commit.');
74
+ }
75
+
76
+ const files=new Map();
77
+ files.set('.gitignore',[
78
+ 'node_modules/',
79
+ 'dist/',
80
+ 'build/',
81
+ '.arcane/',
82
+ '*.log',
83
+ ''
84
+ ].join('\n'));
85
+ files.set('.gitattributes',[
86
+ '* text=auto',
87
+ '*.js text eol=lf',
88
+ '*.mjs text eol=lf',
89
+ '*.json text eol=lf',
90
+ '*.html text eol=lf',
91
+ '*.css text eol=lf',
92
+ '*.md text eol=lf',
93
+ ''
94
+ ].join('\n'));
95
+ files.set('AGENTS.md',`# ${name} development instructions
96
+
97
+ - Use plain JavaScript, HTML, and CSS; do not introduce TypeScript or TSX.
98
+ - Keep reusable mechanisms in Arcane OS and app-specific behavior under \`apps/${appId}/\`.
99
+ - Keep \`arcane/css/theme.css\` and \`ThemeBootstrap.js\` loaded before app styles and modules.
100
+ - Use \`rgb(...)\` or \`rgba(...)\` for new CSS colors.
101
+ - Build one named app and one explicit target at a time. Native targets may be unavailable until their adapters are installed.
102
+ - Run \`npm run check\` before committing.
103
+ `);
104
+ files.set('README.md',`# ${name}
105
+
106
+ This repository contains the Arcane OS application \`${appId}\`. Its source stays outside the Arcane OS repository and uses the \`${SDK_NAME}\` toolchain.
107
+
108
+ ## Start
109
+
110
+ \`\`\`sh
111
+ npm install
112
+ npm run doctor
113
+ npm run dev
114
+ \`\`\`
115
+
116
+ Open the loopback URL printed by the development server. The source server exposes this app and the SDK's browser runtime; it does not expose an Ollama HTTP endpoint.
117
+
118
+ Commit the generated \`package-lock.json\` after dependency installation. CI intentionally uses \`npm ci\` and therefore requires that lock. Before the SDK is published, install a locally packed \`${SDK_NAME}\` \`.tgz\` with \`npm install --save-dev --save-exact <path-to-tarball>\`; keep that tarball at the lock file's relative path for repeatable local \`npm ci\` runs.
119
+
120
+ ## Check and package
121
+
122
+ \`\`\`sh
123
+ npm run check
124
+ npm run package
125
+ npm run run
126
+ \`\`\`
127
+
128
+ The browser release is written to \`dist/${appId}\`. Native providers accept only
129
+ explicit targets and fail honestly when their platform toolchain is unavailable.
130
+ ${nativeGuide}
131
+
132
+ Every browser release also carries Arcane OS licensing material under \`licenses/arcane-os/\`. Review those terms before distribution.
133
+ `);
134
+ files.set('package.json',json({
135
+ name:packageName,
136
+ private:true,
137
+ type:'module',
138
+ scripts:{
139
+ doctor:'arcane doctor',
140
+ dev:'arcane dev',
141
+ test:'arcane test',
142
+ check:'arcane check',
143
+ package:'arcane package',
144
+ build:`arcane build --target ${buildTarget}`,
145
+ run:`arcane run --target ${runTarget}`,
146
+ 'build:browser':'arcane build --target browser',
147
+ 'run:browser':'arcane run --target browser'
148
+ },
149
+ devDependencies:{
150
+ [SDK_NAME]:SDK_VERSION
151
+ },
152
+ engines:{node:'>=22.23.2'}
153
+ }));
154
+ files.set('arcane-packager.json',json({
155
+ schemaVersion:1,
156
+ appsRoot:'apps',
157
+ distRoot:'dist',
158
+ sharedPayloads:{
159
+ 'browser-runtime':[
160
+ {
161
+ source:'node_modules/arcane-os/runtime/arcane',
162
+ destination:'arcane',
163
+ include:['components','css','entities','img','modules','security'],
164
+ exclude:[]
165
+ },
166
+ {
167
+ source:'node_modules/arcane-os/runtime/strong-type',
168
+ destination:'node_modules/strong-type',
169
+ include:['index.js','licence','package.json'],
170
+ exclude:[]
171
+ },
172
+ {
173
+ source:'node_modules/arcane-os',
174
+ destination:'licenses/arcane-os',
175
+ include:['LICENSE','COMMERCIAL-LICENSE.md','NOTICE'],
176
+ exclude:[]
177
+ }
178
+ ]
179
+ }
180
+ }));
181
+ files.set('arcane.lock.json',json({
182
+ schemaVersion:1,
183
+ sdk:{name:SDK_NAME,version:SDK_VERSION},
184
+ runtime:{
185
+ manifest:'node_modules/arcane-os/runtime/ARCANE_RUNTIME_RELEASE.json',
186
+ contentSha256:runtimeContentSha256,
187
+ upstreamCommit
188
+ },
189
+ protocols:{
190
+ arcane:'arcane/1',
191
+ cliEvents:'arcane-cli-events/1',
192
+ targetAdapter:'arcane-target-adapter/1'
193
+ }
194
+ }));
195
+ files.set('.github/workflows/check.yml',`name: check
196
+
197
+ on:
198
+ push:
199
+ branches: [main]
200
+ pull_request:
201
+
202
+ permissions:
203
+ contents: read
204
+
205
+ jobs:
206
+ check:
207
+ runs-on: \${{ matrix.os }}
208
+ strategy:
209
+ fail-fast: false
210
+ matrix:
211
+ os: [ubuntu-latest, windows-latest]
212
+ steps:
213
+ - uses: actions/checkout@v6
214
+ - uses: actions/setup-node@v6
215
+ with:
216
+ node-version: 24
217
+ package-manager-cache: false
218
+ - run: npm ci --ignore-scripts
219
+ - run: npm run check
220
+ `);
221
+ files.set(`apps/${appId}/arcane-app.json`,json({
222
+ schemaVersion:2,
223
+ id:appId,
224
+ displayName:name,
225
+ description:`${name} Arcane application.`,
226
+ version:'0.1.0',
227
+ publisher:{
228
+ id:'the-wizard-nexus',
229
+ name:'The Wizard Nexus'
230
+ },
231
+ package:{
232
+ entry:'index.html',
233
+ strategy:'static',
234
+ include:packageInclude,
235
+ exclude:[],
236
+ shared:['browser-runtime']
237
+ },
238
+ permissions:{
239
+ capabilities:[],
240
+ methods:[]
241
+ },
242
+ security:{
243
+ connectOrigins:[],
244
+ frameOrigins:[],
245
+ mediaOrigins:[]
246
+ },
247
+ native:{
248
+ type:'app',
249
+ icon:native?'img/icon.png':null,
250
+ order:100,
251
+ bundledApps:[]
252
+ },
253
+ requirements:{
254
+ arcaneProtocol:'arcane/1',
255
+ minimumCoreVersion,
256
+ features:[]
257
+ },
258
+ targets:native?['browser',target].sort():['browser']
259
+ }));
260
+ files.set(`apps/${appId}/arcane-package.json`,json({
261
+ schemaVersion:1,
262
+ id:appId,
263
+ displayName:name,
264
+ version:'0.1.0',
265
+ entry:'index.html',
266
+ strategy:'static',
267
+ security:{
268
+ connectOrigins:[],
269
+ frameOrigins:[],
270
+ mediaOrigins:[]
271
+ },
272
+ include:packageInclude,
273
+ exclude:[],
274
+ shared:['browser-runtime']
275
+ }));
276
+ files.set(`apps/${appId}/manifest.json`,json({
277
+ name,
278
+ short_name:titleCase(appId).slice(0,30),
279
+ start_url:'./index.html',
280
+ display:'standalone',
281
+ background_color:'rgb(13, 18, 32)',
282
+ theme_color:'rgb(23, 34, 56)',
283
+ icons:[]
284
+ }));
285
+ files.set(`apps/${appId}/index.html`,`<!doctype html>
286
+ <html lang="en">
287
+ <head>
288
+ <meta charset="utf-8">
289
+ <meta name="arcane-app-id" content="${html(appId)}">
290
+ <base href="../../">
291
+ <meta name="viewport" content="width=device-width, initial-scale=1">
292
+ <meta name="theme-color" content="rgb(23, 34, 56)">
293
+ <title>${html(name)}</title>
294
+ <link rel="manifest" href="./apps/${html(appId)}/manifest.json">
295
+ <link rel="stylesheet" href="./arcane/css/theme.css?v=1">
296
+ <link rel="stylesheet" href="./arcane/css/primitives.css?v=1">
297
+ <link rel="stylesheet" href="./apps/${html(appId)}/${html(appId)}.css?v=1">
298
+ <script type="module" src="./arcane/modules/ThemeBootstrap.js?v=1"></script>
299
+ </head>
300
+ <body>
301
+ <main class="app-shell">
302
+ <section class="arcane-card" aria-labelledby="app-title">
303
+ <header class="arcane-card__header">
304
+ <div>
305
+ <p class="eyebrow">Arcane application</p>
306
+ <h1 id="app-title">${html(name)}</h1>
307
+ </div>
308
+ </header>
309
+ <div class="arcane-card__body">
310
+ <p id="app-status" role="status" aria-live="polite">Ready.</p>
311
+ <button id="app-action" class="arcane-button" type="button">Test the app</button>
312
+ </div>
313
+ </section>
314
+ </main>
315
+ <script type="module" src="./apps/${html(appId)}/modules/App.js?v=1"></script>
316
+ </body>
317
+ </html>
318
+ `);
319
+ files.set(`apps/${appId}/${appId}.css`,`body {
320
+ margin: 0;
321
+ min-height: 100vh;
322
+ background: var(--background, rgb(13, 18, 32));
323
+ color: var(--text-color, rgb(235, 241, 255));
324
+ }
325
+
326
+ .app-shell {
327
+ box-sizing: border-box;
328
+ width: min(52rem, 100%);
329
+ margin: 0 auto;
330
+ padding: 2rem 1rem;
331
+ }
332
+
333
+ .eyebrow {
334
+ color: var(--accent-color, rgb(116, 167, 255));
335
+ font-weight: 700;
336
+ letter-spacing: 0.08em;
337
+ text-transform: uppercase;
338
+ }
339
+ `);
340
+ files.set(`apps/${appId}/modules/App.js`,`const appName=${JSON.stringify(name)};
341
+ const action=document.querySelector('#app-action');
342
+ const status=document.querySelector('#app-status');
343
+
344
+ action?.addEventListener('click',()=>{
345
+ status.textContent=\`The \${appName} app is working.\`;
346
+ });
347
+ `);
348
+ if(native){
349
+ files.set(`apps/${appId}/img/icon.png`,Buffer.from(appIcon));
350
+ }
351
+ files.set(`apps/${appId}/test/app.test.mjs`,`import assert from 'node:assert/strict';
352
+ import {readFile} from 'node:fs/promises';
353
+ import test from '${SDK_NAME}/testing';
354
+
355
+ const appRoot=new URL('../',import.meta.url);
356
+
357
+ test('application shell uses the shared Arcane theme in order',async()=>{
358
+ const source=await readFile(new URL('index.html',appRoot),'utf8');
359
+ const theme=source.indexOf('./arcane/css/theme.css');
360
+ const primitives=source.indexOf('./arcane/css/primitives.css');
361
+ const appStyle=source.indexOf('./apps/${appId}/${appId}.css');
362
+ const bootstrap=source.indexOf('./arcane/modules/ThemeBootstrap.js');
363
+ const appModule=source.indexOf('./apps/${appId}/modules/App.js');
364
+
365
+ assert.match(source,/<base href="\\.\\.\\/\\.\\.\\/">/);
366
+ assert.match(source,/<meta name="arcane-app-id" content="${appId}">/);
367
+ assert.ok(theme>=0&&primitives>theme&&appStyle>primitives);
368
+ assert.ok(bootstrap>appStyle&&appModule>bootstrap);
369
+ });
370
+
371
+ test('application package identity matches its directory',async()=>{
372
+ const manifest=JSON.parse(await readFile(new URL('arcane-package.json',appRoot),'utf8'));
373
+ assert.equal(manifest.id,'${appId}');
374
+ assert.equal(manifest.strategy,'static');
375
+ assert.deepEqual(manifest.shared,['browser-runtime']);
376
+ });
377
+ `);
378
+
379
+ if(appOnly){
380
+ return {
381
+ name,
382
+ files:new Map([...files].filter(([relative])=>relative.startsWith(`apps/${appId}/`)))
383
+ };
384
+ }
385
+ return {name,files};
386
+ }
387
+
388
+ export {SDK_NAME,SDK_VERSION};
@@ -0,0 +1,9 @@
1
+ const TESTING_SPECIFIER='arcane-os/testing';
2
+ const TESTING_URL=new URL('./testing.mjs',import.meta.url).href;
3
+
4
+ export function resolve(specifier,context,nextResolve){
5
+ if(specifier===TESTING_SPECIFIER){
6
+ return {url:TESTING_URL,shortCircuit:true};
7
+ }
8
+ return nextResolve(specifier,context);
9
+ }