@gzeoneth/gov-tracker 0.2.1-1 → 0.2.1-alpha.cli-preview.375ef6c

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 (250) hide show
  1. package/README.md +91 -68
  2. package/dist/calldata/index.d.ts +1 -1
  3. package/dist/calldata/index.d.ts.map +1 -1
  4. package/dist/calldata/index.js.map +1 -1
  5. package/dist/calldata/parameter-decoder.d.ts.map +1 -1
  6. package/dist/calldata/parameter-decoder.js +8 -1
  7. package/dist/calldata/parameter-decoder.js.map +1 -1
  8. package/dist/calldata/signature-lookup.d.ts +17 -2
  9. package/dist/calldata/signature-lookup.d.ts.map +1 -1
  10. package/dist/calldata/signature-lookup.js +20 -2
  11. package/dist/calldata/signature-lookup.js.map +1 -1
  12. package/dist/cli/cli.d.ts +21 -0
  13. package/dist/cli/cli.d.ts.map +1 -0
  14. package/dist/cli/{monitor.js → cli.js} +148 -74
  15. package/dist/cli/cli.js.map +1 -0
  16. package/dist/cli/lib/cli.d.ts +6 -1
  17. package/dist/cli/lib/cli.d.ts.map +1 -1
  18. package/dist/cli/lib/cli.js +58 -20
  19. package/dist/cli/lib/cli.js.map +1 -1
  20. package/dist/cli/lib/concurrency.d.ts +20 -0
  21. package/dist/cli/lib/concurrency.d.ts.map +1 -0
  22. package/dist/cli/lib/concurrency.js +32 -0
  23. package/dist/cli/lib/concurrency.js.map +1 -0
  24. package/dist/cli/tui/App.d.ts +13 -0
  25. package/dist/cli/tui/App.d.ts.map +1 -0
  26. package/dist/cli/tui/App.js +146 -0
  27. package/dist/cli/tui/App.js.map +1 -0
  28. package/dist/cli/tui/components/CollapsibleSection.d.ts +20 -0
  29. package/dist/cli/tui/components/CollapsibleSection.d.ts.map +1 -0
  30. package/dist/cli/tui/components/CollapsibleSection.js +29 -0
  31. package/dist/cli/tui/components/CollapsibleSection.js.map +1 -0
  32. package/dist/cli/tui/components/ConfirmDialog.d.ts +14 -0
  33. package/dist/cli/tui/components/ConfirmDialog.d.ts.map +1 -0
  34. package/dist/cli/tui/components/ConfirmDialog.js +29 -0
  35. package/dist/cli/tui/components/ConfirmDialog.js.map +1 -0
  36. package/dist/cli/tui/components/CopyableText.d.ts +23 -0
  37. package/dist/cli/tui/components/CopyableText.d.ts.map +1 -0
  38. package/dist/cli/tui/components/CopyableText.js +49 -0
  39. package/dist/cli/tui/components/CopyableText.js.map +1 -0
  40. package/dist/cli/tui/components/EmptyState.d.ts +11 -0
  41. package/dist/cli/tui/components/EmptyState.d.ts.map +1 -0
  42. package/dist/cli/tui/components/EmptyState.js +34 -0
  43. package/dist/cli/tui/components/EmptyState.js.map +1 -0
  44. package/dist/cli/tui/components/ErrorDisplay.d.ts +17 -0
  45. package/dist/cli/tui/components/ErrorDisplay.d.ts.map +1 -0
  46. package/dist/cli/tui/components/ErrorDisplay.js +66 -0
  47. package/dist/cli/tui/components/ErrorDisplay.js.map +1 -0
  48. package/dist/cli/tui/components/Header.d.ts +22 -0
  49. package/dist/cli/tui/components/Header.d.ts.map +1 -0
  50. package/dist/cli/tui/components/Header.js +73 -0
  51. package/dist/cli/tui/components/Header.js.map +1 -0
  52. package/dist/cli/tui/components/KeyHelp.d.ts +20 -0
  53. package/dist/cli/tui/components/KeyHelp.d.ts.map +1 -0
  54. package/dist/cli/tui/components/KeyHelp.js +136 -0
  55. package/dist/cli/tui/components/KeyHelp.js.map +1 -0
  56. package/dist/cli/tui/components/ProposalRow.d.ts +11 -0
  57. package/dist/cli/tui/components/ProposalRow.d.ts.map +1 -0
  58. package/dist/cli/tui/components/ProposalRow.js +106 -0
  59. package/dist/cli/tui/components/ProposalRow.js.map +1 -0
  60. package/dist/cli/tui/components/ScrollIndicator.d.ts +26 -0
  61. package/dist/cli/tui/components/ScrollIndicator.d.ts.map +1 -0
  62. package/dist/cli/tui/components/ScrollIndicator.js +59 -0
  63. package/dist/cli/tui/components/ScrollIndicator.js.map +1 -0
  64. package/dist/cli/tui/components/SearchBar.d.ts +12 -0
  65. package/dist/cli/tui/components/SearchBar.d.ts.map +1 -0
  66. package/dist/cli/tui/components/SearchBar.js +36 -0
  67. package/dist/cli/tui/components/SearchBar.js.map +1 -0
  68. package/dist/cli/tui/components/Skeleton.d.ts +22 -0
  69. package/dist/cli/tui/components/Skeleton.d.ts.map +1 -0
  70. package/dist/cli/tui/components/Skeleton.js +35 -0
  71. package/dist/cli/tui/components/Skeleton.js.map +1 -0
  72. package/dist/cli/tui/components/Spinner.d.ts +10 -0
  73. package/dist/cli/tui/components/Spinner.d.ts.map +1 -0
  74. package/dist/cli/tui/components/Spinner.js +24 -0
  75. package/dist/cli/tui/components/Spinner.js.map +1 -0
  76. package/dist/cli/tui/components/StageProgress.d.ts +12 -0
  77. package/dist/cli/tui/components/StageProgress.d.ts.map +1 -0
  78. package/dist/cli/tui/components/StageProgress.js +72 -0
  79. package/dist/cli/tui/components/StageProgress.js.map +1 -0
  80. package/dist/cli/tui/components/StageRow.d.ts +12 -0
  81. package/dist/cli/tui/components/StageRow.d.ts.map +1 -0
  82. package/dist/cli/tui/components/StageRow.js +106 -0
  83. package/dist/cli/tui/components/StageRow.js.map +1 -0
  84. package/dist/cli/tui/components/StatusBadge.d.ts +12 -0
  85. package/dist/cli/tui/components/StatusBadge.d.ts.map +1 -0
  86. package/dist/cli/tui/components/StatusBadge.js +27 -0
  87. package/dist/cli/tui/components/StatusBadge.js.map +1 -0
  88. package/dist/cli/tui/components/StatusBar.d.ts +12 -0
  89. package/dist/cli/tui/components/StatusBar.d.ts.map +1 -0
  90. package/dist/cli/tui/components/StatusBar.js +14 -0
  91. package/dist/cli/tui/components/StatusBar.js.map +1 -0
  92. package/dist/cli/tui/components/Timeline.d.ts +12 -0
  93. package/dist/cli/tui/components/Timeline.d.ts.map +1 -0
  94. package/dist/cli/tui/components/Timeline.js +91 -0
  95. package/dist/cli/tui/components/Timeline.js.map +1 -0
  96. package/dist/cli/tui/components/Toast.d.ts +13 -0
  97. package/dist/cli/tui/components/Toast.d.ts.map +1 -0
  98. package/dist/cli/tui/components/Toast.js +35 -0
  99. package/dist/cli/tui/components/Toast.js.map +1 -0
  100. package/dist/cli/tui/components/TrackingProgress.d.ts +24 -0
  101. package/dist/cli/tui/components/TrackingProgress.d.ts.map +1 -0
  102. package/dist/cli/tui/components/TrackingProgress.js +82 -0
  103. package/dist/cli/tui/components/TrackingProgress.js.map +1 -0
  104. package/dist/cli/tui/components/ViewLayout.d.ts +26 -0
  105. package/dist/cli/tui/components/ViewLayout.d.ts.map +1 -0
  106. package/dist/cli/tui/components/ViewLayout.js +57 -0
  107. package/dist/cli/tui/components/ViewLayout.js.map +1 -0
  108. package/dist/cli/tui/components/VotingStats.d.ts +11 -0
  109. package/dist/cli/tui/components/VotingStats.d.ts.map +1 -0
  110. package/dist/cli/tui/components/VotingStats.js +87 -0
  111. package/dist/cli/tui/components/VotingStats.js.map +1 -0
  112. package/dist/cli/tui/config.d.ts +42 -0
  113. package/dist/cli/tui/config.d.ts.map +1 -0
  114. package/dist/cli/tui/config.js +144 -0
  115. package/dist/cli/tui/config.js.map +1 -0
  116. package/dist/cli/tui/hooks/index.d.ts +12 -0
  117. package/dist/cli/tui/hooks/index.d.ts.map +1 -0
  118. package/dist/cli/tui/hooks/index.js +18 -0
  119. package/dist/cli/tui/hooks/index.js.map +1 -0
  120. package/dist/cli/tui/hooks/useCache.d.ts +12 -0
  121. package/dist/cli/tui/hooks/useCache.d.ts.map +1 -0
  122. package/dist/cli/tui/hooks/useCache.js +110 -0
  123. package/dist/cli/tui/hooks/useCache.js.map +1 -0
  124. package/dist/cli/tui/hooks/useCliProcess.d.ts +19 -0
  125. package/dist/cli/tui/hooks/useCliProcess.d.ts.map +1 -0
  126. package/dist/cli/tui/hooks/useCliProcess.js +135 -0
  127. package/dist/cli/tui/hooks/useCliProcess.js.map +1 -0
  128. package/dist/cli/tui/hooks/useNavigation.d.ts +40 -0
  129. package/dist/cli/tui/hooks/useNavigation.d.ts.map +1 -0
  130. package/dist/cli/tui/hooks/useNavigation.js +283 -0
  131. package/dist/cli/tui/hooks/useNavigation.js.map +1 -0
  132. package/dist/cli/tui/hooks/useProposals.d.ts +10 -0
  133. package/dist/cli/tui/hooks/useProposals.d.ts.map +1 -0
  134. package/dist/cli/tui/hooks/useProposals.js +215 -0
  135. package/dist/cli/tui/hooks/useProposals.js.map +1 -0
  136. package/dist/cli/tui/hooks/useStageCalldata.d.ts +17 -0
  137. package/dist/cli/tui/hooks/useStageCalldata.d.ts.map +1 -0
  138. package/dist/cli/tui/hooks/useStageCalldata.js +77 -0
  139. package/dist/cli/tui/hooks/useStageCalldata.js.map +1 -0
  140. package/dist/cli/tui/hooks/useTracker.d.ts +27 -0
  141. package/dist/cli/tui/hooks/useTracker.d.ts.map +1 -0
  142. package/dist/cli/tui/hooks/useTracker.js +205 -0
  143. package/dist/cli/tui/hooks/useTracker.js.map +1 -0
  144. package/dist/cli/tui/index.d.ts +15 -0
  145. package/dist/cli/tui/index.d.ts.map +1 -0
  146. package/dist/cli/tui/index.js +100 -0
  147. package/dist/cli/tui/index.js.map +1 -0
  148. package/dist/cli/tui/ink-wrapper.d.ts +43 -0
  149. package/dist/cli/tui/ink-wrapper.d.ts.map +1 -0
  150. package/dist/cli/tui/ink-wrapper.js +41 -0
  151. package/dist/cli/tui/ink-wrapper.js.map +1 -0
  152. package/dist/cli/tui/types.d.ts +37 -0
  153. package/dist/cli/tui/types.d.ts.map +1 -0
  154. package/dist/cli/tui/types.js +6 -0
  155. package/dist/cli/tui/types.js.map +1 -0
  156. package/dist/cli/tui/utils/clipboard.d.ts +7 -0
  157. package/dist/cli/tui/utils/clipboard.d.ts.map +1 -0
  158. package/dist/cli/tui/utils/clipboard.js +46 -0
  159. package/dist/cli/tui/utils/clipboard.js.map +1 -0
  160. package/dist/cli/tui/utils/index.d.ts +5 -0
  161. package/dist/cli/tui/utils/index.d.ts.map +1 -0
  162. package/dist/cli/tui/utils/index.js +13 -0
  163. package/dist/cli/tui/utils/index.js.map +1 -0
  164. package/dist/cli/tui/utils/terminal.d.ts +18 -0
  165. package/dist/cli/tui/utils/terminal.d.ts.map +1 -0
  166. package/dist/cli/tui/utils/terminal.js +26 -0
  167. package/dist/cli/tui/utils/terminal.js.map +1 -0
  168. package/dist/cli/tui/utils/text.d.ts +12 -0
  169. package/dist/cli/tui/utils/text.d.ts.map +1 -0
  170. package/dist/cli/tui/utils/text.js +30 -0
  171. package/dist/cli/tui/utils/text.js.map +1 -0
  172. package/dist/cli/tui/views/CalldataView.d.ts +12 -0
  173. package/dist/cli/tui/views/CalldataView.d.ts.map +1 -0
  174. package/dist/cli/tui/views/CalldataView.js +194 -0
  175. package/dist/cli/tui/views/CalldataView.js.map +1 -0
  176. package/dist/cli/tui/views/DescriptionView.d.ts +12 -0
  177. package/dist/cli/tui/views/DescriptionView.d.ts.map +1 -0
  178. package/dist/cli/tui/views/DescriptionView.js +182 -0
  179. package/dist/cli/tui/views/DescriptionView.js.map +1 -0
  180. package/dist/cli/tui/views/ElectionView.d.ts +12 -0
  181. package/dist/cli/tui/views/ElectionView.d.ts.map +1 -0
  182. package/dist/cli/tui/views/ElectionView.js +197 -0
  183. package/dist/cli/tui/views/ElectionView.js.map +1 -0
  184. package/dist/cli/tui/views/HelpView.d.ts +10 -0
  185. package/dist/cli/tui/views/HelpView.d.ts.map +1 -0
  186. package/dist/cli/tui/views/HelpView.js +159 -0
  187. package/dist/cli/tui/views/HelpView.js.map +1 -0
  188. package/dist/cli/tui/views/ProposalDetail.d.ts +14 -0
  189. package/dist/cli/tui/views/ProposalDetail.d.ts.map +1 -0
  190. package/dist/cli/tui/views/ProposalDetail.js +167 -0
  191. package/dist/cli/tui/views/ProposalDetail.js.map +1 -0
  192. package/dist/cli/tui/views/ProposalList.d.ts +17 -0
  193. package/dist/cli/tui/views/ProposalList.d.ts.map +1 -0
  194. package/dist/cli/tui/views/ProposalList.js +126 -0
  195. package/dist/cli/tui/views/ProposalList.js.map +1 -0
  196. package/dist/cli/tui/views/SettingsView.d.ts +12 -0
  197. package/dist/cli/tui/views/SettingsView.d.ts.map +1 -0
  198. package/dist/cli/tui/views/SettingsView.js +203 -0
  199. package/dist/cli/tui/views/SettingsView.js.map +1 -0
  200. package/dist/cli/tui/views/SimulationView.d.ts +12 -0
  201. package/dist/cli/tui/views/SimulationView.d.ts.map +1 -0
  202. package/dist/cli/tui/views/SimulationView.js +112 -0
  203. package/dist/cli/tui/views/SimulationView.js.map +1 -0
  204. package/dist/cli/tui/views/StageView.d.ts +12 -0
  205. package/dist/cli/tui/views/StageView.d.ts.map +1 -0
  206. package/dist/cli/tui/views/StageView.js +215 -0
  207. package/dist/cli/tui/views/StageView.js.map +1 -0
  208. package/dist/constants.d.ts +1 -0
  209. package/dist/constants.d.ts.map +1 -1
  210. package/dist/constants.js +1 -0
  211. package/dist/constants.js.map +1 -1
  212. package/dist/data/bundled-cache.json +6651 -2485
  213. package/dist/discovery/governor-discovery.d.ts.map +1 -1
  214. package/dist/discovery/governor-discovery.js +2 -1
  215. package/dist/discovery/governor-discovery.js.map +1 -1
  216. package/dist/index.d.ts +22 -3
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +28 -3
  219. package/dist/index.js.map +1 -1
  220. package/dist/stages/l2-to-l1-message.d.ts +5 -0
  221. package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
  222. package/dist/stages/l2-to-l1-message.js +73 -7
  223. package/dist/stages/l2-to-l1-message.js.map +1 -1
  224. package/dist/stages/timelock.d.ts.map +1 -1
  225. package/dist/stages/timelock.js +10 -3
  226. package/dist/stages/timelock.js.map +1 -1
  227. package/dist/stages/utils.d.ts +5 -2
  228. package/dist/stages/utils.d.ts.map +1 -1
  229. package/dist/stages/utils.js +14 -6
  230. package/dist/stages/utils.js.map +1 -1
  231. package/dist/tracker/cache.d.ts +27 -0
  232. package/dist/tracker/cache.d.ts.map +1 -1
  233. package/dist/tracker/cache.js +50 -2
  234. package/dist/tracker/cache.js.map +1 -1
  235. package/dist/tracker/execute.d.ts.map +1 -1
  236. package/dist/tracker/execute.js +25 -1
  237. package/dist/tracker/execute.js.map +1 -1
  238. package/dist/types/stages.d.ts +15 -2
  239. package/dist/types/stages.d.ts.map +1 -1
  240. package/dist/types/stages.js.map +1 -1
  241. package/dist/types/tracking.d.ts +4 -0
  242. package/dist/types/tracking.d.ts.map +1 -1
  243. package/dist/utils/sanitize.d.ts +28 -0
  244. package/dist/utils/sanitize.d.ts.map +1 -0
  245. package/dist/utils/sanitize.js +52 -0
  246. package/dist/utils/sanitize.js.map +1 -0
  247. package/package.json +28 -16
  248. package/dist/cli/monitor.d.ts +0 -3
  249. package/dist/cli/monitor.d.ts.map +0 -1
  250. package/dist/cli/monitor.js.map +0 -1
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ /**
3
+ * Decoded calldata view with foldable long values (no truncation)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CalldataView = CalldataView;
7
+ const ink_wrapper_js_1 = require("../ink-wrapper.js");
8
+ const index_js_1 = require("../hooks/index.js");
9
+ const ViewLayout_js_1 = require("../components/ViewLayout.js");
10
+ const ScrollIndicator_js_1 = require("../components/ScrollIndicator.js");
11
+ const index_js_2 = require("../utils/index.js");
12
+ const FOLD_THRESHOLD = 100;
13
+ function formatParameter(param, indent, keyPrefix) {
14
+ const lines = [];
15
+ const foldKey = `${keyPrefix}-${param.name}`;
16
+ let value = param.displayValue;
17
+ if (param.addressLabel) {
18
+ value = `${param.displayValue} [${param.addressLabel}]`;
19
+ }
20
+ const isFoldable = value.length > FOLD_THRESHOLD;
21
+ const wrappedLines = isFoldable ? (0, index_js_2.wrapText)(value, 80) : [value];
22
+ lines.push({
23
+ text: `${param.name} (${param.type}): ${wrappedLines[0]}`,
24
+ indent,
25
+ foldable: isFoldable,
26
+ foldKey: isFoldable ? foldKey : undefined,
27
+ foldedLineCount: isFoldable ? wrappedLines.length - 1 : undefined,
28
+ });
29
+ if (isFoldable && wrappedLines.length > 1) {
30
+ for (let i = 1; i < wrappedLines.length; i++) {
31
+ lines.push({
32
+ text: wrappedLines[i],
33
+ indent: indent + 1,
34
+ foldable: false,
35
+ isFoldedContent: true,
36
+ foldKey,
37
+ });
38
+ }
39
+ }
40
+ if (param.nested) {
41
+ lines.push({ text: "└─ [NESTED]", indent: indent + 1, foldable: false });
42
+ lines.push(...formatDecodedCalldata(param.nested, indent + 2, `${foldKey}-nested`));
43
+ }
44
+ if (param.nestedArray && param.nestedArray.length > 0) {
45
+ param.nestedArray.forEach((nested, i) => {
46
+ lines.push({ text: `[${i}]:`, indent: indent + 1, foldable: false });
47
+ lines.push(...formatDecodedCalldata(nested, indent + 2, `${foldKey}-arr-${i}`));
48
+ });
49
+ }
50
+ return lines;
51
+ }
52
+ function formatDecodedCalldata(decoded, indent = 0, keyPrefix = "root") {
53
+ const lines = [];
54
+ let header;
55
+ if (decoded.isRetryable) {
56
+ header = `Retryable Ticket → ${decoded.targetChain}`;
57
+ }
58
+ else if (decoded.signature) {
59
+ header = decoded.signature;
60
+ }
61
+ else {
62
+ header = `Unknown function (${decoded.selector})`;
63
+ }
64
+ lines.push({ text: header, indent, foldable: false });
65
+ if (decoded.parameters) {
66
+ decoded.parameters.forEach((param, i) => {
67
+ lines.push(...formatParameter(param, indent + 1, `${keyPrefix}-p${i}`));
68
+ });
69
+ }
70
+ return lines;
71
+ }
72
+ const RESERVED_LINES = 14;
73
+ function CalldataView({ proposal, navigation, }) {
74
+ const { state } = navigation;
75
+ const stages = (0, ink_wrapper_js_1.useMemo)(() => proposal.checkpoint.cachedData.completedStages ?? [], [proposal.checkpoint.cachedData.completedStages]);
76
+ const { actions, loading, error } = (0, index_js_1.useStageCalldata)(stages[0], stages);
77
+ const [expandedKeys, setExpandedKeys] = (0, ink_wrapper_js_1.useState)(new Set());
78
+ const safeActionIndex = Math.min(state.calldataActionIndex, Math.max(0, actions.length - 1));
79
+ const currentAction = actions.length > 0 ? actions[safeActionIndex] : undefined;
80
+ const allLines = currentAction ? formatDecodedCalldata(currentAction.decoded) : [];
81
+ const displayLines = allLines.filter((line) => {
82
+ if (!line.isFoldedContent)
83
+ return true;
84
+ return line.foldKey && expandedKeys.has(line.foldKey);
85
+ });
86
+ const visibleCount = (0, index_js_2.getVisibleRows)(RESERVED_LINES);
87
+ const allFoldableKeys = allLines.filter((l) => l.foldable && l.foldKey).map((l) => l.foldKey);
88
+ (0, ink_wrapper_js_1.useInput)((input, key) => {
89
+ if (input === "b" || key.escape) {
90
+ navigation.back();
91
+ }
92
+ else if (key.upArrow || input === "k") {
93
+ navigation.moveUp();
94
+ }
95
+ else if (key.downArrow || input === "j") {
96
+ navigation.moveDown(displayLines.length);
97
+ }
98
+ else if (key.pageUp || (key.ctrl && input === "u")) {
99
+ navigation.pageUp(displayLines.length);
100
+ }
101
+ else if (key.pageDown || (key.ctrl && input === "d")) {
102
+ navigation.pageDown(displayLines.length);
103
+ }
104
+ else if (key.leftArrow) {
105
+ navigation.prevAction();
106
+ }
107
+ else if (key.rightArrow) {
108
+ navigation.nextAction(actions.length);
109
+ }
110
+ else if (input === "e") {
111
+ setExpandedKeys(new Set(allFoldableKeys));
112
+ navigation.goToTop();
113
+ }
114
+ else if (input === "c") {
115
+ setExpandedKeys(new Set());
116
+ navigation.goToTop();
117
+ }
118
+ else if (input === "g") {
119
+ navigation.goToTop();
120
+ }
121
+ else if (input === "G") {
122
+ navigation.goToBottom(displayLines.length);
123
+ }
124
+ else if (key.return) {
125
+ const safeIdx = Math.max(0, Math.min(state.scrollOffset, displayLines.length - 1));
126
+ const currentLine = displayLines[safeIdx];
127
+ if (currentLine?.foldable && currentLine.foldKey) {
128
+ setExpandedKeys((prev) => {
129
+ const next = new Set(prev);
130
+ if (next.has(currentLine.foldKey)) {
131
+ next.delete(currentLine.foldKey);
132
+ }
133
+ else {
134
+ next.add(currentLine.foldKey);
135
+ }
136
+ return next;
137
+ });
138
+ }
139
+ }
140
+ else if (input === "?") {
141
+ navigation.goToHelp();
142
+ }
143
+ });
144
+ // Clamp scrollOffset to valid range in case displayLines shrunk after fold collapse
145
+ const safeOffset = Math.max(0, Math.min(state.scrollOffset, displayLines.length - 1));
146
+ const visibleLines = displayLines.slice(safeOffset, safeOffset + visibleCount);
147
+ const shortTitle = proposal.title.length > 30
148
+ ? proposal.title.substring(0, 30) + "..."
149
+ : proposal.title;
150
+ const breadcrumb = ["Proposals", shortTitle, "Calldata"];
151
+ const keyHelpContext = {
152
+ calldataActionCount: actions.length,
153
+ currentActionIndex: safeActionIndex,
154
+ };
155
+ if (actions.length === 0) {
156
+ return (ink_wrapper_js_1.React.createElement(ViewLayout_js_1.ViewLayout, { view: "calldata", loading: loading, loadingText: "Decoding calldata...", skeletonType: "text", error: error, breadcrumb: breadcrumb },
157
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "No calldata to display")));
158
+ }
159
+ return (ink_wrapper_js_1.React.createElement(ViewLayout_js_1.ViewLayout, { view: "calldata", loading: loading, loadingText: "Decoding calldata...", skeletonType: "text", error: error, breadcrumb: breadcrumb, keyHelpContext: keyHelpContext },
160
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginBottom: 1 },
161
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "cyan" },
162
+ "Action ",
163
+ safeActionIndex + 1,
164
+ "/",
165
+ actions.length),
166
+ actions.length > 1 && ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, " (\u2190 \u2192 navigate)"),
167
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, " (Enter toggle, e=expand all, c=collapse all)")),
168
+ currentAction && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { flexDirection: "column", marginBottom: 1 },
169
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
170
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Target: "),
171
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, currentAction.target)),
172
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
173
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Value: "),
174
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, currentAction.value)))),
175
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { flexDirection: "column" },
176
+ displayLines.length > visibleCount && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginBottom: 1 },
177
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollPosition, { scrollOffset: safeOffset, visibleRows: visibleCount, totalItems: displayLines.length }))),
178
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollIndicatorTop, { scrollOffset: safeOffset, unit: "lines" }),
179
+ visibleLines.map((line, i) => {
180
+ const prefix = " ".repeat(line.indent);
181
+ const isExpanded = line.foldKey && expandedKeys.has(line.foldKey);
182
+ const foldIndicator = line.foldable
183
+ ? isExpanded
184
+ ? "[-] "
185
+ : `[+${line.foldedLineCount ?? 0}] `
186
+ : "";
187
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { key: i },
188
+ prefix,
189
+ line.foldable && ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "yellow" }, foldIndicator),
190
+ line.text));
191
+ }),
192
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollIndicatorBottom, { scrollOffset: safeOffset, visibleRows: visibleCount, totalItems: displayLines.length, unit: "lines" }))));
193
+ }
194
+ //# sourceMappingURL=CalldataView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CalldataView.js","sourceRoot":"","sources":["../../../../src/cli/tui/views/CalldataView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Full proposal description view with markdown rendering
3
+ */
4
+ import type { ProposalListItem } from "../types.js";
5
+ import type { UseNavigationResult } from "../hooks/index.js";
6
+ interface DescriptionViewProps {
7
+ proposal: ProposalListItem;
8
+ navigation: UseNavigationResult;
9
+ }
10
+ export declare function DescriptionView({ proposal, navigation, }: DescriptionViewProps): React.ReactElement;
11
+ export {};
12
+ //# sourceMappingURL=DescriptionView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DescriptionView.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/views/DescriptionView.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAS7D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAiKD,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,UAAU,GACX,EAAE,oBAAoB,GAAG,KAAK,CAAC,YAAY,CA4D3C"}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Full proposal description view with markdown rendering
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DescriptionView = DescriptionView;
7
+ const ink_wrapper_js_1 = require("../ink-wrapper.js");
8
+ const ViewLayout_js_1 = require("../components/ViewLayout.js");
9
+ const ScrollIndicator_js_1 = require("../components/ScrollIndicator.js");
10
+ const index_js_1 = require("../utils/index.js");
11
+ function getDescription(proposal) {
12
+ const stages = proposal.checkpoint.cachedData.completedStages ?? [];
13
+ const createdStage = stages.find((s) => s.type === "PROPOSAL_CREATED");
14
+ if (createdStage?.data) {
15
+ const data = createdStage.data;
16
+ if (data.description) {
17
+ return data.description;
18
+ }
19
+ }
20
+ return "No description available";
21
+ }
22
+ function parseMarkdown(text, width) {
23
+ const result = [];
24
+ const lines = text.split("\n");
25
+ // Guard against very narrow terminals
26
+ const safeWidth = Math.max(20, width);
27
+ for (const rawLine of lines) {
28
+ const trimmed = rawLine.trim();
29
+ // Empty line
30
+ if (trimmed.length === 0) {
31
+ result.push({ text: "", type: "normal", indent: 0 });
32
+ continue;
33
+ }
34
+ // Horizontal rule
35
+ if (/^[-*_]{3,}$/.test(trimmed)) {
36
+ result.push({ text: "─".repeat(Math.min(safeWidth - 4, 60)), type: "separator", indent: 0 });
37
+ continue;
38
+ }
39
+ // Headers
40
+ if (trimmed.startsWith("### ")) {
41
+ result.push({ text: trimmed.slice(4), type: "h3", indent: 0 });
42
+ continue;
43
+ }
44
+ if (trimmed.startsWith("## ")) {
45
+ result.push({ text: trimmed.slice(3), type: "h2", indent: 0 });
46
+ continue;
47
+ }
48
+ if (trimmed.startsWith("# ")) {
49
+ result.push({ text: trimmed.slice(2), type: "h1", indent: 0 });
50
+ continue;
51
+ }
52
+ // Bullet points
53
+ if (/^[-*+] /.test(trimmed)) {
54
+ const bulletText = trimmed.slice(2);
55
+ wrapTextToLines(bulletText, safeWidth - 6, "bullet", 2, result);
56
+ continue;
57
+ }
58
+ // Numbered lists
59
+ if (/^\d+\. /.test(trimmed)) {
60
+ const match = trimmed.match(/^(\d+)\. /);
61
+ if (match) {
62
+ const numText = trimmed.slice(match[0].length);
63
+ const textWidth = safeWidth - 6;
64
+ result.push({ text: `${match[1]}. ${numText.slice(0, textWidth)}`, type: "bullet", indent: 0 });
65
+ if (numText.length > textWidth) {
66
+ wrapTextToLines(numText.slice(textWidth), textWidth, "normal", 3, result);
67
+ }
68
+ continue;
69
+ }
70
+ }
71
+ // Code blocks (just show as-is with code styling)
72
+ if (trimmed.startsWith("```")) {
73
+ continue; // Skip code fence markers
74
+ }
75
+ // Links - simplify [text](url) to just text
76
+ const processedLine = trimmed.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
77
+ // Normal paragraph
78
+ wrapTextToLines(processedLine, safeWidth - 4, "normal", 0, result);
79
+ }
80
+ return result;
81
+ }
82
+ function wrapTextToLines(text, width, type, indent, result) {
83
+ const safeWidth = Math.max(10, width);
84
+ const words = text.split(/\s+/);
85
+ let currentLine = "";
86
+ for (const word of words) {
87
+ if (currentLine.length === 0) {
88
+ currentLine = word;
89
+ }
90
+ else if (currentLine.length + 1 + word.length <= safeWidth) {
91
+ currentLine += " " + word;
92
+ }
93
+ else {
94
+ result.push({ text: currentLine, type, indent });
95
+ currentLine = word;
96
+ // Continuation lines of bullets get extra indent
97
+ if (type === "bullet" && indent === 2) {
98
+ indent = 4;
99
+ }
100
+ }
101
+ }
102
+ if (currentLine.length > 0) {
103
+ result.push({ text: currentLine, type, indent });
104
+ }
105
+ }
106
+ const RESERVED_LINES = 8;
107
+ function FormattedLineComponent({ line }) {
108
+ const indent = " ".repeat(line.indent);
109
+ switch (line.type) {
110
+ case "h1":
111
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { bold: true, color: "cyan" },
112
+ indent,
113
+ "\u2550 ",
114
+ line.text));
115
+ case "h2":
116
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { bold: true, color: "yellow" },
117
+ indent,
118
+ "\u25B6 ",
119
+ line.text));
120
+ case "h3":
121
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { bold: true },
122
+ indent,
123
+ "\u2022 ",
124
+ line.text));
125
+ case "bullet":
126
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null,
127
+ indent,
128
+ "\u2022 ",
129
+ line.text));
130
+ case "separator":
131
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, line.text);
132
+ default:
133
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null,
134
+ indent,
135
+ line.text);
136
+ }
137
+ }
138
+ function DescriptionView({ proposal, navigation, }) {
139
+ const { state } = navigation;
140
+ const description = getDescription(proposal);
141
+ const terminalWidth = process.stdout.columns || 80;
142
+ const lines = (0, ink_wrapper_js_1.useMemo)(() => parseMarkdown(description, terminalWidth - 4), [description, terminalWidth]);
143
+ const visibleCount = (0, index_js_1.getVisibleRows)(RESERVED_LINES);
144
+ const visibleLines = lines.slice(state.scrollOffset, state.scrollOffset + visibleCount);
145
+ (0, ink_wrapper_js_1.useInput)((input, key) => {
146
+ if (input === "b" || key.escape) {
147
+ navigation.back();
148
+ }
149
+ else if (key.upArrow || input === "k") {
150
+ navigation.moveUp();
151
+ }
152
+ else if (key.downArrow || input === "j") {
153
+ navigation.moveDown(lines.length);
154
+ }
155
+ else if (key.pageUp || (key.ctrl && input === "u")) {
156
+ navigation.pageUp(lines.length);
157
+ }
158
+ else if (key.pageDown || (key.ctrl && input === "d")) {
159
+ navigation.pageDown(lines.length);
160
+ }
161
+ else if (input === "g") {
162
+ navigation.goToTop();
163
+ }
164
+ else if (input === "G") {
165
+ navigation.goToBottom(lines.length);
166
+ }
167
+ else if (input === "?") {
168
+ navigation.goToHelp();
169
+ }
170
+ });
171
+ const shortTitle = proposal.title.length > 30
172
+ ? proposal.title.substring(0, 30) + "..."
173
+ : proposal.title;
174
+ const breadcrumb = ["Proposals", shortTitle, "Description"];
175
+ return (ink_wrapper_js_1.React.createElement(ViewLayout_js_1.ViewLayout, { view: "description", title: "Proposal Description", breadcrumb: breadcrumb },
176
+ lines.length > visibleCount && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginBottom: 1 },
177
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollPosition, { scrollOffset: state.scrollOffset, visibleRows: visibleCount, totalItems: lines.length }))),
178
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollIndicatorTop, { scrollOffset: state.scrollOffset, unit: "lines" }),
179
+ visibleLines.map((line, i) => (ink_wrapper_js_1.React.createElement(FormattedLineComponent, { key: i, line: line }))),
180
+ ink_wrapper_js_1.React.createElement(ScrollIndicator_js_1.ScrollIndicatorBottom, { scrollOffset: state.scrollOffset, visibleRows: visibleCount, totalItems: lines.length, unit: "lines" })));
181
+ }
182
+ //# sourceMappingURL=DescriptionView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DescriptionView.js","sourceRoot":"","sources":["../../../../src/cli/tui/views/DescriptionView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Security Council Election Status View
3
+ */
4
+ import type { UseNavigationResult } from "../hooks/index.js";
5
+ import type { ProviderBundle } from "../../lib/cli.js";
6
+ interface ElectionViewProps {
7
+ navigation: UseNavigationResult;
8
+ providers?: ProviderBundle;
9
+ }
10
+ export declare function ElectionView({ navigation, providers }: ElectionViewProps): React.ReactElement;
11
+ export {};
12
+ //# sourceMappingURL=ElectionView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElectionView.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/views/ElectionView.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,UAAU,iBAAiB;IACzB,UAAU,EAAE,mBAAmB,CAAC;IAChC,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AA8BD,wBAAgB,YAAY,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,CA8J7F"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /**
3
+ * Security Council Election Status View
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ElectionView = ElectionView;
7
+ const ink_wrapper_js_1 = require("../ink-wrapper.js");
8
+ const react_1 = require("react");
9
+ const ViewLayout_js_1 = require("../components/ViewLayout.js");
10
+ const election_js_1 = require("../../../election.js");
11
+ function formatTimestamp(ts) {
12
+ return new Date(ts * 1000).toLocaleString();
13
+ }
14
+ function PhaseIcon({ phase }) {
15
+ switch (phase) {
16
+ case "COMPLETED":
17
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "green" }, "\u2713");
18
+ case "MEMBER_ELECTION":
19
+ case "NOMINEE_SELECTION":
20
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "yellow" }, "\u25CF");
21
+ case "VETTING_PERIOD":
22
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "cyan" }, "\u25D0");
23
+ case "PENDING_EXECUTION":
24
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "magenta" }, "\u2192");
25
+ default:
26
+ return ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "\u25CB");
27
+ }
28
+ }
29
+ function ElectionView({ navigation, providers }) {
30
+ const [data, setData] = (0, react_1.useState)({
31
+ status: null,
32
+ proposals: [],
33
+ loading: true,
34
+ error: null,
35
+ warning: null,
36
+ });
37
+ const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
38
+ // Reset selection when proposals change to avoid out-of-bounds index
39
+ (0, react_1.useEffect)(() => {
40
+ setSelectedIndex(0);
41
+ }, [data.proposals.length]);
42
+ (0, react_1.useEffect)(() => {
43
+ if (!providers) {
44
+ setData({
45
+ status: null,
46
+ proposals: [],
47
+ loading: false,
48
+ error: "RPC providers required. Use --l2-rpc and --l1-rpc options.",
49
+ warning: null,
50
+ });
51
+ return;
52
+ }
53
+ let cancelled = false;
54
+ const loadElectionData = async () => {
55
+ try {
56
+ setData((prev) => ({ ...prev, loading: true, error: null }));
57
+ const status = await (0, election_js_1.checkElectionStatus)(providers.l2Provider, providers.l1Provider);
58
+ if (cancelled)
59
+ return;
60
+ const proposals = [];
61
+ let failedCount = 0;
62
+ if (status.electionCount > 0) {
63
+ const startIndex = Math.max(1, status.electionCount - 2);
64
+ for (let i = status.electionCount; i >= startIndex; i--) {
65
+ if (cancelled)
66
+ return;
67
+ try {
68
+ const proposal = await (0, election_js_1.trackElectionProposal)(i, providers.l2Provider, providers.l1Provider);
69
+ proposals.push(proposal);
70
+ }
71
+ catch {
72
+ failedCount++;
73
+ }
74
+ }
75
+ }
76
+ if (!cancelled) {
77
+ setData({
78
+ status,
79
+ proposals,
80
+ loading: false,
81
+ error: failedCount > 0 && proposals.length === 0
82
+ ? `Failed to load ${failedCount} election(s)`
83
+ : null,
84
+ warning: failedCount > 0 && proposals.length > 0
85
+ ? `Loaded ${proposals.length} election(s), ${failedCount} failed`
86
+ : null,
87
+ });
88
+ }
89
+ }
90
+ catch (err) {
91
+ if (!cancelled) {
92
+ setData({
93
+ status: null,
94
+ proposals: [],
95
+ loading: false,
96
+ error: err instanceof Error ? err.message : String(err),
97
+ warning: null,
98
+ });
99
+ }
100
+ }
101
+ };
102
+ loadElectionData();
103
+ return () => {
104
+ cancelled = true;
105
+ };
106
+ }, [providers]);
107
+ (0, ink_wrapper_js_1.useInput)((input, key) => {
108
+ if (input === "b" || key.escape) {
109
+ navigation.back();
110
+ }
111
+ else if (key.upArrow || input === "k") {
112
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
113
+ }
114
+ else if ((key.downArrow || input === "j") && data.proposals.length > 0) {
115
+ setSelectedIndex((prev) => Math.min(data.proposals.length - 1, prev + 1));
116
+ }
117
+ else if (input === "g") {
118
+ setSelectedIndex(0);
119
+ }
120
+ else if (input === "G" && data.proposals.length > 0) {
121
+ setSelectedIndex(data.proposals.length - 1);
122
+ }
123
+ else if (input === "?") {
124
+ navigation.goToHelp();
125
+ }
126
+ });
127
+ const { status, proposals, warning } = data;
128
+ return (ink_wrapper_js_1.React.createElement(ViewLayout_js_1.ViewLayout, { view: "election", hasProviders: !!providers, isTracking: data.loading, loading: data.loading, loadingText: "Loading election status...", skeletonType: "detail", error: data.error },
129
+ warning && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginBottom: 1 },
130
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "yellow" },
131
+ "[Warning] ",
132
+ warning))),
133
+ status && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { flexDirection: "column", marginBottom: 1 },
134
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { bold: true }, "Security Council Election Status"),
135
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginLeft: 1, flexDirection: "column" },
136
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
137
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Election Count: "),
138
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, status.electionCount)),
139
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
140
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Current Cohort: "),
141
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: status.cohort === 0 ? "cyan" : "magenta" }, status.cohort === 0 ? "FIRST" : "SECOND")),
142
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
143
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Can Create Election: "),
144
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: status.canCreateElection ? "green" : "gray" }, status.canCreateElection ? "Yes" : "No")),
145
+ !status.canCreateElection && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
146
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Next Election: "),
147
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, formatTimestamp(status.nextElectionTimestamp)),
148
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" },
149
+ " (",
150
+ status.timeUntilElection,
151
+ ")")))))),
152
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { flexDirection: "column" },
153
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { bold: true }, "Recent Elections"),
154
+ proposals.length === 0 ? (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray", marginLeft: 1 }, "No elections found")) : (proposals.map((election, i) => (ink_wrapper_js_1.React.createElement(ElectionItem, { key: election.electionIndex, election: election, isSelected: i === selectedIndex })))))));
155
+ }
156
+ function getPhaseColor(phase) {
157
+ if (phase === "COMPLETED")
158
+ return "green";
159
+ if (phase === "NOT_STARTED")
160
+ return "gray";
161
+ return "yellow";
162
+ }
163
+ function ElectionItem({ election, isSelected }) {
164
+ return (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginLeft: 1, flexDirection: "column" },
165
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
166
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: isSelected ? "cyan" : undefined }, isSelected ? "> " : " "),
167
+ ink_wrapper_js_1.React.createElement(PhaseIcon, { phase: election.phase }),
168
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, " "),
169
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: isSelected ? "cyan" : undefined, bold: isSelected },
170
+ "Election #",
171
+ election.electionIndex),
172
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, " - "),
173
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: getPhaseColor(election.phase) }, election.phase.replace(/_/g, " "))),
174
+ isSelected && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, { marginLeft: 4, flexDirection: "column" },
175
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
176
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Cohort: "),
177
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, election.cohort === 0 ? "FIRST" : "SECOND")),
178
+ election.nomineeProposalId && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
179
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Nominee State: "),
180
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, election.nomineeProposalState))),
181
+ election.memberProposalId && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
182
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Member State: "),
183
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, null, election.memberProposalState))),
184
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
185
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "gray" }, "Compliant Nominees: "),
186
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: election.compliantNomineeCount >= election.targetNomineeCount ? "green" : "yellow" },
187
+ election.compliantNomineeCount,
188
+ "/",
189
+ election.targetNomineeCount)),
190
+ election.isInVettingPeriod && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
191
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "cyan" },
192
+ "In vetting period until block ",
193
+ election.vettingDeadline))),
194
+ election.canProceedToMemberPhase && (ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Box, null,
195
+ ink_wrapper_js_1.React.createElement(ink_wrapper_js_1.Text, { color: "green" }, "Ready to trigger member election!")))))));
196
+ }
197
+ //# sourceMappingURL=ElectionView.js.map