@aaronbassett/midnight-local-devnet 0.1.2 → 0.2.1

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 (94) hide show
  1. package/README.md +44 -5
  2. package/dist/cli/commands/dashboard.d.ts +3 -0
  3. package/dist/cli/commands/dashboard.js +20 -0
  4. package/dist/cli/commands/dashboard.js.map +1 -0
  5. package/dist/cli/commands/interactive.d.ts +3 -0
  6. package/dist/cli/commands/interactive.js +16 -0
  7. package/dist/cli/commands/interactive.js.map +1 -0
  8. package/dist/cli/dashboard/app.d.ts +9 -0
  9. package/dist/cli/dashboard/app.js +106 -0
  10. package/dist/cli/dashboard/app.js.map +1 -0
  11. package/dist/cli/dashboard/components/gauge.d.ts +9 -0
  12. package/dist/cli/dashboard/components/gauge.js +10 -0
  13. package/dist/cli/dashboard/components/gauge.js.map +1 -0
  14. package/dist/cli/dashboard/components/panel-box.d.ts +10 -0
  15. package/dist/cli/dashboard/components/panel-box.js +6 -0
  16. package/dist/cli/dashboard/components/panel-box.js.map +1 -0
  17. package/dist/cli/dashboard/components/sparkline.d.ts +9 -0
  18. package/dist/cli/dashboard/components/sparkline.js +25 -0
  19. package/dist/cli/dashboard/components/sparkline.js.map +1 -0
  20. package/dist/cli/dashboard/components/status-badge.d.ts +6 -0
  21. package/dist/cli/dashboard/components/status-badge.js +24 -0
  22. package/dist/cli/dashboard/components/status-badge.js.map +1 -0
  23. package/dist/cli/dashboard/hooks/use-breakpoint.d.ts +7 -0
  24. package/dist/cli/dashboard/hooks/use-breakpoint.js +15 -0
  25. package/dist/cli/dashboard/hooks/use-breakpoint.js.map +1 -0
  26. package/dist/cli/dashboard/hooks/use-health.d.ts +9 -0
  27. package/dist/cli/dashboard/hooks/use-health.js +35 -0
  28. package/dist/cli/dashboard/hooks/use-health.js.map +1 -0
  29. package/dist/cli/dashboard/hooks/use-indexer-info.d.ts +5 -0
  30. package/dist/cli/dashboard/hooks/use-indexer-info.js +19 -0
  31. package/dist/cli/dashboard/hooks/use-indexer-info.js.map +1 -0
  32. package/dist/cli/dashboard/hooks/use-logs.d.ts +19 -0
  33. package/dist/cli/dashboard/hooks/use-logs.js +55 -0
  34. package/dist/cli/dashboard/hooks/use-logs.js.map +1 -0
  35. package/dist/cli/dashboard/hooks/use-node-info.d.ts +21 -0
  36. package/dist/cli/dashboard/hooks/use-node-info.js +49 -0
  37. package/dist/cli/dashboard/hooks/use-node-info.js.map +1 -0
  38. package/dist/cli/dashboard/hooks/use-polling.d.ts +7 -0
  39. package/dist/cli/dashboard/hooks/use-polling.js +35 -0
  40. package/dist/cli/dashboard/hooks/use-polling.js.map +1 -0
  41. package/dist/cli/dashboard/hooks/use-proof-server.d.ts +7 -0
  42. package/dist/cli/dashboard/hooks/use-proof-server.js +14 -0
  43. package/dist/cli/dashboard/hooks/use-proof-server.js.map +1 -0
  44. package/dist/cli/dashboard/hooks/use-services.d.ts +3 -0
  45. package/dist/cli/dashboard/hooks/use-services.js +6 -0
  46. package/dist/cli/dashboard/hooks/use-services.js.map +1 -0
  47. package/dist/cli/dashboard/hooks/use-terminal-size.d.ts +5 -0
  48. package/dist/cli/dashboard/hooks/use-terminal-size.js +22 -0
  49. package/dist/cli/dashboard/hooks/use-terminal-size.js.map +1 -0
  50. package/dist/cli/dashboard/hooks/use-wallet-state.d.ts +10 -0
  51. package/dist/cli/dashboard/hooks/use-wallet-state.js +63 -0
  52. package/dist/cli/dashboard/hooks/use-wallet-state.js.map +1 -0
  53. package/dist/cli/dashboard/layouts/large.d.ts +7 -0
  54. package/dist/cli/dashboard/layouts/large.js +13 -0
  55. package/dist/cli/dashboard/layouts/large.js.map +1 -0
  56. package/dist/cli/dashboard/layouts/medium.d.ts +7 -0
  57. package/dist/cli/dashboard/layouts/medium.js +11 -0
  58. package/dist/cli/dashboard/layouts/medium.js.map +1 -0
  59. package/dist/cli/dashboard/layouts/small.d.ts +7 -0
  60. package/dist/cli/dashboard/layouts/small.js +11 -0
  61. package/dist/cli/dashboard/layouts/small.js.map +1 -0
  62. package/dist/cli/dashboard/lib/log-parser.d.ts +15 -0
  63. package/dist/cli/dashboard/lib/log-parser.js +44 -0
  64. package/dist/cli/dashboard/lib/log-parser.js.map +1 -0
  65. package/dist/cli/dashboard/lib/proof-server-api.d.ts +15 -0
  66. package/dist/cli/dashboard/lib/proof-server-api.js +48 -0
  67. package/dist/cli/dashboard/lib/proof-server-api.js.map +1 -0
  68. package/dist/cli/dashboard/lib/substrate-rpc.d.ts +16 -0
  69. package/dist/cli/dashboard/lib/substrate-rpc.js +39 -0
  70. package/dist/cli/dashboard/lib/substrate-rpc.js.map +1 -0
  71. package/dist/cli/dashboard/panels/indexer-panel.d.ts +11 -0
  72. package/dist/cli/dashboard/panels/indexer-panel.js +17 -0
  73. package/dist/cli/dashboard/panels/indexer-panel.js.map +1 -0
  74. package/dist/cli/dashboard/panels/log-panel.d.ts +13 -0
  75. package/dist/cli/dashboard/panels/log-panel.js +27 -0
  76. package/dist/cli/dashboard/panels/log-panel.js.map +1 -0
  77. package/dist/cli/dashboard/panels/node-panel.d.ts +10 -0
  78. package/dist/cli/dashboard/panels/node-panel.js +17 -0
  79. package/dist/cli/dashboard/panels/node-panel.js.map +1 -0
  80. package/dist/cli/dashboard/panels/proof-panel.d.ts +10 -0
  81. package/dist/cli/dashboard/panels/proof-panel.js +20 -0
  82. package/dist/cli/dashboard/panels/proof-panel.js.map +1 -0
  83. package/dist/cli/dashboard/panels/response-graph.d.ts +10 -0
  84. package/dist/cli/dashboard/panels/response-graph.js +12 -0
  85. package/dist/cli/dashboard/panels/response-graph.js.map +1 -0
  86. package/dist/cli/dashboard/panels/wallet-panel.d.ts +9 -0
  87. package/dist/cli/dashboard/panels/wallet-panel.js +24 -0
  88. package/dist/cli/dashboard/panels/wallet-panel.js.map +1 -0
  89. package/dist/cli/dashboard/types.d.ts +39 -0
  90. package/dist/cli/dashboard/types.js +2 -0
  91. package/dist/cli/dashboard/types.js.map +1 -0
  92. package/dist/cli.js +18 -18
  93. package/dist/cli.js.map +1 -1
  94. package/package.json +6 -2
