dexe-mcp 0.1.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/.mcp.example.json +12 -2
  2. package/CHANGELOG.md +84 -0
  3. package/FUTURE.md +26 -5
  4. package/README.md +105 -197
  5. package/dist/config.d.ts +12 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +34 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/addresses.d.ts +57 -0
  12. package/dist/lib/addresses.d.ts.map +1 -0
  13. package/dist/lib/addresses.js +83 -0
  14. package/dist/lib/addresses.js.map +1 -0
  15. package/dist/lib/calldata.d.ts +32 -0
  16. package/dist/lib/calldata.d.ts.map +1 -0
  17. package/dist/lib/calldata.js +28 -0
  18. package/dist/lib/calldata.js.map +1 -0
  19. package/dist/lib/govEnums.d.ts +12 -0
  20. package/dist/lib/govEnums.d.ts.map +1 -0
  21. package/dist/lib/govEnums.js +35 -0
  22. package/dist/lib/govEnums.js.map +1 -0
  23. package/dist/lib/ipfs.d.ts +60 -0
  24. package/dist/lib/ipfs.d.ts.map +1 -0
  25. package/dist/lib/ipfs.js +168 -0
  26. package/dist/lib/ipfs.js.map +1 -0
  27. package/dist/lib/markdownToSlate.d.ts +39 -0
  28. package/dist/lib/markdownToSlate.d.ts.map +1 -0
  29. package/dist/lib/markdownToSlate.js +203 -0
  30. package/dist/lib/markdownToSlate.js.map +1 -0
  31. package/dist/lib/multicall.d.ts +33 -0
  32. package/dist/lib/multicall.d.ts.map +1 -0
  33. package/dist/lib/multicall.js +46 -0
  34. package/dist/lib/multicall.js.map +1 -0
  35. package/dist/lib/proposalCatalog.d.ts +45 -0
  36. package/dist/lib/proposalCatalog.d.ts.map +1 -0
  37. package/dist/lib/proposalCatalog.js +416 -0
  38. package/dist/lib/proposalCatalog.js.map +1 -0
  39. package/dist/lib/signer.d.ts +12 -0
  40. package/dist/lib/signer.d.ts.map +1 -0
  41. package/dist/lib/signer.js +31 -0
  42. package/dist/lib/signer.js.map +1 -0
  43. package/dist/lib/subgraph.d.ts +15 -0
  44. package/dist/lib/subgraph.d.ts.map +1 -0
  45. package/dist/lib/subgraph.js +42 -0
  46. package/dist/lib/subgraph.js.map +1 -0
  47. package/dist/tools/dao.d.ts +4 -0
  48. package/dist/tools/dao.d.ts.map +1 -0
  49. package/dist/tools/dao.js +242 -0
  50. package/dist/tools/dao.js.map +1 -0
  51. package/dist/tools/daoDeploy.d.ts +4 -0
  52. package/dist/tools/daoDeploy.d.ts.map +1 -0
  53. package/dist/tools/daoDeploy.js +573 -0
  54. package/dist/tools/daoDeploy.js.map +1 -0
  55. package/dist/tools/flow.d.ts +5 -0
  56. package/dist/tools/flow.d.ts.map +1 -0
  57. package/dist/tools/flow.js +451 -0
  58. package/dist/tools/flow.js.map +1 -0
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +32 -0
  61. package/dist/tools/index.js.map +1 -1
  62. package/dist/tools/ipfs.d.ts +6 -0
  63. package/dist/tools/ipfs.d.ts.map +1 -0
  64. package/dist/tools/ipfs.js +376 -0
  65. package/dist/tools/ipfs.js.map +1 -0
  66. package/dist/tools/proposal.d.ts +4 -0
  67. package/dist/tools/proposal.d.ts.map +1 -0
  68. package/dist/tools/proposal.js +217 -0
  69. package/dist/tools/proposal.js.map +1 -0
  70. package/dist/tools/proposalBuild.d.ts +4 -0
  71. package/dist/tools/proposalBuild.d.ts.map +1 -0
  72. package/dist/tools/proposalBuild.js +372 -0
  73. package/dist/tools/proposalBuild.js.map +1 -0
  74. package/dist/tools/proposalBuildComplex.d.ts +4 -0
  75. package/dist/tools/proposalBuildComplex.d.ts.map +1 -0
  76. package/dist/tools/proposalBuildComplex.js +766 -0
  77. package/dist/tools/proposalBuildComplex.js.map +1 -0
  78. package/dist/tools/proposalBuildInternal.d.ts +4 -0
  79. package/dist/tools/proposalBuildInternal.d.ts.map +1 -0
  80. package/dist/tools/proposalBuildInternal.js +224 -0
  81. package/dist/tools/proposalBuildInternal.js.map +1 -0
  82. package/dist/tools/proposalBuildMore.d.ts +4 -0
  83. package/dist/tools/proposalBuildMore.d.ts.map +1 -0
  84. package/dist/tools/proposalBuildMore.js +457 -0
  85. package/dist/tools/proposalBuildMore.js.map +1 -0
  86. package/dist/tools/proposalBuildOffchain.d.ts +4 -0
  87. package/dist/tools/proposalBuildOffchain.d.ts.map +1 -0
  88. package/dist/tools/proposalBuildOffchain.js +389 -0
  89. package/dist/tools/proposalBuildOffchain.js.map +1 -0
  90. package/dist/tools/read.d.ts +4 -0
  91. package/dist/tools/read.d.ts.map +1 -0
  92. package/dist/tools/read.js +580 -0
  93. package/dist/tools/read.js.map +1 -0
  94. package/dist/tools/subgraph.d.ts +4 -0
  95. package/dist/tools/subgraph.d.ts.map +1 -0
  96. package/dist/tools/subgraph.js +404 -0
  97. package/dist/tools/subgraph.js.map +1 -0
  98. package/dist/tools/txSend.d.ts +5 -0
  99. package/dist/tools/txSend.d.ts.map +1 -0
  100. package/dist/tools/txSend.js +87 -0
  101. package/dist/tools/txSend.js.map +1 -0
  102. package/dist/tools/vote.d.ts +4 -0
  103. package/dist/tools/vote.d.ts.map +1 -0
  104. package/dist/tools/vote.js +196 -0
  105. package/dist/tools/vote.js.map +1 -0
  106. package/dist/tools/voteBuild.d.ts +4 -0
  107. package/dist/tools/voteBuild.d.ts.map +1 -0
  108. package/dist/tools/voteBuild.js +983 -0
  109. package/dist/tools/voteBuild.js.map +1 -0
  110. package/package.json +18 -5
  111. package/PLAN.md +0 -132
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Converts a Markdown string to the Slate node format used by the DeXe
3
+ * investing-dashboard frontend.
4
+ *
5
+ * Uses `unified` + `remark-parse` + `remark-slate-transformer` with overrides
6
+ * that map remark's default node types to the frontend's ELEMENT_TYPES enum:
7
+ *
8
+ * Remark default → Frontend Slate type
9
+ * ─────────────────────────────────────────────
10
+ * heading depth=1 → "heading-one"
11
+ * heading depth=2 → "heading-two"
12
+ * heading depth=3 → "heading-three"
13
+ * paragraph → "paragraph" (same)
14
+ * list ordered=false → "bulleted-list"
15
+ * list ordered=true → "numbered-list"
16
+ * listItem → "list-item"
17
+ * code → "code-block"
18
+ * link → "link"
19
+ * image → "image"
20
+ * delete → "strikethrough" (~~text~~)
21
+ *
22
+ * Text marks:
23
+ * strong → { bold: true }
24
+ * emphasis → { italic: true }
25
+ * inlineCode → wrapped in code-inline element
26
+ * delete → { strikethrough: true }
27
+ */
28
+ import { unified } from "unified";
29
+ import remarkParse from "remark-parse";
30
+ import remarkGfm from "remark-gfm";
31
+ import { remarkToSlate } from "remark-slate-transformer";
32
+ /**
33
+ * Override builders that remap remark-slate-transformer's default output
34
+ * into the exact element/mark types the frontend expects.
35
+ */
36
+ const overrides = {
37
+ // ── Block elements ──────────────────────────────────────────────
38
+ heading(node, next) {
39
+ const depthMap = {
40
+ 1: "heading-one",
41
+ 2: "heading-two",
42
+ 3: "heading-three",
43
+ };
44
+ return {
45
+ type: depthMap[node.depth] ?? "heading-three",
46
+ children: next(node.children),
47
+ };
48
+ },
49
+ // paragraph — default type name matches, but we define it explicitly
50
+ // to ensure children get processed through `next` consistently
51
+ paragraph(node, next) {
52
+ return {
53
+ type: "paragraph",
54
+ children: next(node.children),
55
+ };
56
+ },
57
+ list(node, next) {
58
+ const type = node.ordered ? "numbered-list" : "bulleted-list";
59
+ return {
60
+ type,
61
+ children: next(node.children),
62
+ };
63
+ },
64
+ listItem(node, next) {
65
+ // remark wraps list item content in a paragraph — we need to flatten
66
+ // so the frontend gets { type: "list-item", children: [{ text }] }
67
+ const processed = next(node.children);
68
+ // If the only child is a paragraph, unwrap its children
69
+ const children = processed.length === 1 &&
70
+ processed[0] &&
71
+ processed[0].type === "paragraph"
72
+ ? processed[0].children
73
+ : processed;
74
+ return {
75
+ type: "list-item",
76
+ children,
77
+ };
78
+ },
79
+ code(node) {
80
+ // Fenced code blocks → code-block element
81
+ return {
82
+ type: "code-block",
83
+ language: node.lang ?? "",
84
+ children: [{ text: node.value }],
85
+ };
86
+ },
87
+ blockquote(node, next) {
88
+ // Frontend doesn't have a blockquote type — flatten to paragraphs
89
+ // Each child (usually paragraphs) gets returned as-is
90
+ const children = next(node.children);
91
+ return children.length > 0 ? children : undefined;
92
+ },
93
+ thematicBreak() {
94
+ // --- / *** → no frontend equivalent, skip
95
+ return { type: "paragraph", children: [{ text: "---" }] };
96
+ },
97
+ // ── Inline elements ─────────────────────────────────────────────
98
+ link(node, next) {
99
+ return {
100
+ type: "link",
101
+ url: node.url,
102
+ children: next(node.children),
103
+ };
104
+ },
105
+ image(node) {
106
+ return {
107
+ type: "image",
108
+ url: node.url,
109
+ children: [{ text: node.alt ?? "" }],
110
+ };
111
+ },
112
+ // ── Text marks ──────────────────────────────────────────────────
113
+ // remark-slate-transformer applies these as flags on text nodes.
114
+ // We need to remap the flag names to match the frontend's CustomText.
115
+ strong(node, next) {
116
+ // Apply bold: true to all text children
117
+ const children = next(node.children);
118
+ return children.map((child) => ({ ...child, bold: true }));
119
+ },
120
+ emphasis(node, next) {
121
+ const children = next(node.children);
122
+ return children.map((child) => ({ ...child, italic: true }));
123
+ },
124
+ delete(node, next) {
125
+ const children = next(node.children);
126
+ return children.map((child) => ({ ...child, strikethrough: "true" }));
127
+ },
128
+ inlineCode(node) {
129
+ // Frontend has code-inline as an element type wrapping text
130
+ return {
131
+ type: "code-inline",
132
+ children: [{ text: node.value }],
133
+ };
134
+ },
135
+ };
136
+ /** The default empty Slate document the frontend uses. */
137
+ const SLATE_DEFAULT = [{ type: "paragraph", children: [{ text: "" }] }];
138
+ /**
139
+ * Unified processor configured with our overrides.
140
+ */
141
+ const processor = unified()
142
+ .use(remarkParse)
143
+ .use(remarkGfm) // GFM: ~~strikethrough~~, tables, autolinks, task lists
144
+ .use(remarkToSlate, { overrides });
145
+ /**
146
+ * Convert a Markdown string to a Slate `SlateDescendant[]` array compatible
147
+ * with the DeXe investing-dashboard frontend.
148
+ *
149
+ * - Empty / whitespace-only input → default empty paragraph node
150
+ * - Plain text (no markdown syntax) → paragraph nodes split by newline
151
+ * - Rich markdown → full Slate tree with headings, lists, bold, etc.
152
+ *
153
+ * This function is synchronous (`processSync`).
154
+ */
155
+ export function markdownToSlate(markdown) {
156
+ if (!markdown || markdown.trim().length === 0) {
157
+ return SLATE_DEFAULT;
158
+ }
159
+ try {
160
+ const result = processor.processSync(markdown);
161
+ const nodes = result.result;
162
+ if (!Array.isArray(nodes) || nodes.length === 0) {
163
+ return SLATE_DEFAULT;
164
+ }
165
+ // Flatten any arrays returned by mark overrides (strong/emphasis/delete
166
+ // return arrays of text nodes instead of a single element)
167
+ return flattenSlateNodes(nodes);
168
+ }
169
+ catch {
170
+ // Fallback: split by newlines into paragraphs (same as old behavior)
171
+ const lines = markdown.split("\n").filter((l) => l.length > 0);
172
+ return lines.length > 0
173
+ ? lines.map((line) => ({ type: "paragraph", children: [{ text: line }] }))
174
+ : SLATE_DEFAULT;
175
+ }
176
+ }
177
+ /**
178
+ * Recursively flatten any nested arrays that our mark overrides produce.
179
+ * Mark handlers (strong, emphasis, delete) return arrays of text nodes
180
+ * instead of elements, which can end up as nested arrays in children.
181
+ */
182
+ function flattenSlateNodes(nodes) {
183
+ const result = [];
184
+ for (const node of nodes) {
185
+ if (Array.isArray(node)) {
186
+ result.push(...flattenSlateNodes(node));
187
+ }
188
+ else if (node && typeof node === "object") {
189
+ const n = node;
190
+ if (Array.isArray(n.children)) {
191
+ result.push({ ...n, children: flattenSlateNodes(n.children) });
192
+ }
193
+ else {
194
+ result.push(n);
195
+ }
196
+ }
197
+ else {
198
+ result.push(node);
199
+ }
200
+ }
201
+ return result;
202
+ }
203
+ //# sourceMappingURL=markdownToSlate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownToSlate.js","sourceRoot":"","sources":["../../src/lib/markdownToSlate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Interface, JsonRpcProvider } from "ethers";
2
+ /**
3
+ * Multicall3 — deployed at the same address on ~every EVM chain.
4
+ * https://www.multicall3.com
5
+ */
6
+ export declare const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
7
+ export interface Call {
8
+ /** Target contract address. */
9
+ target: string;
10
+ /** ABI fragment or full Interface covering `method`. */
11
+ iface: Interface;
12
+ /** Method name or full signature. */
13
+ method: string;
14
+ /** Positional args (empty array if none). */
15
+ args: readonly unknown[];
16
+ /** If true, failures don't revert the whole batch (decoded as `null`). */
17
+ allowFailure?: boolean;
18
+ }
19
+ export interface CallResult<T = unknown> {
20
+ success: boolean;
21
+ value: T | null;
22
+ /** Hex-encoded raw return data. */
23
+ raw: string;
24
+ /** Error message if decoding failed or call reverted with allowFailure. */
25
+ error?: string;
26
+ }
27
+ /**
28
+ * Batch `calls` into a single Multicall3 aggregate3 RPC round-trip. Each call
29
+ * is decoded via its own `iface`. Failed calls with `allowFailure: true`
30
+ * yield `{ success: false, value: null }` instead of throwing.
31
+ */
32
+ export declare function multicall(provider: JsonRpcProvider, calls: Call[]): Promise<CallResult[]>;
33
+ //# sourceMappingURL=multicall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../src/lib/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,+CAA+C,CAAC;AAM/E,MAAM,WAAW,IAAI;IACnB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,EAAE,SAAS,CAAC;IACjB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;IACzB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,IAAI,EAAE,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC,CAgCvB"}
@@ -0,0 +1,46 @@
1
+ import { Contract } from "ethers";
2
+ /**
3
+ * Multicall3 — deployed at the same address on ~every EVM chain.
4
+ * https://www.multicall3.com
5
+ */
6
+ export const MULTICALL3_ADDRESS = "0xcA11bde05977b3631167028862bE2a173976CA11";
7
+ const MULTICALL3_ABI = [
8
+ "function aggregate3((address target, bool allowFailure, bytes callData)[] calls) payable returns ((bool success, bytes returnData)[] returnData)",
9
+ ];
10
+ /**
11
+ * Batch `calls` into a single Multicall3 aggregate3 RPC round-trip. Each call
12
+ * is decoded via its own `iface`. Failed calls with `allowFailure: true`
13
+ * yield `{ success: false, value: null }` instead of throwing.
14
+ */
15
+ export async function multicall(provider, calls) {
16
+ if (calls.length === 0)
17
+ return [];
18
+ const mc = new Contract(MULTICALL3_ADDRESS, MULTICALL3_ABI, provider);
19
+ const payload = calls.map((c) => ({
20
+ target: c.target,
21
+ allowFailure: c.allowFailure ?? false,
22
+ callData: c.iface.encodeFunctionData(c.method, c.args),
23
+ }));
24
+ const results = await mc.getFunction("aggregate3").staticCall(payload);
25
+ return results.map((r, i) => {
26
+ const c = calls[i];
27
+ if (!r.success) {
28
+ return { success: false, value: null, raw: r.returnData, error: "call reverted" };
29
+ }
30
+ try {
31
+ const decoded = c.iface.decodeFunctionResult(c.method, r.returnData);
32
+ // Unwrap single-return-value tuples for ergonomic use.
33
+ const value = decoded.length === 1 ? decoded[0] : decoded;
34
+ return { success: true, value, raw: r.returnData };
35
+ }
36
+ catch (err) {
37
+ return {
38
+ success: false,
39
+ value: null,
40
+ raw: r.returnData,
41
+ error: err instanceof Error ? err.message : String(err),
42
+ };
43
+ }
44
+ });
45
+ }
46
+ //# sourceMappingURL=multicall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multicall.js","sourceRoot":"","sources":["../../src/lib/multicall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA8B,MAAM,QAAQ,CAAC;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,4CAA4C,CAAC;AAE/E,MAAM,cAAc,GAAG;IACrB,kJAAkJ;CAC1I,CAAC;AAwBX;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAyB,EACzB,KAAa;IAEb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,kBAAkB,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,KAAK;QACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;KACvD,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GACX,MAAM,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpF,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YACrE,uDAAuD;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,CAAC,CAAC,UAAU;gBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Static catalog of every proposal type the DeXe frontend exposes. Derived
3
+ * from a full audit of `C:/dev/investing-dashboard` forms + hooks
4
+ * (2026-04-15). Consumed by `dexe_proposal_catalog` so agents can discover
5
+ * which builder tool to call for a given user intent.
6
+ *
7
+ * `mcpTool` is the name of the dedicated MCP builder tool (when one exists)
8
+ * or `null` if agents must compose via primitives (`build_external` +
9
+ * `build_custom_abi`) — flip `implemented` to `true` as each ships.
10
+ */
11
+ export type ProposalCategory = "external" | "internal" | "offchain";
12
+ export interface ProposalTypeEntry {
13
+ id: string;
14
+ category: ProposalCategory;
15
+ name: string;
16
+ formPath: string;
17
+ /** High-level description of the on-chain effect or off-chain action. */
18
+ effect: string;
19
+ /** Target contract (on-chain) or backend endpoint (off-chain). */
20
+ target: string;
21
+ /** Does this type require an IPFS metadata upload? */
22
+ needsIpfs: boolean;
23
+ /** Gating tags: "expert", "validator", "babt", "dao-admin". */
24
+ gating: string[];
25
+ /** Dedicated MCP builder tool name, or null. */
26
+ mcpTool: string | null;
27
+ /** Shipped? */
28
+ implemented: boolean;
29
+ }
30
+ export declare const PROPOSAL_CATALOG: ProposalTypeEntry[];
31
+ /** Metadata JSON shape used by the frontend for every external proposal. */
32
+ export declare const EXTERNAL_METADATA_SHAPE: {
33
+ readonly proposalName: "string (required)";
34
+ readonly proposalDescription: "string (required, markdown/slate)";
35
+ readonly category: "string (e.g. 'Token Transfer', 'Manage Validators')";
36
+ readonly isMeta: "boolean (default false)";
37
+ readonly changes: "object (type-specific structured payload for indexing, optional)";
38
+ };
39
+ export declare const INTERNAL_METADATA_SHAPE: {
40
+ readonly proposalName: "string (required)";
41
+ readonly proposalDescription: "string";
42
+ readonly category: "string (ValidatorBalances | ValidatorSettings | MonthlyWithdraw | Offchain)";
43
+ readonly changes: "object (type-specific)";
44
+ };
45
+ //# sourceMappingURL=proposalCatalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposalCatalog.d.ts","sourceRoot":"","sources":["../../src/lib/proposalCatalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gDAAgD;IAChD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAkZ/C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;;;;;;CAM1B,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC"}