@hcu-lab.me/mcp-device 1.0.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 (261) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/bootstrap.d.ts +1 -0
  4. package/dist/bootstrap.js +22 -0
  5. package/dist/command-manager.d.ts +8 -0
  6. package/dist/command-manager.js +241 -0
  7. package/dist/config-field-definitions.d.ts +41 -0
  8. package/dist/config-field-definitions.js +37 -0
  9. package/dist/config-manager.d.ts +102 -0
  10. package/dist/config-manager.js +291 -0
  11. package/dist/config.d.ts +6 -0
  12. package/dist/config.js +10 -0
  13. package/dist/custom-stdio.d.ts +51 -0
  14. package/dist/custom-stdio.js +358 -0
  15. package/dist/data/official-app-ca.pem +12 -0
  16. package/dist/data/onboarding-prompts.json +70 -0
  17. package/dist/device/device-state.d.ts +13 -0
  18. package/dist/device/device-state.js +100 -0
  19. package/dist/device/device-status.d.ts +81 -0
  20. package/dist/device/device-status.js +156 -0
  21. package/dist/device/device.d.ts +16 -0
  22. package/dist/device/device.js +190 -0
  23. package/dist/device/execution-engine.d.ts +144 -0
  24. package/dist/device/execution-engine.js +195 -0
  25. package/dist/device/gateway-channel.d.ts +48 -0
  26. package/dist/device/gateway-channel.js +384 -0
  27. package/dist/device/gateway-config.d.ts +40 -0
  28. package/dist/device/gateway-config.js +207 -0
  29. package/dist/device/gateway-identity.d.ts +35 -0
  30. package/dist/device/gateway-identity.js +178 -0
  31. package/dist/device/gateway-pairing.d.ts +25 -0
  32. package/dist/device/gateway-pairing.js +105 -0
  33. package/dist/device/gateway-secure-transport.d.ts +25 -0
  34. package/dist/device/gateway-secure-transport.js +117 -0
  35. package/dist/device/gateway-tool-adapter.d.ts +17 -0
  36. package/dist/device/gateway-tool-adapter.js +284 -0
  37. package/dist/device/gateway-url-policy.d.ts +3 -0
  38. package/dist/device/gateway-url-policy.js +43 -0
  39. package/dist/device/linux-service.d.ts +70 -0
  40. package/dist/device/linux-service.js +268 -0
  41. package/dist/device/official-trust.d.ts +7 -0
  42. package/dist/device/official-trust.js +49 -0
  43. package/dist/device/project-inspection.d.ts +1 -0
  44. package/dist/device/project-inspection.js +180 -0
  45. package/dist/device/runtime-owner.d.ts +41 -0
  46. package/dist/device/runtime-owner.js +177 -0
  47. package/dist/device/windows-dpapi.d.ts +11 -0
  48. package/dist/device/windows-dpapi.js +67 -0
  49. package/dist/device/windows-service.d.ts +56 -0
  50. package/dist/device/windows-service.js +238 -0
  51. package/dist/error-handlers.d.ts +7 -0
  52. package/dist/error-handlers.js +15 -0
  53. package/dist/handlers/edit-search-handlers.d.ts +6 -0
  54. package/dist/handlers/edit-search-handlers.js +6 -0
  55. package/dist/handlers/filesystem-handlers.d.ts +38 -0
  56. package/dist/handlers/filesystem-handlers.js +440 -0
  57. package/dist/handlers/history-handlers.d.ts +12 -0
  58. package/dist/handlers/history-handlers.js +67 -0
  59. package/dist/handlers/index.d.ts +6 -0
  60. package/dist/handlers/index.js +7 -0
  61. package/dist/handlers/process-handlers.d.ts +9 -0
  62. package/dist/handlers/process-handlers.js +15 -0
  63. package/dist/handlers/search-handlers.d.ts +17 -0
  64. package/dist/handlers/search-handlers.js +224 -0
  65. package/dist/handlers/terminal-handlers.d.ts +21 -0
  66. package/dist/handlers/terminal-handlers.js +35 -0
  67. package/dist/index.d.ts +2 -0
  68. package/dist/index.js +138 -0
  69. package/dist/mcp-device.d.ts +2 -0
  70. package/dist/mcp-device.js +7 -0
  71. package/dist/npm-scripts/remote.d.ts +3 -0
  72. package/dist/npm-scripts/remote.js +314 -0
  73. package/dist/search-manager.d.ts +147 -0
  74. package/dist/search-manager.js +828 -0
  75. package/dist/server.d.ts +46 -0
  76. package/dist/server.js +1563 -0
  77. package/dist/terminal-manager.d.ts +104 -0
  78. package/dist/terminal-manager.js +635 -0
  79. package/dist/tools/config.d.ts +96 -0
  80. package/dist/tools/config.js +260 -0
  81. package/dist/tools/edit.d.ts +38 -0
  82. package/dist/tools/edit.js +435 -0
  83. package/dist/tools/feedback.d.ts +8 -0
  84. package/dist/tools/feedback.js +132 -0
  85. package/dist/tools/filesystem.d.ts +79 -0
  86. package/dist/tools/filesystem.js +947 -0
  87. package/dist/tools/fuzzySearch.d.ts +12 -0
  88. package/dist/tools/fuzzySearch.js +74 -0
  89. package/dist/tools/fuzzySearchCore.d.ts +52 -0
  90. package/dist/tools/fuzzySearchCore.js +125 -0
  91. package/dist/tools/improved-process-tools.d.ts +24 -0
  92. package/dist/tools/improved-process-tools.js +627 -0
  93. package/dist/tools/mime-types.d.ts +3 -0
  94. package/dist/tools/mime-types.js +28 -0
  95. package/dist/tools/pdf/extract-images.d.ts +34 -0
  96. package/dist/tools/pdf/extract-images.js +132 -0
  97. package/dist/tools/pdf/index.d.ts +6 -0
  98. package/dist/tools/pdf/index.js +3 -0
  99. package/dist/tools/pdf/lib/pdf2md.d.ts +36 -0
  100. package/dist/tools/pdf/lib/pdf2md.js +76 -0
  101. package/dist/tools/pdf/manipulations.d.ts +13 -0
  102. package/dist/tools/pdf/manipulations.js +99 -0
  103. package/dist/tools/pdf/markdown.d.ts +26 -0
  104. package/dist/tools/pdf/markdown.js +275 -0
  105. package/dist/tools/pdf/utils.d.ts +12 -0
  106. package/dist/tools/pdf/utils.js +34 -0
  107. package/dist/tools/process.d.ts +3 -0
  108. package/dist/tools/process.js +56 -0
  109. package/dist/tools/prompts.d.ts +28 -0
  110. package/dist/tools/prompts.js +259 -0
  111. package/dist/tools/schemas.d.ts +454 -0
  112. package/dist/tools/schemas.js +242 -0
  113. package/dist/tools/usage.d.ts +5 -0
  114. package/dist/tools/usage.js +24 -0
  115. package/dist/types.d.ts +83 -0
  116. package/dist/types.js +1 -0
  117. package/dist/ui/config-editor/config-editor-runtime.js +150 -0
  118. package/dist/ui/config-editor/index.html +13 -0
  119. package/dist/ui/config-editor/src/app.d.ts +43 -0
  120. package/dist/ui/config-editor/src/app.js +831 -0
  121. package/dist/ui/config-editor/src/array-modal.d.ts +19 -0
  122. package/dist/ui/config-editor/src/array-modal.js +185 -0
  123. package/dist/ui/config-editor/src/main.d.ts +1 -0
  124. package/dist/ui/config-editor/src/main.js +2 -0
  125. package/dist/ui/config-editor/styles.css +587 -0
  126. package/dist/ui/contracts.d.ts +14 -0
  127. package/dist/ui/contracts.js +21 -0
  128. package/dist/ui/file-preview/index.html +16 -0
  129. package/dist/ui/file-preview/preview-runtime.js +469 -0
  130. package/dist/ui/file-preview/shared/preview-file-types.d.ts +5 -0
  131. package/dist/ui/file-preview/shared/preview-file-types.js +59 -0
  132. package/dist/ui/file-preview/src/app.d.ts +4 -0
  133. package/dist/ui/file-preview/src/app.js +680 -0
  134. package/dist/ui/file-preview/src/components/code-viewer.d.ts +6 -0
  135. package/dist/ui/file-preview/src/components/code-viewer.js +73 -0
  136. package/dist/ui/file-preview/src/components/highlighting.d.ts +2 -0
  137. package/dist/ui/file-preview/src/components/highlighting.js +54 -0
  138. package/dist/ui/file-preview/src/components/html-renderer.d.ts +5 -0
  139. package/dist/ui/file-preview/src/components/html-renderer.js +47 -0
  140. package/dist/ui/file-preview/src/components/markdown-renderer.d.ts +1 -0
  141. package/dist/ui/file-preview/src/components/markdown-renderer.js +59 -0
  142. package/dist/ui/file-preview/src/directory-controller.d.ts +8 -0
  143. package/dist/ui/file-preview/src/directory-controller.js +240 -0
  144. package/dist/ui/file-preview/src/document-layout.d.ts +20 -0
  145. package/dist/ui/file-preview/src/document-layout.js +109 -0
  146. package/dist/ui/file-preview/src/document-outline.d.ts +17 -0
  147. package/dist/ui/file-preview/src/document-outline.js +97 -0
  148. package/dist/ui/file-preview/src/document-workspace.d.ts +19 -0
  149. package/dist/ui/file-preview/src/document-workspace.js +33 -0
  150. package/dist/ui/file-preview/src/file-type-handlers.d.ts +10 -0
  151. package/dist/ui/file-preview/src/file-type-handlers.js +109 -0
  152. package/dist/ui/file-preview/src/host/external-actions.d.ts +8 -0
  153. package/dist/ui/file-preview/src/host/external-actions.js +55 -0
  154. package/dist/ui/file-preview/src/host/selection-context.d.ts +9 -0
  155. package/dist/ui/file-preview/src/host/selection-context.js +106 -0
  156. package/dist/ui/file-preview/src/image-preview.d.ts +3 -0
  157. package/dist/ui/file-preview/src/image-preview.js +21 -0
  158. package/dist/ui/file-preview/src/main.d.ts +1 -0
  159. package/dist/ui/file-preview/src/main.js +5 -0
  160. package/dist/ui/file-preview/src/markdown/conflict-dialog.d.ts +40 -0
  161. package/dist/ui/file-preview/src/markdown/conflict-dialog.js +163 -0
  162. package/dist/ui/file-preview/src/markdown/controller.d.ts +44 -0
  163. package/dist/ui/file-preview/src/markdown/controller.js +1043 -0
  164. package/dist/ui/file-preview/src/markdown/editor.d.ts +131 -0
  165. package/dist/ui/file-preview/src/markdown/editor.js +1479 -0
  166. package/dist/ui/file-preview/src/markdown/linking.d.ts +16 -0
  167. package/dist/ui/file-preview/src/markdown/linking.js +228 -0
  168. package/dist/ui/file-preview/src/markdown/outline.d.ts +2 -0
  169. package/dist/ui/file-preview/src/markdown/outline.js +16 -0
  170. package/dist/ui/file-preview/src/markdown/parser.d.ts +30 -0
  171. package/dist/ui/file-preview/src/markdown/parser.js +38 -0
  172. package/dist/ui/file-preview/src/markdown/preview.d.ts +1 -0
  173. package/dist/ui/file-preview/src/markdown/preview.js +20 -0
  174. package/dist/ui/file-preview/src/markdown/slugify.d.ts +3 -0
  175. package/dist/ui/file-preview/src/markdown/slugify.js +31 -0
  176. package/dist/ui/file-preview/src/markdown/utils.d.ts +1 -0
  177. package/dist/ui/file-preview/src/markdown/utils.js +15 -0
  178. package/dist/ui/file-preview/src/model.d.ts +35 -0
  179. package/dist/ui/file-preview/src/model.js +1 -0
  180. package/dist/ui/file-preview/src/panel-actions.d.ts +17 -0
  181. package/dist/ui/file-preview/src/panel-actions.js +182 -0
  182. package/dist/ui/file-preview/src/path-utils.d.ts +6 -0
  183. package/dist/ui/file-preview/src/path-utils.js +64 -0
  184. package/dist/ui/file-preview/src/payload-utils.d.ts +11 -0
  185. package/dist/ui/file-preview/src/payload-utils.js +119 -0
  186. package/dist/ui/file-preview/src/types.d.ts +1 -0
  187. package/dist/ui/file-preview/src/types.js +1 -0
  188. package/dist/ui/file-preview/styles.css +1631 -0
  189. package/dist/ui/resources.d.ts +28 -0
  190. package/dist/ui/resources.js +86 -0
  191. package/dist/ui/shared/compact-row.d.ts +11 -0
  192. package/dist/ui/shared/compact-row.js +18 -0
  193. package/dist/ui/shared/escape-html.d.ts +4 -0
  194. package/dist/ui/shared/escape-html.js +11 -0
  195. package/dist/ui/shared/host-context.d.ts +15 -0
  196. package/dist/ui/shared/host-context.js +51 -0
  197. package/dist/ui/shared/tool-bridge.d.ts +30 -0
  198. package/dist/ui/shared/tool-bridge.js +137 -0
  199. package/dist/ui/shared/tool-shell.d.ts +25 -0
  200. package/dist/ui/shared/tool-shell.js +107 -0
  201. package/dist/ui/shared/ui-event-tracker.d.ts +9 -0
  202. package/dist/ui/shared/ui-event-tracker.js +27 -0
  203. package/dist/ui/shared/widget-state.d.ts +33 -0
  204. package/dist/ui/shared/widget-state.js +158 -0
  205. package/dist/utils/ab-test.d.ts +12 -0
  206. package/dist/utils/ab-test.js +104 -0
  207. package/dist/utils/capture.d.ts +35 -0
  208. package/dist/utils/capture.js +481 -0
  209. package/dist/utils/dockerPrompt.d.ts +17 -0
  210. package/dist/utils/dockerPrompt.js +53 -0
  211. package/dist/utils/feature-flags.d.ts +59 -0
  212. package/dist/utils/feature-flags.js +215 -0
  213. package/dist/utils/files/base.d.ts +173 -0
  214. package/dist/utils/files/base.js +5 -0
  215. package/dist/utils/files/binary.d.ts +21 -0
  216. package/dist/utils/files/binary.js +65 -0
  217. package/dist/utils/files/docx.d.ts +47 -0
  218. package/dist/utils/files/docx.js +679 -0
  219. package/dist/utils/files/excel.d.ts +24 -0
  220. package/dist/utils/files/excel.js +437 -0
  221. package/dist/utils/files/factory.d.ts +41 -0
  222. package/dist/utils/files/factory.js +113 -0
  223. package/dist/utils/files/image.d.ts +21 -0
  224. package/dist/utils/files/image.js +78 -0
  225. package/dist/utils/files/index.d.ts +10 -0
  226. package/dist/utils/files/index.js +13 -0
  227. package/dist/utils/files/pdf.d.ts +32 -0
  228. package/dist/utils/files/pdf.js +142 -0
  229. package/dist/utils/files/text.d.ts +63 -0
  230. package/dist/utils/files/text.js +370 -0
  231. package/dist/utils/fuzzySearchLogger.d.ts +30 -0
  232. package/dist/utils/fuzzySearchLogger.js +126 -0
  233. package/dist/utils/lineEndingHandler.d.ts +21 -0
  234. package/dist/utils/lineEndingHandler.js +77 -0
  235. package/dist/utils/logger.d.ts +32 -0
  236. package/dist/utils/logger.js +72 -0
  237. package/dist/utils/mcp-ui-ab-test.d.ts +13 -0
  238. package/dist/utils/mcp-ui-ab-test.js +62 -0
  239. package/dist/utils/open-browser.d.ts +9 -0
  240. package/dist/utils/open-browser.js +42 -0
  241. package/dist/utils/process-detection.d.ts +23 -0
  242. package/dist/utils/process-detection.js +150 -0
  243. package/dist/utils/ripgrep-resolver.d.ts +9 -0
  244. package/dist/utils/ripgrep-resolver.js +74 -0
  245. package/dist/utils/system-info.d.ts +71 -0
  246. package/dist/utils/system-info.js +712 -0
  247. package/dist/utils/toolHistory.d.ts +86 -0
  248. package/dist/utils/toolHistory.js +257 -0
  249. package/dist/utils/trackTools.d.ts +6 -0
  250. package/dist/utils/trackTools.js +54 -0
  251. package/dist/utils/unsupportedParams.d.ts +24 -0
  252. package/dist/utils/unsupportedParams.js +66 -0
  253. package/dist/utils/usageTracker.d.ts +133 -0
  254. package/dist/utils/usageTracker.js +477 -0
  255. package/dist/utils/welcome-onboarding.d.ts +11 -0
  256. package/dist/utils/welcome-onboarding.js +99 -0
  257. package/dist/utils/withTimeout.d.ts +28 -0
  258. package/dist/utils/withTimeout.js +85 -0
  259. package/dist/version.d.ts +1 -0
  260. package/dist/version.js +1 -0
  261. package/package.json +131 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * The "file changed on disk" conflict resolver.
