@omega.js/desktop 0.1.0

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 (818) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +166 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-desktop +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/core/_fontawesome.scss +146 -0
  7. package/dist/assets/css/core/_initialize.scss +38 -0
  8. package/dist/assets/css/omega-desktop.scss +39 -0
  9. package/dist/assets/css/shell/_index.scss +207 -0
  10. package/dist/assets/css/tokens/_index.scss +166 -0
  11. package/dist/assets/js/bootstrap.bundle.js +1 -0
  12. package/dist/assets/js/core/app-shell.js +136 -0
  13. package/dist/assets/themes/_template/README.md +115 -0
  14. package/dist/assets/themes/_template/_config.scss +60 -0
  15. package/dist/assets/themes/_template/_theme.js +14 -0
  16. package/dist/assets/themes/_template/_theme.scss +28 -0
  17. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  18. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  19. package/dist/assets/themes/base/README.md +5 -0
  20. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  21. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  22. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  23. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  24. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  25. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  26. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  27. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  28. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  29. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  30. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  31. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  32. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  33. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  34. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  35. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  36. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  37. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  38. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  39. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  40. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  41. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  42. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  43. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  44. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  45. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  46. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  47. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  48. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  49. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  50. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  51. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  52. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  53. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  54. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  55. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  56. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  57. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  58. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  59. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  60. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  61. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  62. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  63. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  91. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  92. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  93. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  94. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  95. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  96. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  97. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  98. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  99. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  100. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  101. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  102. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  103. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  104. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  105. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  106. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  107. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  108. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  109. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  110. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  111. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  112. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  113. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  114. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  115. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  116. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  117. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  118. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  119. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  120. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  121. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  122. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  123. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  124. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  125. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  126. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  127. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  128. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  129. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  130. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  131. package/dist/assets/themes/base/_theme.js +13 -0
  132. package/dist/assets/themes/base/_theme.scss +4 -0
  133. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  134. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  135. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  136. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  137. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  138. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  139. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  140. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  141. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  142. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  143. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  144. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  145. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  146. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  147. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  148. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  149. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  150. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  151. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  152. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  153. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  154. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  155. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  156. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  157. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  158. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  159. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  160. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  161. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  162. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  163. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  164. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  165. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  166. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  167. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  168. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  169. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  170. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  171. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  172. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  173. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  174. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  175. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  176. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  177. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  178. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  179. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  180. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  181. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  182. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  183. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  184. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  185. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  186. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  187. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  188. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  189. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  190. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  191. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  192. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  193. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  194. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  195. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  196. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  197. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  198. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  199. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  200. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  201. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  202. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  203. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  204. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  205. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  206. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  207. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  208. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  209. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  210. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  211. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  212. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  213. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  214. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  215. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  216. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  217. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  218. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  219. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  220. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  221. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  222. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  223. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  224. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  225. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  226. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  227. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  228. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  229. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  230. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  231. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  232. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  233. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  234. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  238. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  239. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  240. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  241. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  242. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  243. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  244. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  245. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  246. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  265. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  266. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  267. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  268. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  269. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  270. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  271. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  272. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  273. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  274. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  275. package/dist/assets/themes/classy/README.md +89 -0
  276. package/dist/assets/themes/classy/_config.scss +245 -0
  277. package/dist/assets/themes/classy/_theme.js +31 -0
  278. package/dist/assets/themes/classy/_theme.scss +57 -0
  279. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  280. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  281. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  282. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  283. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  284. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  285. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  286. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  287. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  288. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  289. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  290. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  291. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  292. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  293. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  294. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  295. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  296. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  297. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  298. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  299. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  300. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  301. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  302. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  303. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  304. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  305. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  306. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  307. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  308. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  309. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  310. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  311. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  312. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  313. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  314. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  315. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  316. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  317. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  318. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  319. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  320. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  321. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  322. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  323. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  324. package/dist/assets/themes/neobrutalism/README.md +118 -0
  325. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  326. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  327. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  328. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  329. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  330. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  331. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  332. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  333. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  334. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  335. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  336. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  337. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  338. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  339. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  340. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  341. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  342. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  343. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  344. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  345. package/dist/assets/themes/newsflash/README.md +117 -0
  346. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  347. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  348. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  349. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  350. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  351. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  352. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  353. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  354. package/dist/assets/themes/newsflash/_config.scss +147 -0
  355. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  356. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  357. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  358. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  359. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  360. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  361. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  362. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  363. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  364. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  365. package/dist/assets/themes/newsflash/_theme.js +24 -0
  366. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  367. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  368. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  369. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  370. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  371. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  372. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  373. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  374. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  375. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  376. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  377. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  378. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  379. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  380. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  381. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  382. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  383. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  384. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  385. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  386. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  387. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  388. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  389. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  390. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  391. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  392. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  393. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  394. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  395. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  396. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  397. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  398. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  399. package/dist/build.js +249 -0
  400. package/dist/cli-run.js +34 -0
  401. package/dist/cli.js +49 -0
  402. package/dist/commands/build.js +32 -0
  403. package/dist/commands/cdp/capture.js +91 -0
  404. package/dist/commands/cdp/client.js +140 -0
  405. package/dist/commands/cdp/eval.js +20 -0
  406. package/dist/commands/cdp/quit.js +84 -0
  407. package/dist/commands/cdp/relaunch.js +62 -0
  408. package/dist/commands/cdp/shot.js +20 -0
  409. package/dist/commands/cdp/status.js +38 -0
  410. package/dist/commands/cdp/theme.js +21 -0
  411. package/dist/commands/cdp.js +53 -0
  412. package/dist/commands/clean.js +34 -0
  413. package/dist/commands/deploy.js +75 -0
  414. package/dist/commands/finalize-release.js +238 -0
  415. package/dist/commands/install.js +37 -0
  416. package/dist/commands/launch.js +150 -0
  417. package/dist/commands/lib/dependencies.js +35 -0
  418. package/dist/commands/lib/deploy-precheck.js +117 -0
  419. package/dist/commands/lib/ensure-target.js +300 -0
  420. package/dist/commands/logs.js +185 -0
  421. package/dist/commands/package.js +31 -0
  422. package/dist/commands/publish.js +34 -0
  423. package/dist/commands/push-secrets.js +141 -0
  424. package/dist/commands/release.js +286 -0
  425. package/dist/commands/runner.js +1874 -0
  426. package/dist/commands/sign-windows.js +563 -0
  427. package/dist/commands/test.js +121 -0
  428. package/dist/commands/update.js +21 -0
  429. package/dist/commands/validate-certs.js +238 -0
  430. package/dist/commands/version.js +9 -0
  431. package/dist/config/page-template.html +35 -0
  432. package/dist/defaults/.github/workflows/build.yml +276 -0
  433. package/dist/defaults/AGENTS.md +109 -0
  434. package/dist/defaults/CHANGELOG.md +15 -0
  435. package/dist/defaults/CLAUDE.md +1 -0
  436. package/dist/defaults/_.gitignore +24 -0
  437. package/dist/defaults/_mas/README.md +49 -0
  438. package/dist/defaults/_mas/entitlements.mas.inherit.plist +12 -0
  439. package/dist/defaults/_mas/entitlements.mas.loginhelper.plist +8 -0
  440. package/dist/defaults/_mas/entitlements.mas.plist +33 -0
  441. package/dist/defaults/config/certs/.gitkeep +0 -0
  442. package/dist/defaults/config/certs/README.md +60 -0
  443. package/dist/defaults/config/icons/macos/dmg.png +0 -0
  444. package/dist/defaults/config/icons/macos/icon.png +0 -0
  445. package/dist/defaults/config/icons/macos/tray.png +0 -0
  446. package/dist/defaults/config/icons/windows/icon.png +0 -0
  447. package/dist/defaults/config/omega.json5 +279 -0
  448. package/dist/defaults/docs/README.md +17 -0
  449. package/dist/defaults/gulpfile.js +6 -0
  450. package/dist/defaults/hooks/build/post.js +9 -0
  451. package/dist/defaults/hooks/build/pre.js +9 -0
  452. package/dist/defaults/hooks/notarize/post.js +16 -0
  453. package/dist/defaults/hooks/release/post.js +9 -0
  454. package/dist/defaults/hooks/release/pre.js +9 -0
  455. package/dist/defaults/src/assets/js/components/about/index.js +10 -0
  456. package/dist/defaults/src/assets/js/components/main/index.js +14 -0
  457. package/dist/defaults/src/assets/js/components/settings/index.js +10 -0
  458. package/dist/defaults/src/assets/scss/main.scss +34 -0
  459. package/dist/defaults/src/assets/scss/pages/about.scss +3 -0
  460. package/dist/defaults/src/assets/scss/pages/main.scss +4 -0
  461. package/dist/defaults/src/assets/scss/pages/settings.scss +3 -0
  462. package/dist/defaults/src/integrations/context-menu/index.js +60 -0
  463. package/dist/defaults/src/integrations/menu/index.js +58 -0
  464. package/dist/defaults/src/integrations/tray/index.js +60 -0
  465. package/dist/defaults/src/main.js +78 -0
  466. package/dist/defaults/src/preload.js +15 -0
  467. package/dist/defaults/src/views/about/index.html +3 -0
  468. package/dist/defaults/src/views/main/index.html +8 -0
  469. package/dist/defaults/src/views/settings/index.html +3 -0
  470. package/dist/defaults/test/README.md +41 -0
  471. package/dist/defaults/test/_init.js +10 -0
  472. package/dist/gulp/main.js +144 -0
  473. package/dist/gulp/tasks/audit.js +82 -0
  474. package/dist/gulp/tasks/build-config.js +445 -0
  475. package/dist/gulp/tasks/bundle.js +451 -0
  476. package/dist/gulp/tasks/defaults.js +20 -0
  477. package/dist/gulp/tasks/distribute.js +8 -0
  478. package/dist/gulp/tasks/html.js +95 -0
  479. package/dist/gulp/tasks/package-quick.js +102 -0
  480. package/dist/gulp/tasks/package.js +53 -0
  481. package/dist/gulp/tasks/release.js +57 -0
  482. package/dist/gulp/tasks/sass.js +82 -0
  483. package/dist/gulp/tasks/serve.js +191 -0
  484. package/dist/hooks/notarize.js +70 -0
  485. package/dist/index.js +14 -0
  486. package/dist/lib/_menu-mixin.js +199 -0
  487. package/dist/lib/analytics.js +360 -0
  488. package/dist/lib/app-state.js +220 -0
  489. package/dist/lib/auth-flow.js +160 -0
  490. package/dist/lib/auth-persistence.js +207 -0
  491. package/dist/lib/auto-updater.js +752 -0
  492. package/dist/lib/client-bridge.js +371 -0
  493. package/dist/lib/context-menu.js +302 -0
  494. package/dist/lib/context.js +162 -0
  495. package/dist/lib/deep-link.js +370 -0
  496. package/dist/lib/fontawesome.js +203 -0
  497. package/dist/lib/ipc.js +169 -0
  498. package/dist/lib/logger-lite.js +259 -0
  499. package/dist/lib/logger.js +4 -0
  500. package/dist/lib/menu.js +521 -0
  501. package/dist/lib/protocol.js +85 -0
  502. package/dist/lib/remote-config.js +224 -0
  503. package/dist/lib/remote-scripts.js +158 -0
  504. package/dist/lib/restart-manager/index.js +550 -0
  505. package/dist/lib/restart-manager/install.js +353 -0
  506. package/dist/lib/restart-manager/protocol.js +274 -0
  507. package/dist/lib/sign-helpers/auto-unlock.js +95 -0
  508. package/dist/lib/sign-helpers/entitlements.js +98 -0
  509. package/dist/lib/sign-helpers/resolve-icons.js +171 -0
  510. package/dist/lib/sign-helpers/sign-events.js +75 -0
  511. package/dist/lib/sign-helpers/update-info.js +186 -0
  512. package/dist/lib/startup.js +214 -0
  513. package/dist/lib/storage.js +193 -0
  514. package/dist/lib/templating.js +85 -0
  515. package/dist/lib/theme.js +173 -0
  516. package/dist/lib/tray.js +414 -0
  517. package/dist/lib/usage.js +141 -0
  518. package/dist/lib/window-manager.js +509 -0
  519. package/dist/main.js +542 -0
  520. package/dist/omega-bin.js +6 -0
  521. package/dist/preload.js +241 -0
  522. package/dist/renderer.js +456 -0
  523. package/dist/test/assert.js +4 -0
  524. package/dist/test/fixtures/consumer-app/config/omega.json5 +39 -0
  525. package/dist/test/fixtures/consumer-app/package.json +13 -0
  526. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +11 -0
  527. package/dist/test/fixtures/consumer-app/src/assets/scss/main.scss +3 -0
  528. package/dist/test/fixtures/consumer-app/src/main.js +17 -0
  529. package/dist/test/fixtures/consumer-app/src/preload.js +4 -0
  530. package/dist/test/fixtures/consumer-app/src/views/main/index.html +4 -0
  531. package/dist/test/harness/boot-entry.js +237 -0
  532. package/dist/test/harness/main-entry.js +494 -0
  533. package/dist/test/harness/package.json +6 -0
  534. package/dist/test/harness/renderer-entry.js +173 -0
  535. package/dist/test/harness/renderer-preload.js +310 -0
  536. package/dist/test/harness/renderer.html +12 -0
  537. package/dist/test/index.js +65 -0
  538. package/dist/test/runner.js +99 -0
  539. package/dist/test/runners/boot.js +414 -0
  540. package/dist/test/runners/electron.js +92 -0
  541. package/dist/test/runners/render-event.js +46 -0
  542. package/dist/test/suites/boot/build-isolation.test.js +54 -0
  543. package/dist/test/suites/boot/consumer-app-boots.test.js +99 -0
  544. package/dist/test/suites/boot/restart-manager.test.js +38 -0
  545. package/dist/test/suites/boot/storage-bundled.test.js +59 -0
  546. package/dist/test/suites/boot/theme.test.js +68 -0
  547. package/dist/test/suites/boot/view-suite.test.js +47 -0
  548. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  549. package/dist/test/suites/build/audit.test.js +271 -0
  550. package/dist/test/suites/build/boot-fixture.test.js +48 -0
  551. package/dist/test/suites/build/build-config.test.js +457 -0
  552. package/dist/test/suites/build/build-verbs.test.js +156 -0
  553. package/dist/test/suites/build/build-workflow-jobs.test.js +55 -0
  554. package/dist/test/suites/build/cdp.test.js +89 -0
  555. package/dist/test/suites/build/cli.test.js +135 -0
  556. package/dist/test/suites/build/config-schema.test.js +133 -0
  557. package/dist/test/suites/build/defaults-scaffold.test.js +192 -0
  558. package/dist/test/suites/build/deliver-certs.test.js +95 -0
  559. package/dist/test/suites/build/derive-signing-env.test.js +122 -0
  560. package/dist/test/suites/build/electron-node-version.test.js +49 -0
  561. package/dist/test/suites/build/electron-targets.test.js +92 -0
  562. package/dist/test/suites/build/ensure-target.test.js +131 -0
  563. package/dist/test/suites/build/entitlements.test.js +107 -0
  564. package/dist/test/suites/build/env-delivery.test.js +166 -0
  565. package/dist/test/suites/build/env-watch.test.js +86 -0
  566. package/dist/test/suites/build/exports.test.js +63 -0
  567. package/dist/test/suites/build/finalize-release.test.js +152 -0
  568. package/dist/test/suites/build/format-fetch-error.test.js +85 -0
  569. package/dist/test/suites/build/framework-deps.test.js +173 -0
  570. package/dist/test/suites/build/get-config.test.js +137 -0
  571. package/dist/test/suites/build/github-utils.test.js +54 -0
  572. package/dist/test/suites/build/icon-sheet.test.js +62 -0
  573. package/dist/test/suites/build/license-stamp.test.js +63 -0
  574. package/dist/test/suites/build/logger-lite.test.js +148 -0
  575. package/dist/test/suites/build/logs-command.test.js +226 -0
  576. package/dist/test/suites/build/manager.test.js +193 -0
  577. package/dist/test/suites/build/menu-mixin.test.js +130 -0
  578. package/dist/test/suites/build/merge-line-files.test.js +230 -0
  579. package/dist/test/suites/build/omega-shell.test.js +94 -0
  580. package/dist/test/suites/build/omega-tokens.test.js +64 -0
  581. package/dist/test/suites/build/project-scripts-deps.test.js +90 -0
  582. package/dist/test/suites/build/push-secrets.test.js +226 -0
  583. package/dist/test/suites/build/release-pipeline.test.js +365 -0
  584. package/dist/test/suites/build/renderer-auth-bridge.test.js +158 -0
  585. package/dist/test/suites/build/renderer-entry-key.test.js +37 -0
  586. package/dist/test/suites/build/renderer-node-shims.test.js +125 -0
  587. package/dist/test/suites/build/resolve-icons.test.js +296 -0
  588. package/dist/test/suites/build/resolve-signing-cert.test.js +342 -0
  589. package/dist/test/suites/build/restart-manager-install.test.js +178 -0
  590. package/dist/test/suites/build/restart-manager-protocol.test.js +158 -0
  591. package/dist/test/suites/build/run-consumer-hook.test.js +137 -0
  592. package/dist/test/suites/build/runner.test.js +2599 -0
  593. package/dist/test/suites/build/sanitize-signing-env.test.js +98 -0
  594. package/dist/test/suites/build/sanitize-url.test.js +78 -0
  595. package/dist/test/suites/build/secure-remote-url.test.js +42 -0
  596. package/dist/test/suites/build/sentry.test.js +89 -0
  597. package/dist/test/suites/build/serve-resolve-electron.test.js +58 -0
  598. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  599. package/dist/test/suites/build/sign-events.test.js +90 -0
  600. package/dist/test/suites/build/sign-windows-e2e.test.js +302 -0
  601. package/dist/test/suites/build/sign-windows.test.js +313 -0
  602. package/dist/test/suites/build/strip-dev-blocks.test.js +116 -0
  603. package/dist/test/suites/build/templating.test.js +95 -0
  604. package/dist/test/suites/build/test-discovery.test.js +64 -0
  605. package/dist/test/suites/build/test-stealth.test.js +83 -0
  606. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  607. package/dist/test/suites/build/update-info.test.js +224 -0
  608. package/dist/test/suites/build/url-helpers.test.js +289 -0
  609. package/dist/test/suites/build/validate-certs.test.js +103 -0
  610. package/dist/test/suites/build/validate-config.test.js +90 -0
  611. package/dist/test/suites/build/verb-logs.test.js +43 -0
  612. package/dist/test/suites/build/wave5-pins.test.js +35 -0
  613. package/dist/test/suites/main/analytics.test.js +364 -0
  614. package/dist/test/suites/main/app-state.test.js +197 -0
  615. package/dist/test/suites/main/auth-flow.test.js +196 -0
  616. package/dist/test/suites/main/auth-persistence.test.js +167 -0
  617. package/dist/test/suites/main/auto-updater.test.js +1138 -0
  618. package/dist/test/suites/main/boot-sequence.test.js +77 -0
  619. package/dist/test/suites/main/client-bridge.integration.test.js +134 -0
  620. package/dist/test/suites/main/client-bridge.test.js +249 -0
  621. package/dist/test/suites/main/context-menu.test.js +365 -0
  622. package/dist/test/suites/main/context.test.js +155 -0
  623. package/dist/test/suites/main/deep-link.test.js +288 -0
  624. package/dist/test/suites/main/epipe-handler.test.js +40 -0
  625. package/dist/test/suites/main/fontawesome.test.js +147 -0
  626. package/dist/test/suites/main/harness-cdp.test.js +49 -0
  627. package/dist/test/suites/main/ipc.test.js +165 -0
  628. package/dist/test/suites/main/menu.test.js +419 -0
  629. package/dist/test/suites/main/protocol.test.js +77 -0
  630. package/dist/test/suites/main/remote-config.test.js +189 -0
  631. package/dist/test/suites/main/remote-scripts.test.js +276 -0
  632. package/dist/test/suites/main/restart-manager.test.js +328 -0
  633. package/dist/test/suites/main/startup-paths-and-ua.test.js +99 -0
  634. package/dist/test/suites/main/startup.test.js +129 -0
  635. package/dist/test/suites/main/stealth-window.test.js +74 -0
  636. package/dist/test/suites/main/storage.test.js +89 -0
  637. package/dist/test/suites/main/theme.test.js +137 -0
  638. package/dist/test/suites/main/tray.test.js +322 -0
  639. package/dist/test/suites/main/truncate-on-boot.test.js +22 -0
  640. package/dist/test/suites/main/url-helpers.test.js +429 -0
  641. package/dist/test/suites/main/usage.test.js +127 -0
  642. package/dist/test/suites/main/window-bounds.test.js +169 -0
  643. package/dist/test/suites/main/window-manager.test.js +233 -0
  644. package/dist/test/suites/renderer/analytics-bridge.test.js +128 -0
  645. package/dist/test/suites/renderer/cross-context-helpers.test.js +131 -0
  646. package/dist/test/suites/renderer/fontawesome.test.js +190 -0
  647. package/dist/test/suites/renderer/round-trip.test.js +107 -0
  648. package/dist/test/suites/renderer/theme.test.js +118 -0
  649. package/dist/test/suites/renderer/tooltips.test.js +166 -0
  650. package/dist/test/suites/renderer/verts.test.js +100 -0
  651. package/dist/test/suites/renderer/window-em-surface.test.js +107 -0
  652. package/dist/test/utils/dist-snapshot.js +36 -0
  653. package/dist/test/utils/extended-mode-warning.js +13 -0
  654. package/dist/utils/app-root.js +28 -0
  655. package/dist/utils/attach-log-file.js +4 -0
  656. package/dist/utils/build-pipeline.js +58 -0
  657. package/dist/utils/deliver-certs.js +69 -0
  658. package/dist/utils/derive-signing-env.js +56 -0
  659. package/dist/utils/dist-root.js +21 -0
  660. package/dist/utils/electron-node-version.js +48 -0
  661. package/dist/utils/electron-targets.js +72 -0
  662. package/dist/utils/format-fetch-error.js +38 -0
  663. package/dist/utils/github.js +73 -0
  664. package/dist/utils/load-consumer-file.js +26 -0
  665. package/dist/utils/merge-line-files.js +5 -0
  666. package/dist/utils/mode-helpers.js +147 -0
  667. package/dist/utils/resolve-signing-cert.js +175 -0
  668. package/dist/utils/run-consumer-hook.js +38 -0
  669. package/dist/utils/runner-env.js +687 -0
  670. package/dist/utils/safe-install.js +4 -0
  671. package/dist/utils/sanitize-signing-env.js +45 -0
  672. package/dist/utils/sanitize-url.js +28 -0
  673. package/dist/utils/secure-remote-url.js +25 -0
  674. package/dist/utils/stealth-window.js +37 -0
  675. package/dist/utils/test-stealth.js +29 -0
  676. package/dist/utils/url-helpers.js +169 -0
  677. package/dist/vendor/account/engine.js +182 -0
  678. package/dist/vendor/account/features.js +220 -0
  679. package/dist/vendor/account/index.js +53 -0
  680. package/dist/vendor/account/schema.js +272 -0
  681. package/dist/vendor/account/subscription.js +38 -0
  682. package/dist/vendor/analytics/adapters/ga4.js +26 -0
  683. package/dist/vendor/analytics/adapters/meta.js +26 -0
  684. package/dist/vendor/analytics/adapters/resolve.js +130 -0
  685. package/dist/vendor/analytics/adapters/tiktok.js +27 -0
  686. package/dist/vendor/analytics/catalog.js +908 -0
  687. package/dist/vendor/analytics/consent.js +49 -0
  688. package/dist/vendor/analytics/core.js +141 -0
  689. package/dist/vendor/analytics/identity.js +136 -0
  690. package/dist/vendor/analytics/index.js +170 -0
  691. package/dist/vendor/analytics/logger.js +40 -0
  692. package/dist/vendor/analytics/transports/browser.js +110 -0
  693. package/dist/vendor/config/company.js +31 -0
  694. package/dist/vendor/config/defaults.js +173 -0
  695. package/dist/vendor/config/demo.js +18 -0
  696. package/dist/vendor/config/desktop-artifacts.js +110 -0
  697. package/dist/vendor/config/edit.js +769 -0
  698. package/dist/vendor/config/env-delivery.js +145 -0
  699. package/dist/vendor/config/env-rules.js +93 -0
  700. package/dist/vendor/config/env-schema.js +1078 -0
  701. package/dist/vendor/config/env.js +445 -0
  702. package/dist/vendor/config/hooks.js +97 -0
  703. package/dist/vendor/config/index.js +237 -0
  704. package/dist/vendor/config/instances.js +208 -0
  705. package/dist/vendor/config/load.js +490 -0
  706. package/dist/vendor/config/merge.js +68 -0
  707. package/dist/vendor/config/order.js +139 -0
  708. package/dist/vendor/config/ports.js +374 -0
  709. package/dist/vendor/config/providers.js +32 -0
  710. package/dist/vendor/config/repo.js +142 -0
  711. package/dist/vendor/config/retired-keys.js +430 -0
  712. package/dist/vendor/config/schema.js +1610 -0
  713. package/dist/vendor/config/secrets.js +50 -0
  714. package/dist/vendor/config/seed.js +34 -0
  715. package/dist/vendor/config/site-global.js +205 -0
  716. package/dist/vendor/config/validate.js +554 -0
  717. package/dist/vendor/config/winback.js +61 -0
  718. package/dist/vendor/devkit/actions-secrets.js +145 -0
  719. package/dist/vendor/devkit/attach-log-file.js +262 -0
  720. package/dist/vendor/devkit/bundle.js +292 -0
  721. package/dist/vendor/devkit/certs.js +199 -0
  722. package/dist/vendor/devkit/ci-workflows.js +520 -0
  723. package/dist/vendor/devkit/clean-dirs.js +28 -0
  724. package/dist/vendor/devkit/cli-router.js +156 -0
  725. package/dist/vendor/devkit/defaults-engine.js +372 -0
  726. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  727. package/dist/vendor/devkit/deploy-record.js +180 -0
  728. package/dist/vendor/devkit/deploy.js +286 -0
  729. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  730. package/dist/vendor/devkit/env-watch.js +132 -0
  731. package/dist/vendor/devkit/framework-deps.js +46 -0
  732. package/dist/vendor/devkit/license.js +155 -0
  733. package/dist/vendor/devkit/local.js +1905 -0
  734. package/dist/vendor/devkit/logger.js +128 -0
  735. package/dist/vendor/devkit/merge-line-files.js +296 -0
  736. package/dist/vendor/devkit/npm-registry.js +52 -0
  737. package/dist/vendor/devkit/omega-bin.js +345 -0
  738. package/dist/vendor/devkit/prompt.js +187 -0
  739. package/dist/vendor/devkit/safe-install.js +18 -0
  740. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  741. package/dist/vendor/devkit/stop-signals.js +28 -0
  742. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  743. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  744. package/dist/vendor/devkit/target-dependencies.js +137 -0
  745. package/dist/vendor/devkit/target-secrets.js +165 -0
  746. package/dist/vendor/devkit/test/assert.js +120 -0
  747. package/dist/vendor/devkit/test/define-cases.js +104 -0
  748. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  749. package/dist/vendor/devkit/test/runner-core.js +554 -0
  750. package/dist/vendor/devkit/test/scope.js +162 -0
  751. package/dist/vendor/devkit/update.js +569 -0
  752. package/dist/vendor/monitoring/core.js +180 -0
  753. package/dist/vendor/monitoring/env.js +49 -0
  754. package/dist/vendor/monitoring/index.js +28 -0
  755. package/dist/vendor/monitoring/logger.js +39 -0
  756. package/dist/vendor/monitoring/main.js +99 -0
  757. package/dist/vendor/monitoring/preload.js +45 -0
  758. package/dist/vendor/monitoring/renderer.js +87 -0
  759. package/docs/analytics.md +140 -0
  760. package/docs/app-state.md +92 -0
  761. package/docs/audit.md +69 -0
  762. package/docs/auto-updater.md +243 -0
  763. package/docs/boot-sequence.md +39 -0
  764. package/docs/build-system.md +161 -0
  765. package/docs/cdp-debugging.md +169 -0
  766. package/docs/client-bridge.md +267 -0
  767. package/docs/common-mistakes.md +21 -0
  768. package/docs/config-schema.md +120 -0
  769. package/docs/context-menu.md +112 -0
  770. package/docs/context.md +81 -0
  771. package/docs/css.md +84 -0
  772. package/docs/deep-link.md +178 -0
  773. package/docs/environment-detection.md +104 -0
  774. package/docs/fontawesome.md +107 -0
  775. package/docs/hooks.md +87 -0
  776. package/docs/icons.md +79 -0
  777. package/docs/index.md +279 -0
  778. package/docs/installer-options.md +162 -0
  779. package/docs/ipc.md +61 -0
  780. package/docs/lib-modules.md +53 -0
  781. package/docs/logging.md +229 -0
  782. package/docs/menu.md +160 -0
  783. package/docs/releasing.md +229 -0
  784. package/docs/remote-config.md +118 -0
  785. package/docs/remote-scripts.md +144 -0
  786. package/docs/restart-manager.md +144 -0
  787. package/docs/runner.md +253 -0
  788. package/docs/sentry.md +97 -0
  789. package/docs/shared/agent-docs.md +89 -0
  790. package/docs/shared/analytics.md +612 -0
  791. package/docs/shared/brands.md +51 -0
  792. package/docs/shared/breaking-changes.md +497 -0
  793. package/docs/shared/config.md +1387 -0
  794. package/docs/shared/deploys.md +215 -0
  795. package/docs/shared/icons.md +201 -0
  796. package/docs/shared/local-dev.md +147 -0
  797. package/docs/shared/logging.md +202 -0
  798. package/docs/shared/monitoring.md +153 -0
  799. package/docs/shared/publishing.md +183 -0
  800. package/docs/shared/rulings.md +34 -0
  801. package/docs/shared/testing.md +147 -0
  802. package/docs/shared/theming.md +604 -0
  803. package/docs/shared/translation.md +291 -0
  804. package/docs/shared/updates.md +61 -0
  805. package/docs/signing.md +267 -0
  806. package/docs/startup.md +142 -0
  807. package/docs/storage.md +59 -0
  808. package/docs/templating.md +101 -0
  809. package/docs/test-boot-layer.md +157 -0
  810. package/docs/test-framework.md +357 -0
  811. package/docs/themes.md +135 -0
  812. package/docs/tooltips.md +99 -0
  813. package/docs/tray.md +164 -0
  814. package/docs/usage.md +58 -0
  815. package/docs/verts.md +62 -0
  816. package/docs/windows.md +149 -0
  817. package/package.json +184 -0
  818. package/scripts/sync-nvmrc.js +100 -0