@@ -0,0 +1,27 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { PanelBox } from '../components/panel-box.js';
4
+ const SERVICE_COLORS = {
5
+ node: 'green',
6
+ indexer: 'blue',
7
+ 'proof-server': 'yellow',
8
+ unknown: 'gray',
9
+ };
10
+ const LEVEL_COLORS = {
11
+ error: 'red',
12
+ warn: 'yellow',
13
+ info: 'white',
14
+ debug: 'gray',
15
+ };
16
+ export function LogPanel({ lines, filter, scrollOffset, maxLines = 10, focused, searchMode, searchText, }) {
17
+ const visibleLines = lines.slice(scrollOffset, scrollOffset + maxLines);
18
+ const filterLabel = [
19
+ filter.service ? `svc:${filter.service}` : null,
20
+ filter.level ? `lvl:${filter.level}` : null,
21
+ filter.search ? `/${filter.search}` : null,
22
+ ]
23
+ .filter(Boolean)
24
+ .join(' ') || 'all';
25
+ return (_jsxs(PanelBox, { title: `Logs (${filterLabel})`, focused: focused, children: [visibleLines.length === 0 ? (_jsxs(Text, { color: "gray", children: ["No log entries", filter.service || filter.level || filter.search ? ' matching filter' : ''] })) : (visibleLines.map((line, i) => (_jsxs(Box, { children: [_jsxs(Text, { color: SERVICE_COLORS[line.service] ?? 'gray', children: ["[", line.service.padEnd(6).slice(0, 6), "]"] }), _jsx(Text, { children: " " }), _jsx(Text, { color: LEVEL_COLORS[line.level] ?? 'white', children: line.message.slice(0, 200) })] }, `${scrollOffset + i}-${line.service}`)))), searchMode && (_jsx(Box, { children: _jsxs(Text, { color: "cyan", children: ["Search: ", searchText ?? '', "_"] }) })), _jsx(Box, { children: _jsxs(Text, { color: "gray", children: [lines.length, " lines | s=service l=level /=search | ", '\u2191\u2193', " scroll"] }) })] }));
26
+ }
27
+ //# sourceMappingURL=log-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-panel.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/panels/log-panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAatD,MAAM,cAAc,GAA2B;IAC7C,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,MAAM;IACf,cAAc,EAAE,QAAQ;IACxB,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,MAAM,EACN,YAAY,EACZ,QAAQ,GAAG,EAAE,EACb,OAAO,EACP,UAAU,EACV,UAAU,GACI;IACd,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC;IAExE,MAAM,WAAW,GAAG;QAClB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI;KAC3C;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IAEtB,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAE,SAAS,WAAW,GAAG,EAAE,OAAO,EAAE,OAAO,aACvD,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3B,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,+BAAgB,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAQ,CACpH,CAAC,CAAC,CAAC,CACF,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,kBAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,SAC/B,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,YAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GACtB,KAPC,GAAG,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAQzC,CACP,CAAC,CACH,EACA,UAAU,IAAI,CACb,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAU,UAAU,IAAI,EAAE,SAAS,GACjD,CACP,EACD,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,KAAK,CAAC,MAAM,4CAAwC,cAAc,eAC9D,GACH,IACG,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { NodeInfo } from '../hooks/use-node-info.js';
3
+ interface NodePanelProps {
4
+ data: NodeInfo | null;
5
+ loading: boolean;
6
+ focused?: boolean;
7
+ compact?: boolean;
8
+ }
9
+ export declare function NodePanel({ data, loading, focused, compact }: NodePanelProps): React.ReactElement;
10
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text } from 'ink';
3
+ import { PanelBox } from '../components/panel-box.js';
4
+ import { StatusBadge } from '../components/status-badge.js';
5
+ export function NodePanel({ data, loading, focused, compact }) {
6
+ if (loading && !data) {
7
+ return (_jsx(PanelBox, { title: "Node", focused: focused, children: _jsx(Text, { color: "gray", children: "Connecting..." }) }));
8
+ }
9
+ if (!data || data.bestBlock === null) {
10
+ return (_jsxs(PanelBox, { title: "Node", focused: focused, children: [_jsx(StatusBadge, { status: "stopped" }), _jsx(Text, { color: "gray", children: " Offline" })] }));
11
+ }
12
+ if (compact) {
13
+ return (_jsxs(Text, { children: [_jsx(StatusBadge, { status: data.health ? 'running' : 'stopped' }), _jsx(Text, { children: " node :9944 " }), _jsxs(Text, { color: "cyan", children: ["\u25B2 #", data.bestBlock] })] }));
14
+ }
15
+ return (_jsxs(PanelBox, { title: "Node", focused: focused, children: [_jsxs(Text, { children: ["Block: ", _jsxs(Text, { color: "cyan", children: ["#", data.bestBlock] })] }), data.avgBlockTime != null && (_jsxs(Text, { children: ["Avg time: ", _jsxs(Text, { color: "yellow", children: [data.avgBlockTime.toFixed(1), "s"] })] })), _jsxs(Text, { children: ["Chain: ", data.chainName ?? 'unknown'] }), _jsxs(Text, { children: ["Peers: ", data.health?.peers ?? 'N/A'] }), _jsxs(Text, { children: ["Sync: ", data.health?.isSyncing ? 'syncing' : 'idle'] }), _jsxs(Text, { children: ["Version: ", data.version ?? 'unknown'] })] }));
16
+ }
17
+ //# sourceMappingURL=node-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-panel.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/panels/node-panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAU5D,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAkB;IAC3E,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,QAAQ,IAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,YACrC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAAqB,GAC9B,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,aACrC,KAAC,WAAW,IAAC,MAAM,EAAC,SAAS,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,IACzB,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,MAAC,IAAI,eACH,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAI,EAC5D,KAAC,IAAI,+BAAoB,EACzB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAK,IAAI,CAAC,SAAS,IAAQ,IACxC,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,aACrC,MAAC,IAAI,0BAAQ,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAG,IAAI,CAAC,SAAS,IAAQ,IAAO,EAC9D,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,CAC5B,MAAC,IAAI,6BAAW,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAO,CACnF,EACD,MAAC,IAAI,0BAAS,IAAI,CAAC,SAAS,IAAI,SAAS,IAAQ,EACjD,MAAC,IAAI,0BAAS,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,IAAQ,EACjD,MAAC,IAAI,yBAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAQ,EAChE,MAAC,IAAI,4BAAW,IAAI,CAAC,OAAO,IAAI,SAAS,IAAQ,IACxC,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { ProofServerInfo } from '../hooks/use-proof-server.js';
3
+ interface ProofPanelProps {
4
+ data: ProofServerInfo | null;
5
+ loading: boolean;
6
+ focused?: boolean;
7
+ compact?: boolean;
8
+ }
9
+ export declare function ProofPanel({ data, loading, focused, compact }: ProofPanelProps): React.ReactElement;
10
+ export {};
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Text } from 'ink';
3
+ import { PanelBox } from '../components/panel-box.js';
4
+ import { StatusBadge } from '../components/status-badge.js';
5
+ import { Gauge } from '../components/gauge.js';
6
+ export function ProofPanel({ data, loading, focused, compact }) {
7
+ if (loading && !data) {
8
+ return (_jsx(PanelBox, { title: "Proof Server", focused: focused, children: _jsx(Text, { color: "gray", children: "Connecting..." }) }));
9
+ }
10
+ if (!data) {
11
+ return (_jsxs(PanelBox, { title: "Proof Server", focused: focused, children: [_jsx(StatusBadge, { status: "stopped" }), _jsx(Text, { color: "gray", children: " Offline" })] }));
12
+ }
13
+ if (compact) {
14
+ const processing = data.ready?.jobsProcessing ?? 0;
15
+ const capacity = data.ready?.jobCapacity ?? 0;
16
+ return (_jsxs(Text, { children: [_jsx(StatusBadge, { status: data.ready ? (data.ready.status === 'ok' ? 'running' : 'busy') : 'stopped' }), _jsx(Text, { children: " proof :6300 " }), _jsxs(Text, { color: "cyan", children: ["\u25B2 ", processing, "/", capacity] })] }));
17
+ }
18
+ return (_jsxs(PanelBox, { title: "Proof Server", focused: focused, children: [_jsxs(Text, { children: ["Version: ", data.version ?? 'unknown'] }), _jsxs(Text, { children: ["Proofs: ", data.proofVersions?.join(', ') ?? 'unknown'] }), data.ready && (_jsxs(_Fragment, { children: [_jsxs(Text, { children: ["Status: ", _jsx(StatusBadge, { status: data.ready.status === 'ok' ? 'ok' : 'busy' })] }), _jsxs(Text, { children: ["Jobs: ", _jsx(Gauge, { value: data.ready.jobsProcessing, max: data.ready.jobCapacity, width: 8 })] }), _jsxs(Text, { children: ["Pending: ", data.ready.jobsPending] })] }))] }));
19
+ }
20
+ //# sourceMappingURL=proof-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof-panel.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/panels/proof-panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAU/C,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAmB;IAC7E,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,QAAQ,IAAC,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,OAAO,YAC7C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAAqB,GAC9B,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,OAAO,aAC7C,KAAC,WAAW,IAAC,MAAM,EAAC,SAAS,GAAG,EAChC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,IACzB,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,cAAc,IAAI,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;QAC9C,OAAO,CACL,MAAC,IAAI,eACH,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,GAAI,EACnG,KAAC,IAAI,gCAAqB,EAC1B,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAI,UAAU,OAAG,QAAQ,IAAQ,IAC9C,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,OAAO,aAC7C,MAAC,IAAI,4BAAW,IAAI,CAAC,OAAO,IAAI,SAAS,IAAQ,EACjD,MAAC,IAAI,2BAAU,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,IAAQ,EACjE,IAAI,CAAC,KAAK,IAAI,CACb,8BACE,MAAC,IAAI,2BAAS,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAI,IAAO,EACxF,MAAC,IAAI,yBAAO,KAAC,KAAK,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,GAAI,IAAO,EACrG,MAAC,IAAI,4BAAW,IAAI,CAAC,KAAK,CAAC,WAAW,IAAQ,IAC7C,CACJ,IACQ,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ interface ResponseGraphProps {
3
+ nodeHistory: number[];
4
+ indexerHistory: number[];
5
+ proofServerHistory: number[];
6
+ focused?: boolean;
7
+ width?: number;
8
+ }
9
+ export declare function ResponseGraph({ nodeHistory, indexerHistory, proofServerHistory, focused, width, }: ResponseGraphProps): React.ReactElement;
10
+ export {};
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { PanelBox } from '../components/panel-box.js';
4
+ import { Sparkline } from '../components/sparkline.js';
5
+ export function ResponseGraph({ nodeHistory, indexerHistory, proofServerHistory, focused, width, }) {
6
+ const sparkWidth = width ? Math.max(5, width - 20) : 20;
7
+ const lastNode = nodeHistory[nodeHistory.length - 1];
8
+ const lastIndexer = indexerHistory[indexerHistory.length - 1];
9
+ const lastProof = proofServerHistory[proofServerHistory.length - 1];
10
+ return (_jsxs(PanelBox, { title: "Response Times", focused: focused, children: [_jsxs(Box, { children: [_jsx(Text, { children: "node " }), _jsx(Sparkline, { data: nodeHistory, maxWidth: sparkWidth, color: "green" }), _jsxs(Text, { children: [" ", lastNode != null ? `${lastNode}ms` : 'N/A'] })] }), _jsxs(Box, { children: [_jsx(Text, { children: "idx " }), _jsx(Sparkline, { data: indexerHistory, maxWidth: sparkWidth, color: "blue" }), _jsxs(Text, { children: [" ", lastIndexer != null ? `${lastIndexer}ms` : 'N/A'] })] }), _jsxs(Box, { children: [_jsx(Text, { children: "proof " }), _jsx(Sparkline, { data: proofServerHistory, maxWidth: sparkWidth, color: "yellow" }), _jsxs(Text, { children: [" ", lastProof != null ? `${lastProof}ms` : 'N/A'] })] })] }));
11
+ }
12
+ //# sourceMappingURL=response-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-graph.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/panels/response-graph.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAUvD,MAAM,UAAU,aAAa,CAAC,EAC5B,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,KAAK,GACc;IACnB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEpE,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,gBAAgB,EAAC,OAAO,EAAE,OAAO,aAC/C,MAAC,GAAG,eACF,KAAC,IAAI,yBAAc,EACnB,KAAC,SAAS,IAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAC,OAAO,GAAG,EACpE,MAAC,IAAI,oBAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,IAAQ,IACtD,EACN,MAAC,GAAG,eACF,KAAC,IAAI,yBAAc,EACnB,KAAC,SAAS,IAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,GAAG,EACtE,MAAC,IAAI,oBAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,KAAK,IAAQ,IAC5D,EACN,MAAC,GAAG,eACF,KAAC,IAAI,yBAAc,EACnB,KAAC,SAAS,IAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAC,QAAQ,GAAG,EAC5E,MAAC,IAAI,oBAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,IAAQ,IACxD,IACG,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { WalletState } from '../hooks/use-wallet-state.js';
3
+ interface WalletPanelProps {
4
+ wallet: WalletState;
5
+ focused?: boolean;
6
+ compact?: boolean;
7
+ }
8
+ export declare function WalletPanel({ wallet, focused, compact }: WalletPanelProps): React.ReactElement;
9
+ export {};
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import { PanelBox } from '../components/panel-box.js';
4
+ function formatBalance(value) {
5
+ const whole = value / 10n ** 6n;
6
+ return whole.toLocaleString();
7
+ }
8
+ export function WalletPanel({ wallet, focused, compact }) {
9
+ if (wallet.connecting) {
10
+ return (_jsx(PanelBox, { title: "Wallet", focused: focused, children: _jsx(Text, { color: "yellow", children: "Connecting..." }) }));
11
+ }
12
+ if (wallet.error) {
13
+ return (_jsxs(PanelBox, { title: "Wallet", focused: focused, children: [_jsx(Text, { color: "red", children: "Unavailable" }), _jsx(Text, { color: "gray", children: wallet.error })] }));
14
+ }
15
+ if (!wallet.balances) {
16
+ return (_jsx(PanelBox, { title: "Wallet", focused: focused, children: _jsx(Text, { color: "gray", children: "No data" }) }));
17
+ }
18
+ const b = wallet.balances;
19
+ if (compact) {
20
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "cyan", children: `Wallet (${wallet.address ?? 'master'})` }), _jsxs(Text, { children: ["NIGHT ", formatBalance(b.total)] }), _jsxs(Text, { children: ["DUST ", formatBalance(b.dust)] })] }));
21
+ }
22
+ return (_jsxs(PanelBox, { title: "Wallet", focused: focused, children: [_jsx(Text, { color: "cyan", bold: true, children: `> ${wallet.address ?? 'master'}` }), _jsxs(Text, { children: [" NIGHT ", _jsx(Text, { color: "green", children: formatBalance(b.unshielded) }), " (unshielded)"] }), _jsxs(Text, { children: [" NIGHT ", _jsx(Text, { color: "green", children: formatBalance(b.shielded) }), " (shielded)"] }), _jsxs(Text, { children: [" DUST ", _jsx(Text, { color: "yellow", children: formatBalance(b.dust) })] }), _jsxs(Text, { children: [" Total ", _jsx(Text, { bold: true, children: formatBalance(b.total) })] })] }));
23
+ }
24
+ //# sourceMappingURL=wallet-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-panel.js","sourceRoot":"","sources":["../../../../src/cli/dashboard/panels/wallet-panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAStD,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,IAAI,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAoB;IACxE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,QAAQ,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,YACvC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,8BAAqB,GAChC,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,aACvC,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,4BAAmB,EACpC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,MAAM,CAAC,KAAK,GAAQ,IAC/B,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CACL,KAAC,QAAQ,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,YACvC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wBAAe,GACxB,CACZ,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE1B,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YAAE,WAAW,MAAM,CAAC,OAAO,IAAI,QAAQ,GAAG,GAAQ,EACzE,MAAC,IAAI,yBAAQ,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAQ,EAC3C,MAAC,IAAI,yBAAQ,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAQ,IACtC,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,QAAQ,IAAC,KAAK,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,aACvC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,kBAAE,KAAK,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,GAAQ,EAClE,MAAC,IAAI,4BAAU,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,GAAQ,qBAAoB,EAC3F,MAAC,IAAI,4BAAU,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAQ,mBAAkB,EACvF,MAAC,IAAI,4BAAU,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAQ,IAAO,EACzE,MAAC,IAAI,4BAAU,KAAC,IAAI,IAAC,IAAI,kBAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,GAAQ,IAAO,IACvD,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { NodeInfo } from './hooks/use-node-info.js';
2
+ import type { IndexerInfo } from './hooks/use-indexer-info.js';
3
+ import type { ProofServerInfo } from './hooks/use-proof-server.js';
4
+ import type { WalletState } from './hooks/use-wallet-state.js';
5
+ import type { ParsedLogLine, LogFilter } from './lib/log-parser.js';
6
+ export type PanelName = 'node' | 'indexer' | 'proof' | 'wallet' | 'logs' | 'graph';
7
+ export interface LogsData {
8
+ lines: ParsedLogLine[];
9
+ allLines: ParsedLogLine[];
10
+ filter: LogFilter;
11
+ scrollOffset: number;
12
+ loading: boolean;
13
+ cycleService: () => void;
14
+ cycleLevel: () => void;
15
+ setSearch: (search: string) => void;
16
+ scrollUp: () => void;
17
+ scrollDown: () => void;
18
+ }
19
+ export interface HealthHistory {
20
+ nodeHistory: number[];
21
+ indexerHistory: number[];
22
+ proofServerHistory: number[];
23
+ }
24
+ export interface DashboardData {
25
+ node: NodeInfo | null;
26
+ nodeLoading: boolean;
27
+ indexer: IndexerInfo | null;
28
+ indexerLoading: boolean;
29
+ proofServer: ProofServerInfo | null;
30
+ proofServerLoading: boolean;
31
+ wallet: WalletState;
32
+ logs: LogsData;
33
+ healthHistory: HealthHistory;
34
+ focusedPanel: PanelName;
35
+ searchMode: boolean;
36
+ searchText: string;
37
+ columns: number;
38
+ rows: number;
39
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/dashboard/types.ts"],"names":[],"mappings":""}
package/dist/cli.js CHANGED
@@ -4,15 +4,14 @@ import { NetworkManager } from './core/network-manager.js';
4
4
  import { registerNetworkCommands } from './cli/commands/network.js';
5
5
  import { registerWalletCommands } from './cli/commands/wallet.js';
6
6
  import { registerAccountCommands } from './cli/commands/accounts.js';
7
- import { startInteractiveMode } from './cli/interactive.js';
7
+ import { registerInteractiveCommand } from './cli/commands/interactive.js';
8
+ import { registerDashboardCommand } from './cli/commands/dashboard.js';
8
9
  import { createLogger } from './core/logger.js';
9
10
  import { setLogger as setWalletLogger } from './core/wallet.js';
10
11
  import { setLogger as setFundingLogger } from './core/funding.js';
11
12
  import { setLogger as setAccountsLogger } from './core/accounts.js';
12
13
  const manager = new NetworkManager();
13
- const isInteractive = process.argv.length <= 2 || process.argv[2] === 'interactive';
14
- // In interactive mode, send logs to stderr so they don't stomp on the readline prompt
15
- const logger = createLogger('info', isInteractive ? process.stderr : process.stdout);
14
+ const logger = createLogger('info', process.stdout);
16
15
  setWalletLogger(logger);
17
16
  setFundingLogger(logger);
18
17
  setAccountsLogger(logger);
@@ -26,18 +25,19 @@ const shutdown = async () => {
26
25
  };
27
26
  process.on('SIGINT', shutdown);
28
27
  process.on('SIGTERM', shutdown);
29
- if (isInteractive) {
30
- startInteractiveMode(manager).catch(console.error);
31
- }
32
- else {
33
- const program = new Command();
34
- program
35
- .name('midnight-local-devnet')
36
- .description('Manage a local Midnight development network')
37
- .version('0.1.1');
38
- registerNetworkCommands(program, manager);
39
- registerWalletCommands(program, manager);
40
- registerAccountCommands(program, manager);
41
- program.parse();
42
- }
28
+ const program = new Command();
29
+ program
30
+ .name('midnight-local-devnet')
31
+ .description('Manage a local Midnight development network')
32
+ .version('0.2.1');
33
+ registerNetworkCommands(program, manager);
34
+ registerWalletCommands(program, manager);
35
+ registerAccountCommands(program, manager);
36
+ registerInteractiveCommand(program, manager);
37
+ registerDashboardCommand(program, manager);
38
+ // Show help when no subcommand is given
39
+ program.action(() => {
40
+ program.help();
41
+ });
42
+ program.parse();
43
43
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AAErC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC;AAEpF,sFAAsF;AACtF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACrF,eAAe,CAAC,MAAM,CAAC,CAAC;AACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAE1B,wDAAwD;AACxD,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;AAErC,8BAA8B;AAC9B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IAC1B,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,IAAI,aAAa,EAAE,CAAC;IAClB,oBAAoB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC;KAAM,CAAC;IACN,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,uBAAuB,CAAC;SAC7B,WAAW,CAAC,6CAA6C,CAAC;SAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AAErC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AACpD,eAAe,CAAC,MAAM,CAAC,CAAC;AACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAE1B,wDAAwD;AACxD,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;AAErC,8BAA8B;AAC9B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IAC1B,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,uBAAuB,CAAC;KAC7B,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACzC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAE3C,wCAAwC;AACxC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aaronbassett/midnight-local-devnet",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "Local Midnight development network manager — CLI and MCP server",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,7 +39,6 @@
39
39
  "test:watch": "vitest"
40
40
  },