3
+ *
4
+ * Shown when saveDocument detected that disk differs from what the editor
5
+ * thought it had. The editor has already re-synced its sourceContent to the
6
+ * fresh disk content with keepDraft: true — so the dialog's two actions map
7
+ * onto concrete state transitions:
8
+ *
9
+ * "Use disk version" — replace the draft with disk content
10
+ * (syncStateFromContent without keepDraft).
11
+ * Destroys unsaved edits.
12
+ *
13
+ * "Save my changes" — close the dialog and re-run saveDocument.
14
+ * computeEditBlocks will now diff against the fresh
15
+ * disk content, so non-overlapping edits merge in
16
+ * and overlapping edits win over disk for the
17
+ * lines the user actually touched.
18
+ *
19
+ * The dialog is modal (dimmed backdrop, keyboard-trapped, click-outside does
20
+ * not dismiss). Escape and the ✕ button both close it without taking either
21
+ * action — equivalent to "I'll deal with this later"; the save button stays
22
+ * dirty so the user can retry or keep editing.
23
+ */
24
+ export function renderConflictDialogMarkup() {
25
+ return `
26
+ <div class="md-conflict-modal" id="md-conflict-modal" role="dialog" aria-modal="true" aria-labelledby="md-conflict-title" aria-describedby="md-conflict-body" hidden>
27
+ <div class="md-conflict-card">
28
+ <header class="md-conflict-header">
29
+ <h3 id="md-conflict-title">⚠ This file changed on disk</h3>
30
+ <button type="button" class="md-conflict-close" id="md-conflict-close" aria-label="Close">
31
+ <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
32
+ <path d="M7 7l10 10M17 7L7 17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
33
+ </svg>
34
+ </button>
35
+ </header>
36
+ <div class="md-conflict-body" id="md-conflict-body">
37
+ <p>
38
+ Something else modified
39
+ <strong class="md-conflict-filename" id="md-conflict-filename"></strong>
40
+ while you were editing. Your unsaved edits are preserved.
41
+ </p>
42
+ <p>If you save now:</p>
43
+ <ul>
44
+ <li>Changes you made to lines the external edit didn't touch will be saved alongside the external changes.</li>
45
+ <li>Changes you made to lines that also changed externally will overwrite the external version on those lines.</li>
46
+ </ul>
47
+ </div>
48
+ <footer class="md-conflict-footer">
49
+ <button type="button" class="md-conflict-btn md-conflict-btn--secondary" id="md-conflict-use-disk">
50
+ Use disk version
51
+ </button>
52
+ <button type="button" class="md-conflict-btn md-conflict-btn--primary" id="md-conflict-save-mine">
53
+ Save my changes
54
+ </button>
55
+ </footer>
56
+ </div>
57
+ </div>
58
+ `;
59
+ }
60
+ export function createConflictDialogController(options) {
61
+ const { container } = options;
62
+ const modal = container.querySelector('#md-conflict-modal');
63
+ const filenameEl = container.querySelector('#md-conflict-filename');
64
+ const useDiskBtn = container.querySelector('#md-conflict-use-disk');
65
+ const saveMineBtn = container.querySelector('#md-conflict-save-mine');
66
+ const closeBtn = container.querySelector('#md-conflict-close');
67
+ let currentOptions = null;
68
+ let previousActiveElement = null;
69
+ const close = () => {
70
+ if (!modal || modal.hidden) {
71
+ return;
72
+ }
73
+ modal.hidden = true;
74
+ document.removeEventListener('keydown', handleKeyDown, true);
75
+ modal.removeEventListener('click', handleBackdropClick);
76
+ const cancel = currentOptions?.onCancel;
77
+ currentOptions = null;
78
+ // Restore focus to whatever the user was on before the dialog opened.
79
+ if (previousActiveElement && document.contains(previousActiveElement)) {
80
+ try {
81
+ previousActiveElement.focus();
82
+ }
83
+ catch {
84
+ /* focus can throw on removed nodes — ignore */
85
+ }
86
+ }
87
+ previousActiveElement = null;
88
+ cancel?.();
89
+ };
90
+ const handleKeyDown = (event) => {
91
+ if (!modal || modal.hidden) {
92
+ return;
93
+ }
94
+ if (event.key === 'Escape') {
95
+ event.stopPropagation();
96
+ event.preventDefault();
97
+ close();
98
+ return;
99
+ }
100
+ if (event.key === 'Tab') {
101
+ // Minimal focus trap between the three buttons.
102
+ const focusable = [useDiskBtn, saveMineBtn, closeBtn].filter((el) => !!el);
103
+ if (focusable.length === 0)
104
+ return;
105
+ const active = document.activeElement;
106
+ const currentIndex = active ? focusable.indexOf(active) : -1;
107
+ const direction = event.shiftKey ? -1 : 1;
108
+ const nextIndex = currentIndex === -1
109
+ ? (direction === 1 ? 0 : focusable.length - 1)
110
+ : (currentIndex + direction + focusable.length) % focusable.length;
111
+ event.preventDefault();
112
+ focusable[nextIndex].focus();
113
+ }
114
+ };
115
+ const handleBackdropClick = (event) => {
116
+ // Click on the dimmed backdrop (the modal element itself, not the card)
117
+ // is deliberately not a dismiss — the user must make a choice or hit ✕.
118
+ if (event.target === modal) {
119
+ event.stopPropagation();
120
+ }
121
+ };
122
+ const handleUseDisk = () => {
123
+ const cb = currentOptions?.onUseDiskVersion;
124
+ // Clear currentOptions first so close() doesn't also fire onCancel.
125
+ currentOptions = null;
126
+ close();
127
+ cb?.();
128
+ };
129
+ const handleSaveMine = () => {
130
+ const cb = currentOptions?.onSaveMyChanges;
131
+ currentOptions = null;
132
+ close();
133
+ cb?.();
134
+ };
135
+ useDiskBtn?.addEventListener('click', handleUseDisk);
136
+ saveMineBtn?.addEventListener('click', handleSaveMine);
137
+ closeBtn?.addEventListener('click', close);
138
+ return {
139
+ open: (options) => {
140
+ if (!modal) {
141
+ // No-op if the markup wasn't injected — fall back to cancel callback
142
+ // so the editor can still notify the user via the inline path.
143
+ options.onCancel?.();
144
+ return;
145
+ }
146
+ currentOptions = options;
147
+ if (filenameEl) {
148
+ filenameEl.textContent = options.fileName;
149
+ }
150
+ previousActiveElement = document.activeElement ?? null;
151
+ modal.hidden = false;
152
+ document.addEventListener('keydown', handleKeyDown, true);
153
+ modal.addEventListener('click', handleBackdropClick);
154
+ // Default focus goes to the safer action ("Save my changes" is the
155
+ // non-destructive intent — it doesn't discard the user's draft).
156
+ window.requestAnimationFrame(() => {
157
+ saveMineBtn?.focus();
158
+ });
159
+ },
160
+ close,
161
+ isOpen: () => !!modal && !modal.hidden,
162
+ };
163
+ }
@@ -0,0 +1,44 @@
1
+ import type { MarkdownWorkspaceState, RenderBodyResult, RenderPayload } from '../model.js';
2
+ import { type MarkdownEditRange, type MarkdownEditorView } from './editor.js';
3
+ import type { OpenConflictDialogOptions } from './conflict-dialog.js';
4
+ export interface MarkdownControllerDependencies {
5
+ callTool?: (name: string, args: Record<string, unknown>) => Promise<unknown | undefined>;
6
+ openExternalLink?: (url: string) => Promise<boolean | undefined>;
7
+ requestDisplayMode?: (mode: 'inline' | 'fullscreen') => Promise<string | null | undefined>;
8
+ getAvailableDisplayModes: () => string[];
9
+ getCurrentDisplayMode: () => string | null;
10
+ getCurrentPayload: () => RenderPayload | undefined;
11
+ setExpanded: (expanded: boolean) => void;
12
+ syncPayload?: (payload?: RenderPayload) => void;
13
+ storePayloadOverride: (payload: RenderPayload) => void;
14
+ rerender: () => void;
15
+ updateSaveStatus: (label: string, statusClass: string) => void;
16
+ trackUiEvent?: (event: string, params?: Record<string, unknown>) => void;
17
+ showConflictDialog?: (options: OpenConflictDialogOptions) => void;
18
+ }
19
+ interface EditBlock {
20
+ old_string: string;
21
+ new_string: string;
22
+ }
23
+ export declare function computeEditBlocks(oldText: string, newText: string, changedRanges?: MarkdownEditRange[]): EditBlock[];
24
+ export declare function createMarkdownController(dependencies: MarkdownControllerDependencies): {
25
+ attachHandlers: (payload: RenderPayload) => void;
26
+ buildBody: (payload: RenderPayload) => RenderBodyResult;
27
+ clear: () => void;
28
+ disposeHandles: () => void;
29
+ ensureCompletePayload: (payload: RenderPayload) => Promise<RenderPayload>;
30
+ getCopyText: (payload: RenderPayload) => string | null;
31
+ getState: (payload: RenderPayload) => MarkdownWorkspaceState;
32
+ handleInlineExitFromFullscreen: (originalPayload?: RenderPayload) => Promise<RenderPayload | undefined>;
33
+ isUndoAvailable: (state: MarkdownWorkspaceState) => boolean;
34
+ readCompletePayload: (filePath: string) => Promise<RenderPayload | null>;
35
+ readPayload: (filePath: string, length?: number, offset?: number) => Promise<RenderPayload | null>;
36
+ readPayloadContent: (payload: RenderPayload) => string;
37
+ refreshFromDisk: (payload: RenderPayload) => Promise<void>;
38
+ requestEditMode: (payload: RenderPayload) => Promise<void>;
39
+ requestFullscreen: () => Promise<boolean>;
40
+ saveDocument: () => Promise<void>;
41
+ setEditorView: (payload: RenderPayload, view: MarkdownEditorView) => void;
42
+ };
43
+ export type MarkdownController = ReturnType<typeof createMarkdownController>;
44
+ export {};