@buoy-gg/console 4.0.2

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 (151) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +55 -0
  3. package/lib/commonjs/components/ConsoleIcon.js +47 -0
  4. package/lib/commonjs/components/ConsoleIcon.js.map +1 -0
  5. package/lib/commonjs/components/ConsoleLogList.js +145 -0
  6. package/lib/commonjs/components/ConsoleLogList.js.map +1 -0
  7. package/lib/commonjs/components/ConsoleModal.js +48 -0
  8. package/lib/commonjs/components/ConsoleModal.js.map +1 -0
  9. package/lib/commonjs/components/ConsoleRoot.js +28 -0
  10. package/lib/commonjs/components/ConsoleRoot.js.map +1 -0
  11. package/lib/commonjs/devtools/ConsoleBody.js +235 -0
  12. package/lib/commonjs/devtools/ConsoleBody.js.map +1 -0
  13. package/lib/commonjs/devtools/ConsoleHeader.js +146 -0
  14. package/lib/commonjs/devtools/ConsoleHeader.js.map +1 -0
  15. package/lib/commonjs/devtools/ConsoleMessageRow.js +338 -0
  16. package/lib/commonjs/devtools/ConsoleMessageRow.js.map +1 -0
  17. package/lib/commonjs/devtools/ConsoleValue.js +254 -0
  18. package/lib/commonjs/devtools/ConsoleValue.js.map +1 -0
  19. package/lib/commonjs/devtools/ConsoleView.js +51 -0
  20. package/lib/commonjs/devtools/ConsoleView.js.map +1 -0
  21. package/lib/commonjs/devtools/consoleFilter.js +125 -0
  22. package/lib/commonjs/devtools/consoleFilter.js.map +1 -0
  23. package/lib/commonjs/devtools/consoleFormat.js +313 -0
  24. package/lib/commonjs/devtools/consoleFormat.js.map +1 -0
  25. package/lib/commonjs/devtools/origin.js +191 -0
  26. package/lib/commonjs/devtools/origin.js.map +1 -0
  27. package/lib/commonjs/devtools/theme.js +143 -0
  28. package/lib/commonjs/devtools/theme.js.map +1 -0
  29. package/lib/commonjs/devtools/useConsoleController.js +82 -0
  30. package/lib/commonjs/devtools/useConsoleController.js.map +1 -0
  31. package/lib/commonjs/devtools/useConsoleMessages.js +241 -0
  32. package/lib/commonjs/devtools/useConsoleMessages.js.map +1 -0
  33. package/lib/commonjs/hooks/useConsoleLogs.js +23 -0
  34. package/lib/commonjs/hooks/useConsoleLogs.js.map +1 -0
  35. package/lib/commonjs/index.js +175 -0
  36. package/lib/commonjs/index.js.map +1 -0
  37. package/lib/commonjs/package.json +1 -0
  38. package/lib/commonjs/preset.js +45 -0
  39. package/lib/commonjs/preset.js.map +1 -0
  40. package/lib/commonjs/store/consoleLogStore.js +298 -0
  41. package/lib/commonjs/store/consoleLogStore.js.map +1 -0
  42. package/lib/commonjs/store/sanitize.js +64 -0
  43. package/lib/commonjs/store/sanitize.js.map +1 -0
  44. package/lib/commonjs/sync/consoleSyncAdapter.js +47 -0
  45. package/lib/commonjs/sync/consoleSyncAdapter.js.map +1 -0
  46. package/lib/module/components/ConsoleIcon.js +42 -0
  47. package/lib/module/components/ConsoleIcon.js.map +1 -0
  48. package/lib/module/components/ConsoleLogList.js +140 -0
  49. package/lib/module/components/ConsoleLogList.js.map +1 -0
  50. package/lib/module/components/ConsoleModal.js +44 -0
  51. package/lib/module/components/ConsoleModal.js.map +1 -0
  52. package/lib/module/components/ConsoleRoot.js +25 -0
  53. package/lib/module/components/ConsoleRoot.js.map +1 -0
  54. package/lib/module/devtools/ConsoleBody.js +230 -0
  55. package/lib/module/devtools/ConsoleBody.js.map +1 -0
  56. package/lib/module/devtools/ConsoleHeader.js +141 -0
  57. package/lib/module/devtools/ConsoleHeader.js.map +1 -0
  58. package/lib/module/devtools/ConsoleMessageRow.js +333 -0
  59. package/lib/module/devtools/ConsoleMessageRow.js.map +1 -0
  60. package/lib/module/devtools/ConsoleValue.js +249 -0
  61. package/lib/module/devtools/ConsoleValue.js.map +1 -0
  62. package/lib/module/devtools/ConsoleView.js +46 -0
  63. package/lib/module/devtools/ConsoleView.js.map +1 -0
  64. package/lib/module/devtools/consoleFilter.js +119 -0
  65. package/lib/module/devtools/consoleFilter.js.map +1 -0
  66. package/lib/module/devtools/consoleFormat.js +309 -0
  67. package/lib/module/devtools/consoleFormat.js.map +1 -0
  68. package/lib/module/devtools/origin.js +183 -0
  69. package/lib/module/devtools/origin.js.map +1 -0
  70. package/lib/module/devtools/theme.js +140 -0
  71. package/lib/module/devtools/theme.js.map +1 -0
  72. package/lib/module/devtools/useConsoleController.js +79 -0
  73. package/lib/module/devtools/useConsoleController.js.map +1 -0
  74. package/lib/module/devtools/useConsoleMessages.js +238 -0
  75. package/lib/module/devtools/useConsoleMessages.js.map +1 -0
  76. package/lib/module/hooks/useConsoleLogs.js +19 -0
  77. package/lib/module/hooks/useConsoleLogs.js.map +1 -0
  78. package/lib/module/index.js +52 -0
  79. package/lib/module/index.js.map +1 -0
  80. package/lib/module/preset.js +40 -0
  81. package/lib/module/preset.js.map +1 -0
  82. package/lib/module/store/consoleLogStore.js +284 -0
  83. package/lib/module/store/consoleLogStore.js.map +1 -0
  84. package/lib/module/store/sanitize.js +60 -0
  85. package/lib/module/store/sanitize.js.map +1 -0
  86. package/lib/module/sync/consoleSyncAdapter.js +43 -0
  87. package/lib/module/sync/consoleSyncAdapter.js.map +1 -0
  88. package/lib/typescript/components/ConsoleIcon.d.ts +14 -0
  89. package/lib/typescript/components/ConsoleIcon.d.ts.map +1 -0
  90. package/lib/typescript/components/ConsoleLogList.d.ts +8 -0
  91. package/lib/typescript/components/ConsoleLogList.d.ts.map +1 -0
  92. package/lib/typescript/components/ConsoleModal.d.ts +18 -0
  93. package/lib/typescript/components/ConsoleModal.d.ts.map +1 -0
  94. package/lib/typescript/components/ConsoleRoot.d.ts +14 -0
  95. package/lib/typescript/components/ConsoleRoot.d.ts.map +1 -0
  96. package/lib/typescript/devtools/ConsoleBody.d.ts +11 -0
  97. package/lib/typescript/devtools/ConsoleBody.d.ts.map +1 -0
  98. package/lib/typescript/devtools/ConsoleHeader.d.ts +17 -0
  99. package/lib/typescript/devtools/ConsoleHeader.d.ts.map +1 -0
  100. package/lib/typescript/devtools/ConsoleMessageRow.d.ts +20 -0
  101. package/lib/typescript/devtools/ConsoleMessageRow.d.ts.map +1 -0
  102. package/lib/typescript/devtools/ConsoleValue.d.ts +21 -0
  103. package/lib/typescript/devtools/ConsoleValue.d.ts.map +1 -0
  104. package/lib/typescript/devtools/ConsoleView.d.ts +10 -0
  105. package/lib/typescript/devtools/ConsoleView.d.ts.map +1 -0
  106. package/lib/typescript/devtools/consoleFilter.d.ts +31 -0
  107. package/lib/typescript/devtools/consoleFilter.d.ts.map +1 -0
  108. package/lib/typescript/devtools/consoleFormat.d.ts +29 -0
  109. package/lib/typescript/devtools/consoleFormat.d.ts.map +1 -0
  110. package/lib/typescript/devtools/origin.d.ts +39 -0
  111. package/lib/typescript/devtools/origin.d.ts.map +1 -0
  112. package/lib/typescript/devtools/theme.d.ts +57 -0
  113. package/lib/typescript/devtools/theme.d.ts.map +1 -0
  114. package/lib/typescript/devtools/useConsoleController.d.ts +35 -0
  115. package/lib/typescript/devtools/useConsoleController.d.ts.map +1 -0
  116. package/lib/typescript/devtools/useConsoleMessages.d.ts +74 -0
  117. package/lib/typescript/devtools/useConsoleMessages.d.ts.map +1 -0
  118. package/lib/typescript/hooks/useConsoleLogs.d.ts +11 -0
  119. package/lib/typescript/hooks/useConsoleLogs.d.ts.map +1 -0
  120. package/lib/typescript/index.d.ts +26 -0
  121. package/lib/typescript/index.d.ts.map +1 -0
  122. package/lib/typescript/preset.d.ts +38 -0
  123. package/lib/typescript/preset.d.ts.map +1 -0
  124. package/lib/typescript/store/consoleLogStore.d.ts +71 -0
  125. package/lib/typescript/store/consoleLogStore.d.ts.map +1 -0
  126. package/lib/typescript/store/sanitize.d.ts +11 -0
  127. package/lib/typescript/store/sanitize.d.ts.map +1 -0
  128. package/lib/typescript/sync/consoleSyncAdapter.d.ts +30 -0
  129. package/lib/typescript/sync/consoleSyncAdapter.d.ts.map +1 -0
  130. package/package.json +56 -0
  131. package/src/components/ConsoleIcon.tsx +49 -0
  132. package/src/components/ConsoleLogList.tsx +133 -0
  133. package/src/components/ConsoleModal.tsx +48 -0
  134. package/src/components/ConsoleRoot.tsx +25 -0
  135. package/src/devtools/ConsoleBody.tsx +225 -0
  136. package/src/devtools/ConsoleHeader.tsx +149 -0
  137. package/src/devtools/ConsoleMessageRow.tsx +345 -0
  138. package/src/devtools/ConsoleValue.tsx +265 -0
  139. package/src/devtools/ConsoleView.tsx +41 -0
  140. package/src/devtools/consoleFilter.ts +123 -0
  141. package/src/devtools/consoleFormat.ts +314 -0
  142. package/src/devtools/origin.ts +190 -0
  143. package/src/devtools/theme.ts +137 -0
  144. package/src/devtools/useConsoleController.ts +104 -0
  145. package/src/devtools/useConsoleMessages.ts +337 -0
  146. package/src/hooks/useConsoleLogs.ts +26 -0
  147. package/src/index.tsx +69 -0
  148. package/src/preset.tsx +35 -0
  149. package/src/store/consoleLogStore.ts +346 -0
  150. package/src/store/sanitize.ts +58 -0
  151. package/src/sync/consoleSyncAdapter.ts +49 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Console palette — a dark theme matched to Buoy's shared design tokens
