@devaccel-labs/app-comments-toolbar 1.0.0 → 1.3.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 (220) hide show
  1. package/README.md +152 -18
  2. package/dist/react.js +516 -61
  3. package/dist/server.js +342 -14
  4. package/dist/types/capture/api.d.ts +30 -0
  5. package/dist/types/capture/editor.d.ts +10 -0
  6. package/dist/types/capture/ignore.d.ts +19 -0
  7. package/dist/types/capture/index.d.ts +1 -0
  8. package/dist/types/capture/picker.d.ts +9 -0
  9. package/dist/types/capture/picture.d.ts +29 -0
  10. package/dist/types/capture/surface.d.ts +39 -0
  11. package/dist/types/core/index.d.ts +2 -2
  12. package/dist/types/core/resolve.d.ts +2 -1
  13. package/dist/types/core/types.d.ts +11 -0
  14. package/dist/types/debug-context.d.ts +7 -0
  15. package/dist/types/dictation.d.ts +9 -0
  16. package/dist/types/embed/controller.d.ts +61 -0
  17. package/dist/types/embed/index.d.ts +1 -0
  18. package/dist/types/embed/options.d.ts +35 -0
  19. package/dist/types/help/index.d.ts +1 -0
  20. package/dist/types/help/panel-index.d.ts +1 -0
  21. package/dist/types/help/panel-styles.d.ts +1 -0
  22. package/dist/types/help/panel.d.ts +4 -0
  23. package/dist/types/help/pill-styles.d.ts +11 -0
  24. package/dist/types/help/pill.d.ts +44 -0
  25. package/dist/types/help/react.d.ts +12 -0
  26. package/dist/types/help/requests.d.ts +2 -0
  27. package/dist/types/help/types.d.ts +119 -0
  28. package/dist/types/help/wire.d.ts +61 -0
  29. package/dist/types/native-wire.d.ts +63 -0
  30. package/dist/types/native.d.ts +43 -0
  31. package/dist/types/react.d.ts +8 -1
  32. package/dist/types/replay.d.ts +6 -0
  33. package/dist/types/runtime/api.d.ts +250 -0
  34. package/dist/types/runtime/attachment-model.d.ts +16 -0
  35. package/dist/types/runtime/attachments.d.ts +43 -7
  36. package/dist/types/runtime/boot.d.ts +39 -0
  37. package/dist/types/runtime/browser-label.d.ts +5 -0
  38. package/dist/types/runtime/build-id.d.ts +7 -0
  39. package/dist/types/runtime/capture-ui.d.ts +45 -21
  40. package/dist/types/runtime/clarity-model.d.ts +260 -0
  41. package/dist/types/runtime/clarity-ui.d.ts +62 -0
  42. package/dist/types/runtime/client.d.ts +6 -197
  43. package/dist/types/runtime/composer-size.d.ts +30 -0
  44. package/dist/types/runtime/dashboard.d.ts +17 -2
  45. package/dist/types/runtime/debug-context-core.d.ts +88 -0
  46. package/dist/types/runtime/debug-context-host.d.ts +39 -0
  47. package/dist/types/runtime/debug-context-model.d.ts +352 -0
  48. package/dist/types/runtime/debug-context-redact.d.ts +48 -0
  49. package/dist/types/runtime/debug-context.d.ts +36 -0
  50. package/dist/types/runtime/details-model.d.ts +7 -0
  51. package/dist/types/runtime/details.d.ts +7 -5
  52. package/dist/types/runtime/dictation-engine.d.ts +98 -0
  53. package/dist/types/runtime/dictation-model.d.ts +28 -0
  54. package/dist/types/runtime/dictation-ui.d.ts +56 -0
  55. package/dist/types/runtime/dictation.d.ts +66 -0
  56. package/dist/types/runtime/draft-dock.d.ts +32 -0
  57. package/dist/types/runtime/draft-model.d.ts +104 -0
  58. package/dist/types/runtime/draft-store.d.ts +15 -0
  59. package/dist/types/runtime/edits.d.ts +1 -1
  60. package/dist/types/runtime/font.d.ts +16 -0
  61. package/dist/types/runtime/format.d.ts +30 -1
  62. package/dist/types/runtime/host-watch.d.ts +20 -0
  63. package/dist/types/runtime/icons.d.ts +16 -2
  64. package/dist/types/runtime/index.d.ts +3 -1
  65. package/dist/types/runtime/ink.d.ts +8 -0
  66. package/dist/types/runtime/kind-model.d.ts +14 -0
  67. package/dist/types/runtime/live-model.d.ts +25 -0
  68. package/dist/types/runtime/loader.d.ts +5 -11
  69. package/dist/types/runtime/markup-editor.d.ts +54 -0
  70. package/dist/types/runtime/markup-model.d.ts +126 -0
  71. package/dist/types/runtime/markup.d.ts +69 -0
  72. package/dist/types/runtime/mention-parse.d.ts +18 -0
  73. package/dist/types/runtime/mentions.d.ts +4 -4
  74. package/dist/types/runtime/page-background.d.ts +9 -0
  75. package/dist/types/runtime/page-image.d.ts +123 -0
  76. package/dist/types/runtime/placement.d.ts +6 -3
  77. package/dist/types/runtime/record.d.ts +18 -2
  78. package/dist/types/runtime/related.d.ts +1 -1
  79. package/dist/types/runtime/replay-model.d.ts +80 -0
  80. package/dist/types/runtime/replay.d.ts +5 -38
  81. package/dist/types/runtime/runtime.d.ts +6 -0
  82. package/dist/types/runtime/screen.d.ts +47 -0
  83. package/dist/types/runtime/screenshot.d.ts +60 -6
  84. package/dist/types/runtime/session-source.d.ts +45 -0
  85. package/dist/types/runtime/session.d.ts +20 -18
  86. package/dist/types/runtime/shield.d.ts +9 -0
  87. package/dist/types/runtime/shot.d.ts +45 -0
  88. package/dist/types/runtime/sketch.d.ts +26 -0
  89. package/dist/types/runtime/styles.d.ts +1 -1
  90. package/dist/types/runtime/sync.d.ts +1 -0
  91. package/dist/types/runtime/thread-model.d.ts +18 -0
  92. package/dist/types/runtime/ticket-form-model.d.ts +57 -0
  93. package/dist/types/runtime/ticket-form.d.ts +9 -0
  94. package/dist/types/runtime/toolbar.d.ts +37 -1
  95. package/dist/types/runtime/ui-scale.d.ts +17 -0
  96. package/dist/types/runtime/update.d.ts +37 -0
  97. package/dist/types/runtime/use-debug-context.d.ts +27 -0
  98. package/dist/types/server/index.d.ts +22 -0
  99. package/dist/types/server/support.d.ts +20 -0
  100. package/dist/types/server.d.ts +2 -0
  101. package/dist/types/vite/plugin.d.ts +15 -0
  102. package/dist/vite.js +121 -41
  103. package/package.json +26 -13
  104. package/src/capture/api.ts +128 -0
  105. package/src/capture/editor.tsx +178 -0
  106. package/src/capture/ignore.ts +38 -0
  107. package/src/capture/index.ts +27 -0
  108. package/src/capture/picker.tsx +171 -0
  109. package/src/capture/picture.ts +90 -0
  110. package/src/capture/surface.tsx +185 -0
  111. package/src/compiler/annotate.ts +202 -0
  112. package/src/compiler/babel.d.ts +11 -0
  113. package/src/compiler/enabled.ts +55 -0
  114. package/src/compiler/index.ts +2 -0
  115. package/src/core/index.ts +8 -0
  116. package/src/core/resolve.ts +307 -0
  117. package/src/core/types.ts +58 -0
  118. package/src/debug-context.ts +47 -0
  119. package/src/dictation.ts +17 -0
  120. package/src/embed/controller.ts +215 -0
  121. package/src/embed/index.ts +68 -0
  122. package/src/embed/options.ts +100 -0
  123. package/src/help/index.ts +38 -0
  124. package/src/help/panel-index.ts +17 -0
  125. package/src/help/panel-styles.ts +123 -0
  126. package/src/help/panel.ts +840 -0
  127. package/src/help/pill-styles.ts +75 -0
  128. package/src/help/pill.ts +338 -0
  129. package/src/help/react.tsx +143 -0
  130. package/src/help/requests.ts +111 -0
  131. package/src/help/types.ts +124 -0
  132. package/src/help/wire.ts +55 -0
  133. package/src/native-wire.ts +124 -0
  134. package/src/native.ts +282 -0
  135. package/src/react.ts +27 -0
  136. package/src/replay.ts +13 -0
  137. package/src/runtime/api.ts +531 -0
  138. package/src/runtime/attachment-model.ts +42 -0
  139. package/src/runtime/attachments.tsx +1260 -0
  140. package/src/runtime/boot.ts +95 -0
  141. package/src/runtime/browser-label.ts +31 -0
  142. package/src/runtime/build-id.ts +10 -0
  143. package/src/runtime/capture-ui.tsx +306 -0
  144. package/src/runtime/capture.ts +508 -0
  145. package/src/runtime/clarity-model.ts +634 -0
  146. package/src/runtime/clarity-ui.tsx +454 -0
  147. package/src/runtime/client.ts +151 -0
  148. package/src/runtime/composer-size.tsx +146 -0
  149. package/src/runtime/dashboard.tsx +1130 -0
  150. package/src/runtime/debug-context-core.ts +681 -0
  151. package/src/runtime/debug-context-host.ts +56 -0
  152. package/src/runtime/debug-context-model.ts +1319 -0
  153. package/src/runtime/debug-context-redact.ts +259 -0
  154. package/src/runtime/debug-context.ts +613 -0
  155. package/src/runtime/details-model.ts +30 -0
  156. package/src/runtime/details.tsx +395 -0
  157. package/src/runtime/dictation-engine.ts +616 -0
  158. package/src/runtime/dictation-model.ts +79 -0
  159. package/src/runtime/dictation-ui.tsx +363 -0
  160. package/src/runtime/dictation.ts +271 -0
  161. package/src/runtime/dock.ts +108 -0
  162. package/src/runtime/draft-dock.tsx +124 -0
  163. package/src/runtime/draft-model.ts +251 -0
  164. package/src/runtime/draft-store.ts +149 -0
  165. package/src/runtime/edits.tsx +165 -0
  166. package/src/runtime/font.ts +42 -0
  167. package/src/runtime/format.ts +129 -0
  168. package/src/runtime/freshness.ts +23 -0
  169. package/src/runtime/handoff.ts +76 -0
  170. package/src/runtime/host-watch.ts +64 -0
  171. package/src/runtime/icons.tsx +295 -0
  172. package/src/runtime/idle.ts +20 -0
  173. package/src/runtime/index.ts +11 -0
  174. package/src/runtime/ink.ts +6 -0
  175. package/src/runtime/kind-model.ts +20 -0
  176. package/src/runtime/live-model.ts +32 -0
  177. package/src/runtime/loader.tsx +87 -0
  178. package/src/runtime/markup-editor.tsx +1333 -0
  179. package/src/runtime/markup-model.ts +485 -0
  180. package/src/runtime/markup.ts +382 -0
  181. package/src/runtime/members.ts +58 -0
  182. package/src/runtime/mention-parse.ts +56 -0
  183. package/src/runtime/mentions.tsx +205 -0
  184. package/src/runtime/page-background.ts +51 -0
  185. package/src/runtime/page-image.ts +1592 -0
  186. package/src/runtime/placement.ts +336 -0
  187. package/src/runtime/record.ts +402 -0
  188. package/src/runtime/redact.ts +30 -0
  189. package/src/runtime/related.ts +34 -0
  190. package/src/runtime/render-page.ts +2 -0
  191. package/src/runtime/replay-model.ts +232 -0
  192. package/src/runtime/replay.ts +173 -0
  193. package/src/runtime/runtime-version.ts +7 -0
  194. package/src/runtime/runtime.tsx +51 -0
  195. package/src/runtime/screen.ts +182 -0
  196. package/src/runtime/screenshot.ts +260 -0
  197. package/src/runtime/session-source.ts +112 -0
  198. package/src/runtime/session.ts +108 -0
  199. package/src/runtime/shield.ts +34 -0
  200. package/src/runtime/shot.tsx +422 -0
  201. package/src/runtime/sketch.ts +139 -0
  202. package/src/runtime/styles.ts +1541 -0
  203. package/src/runtime/sync.ts +300 -0
  204. package/src/runtime/thread-model.ts +71 -0
  205. package/src/runtime/ticket-form-model.ts +128 -0
  206. package/src/runtime/ticket-form.tsx +342 -0
  207. package/src/runtime/toolbar.tsx +4427 -0
  208. package/src/runtime/ui-scale.ts +75 -0
  209. package/src/runtime/update.ts +98 -0
  210. package/src/runtime/use-debug-context.ts +81 -0
  211. package/src/server/index.ts +133 -0
  212. package/src/server/support.ts +499 -0
  213. package/src/server.ts +4 -0
  214. package/src/vite/plugin.ts +102 -0
  215. package/src/vite.ts +1 -0
  216. package/dist/chunks/chunk-CSKXLF33.js +0 -153
  217. package/dist/chunks/chunk-HUM5FQII.js +0 -160
  218. package/dist/chunks/render-page-76MLIT6M.js +0 -1421
  219. package/dist/chunks/runtime-JX75TKER.js +0 -9267
  220. package/dist/chunks/screenshot-66ARTBGR.js +0 -12
