@k2b/cloud 0.6.0-rc.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 (540) hide show
  1. package/README.md +98 -0
  2. package/package.json +128 -0
  3. package/public/logo.svg +1 -0
  4. package/scripts/app-favicon.test.ts +49 -0
  5. package/scripts/app-favicon.ts +51 -0
  6. package/scripts/build.ts +205 -0
  7. package/scripts/preload.ts +164 -0
  8. package/scripts/sync-recovery-smoke.ts +200 -0
  9. package/src/_internal/app-favicon.ts +2 -0
  10. package/src/_internal/app-presentation.ts +61 -0
  11. package/src/_internal/app-workspace-state.ts +24 -0
  12. package/src/_internal/bounded-json.ts +47 -0
  13. package/src/_internal/build-metadata.ts +9 -0
  14. package/src/_internal/capabilities.ts +1118 -0
  15. package/src/_internal/define-app.ts +801 -0
  16. package/src/_internal/heartbeat.ts +167 -0
  17. package/src/_internal/help-catalog.ts +241 -0
  18. package/src/_internal/help.ts +95 -0
  19. package/src/_internal/nats-connection.ts +34 -0
  20. package/src/_internal/page-responses.ts +40 -0
  21. package/src/_internal/process-sync.ts +117 -0
  22. package/src/_internal/readiness.ts +3 -0
  23. package/src/_internal/registry-validation.ts +136 -0
  24. package/src/_internal/registry-watch.ts +52 -0
  25. package/src/_internal/registry.ts +338 -0
  26. package/src/_internal/runtime-compatibility.ts +64 -0
  27. package/src/_internal/runtime-context.ts +84 -0
  28. package/src/_internal/runtime-watcher.ts +78 -0
  29. package/src/_internal/static-assets.ts +86 -0
  30. package/src/_internal/status-preserving-ssr.ts +49 -0
  31. package/src/access/PermissionEditor.tsx +486 -0
  32. package/src/access/ResourceApiKeys.tsx +271 -0
  33. package/src/access/messages.ts +121 -0
  34. package/src/access/ui.ts +16 -0
  35. package/src/account/Avatar.tsx +28 -0
  36. package/src/account/EntitySearch.tsx +363 -0
  37. package/src/account/avatar-upload-dialog.tsx +197 -0
  38. package/src/account/avatar-upload.ts +149 -0
  39. package/src/account/ui.ts +3 -0
  40. package/src/ai/admin.ts +47 -0
  41. package/src/ai/approval-routes.ts +130 -0
  42. package/src/ai/approvals.ts +139 -0
  43. package/src/ai/assistant-models.ts +61 -0
  44. package/src/ai/attachments.ts +40 -0
  45. package/src/ai/browser.ts +92 -0
  46. package/src/ai/capabilities.ts +714 -0
  47. package/src/ai/capability-execution.ts +151 -0
  48. package/src/ai/chat/blocks.render.test.tsx +1108 -0
  49. package/src/ai/chat/blocks.tsx +730 -0
  50. package/src/ai/chat/builtin-tools.tsx +428 -0
  51. package/src/ai/chat/capability-table.tsx +87 -0
  52. package/src/ai/chat/composer-adapter.ts +169 -0
  53. package/src/ai/chat/file-tools.tsx +81 -0
  54. package/src/ai/chat/message-actions.tsx +370 -0
  55. package/src/ai/chat/message-utils.ts +479 -0
  56. package/src/ai/chat/messages.ts +43 -0
  57. package/src/ai/chat/presentation.tsx +395 -0
  58. package/src/ai/chat/primitives.tsx +3 -0
  59. package/src/ai/chat/tool-disclosure.tsx +41 -0
  60. package/src/ai/chat/turn-navigator-utils.ts +28 -0
  61. package/src/ai/chat/turn-navigator.tsx +164 -0
  62. package/src/ai/chat/user-message.tsx +149 -0
  63. package/src/ai/chat/visual-tools.tsx +435 -0
  64. package/src/ai/chat/web-tools.tsx +202 -0
  65. package/src/ai/chat-task-contracts.ts +113 -0
  66. package/src/ai/chat-tasks.ts +952 -0
  67. package/src/ai/client/controller.ts +1211 -0
  68. package/src/ai/client/file-source.ts +95 -0
  69. package/src/ai/client/live-connection.ts +140 -0
  70. package/src/ai/client/projection.ts +178 -0
  71. package/src/ai/client/transport.ts +111 -0
  72. package/src/ai/compaction.ts +182 -0
  73. package/src/ai/credentials.ts +124 -0
  74. package/src/ai/default-tool-contracts.ts +108 -0
  75. package/src/ai/default-tools.ts +127 -0
  76. package/src/ai/enrich.ts +280 -0
  77. package/src/ai/executor.ts +1624 -0
  78. package/src/ai/fetch-file-tool.ts +313 -0
  79. package/src/ai/file-context.ts +92 -0
  80. package/src/ai/file-media-type.ts +28 -0
  81. package/src/ai/file-mount.ts +16 -0
  82. package/src/ai/file-tools.ts +566 -0
  83. package/src/ai/files-store.ts +390 -0
  84. package/src/ai/firecrawl-tools.ts +305 -0
  85. package/src/ai/grids-skill.ts +126 -0
  86. package/src/ai/http.ts +265 -0
  87. package/src/ai/index.ts +337 -0
  88. package/src/ai/kit-skill.ts +22 -0
  89. package/src/ai/limits.ts +5 -0
  90. package/src/ai/live-events.ts +289 -0
  91. package/src/ai/live-messages.ts +45 -0
  92. package/src/ai/live-outbox.ts +102 -0
  93. package/src/ai/live-routes.ts +412 -0
  94. package/src/ai/live.ts +2 -0
  95. package/src/ai/maintenance.ts +302 -0
  96. package/src/ai/markdown-pdf-tool.ts +95 -0
  97. package/src/ai/memories.ts +605 -0
  98. package/src/ai/memory-learning-runs.ts +222 -0
  99. package/src/ai/memory-learning.ts +619 -0
  100. package/src/ai/memory-tool.ts +120 -0
  101. package/src/ai/memory-workflow-evidence.ts +158 -0
  102. package/src/ai/migrate.ts +2082 -0
  103. package/src/ai/model-access-migrate.ts +30 -0
  104. package/src/ai/model-access.ts +191 -0
  105. package/src/ai/personal-agent.ts +6 -0
  106. package/src/ai/prefs.ts +72 -0
  107. package/src/ai/project-tool.ts +94 -0
  108. package/src/ai/projects-routes.ts +277 -0
  109. package/src/ai/projects.ts +902 -0
  110. package/src/ai/protocol.ts +279 -0
  111. package/src/ai/provider.ts +73 -0
  112. package/src/ai/public-projection.ts +25 -0
  113. package/src/ai/resource-markers.ts +31 -0
  114. package/src/ai/resource-refs.ts +70 -0
  115. package/src/ai/routes.ts +1131 -0
  116. package/src/ai/runtime-tools.ts +39 -0
  117. package/src/ai/runtime.ts +544 -0
  118. package/src/ai/settings.ts +529 -0
  119. package/src/ai/short-id.ts +45 -0
  120. package/src/ai/skill-catalog.ts +73 -0
  121. package/src/ai/skill-format.ts +145 -0
  122. package/src/ai/skill-seeds.ts +430 -0
  123. package/src/ai/skill-tool.ts +81 -0
  124. package/src/ai/skills-routes.ts +143 -0
  125. package/src/ai/skills.ts +934 -0
  126. package/src/ai/solid.ts +27 -0
  127. package/src/ai/store.ts +3113 -0
  128. package/src/ai/stream.ts +308 -0
  129. package/src/ai/structured-runs.ts +66 -0
  130. package/src/ai/structured.ts +186 -0
  131. package/src/ai/system-prompt.ts +170 -0
  132. package/src/ai/task-prompt.ts +22 -0
  133. package/src/ai/timeline.ts +148 -0
  134. package/src/ai/tool-audit.ts +177 -0
  135. package/src/ai/tool-result-budget.ts +16 -0
  136. package/src/ai/tools.ts +155 -0
  137. package/src/ai/types.ts +967 -0
  138. package/src/ai/ui.tsx +39 -0
  139. package/src/ai/usage-migrate.ts +81 -0
  140. package/src/ai/usage.ts +315 -0
  141. package/src/ai/validate.ts +54 -0
  142. package/src/ai/vision-tool.ts +79 -0
  143. package/src/api/accounts-entities.ts +174 -0
  144. package/src/api/admin-ai-projects.ts +74 -0
  145. package/src/api/admin-ai-skills.ts +76 -0
  146. package/src/api/admin-ai-usage.ts +42 -0
  147. package/src/api/admin-core-settings.ts +508 -0
  148. package/src/api/admin-identity.ts +148 -0
  149. package/src/api/admin-lifecycle.ts +206 -0
  150. package/src/api/admin-linux-identities.ts +66 -0
  151. package/src/api/announcements.ts +131 -0
  152. package/src/api/app-approval.ts +129 -0
  153. package/src/api/apps.ts +51 -0
  154. package/src/api/auth/schemas.ts +54 -0
  155. package/src/api/auth.ts +370 -0
  156. package/src/api/capabilities.ts +658 -0
  157. package/src/api/help-messages.ts +19 -0
  158. package/src/api/help.ts +78 -0
  159. package/src/api/index.ts +108 -0
  160. package/src/api/mcp.ts +744 -0
  161. package/src/api/me-rail.ts +45 -0
  162. package/src/api/me.ts +753 -0
  163. package/src/api/search/schemas.ts +79 -0
  164. package/src/api/search.bench.ts +185 -0
  165. package/src/api/search.ts +407 -0
  166. package/src/api/sync-ops.ts +79 -0
  167. package/src/api/widgets.ts +143 -0
  168. package/src/browser/CloudResourceSearch.behavior.test.tsx +74 -0
  169. package/src/browser/CloudResourceSearch.tsx +791 -0
  170. package/src/browser/app-approval-vault.ts +305 -0
  171. package/src/browser/app-approval.ts +234 -0
  172. package/src/browser/live-websocket.ts +268 -0
  173. package/src/browser/locale-preference.ts +25 -0
  174. package/src/browser/notification-target.ts +27 -0
  175. package/src/browser/notification-timeout.ts +14 -0
  176. package/src/browser/notifications.ts +181 -0
  177. package/src/browser/resource-clipboard.ts +70 -0
  178. package/src/browser/resource-picker.tsx +39 -0
  179. package/src/browser/resource-search-messages.ts +55 -0
  180. package/src/browser/resource-search.ts +27 -0
  181. package/src/capabilities/client.ts +149 -0
  182. package/src/capabilities/response.ts +39 -0
  183. package/src/capabilities/server.ts +215 -0
  184. package/src/capabilities/signals.ts +4 -0
  185. package/src/capabilities/testing.ts +12 -0
  186. package/src/capabilities/types.ts +32 -0
  187. package/src/cli/access.ts +499 -0
  188. package/src/cli/account.ts +382 -0
  189. package/src/cli/admin/account-administration.ts +45 -0
  190. package/src/cli/admin/account-categories.ts +49 -0
  191. package/src/cli/admin/ai-usage.ts +118 -0
  192. package/src/cli/admin/app-sign-in.ts +49 -0
  193. package/src/cli/admin/data.ts +343 -0
  194. package/src/cli/admin/documentation.ts +34 -0
  195. package/src/cli/admin/gateway.ts +155 -0
  196. package/src/cli/admin/index.ts +61 -0
  197. package/src/cli/admin/instance.ts +250 -0
  198. package/src/cli/admin/jobs.ts +223 -0
  199. package/src/cli/admin/legal.ts +122 -0
  200. package/src/cli/admin/linux.ts +53 -0
  201. package/src/cli/admin/logs.ts +324 -0
  202. package/src/cli/admin/metrics.ts +142 -0
  203. package/src/cli/admin/nats.ts +167 -0
  204. package/src/cli/admin/notifications.ts +516 -0
  205. package/src/cli/admin/shared.ts +113 -0
  206. package/src/cli/admin/sync.ts +188 -0
  207. package/src/cli/admin/telemetry.ts +314 -0
  208. package/src/cli/admin/webhooks.ts +222 -0
  209. package/src/cli/admin/workflows.ts +367 -0
  210. package/src/cli/apps.ts +40 -0
  211. package/src/cli/capabilities.ts +239 -0
  212. package/src/cli/commands.ts +604 -0
  213. package/src/cli/index.ts +61 -0
  214. package/src/cli/locale.ts +31 -0
  215. package/src/cli/output.ts +58 -0
  216. package/src/clients/core.ts +20 -0
  217. package/src/config/env.ts +54 -0
  218. package/src/config/index.ts +6 -0
  219. package/src/contracts/account-categories.ts +62 -0
  220. package/src/contracts/announcements.ts +121 -0
  221. package/src/contracts/app-approval.ts +197 -0
  222. package/src/contracts/app.ts +162 -0
  223. package/src/contracts/capabilities.ts +484 -0
  224. package/src/contracts/index.ts +14 -0
  225. package/src/contracts/notification-live.ts +66 -0
  226. package/src/contracts/notification-types.ts +235 -0
  227. package/src/contracts/posix.ts +69 -0
  228. package/src/contracts/profile.ts +85 -0
  229. package/src/contracts/rail-preferences.ts +53 -0
  230. package/src/contracts/registry.ts +110 -0
  231. package/src/contracts/resource-clipboard.ts +33 -0
  232. package/src/contracts/settings-types.ts +98 -0
  233. package/src/contracts/shared.ts +408 -0
  234. package/src/contracts/user-notifications.ts +101 -0
  235. package/src/contracts/widgets.ts +183 -0
  236. package/src/desktop/index.ts +704 -0
  237. package/src/desktop/solid.tsx +938 -0
  238. package/src/index.ts +58 -0
  239. package/src/server/actor.ts +41 -0
  240. package/src/server/api/index.ts +2 -0
  241. package/src/server/api/respond.ts +96 -0
  242. package/src/server/api-client.ts +54 -0
  243. package/src/server/app-context.ts +39 -0
  244. package/src/server/help.ts +187 -0
  245. package/src/server/index.ts +89 -0
  246. package/src/server/locale.ts +55 -0
  247. package/src/server/middleware/auth.ts +386 -0
  248. package/src/server/middleware/index.ts +28 -0
  249. package/src/server/middleware/invocation.ts +55 -0
  250. package/src/server/middleware/middleware.ts +65 -0
  251. package/src/server/middleware/openapi.ts +126 -0
  252. package/src/server/middleware/rate-limit.ts +125 -0
  253. package/src/server/middleware/request-logger.ts +41 -0
  254. package/src/server/middleware/route-template.ts +46 -0
  255. package/src/server/middleware/runtime.ts +22 -0
  256. package/src/server/middleware/settings.ts +55 -0
  257. package/src/server/middleware/validator.ts +49 -0
  258. package/src/server/middleware/workload.ts +22 -0
  259. package/src/server/ratelimit.ts +151 -0
  260. package/src/server/request-cookies.ts +18 -0
  261. package/src/server/services/access.ts +644 -0
  262. package/src/server/services/freeipa/client.ts +137 -0
  263. package/src/server/services/freeipa/index.ts +9 -0
  264. package/src/server/services/freeipa/session.ts +123 -0
  265. package/src/server/services/freeipa/test-certificates.ts +44 -0
  266. package/src/server/services/freeipa/tls.ts +44 -0
  267. package/src/server/services/freeipa/transport.ts +116 -0
  268. package/src/server/services/freeipa/util.ts +59 -0
  269. package/src/server/services/geo.ts +198 -0
  270. package/src/server/services/index.ts +48 -0
  271. package/src/server/services/pagination.ts +22 -0
  272. package/src/server/services/services.ts +13 -0
  273. package/src/server/time.ts +33 -0
  274. package/src/services/account-category-policy.ts +51 -0
  275. package/src/services/account-lifecycle/audit.ts +41 -0
  276. package/src/services/account-lifecycle/index.ts +940 -0
  277. package/src/services/account-lifecycle/ipa-backfill.ts +152 -0
  278. package/src/services/account-lifecycle/notification-sender.ts +13 -0
  279. package/src/services/account-lifecycle/scheduler.ts +506 -0
  280. package/src/services/account-model.ts +22 -0
  281. package/src/services/accounts/app.ts +1671 -0
  282. package/src/services/accounts/authz.ts +44 -0
  283. package/src/services/accounts/avatar.ts +120 -0
  284. package/src/services/accounts/base-group.ts +11 -0
  285. package/src/services/accounts/base-user.ts +46 -0
  286. package/src/services/accounts/duplicate-emails.ts +82 -0
  287. package/src/services/accounts/entities.ts +622 -0
  288. package/src/services/accounts/group-sql.ts +106 -0
  289. package/src/services/accounts/groups.ts +272 -0
  290. package/src/services/accounts/index.ts +14 -0
  291. package/src/services/accounts/ipa-data.ts +66 -0
  292. package/src/services/accounts/lifecycle.ts +2 -0
  293. package/src/services/accounts/local-groups.ts +499 -0
  294. package/src/services/accounts/model.ts +129 -0
  295. package/src/services/accounts/notification-sender.ts +31 -0
  296. package/src/services/accounts/posix.ts +386 -0
  297. package/src/services/accounts/request-policy.ts +11 -0
  298. package/src/services/accounts/switching.ts +126 -0
  299. package/src/services/accounts/users.ts +745 -0
  300. package/src/services/announcements/index.ts +224 -0
  301. package/src/services/app-approval.ts +498 -0
  302. package/src/services/audit/index.ts +438 -0
  303. package/src/services/auth-flows/index.ts +15 -0
  304. package/src/services/auth-flows/ipa.ts +197 -0
  305. package/src/services/auth-flows/magic-link.ts +185 -0
  306. package/src/services/auth-flows/notification-sender.ts +10 -0
  307. package/src/services/auth-flows/password-reset.ts +268 -0
  308. package/src/services/auth-flows/proxy-return.ts +49 -0
  309. package/src/services/document-extraction.ts +148 -0
  310. package/src/services/freeipa-config.ts +179 -0
  311. package/src/services/gateway.ts +186 -0
  312. package/src/services/identity/constants.ts +18 -0
  313. package/src/services/identity/index.ts +52 -0
  314. package/src/services/identity/invocation-actor.ts +120 -0
  315. package/src/services/identity/invocation-authority.ts +53 -0
  316. package/src/services/identity/invocation-operations.ts +15 -0
  317. package/src/services/identity/invocation-token.ts +276 -0
  318. package/src/services/identity/key-config.ts +41 -0
  319. package/src/services/identity/key-ring.ts +530 -0
  320. package/src/services/identity/metrics.ts +29 -0
  321. package/src/services/identity/routes.ts +18 -0
  322. package/src/services/identity/runtime-config.ts +88 -0
  323. package/src/services/identity/session-token.ts +152 -0
  324. package/src/services/identity/signer-refresh.ts +44 -0
  325. package/src/services/identity/workload-auth.ts +64 -0
  326. package/src/services/index.ts +187 -0
  327. package/src/services/ipa/auth.ts +216 -0
  328. package/src/services/ipa/connection.ts +57 -0
  329. package/src/services/ipa/effective-groups.ts +70 -0
  330. package/src/services/ipa/groups.ts +722 -0
  331. package/src/services/ipa/guard.ts +17 -0
  332. package/src/services/ipa/index.ts +17 -0
  333. package/src/services/ipa/posix.ts +19 -0
  334. package/src/services/ipa/profile.ts +132 -0
  335. package/src/services/ipa/runtime.ts +28 -0
  336. package/src/services/ipa/search.ts +154 -0
  337. package/src/services/ipa/service-account.ts +15 -0
  338. package/src/services/ipa/sync-planning.ts +100 -0
  339. package/src/services/ipa/sync.ts +862 -0
  340. package/src/services/ipa/users.ts +806 -0
  341. package/src/services/legal-consent.ts +76 -0
  342. package/src/services/logging/index.ts +477 -0
  343. package/src/services/logging/redaction.ts +20 -0
  344. package/src/services/logging/trace.ts +1231 -0
  345. package/src/services/mandates/index.ts +855 -0
  346. package/src/services/mandates/policy.ts +85 -0
  347. package/src/services/network-security.ts +31 -0
  348. package/src/services/notifications/batches.ts +722 -0
  349. package/src/services/notifications/browser.ts +252 -0
  350. package/src/services/notifications/catalog.ts +113 -0
  351. package/src/services/notifications/channels.ts +104 -0
  352. package/src/services/notifications/dispatcher.ts +139 -0
  353. package/src/services/notifications/email.ts +118 -0
  354. package/src/services/notifications/index.ts +633 -0
  355. package/src/services/notifications/live.ts +50 -0
  356. package/src/services/notifications/observability.ts +407 -0
  357. package/src/services/notifications/platform.ts +421 -0
  358. package/src/services/notifications/runtime.ts +120 -0
  359. package/src/services/notifications/user.ts +248 -0
  360. package/src/services/notifications/web-push-transport.ts +135 -0
  361. package/src/services/oauth-tokens.ts +209 -0
  362. package/src/services/outbox.ts +187 -0
  363. package/src/services/pdf/gotenberg.ts +290 -0
  364. package/src/services/pdf/index.ts +43 -0
  365. package/src/services/pdf/markdown.ts +209 -0
  366. package/src/services/pdf/template-preview.ts +122 -0
  367. package/src/services/postgres.ts +76 -0
  368. package/src/services/providers/index.ts +27 -0
  369. package/src/services/providers/local/auth.ts +51 -0
  370. package/src/services/providers/local/index.ts +4 -0
  371. package/src/services/providers/local/users.ts +263 -0
  372. package/src/services/rail-preferences.ts +27 -0
  373. package/src/services/runtime-lifecycle.ts +191 -0
  374. package/src/services/secrets.ts +10 -0
  375. package/src/services/service-account-credentials.ts +891 -0
  376. package/src/services/service-accounts.ts +184 -0
  377. package/src/services/session/index.ts +236 -0
  378. package/src/services/session/test-fixture.ts +18 -0
  379. package/src/services/session/user.ts +144 -0
  380. package/src/services/settings/api.ts +61 -0
  381. package/src/services/settings/app.ts +86 -0
  382. package/src/services/settings/core-settings.ts +796 -0
  383. package/src/services/settings/crypto.ts +69 -0
  384. package/src/services/settings/defaults.ts +374 -0
  385. package/src/services/settings/index.ts +215 -0
  386. package/src/services/settings/namespace.ts +9 -0
  387. package/src/services/settings/snapshot.ts +49 -0
  388. package/src/services/settings/store.ts +241 -0
  389. package/src/services/settings/templates.ts +4 -0
  390. package/src/services/sync-ops.ts +403 -0
  391. package/src/services/topic-cursor.ts +22 -0
  392. package/src/services/weather/forecast.ts +323 -0
  393. package/src/services/weather/geo.ts +119 -0
  394. package/src/services/weather/index.ts +67 -0
  395. package/src/services/weather/location.ts +24 -0
  396. package/src/services/weather/locations.ts +133 -0
  397. package/src/services/weather/migrate.ts +45 -0
  398. package/src/services/weather/settings.ts +66 -0
  399. package/src/services/weather/short-id.ts +57 -0
  400. package/src/services/weather/types.ts +61 -0
  401. package/src/services/weather/ui.ts +50 -0
  402. package/src/services/webauthn.ts +385 -0
  403. package/src/shared/account-action-notice.ts +70 -0
  404. package/src/shared/account-display.ts +15 -0
  405. package/src/shared/account-session.ts +15 -0
  406. package/src/shared/ai-platform-prompt.ts +134 -0
  407. package/src/shared/ai-usage.ts +49 -0
  408. package/src/shared/app-presentation.ts +48 -0
  409. package/src/shared/app-url.ts +12 -0
  410. package/src/shared/branding.ts +14 -0
  411. package/src/shared/capability-messages.ts +70 -0
  412. package/src/shared/email-html.ts +54 -0
  413. package/src/shared/format.ts +91 -0
  414. package/src/shared/help.ts +68 -0
  415. package/src/shared/icons.ts +400 -0
  416. package/src/shared/index.ts +54 -0
  417. package/src/shared/locale.ts +48 -0
  418. package/src/shared/login-method.ts +44 -0
  419. package/src/shared/markdown/client.ts +130 -0
  420. package/src/shared/markdown/extensions/code.ts +105 -0
  421. package/src/shared/markdown/extensions/guided-help.ts +100 -0
  422. package/src/shared/markdown/extensions/images.ts +79 -0
  423. package/src/shared/markdown/extensions/info-blocks.ts +97 -0
  424. package/src/shared/markdown/extensions/katex.ts +120 -0
  425. package/src/shared/markdown/extensions/links.ts +43 -0
  426. package/src/shared/markdown/extensions/mark.ts +48 -0
  427. package/src/shared/markdown/extensions/sub-sup.ts +60 -0
  428. package/src/shared/markdown/extensions/tables.ts +109 -0
  429. package/src/shared/markdown/extensions/task-list.ts +53 -0
  430. package/src/shared/markdown/formula.ts +1187 -0
  431. package/src/shared/markdown/index.ts +193 -0
  432. package/src/shared/markdown/shared.ts +36 -0
  433. package/src/shared/mock-cover.ts +130 -0
  434. package/src/shared/network-address.ts +106 -0
  435. package/src/shared/redirect.ts +56 -0
  436. package/src/shared/template-rendering.ts +140 -0
  437. package/src/shared/theme.ts +68 -0
  438. package/src/shared/time.ts +13 -0
  439. package/src/ssr/AdminLayout.tsx +53 -0
  440. package/src/ssr/AdminSidebar.tsx +50 -0
  441. package/src/ssr/AppLaunchpad.island.tsx +236 -0
  442. package/src/ssr/AppWorkspaceController.island.tsx +21 -0
  443. package/src/ssr/BrowserNotifications.island.tsx +135 -0
  444. package/src/ssr/GlobalAnnouncements.island.tsx +142 -0
  445. package/src/ssr/GlobalSearchDialog.behavior.test.tsx +96 -0
  446. package/src/ssr/GlobalSearchDialog.tsx +35 -0
  447. package/src/ssr/GlobalSearchHelpDialog.tsx +104 -0
  448. package/src/ssr/GlobalSearchTrigger.island.tsx +55 -0
  449. package/src/ssr/HotkeysHelpRail.island.tsx +55 -0
  450. package/src/ssr/Layout.render.test.tsx +148 -0
  451. package/src/ssr/Layout.tsx +292 -0
  452. package/src/ssr/LayoutBreadcrumbs.island.tsx +44 -0
  453. package/src/ssr/LayoutFooter.tsx +22 -0
  454. package/src/ssr/LayoutHeader.tsx +81 -0
  455. package/src/ssr/LayoutHelp.tsx +869 -0
  456. package/src/ssr/LayoutPreferences.island.tsx +36 -0
  457. package/src/ssr/LayoutRail.tsx +58 -0
  458. package/src/ssr/MinimalLayout.tsx +46 -0
  459. package/src/ssr/PageError.tsx +29 -0
  460. package/src/ssr/ProfilePreferences.island.tsx +92 -0
  461. package/src/ssr/RailApps.island.tsx +61 -0
  462. package/src/ssr/RailEditor.tsx +293 -0
  463. package/src/ssr/RegisteredHelpDocuments.island.tsx +3 -0
  464. package/src/ssr/TimezoneCookie.island.tsx +23 -0
  465. package/src/ssr/admin-active-link.ts +47 -0
  466. package/src/ssr/admin-navigation.ts +78 -0
  467. package/src/ssr/app-appearance.ts +23 -0
  468. package/src/ssr/app-navigation.ts +41 -0
  469. package/src/ssr/help-messages.ts +104 -0
  470. package/src/ssr/index.ts +14 -0
  471. package/src/ssr/islands/SearchBar.island.tsx +80 -0
  472. package/src/ssr/islands/index.ts +16 -0
  473. package/src/ssr/layout-context.ts +17 -0
  474. package/src/ssr/layout-help-markdown.ts +9 -0
  475. package/src/ssr/layout-help-navigation.ts +24 -0
  476. package/src/ssr/layout-help-url.ts +5 -0
  477. package/src/ssr/layout-runtime.ts +22 -0
  478. package/src/ssr/page-error-messages.ts +25 -0
  479. package/src/ssr/platform-messages.ts +135 -0
  480. package/src/ssr/preference-controller.ts +44 -0
  481. package/src/ssr/profile-preferences-messages.ts +29 -0
  482. package/src/ssr/rail-context.ts +21 -0
  483. package/src/ssr/rail-messages.ts +66 -0
  484. package/src/ssr/rail-navigation.ts +60 -0
  485. package/src/ssr/runtime.ts +31 -0
  486. package/src/ssr/url-filter.ts +127 -0
  487. package/src/styles/base-popover.css +36 -0
  488. package/src/styles/effects.css +851 -0
  489. package/src/styles/global.css +268 -0
  490. package/src/styles/input.css +58 -0
  491. package/src/styles/tokens.css +230 -0
  492. package/src/styles/utilities-buttons.css +405 -0
  493. package/src/styles/utilities-data.css +33 -0
  494. package/src/styles/utilities-feedback.css +232 -0
  495. package/src/styles/utilities-layout.css +603 -0
  496. package/src/styles/utilities-markdown-editor.css +525 -0
  497. package/src/styles/utilities-markdown-table.css +234 -0
  498. package/src/styles/utilities-navigation.css +1054 -0
  499. package/src/types/ambient.d.ts +24 -0
  500. package/src/workflows/ai/index.ts +17 -0
  501. package/src/workflows/ai/runtime.ts +286 -0
  502. package/src/workflows/ai/store.ts +314 -0
  503. package/src/workflows/ai/types.ts +111 -0
  504. package/src/workflows/ai-actions.ts +269 -0
  505. package/src/workflows/authoring.ts +88 -0
  506. package/src/workflows/builtins.ts +193 -0
  507. package/src/workflows/contracts.ts +280 -0
  508. package/src/workflows/definition.ts +334 -0
  509. package/src/workflows/editor.ts +113 -0
  510. package/src/workflows/index.ts +71 -0
  511. package/src/workflows/language/binder.ts +45 -0
  512. package/src/workflows/language/canonical.ts +29 -0
  513. package/src/workflows/language/compiler.ts +396 -0
  514. package/src/workflows/language/expressions.ts +34 -0
  515. package/src/workflows/language/index.ts +20 -0
  516. package/src/workflows/language/references.ts +55 -0
  517. package/src/workflows/language/schema.ts +134 -0
  518. package/src/workflows/language/strict-yaml.ts +131 -0
  519. package/src/workflows/manifest.ts +24 -0
  520. package/src/workflows/module.ts +12 -0
  521. package/src/workflows/runtime/coordinator.ts +115 -0
  522. package/src/workflows/runtime/executor.ts +1003 -0
  523. package/src/workflows/runtime/index.ts +60 -0
  524. package/src/workflows/runtime/instant.ts +8 -0
  525. package/src/workflows/runtime/ports.ts +213 -0
  526. package/src/workflows/runtime/schedule.ts +203 -0
  527. package/src/workflows/runtime/trigger.ts +37 -0
  528. package/src/workflows/runtime/wake.ts +13 -0
  529. package/src/workflows/store/actions.ts +438 -0
  530. package/src/workflows/store/budget.ts +145 -0
  531. package/src/workflows/store/definitions.ts +345 -0
  532. package/src/workflows/store/events.ts +383 -0
  533. package/src/workflows/store/index.ts +107 -0
  534. package/src/workflows/store/observability.ts +594 -0
  535. package/src/workflows/store/runs.ts +975 -0
  536. package/src/workflows/store/transaction.ts +23 -0
  537. package/src/workflows/store/worker.ts +439 -0
  538. package/src/workflows/testing/conformance.ts +72 -0
  539. package/src/workflows/testing/index.ts +11 -0
  540. package/src/workflows/testing/process-fixtures.ts +275 -0