41
41
  "dependencies": {
42
- "@modelcontextprotocol/sdk": "^1.12.1",
43
42
  "@midnight-ntwrk/ledger-v7": "7.0.0",
44
43
  "@midnight-ntwrk/midnight-js-network-id": "3.1.0",
45
44
  "@midnight-ntwrk/wallet-sdk-abstractions": "1.0.0",
@@ -49,17 +48,22 @@
49
48
  "@midnight-ntwrk/wallet-sdk-hd": "3.0.0",
50
49
  "@midnight-ntwrk/wallet-sdk-shielded": "1.0.0",
51
50
  "@midnight-ntwrk/wallet-sdk-unshielded-wallet": "1.0.0",
51
+ "@modelcontextprotocol/sdk": "^1.12.1",
52
52
  "@scure/bip39": "^2.0.1",
53
53
  "commander": "^13.1.0",
54
+ "ink": "^6.8.0",
54
55
  "pino": "^10.1.0",
55
56
  "pino-pretty": "^13.1.3",
57
+ "react": "^19.2.4",
56
58
  "rxjs": "^7.8.1",
57
59
  "ws": "^8.18.3",
58
60
  "zod": "^3.24.0"
59
61
  },
60
62
  "devDependencies": {
61
63
  "@types/node": "^22.0.0",
64
+ "@types/react": "^19.2.14",
62
65
  "@types/ws": "^8.18.1",
66
+ "ink-testing-library": "^4.0.0",
63
67
  "typescript": "^5.9.3",
64
68
  "vitest": "^3.1.0"
65
69
  },