@inhuman.tools/harness-tui 0.0.0-bootstrap.0 → 0.2.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 (167) hide show
  1. package/LICENSE.md +7 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/interpreter/ComputedExecBox.d.ts +12 -0
  7. package/dist/interpreter/ComputedExecBox.d.ts.map +1 -0
  8. package/dist/interpreter/ComputedExecBox.js +88 -0
  9. package/dist/interpreter/ComputedExecBox.js.map +1 -0
  10. package/dist/interpreter/imageCapability.d.ts +9 -0
  11. package/dist/interpreter/imageCapability.d.ts.map +1 -0
  12. package/dist/interpreter/imageCapability.js +49 -0
  13. package/dist/interpreter/imageCapability.js.map +1 -0
  14. package/dist/interpreter/rpcCapability.d.ts +11 -0
  15. package/dist/interpreter/rpcCapability.d.ts.map +1 -0
  16. package/dist/interpreter/rpcCapability.js +91 -0
  17. package/dist/interpreter/rpcCapability.js.map +1 -0
  18. package/dist/interpreter/uiCapability.d.ts +34 -0
  19. package/dist/interpreter/uiCapability.d.ts.map +1 -0
  20. package/dist/interpreter/uiCapability.js +207 -0
  21. package/dist/interpreter/uiCapability.js.map +1 -0
  22. package/dist/schemas/index.d.ts +2 -0
  23. package/dist/schemas/index.d.ts.map +1 -0
  24. package/dist/schemas/index.js +2 -0
  25. package/dist/schemas/index.js.map +1 -0
  26. package/dist/schemas/worker-boot.d.ts +14 -0
  27. package/dist/schemas/worker-boot.d.ts.map +1 -0
  28. package/dist/schemas/worker-boot.js +15 -0
  29. package/dist/schemas/worker-boot.js.map +1 -0
  30. package/dist/tui/ack-prompt.d.ts +53 -0
  31. package/dist/tui/ack-prompt.d.ts.map +1 -0
  32. package/dist/tui/ack-prompt.js +61 -0
  33. package/dist/tui/ack-prompt.js.map +1 -0
  34. package/dist/tui/agents-drawer.d.ts +47 -0
  35. package/dist/tui/agents-drawer.d.ts.map +1 -0
  36. package/dist/tui/agents-drawer.js +314 -0
  37. package/dist/tui/agents-drawer.js.map +1 -0
  38. package/dist/tui/ask-shortcuts.d.ts +59 -0
  39. package/dist/tui/ask-shortcuts.d.ts.map +1 -0
  40. package/dist/tui/ask-shortcuts.js +96 -0
  41. package/dist/tui/ask-shortcuts.js.map +1 -0
  42. package/dist/tui/channel.d.ts +59 -0
  43. package/dist/tui/channel.d.ts.map +1 -0
  44. package/dist/tui/channel.js +27 -0
  45. package/dist/tui/channel.js.map +1 -0
  46. package/dist/tui/host-verbs.d.ts +7 -0
  47. package/dist/tui/host-verbs.d.ts.map +1 -0
  48. package/dist/tui/host-verbs.js +19 -0
  49. package/dist/tui/host-verbs.js.map +1 -0
  50. package/dist/tui/host.d.ts +25 -0
  51. package/dist/tui/host.d.ts.map +1 -0
  52. package/dist/tui/host.js +380 -0
  53. package/dist/tui/host.js.map +1 -0
  54. package/dist/tui/omnibox-seat.d.ts +132 -0
  55. package/dist/tui/omnibox-seat.d.ts.map +1 -0
  56. package/dist/tui/omnibox-seat.js +182 -0
  57. package/dist/tui/omnibox-seat.js.map +1 -0
  58. package/dist/tui/paint-controller.d.ts +170 -0
  59. package/dist/tui/paint-controller.d.ts.map +1 -0
  60. package/dist/tui/paint-controller.js +965 -0
  61. package/dist/tui/paint-controller.js.map +1 -0
  62. package/dist/tui/paint-dom.d.ts +336 -0
  63. package/dist/tui/paint-dom.d.ts.map +1 -0
  64. package/dist/tui/paint-dom.js +709 -0
  65. package/dist/tui/paint-dom.js.map +1 -0
  66. package/dist/tui/paint-source.d.ts +57 -0
  67. package/dist/tui/paint-source.d.ts.map +1 -0
  68. package/dist/tui/paint-source.js +570 -0
  69. package/dist/tui/paint-source.js.map +1 -0
  70. package/dist/tui/paint-transport.d.ts +42 -0
  71. package/dist/tui/paint-transport.d.ts.map +1 -0
  72. package/dist/tui/paint-transport.js +207 -0
  73. package/dist/tui/paint-transport.js.map +1 -0
  74. package/dist/tui/paint-types.d.ts +15 -0
  75. package/dist/tui/paint-types.d.ts.map +1 -0
  76. package/dist/tui/paint-types.js +6 -0
  77. package/dist/tui/paint-types.js.map +1 -0
  78. package/dist/tui/paint-widgets.d.ts +94 -0
  79. package/dist/tui/paint-widgets.d.ts.map +1 -0
  80. package/dist/tui/paint-widgets.js +877 -0
  81. package/dist/tui/paint-widgets.js.map +1 -0
  82. package/dist/tui/parse-args.d.ts +3 -0
  83. package/dist/tui/parse-args.d.ts.map +1 -0
  84. package/dist/tui/parse-args.js +13 -0
  85. package/dist/tui/parse-args.js.map +1 -0
  86. package/dist/tui/permissions-view.d.ts +93 -0
  87. package/dist/tui/permissions-view.d.ts.map +1 -0
  88. package/dist/tui/permissions-view.js +174 -0
  89. package/dist/tui/permissions-view.js.map +1 -0
  90. package/dist/tui/present-visual/approve.d.ts +10 -0
  91. package/dist/tui/present-visual/approve.d.ts.map +1 -0
  92. package/dist/tui/present-visual/approve.js +156 -0
  93. package/dist/tui/present-visual/approve.js.map +1 -0
  94. package/dist/tui/present-visual/dump.d.ts +47 -0
  95. package/dist/tui/present-visual/dump.d.ts.map +1 -0
  96. package/dist/tui/present-visual/dump.js +144 -0
  97. package/dist/tui/present-visual/dump.js.map +1 -0
  98. package/dist/tui/present-visual/journey-teardown.d.ts +3 -0
  99. package/dist/tui/present-visual/journey-teardown.d.ts.map +1 -0
  100. package/dist/tui/present-visual/journey-teardown.js +188 -0
  101. package/dist/tui/present-visual/journey-teardown.js.map +1 -0
  102. package/dist/tui/present-visual/journey.d.ts +15 -0
  103. package/dist/tui/present-visual/journey.d.ts.map +1 -0
  104. package/dist/tui/present-visual/journey.js +88 -0
  105. package/dist/tui/present-visual/journey.js.map +1 -0
  106. package/dist/tui/present-visual/raster.d.ts +3 -0
  107. package/dist/tui/present-visual/raster.d.ts.map +1 -0
  108. package/dist/tui/present-visual/raster.js +75 -0
  109. package/dist/tui/present-visual/raster.js.map +1 -0
  110. package/dist/tui/queue-shortcuts.d.ts +13 -0
  111. package/dist/tui/queue-shortcuts.d.ts.map +1 -0
  112. package/dist/tui/queue-shortcuts.js +23 -0
  113. package/dist/tui/queue-shortcuts.js.map +1 -0
  114. package/dist/tui/read-widen.d.ts +14 -0
  115. package/dist/tui/read-widen.d.ts.map +1 -0
  116. package/dist/tui/read-widen.js +45 -0
  117. package/dist/tui/read-widen.js.map +1 -0
  118. package/dist/tui/rewind-chrome.d.ts +29 -0
  119. package/dist/tui/rewind-chrome.d.ts.map +1 -0
  120. package/dist/tui/rewind-chrome.js +77 -0
  121. package/dist/tui/rewind-chrome.js.map +1 -0
  122. package/dist/tui/rust-present.d.ts +37 -0
  123. package/dist/tui/rust-present.d.ts.map +1 -0
  124. package/dist/tui/rust-present.js +205 -0
  125. package/dist/tui/rust-present.js.map +1 -0
  126. package/dist/tui/spinner-phase.d.ts +24 -0
  127. package/dist/tui/spinner-phase.d.ts.map +1 -0
  128. package/dist/tui/spinner-phase.js +25 -0
  129. package/dist/tui/spinner-phase.js.map +1 -0
  130. package/dist/tui/statusline-path.d.ts +10 -0
  131. package/dist/tui/statusline-path.d.ts.map +1 -0
  132. package/dist/tui/statusline-path.js +42 -0
  133. package/dist/tui/statusline-path.js.map +1 -0
  134. package/dist/tui/sugarcoat-paint.d.ts +14 -0
  135. package/dist/tui/sugarcoat-paint.d.ts.map +1 -0
  136. package/dist/tui/sugarcoat-paint.js +146 -0
  137. package/dist/tui/sugarcoat-paint.js.map +1 -0
  138. package/dist/tui/tape-spans.d.ts +64 -0
  139. package/dist/tui/tape-spans.d.ts.map +1 -0
  140. package/dist/tui/tape-spans.js +93 -0
  141. package/dist/tui/tape-spans.js.map +1 -0
  142. package/dist/tui/tea.d.ts +75 -0
  143. package/dist/tui/tea.d.ts.map +1 -0
  144. package/dist/tui/tea.js +2952 -0
  145. package/dist/tui/tea.js.map +1 -0
  146. package/dist/tui/vt-paint.d.ts +12 -0
  147. package/dist/tui/vt-paint.d.ts.map +1 -0
  148. package/dist/tui/vt-paint.js +123 -0
  149. package/dist/tui/vt-paint.js.map +1 -0
  150. package/dist/tui/wait-phrase.d.ts +31 -0
  151. package/dist/tui/wait-phrase.d.ts.map +1 -0
  152. package/dist/tui/wait-phrase.js +26 -0
  153. package/dist/tui/wait-phrase.js.map +1 -0
  154. package/dist/tui/widget-host.d.ts +34 -0
  155. package/dist/tui/widget-host.d.ts.map +1 -0
  156. package/dist/tui/widget-host.js +80 -0
  157. package/dist/tui/widget-host.js.map +1 -0
  158. package/dist/tui/work-cells.d.ts +47 -0
  159. package/dist/tui/work-cells.d.ts.map +1 -0
  160. package/dist/tui/work-cells.js +606 -0
  161. package/dist/tui/work-cells.js.map +1 -0
  162. package/dist/tui/worker-entry.d.ts +2 -0
  163. package/dist/tui/worker-entry.d.ts.map +1 -0
  164. package/dist/tui/worker-entry.js +98 -0
  165. package/dist/tui/worker-entry.js.map +1 -0
  166. package/package.json +84 -4
  167. package/README.md +0 -1
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Extra-root read folder suggestion, as an explicit question: "Treat <folder> as part of this session?"
3
+ * One directory up, offered, never installed. Evidence is a same-parent sibling (an existing session
4
+ * root or an in-flight read). Disjoint trees stay a set — this is not LCA. A yes adds a session read
5
+ * root (`SessionRoot.addReadRoot`): reads under it follow the in-workspace rules, and block rules
6
+ * still block. A single outside read is never remembered, and writes are never a root.
7
+ */
8
+ import { workspaceRelative } from "@inhuman.tools/harness-model";
9
+ const HOME_TOP = new Set(["Users", "home", "Volumes", "private"]);
10
+ /** One directory up. Undefined at `.` / `/` / `$HOME` / a volume root. */
11
+ export function fileReadParent(prepared) {
12
+ if (prepared === "." || prepared === "/" || prepared === "")
13
+ return undefined;
14
+ const cut = prepared.lastIndexOf("/");
15
+ if (cut <= 0)
16
+ return undefined;
17
+ const parent = prepared.slice(0, cut);
18
+ if (parent === "/" || parent === "" || !parent.startsWith("/"))
19
+ return undefined;
20
+ const segs = parent.split("/").filter(Boolean);
21
+ if (segs.length < 2)
22
+ return undefined;
23
+ if (segs.length === 2 && HOME_TOP.has(segs[0]))
24
+ return undefined;
25
+ return parent;
26
+ }
27
+ export function fileReadWidenLabel(rootPath, parent) {
28
+ const rel = workspaceRelative(rootPath, parent);
29
+ return rel.length > 0 && rel.length < parent.length ? rel : parent;
30
+ }
31
+ /**
32
+ * Suggest `parent(prepared)` when another observed extra-root read shares
33
+ * that parent (or *is* that parent). `observed` is allowlist keys plus
34
+ * other in-flight read paths — not denials.
35
+ */
36
+ export function fileReadWiden(rootPath, prepared, observed) {
37
+ const parent = fileReadParent(prepared);
38
+ if (parent === undefined)
39
+ return undefined;
40
+ const sibling = observed.some((path) => path !== prepared && (path === parent || fileReadParent(path) === parent));
41
+ if (!sibling)
42
+ return undefined;
43
+ return { path: parent, label: fileReadWidenLabel(rootPath, parent) };
44
+ }
45
+ //# sourceMappingURL=read-widen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-widen.js","sourceRoot":"","sources":["../../src/tui/read-widen.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAOlE,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACjF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,MAAc;IACjE,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,QAAgB,EAChB,QAA2B;IAE3B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;IACnH,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Neighbor prompt stacks and the 2-deep edge budget. Layout nodes only —
3
+ * Tea owns the pin list; assemble seats them.
4
+ */
5
+ import { type LayoutNode } from "@inhuman.tools/quickdraw/layout";
6
+ export type RewindNeighbor = {
7
+ readonly key: string;
8
+ readonly text: string;
9
+ };
10
+ export type RewindNeighborEdge = {
11
+ readonly side: "behind" | "ahead";
12
+ /** Quickdraw T-join past the 2-deep window. */
13
+ readonly moreOuter: boolean;
14
+ };
15
+ export declare function rewindNeighborSlots(aheadCount: number, behindCount: number): {
16
+ readonly ahead: number;
17
+ readonly behind: number;
18
+ };
19
+ export declare function compactPinDraft(prompt: string): string;
20
+ /** Chrome stack: first frame 3 rows, each extra omitTop frame 2. */
21
+ export declare function neighborColumnHeight(n: number): number;
22
+ /** Past flex kept before neighbor rows are dropped. */
23
+ export declare const REWIND_MIN_TAPE_ROWS = 4;
24
+ export declare function dropOldestPastThenFarthestFuture(past: readonly RewindNeighbor[], future: readonly RewindNeighbor[], maxHeight: number): {
25
+ past: RewindNeighbor[];
26
+ future: RewindNeighbor[];
27
+ };
28
+ export declare function prepareRewindNeighbors(rows: readonly RewindNeighbor[], width: number, key: string, edge: RewindNeighborEdge): LayoutNode | null;
29
+ //# sourceMappingURL=rewind-chrome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-chrome.d.ts","sourceRoot":"","sources":["../../src/tui/rewind-chrome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG1F,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKrD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,SAAS,cAAc,EAAE,EAC/B,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,SAAS,EAAE,MAAM,GAChB;IAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,CAUtD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,cAAc,EAAE,EAC/B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,GACvB,UAAU,GAAG,IAAI,CAuCnB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Neighbor prompt stacks and the 2-deep edge budget. Layout nodes only —
3
+ * Tea owns the pin list; assemble seats them.
4
+ */
5
+ import { chromeFrameTotalHeight } from "@inhuman.tools/quickdraw/layout";
6
+ import { ComposerFrame } from "@inhuman.tools/quickdraw/widgets";
7
+ export function rewindNeighborSlots(aheadCount, behindCount) {
8
+ return {
9
+ ahead: Math.min(2, Math.max(0, aheadCount)),
10
+ behind: Math.min(2, Math.max(0, behindCount)),
11
+ };
12
+ }
13
+ export function compactPinDraft(prompt) {
14
+ const first = (prompt.split("\n")[0] ?? "").replaceAll(/\s+/g, " ").trim();
15
+ return prompt.includes("\n") ? `${first}…` : first;
16
+ }
17
+ /** Chrome stack: first frame 3 rows, each extra omitTop frame 2. */
18
+ export function neighborColumnHeight(n) {
19
+ if (n <= 0)
20
+ return 0;
21
+ return chromeFrameTotalHeight(1) + (n - 1) * chromeFrameTotalHeight(1, { omitTop: true });
22
+ }
23
+ /** Past flex kept before neighbor rows are dropped. */
24
+ export const REWIND_MIN_TAPE_ROWS = 4;
25
+ export function dropOldestPastThenFarthestFuture(past, future, maxHeight) {
26
+ const budget = Math.max(0, Math.floor(maxHeight));
27
+ let behind = [...past];
28
+ let ahead = [...future];
29
+ while (neighborColumnHeight(behind.length) + neighborColumnHeight(ahead.length) > budget) {
30
+ if (behind.length > 0)
31
+ behind = behind.slice(1);
32
+ else if (ahead.length > 0)
33
+ ahead = ahead.slice(0, -1);
34
+ else
35
+ break;
36
+ }
37
+ return { past: behind, future: ahead };
38
+ }
39
+ export function prepareRewindNeighbors(rows, width, key, edge) {
40
+ if (rows.length === 0)
41
+ return null;
42
+ const n = rows.length;
43
+ return {
44
+ type: "flex",
45
+ regionProminence: 0.45,
46
+ key,
47
+ style: { direction: "column", gap: 0, width },
48
+ children: rows.map((row, i) => {
49
+ const first = i === 0;
50
+ const last = i === n - 1;
51
+ const omitTop = !first;
52
+ const joinTop = first && edge.side === "behind" && edge.moreOuter;
53
+ const joinBottom = edge.side === "behind" ? !last : !last || edge.moreOuter;
54
+ return {
55
+ type: "box",
56
+ key: row.key,
57
+ intent: "activate",
58
+ userSelect: "none",
59
+ children: [
60
+ ComposerFrame({
61
+ inputValue: compactPinDraft(row.text),
62
+ interactive: false,
63
+ readOnly: true,
64
+ }, {
65
+ key: `${row.key}:chrome`,
66
+ width,
67
+ omitTop,
68
+ joinTop,
69
+ joinBottom,
70
+ plainBottom: true,
71
+ }),
72
+ ],
73
+ };
74
+ }),
75
+ };
76
+ }
77
+ //# sourceMappingURL=rewind-chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewind-chrome.js","sourceRoot":"","sources":["../../src/tui/rewind-chrome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Writable } from "node:stream";
2
+ import type { BoxBusUpMessage } from "@inhuman.tools/quickdraw/runtime";
3
+ import type { PaintDownMessage } from "./paint-transport.js";
4
+ export declare function qdPackageName(platform: string, arch: string): string;
5
+ export declare function resolveQdBinary(opts: {
6
+ platform: string;
7
+ arch: string;
8
+ devBinary: string;
9
+ resolvePackageJson: (spec: string) => string;
10
+ exists: (file: string) => boolean;
11
+ executable: (file: string) => boolean;
12
+ }): string;
13
+ export type RustPresent = {
14
+ writeDown(message: PaintDownMessage | {
15
+ kind: "title";
16
+ text: string;
17
+ } | {
18
+ kind: "phase";
19
+ text: string;
20
+ } | {
21
+ kind: "shutdown";
22
+ }): void;
23
+ geometry(): {
24
+ cols: number;
25
+ rows: number;
26
+ };
27
+ /** Shutdown frame, then wait. `SIGTERM` only if the child does not exit. */
28
+ restore(): Promise<void>;
29
+ };
30
+ export declare function qdBinary(): string;
31
+ export declare function startRustPresent(opts: {
32
+ stderr: Writable;
33
+ onUp(message: BoxBusUpMessage): void;
34
+ onQuit(): void;
35
+ onFailed(reason: string): void;
36
+ }): RustPresent;
37
+ //# sourceMappingURL=rust-present.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-present.d.ts","sourceRoot":"","sources":["../../src/tui/rust-present.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQ7D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpE;AAWD,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACvC,GAAG,MAAM,CAcT;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CACP,OAAO,EACL,gBAAgB,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAC5G,IAAI,CAAC;IACR,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAAC;AAEF,wBAAgB,QAAQ,IAAI,MAAM,CAUjC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,GAAG,WAAW,CA8Ed"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * The Rust process owns the terminal. This file is the pipe.
3
+ *
4
+ * Child stdin is length-prefixed frames (paint_init, paint_patch, title,
5
+ * phase, shutdown). Child stdout is length-prefixed frames back (input_events,
6
+ * resize, activate, quit, failed). The child opens `/dev/tty` itself.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import { accessSync, constants, existsSync } from "node:fs";
10
+ import { createRequire } from "node:module";
11
+ import path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ const FRAME_CAP = 32 * 1024 * 1024;
14
+ /** Long enough for one poll and the destructor. Then `SIGTERM`, then `SIGKILL`. */
15
+ const SHUTDOWN_GRACE_MS = 1000;
16
+ const require = createRequire(import.meta.url);
17
+ const CARGO_BUILD = "cargo build --release --manifest-path packages/quickdraw/rust/qd/Cargo.toml";
18
+ export function qdPackageName(platform, arch) {
19
+ return `@inhuman.tools/qd-${platform}-${arch}`;
20
+ }
21
+ function canExecute(file) {
22
+ try {
23
+ accessSync(file, constants.X_OK);
24
+ return true;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ export function resolveQdBinary(opts) {
31
+ const pkg = qdPackageName(opts.platform, opts.arch);
32
+ try {
33
+ // The name is built at runtime so the boundary checker does not see a static import.
34
+ const manifest = opts.resolvePackageJson(`${pkg}/package.json`);
35
+ const binary = path.join(path.dirname(manifest), "qd");
36
+ if (opts.exists(binary) && opts.executable(binary))
37
+ return binary;
38
+ }
39
+ catch {
40
+ // This platform's optional package is not installed.
41
+ }
42
+ if (opts.exists(opts.devBinary) && opts.executable(opts.devBinary))
43
+ return opts.devBinary;
44
+ throw new Error(`qd binary missing for ${opts.platform}-${opts.arch}. Expected ${pkg} or ${opts.devBinary}. Build it with ${CARGO_BUILD}`);
45
+ }
46
+ export function qdBinary() {
47
+ const here = path.dirname(fileURLToPath(import.meta.url));
48
+ return resolveQdBinary({
49
+ platform: process.platform,
50
+ arch: process.arch,
51
+ devBinary: path.resolve(here, "../../../quickdraw/rust/qd/target/release/qd"),
52
+ resolvePackageJson: (spec) => require.resolve(spec),
53
+ exists: existsSync,
54
+ executable: canExecute,
55
+ });
56
+ }
57
+ export function startRustPresent(opts) {
58
+ const held = holdWrites(opts.stderr);
59
+ const child = spawn(qdBinary(), [], {
60
+ stdio: ["pipe", "pipe", "inherit"],
61
+ });
62
+ const input = child.stdin;
63
+ const output = child.stdout;
64
+ if (input == null || output == null) {
65
+ throw new Error("qd stdio pipes were not created");
66
+ }
67
+ let cols = 80;
68
+ let rows = 24;
69
+ let restoring = null;
70
+ const pending = { buf: Buffer.alloc(0) };
71
+ output.on("data", (chunk) => {
72
+ pending.buf = Buffer.concat([pending.buf, chunk]);
73
+ for (;;) {
74
+ if (pending.buf.length < 4)
75
+ return;
76
+ const len = pending.buf.readUInt32LE(0);
77
+ if (len > FRAME_CAP) {
78
+ opts.onFailed("qd frame too large");
79
+ return;
80
+ }
81
+ if (pending.buf.length < 4 + len)
82
+ return;
83
+ const payload = pending.buf.subarray(4, 4 + len);
84
+ pending.buf = pending.buf.subarray(4 + len);
85
+ let message;
86
+ try {
87
+ message = JSON.parse(payload.toString("utf8"));
88
+ }
89
+ catch (error) {
90
+ opts.onFailed(error instanceof Error ? error.message : "qd frame");
91
+ return;
92
+ }
93
+ if (message.kind === "resize" && message.cols != null && message.rows != null) {
94
+ cols = message.cols;
95
+ rows = message.rows;
96
+ }
97
+ if (message.kind === "quit") {
98
+ opts.onQuit();
99
+ return;
100
+ }
101
+ if (message.kind === "failed") {
102
+ opts.onFailed(message.reason ?? "qd failed");
103
+ return;
104
+ }
105
+ if (message.kind === "input_events" ||
106
+ message.kind === "resize" ||
107
+ message.kind === "activate" ||
108
+ message.kind === "picker_activate" ||
109
+ message.kind === "picker_scroll" ||
110
+ message.kind === "agents_scroll" ||
111
+ message.kind === "agents_focus" ||
112
+ message.kind === "agents_hover" ||
113
+ message.kind === "submit") {
114
+ opts.onUp(message);
115
+ }
116
+ }
117
+ });
118
+ child.on("error", (error) => opts.onFailed(error.message));
119
+ child.on("exit", (code) => {
120
+ if (restoring === null && code !== 0 && code !== null)
121
+ opts.onFailed(`qd exit ${code}`);
122
+ });
123
+ return {
124
+ writeDown(message) {
125
+ writeFrame(input, Buffer.from(JSON.stringify(message)));
126
+ },
127
+ geometry() {
128
+ return { cols, rows };
129
+ },
130
+ restore() {
131
+ restoring ??= shutdownChild(child, input, held);
132
+ return restoring;
133
+ },
134
+ };
135
+ }
136
+ function shutdownChild(child, input, held) {
137
+ if (child.exitCode !== null || child.signalCode !== null) {
138
+ held.release();
139
+ return Promise.resolve();
140
+ }
141
+ return new Promise((resolve) => {
142
+ let done = false;
143
+ const finish = () => {
144
+ if (done)
145
+ return;
146
+ done = true;
147
+ clearTimeout(term);
148
+ clearTimeout(kill);
149
+ held.release();
150
+ resolve();
151
+ };
152
+ const term = setTimeout(() => signal(child, "SIGTERM"), SHUTDOWN_GRACE_MS);
153
+ const kill = setTimeout(() => {
154
+ signal(child, "SIGKILL");
155
+ setTimeout(finish, SHUTDOWN_GRACE_MS);
156
+ }, SHUTDOWN_GRACE_MS * 2);
157
+ child.once("exit", finish);
158
+ try {
159
+ writeFrame(input, Buffer.from(JSON.stringify({ kind: "shutdown" })));
160
+ }
161
+ catch {
162
+ clearTimeout(term);
163
+ signal(child, "SIGTERM");
164
+ }
165
+ });
166
+ }
167
+ function signal(child, name) {
168
+ if (child.exitCode !== null || child.signalCode !== null)
169
+ return;
170
+ try {
171
+ child.kill(name);
172
+ }
173
+ catch {
174
+ /* already gone */
175
+ }
176
+ }
177
+ function writeFrame(stream, payload) {
178
+ const head = Buffer.alloc(4);
179
+ head.writeUInt32LE(payload.length, 0);
180
+ stream.write(head);
181
+ stream.write(payload);
182
+ }
183
+ function holdWrites(stream) {
184
+ const chunks = [];
185
+ const original = stream.write.bind(stream);
186
+ let released = false;
187
+ stream.write = ((chunk, encoding, cb) => {
188
+ const enc = typeof encoding === "string" ? encoding : "utf8";
189
+ const done = typeof encoding === "function" ? encoding : cb;
190
+ chunks.push(typeof chunk === "string" ? Buffer.from(chunk, enc) : Buffer.from(chunk));
191
+ done?.();
192
+ return true;
193
+ });
194
+ return {
195
+ release() {
196
+ if (released)
197
+ return;
198
+ released = true;
199
+ stream.write = original;
200
+ for (const chunk of chunks)
201
+ original(chunk);
202
+ },
203
+ };
204
+ }
205
+ //# sourceMappingURL=rust-present.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-present.js","sourceRoot":"","sources":["../../src/tui/rust-present.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Wait-pin copy for the stalls that used to be a blank screen: `/new`
3
+ * (worker swap + three room syncs) and a cold `/model` catalog handshake.
4
+ * Paint already spins a live wait cell; these strings are the status.
5
+ */
6
+ export declare const SPINNER_PHASE: {
7
+ readonly cancelTurn: "cancelling the turn...";
8
+ readonly closingSession: "closing the session...";
9
+ readonly openingSession: "opening the session...";
10
+ readonly syncingSession: "syncing the session...";
11
+ readonly syncingKernel: "syncing the kernel...";
12
+ readonly kernelOccupancy: "reading kernel occupancy...";
13
+ readonly syncingProject: "syncing the project...";
14
+ readonly applyingModel: "applying the model...";
15
+ readonly loadingModels: "loading models...";
16
+ };
17
+ export type SpinnerPhase = (typeof SPINNER_PHASE)[keyof typeof SPINNER_PHASE];
18
+ /** Cold completion wire: interned, handshake not finished, catalog still empty. */
19
+ export declare function coldModelCatalog(input: {
20
+ readonly connectionId: string;
21
+ readonly readyState: string | null;
22
+ readonly modelCount: number;
23
+ }): boolean;
24
+ //# sourceMappingURL=spinner-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-phase.d.ts","sourceRoot":"","sources":["../../src/tui/spinner-phase.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE9E,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAIV"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Wait-pin copy for the stalls that used to be a blank screen: `/new`
3
+ * (worker swap + three room syncs) and a cold `/model` catalog handshake.
4
+ * Paint already spins a live wait cell; these strings are the status.
5
+ */
6
+ export const SPINNER_PHASE = {
7
+ cancelTurn: "cancelling the turn...",
8
+ closingSession: "closing the session...",
9
+ openingSession: "opening the session...",
10
+ syncingSession: "syncing the session...",
11
+ syncingKernel: "syncing the kernel...",
12
+ kernelOccupancy: "reading kernel occupancy...",
13
+ syncingProject: "syncing the project...",
14
+ applyingModel: "applying the model...",
15
+ loadingModels: "loading models...",
16
+ };
17
+ /** Cold completion wire: interned, handshake not finished, catalog still empty. */
18
+ export function coldModelCatalog(input) {
19
+ if (input.connectionId.trim() === "")
20
+ return false;
21
+ if (input.modelCount > 0)
22
+ return false;
23
+ return input.readyState == null || input.readyState === "bootstrapping";
24
+ }
25
+ //# sourceMappingURL=spinner-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-phase.js","sourceRoot":"","sources":["../../src/tui/spinner-phase.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE,wBAAwB;IACpC,cAAc,EAAE,wBAAwB;IACxC,cAAc,EAAE,wBAAwB;IACxC,cAAc,EAAE,wBAAwB;IACxC,aAAa,EAAE,uBAAuB;IACtC,eAAe,EAAE,6BAA6B;IAC9C,cAAc,EAAE,wBAAwB;IACxC,aAAa,EAAE,uBAAuB;IACtC,aAAa,EAAE,mBAAmB;CAC1B,CAAC;AAIX,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,KAIhC;IACC,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,KAAK,CAAC,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Width elision is layout, not this file. */
2
+ export declare function homePath(path: string, home?: string): string;
3
+ /** Innermost git dir/file walking up from `path`. Nested worktrees win. */
4
+ export declare function closestGitRoot(path: string): string | null;
5
+ /** Bright git root + dim rest. No git → whole path is the root. */
6
+ export declare function cwdParts(path: string, home?: string): {
7
+ readonly root: string;
8
+ readonly rest: string;
9
+ };
10
+ //# sourceMappingURL=statusline-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline-path.d.ts","sourceRoot":"","sources":["../../src/tui/statusline-path.ts"],"names":[],"mappings":"AAIA,8CAA8C;AAC9C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAMvE;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1D;AAED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAKjH"}
@@ -0,0 +1,42 @@
1
+ import { existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join, resolve, sep } from "node:path";
4
+ /** Width elision is layout, not this file. */
5
+ export function homePath(path, home = homedir()) {
6
+ if (home === "")
7
+ return path;
8
+ if (path === home)
9
+ return "~";
10
+ const prefix = home.endsWith(sep) ? home : home + sep;
11
+ if (path.startsWith(prefix))
12
+ return `~${sep}${path.slice(prefix.length)}`;
13
+ return path;
14
+ }
15
+ /** Innermost git dir/file walking up from `path`. Nested worktrees win. */
16
+ export function closestGitRoot(path) {
17
+ if (path === "")
18
+ return null;
19
+ let dir = resolve(path);
20
+ while (true) {
21
+ try {
22
+ if (existsSync(join(dir, ".git")))
23
+ return dir;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ const parent = dirname(dir);
29
+ if (parent === dir)
30
+ return null;
31
+ dir = parent;
32
+ }
33
+ }
34
+ /** Bright git root + dim rest. No git → whole path is the root. */
35
+ export function cwdParts(path, home = homedir()) {
36
+ const root = closestGitRoot(path);
37
+ if (root == null)
38
+ return { root: homePath(path, home), rest: "" };
39
+ const rest = path === root || path.startsWith(root + sep) ? path.slice(root.length) : "";
40
+ return { root: homePath(root, home), rest };
41
+ }
42
+ //# sourceMappingURL=statusline-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusline-path.js","sourceRoot":"","sources":["../../src/tui/statusline-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAExD,8CAA8C;AAC9C,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE;IAC7D,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IACtD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,OAAe,OAAO,EAAE;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAClE,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tape paint for scheme_repl: sugarcoat the stored Scheme, colour with the
3
+ * compensated-Darcula token hex from @here.build/editor-theme (theme-darcula.ts).
4
+ * Tokenizer is the arrival-cli eject — no CodeMirror in the TUI.
5
+ * Source and receipt classification live in `sugarcoat.ts` of `@inhuman.tools/harness-sdk/text`
6
+ * (no quickdraw) and are re-exported here, so paint importers keep one door.
7
+ */
8
+ import { type SchemePaintPart } from "@inhuman.tools/harness-sdk/text";
9
+ import type { HighlightLine } from "@inhuman.tools/quickdraw/widgets";
10
+ export { BOOLEAN_ATOMS, decodeDisplayString, fileSchemePart, formatSchemeResult, isMarkdownPath, schemePaintReceipt, sugarcoatProgram, sugarcoatSource, type FilePaintHint, type SchemePaintKind, type SchemePaintPart, type SchemePaintReceipt, } from "@inhuman.tools/harness-sdk/text";
11
+ export declare function highlightSchemePart(part: SchemePaintPart): HighlightLine[];
12
+ /** Colour sugarcoat/Scheme source. Every input byte is in some run. */
13
+ export declare function highlightSugarcoat(src: string): HighlightLine[];
14
+ //# sourceMappingURL=sugarcoat-paint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sugarcoat-paint.d.ts","sourceRoot":"","sources":["../../src/tui/sugarcoat-paint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,kCAAkC,CAAC;AAEhF,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,iCAAiC,CAAC;AAgCzC,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,EAAE,CAK1E;AA0BD,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAkE/D"}