@@ -0,0 +1,525 @@
1
+ /* Markdown editor — overtype-style layered textarea + preview.
2
+
3
+ The textarea has `color: transparent` so its glyphs are invisible; only
4
+ the cursor (caret-color) and selection show through. The preview div
5
+ beneath renders the same text with markdown syntax highlighted. Identical
6
+ font / padding / whitespace / wrapping on both layers is REQUIRED for
7
+ the cursor to line up exactly with the visible glyphs in the preview.
8
+
9
+ All glyph-affecting properties on `.md-editor-layer` use `!important` to
10
+ defeat any cascading style that would shift the layers relative to each
11
+ other. No font-size, font-weight, or font-style is ever varied between
12
+ the textarea and inner preview spans — bold uses a text-shadow trick,
13
+ italic uses colour. Any real weight/style change risks glyph-width
14
+ drift even on nominally monospace fonts. */
15
+
16
+ .md-editor {
17
+ --md-editor-hover: var(--ui-field-hover);
18
+ --md-editor-hover-border: var(--ui-field-hover-border);
19
+ position: relative;
20
+ border: 1px solid var(--ui-field-border);
21
+ border-radius: var(--ui-radius-control);
22
+ background: var(--ui-field);
23
+ @apply transition-colors;
24
+ @apply overflow-hidden;
25
+ /* Recessed well — matches the `input` utility (default variant is field-shaped).
26
+ The `paper` variant below overrides this with a card bevel instead. */
27
+ box-shadow: var(--ui-control-recess);
28
+ }
29
+
30
+ .md-editor:hover {
31
+ border-color: var(--md-editor-hover-border, var(--ui-field-hover-border));
32
+ background: var(--md-editor-hover, var(--ui-field-hover));
33
+ }
34
+
35
+ .md-editor:focus-within {
36
+ border-color: var(--ui-field-focus-border);
37
+ background: var(--ui-field-focus);
38
+ box-shadow: var(--ui-focus);
39
+ }
40
+
41
+ .md-editor[data-variant="paper"] {
42
+ border-color: var(--ui-border);
43
+ border-radius: var(--ui-radius-surface);
44
+ background: var(--ui-surface);
45
+ /* Paper variant = a document surface, so it gets the card bevel (raised),
46
+ not the recess of the field variant. */
47
+ box-shadow: var(--ui-shadow-surface);
48
+ }
49
+
50
+ .md-editor[data-variant="paper"]:hover {
51
+ border-color: var(--ui-border);
52
+ background: var(--ui-surface);
53
+ }
54
+
55
+ .md-editor[data-variant="paper"]:focus-within {
56
+ border-color: var(--ui-field-focus-border);
57
+ background: var(--ui-surface);
58
+ box-shadow: var(--ui-shadow-surface), var(--ui-focus);
59
+ }
60
+
61
+ .md-editor[data-variant="paper"] .md-editor-toolbar {
62
+ border-color: var(--ui-border);
63
+ background: var(--ui-surface);
64
+ }
65
+
66
+ .md-editor[data-variant="paper"] .md-editor-tool {
67
+ @apply hover:bg-zinc-100;
68
+ @apply dark:hover:bg-zinc-800;
69
+ }
70
+
71
+ .md-editor[data-disabled="true"] {
72
+ @apply opacity-50 cursor-not-allowed;
73
+ }
74
+
75
+ /* Error state — red border, both unfocused and focused, mirroring how
76
+ the standard `.input` utility would visually signal an error. The
77
+ error MESSAGE itself is rendered separately by `InputWrapper` below
78
+ the editor. */
79
+ .md-editor[data-error="true"],
80
+ .md-editor[data-error="true"]:focus-within {
81
+ @apply border-red-400 dark:border-red-500;
82
+ }
83
+
84
+ /* Toolbar bar above the editor surface */
85
+ .md-editor-toolbar {
86
+ @apply flex items-center gap-0.5 flex-wrap;
87
+ @apply px-1.5 py-1;
88
+ border-bottom: 1px solid var(--ui-divider);
89
+ }
90
+
91
+ .md-editor:focus-within .md-editor-toolbar {
92
+ border-color: var(--ui-divider);
93
+ }
94
+
95
+ .md-editor-tool {
96
+ @apply inline-flex items-center justify-center;
97
+ @apply w-7 h-7 rounded;
98
+ @apply text-zinc-500 dark:text-zinc-400;
99
+ @apply hover:bg-zinc-200 hover:text-zinc-800;
100
+ @apply dark:hover:bg-zinc-700 dark:hover:text-zinc-100;
101
+ @apply transition-colors;
102
+ font-size: 0.95rem;
103
+ }
104
+
105
+ /* Active formatting at the caret — blue tint + faint blue background
106
+ so the active state is unmistakable at a glance, without becoming
107
+ visually loud. Hover on an active button keeps the blue surface
108
+ tone (not the zinc one) so the colour doesn't flicker. */
109
+ .md-editor-tool[aria-pressed="true"] {
110
+ @apply text-blue-600 bg-blue-50;
111
+ @apply dark:text-blue-400 dark:bg-blue-950/40;
112
+ }
113
+
114
+ .md-editor-tool[aria-pressed="true"]:hover {
115
+ @apply bg-blue-100 text-blue-700;
116
+ @apply dark:bg-blue-900/40 dark:text-blue-300;
117
+ }
118
+
119
+ .md-editor-tool-sep {
120
+ @apply w-px h-4 bg-zinc-300 dark:bg-zinc-600 mx-1;
121
+ }
122
+
123
+ /* The two stacked layers. The wrapper has explicit height (set inline
124
+ via style="--md-h: ...em") so both layers can size to it via 100%. */
125
+ .md-editor-surface {
126
+ position: relative;
127
+ height: var(--md-h, 8rem);
128
+ }
129
+
130
+ /* Fill mode — the editor stretches to its (flex) parent instead of a
131
+ line-count height. Used by IDE-style hosts like the file browser. */
132
+ .md-editor[data-fill="true"] {
133
+ height: 100%;
134
+ display: flex;
135
+ flex-direction: column;
136
+ }
137
+
138
+ .md-editor[data-fill="true"] .md-editor-surface {
139
+ flex: 1;
140
+ min-height: 0;
141
+ height: auto;
142
+ }
143
+
144
+ .md-editor-layer {
145
+ /* These properties MUST be identical on textarea and preview.
146
+ `!important` because user-agent textarea defaults + any stray rule
147
+ could otherwise shift one layer relative to the other.
148
+
149
+ Bold + italic are NOT done via font-weight / font-style on this
150
+ layer — see the rules further down. We rely on text-shadow for
151
+ fake-bold and colour-only for italic so the glyph advance widths
152
+ stay identical between the textarea and the preview. */
153
+ position: absolute !important;
154
+ inset: 0 !important;
155
+ display: block !important;
156
+
157
+ /* Typography — identical glyph metrics on both layers.
158
+ Every property here is locked down so the textarea and preview
159
+ can never disagree on glyph advance widths. The four critical
160
+ subtleties:
161
+ 1. `font-synthesis: none` — only-loaded weights (400/500/600
162
+ for IBM Plex Mono) get used. Asking for 700 would synthesise
163
+ a faux-bold, and synthesised bold does NOT preserve mono
164
+ glyph widths.
165
+ 2. `font-variant-ligatures: none` + `font-feature-settings`
166
+ disable ligatures (`==` → `≡` etc.) and contextual
167
+ alternates. Both reshape glyph runs and break alignment.
168
+ 3. `letter-spacing: 0` (NOT `normal`) — `normal` lets the font
169
+ decide and some shells inject a fractional value.
170
+ 4. `text-rendering: geometricPrecision` — disables kerning so
171
+ even non-monospace fallback fonts don't shift glyph X
172
+ positions across layers. */
173
+ /* IBM Plex Mono is shipped via `/public/fonts.css` (regular + italic +
174
+ 500 + 600 weights). Pinning the font here means the
175
+ editor looks identical across OSes and we control the italic
176
+ variant precisely. The bold/heading "weight" is faked via
177
+ text-shadow further down so we never actually request a weight
178
+ the loaded font lacks. The trailing `monospace` is a last-ditch
179
+ fallback if Plex Mono ever fails to load. */
180
+ font-family: "IBM Plex Mono", monospace !important;
181
+ font-size: 0.875rem !important; /* 14px */
182
+ line-height: 1.55 !important;
183
+ font-weight: 400 !important;
184
+ font-style: normal !important;
185
+ font-variant: normal !important;
186
+ font-variant-ligatures: none !important;
187
+ font-variant-numeric: tabular-nums !important;
188
+ font-variant-position: normal !important;
189
+ font-stretch: normal !important;
190
+ font-kerning: none !important;
191
+ font-synthesis: none !important;
192
+ -webkit-font-synthesis: none !important;
193
+ font-feature-settings:
194
+ "liga" 0,
195
+ "clig" 0,
196
+ "calt" 0 !important;
197
+ font-variation-settings: normal !important;
198
+ font-optical-sizing: none !important;
199
+ letter-spacing: 0 !important;
200
+ word-spacing: 0 !important;
201
+ text-align: left !important;
202
+ text-indent: 0 !important;
203
+ text-transform: none !important;
204
+ text-rendering: geometricPrecision !important;
205
+
206
+ /* Box model */
207
+ padding: 0.625rem 0.75rem !important;
208
+ margin: 0 !important;
209
+ border: 0 !important;
210
+ outline: 0 !important;
211
+ box-sizing: border-box !important;
212
+
213
+ /* Whitespace + wrapping — must agree on every char position */
214
+ white-space: pre-wrap !important;
215
+ word-wrap: break-word !important;
216
+ word-break: normal !important;
217
+ overflow-wrap: break-word !important;
218
+ tab-size: 2 !important;
219
+ -moz-tab-size: 2 !important;
220
+
221
+ /* Sizing */
222
+ width: 100% !important;
223
+ height: 100% !important;
224
+ min-height: 0 !important;
225
+ max-height: none !important;
226
+ min-width: 0 !important;
227
+ max-width: none !important;
228
+
229
+ /* Scrolling — both layers must reserve scrollbar space identically
230
+ or the content widths diverge and long lines wrap at different
231
+ columns. We force `overflow-y: scroll` on both so the gutter is
232
+ always present. The textarea shows its native scrollbar; the
233
+ preview's scrollbar is rendered but painted transparent (see
234
+ `.md-editor-preview` block) — the gutter stays, the visual goes. */
235
+ overflow-y: scroll !important;
236
+ overflow-x: hidden !important;
237
+ scrollbar-width: thin !important;
238
+
239
+ /* Background neutralised — wrapper owns the surface color */
240
+ background: transparent !important;
241
+
242
+ /* No animations that could shift glyph position */
243
+ animation: none !important;
244
+ transition: none !important;
245
+ }
246
+
247
+ .md-editor-input {
248
+ z-index: 2 !important;
249
+ resize: none !important;
250
+ appearance: none !important;
251
+ -webkit-appearance: none !important;
252
+ -moz-appearance: none !important;
253
+ /* Hide own glyphs, show only cursor.
254
+ `caret-color` must be an explicit colour, NOT `currentColor` — the
255
+ textarea's own `color` is `transparent`, so `currentColor` would
256
+ resolve to transparent and the cursor would vanish. We mirror the
257
+ preview's prose colour (zinc-900 light / zinc-100 dark). */
258
+ color: transparent !important;
259
+ -webkit-text-fill-color: transparent !important;
260
+ caret-color: #18181b !important; /* zinc-900 */
261
+ /* Prevent mobile double-tap zoom */
262
+ touch-action: manipulation !important;
263
+ }
264
+
265
+ .dark .md-editor-input {
266
+ caret-color: #f4f4f5 !important; /* zinc-100 */
267
+ }
268
+
269
+ /* Selection background visible even with transparent glyphs */
270
+ .md-editor-input::selection {
271
+ background: rgb(59 130 246 / 0.35);
272
+ color: transparent;
273
+ }
274
+
275
+ .md-editor-preview {
276
+ z-index: 1 !important;
277
+ /* Click + selection happen on the textarea, not here */
278
+ pointer-events: none !important;
279
+ user-select: none !important;
280
+ -webkit-user-select: none !important;
281
+ @apply text-zinc-900 dark:text-zinc-100;
282
+ /* Paint the preview's scrollbar transparent so only the textarea's
283
+ scrollbar (sitting on top, z-index: 2) is visible. We CAN'T set
284
+ `scrollbar-width: none` here — that would also remove the gutter
285
+ and the preview's content width would no longer match the
286
+ textarea's, breaking wrap alignment. The transparent-colour trick
287
+ preserves the gutter while hiding the visual. */
288
+ scrollbar-color: transparent transparent !important;
289
+ }
290
+
291
+ .md-editor-preview::-webkit-scrollbar-thumb,
292
+ .md-editor-preview::-webkit-scrollbar-track,
293
+ .md-editor-preview::-webkit-scrollbar-corner {
294
+ background: transparent !important;
295
+ border: 0 !important;
296
+ }
297
+
298
+ /* Critical alignment safeguard (overtype lesson, styles.js:256-264):
299
+ force EVERY descendant inside the preview to inherit font-family,
300
+ font-size, and line-height from the preview itself. Without this,
301
+ external CSS (Tailwind base, @tailwindcss/typography, etc.) can
302
+ set element-specific font-size on, say, `<span>` or implicit
303
+ `<h2>` elements. Any such per-element metric difference inflates
304
+ the line-box height and drifts the overlay relative to the
305
+ textarea — visible as a "cursor far to the right of the visible
306
+ text" symptom. Also reset margin/padding/border so no inner
307
+ element can add box-model space the textarea doesn't have. */
308
+ .md-editor-preview *,
309
+ .md-editor-preview *::before,
310
+ .md-editor-preview *::after {
311
+ font-family: inherit !important;
312
+ font-size: inherit !important;
313
+ line-height: inherit !important;
314
+ font-stretch: inherit !important;
315
+ letter-spacing: inherit !important;
316
+ word-spacing: inherit !important;
317
+ margin: 0 !important;
318
+ padding: 0 !important;
319
+ border: 0 !important;
320
+ text-indent: 0 !important;
321
+ vertical-align: baseline !important;
322
+ display: inline !important;
323
+ }
324
+
325
+ /* Placeholder shim — shown when the textarea is empty. MUST use the
326
+ exact same typography stack as `.md-editor-layer` so the cursor
327
+ position doesn't visibly jump when the first character is typed
328
+ and the placeholder fades out. */
329
+ .md-editor-placeholder {
330
+ position: absolute !important;
331
+ inset: 0 !important;
332
+ padding: 0.625rem 0.75rem !important;
333
+ font-family: "IBM Plex Mono", monospace !important;
334
+ font-size: 0.875rem !important;
335
+ line-height: 1.55 !important;
336
+ font-weight: 400 !important;
337
+ letter-spacing: 0 !important;
338
+ word-spacing: 0 !important;
339
+ pointer-events: none !important;
340
+ user-select: none !important;
341
+ z-index: 0 !important;
342
+ @apply text-zinc-400 dark:text-zinc-500;
343
+ white-space: pre-wrap !important;
344
+ word-wrap: break-word !important;
345
+ word-break: normal !important;
346
+ overflow-wrap: break-word !important;
347
+ }
348
+
349
+ /* Syntax highlighting classes — applied INSIDE the preview div by the
350
+ highlighter. Each rule must preserve glyph width (monospace font does
351
+ the heavy lifting; we only change weight, color, background). */
352
+
353
+ /* The visible markdown syntax characters (**, #, -, >, etc.) — kept
354
+ on-screen but dimmed so prose stands out. */
355
+ .md-syntax,
356
+ .md-marker {
357
+ @apply text-zinc-400 dark:text-zinc-500;
358
+ }
359
+
360
+ /* Bold + headers via `text-shadow` instead of `font-weight`.
361
+
362
+ Why: any font-weight change risks glyph-advance-width drift between
363
+ the textarea (locked at weight 400) and the preview. Even nominal
364
+ monospace fonts can have subtle weight-dependent width changes,
365
+ especially in browser rasterisers. `text-shadow: 0.5px 0 0
366
+ currentColor` paints a copy of each glyph 0.5px to the right —
367
+ visually equivalent to a heavier stroke, but the underlying glyph
368
+ advance is UNCHANGED. The cursor in the textarea (running at
369
+ weight 400) lines up perfectly with the visibly "bold" glyphs in
370
+ the preview because they ARE rendered at weight 400 underneath.
371
+
372
+ Italics: same logic — `font-style: italic` swaps in a different
373
+ font face whose glyph metrics may not perfectly match upright. We
374
+ simulate italic via colour + a transparent overlay we can't get
375
+ in CSS, so for italic we accept a colour-only differentiation. */
376
+ .md-h1,
377
+ .md-h2,
378
+ .md-h3,
379
+ .md-bold {
380
+ text-shadow: 0.5px 0 0 currentColor;
381
+ }
382
+
383
+ /* Slight tonal ladder so the heading levels are still distinguishable
384
+ at a glance, even though they share the same weight + size. */
385
+ .md-h1 {
386
+ @apply text-zinc-950 dark:text-white;
387
+ }
388
+
389
+ .md-h2 {
390
+ @apply text-zinc-900 dark:text-zinc-50;
391
+ }
392
+
393
+ .md-h3 {
394
+ @apply text-zinc-800 dark:text-zinc-200;
395
+ }
396
+
397
+ /* Italic: real `font-style: italic`. IBM Plex Mono Italic 400 is
398
+ loaded as a separate face (see global.css) and is designed as
399
+ monospace — its glyph advance widths match the regular face. The
400
+ `!important` defeats the layer-level `font-style: normal !important`
401
+ so the .md-italic span actually picks up italic. */
402
+ .md-italic {
403
+ font-style: italic !important;
404
+ }
405
+
406
+ /* Inline code — background only, no width change.
407
+ Negative padding would break alignment; we just paint behind the
408
+ glyphs and accept that the highlight doesn't have inset. */
409
+ .md-code {
410
+ @apply bg-zinc-200/60 dark:bg-zinc-700/50 rounded-sm;
411
+ }
412
+
413
+ /* Links — color + underline, both width-safe */
414
+ .md-link {
415
+ @apply text-blue-600 dark:text-blue-400 underline;
416
+ text-underline-offset: 2px;
417
+ }
418
+
419
+ /* Rendered links use one anchor for their complete visible hit area. */
420
+ .md-link-widget {
421
+ display: inline-flex;
422
+ align-items: baseline;
423
+ gap: 0.125rem;
424
+ color: inherit;
425
+ font-weight: 600;
426
+ text-decoration: none;
427
+ transition: color 150ms ease;
428
+ }
429
+
430
+ .md-link-widget:hover {
431
+ color: var(--ui-app-accent-text);
432
+ }
433
+
434
+ .md-link-widget:focus-visible {
435
+ border-radius: 0.125rem;
436
+ outline: 2px solid var(--ui-app-accent-border);
437
+ outline-offset: 2px;
438
+ }
439
+
440
+ .md-link-icon {
441
+ opacity: 0.7;
442
+ transition: opacity 150ms ease;
443
+ }
444
+
445
+ .md-link-widget:hover .md-link-icon,
446
+ .md-link-widget:focus-visible .md-link-icon {
447
+ opacity: 1;
448
+ }
449
+
450
+ /* Blockquote — color + inset box-shadow for the left bar (box-shadow
451
+ doesn't affect layout, unlike border-left or padding-left). The bar
452
+ sits visually outside the text column edge so prose stays aligned. */
453
+ .md-quote {
454
+ @apply text-zinc-600 dark:text-zinc-400;
455
+ box-shadow: inset 3px 0 0 var(--color-zinc-300);
456
+ }
457
+
458
+ .dark .md-quote {
459
+ box-shadow: inset 3px 0 0 var(--color-zinc-600);
460
+ }
461
+
462
+ /* Fenced code lines — background only */
463
+ .md-code-block {
464
+ @apply bg-zinc-200/40 dark:bg-zinc-800;
465
+ }
466
+
467
+ .md-code-block pre,
468
+ .md-mermaid-block,
469
+ .md-katex-block {
470
+ border: 1px solid rgb(228 228 231 / 0.72) !important;
471
+ border-radius: 0.42rem !important;
472
+ background: color-mix(in oklab, white 92%, rgb(244 244 245)) !important;
473
+ box-shadow:
474
+ inset 0 1px 0 rgb(255 255 255 / 0.46),
475
+ inset 0 -1px 0 rgb(0 0 0 / 0.025);
476
+ }
477
+
478
+ .md-katex-block {
479
+ padding: 0.75rem;
480
+ }
481
+
482
+ .dark .md-code-block pre,
483
+ .dark .md-mermaid-block,
484
+ .dark .md-katex-block {
485
+ border-color: rgb(63 63 70 / 0.72) !important;
486
+ background: color-mix(in oklab, rgb(24 24 27) 90%, rgb(39 39 42)) !important;
487
+ box-shadow:
488
+ inset 0 1px 0 rgb(255 255 255 / 0.045),
489
+ inset 0 -1px 0 rgb(0 0 0 / 0.28);
490
+ }
491
+
492
+ /* Horizontal rule (---) — just dim the marker; can't draw an actual
493
+ rule line without inserting layout-shifting elements. */
494
+ .md-hr {
495
+ @apply text-zinc-400 dark:text-zinc-500;
496
+ }
497
+
498
+ /* Completion match — every occurrence of a registered completion
499
+ label (abbreviation or trigger result) is tinted blue so the
500
+ reader can see what's a recognised mention vs. plain prose.
501
+ No underline: a dotted underline reads too much like a spellcheck
502
+ squiggle and trips people into thinking something's broken. */
503
+ .md-completion-match {
504
+ @apply text-blue-600 dark:text-blue-400;
505
+ }
506
+
507
+ /* Stats footer — lines / words / chars, anchored at the bottom-left
508
+ of the editor. No border, no background tint — it inherits the
509
+ editor body colour and sits as a quiet meta-row separated from the
510
+ content only by its dim mono text and a hair of padding.
511
+ When the editor is empty we keep the element rendered (so the
512
+ editor's outer height stays constant — no layout shift across all
513
+ sibling fields when the user starts / clears typing) but flip
514
+ `visibility: hidden` to remove the stats from sight. */
515
+ .md-editor-stats {
516
+ @apply flex justify-start items-center gap-3;
517
+ @apply px-3 py-1;
518
+ @apply text-[10px] text-zinc-400 dark:text-zinc-500;
519
+ @apply font-mono select-none;
520
+ letter-spacing: 0.02em;
521
+ }
522
+
523
+ .md-editor-stats[data-empty="true"] {
524
+ visibility: hidden;
525
+ }