5
+ * (`macOSColors` in @buoy-gg/shared-ui) so the console reads as part of the
6
+ * tool suite, tuned for contrast per WCAG AA:
7
+ * - body text #F5F5F7 on #0A0A0C ≈ 17:1
8
+ * - secondary #A1A1A6 on #0A0A0C ≈ 7:1
9
+ * - links #40CCFF on #0A0A0C ≈ 9:1
10
+ * - dividers / nesting guides lightened to ~#3A3A40 so lines are clearly
11
+ * visible against the near-black surface.
12
+ * The light values (the exact DevTools light tokens) are kept for a future
13
+ * toggle.
14
+ */
15
+
16
+ import { Platform } from "react-native";
17
+
18
+ /**
19
+ * Monospace font. On the desktop dashboard (react-native-web) the generic
20
+ * `"monospace"` resolves to a thin, poorly-hinted browser default that's hard
21
+ * to read at small sizes — so we use a curated mono stack there. Native (mobile)
22
+ * keeps its system monospace, which already renders well.
23
+ */
24
+ export const monoFont = Platform.select({
25
+ web: 'ui-monospace, "SF Mono", "SFMono-Regular", Menlo, Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Liberation Mono", monospace',
26
+ default: "monospace"
27
+ }) ?? "monospace";
28
+ /** Light theme (active) — resolved DevTools light-theme tokens. */
29
+ export const lightTheme = {
30
+ baseContainer: "#ffffff",
31
+ // --sys-color-cdt-base-container (neutral99 ≈ white)
32
+ surfaceError: "#fceaea",
33
+ // --sys-color-surface-error rgb(252 235 235)
34
+ surfaceYellow: "#fef6d5",
35
+ // --sys-color-surface-yellow rgb(254 246 213)
36
+ divider: "#e8eaed",
37
+ // --sys-color-divider (primary90, lightened for contrast)
38
+ inputBackground: "#f1f3f4",
39
+ menuBackground: "#ffffff",
40
+ onSurface: "#1f1f1f",
41
+ // neutral10
42
+ onSurfaceYellow: "#3e2f00",
43
+ // yellow20
44
+ onErrorContainer: "#410e0b",
45
+ // error10
46
+ tokenSubtle: "#757575",
47
+ // neutral50
48
+ primary: "#0b57d0",
49
+ // primary40 (links)
50
+ valueNumber: "#0842a0",
51
+ // token-attribute-value (blue30)
52
+ valueString: "#c5221f",
53
+ // token-property-special (error50, slightly deepened)
54
+ valueBigint: "#146c2e",
55
+ // token-comment (green40)
56
+ valueNode: "#1f1f1f",
57
+ // token-variable (= on-surface)
58
+ valueNullish: "rgba(31,31,31,0.5)",
59
+ // state-disabled
60
+ valuePreview: "rgba(31,31,31,0.62)"
61
+ };
62
+
63
+ /** Dark theme (active) — matched to Buoy macOSColors, contrast-tuned. */
64
+ export const darkTheme = {
65
+ baseContainer: "#0A0A0C",
66
+ // macOSColors.background.base
67
+ surfaceError: "rgba(255,69,58,0.15)",
68
+ // semantic.errorBackground
69
+ surfaceYellow: "rgba(255,235,59,0.13)",
70
+ // semantic.warningBackground
71
+ divider: "#3A3A40",
72
+ // lightened from border.default (#2D2D2F) for visible lines
73
+ inputBackground: "#26262A",
74
+ // background.input
75
+ menuBackground: "#1A1A1C",
76
+ // background.card
77
+ onSurface: "#F5F5F7",
78
+ // text.primary (~17:1)
79
+ onSurfaceYellow: "#FFE9A3",
80
+ // light warm yellow on dark warning row
81
+ onErrorContainer: "#FFB4AB",
82
+ // light red on dark error row
83
+ tokenSubtle: "#A1A1A6",
84
+ // text.secondary (~7:1 — timestamps, previews)
85
+ primary: "#40CCFF",
86
+ // semantic.infoLight (links, ~9:1)
87
+ valueNumber: "#FF9F1C",
88
+ // orange (number + boolean)
89
+ valueString: "#7EE787",
90
+ // green (string/regexp/symbol)
91
+ valueBigint: "#A1A1A6",
92
+ // muted (bigint)
93
+ valueNode: "#F5F5F7",
94
+ // default text (DOM node / variable)
95
+ valueNullish: "#8E8E93",
96
+ // text.muted (null/undefined)
97
+ valuePreview: "#A1A1A6" // object preview (italic)
98
+ };
99
+
100
+ /** The active console palette. */
101
+ export const consoleTheme = darkTheme;
102
+
103
+ /** ANSI 16-color palette (dark theme), from consoleView.css `--console-color-*`. */
104
+ export const ansiColors = {
105
+ black: "#000",
106
+ red: "rgb(237 78 76)",
107
+ green: "rgb(1 200 1)",
108
+ yellow: "rgb(210 192 87)",
109
+ blue: "rgb(39 116 240)",
110
+ magenta: "rgb(161 66 244)",
111
+ cyan: "rgb(18 181 203)",
112
+ gray: "rgb(207 208 208)",
113
+ darkgray: "rgb(137 137 137)",
114
+ lightred: "rgb(242 139 130)",
115
+ lightgreen: "rgb(161 247 181)",
116
+ lightyellow: "rgb(221 251 85)",
117
+ lightblue: "rgb(102 157 246)",
118
+ lightmagenta: "rgb(214 112 214)",
119
+ lightcyan: "rgb(132 240 255)",
120
+ white: "#fff"
121
+ };
122
+ export const levelStyles = {
123
+ verbose: {
124
+ text: consoleTheme.tokenSubtle
125
+ },
126
+ info: {
127
+ text: consoleTheme.onSurface
128
+ },
129
+ warning: {
130
+ background: consoleTheme.surfaceYellow,
131
+ text: consoleTheme.onSurfaceYellow,
132
+ icon: "warning"
133
+ },
134
+ error: {
135
+ background: consoleTheme.surfaceError,
136
+ text: consoleTheme.onErrorContainer,
137
+ icon: "error"
138
+ }
139
+ };
140
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Platform","monoFont","select","web","default","lightTheme","baseContainer","surfaceError","surfaceYellow","divider","inputBackground","menuBackground","onSurface","onSurfaceYellow","onErrorContainer","tokenSubtle","primary","valueNumber","valueString","valueBigint","valueNode","valueNullish","valuePreview","darkTheme","consoleTheme","ansiColors","black","red","green","yellow","blue","magenta","cyan","gray","darkgray","lightred","lightgreen","lightyellow","lightblue","lightmagenta","lightcyan","white","levelStyles","verbose","text","info","warning","background","icon","error"],"sourceRoot":"../../../src","sources":["devtools/theme.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useConsoleController — owns all Console view state so the header and the body
5
+ * can be composed separately (the shared ModalHeader pattern: controls live in
6
+ * the modal header's `customContent`, the list/sub-views live in the body).
7
+ */
8
+
9
+ import { useCallback, useState } from "react";
10
+ import { useConsoleMessages } from "./useConsoleMessages";
11
+ import { DEFAULT_LEVELS, levelMenuSummary } from "./consoleFilter";
12
+ import { clearEntries } from "../store/consoleLogStore";
13
+
14
+ /** Which screen the modal body shows (list, or the back-navigable filters page). */
15
+
16
+ export function useConsoleController() {
17
+ const [query, setQuery] = useState("");
18
+ const [searchActive, setSearchActive] = useState(false);
19
+ const [levelsMask, setLevelsMask] = useState({
20
+ ...DEFAULT_LEVELS
21
+ });
22
+ const [showTimestamps, setShowTimestamps] = useState(false);
23
+ const [collapsedOverrides, setCollapsedOverrides] = useState({});
24
+ const [layoutMode, setLayoutMode] = useState("chrono");
25
+ const [view, setView] = useState("list");
26
+ const [clusterExpanded, setClusterExpanded] = useState({});
27
+ const {
28
+ rows,
29
+ hiddenCount
30
+ } = useConsoleMessages({
31
+ levelsMask,
32
+ query,
33
+ showTimestamps,
34
+ collapsedOverrides,
35
+ groupDimension: "function",
36
+ layoutMode,
37
+ clusterExpanded
38
+ });
39
+ const onToggleGroup = useCallback((groupId, currentlyCollapsed) => {
40
+ setCollapsedOverrides(prev => ({
41
+ ...prev,
42
+ [groupId]: !currentlyCollapsed
43
+ }));
44
+ }, []);
45
+ const onToggleCluster = useCallback(key => {
46
+ setClusterExpanded(prev => ({
47
+ ...prev,
48
+ [key]: !(prev[key] ?? false)
49
+ }));
50
+ }, []);
51
+ const clear = useCallback(() => {
52
+ clearEntries();
53
+ setCollapsedOverrides({});
54
+ }, []);
55
+ const levelSummary = levelMenuSummary(levelsMask);
56
+ const isLevelCustom = levelSummary !== "All levels" && levelSummary !== "Default levels";
57
+ return {
58
+ query,
59
+ setQuery,
60
+ searchActive,
61
+ setSearchActive,
62
+ levelsMask,
63
+ setLevelsMask,
64
+ showTimestamps,
65
+ setShowTimestamps,
66
+ layoutMode,
67
+ setLayoutMode,
68
+ view,
69
+ setView,
70
+ rows,
71
+ hiddenCount,
72
+ onToggleGroup,
73
+ onToggleCluster,
74
+ clear,
75
+ levelSummary,
76
+ isLevelCustom
77
+ };
78
+ }
79
+ //# sourceMappingURL=useConsoleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useState","useConsoleMessages","DEFAULT_LEVELS","levelMenuSummary","clearEntries","useConsoleController","query","setQuery","searchActive","setSearchActive","levelsMask","setLevelsMask","showTimestamps","setShowTimestamps","collapsedOverrides","setCollapsedOverrides","layoutMode","setLayoutMode","view","setView","clusterExpanded","setClusterExpanded","rows","hiddenCount","groupDimension","onToggleGroup","groupId","currentlyCollapsed","prev","onToggleCluster","key","clear","levelSummary","isLevelCustom"],"sourceRoot":"../../../src","sources":["devtools/useConsoleController.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,QAAQ,QAA4C,OAAO;AACjF,SACEC,kBAAkB,QAGb,sBAAsB;AAC7B,SACEC,cAAc,EACdC,gBAAgB,QAEX,iBAAiB;AACxB,SAASC,YAAY,QAAQ,0BAA0B;;AAEvD;;AA2BA,OAAO,SAASC,oBAAoBA,CAAA,EAAsB;EACxD,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGP,QAAQ,CAAC,EAAE,CAAC;EACtC,MAAM,CAACQ,YAAY,EAAEC,eAAe,CAAC,GAAGT,QAAQ,CAAC,KAAK,CAAC;EACvD,MAAM,CAACU,UAAU,EAAEC,aAAa,CAAC,GAAGX,QAAQ,CAAa;IAAE,GAAGE;EAAe,CAAC,CAAC;EAC/E,MAAM,CAACU,cAAc,EAAEC,iBAAiB,CAAC,GAAGb,QAAQ,CAAC,KAAK,CAAC;EAC3D,MAAM,CAACc,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGf,QAAQ,CAA0B,CAAC,CAAC,CAAC;EACzF,MAAM,CAACgB,UAAU,EAAEC,aAAa,CAAC,GAAGjB,QAAQ,CAAa,QAAQ,CAAC;EAClE,MAAM,CAACkB,IAAI,EAAEC,OAAO,CAAC,GAAGnB,QAAQ,CAAmB,MAAM,CAAC;EAC1D,MAAM,CAACoB,eAAe,EAAEC,kBAAkB,CAAC,GAAGrB,QAAQ,CAA0B,CAAC,CAAC,CAAC;EAEnF,MAAM;IAAEsB,IAAI;IAAEC;EAAY,CAAC,GAAGtB,kBAAkB,CAAC;IAC/CS,UAAU;IACVJ,KAAK;IACLM,cAAc;IACdE,kBAAkB;IAClBU,cAAc,EAAE,UAAU;IAC1BR,UAAU;IACVI;EACF,CAAC,CAAC;EAEF,MAAMK,aAAa,GAAG1B,WAAW,CAAC,CAAC2B,OAAe,EAAEC,kBAA2B,KAAK;IAClFZ,qBAAqB,CAAEa,IAAI,KAAM;MAAE,GAAGA,IAAI;MAAE,CAACF,OAAO,GAAG,CAACC;IAAmB,CAAC,CAAC,CAAC;EAChF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,eAAe,GAAG9B,WAAW,CAAE+B,GAAW,IAAK;IACnDT,kBAAkB,CAAEO,IAAI,KAAM;MAAE,GAAGA,IAAI;MAAE,CAACE,GAAG,GAAG,EAAEF,IAAI,CAACE,GAAG,CAAC,IAAI,KAAK;IAAE,CAAC,CAAC,CAAC;EAC3E,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMC,KAAK,GAAGhC,WAAW,CAAC,MAAM;IAC9BK,YAAY,CAAC,CAAC;IACdW,qBAAqB,CAAC,CAAC,CAAC,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMiB,YAAY,GAAG7B,gBAAgB,CAACO,UAAU,CAAC;EACjD,MAAMuB,aAAa,GAAGD,YAAY,KAAK,YAAY,IAAIA,YAAY,KAAK,gBAAgB;EAExF,OAAO;IACL1B,KAAK;IACLC,QAAQ;IACRC,YAAY;IACZC,eAAe;IACfC,UAAU;IACVC,aAAa;IACbC,cAAc;IACdC,iBAAiB;IACjBG,UAAU;IACVC,aAAa;IACbC,IAAI;IACJC,OAAO;IACPG,IAAI;IACJC,WAAW;IACXE,aAAa;IACbI,eAAe;IACfE,KAAK;IACLC,YAAY;IACZC;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * useConsoleMessages — derives the displayed row model from raw captured
5
+ * entries, mirroring DevTools `ConsoleView.updateMessageList`:
6
+ *
7
+ * - level + text filtering (consoleFilter)
8
+ * - consecutive-identical collapse into a repeat-count badge (when timestamps
9
+ * are off, matching `tryToCollapseMessages`)
10
+ * - console.group / groupCollapsed nesting + collapse/expand
11
+ *
12
+ * Returns the visible rows plus the count of messages hidden by filters
13
+ * ("N hidden"), and per-level totals for the toolbar.
14
+ */
15
+
16
+ import { useMemo, useSyncExternalStore } from "react";
17
+ import { subscribe, getEntries } from "../store/consoleLogStore";
18
+ import { parseFilterQuery, shouldBeVisible } from "./consoleFilter";
19
+ import { sourceKey, sourceLabel, colorForKey, bracketGlyph } from "./origin";
20
+
21
+ /** How the origin gutter is laid out. */
22
+
23
+ /** One swimlane gutter cell. */
24
+
25
+ const MAX_LANES = 5;
26
+
27
+ /** Grouped mode collapses any source cluster larger than this into a header. */
28
+ const CLUSTER_THRESHOLD = 5;
29
+
30
+ /** First pass: tag each row with its origin source key, color, and label. */
31
+ function computeSourceInfo(rows, dim) {
32
+ for (const row of rows) {
33
+ const key = sourceKey(row.entry.origin, dim);
34
+ row.sourceKey = key;
35
+ row.originColor = key ? colorForKey(key) : undefined;
36
+ row.originLabel = dim === "off" ? undefined : sourceLabel(row.entry.origin, dim);
37
+ }
38
+ }
39
+
40
+ /** lnav single-column gutter: bracket consecutive same-source runs. */
41
+ function attachContiguousBrackets(rows) {
42
+ for (let i = 0; i < rows.length; i++) {
43
+ const key = rows[i].sourceKey;
44
+ if (key == null) {
45
+ rows[i].bracketGlyph = undefined;
46
+ continue;
47
+ }
48
+ const sameAsPrev = i > 0 && rows[i - 1].sourceKey === key;
49
+ const sameAsNext = i < rows.length - 1 && rows[i + 1].sourceKey === key;
50
+ const bracket = !sameAsPrev && !sameAsNext ? "single" : !sameAsPrev ? "top" : !sameAsNext ? "bottom" : "mid";
51
+ rows[i].bracketGlyph = bracketGlyph(bracket);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Re-order rows so all rows of one source are contiguous (groups ordered by
57
+ * first appearance, chronological within each). Clusters larger than
58
+ * CLUSTER_THRESHOLD collapse into a single expandable header (Chrome-style),
59
+ * unless the user has expanded that cluster.
60
+ */
61
+ function clusterRows(rows, expanded) {
62
+ const order = [];
63
+ const groups = new Map();
64
+ for (const r of rows) {
65
+ const k = r.sourceKey ?? "—";
66
+ let g = groups.get(k);
67
+ if (!g) {
68
+ g = [];
69
+ groups.set(k, g);
70
+ order.push(k);
71
+ }
72
+ g.push(r);
73
+ }
74
+ const out = [];
75
+ for (const k of order) {
76
+ const group = groups.get(k);
77
+ for (const r of group) r.depth = 0; // clustering ignores console.group nesting
78
+
79
+ const isLarge = group.length > CLUSTER_THRESHOLD;
80
+ const isExpanded = expanded[k] ?? false;
81
+ if (isLarge) {
82
+ out.push({
83
+ key: `cluster:${k}`,
84
+ entry: group[0].entry,
85
+ depth: 0,
86
+ repeatCount: 1,
87
+ isGroupHeader: false,
88
+ sourceKey: k,
89
+ originColor: group[0].originColor,
90
+ originLabel: group[0].originLabel,
91
+ clusterHeader: {
92
+ key: k,
93
+ count: group.length,
94
+ expanded: isExpanded
95
+ }
96
+ });
97
+ if (!isExpanded) continue;
98
+ }
99
+ group.forEach((r, i) => {
100
+ const single = group.length === 1;
101
+ const bracket = single ? "single" : i === 0 ? "top" : i === group.length - 1 ? "bottom" : "mid";
102
+ r.bracketGlyph = bracketGlyph(bracket);
103
+ out.push(r);
104
+ });
105
+ }
106
+ return out;
107
+ }
108
+
109
+ /** Git-graph swimlanes: each source gets a continuous vertical track so its
110
+ * line stays unbroken when other sources interrupt it. */
111
+ function attachSwimlanes(rows) {
112
+ const first = new Map();
113
+ const last = new Map();
114
+ rows.forEach((r, i) => {
115
+ const k = r.sourceKey;
116
+ if (k == null) return;
117
+ if (!first.has(k)) first.set(k, i);
118
+ last.set(k, i);
119
+ });
120
+
121
+ // Assign each source a lane, reusing a lane once its occupant's run ended.
122
+ const sources = [...first.keys()].sort((a, b) => first.get(a) - first.get(b));
123
+ const laneOf = new Map();
124
+ const laneEnd = [];
125
+ for (const s of sources) {
126
+ let lane = laneEnd.findIndex(end => end < first.get(s));
127
+ if (lane === -1) {
128
+ lane = laneEnd.length < MAX_LANES ? laneEnd.length : MAX_LANES - 1;
129
+ if (lane >= laneEnd.length) laneEnd.push(0);
130
+ }
131
+ laneOf.set(s, lane);
132
+ laneEnd[lane] = Math.max(laneEnd[lane] ?? 0, last.get(s));
133
+ }
134
+ const laneCount = Math.max(1, Math.min(laneEnd.length, MAX_LANES));
135
+ rows.forEach((r, i) => {
136
+ const cells = Array.from({
137
+ length: laneCount
138
+ }, () => ({
139
+ glyph: " "
140
+ }));
141
+ for (const s of sources) {
142
+ const lane = laneOf.get(s);
143
+ if (lane >= laneCount) continue;
144
+ if (i >= first.get(s) && i <= last.get(s)) {
145
+ cells[lane] = {
146
+ glyph: r.sourceKey === s ? "●" : "│",
147
+ color: colorForKey(s)
148
+ };
149
+ }
150
+ }
151
+ r.lanes = cells;
152
+ });
153
+ }
154
+ const GROUP_STARTS = new Set(["group", "groupCollapsed"]);
155
+ function buildDisplayRows(entries, opts) {
156
+ const {
157
+ levelsMask,
158
+ query,
159
+ showTimestamps,
160
+ collapsedOverrides
161
+ } = opts;
162
+ const parsed = parseFilterQuery(query.trim());
163
+ const rows = [];
164
+ const levelCounts = {
165
+ verbose: 0,
166
+ info: 0,
167
+ warning: 0,
168
+ error: 0
169
+ };
170
+ let hiddenCount = 0;
171
+ const stack = [];
172
+ const anyAncestorCollapsed = () => stack.some(g => g.collapsed);
173
+ for (const entry of entries) {
174
+ levelCounts[entry.level]++;
175
+ if (entry.method === "groupEnd") {
176
+ stack.pop();
177
+ continue;
178
+ }
179
+ const isHeader = GROUP_STARTS.has(entry.method);
180
+ const hiddenByGroup = anyAncestorCollapsed();
181
+ const passesFilter = shouldBeVisible(entry, levelsMask, parsed);
182
+ if (!passesFilter) {
183
+ hiddenCount++;
184
+ } else if (!hiddenByGroup) {
185
+ // Repeat-count collapse: only when timestamps are hidden and the previous
186
+ // visible row is an identical, non-header message at the same depth.
187
+ const prev = rows[rows.length - 1];
188
+ if (!showTimestamps && !isHeader && prev && !prev.isGroupHeader && prev.depth === stack.length && prev.entry.method === entry.method && prev.entry.message === entry.message) {
189
+ prev.repeatCount++;
190
+ } else {
191
+ rows.push({
192
+ key: String(entry.id),
193
+ entry,
194
+ depth: stack.length,
195
+ repeatCount: 1,
196
+ isGroupHeader: isHeader,
197
+ groupId: isHeader ? entry.id : undefined,
198
+ groupCollapsed: undefined
199
+ });
200
+ }
201
+ }
202
+ if (isHeader) {
203
+ const defaultCollapsed = entry.method === "groupCollapsed";
204
+ const collapsed = collapsedOverrides[entry.id] ?? defaultCollapsed;
205
+ // Record the collapse state on the just-pushed header row (if visible).
206
+ const headerRow = rows[rows.length - 1];
207
+ if (headerRow && headerRow.groupId === entry.id) {
208
+ headerRow.groupCollapsed = collapsed;
209
+ }
210
+ stack.push({
211
+ id: entry.id,
212
+ collapsed: collapsed || hiddenByGroup
213
+ });
214
+ }
215
+ }
216
+ computeSourceInfo(rows, opts.groupDimension);
217
+ let finalRows = rows;
218
+ if (opts.groupDimension !== "off") {
219
+ if (opts.layoutMode === "cluster") {
220
+ finalRows = clusterRows(rows, opts.clusterExpanded);
221
+ } else if (opts.layoutMode === "swimlane") {
222
+ attachSwimlanes(rows);
223
+ } else {
224
+ attachContiguousBrackets(rows);
225
+ }
226
+ }
227
+ return {
228
+ rows: finalRows,
229
+ hiddenCount,
230
+ levelCounts,
231
+ totalCount: entries.length
232
+ };
233
+ }
234
+ export function useConsoleMessages(opts) {
235
+ const entries = useSyncExternalStore(subscribe, getEntries, getEntries);
236
+ return useMemo(() => buildDisplayRows(entries, opts), [entries, opts.levelsMask, opts.query, opts.showTimestamps, opts.collapsedOverrides, opts.groupDimension, opts.layoutMode, opts.clusterExpanded]);
237
+ }
238
+ //# sourceMappingURL=useConsoleMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useSyncExternalStore","subscribe","getEntries","parseFilterQuery","shouldBeVisible","sourceKey","sourceLabel","colorForKey","bracketGlyph","MAX_LANES","CLUSTER_THRESHOLD","computeSourceInfo","rows","dim","row","key","entry","origin","originColor","undefined","originLabel","attachContiguousBrackets","i","length","sameAsPrev","sameAsNext","bracket","clusterRows","expanded","order","groups","Map","r","k","g","get","set","push","out","group","depth","isLarge","isExpanded","repeatCount","isGroupHeader","clusterHeader","count","forEach","single","attachSwimlanes","first","last","has","sources","keys","sort","a","b","laneOf","laneEnd","s","lane","findIndex","end","Math","max","laneCount","min","cells","Array","from","glyph","color","lanes","GROUP_STARTS","Set","buildDisplayRows","entries","opts","levelsMask","query","showTimestamps","collapsedOverrides","parsed","trim","levelCounts","verbose","info","warning","error","hiddenCount","stack","anyAncestorCollapsed","some","collapsed","level","method","pop","isHeader","hiddenByGroup","passesFilter","prev","message","String","id","groupId","groupCollapsed","defaultCollapsed","headerRow","groupDimension","finalRows","layoutMode","clusterExpanded","totalCount","useConsoleMessages"],"sourceRoot":"../../../src","sources":["devtools/useConsoleMessages.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ import { useSyncExternalStore, useEffect } from "react";
4
+ import { subscribe, getEntries, installConsoleCapture } from "../store/consoleLogStore";
5
+ /**
6
+ * Subscribe to captured console logs. Installs the console interceptor on mount
7
+ * (idempotent) and re-renders whenever a new entry is captured or the buffer is
8
+ * cleared.
9
+ */
10
+ export function useConsoleLogs() {
11
+ useEffect(() => {
12
+ installConsoleCapture();
13
+ }, []);
14
+ const logs = useSyncExternalStore(subscribe, getEntries, getEntries);
15
+ return {
16
+ logs
17
+ };
18
+ }
19
+ //# sourceMappingURL=useConsoleLogs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useSyncExternalStore","useEffect","subscribe","getEntries","installConsoleCapture","useConsoleLogs","logs"],"sourceRoot":"../../../src","sources":["hooks/useConsoleLogs.ts"],"mappings":";;AAAA,SAASA,oBAAoB,EAAEC,SAAS,QAAQ,OAAO;AACvD,SACEC,SAAS,EACTC,UAAU,EACVC,qBAAqB,QAEhB,0BAA0B;AAMjC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAyB;EACrDJ,SAAS,CAAC,MAAM;IACdG,qBAAqB,CAAC,CAAC;EACzB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,IAAI,GAAGN,oBAAoB,CAACE,SAAS,EAAEC,UAAU,EAAEA,UAAU,CAAC;EAEpE,OAAO;IAAEG;EAAK,CAAC;AACjB","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * @buoy-gg/console
5
+ *
6
+ * Captures global `console.*` output and renders it as a Buoy devtool.
7
+ *
8
+ * This is the BASIC version: direct console patching + a flat list, used to
9
+ * verify the capture pipeline end to end. Next step is a 1:1 port of Chrome
10
+ * DevTools' console view.
11
+ */
12
+
13
+ // =============================================================================
14
+ // PRESET (Primary entry point — pass to <FloatingDevTools apps={[...]} />)
15
+ // =============================================================================
16
+ export { consoleToolPreset, createConsoleTool } from "./preset";
17
+
18
+ // =============================================================================
19
+ // ROOT (Mount once at app root to capture logs from startup)
20
+ // =============================================================================
21
+ export { ConsoleRoot } from "./components/ConsoleRoot";
22
+
23
+ // =============================================================================
24
+ // COMPONENTS
25
+ // =============================================================================
26
+ export { ConsoleModal } from "./components/ConsoleModal";
27
+ export { ConsoleIcon, CONSOLE_ICON_COLOR } from "./components/ConsoleIcon";
28
+
29
+ // DevTools-style console panel (the 1:1 Chrome console port)
30
+ export { ConsoleView } from "./devtools/ConsoleView";
31
+ export { ConsoleMessageRow } from "./devtools/ConsoleMessageRow";
32
+ export { ConsoleValue } from "./devtools/ConsoleValue";
33
+ export { useConsoleMessages } from "./devtools/useConsoleMessages";
34
+ export { consoleTheme, levelStyles } from "./devtools/theme";
35
+
36
+ // Basic flat list (kept for simple/embedded use)
37
+ export { ConsoleLogList } from "./components/ConsoleLogList";
38
+
39
+ // =============================================================================
40
+ // HOOK
41
+ // =============================================================================
42
+ export { useConsoleLogs } from "./hooks/useConsoleLogs";
43
+ // =============================================================================
44
+ // EXTERNAL SYNC (device → desktop dashboard)
45
+ // =============================================================================
46
+ export { consoleSyncAdapter } from "./sync/consoleSyncAdapter";
47
+
48
+ // =============================================================================
49
+ // CAPTURE STORE (install/teardown + types)
50
+ // =============================================================================
51
+ export { installConsoleCapture, uninstallConsoleCapture, clearEntries, getEntries, subscribe, replaceEntries, onClear, initConsolePersistence, getPreserveLog, setPreserveLog, subscribePreserveLog } from "./store/consoleLogStore";
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["consoleToolPreset","createConsoleTool","ConsoleRoot","ConsoleModal","ConsoleIcon","CONSOLE_ICON_COLOR","ConsoleView","ConsoleMessageRow","ConsoleValue","useConsoleMessages","consoleTheme","levelStyles","ConsoleLogList","useConsoleLogs","consoleSyncAdapter","installConsoleCapture","uninstallConsoleCapture","clearEntries","getEntries","subscribe","replaceEntries","onClear","initConsolePersistence","getPreserveLog","setPreserveLog","subscribePreserveLog"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,SAASA,iBAAiB,EAAEC,iBAAiB,QAAQ,UAAU;;AAE/D;AACA;AACA;AACA,SAASC,WAAW,QAAQ,0BAA0B;;AAEtD;AACA;AACA;AACA,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,WAAW,EAAEC,kBAAkB,QAAQ,0BAA0B;;AAE1E;AACA,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,iBAAiB,QAAQ,8BAA8B;AAChE,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,kBAAkB,QAAQ,+BAA+B;AAElE,SAASC,YAAY,EAAEC,WAAW,QAAQ,kBAAkB;;AAE5D;AACA,SAASC,cAAc,QAAQ,6BAA6B;;AAE5D;AACA;AACA;AACA,SAASC,cAAc,QAAQ,wBAAwB;AAGvD;AACA;AACA;AACA,SAASC,kBAAkB,QAAQ,2BAA2B;;AAE9D;AACA;AACA;AACA,SACEC,qBAAqB,EACrBC,uBAAuB,EACvBC,YAAY,EACZC,UAAU,EACVC,SAAS,EACTC,cAAc,EACdC,OAAO,EACPC,sBAAsB,EACtBC,cAAc,EACdC,cAAc,EACdC,oBAAoB,QACf,yBAAyB","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Pre-configured Console tool for FloatingDevTools.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * import { consoleToolPreset } from '@buoy-gg/console';
9
+ *
10
+ * <FloatingDevTools apps={[consoleToolPreset]} />
11
+ * ```
12
+ */
13
+
14
+ import { ConsoleIcon, CONSOLE_ICON_COLOR } from "./components/ConsoleIcon";
15
+ import { ConsoleModal } from "./components/ConsoleModal";
16
+ import { jsx as _jsx } from "react/jsx-runtime";
17
+ export const consoleToolPreset = {
18
+ id: "console",
19
+ name: "CONSOLE",
20
+ description: "Captured console.* output",
21
+ slot: "both",
22
+ icon: ({
23
+ size,
24
+ color
25
+ }) => /*#__PURE__*/_jsx(ConsoleIcon, {
26
+ size: size,
27
+ color: color || CONSOLE_ICON_COLOR
28
+ }),
29
+ component: ConsoleModal
30
+ };
31
+
32
+ /** Create a custom Console tool configuration. */
33
+ export function createConsoleTool(options = {}) {
34
+ return {
35
+ ...consoleToolPreset,
36
+ name: options.name ?? consoleToolPreset.name,
37
+ description: options.description ?? consoleToolPreset.description
38
+ };
39
+ }
40
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ConsoleIcon","CONSOLE_ICON_COLOR","ConsoleModal","jsx","_jsx","consoleToolPreset","id","name","description","slot","icon","size","color","component","createConsoleTool","options"],"sourceRoot":"../../src","sources":["preset.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,EAAEC,kBAAkB,QAAQ,0BAA0B;AAC1E,SAASC,YAAY,QAAQ,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEzD,OAAO,MAAMC,iBAAiB,GAAG;EAC/BC,EAAE,EAAE,SAAS;EACbC,IAAI,EAAE,SAAS;EACfC,WAAW,EAAE,2BAA2B;EACxCC,IAAI,EAAE,MAAe;EACrBC,IAAI,EAAEA,CAAC;IAAEC,IAAI;IAAEC;EAAwC,CAAC,kBACtDR,IAAA,CAACJ,WAAW;IAACW,IAAI,EAAEA,IAAK;IAACC,KAAK,EAAEA,KAAK,IAAIX;EAAmB,CAAE,CAC/D;EACDY,SAAS,EAAEX;AACb,CAAC;;AAED;AACA,OAAO,SAASY,iBAAiBA,CAC/BC,OAAgD,GAAG,CAAC,CAAC,EACrD;EACA,OAAO;IACL,GAAGV,iBAAiB;IACpBE,IAAI,EAAEQ,OAAO,CAACR,IAAI,IAAIF,iBAAiB,CAACE,IAAI;IAC5CC,WAAW,EAAEO,OAAO,CAACP,WAAW,IAAIH,iBAAiB,CAACG;EACxD,CAAC;AACH","ignoreList":[]}