@@ -0,0 +1,35 @@
1
+ /**
2
+ * What a host may set on the loader's `<script>` tag, and with `CommentTool.configure`. The same four things
3
+ * `<CommentToolbar>` takes as props. There the compiler refuses a wrong value; a `data-` attribute is only
4
+ * text, so the loader checks it and loads nothing when one is wrong.
5
+ */
6
+ import type { ToolbarPosition, ToolbarTheme } from "../runtime/toolbar.js";
7
+ export declare const DEFAULT_SESSION_PATH = "/api/comment-service/session";
8
+ export type EmbedOptions = {
9
+ sessionPath: string;
10
+ position?: ToolbarPosition;
11
+ theme?: ToolbarTheme;
12
+ pollMs?: number;
13
+ /** `data-screen-params`: the query parameters that select a screen of the app. */
14
+ screen?: {
15
+ params: string[];
16
+ };
17
+ };
18
+ export type ReadOptions = {
19
+ ok: true;
20
+ options: EmbedOptions;
21
+ } | {
22
+ ok: false;
23
+ problem: string;
24
+ };
25
+ export declare function isPosition(value: unknown): value is ToolbarPosition;
26
+ export declare function isTheme(value: unknown): value is ToolbarTheme;
27
+ export declare const POSITION_NAMES: string;
28
+ export declare const THEME_NAMES: string;
29
+ /**
30
+ * Reads `data-session-path`, `data-position`, `data-theme`, `data-poll-ms` and `data-screen-params` (as
31
+ * `dataset` names them). An
32
+ * attribute that is absent takes the component's default; one that is present and wrong is a refusal that names
33
+ * it. Other `data-` attributes are the host's own and are not read.
34
+ */
35
+ export declare function readOptions(data: Readonly<Record<string, string | undefined>>, pageUrl: string): ReadOptions;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const HELP_PANEL_CSS = "\n.cth .cth-panel {\n position: fixed; z-index: 2147482001;\n bottom: calc(var(--cth-edge) + 52px + env(safe-area-inset-bottom, 0px) + var(--cth-lift, 0px));\n display: flex; flex-direction: column; width: 380px; max-width: calc(100vw - 2 * var(--cth-edge));\n max-height: min(620px, calc(100vh - var(--cth-edge) - 76px - var(--cth-lift, 0px)));\n border-radius: 18px; background: var(--cth-card); color: var(--cth-ink); overflow: hidden;\n box-shadow: 0 0 0 1px var(--cth-ring), var(--cth-shadow);\n}\n.cth[data-position=\"bottom-right\"] .cth-panel { right: calc(var(--cth-edge) + env(safe-area-inset-right, 0px)); }\n.cth[data-position=\"bottom-left\"] .cth-panel { left: calc(var(--cth-edge) + env(safe-area-inset-left, 0px)); }\n.cth .cth-panel:focus { outline: none; }\n.cth .cth-content { display: contents; }\n.cth .cth-head { display: flex; align-items: center; gap: 8px; padding: 14px 12px 10px 18px; }\n.cth .cth-title { display: block; flex: 1; min-width: 0; font-size: 15px; font-weight: 650; letter-spacing: -0.01em; }\n.cth .cth-x {\n display: inline-flex; flex: none; align-items: center; justify-content: center; width: 28px; height: 28px;\n border-radius: 50%; color: var(--cth-muted); cursor: pointer;\n}\n.cth .cth-x:hover { background: var(--cth-fill); color: var(--cth-ink); }\n.cth .cth-icon { display: block; flex: none; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.cth .cth-tabs { display: flex; flex: none; margin: 0 18px 10px; padding: 3px; border-radius: 10px; background: var(--cth-track); }\n.cth .cth-tab {\n display: block; flex: 1; padding: 6px 8px; border-radius: 8px; color: var(--cth-muted);\n font-size: 12.5px; font-weight: 600; text-align: center; cursor: pointer;\n}\n.cth .cth-tab[aria-selected=\"true\"] { background: var(--cth-raised); color: var(--cth-ink); box-shadow: 0 1px 2px rgba(20, 20, 30, 0.14); }\n.cth .cth-body {\n display: flex; flex: 1; flex-direction: column; gap: 10px; min-height: 0; padding: 2px 18px 16px;\n overflow-y: auto; overscroll-behavior: contain;\n}\n.cth .cth-form { display: flex; flex-direction: column; gap: 10px; }\n.cth .cth-q { display: block; font-size: 13px; font-weight: 600; }\n.cth .cth-text {\n display: block; width: 100%; min-height: 104px; max-height: 220px; padding: 10px 12px; border-radius: 12px;\n background: var(--cth-field); box-shadow: inset 0 0 0 1px var(--cth-line); font-size: 14px; line-height: 1.45;\n white-space: pre-wrap; overflow-wrap: anywhere; overflow: auto; resize: vertical; cursor: text;\n}\n.cth .cth-text::placeholder { color: var(--cth-muted); }\n.cth .cth-text:focus { outline: none; box-shadow: inset 0 0 0 2px var(--cth-accent); }\n.cth .cth-text[readonly] { opacity: 0.7; }\n.cth .cth-count { display: block; margin-top: -4px; color: var(--cth-muted); font-size: 12px; text-align: right; }\n.cth .cth-tools { display: flex; flex-direction: column; gap: 6px; }\n.cth .cth-tool {\n display: flex; align-items: center; gap: 9px; padding: 9px 11px; border-radius: 10px; background: var(--cth-fill);\n font-size: 13px; font-weight: 550; cursor: pointer;\n}\n.cth .cth-tool:hover { background: var(--cth-fill-2); }\n.cth .cth-tool-more { display: block; margin-left: auto; color: var(--cth-muted); font-size: 12px; font-weight: 400; }\n.cth :is(.cth-tool, .cth-send, .cth-plain)[disabled] { opacity: 0.5; cursor: default; }\n.cth .cth-chip {\n display: flex; align-items: center; gap: 6px; padding: 5px 5px 5px 11px; border-radius: 10px;\n box-shadow: inset 0 0 0 1px var(--cth-line); font-size: 12.5px;\n}\n.cth .cth-chip-text { display: block; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.cth .cth-chip-what { font-weight: 600; }\n.cth .cth-thumbs { display: flex; flex-wrap: wrap; gap: 8px; }\n.cth .cth-thumb {\n position: relative; display: block; width: 104px; height: 68px; border-radius: 10px; overflow: hidden;\n background: var(--cth-fill); box-shadow: 0 0 0 1px var(--cth-line);\n}\n.cth .cth-thumb-img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: top left; }\n.cth .cth-thumb-x {\n position: absolute; top: 4px; right: 4px; display: inline-flex; align-items: center; justify-content: center;\n width: 22px; height: 22px; border-radius: 50%; background: rgba(20, 20, 22, 0.74); color: #ffffff; cursor: pointer;\n}\n.cth .cth-thumb-x .cth-icon, .cth .cth-chip .cth-icon { width: 12px; height: 12px; stroke-width: 2; }\n.cth .cth-alert { display: block; color: var(--cth-danger); font-size: 12.5px; font-weight: 550; }\n.cth .cth-hint { display: block; color: var(--cth-muted); font-size: 12.5px; }\n.cth .cth-foot { display: flex; align-items: center; gap: 10px; margin-top: 2px; }\n.cth .cth-plain { display: inline-block; color: var(--cth-link); font-size: 13px; font-weight: 550; cursor: pointer; }\n.cth .cth-plain:hover { text-decoration: underline; }\n.cth .cth-send {\n display: inline-flex; align-items: center; justify-content: center; min-width: 84px; height: 36px; margin-left: auto;\n padding: 0 16px; border-radius: 999px; background: var(--cth-accent); color: var(--cth-accent-ink);\n font-size: 13px; font-weight: 650; cursor: pointer;\n}\n.cth .cth-sent { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; padding: 6px 0 2px; }\n.cth .cth-sent-mark {\n display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 50%;\n background: var(--cth-ok); color: #ffffff;\n}\n.cth .cth-sent-mark .cth-icon { stroke-width: 2.2; }\n.cth .cth-sent-title { display: block; font-size: 15px; font-weight: 650; letter-spacing: -0.01em; }\n.cth .cth-sent-actions { display: flex; align-items: center; gap: 16px; margin-top: 4px; }\n.cth .cth-list { display: flex; flex-direction: column; }\n.cth .cth-row { display: block; border-top: 1px solid var(--cth-line); }\n.cth .cth-row:first-child { border-top: 0; }\n.cth .cth-row-main { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 2px 10px; padding: 10px 4px; border-radius: 8px; }\n.cth a.cth-row-main { cursor: pointer; }\n.cth a.cth-row-main:hover { background: var(--cth-fill); }\n.cth .cth-row-summary { display: block; grid-column: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 600; }\n.cth .cth-row-meta { display: block; grid-column: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--cth-muted); font-size: 12px; font-variant-numeric: tabular-nums; }\n.cth .cth-row-note { display: block; grid-column: 1 / -1; margin-top: 4px; color: var(--cth-muted); font-size: 12px; line-height: 1.4; }\n.cth .cth-status {\n display: inline-block; grid-column: 2; grid-row: 1 / span 2; padding: 3px 9px; border-radius: 999px;\n background: var(--cth-received-bg); color: var(--cth-received-ink); font-size: 11.5px; font-weight: 650; white-space: nowrap;\n}\n.cth .cth-status[data-status=\"in_progress\"] { background: var(--cth-progress-bg); color: var(--cth-progress-ink); }\n.cth .cth-status[data-status=\"resolved\"] { background: var(--cth-resolved-bg); color: var(--cth-resolved-ink); }\n.cth .cth-empty { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 22px 0 14px; color: var(--cth-muted); font-size: 13px; text-align: center; }\n.cth .cth-live { position: absolute; display: block; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n@media (max-width: 480px) {\n .cth .cth-panel, .cth[data-position] .cth-panel {\n left: 0; right: 0; bottom: var(--cth-sheet-lift, 0px); width: auto; max-width: none;\n max-height: calc(100vh - 48px - var(--cth-sheet-lift, 0px)); max-height: calc(100dvh - 48px - var(--cth-sheet-lift, 0px));\n padding-bottom: env(safe-area-inset-bottom, 0px); border-radius: 18px 18px 0 0;\n }\n .cth .cth-text { font-size: 16px; }\n}\n@media (prefers-reduced-motion: no-preference) {\n .cth .cth-panel { animation: cth-in 0.24s cubic-bezier(0.2, 0.8, 0.2, 1); transform-origin: bottom right; }\n .cth[data-position=\"bottom-left\"] .cth-panel { transform-origin: bottom left; }\n .cth :is(.cth-tool, .cth-tab, .cth-x, .cth-send) { transition: background-color 0.16s ease, color 0.16s ease, opacity 0.16s ease; }\n @keyframes cth-in { from { opacity: 0; transform: translateY(4px) scale(0.98); } }\n}\n";
@@ -0,0 +1,4 @@
1
+ import { type PanelHost, type PanelView } from "./pill.js";
2
+ /** "Just now", "5 minutes ago", "Yesterday", then the date. */
3
+ export declare function whenWords(iso: string, now: number): string;
4
+ export declare function createPanel(host: PanelHost): PanelView;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The pill's CSS, and the ground the panel's CSS stands on (`./panel-styles.ts`): the reset and the colours.
3
+ *
4
+ * The pill lives in the page's own document, not in a shadow tree: a toolbar on the same page reads keys
5
+ * from `window` and tells "the person is typing" by the event's target, which a shadow tree would hide from
6
+ * it. So every element here is first cleared of whatever the host's stylesheet gives its kind (`all: unset`)
7
+ * and then styled by a rule under `.cth`, which outranks a host rule written for a bare element.
8
+ */
9
+ /** Above the page, below the comment toolbar (2147483000) and its capture UI. */
10
+ export declare const HELP_Z_INDEX = 2147482000;
11
+ export declare const HELP_BASE_CSS = "\n.cth {\n all: initial; display: contents;\n --cth-card: #ffffff; --cth-ink: #141416; --cth-muted: #62625e; --cth-line: #e2e2dd; --cth-ring: rgba(20, 20, 30, 0.08);\n --cth-fill: #f3f3f0; --cth-fill-2: #e9e9e4; --cth-track: #e9e9e4; --cth-raised: #ffffff; --cth-field: #ffffff;\n --cth-accent: #2563eb; --cth-accent-ink: #ffffff; --cth-link: #1d4ed8; --cth-danger: #b42318; --cth-ok: #1f7a3d;\n --cth-received-bg: #eeeeea; --cth-received-ink: #4a4a47; --cth-progress-bg: #fff1cc; --cth-progress-ink: #7a4f00;\n --cth-resolved-bg: #e0f4e6; --cth-resolved-ink: #17612f;\n --cth-shadow: 0 2px 6px rgba(20, 20, 30, 0.08), 0 16px 48px rgba(20, 20, 30, 0.18);\n --cth-pill-shadow: 0 1px 2px rgba(20, 20, 30, 0.08), 0 8px 24px rgba(20, 20, 30, 0.14);\n --cth-edge: 20px;\n color: var(--cth-ink);\n font: 400 13px/1.4 -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"Segoe UI\", Inter, system-ui, sans-serif;\n letter-spacing: -0.005em; -webkit-font-smoothing: antialiased; text-align: left; direction: ltr;\n}\n.cth[data-theme=\"dark\"] {\n --cth-card: #1c1c20; --cth-ink: #f5f5f7; --cth-muted: #a8a8ad; --cth-line: rgba(255, 255, 255, 0.14);\n --cth-ring: rgba(255, 255, 255, 0.1); --cth-fill: rgba(255, 255, 255, 0.08); --cth-fill-2: rgba(255, 255, 255, 0.13);\n --cth-track: rgba(0, 0, 0, 0.34); --cth-raised: #3a3a41; --cth-field: #131316; --cth-link: #8ab4ff;\n --cth-danger: #ff8a80; --cth-ok: #1f7a3d; --cth-received-bg: rgba(255, 255, 255, 0.1); --cth-received-ink: #d7d7dc;\n --cth-progress-bg: rgba(255, 190, 60, 0.18); --cth-progress-ink: #ffd27a; --cth-resolved-bg: rgba(70, 200, 110, 0.18);\n --cth-resolved-ink: #8fe0a8; --cth-shadow: 0 2px 6px rgba(0, 0, 0, 0.4), 0 16px 48px rgba(0, 0, 0, 0.5);\n --cth-pill-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.45);\n}\n@media (prefers-color-scheme: dark) { .cth[data-theme=\"auto\"] {\n --cth-card: #1c1c20; --cth-ink: #f5f5f7; --cth-muted: #a8a8ad; --cth-line: rgba(255, 255, 255, 0.14);\n --cth-ring: rgba(255, 255, 255, 0.1); --cth-fill: rgba(255, 255, 255, 0.08); --cth-fill-2: rgba(255, 255, 255, 0.13);\n --cth-track: rgba(0, 0, 0, 0.34); --cth-raised: #3a3a41; --cth-field: #131316; --cth-link: #8ab4ff;\n --cth-danger: #ff8a80; --cth-ok: #1f7a3d; --cth-received-bg: rgba(255, 255, 255, 0.1); --cth-received-ink: #d7d7dc;\n --cth-progress-bg: rgba(255, 190, 60, 0.18); --cth-progress-ink: #ffd27a; --cth-resolved-bg: rgba(70, 200, 110, 0.18);\n --cth-resolved-ink: #8fe0a8; --cth-shadow: 0 2px 6px rgba(0, 0, 0, 0.4), 0 16px 48px rgba(0, 0, 0, 0.5);\n --cth-pill-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.45);\n} }\n.cth :is(a, button, div, form, h2, header, img, label, li, p, section, span, svg, textarea, time, ul) {\n all: unset; box-sizing: border-box;\n}\n.cth :focus-visible { outline: 2px solid var(--cth-accent); outline-offset: 2px; }\n.cth .cth-pill {\n position: fixed; z-index: 2147482000;\n bottom: calc(var(--cth-edge) + env(safe-area-inset-bottom, 0px) + var(--cth-lift, 0px));\n display: inline-flex; align-items: center; gap: 8px; height: 40px; max-width: calc(100vw - 2 * var(--cth-edge));\n padding: 0 16px 0 9px; border-radius: 999px; background: var(--cth-card); color: var(--cth-ink);\n box-shadow: 0 0 0 1px var(--cth-ring), var(--cth-pill-shadow);\n font-size: 13px; font-weight: 600; white-space: nowrap; cursor: pointer;\n -webkit-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent;\n}\n.cth[data-position=\"bottom-right\"] .cth-pill { right: calc(var(--cth-edge) + env(safe-area-inset-right, 0px)); }\n.cth[data-position=\"bottom-left\"] .cth-pill { left: calc(var(--cth-edge) + env(safe-area-inset-left, 0px)); }\n.cth .cth-pill:hover { background: var(--cth-raised); box-shadow: 0 0 0 1px var(--cth-ring), var(--cth-shadow); }\n.cth .cth-mark {\n display: inline-flex; flex: none; align-items: center; justify-content: center; width: 22px; height: 22px;\n border-radius: 50%; background: var(--cth-accent); color: var(--cth-accent-ink); font-size: 13px; font-weight: 700;\n}\n.cth .cth-label { display: block; overflow: hidden; text-overflow: ellipsis; }\n.cth .cth-note {\n position: fixed; z-index: 2147482000;\n bottom: calc(var(--cth-edge) + 50px + env(safe-area-inset-bottom, 0px) + var(--cth-lift, 0px));\n display: block; max-width: 240px; padding: 8px 12px; border-radius: 10px; background: var(--cth-ink);\n color: var(--cth-card); font-size: 12px;\n}\n.cth[data-position=\"bottom-right\"] .cth-note { right: var(--cth-edge); }\n.cth[data-position=\"bottom-left\"] .cth-note { left: var(--cth-edge); }\n@media (prefers-reduced-motion: no-preference) {\n .cth .cth-pill { transition: box-shadow 0.2s ease, transform 0.2s ease, bottom 0.2s ease; }\n .cth .cth-pill:active { transform: scale(0.97); }\n .cth .cth-pill[aria-busy=\"true\"] .cth-mark { animation: cth-wait 0.9s ease-in-out infinite alternate; }\n @keyframes cth-wait { to { opacity: 0.45; } }\n}\n";
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The pill: all that `help.js` puts on a page before anyone asks for help. A labelled button fixed to a
3
+ * bottom corner, a few kilobytes with its CSS, no React.
4
+ *
5
+ * The panel it opens (`./panel.ts`, served as `help-panel.js`) and the capture script (`../capture`, served
6
+ * as `capture.js`) are fetched the first time the pointer rests on the pill, it takes focus, or it is opened.
7
+ *
8
+ * There is one pill per page. `mount` called again changes its options and keeps the pill, an open panel and
9
+ * a draft; every handle `mount` has returned speaks for that one pill.
10
+ */
11
+ import type { CommentToolCaptureApi } from "../capture/api.js";
12
+ import { type CommentToolHelpApi, type HelpOptions } from "./types.js";
13
+ /** What the panel is given: where to draw, what the host said, and the capture tools. */
14
+ export type PanelHost = {
15
+ /** The pill's root. The panel is appended to it, after the pill. */
16
+ root: HTMLElement;
17
+ pill: HTMLButtonElement;
18
+ /** The host's options as they are now. */
19
+ options(): HelpOptions;
20
+ /** The capture script's API, fetched when it is not on the page yet. Rejects when it cannot be. */
21
+ capture(): Promise<CommentToolCaptureApi>;
22
+ /** Hides the pill and the panel while a capture is open, and brings them back. */
23
+ hide(hidden: boolean): void;
24
+ };
25
+ /** The panel, as the pill drives it. Additive only: a page may hold a `help.js` older than its panel. */
26
+ export type PanelView = {
27
+ readonly isOpen: boolean;
28
+ open(): void;
29
+ close(): void;
30
+ /** The host's options changed. */
31
+ update(): void;
32
+ destroy(): void;
33
+ };
34
+ export type HelpPanelApi = {
35
+ create(host: PanelHost): PanelView;
36
+ };
37
+ export type HelpEnvironment = {
38
+ /** Where this script's siblings are served: `<service>/v1/toolbar/`. */
39
+ base: string;
40
+ /** Adds a classic script to the page. Default: a `<script async>` in `<head>`. */
41
+ loadScript?: (url: string) => Promise<void>;
42
+ };
43
+ export declare function ensureHelpStyles(id: string, css: string): void;
44
+ export declare function createHelp(environment: HelpEnvironment): CommentToolHelpApi;
@@ -0,0 +1,12 @@
1
+ import type { HelpOptions } from "./types.js";
2
+ export type HelpPillProps = HelpOptions & {
3
+ /**
4
+ * Comment Tool's address: `https://comment-tool.example.com`. Left out, it is the one the session route
5
+ * names, which is how `<CommentToolbar>` learns it. That route says so only to people the comment toolbar
6
+ * is on for, so a host that shows the pill to everyone gives the address here.
7
+ */
8
+ serviceUrl?: string;
9
+ /** The session route asked when `serviceUrl` is left out. Default `/api/comment-service/session`. */
10
+ sessionPath?: string;
11
+ };
12
+ export declare function HelpPill(props: HelpPillProps): null;
@@ -0,0 +1,2 @@
1
+ import { type SupportRequests } from "./types.js";
2
+ export declare function supportRequestsAt(url: string): SupportRequests;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * "Need help?": the pill a host shows every signed-in person, and the panel it opens. The person writes what
3
+ * they need, may add pictures of the page, and sends; the host records the request wherever it keeps them
4
+ * (`submit`) and may show the person what they have sent (`list`). Nothing here signs in to the comment
5
+ * toolbar or calls Comment Tool: the two hooks are the host's own.
6
+ */
7
+ export type HelpTheme = "light" | "dark" | "auto";
8
+ export type HelpPosition = "bottom-right" | "bottom-left";
9
+ /** A picture as the capture script returns it (`../capture/picture.ts`). */
10
+ export type HelpImage = {
11
+ blob: Blob;
12
+ name: string;
13
+ width: number;
14
+ height: number;
15
+ markedUp: boolean;
16
+ };
17
+ export type HelpRequest = {
18
+ /** Made once per request and sent again unchanged on a retry, so a host can make it safe to repeat. */
19
+ id: string;
20
+ /** 1 to 4,000 characters. */
21
+ message: string;
22
+ /** The page's address, with anything that looks like a credential in its query taken out. */
23
+ pageUrl: string;
24
+ /** The page's path. */
25
+ route: string;
26
+ /** What the person pointed at, when they did. */
27
+ pointed: {
28
+ label: string;
29
+ } | null;
30
+ /** At most 3 pictures. */
31
+ images: readonly HelpImage[];
32
+ client: {
33
+ userAgent: string;
34
+ language: string;
35
+ viewport: {
36
+ width: number;
37
+ height: number;
38
+ };
39
+ };
40
+ };
41
+ export type HelpReceipt = {
42
+ /** The request's number in the host's words. Given, the person reads "Request I00042 received." */
43
+ reference?: string;
44
+ /** Where the request opens in the host, when it has such a page. `http:` or `https:` only. */
45
+ url?: string;
46
+ /** One more plain sentence for the person: "1 picture could not be kept." */
47
+ note?: string;
48
+ };
49
+ export type SubmittedRequestStatus = "received" | "in_progress" | "resolved";
50
+ export type SubmittedRequest = {
51
+ id: string;
52
+ reference?: string;
53
+ /** The person's own first words. */
54
+ summary: string;
55
+ /** ISO-8601. */
56
+ createdAt: string;
57
+ status: SubmittedRequestStatus;
58
+ /** The host's own word for the status, shown in place of ours when given. */
59
+ statusLabel?: string;
60
+ /**
61
+ * True when the team already tracks this issue in another request and has merged this one into it. The
62
+ * person is told so, and `status` and `statusLabel` are then where that other request stands. Give
63
+ * nothing else of the other request: it may be somebody else's.
64
+ */
65
+ consolidated?: boolean;
66
+ /** Where the request opens in the host, when it has such a page. `http:` or `https:` only. */
67
+ url?: string;
68
+ };
69
+ export type HelpOptions = {
70
+ /**
71
+ * Records the request wherever the host keeps them. Rejecting shows the person a failure and keeps their
72
+ * draft. A rejection that is a `HelpError` (or any error named "HelpError") shows its own message; any
73
+ * other shows one fixed sentence, because an exception's text is not written for the person.
74
+ */
75
+ submit(request: HelpRequest): Promise<HelpReceipt>;
76
+ /** What this person has submitted. Given, the panel has "Your requests". */
77
+ list?(): Promise<readonly SubmittedRequest[]>;
78
+ /** Default "Need help?". */
79
+ label?: string;
80
+ /** Default "bottom-right". */
81
+ position?: HelpPosition;
82
+ /** Default "auto": the system's light or dark setting. */
83
+ theme?: HelpTheme;
84
+ /**
85
+ * Whether pictures are offered right now. A host turns them off on screens that must not be pictured.
86
+ * Default true. A function is asked each time the panel is drawn and again when a picture is asked for.
87
+ */
88
+ captures?: boolean | (() => boolean);
89
+ /** Where "More options" leads when the host has a fuller form; it is given the text typed so far. */
90
+ moreOptions?: (draft: {
91
+ message: string;
92
+ }) => void;
93
+ };
94
+ export type HelpHandle = {
95
+ open(): void;
96
+ close(): void;
97
+ unmount(): void;
98
+ };
99
+ /** `submit` and `list` over one same-origin route (`./requests.ts`, `../server/support.ts`). */
100
+ export type SupportRequests = {
101
+ submit(request: HelpRequest): Promise<HelpReceipt>;
102
+ list(): Promise<readonly SubmittedRequest[]>;
103
+ };
104
+ export type CommentToolHelpApi = {
105
+ /** Shows the pill. Calling it again replaces the options; the pill, an open panel and a draft stay. */
106
+ mount(options: HelpOptions): HelpHandle;
107
+ /** The two hooks for a host whose server route is `handleSupportRequest`. */
108
+ supportRequestsAt(url: string): SupportRequests;
109
+ /** A failure whose message is written for the person. */
110
+ HelpError: typeof HelpError;
111
+ };
112
+ /**
113
+ * A failure whose message is one plain sentence for the person who pressed Send. The panel shows it as it
114
+ * is. Recognised by its name, not its class, so one thrown by the package is known to the script and back.
115
+ */
116
+ export declare class HelpError extends Error {
117
+ readonly name = "HelpError";
118
+ }
119
+ export declare function isHelpError(error: unknown): error is Error;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * A help request as it travels from the browser to the host's own route (`./requests.ts` writes it,
3
+ * `../server/support.ts` reads it): JSON, with each picture's bytes as base64. No DOM and no server API
4
+ * here, so both sides import it.
5
+ */
6
+ export declare const HELP_LIMITS: {
7
+ /** A request's own id: letters, digits, `.`, `_`, `:` and `-`. */
8
+ readonly id: 100;
9
+ readonly message: 4000;
10
+ readonly images: 3;
11
+ /** One picture, before base64. */
12
+ readonly imageBytes: number;
13
+ readonly name: 200;
14
+ readonly label: 200;
15
+ readonly url: 1000;
16
+ /** "Your requests" shows at most this many. */
17
+ readonly listed: 50;
18
+ };
19
+ /** The whole body: three pictures as base64, the text, and room for the rest. */
20
+ export declare const HELP_BODY_BYTES: number;
21
+ export declare const HELP_ID: RegExp;
22
+ /** The picture types a request may carry. Checked on the server against each file's first bytes. */
23
+ export declare const HELP_IMAGE_TYPES: readonly ["image/png", "image/jpeg", "image/webp"];
24
+ export type HelpImageType = (typeof HELP_IMAGE_TYPES)[number];
25
+ export type HelpImageWire = {
26
+ name: string;
27
+ contentType: string;
28
+ width: number;
29
+ height: number;
30
+ markedUp: boolean;
31
+ /** The file's bytes, base64. */
32
+ data: string;
33
+ };
34
+ export type HelpRequestWire = {
35
+ id: string;
36
+ message: string;
37
+ pageUrl: string;
38
+ route: string;
39
+ pointed: {
40
+ label: string;
41
+ } | null;
42
+ images: readonly HelpImageWire[];
43
+ client: {
44
+ userAgent: string;
45
+ language: string;
46
+ viewport: {
47
+ width: number;
48
+ height: number;
49
+ };
50
+ };
51
+ };
52
+ /** What the route answers a `POST` with. */
53
+ export type HelpReceiptWire = {
54
+ reference?: string;
55
+ url?: string;
56
+ note?: string;
57
+ };
58
+ /** What the route answers when it refuses or fails: one plain sentence. */
59
+ export type HelpFailureWire = {
60
+ error: string;
61
+ };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The wire contract between native (iOS / Android) comment clients and the App comments service.
3
+ *
4
+ * One owner for the worker, the host session route, a connection's own workspace and
5
+ * `@devaccel-labs/app-comments-native`. DOM-free and dependency-free.
6
+ *
7
+ * A native app has no web origin. It identifies itself with an app origin, `<scheme>://app`, where `<scheme>`
8
+ * is one of the environment's `appSchemes` (for example `my-app-staging`). It sends that value in the
9
+ * `x-comment-service-origin` header and never sends `Origin`. Browsers always send `Origin` on cross-origin
10
+ * requests, so a web page can never take the app-origin path. Native threads store their screen as an app URL,
11
+ * `<scheme>://app/<route>`, so `url` pathname still equals `route`.
12
+ */
13
+ /** Which client wrote a comment. Web clients may omit it; the service treats a missing value as `web`. */
14
+ export type ClientPlatform = "web" | "ios" | "android";
15
+ /** Device and build facts a native client sends with a new thread (`POST /v1/threads` body `client`). */
16
+ export type ClientInfo = {
17
+ platform: ClientPlatform;
18
+ /** The host app's build variant, e.g. `staging`, `staging2`. */
19
+ appVariant?: string | null;
20
+ /** Marketing version, e.g. `0.6.9`. */
21
+ appVersion?: string | null;
22
+ /** Build number, e.g. `123`. */
23
+ build?: string | null;
24
+ /** OS name and version, e.g. `iOS 26.1`, `Android 16`. */
25
+ os?: string | null;
26
+ /** Device model, e.g. `iPhone 17 Pro`, `Pixel 10`. */
27
+ device?: string | null;
28
+ };
29
+ /** Header a native client sends instead of `Origin`. */
30
+ export declare const APP_ORIGIN_HEADER = "x-comment-service-origin";
31
+ /** The host the app origin uses: `<scheme>://app`. */
32
+ export declare const APP_ORIGIN_HOST = "app";
33
+ /** Most schemes an environment may list. */
34
+ export declare const MAX_APP_SCHEMES = 10;
35
+ /** Whether `value` is a scheme an environment may list (lowercase, no `:`, not a web or system scheme). */
36
+ export declare function isAppScheme(value: string): boolean;
37
+ /** A list of app schemes as typed (trimmed, lowercased, deduped), or what is wrong with it. */
38
+ export declare function normalizeAppSchemes(value: unknown): {
39
+ readonly ok: true;
40
+ readonly schemes: string[];
41
+ } | {
42
+ readonly ok: false;
43
+ readonly message: string;
44
+ };
45
+ /** `my-app-staging` → `my-app-staging://app`. */
46
+ export declare function appOrigin(scheme: string): string;
47
+ /**
48
+ * The scheme of an app origin (`<scheme>://app`, nothing after it), or null. Does not check the environment's
49
+ * list; callers compare the scheme with `appSchemes`.
50
+ */
51
+ export declare function appOriginScheme(value: string): string | null;
52
+ /** The app URL a native thread stores: `<scheme>://app` + route. `route` starts with `/`. */
53
+ export declare function appScreenUrl(scheme: string, route: string): string;
54
+ /**
55
+ * Splits an app URL (`<scheme>://app/<path>?<query>`) into its scheme and pathname, or null when it is not one.
56
+ * `new URL()` gives `origin === "null"` for non-special schemes, so callers use this instead.
57
+ */
58
+ export declare function parseAppUrl(value: string): {
59
+ scheme: string;
60
+ pathname: string;
61
+ } | null;
62
+ /** Where the sign-in callback returns a native client: `<scheme>://app/app-comments/auth`. */
63
+ export declare function appAuthReturnUrl(scheme: string): string;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The toolbar's portable (DOM-free) logic, for native clients: `@devaccel-labs/app-comments-toolbar/native`,
3
+ * re-exported by `@devaccel-labs/app-comments-native` (its `src/shared.ts`). It ships as TypeScript source, like
4
+ * `./native-wire`, `./dictation` and `./replay`; React Native's Metro compiles it in the host app.
5
+ *
6
+ * Every module re-exported here must stay DOM-free at import time (no `react-dom`, no DOM components, no
7
+ * top-level `window` / `document`). Where a web module mixes portable helpers with DOM UI, the helpers live in a
8
+ * pure module here and the web file re-exports them, so web imports don't change.
9
+ */
10
+ export * from "./native-wire.js";
11
+ export type { Anchor, Candidate, Resolution, ResolutionStatus, Sketch } from "./core/index.js";
12
+ export { describeAnchor, validateAnchor } from "./core/index.js";
13
+ export { ApiError, base64Url, checkClarity, createThread, editMessage, fetchTicketForm, finishMsfSignIn, getProfile, listMembers, listThreads, memberIsCurrent, msfAuthorizeUrl, msfHandoffFrom, openLive, readMemberToken, replyToThread, saveSettings, signInOptions, storageKey, transcribeAudio, updateProfile, updateThread, uploadAttachment, } from "./runtime/api.js";
14
+ export type { Access, Attachment, Capture, CommentMessage, Delivery, Details, FieldDef, FieldValue, Member, MemberTokenStore, Mentioned, MsfHandoff, PostExtras, Profile, Revision, Settings, SignInOptions, Thread, TicketBadge, } from "./runtime/api.js";
15
+ export { readJwt, sessionFrom, sessionSource } from "./runtime/session-source.js";
16
+ export type { GetSession, Session } from "./runtime/session-source.js";
17
+ export { fieldIsSensitive, redactText } from "./runtime/redact.js";
18
+ export { relatedTo } from "./runtime/related.js";
19
+ export type { Related } from "./runtime/related.js";
20
+ export { MAX_POLL_MS, nextPoll } from "./runtime/freshness.js";
21
+ export type { PollState } from "./runtime/freshness.js";
22
+ export { ago, colorFor, deliveryText, initials, paintThreadStatuses, statusNote, targetName, } from "./runtime/format.js";
23
+ export { ReplayBuffer, consoleText, parseReplay, redactSecretSearchParams, replayLine, replayStamp, } from "./runtime/replay-model.js";
24
+ export type { ReplayBufferOptions, ReplayClip, ReplayDraft, ReplayEvent, ReplayFile, } from "./runtime/replay-model.js";
25
+ export * from "./debug-context.js";
26
+ export { argText, createDebugCore, errorOf, type DebugCaptureStats, type DebugCore, type RequestReaders, } from "./runtime/debug-context-core.js";
27
+ export { MAX_DRAFT_BYTES, MAX_DRAFT_CAPTURES, createDraftStore, describeDraft, readStoredDraft, } from "./runtime/draft-model.js";
28
+ export type { DraftBackend, DraftStore, StoredCapture, StoredDraft, StoredRecording, } from "./runtime/draft-model.js";
29
+ export { DEFAULT_HIGHLIGHT, DEFAULT_INK, HIGHLIGHT_ALPHA, HISTORY_LIMIT, MARKUP_COLORS, arrowHead, commitHistory, contrastText, createHistory, flattenedName, hitTest, isMeaningful, markupMetrics, moveShape, normalizeBox, redoHistory, shapeBounds, snapAngle, strokeWidth, textLayout, toRect, undoHistory, } from "./runtime/markup-model.js";
30
+ export type { ArrowShape, Box, BoxShape, MarkupHistory, MarkupMetrics, MarkupShape, MarkupSize, MarkupTool, MeasureText, StrokeShape, TextLayout, TextShape, } from "./runtime/markup-model.js";
31
+ export { decibels, dictationPrompt, insertDictated, meterLevel, voiceRecordingName, } from "./runtime/dictation-model.js";
32
+ export { agoPhrase, fromYou, involved, isMine, leadSentence, mentionOfYou, namesYou, versionsOf, } from "./runtime/thread-model.js";
33
+ export { ATTACHMENT_MAX_BYTES, ATTACHMENT_MAX_FILES, ATTACHMENT_TYPES, attachmentStamp, formatSize, isReplayFile, } from "./runtime/attachment-model.js";
34
+ export { KEEPALIVE_MS, MAX_QUICK_RETRIES, OPEN_WAIT_MS, PUSH_BATCH_MS, RETRY_LATER_MS, parseLiveMessage, } from "./runtime/live-model.js";
35
+ export type { LiveMessage } from "./runtime/live-model.js";
36
+ export { insertMention, mentionMatches, mentionParts, mentionQueryAt, mentionsIn, } from "./runtime/mention-parse.js";
37
+ export { CHIP_OPTIONS_MAX, missingTicketFields, ticketDraftPayload, ticketFieldOptions, ticketFieldVisibility, ticketValueFilled, } from "./runtime/ticket-form-model.js";
38
+ export type { TicketDraft, TicketForm, TicketFormField, TicketValue, TicketValues, } from "./runtime/ticket-form-model.js";
39
+ export { detailsEnabled, detailsPayload, hasFieldValues, noDetails, } from "./runtime/details-model.js";
40
+ export { REPORT_KINDS, readReportKind } from "./runtime/kind-model.js";
41
+ export type { ReportKind } from "./runtime/kind-model.js";
42
+ export { CLARITY_ANSWER_MAX_LENGTH, CLARITY_MAX_ASSUMED, CLARITY_MAX_QUESTIONS, CLARITY_MAX_ROUNDS, CLARITY_WAIT_MS, CLARITY_WORDS, COMMENT_MESSAGE_MAX_LENGTH, answerRoom, askClarity, canSendAsIs, clarityAfterCheck, clarityAnnouncement, clarityBody, clarityChecks, clarityGroups, clarityReader, clarityStep, draftMark, openQuestions, passMark, questionAudience, readClarityHold, readClarityMode, readClarityResponse, whoWouldAsk, withAnswer, } from "./runtime/clarity-model.js";
43
+ export type { ClarityAnswer, ClarityAnswerCheck, ClarityAudience, ClarityDraft, ClarityFacts, ClarityGap, ClarityHold, ClarityMode, ClarityOutcome, ClarityQuestion, ClarityReport, ClaritySend, ClarityStep, } from "./runtime/clarity-model.js";
@@ -1,2 +1,9 @@
1
- export { CommentToolbar, type ToolbarSource } from "./runtime/loader.js";
1
+ export { CommentToolbar } from "./runtime/loader.js";
2
2
  export type { ToolbarPosition, ToolbarProps, ToolbarTheme } from "./runtime/toolbar.js";
3
+ export { queryCacheSummary, reportToolbarError } from "./runtime/debug-context-host.js";
4
+ export type { DebugAudience, DebugContextConfig, DebugContextOptions, DebugSignal, HostBuild, HostContext, QuerySummary, } from "./runtime/debug-context-model.js";
5
+ export { HelpPill } from "./help/react.js";
6
+ export type { HelpPillProps } from "./help/react.js";
7
+ export { supportRequestsAt } from "./help/requests.js";
8
+ export { HelpError } from "./help/types.js";
9
+ export type { HelpImage, HelpOptions, HelpPosition, HelpReceipt, HelpRequest, HelpTheme, SubmittedRequest, SubmittedRequestStatus, SupportRequests, } from "./help/types.js";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The replay file a clip carries, for an inbox and for the service: parse it, pair it with its clip, and word
3
+ * each event. These come from the DOM-free half (`runtime/replay-model`), so a Worker can import them.
4
+ * Source only, like `./dictation`: not built into `dist`.
5
+ */
6
+ export { parseReplay, replayLine, replayStamp, type ReplayClip, type ReplayEvent, type ReplayFile, } from "./runtime/replay-model.js";