@@ -0,0 +1,687 @@
1
+ // The signing box's OWN configuration: `<runner home>\.env`.
2
+ //
3
+ // The Windows signing runner is a MACHINE, not a brand: the EV token, its PIN,
4
+ // the signtool path, the GitHub token that registers the runner and the orgs it
5
+ // serves all belong to the box. They live in one file beside the install —
6
+ // `%LOCALAPPDATA%\omega-runner\.env` — which `omega runner` and `omega
7
+ // sign-windows` read from whatever directory they run in: this monorepo, a
8
+ // consumer brand, a bare `npm i -g @omega.js/desktop`. No brand's `.env` ever
9
+ // holds the box's PIN ([#337](https://github.com/Omega-JS-Stack/omega/issues/337)).
10
+ //
11
+ // Precedence: a value the shell already carries, or a CI job delivers, WINS over
12
+ // the file (an empty delivered value counts as absent, the same rule
13
+ // sanitize-signing-env applies). The file survives `runner uninstall`: it is
14
+ // configuration, not install state.
15
+ //
16
+ // A required key that is still missing is asked for — in an interactive
17
+ // terminal, through the one prompt wrapper every OMEGA package uses — and the
18
+ // answer is written back to the file. Off a TTY, or when the answer is empty,
19
+ // the command REFUSES, naming the file and the keys: a runner never boots half
20
+ // configured.
21
+ //
22
+ // `install` and `config` run the SAME walk: every key of both scopes, in
23
+ // schema order, each question DEFAULTING to the current value — the file's,
24
+ // else what the shell or CI delivered, else the key's suggestion. A shell
25
+ // value never skips a question (that is how Ian's box registered against an
26
+ // exported org list it was never shown, 2026-09-04). A secret never echoes:
27
+ // an empty answer keeps what is saved.
28
+ //
29
+ // The orgs are the one answer nobody types from memory, so they are PICKED:
30
+ // a checkbox of every org the token administers, ticked to what this box
31
+ // already answered — the saved list, else the orgs it registered, else
32
+ // NOTHING. A token that administers 35 orgs must never register 35 runners
33
+ // on one Enter.
34
+
35
+ const fs = require('fs');
36
+ const os = require('os');
37
+ const path = require('path');
38
+
39
+ // Runner files live under %LOCALAPPDATA%\omega-runner — a per-user path that
40
+ // doesn't need admin to read/write. Set OMEGA_RUNNER_HOME to override.
41
+ function defaultRunnerHome(platform, env) {
42
+ platform = platform || process.platform;
43
+ env = env || process.env;
44
+ if (platform === 'win32') {
45
+ const localAppData = env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
46
+ return path.join(localAppData, 'omega-runner');
47
+ }
48
+ return path.join(process.cwd(), '.gh-runners');
49
+ }
50
+
51
+ function runnerEnvFile(home) {
52
+ return path.join(home, '.env');
53
+ }
54
+
55
+ // The env schema (@omega.js/config) owns each key's secrecy and its one-line
56
+ // meaning; the runner adds what is required HERE and how to ask for it. The
57
+ // two runner-only keys (the org list, the timestamp server) are not delivery
58
+ // keys of any target, so they carry their own text.
59
+ function schemaEntry(name) {
60
+ try {
61
+ return require('../vendor/config/env-schema.js').ENV_SCHEMA.find((e) => e.name === name) || null;
62
+ } catch (e) {
63
+ return null;
64
+ }
65
+ }
66
+
67
+ const RUNNER_ENV_SCHEMA = [
68
+ {
69
+ key: 'GH_TOKEN',
70
+ required: true,
71
+ secret: true,
72
+ scope: 'runner',
73
+ prompt: 'GitHub classic PAT (repo + workflow + admin:org) that registers this box as a runner',
74
+ comment: 'GitHub classic PAT with repo + workflow + admin:org (registers the runner).',
75
+ },
76
+ {
77
+ key: 'OMEGA_RUNNER_ORGS',
78
+ required: false,
79
+ secret: false,
80
+ scope: 'runner',
81
+ prompt: 'Orgs to register against, comma-separated (empty = EVERY org the token administers)',
82
+ comment: 'Orgs to register against, comma-separated. Empty = every org the token administers.',
83
+ },
84
+ {
85
+ key: 'WIN_EV_TOKEN_PATH',
86
+ required: true,
87
+ secret: false,
88
+ scope: 'signing',
89
+ prompt: 'EV cert: SHA1 thumbprint (SafeNet/eToken) or path to a .pfx',
90
+ comment: 'The EV cert: its SHA1 thumbprint (SafeNet/eToken) or a path to a .pfx.',
91
+ },
92
+ {
93
+ key: 'WIN_CSC_KEY_PASSWORD',
94
+ required: true,
95
+ secret: true,
96
+ scope: 'signing',
97
+ prompt: 'Token PIN (typed into the SafeNet Token Logon dialog for you)',
98
+ comment: 'The token PIN — typed into the SafeNet Token Logon dialog for you.',
99
+ },
100
+ {
101
+ key: 'SIGNTOOL_PATH',
102
+ required: true,
103
+ secret: false,
104
+ scope: 'signing',
105
+ prompt: 'Full path to signtool.exe',
106
+ comment: 'Full path to signtool.exe (Windows SDK / VS Build Tools).',
107
+ suggest: () => detectSigntool(),
108
+ },
109
+ {
110
+ key: 'WIN_TIMESTAMP_URL',
111
+ required: false,
112
+ secret: false,
113
+ scope: 'signing',
114
+ prompt: 'RFC 3161 timestamp server',
115
+ comment: 'RFC 3161 timestamp server. Default: http://timestamp.sectigo.com',
116
+ optionalComment: true,
117
+ },
118
+ ].map((entry) => {
119
+ const schema = schemaEntry(entry.key);
120
+ return { ...entry, secret: schema ? schema.secret : entry.secret, description: schema?.description || entry.comment };
121
+ });
122
+
123
+ const RUNNER_ENV_KEYS = RUNNER_ENV_SCHEMA.map((e) => e.key);
124
+
125
+ // The file `runner install` lays down when the box has none yet.
126
+ const RUNNER_ENV_TEMPLATE = [
127
+ '# omega-runner — THIS BOX\'s signing configuration. Never a brand\'s .env.',
128
+ '# Read by `omega runner` and `omega sign-windows` from any directory. A value',
129
+ '# already set in the shell, or delivered by a CI job, wins over this file.',
130
+ '# Survives `omega runner uninstall`. A missing required key is asked for.',
131
+ '',
132
+ ...RUNNER_ENV_SCHEMA.flatMap((e) => [`# ${e.comment}`, `${e.optionalComment ? '# ' : ''}${e.key}=""`]),
133
+ '',
134
+ ].join('\n');
135
+
136
+ function isBlank(value) {
137
+ return value === undefined || value === null || String(value).trim() === '';
138
+ }
139
+
140
+ // The ONE reading of OMEGA_RUNNER_ORGS — comma or space separated — shared by
141
+ // the question, install's filter and the drift check, so the three can never
142
+ // disagree about what the key says.
143
+ function parseRunnerOrgs(value) {
144
+ return String(value || '').split(/[\s,]+/).map((s) => s.trim()).filter(Boolean);
145
+ }
146
+
147
+ // Two org lists naming the same orgs. GitHub org names are case-insensitive,
148
+ // and the order a checkbox returns is not meaningful.
149
+ function sameRunnerOrgs(a, b) {
150
+ const set = (list) => new Set((list || []).map((o) => String(o).toLowerCase()));
151
+ const [x, y] = [set(a), set(b)];
152
+ return x.size === y.size && [...x].every((o) => y.has(o));
153
+ }
154
+
155
+ // The newest signtool.exe the Windows SDK installed, or null. Only a SUGGESTION
156
+ // for the prompt — the file names the one the box uses.
157
+ function detectSigntool(env) {
158
+ env = env || process.env;
159
+ if (process.platform !== 'win32') return null;
160
+ const root = path.join(env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)', 'Windows Kits', '10', 'bin');
161
+ let versions;
162
+ try {
163
+ versions = fs.readdirSync(root).filter((name) => /^\d+(\.\d+)+$/.test(name));
164
+ } catch (e) {
165
+ return null;
166
+ }
167
+ const byVersion = (a, b) => {
168
+ const pa = a.split('.').map(Number);
169
+ const pb = b.split('.').map(Number);
170
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
171
+ if ((pa[i] || 0) !== (pb[i] || 0)) return (pb[i] || 0) - (pa[i] || 0);
172
+ }
173
+ return 0;
174
+ };
175
+ for (const version of versions.sort(byVersion)) {
176
+ const candidate = path.join(root, version, 'x64', 'signtool.exe');
177
+ if (fs.existsSync(candidate)) return candidate;
178
+ }
179
+ return null;
180
+ }
181
+
182
+ // Read the file into `env` (process.env by default) — only keys the environment
183
+ // does not already carry a value for, and only non-empty values from the file.
184
+ // Returns what happened, so callers can say which file was read and what it set.
185
+ function loadRunnerEnv(options) {
186
+ const { home, env = process.env, platform } = options || {};
187
+ const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(platform, env);
188
+ const file = runnerEnvFile(root);
189
+
190
+ let raw;
191
+ try {
192
+ raw = fs.readFileSync(file, 'utf8');
193
+ } catch (e) {
194
+ return { file, present: false, applied: [], skipped: [] };
195
+ }
196
+
197
+ const parsed = require('dotenv').parse(raw);
198
+ const applied = [];
199
+ const skipped = [];
200
+ for (const [key, value] of Object.entries(parsed)) {
201
+ if (isBlank(value)) continue;
202
+ if (!isBlank(env[key])) { skipped.push(key); continue; } // shell / CI wins
203
+ env[key] = value;
204
+ applied.push(key);
205
+ }
206
+ return { file, present: true, applied, skipped };
207
+ }
208
+
209
+ // The file's OWN values, whatever the environment carries. The walk defaults
210
+ // each question to what the BOX saved, not to what this shell exported, so it
211
+ // needs the file read apart from the merge loadRunnerEnv does. Same reader
212
+ // (dotenv) either way — quoting lives in one place.
213
+ function readRunnerEnvValues(home) {
214
+ try {
215
+ return require('dotenv').parse(fs.readFileSync(runnerEnvFile(home), 'utf8'));
216
+ } catch (e) {
217
+ return {};
218
+ }
219
+ }
220
+
221
+ // Where the box records what its runner commands did — beside the install, not
222
+ // in whatever directory the command was typed in.
223
+ function runnerLogFile(home) {
224
+ return path.join(home, 'logs', 'runner.log');
225
+ }
226
+
227
+ // Is this process a TEST run? `OMEGA_TEST_RUNNER` is set by `omega test` for the
228
+ // whole run (and inherited by the electron/boot children); `OMEGA_TEST_MODE` is
229
+ // the canonical signal those children already carried. Either one means: no
230
+ // command here may touch the machine's real runner home.
231
+ //
232
+ // It reads process.env, ALWAYS, and takes no environment argument. An injected
233
+ // env is a fixture for the config walk — a case that passed `{}` would be
234
+ // handing the safety check an environment with no marker in it and disarming
235
+ // the very guard that exists because a case did something like that.
236
+ function isTestRun() {
237
+ return process.env.OMEGA_TEST_RUNNER === '1' || process.env.OMEGA_TEST_MODE === 'true';
238
+ }
239
+
240
+ // A home a test is allowed to act on: a `.temp` directory (the desktop suites'
241
+ // per-run scratch) or one under the OS temp dir (`mkdtemp`, what most cases use).
242
+ // Neither can ever be `%LOCALAPPDATA%\omega-runner`.
243
+ //
244
+ // A path rule, not a home rule: `assertTestSafeRunnerHome` asks it about the
245
+ // Startup folder too, and the same two shapes are the safe answer there.
246
+ function isScratchRunnerHome(home) {
247
+ const resolved = path.resolve(String(home || ''));
248
+ if (resolved.split(path.sep).includes('.temp')) return true;
249
+ return safeRealpath(resolved).startsWith(`${safeRealpath(os.tmpdir())}${path.sep}`);
250
+ }
251
+
252
+ // realpath so /var/folders/… and its /private/var/… twin (macOS) compare equal;
253
+ // a path that does not exist yet answers as itself.
254
+ function safeRealpath(target) {
255
+ try {
256
+ return fs.realpathSync(target);
257
+ } catch (e) {
258
+ return path.resolve(target);
259
+ }
260
+ }
261
+
262
+ // The refusal that makes 2026-09-04 impossible to repeat: a test process asked a
263
+ // MUTATING box command to act on a surface that is not a scratch. It happened —
264
+ // `runner install` from the suite, with no home of its own, tore the signing
265
+ // box's runner down and registered 34 orgs — so this is a hard stop, not a warn.
266
+ //
267
+ // EVERY surface the command could reach is checked, and the refusal names the
268
+ // one that is real. There are THREE:
269
+ // 1. the passed `_home`,
270
+ // 2. the module-level `RUNNER_HOME` — every subcommand honours a passed
271
+ // `_home` now, but the command module's `loadRunnerEnv({ home: RUNNER_HOME })`
272
+ // runs at REQUIRE time, so a process whose RUNNER_HOME is the box's already
273
+ // has the box's token and PIN in its environment and a scratch `_home`
274
+ // alone proves nothing,
275
+ // 3. the Startup folder (`STARTUP_DIR`) — added after the SECOND incident,
276
+ // 2026-09-04: the round-4 `uninstall` case ran with both homes scratch, and
277
+ // `uninstall` swept the REAL Startup folder anyway, deleting the box's three
278
+ // `omega-runner-*.cmd` shortcuts. A home scopes nothing machine-wide, so the
279
+ // folder needs its own scratch seam (`OMEGA_RUNNER_STARTUP_DIR`) and its own
280
+ // place in this check.
281
+ //
282
+ // It is checked before the platform gate: "a test may not touch this machine"
283
+ // is true on every platform, and the box is the one machine where the platform
284
+ // gate would have let it through.
285
+ //
286
+ // @param {string} verb - The subcommand, for the message.
287
+ // @param {...string} surfaces - Every home + Startup folder this run could act on.
288
+ function assertTestSafeRunnerHome(verb, ...surfaces) {
289
+ if (!isTestRun()) return;
290
+
291
+ const offender = surfaces.filter(Boolean).find((surface) => !isScratchRunnerHome(surface));
292
+ if (!offender) return;
293
+
294
+ throw new Error(
295
+ `Refusing \`runner ${verb}\` against ${offender}: this process is a test run (OMEGA_TEST_RUNNER / OMEGA_TEST_MODE), `
296
+ + 'and a test may only act on scratch surfaces — the runner home AND the Startup folder, each under a `.temp` directory or the OS temp dir. '
297
+ + 'Point OMEGA_RUNNER_HOME and OMEGA_RUNNER_STARTUP_DIR at scratch ones before the command module is required.',
298
+ );
299
+ }
300
+
301
+ // Lay the template down when the box has no file yet. Returns true when written.
302
+ function ensureRunnerEnvFile(home) {
303
+ const file = runnerEnvFile(home);
304
+ if (fs.existsSync(file)) return false;
305
+ fs.mkdirSync(home, { recursive: true });
306
+ fs.writeFileSync(file, RUNNER_ENV_TEMPLATE);
307
+ return true;
308
+ }
309
+
310
+ // Write values into the file IN PLACE: an existing `KEY=` line (commented or
311
+ // not) is replaced, a key the file never had is appended. Comments and order
312
+ // survive, so the file stays the one a person reads.
313
+ function writeRunnerEnvValues(home, values) {
314
+ // Every value double-quoted, the one .env quoting rule this repo writes
315
+ // everywhere. dotenv reads a double-quoted value back verbatim and has no
316
+ // escape for a `"` inside one, so a value carrying one cannot be written at
317
+ // all: refuse it — naming the key and the character — before the file is
318
+ // touched, rather than save a value that reads back wrong.
319
+ const serialize = (key, value) => `${key}="${value}"`;
320
+ for (const [key, value] of Object.entries(values)) {
321
+ if (String(value).includes('"')) {
322
+ throw new Error(`${key} contains a double quote (") — a .env value cannot carry one. Remove it, then set ${key} again.`);
323
+ }
324
+ }
325
+
326
+ ensureRunnerEnvFile(home);
327
+ const file = runnerEnvFile(home);
328
+ const lines = fs.readFileSync(file, 'utf8').split(/\r?\n/);
329
+ const seen = new Set();
330
+
331
+ const out = lines.map((line) => {
332
+ const m = /^\s*#?\s*([A-Z][A-Z0-9_]*)\s*=/.exec(line);
333
+ if (!m || !(m[1] in values) || seen.has(m[1])) return line;
334
+ seen.add(m[1]);
335
+ return serialize(m[1], String(values[m[1]]));
336
+ });
337
+ for (const [key, value] of Object.entries(values)) {
338
+ if (!seen.has(key)) out.push(serialize(key, String(value)));
339
+ }
340
+ fs.writeFileSync(file, out.join('\n').replace(/\n*$/, '\n'));
341
+ return file;
342
+ }
343
+
344
+ // ─── the runner's private HOME (#807) ───────────────────────────────────────────
345
+ //
346
+ // `actions/checkout` copies `path.join(process.env.HOME || os.homedir(),
347
+ // '.gitconfig')` into the temporary HOME it runs git under, with `@actions/io`,
348
+ // which recreates a SYMLINK source as a Windows JUNCTION. A junction to a FILE
349
+ // is invalid, so on a box whose `~/.gitconfig` is a symlink (dotfiles, and it
350
+ // must stay one) the copied file is unreadable and every git call in the job
351
+ // dies on "unknown error occurred while reading the configuration files".
352
+ //
353
+ // HOME wins in that lookup, so the runner is given a home of its OWN, inside
354
+ // RUNNER_HOME, holding a real `.gitconfig`. Nothing outside RUNNER_HOME is
355
+ // touched and the user's dotfiles symlink is left exactly as it is.
356
+ function runnerPrivateHome(home) {
357
+ return path.join(home, 'home');
358
+ }
359
+
360
+ // The one setting the workflows rely on, and the only one this file carries:
361
+ // checkouts must not rewrite line endings on the way in.
362
+ const RUNNER_PRIVATE_GITCONFIG = '[core]\n\tautocrlf = false\n';
363
+
364
+ // Create the private home and its `.gitconfig`. A file that is already there
365
+ // with different content is KEPT and named in a log line: a person may have
366
+ // edited it on the box, and delivering one setting is never worth overwriting
367
+ // someone's file. Returns the home, the file, and whether it was written.
368
+ function ensureRunnerPrivateHome(home, options) {
369
+ const { logger } = options || {};
370
+ const root = runnerPrivateHome(home);
371
+ const file = path.join(root, '.gitconfig');
372
+ fs.mkdirSync(root, { recursive: true });
373
+
374
+ let existing;
375
+ try {
376
+ existing = fs.readFileSync(file, 'utf8');
377
+ } catch (e) {
378
+ fs.writeFileSync(file, RUNNER_PRIVATE_GITCONFIG);
379
+ return { home: root, file, written: true };
380
+ }
381
+
382
+ if (existing !== RUNNER_PRIVATE_GITCONFIG && logger) {
383
+ logger.log(`Kept ${file} as it is: it is not the file this command writes, so it is someone's own. Add \`[core] autocrlf = false\` to it by hand if a checkout ever rewrites line endings.`);
384
+ }
385
+ return { home: root, file, written: false };
386
+ }
387
+
388
+ // The runner's OWN environment file, `<runner dir>\.env`: the file GitHub
389
+ // documents for proxy settings, one `KEY=value` per line, which the listener
390
+ // reads at startup and applies to every job it runs. One write therefore
391
+ // reaches the detached spawn and the Startup shortcut alike.
392
+ //
393
+ // The value is written BARE, not in the double-quoted form the box's own `.env`
394
+ // uses: the listener takes the rest of the line verbatim, so quotes would end
395
+ // up inside the value. An existing `KEY=` line is rewritten in place and every
396
+ // other line survives, in the endings the file already uses (LF for a new one),
397
+ // so running it twice is running it once.
398
+ function ensureRunnerDirEnv(runnerDir, values) {
399
+ const file = path.join(runnerDir, '.env');
400
+
401
+ let raw;
402
+ try {
403
+ raw = fs.readFileSync(file, 'utf8');
404
+ } catch (e) {
405
+ raw = '';
406
+ }
407
+
408
+ const newline = raw.includes('\r\n') ? '\r\n' : '\n';
409
+ const seen = new Set();
410
+ // The file's REAL lines. An empty file has none at all (splitting one yields
411
+ // a single empty string, which would push the first key onto a second line),
412
+ // and a written file ends with a newline, whose trailing empty element an
413
+ // append would land below: a blank line before the new key, one more on
414
+ // every rewrite. The terminator is put back by the write below.
415
+ const lines = raw === '' ? [] : raw.split(/\r?\n/);
416
+ if (lines[lines.length - 1] === '') lines.pop();
417
+
418
+ const out = lines.map((line) => {
419
+ const m = /^([A-Za-z_][A-Za-z0-9_]*)=/.exec(line);
420
+ if (!m || !(m[1] in values) || seen.has(m[1])) return line;
421
+ seen.add(m[1]);
422
+ return `${m[1]}=${values[m[1]]}`;
423
+ });
424
+ for (const [key, value] of Object.entries(values)) {
425
+ if (!seen.has(key)) out.push(`${key}=${value}`);
426
+ }
427
+
428
+ fs.mkdirSync(runnerDir, { recursive: true });
429
+ fs.writeFileSync(file, out.join(newline).replace(/(\r?\n)*$/, newline));
430
+ return file;
431
+ }
432
+
433
+ // Which of the box's keys currently carry a value — names only, never values.
434
+ function runnerEnvReport(env) {
435
+ env = env || process.env;
436
+ return RUNNER_ENV_SCHEMA.map(({ key, required, scope }) => ({ key, required, scope, set: !isBlank(env[key]) }));
437
+ }
438
+
439
+ // The ONE refusal a half-configured box gets, wherever it is caught: the keys,
440
+ // the file to fill them in, and whether there was a terminal to ask in.
441
+ function missingKeysError(keys, file, isTTY) {
442
+ const one = keys.length === 1;
443
+ const noTTY = isTTY ? '' : ' (no terminal to ask in)';
444
+ return new Error(
445
+ `${keys.join(', ')} ${one ? 'is' : 'are'} not set. Fill ${one ? 'it' : 'them'} in ${file}${noTTY} — the runner does not start half configured.`,
446
+ );
447
+ }
448
+
449
+ // Make sure every required key of `scopes` has a value, asking for the missing
450
+ // ones in an interactive terminal and writing the answers to the file. Throws
451
+ // — naming the file and the keys — when any is still missing afterwards, so no
452
+ // caller ever runs half configured.
453
+ //
454
+ // This is the step for the commands that only need the box to WORK — `start`,
455
+ // `register-org`, `sign-windows`. The commands that CONFIGURE it (`install`,
456
+ // `config`) run reconfigureRunnerEnv below, which asks for everything.
457
+ //
458
+ // `prompt` and `interactive` are injected by the tests; the real ones are the
459
+ // devkit prompt wrapper (input / password) and its TTY check.
460
+ async function ensureRunnerConfig(options) {
461
+ const {
462
+ home,
463
+ env = process.env,
464
+ scopes = ['runner', 'signing'],
465
+ logger,
466
+ interactive,
467
+ prompt,
468
+ } = options || {};
469
+ const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(undefined, env);
470
+ const file = runnerEnvFile(root);
471
+
472
+ if (ensureRunnerEnvFile(root) && logger) {
473
+ logger.log(`Wrote ${file} — this box's signing configuration. It survives uninstall.`);
474
+ }
475
+ loadRunnerEnv({ home: root, env });
476
+
477
+ const wanted = RUNNER_ENV_SCHEMA.filter((e) => scopes.includes(e.scope));
478
+ const missing = () => wanted.filter((e) => e.required && isBlank(env[e.key]));
479
+
480
+ const prompts = prompt || require('../vendor/devkit/prompt.js');
481
+ const isTTY = interactive === undefined ? prompts.isInteractive() : interactive;
482
+ const asked = [];
483
+
484
+ if (isTTY && missing().length > 0) {
485
+ if (logger) logger.log(`This box's signing configuration (${file}) is missing ${missing().map((e) => e.key).join(', ')} — asking now. Answers are saved to that file.`);
486
+ const answers = {};
487
+ for (const entry of wanted) {
488
+ if (!entry.required || !isBlank(env[entry.key])) continue;
489
+ const suggestion = entry.suggest ? entry.suggest() : undefined;
490
+ const message = `${entry.key} — ${entry.prompt}:`;
491
+ const validate = (v) => (isBlank(v) ? `${entry.key} is required` : true);
492
+ const answer = entry.secret
493
+ ? await prompts.password({ message, mask: '*', validate })
494
+ : await prompts.input({ message, default: suggestion || undefined, validate });
495
+ const value = String(answer || '').trim();
496
+ if (isBlank(value)) continue;
497
+ answers[entry.key] = value;
498
+ env[entry.key] = value;
499
+ asked.push(entry.key);
500
+ }
501
+ if (asked.length > 0) writeRunnerEnvValues(root, answers);
502
+ }
503
+
504
+ const still = missing();
505
+ if (still.length > 0) throw missingKeysError(still.map((e) => e.key), file, isTTY);
506
+
507
+ return { file, asked };
508
+ }
509
+
510
+ // The orgs question itself: a checkbox of every org the token administers,
511
+ // ticked to what this box already answered — the saved list, else the orgs it
512
+ // registered, else nothing. Nothing ticked by default is the point: a token
513
+ // that administers 35 orgs would otherwise register 35 runners on one Enter.
514
+ // Zero chosen is still refused — a runner registered against no org signs
515
+ // nothing. A token that administers nothing gets one warn line and no
516
+ // question. Returns `{ admin, chosen }` — the walk the caller can reuse, and
517
+ // the picked orgs (null when nothing was asked).
518
+ async function askRunnerOrgs(options) {
519
+ const { current = [], prompts, logger, discoverOrgs } = options || {};
520
+ // Asking without a way to LIST them is a wiring bug, never a runtime case:
521
+ // the octokit call lives in runner.js, so every asking caller passes it in.
522
+ if (typeof discoverOrgs !== 'function') {
523
+ throw new Error('The orgs question needs a discoverOrgs function — the caller wires it (runner.js passes discoverAdminOrgs).');
524
+ }
525
+ const admin = await discoverOrgs();
526
+ if (admin.length === 0) {
527
+ if (logger) logger.warn('GH_TOKEN administers no orgs — skipping the OMEGA_RUNNER_ORGS question. Fix the token\'s admin:org scope, then run `npx omega runner config`.');
528
+ return { admin, chosen: null };
529
+ }
530
+ const ticked = new Set(current.map((o) => String(o).toLowerCase()));
531
+
532
+ // An org this box already answered for that the token cannot admin any more
533
+ // never appears in the list below, so say why it is gone before it silently
534
+ // disappears: admin lost, the org renamed, or a different token in the shell.
535
+ const adminSet = new Set(admin.map((o) => o.toLowerCase()));
536
+ const dropped = current.filter((o) => !adminSet.has(String(o).toLowerCase()));
537
+ if (dropped.length > 0 && logger) {
538
+ logger.warn(`Not offered below: ${dropped.join(', ')} — this GH_TOKEN no longer administers ${dropped.length === 1 ? 'it' : 'them'} (admin lost, or the org was renamed).`);
539
+ }
540
+
541
+ const chosen = await prompts.checkbox({
542
+ message: 'OMEGA_RUNNER_ORGS — which orgs does this box sign for? (space toggles, Enter confirms)',
543
+ // Alphabetical, case-insensitively: GitHub returns membership order, which
544
+ // is no order at all when scanning 35 names for the three you want.
545
+ choices: [...admin]
546
+ .sort((a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' }))
547
+ .map((org) => ({ name: org, value: org, checked: ticked.has(org.toLowerCase()) })),
548
+ });
549
+ if (!chosen || chosen.length === 0) {
550
+ throw new Error('OMEGA_RUNNER_ORGS: pick at least one org — a runner registered against nothing is not a runner.');
551
+ }
552
+ return { admin, chosen };
553
+ }
554
+
555
+ // The walk `install` and `config` share: the whole file, asked. Every key of
556
+ // both scopes in schema order, each question defaulting to the CURRENT value —
557
+ // the file's, else what the shell or CI delivered, else the key's suggestion —
558
+ // then the orgs checkbox. An empty answer KEEPS that current value (which is
559
+ // how a saved secret survives a walk it never echoes, and how a shell-only
560
+ // value gets written into the file); every key the walk ends with a value for
561
+ // is written, kept or typed, and it is written before the orgs question, which
562
+ // can refuse.
563
+ //
564
+ // Off a TTY nothing can be asked: `config` exists only to ask, so it says so
565
+ // (`requireTerminal`); install's walk falls back to the same required-key
566
+ // check every other command makes, so a CI box that carries its values in the
567
+ // shell still installs.
568
+ async function reconfigureRunnerEnv(options) {
569
+ const {
570
+ home,
571
+ env = process.env,
572
+ logger,
573
+ interactive,
574
+ prompt,
575
+ discoverOrgs,
576
+ registeredOrgs = [],
577
+ requireTerminal = false,
578
+ } = options || {};
579
+ const root = home || env.OMEGA_RUNNER_HOME || defaultRunnerHome(undefined, env);
580
+ const file = runnerEnvFile(root);
581
+
582
+ if (ensureRunnerEnvFile(root) && logger) {
583
+ logger.log(`Wrote ${file} — this box's signing configuration. It survives uninstall.`);
584
+ }
585
+ loadRunnerEnv({ home: root, env });
586
+ const saved = readRunnerEnvValues(root);
587
+
588
+ const prompts = prompt || require('../vendor/devkit/prompt.js');
589
+ const isTTY = interactive === undefined ? prompts.isInteractive() : interactive;
590
+
591
+ if (!isTTY) {
592
+ if (requireTerminal) {
593
+ throw new Error(`No terminal to ask in — edit ${file} directly, or run \`npx omega runner config\` in an interactive terminal.`);
594
+ }
595
+ const missing = RUNNER_ENV_SCHEMA.filter((e) => e.required && isBlank(env[e.key]));
596
+ if (missing.length > 0) throw missingKeysError(missing.map((e) => e.key), file, false);
597
+ return { file, answers: [], orgs: null, adminOrgs: null };
598
+ }
599
+
600
+ if (logger) logger.log(`This box's signing configuration (${file}) — every key, with what is saved as the default.`);
601
+
602
+ // What a question DEFAULTS to. The file first: a value the shell exported is
603
+ // this session's, not the box's answer, and taking it as the default is how
604
+ // a brand's token would end up configuring the box.
605
+ const currentOf = (entry) => {
606
+ const value = isBlank(saved[entry.key]) ? env[entry.key] : saved[entry.key];
607
+ return isBlank(value) ? '' : String(value).trim();
608
+ };
609
+
610
+ const answers = {};
611
+ const empty = [];
612
+ for (const entry of RUNNER_ENV_SCHEMA) {
613
+ if (entry.key === 'OMEGA_RUNNER_ORGS') continue; // the checkbox below IS its question
614
+ const current = currentOf(entry);
615
+ const validate = (v) => (current || !entry.required || !isBlank(v) ? true : `${entry.key} is required`);
616
+ const answer = entry.secret
617
+ ? await prompts.password({ message: `${entry.key} — ${entry.prompt}${current ? ' (Enter keeps the current value)' : ''}:`, mask: '*', validate })
618
+ : await prompts.input({ message: `${entry.key} — ${entry.prompt}:`, default: current || (entry.suggest ? entry.suggest() || undefined : undefined), validate });
619
+ let value = String(answer || '').trim();
620
+
621
+ // Enter KEEPS the current value — which is the answer, so it takes the same
622
+ // path a typed one does. That matters for a value only the shell carries:
623
+ // keeping it saves it to the box's file, secret or not (the non-secret
624
+ // prompts already did, by handing their default back).
625
+ if (isBlank(value)) {
626
+ if (!current) {
627
+ if (entry.required) empty.push(entry.key);
628
+ continue;
629
+ }
630
+ value = current;
631
+ }
632
+ env[entry.key] = value;
633
+ answers[entry.key] = value;
634
+ }
635
+
636
+ // Save EVERY answer, the kept ones included, BEFORE anything that can refuse —
637
+ // the required-key check right below, and the orgs question after it (nothing
638
+ // ticked, a token that cannot list, a Ctrl-C). A refusal must never cost the
639
+ // operator the keys they just typed. Writing the kept values too is what
640
+ // brings a file the pre-quoting code wrote up to the rule: the writer
641
+ // serializes `KEY="value"` and is idempotent, so a walk of Enters rewrites
642
+ // every line quoted without changing one value.
643
+ if (Object.keys(answers).length > 0) writeRunnerEnvValues(root, answers);
644
+ if (empty.length > 0) throw missingKeysError(empty, file, true);
645
+
646
+ const savedOrgs = parseRunnerOrgs(saved.OMEGA_RUNNER_ORGS);
647
+ const { admin, chosen } = await askRunnerOrgs({
648
+ current: savedOrgs.length > 0 ? savedOrgs : registeredOrgs,
649
+ prompts,
650
+ logger,
651
+ discoverOrgs,
652
+ });
653
+ if (chosen) {
654
+ const value = chosen.join(',');
655
+ if (value !== (saved.OMEGA_RUNNER_ORGS || '')) {
656
+ answers.OMEGA_RUNNER_ORGS = value;
657
+ writeRunnerEnvValues(root, { OMEGA_RUNNER_ORGS: value });
658
+ }
659
+ env.OMEGA_RUNNER_ORGS = value;
660
+ }
661
+
662
+ return { file, answers: Object.keys(answers), orgs: chosen, adminOrgs: admin };
663
+ }
664
+
665
+ module.exports = {
666
+ defaultRunnerHome,
667
+ runnerEnvFile,
668
+ runnerLogFile,
669
+ isTestRun,
670
+ isScratchRunnerHome,
671
+ assertTestSafeRunnerHome,
672
+ detectSigntool,
673
+ loadRunnerEnv,
674
+ ensureRunnerEnvFile,
675
+ writeRunnerEnvValues,
676
+ runnerPrivateHome,
677
+ ensureRunnerPrivateHome,
678
+ ensureRunnerDirEnv,
679
+ ensureRunnerConfig,
680
+ reconfigureRunnerEnv,
681
+ runnerEnvReport,
682
+ parseRunnerOrgs,
683
+ sameRunnerOrgs,
684
+ RUNNER_ENV_SCHEMA,
685
+ RUNNER_ENV_KEYS,
686
+ RUNNER_ENV_TEMPLATE,
687
+ };