dexe-mcp 0.11.0 → 0.14.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 (77) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +11 -6
  3. package/dist/cli/init.d.ts +6 -0
  4. package/dist/cli/init.d.ts.map +1 -1
  5. package/dist/cli/init.js +64 -2
  6. package/dist/cli/init.js.map +1 -1
  7. package/dist/config.d.ts +13 -0
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +12 -0
  10. package/dist/config.js.map +1 -1
  11. package/dist/diag/checks.d.ts.map +1 -1
  12. package/dist/diag/checks.js +29 -0
  13. package/dist/diag/checks.js.map +1 -1
  14. package/dist/env/schema.d.ts +14 -0
  15. package/dist/env/schema.d.ts.map +1 -1
  16. package/dist/env/schema.js +14 -0
  17. package/dist/env/schema.js.map +1 -1
  18. package/dist/index.js +7 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/preflight.d.ts +133 -0
  21. package/dist/lib/preflight.d.ts.map +1 -0
  22. package/dist/lib/preflight.js +239 -0
  23. package/dist/lib/preflight.js.map +1 -0
  24. package/dist/lib/proposalBuilders.d.ts +50 -0
  25. package/dist/lib/proposalBuilders.d.ts.map +1 -0
  26. package/dist/lib/proposalBuilders.js +311 -0
  27. package/dist/lib/proposalBuilders.js.map +1 -0
  28. package/dist/lib/stateStore.d.ts +63 -0
  29. package/dist/lib/stateStore.d.ts.map +1 -0
  30. package/dist/lib/stateStore.js +128 -0
  31. package/dist/lib/stateStore.js.map +1 -0
  32. package/dist/lib/time.d.ts +16 -0
  33. package/dist/lib/time.d.ts.map +1 -0
  34. package/dist/lib/time.js +24 -0
  35. package/dist/lib/time.js.map +1 -0
  36. package/dist/tools/daoCreate.d.ts +6 -0
  37. package/dist/tools/daoCreate.d.ts.map +1 -0
  38. package/dist/tools/daoCreate.js +155 -0
  39. package/dist/tools/daoCreate.js.map +1 -0
  40. package/dist/tools/daoDeploy.d.ts +394 -0
  41. package/dist/tools/daoDeploy.d.ts.map +1 -1
  42. package/dist/tools/daoDeploy.js +393 -422
  43. package/dist/tools/daoDeploy.js.map +1 -1
  44. package/dist/tools/doctor.d.ts.map +1 -1
  45. package/dist/tools/doctor.js +15 -0
  46. package/dist/tools/doctor.js.map +1 -1
  47. package/dist/tools/flow.d.ts +13 -2
  48. package/dist/tools/flow.d.ts.map +1 -1
  49. package/dist/tools/flow.js +97 -16
  50. package/dist/tools/flow.js.map +1 -1
  51. package/dist/tools/gate.d.ts +28 -0
  52. package/dist/tools/gate.d.ts.map +1 -0
  53. package/dist/tools/gate.js +295 -0
  54. package/dist/tools/gate.js.map +1 -0
  55. package/dist/tools/index.d.ts.map +1 -1
  56. package/dist/tools/index.js +14 -1
  57. package/dist/tools/index.js.map +1 -1
  58. package/dist/tools/operationalContext.d.ts +6 -0
  59. package/dist/tools/operationalContext.d.ts.map +1 -0
  60. package/dist/tools/operationalContext.js +122 -0
  61. package/dist/tools/operationalContext.js.map +1 -0
  62. package/dist/tools/otc.d.ts.map +1 -1
  63. package/dist/tools/otc.js +3 -0
  64. package/dist/tools/otc.js.map +1 -1
  65. package/dist/tools/proposalBuildMore.d.ts +69 -0
  66. package/dist/tools/proposalBuildMore.d.ts.map +1 -1
  67. package/dist/tools/proposalBuildMore.js +3 -2
  68. package/dist/tools/proposalBuildMore.js.map +1 -1
  69. package/dist/tools/subgraph.d.ts.map +1 -1
  70. package/dist/tools/subgraph.js +3 -0
  71. package/dist/tools/subgraph.js.map +1 -1
  72. package/package.json +2 -1
  73. package/skills/dexe-create-dao/SKILL.md +99 -0
  74. package/skills/dexe-create-proposal/SKILL.md +84 -0
  75. package/skills/dexe-otc/SKILL.md +73 -0
  76. package/skills/dexe-setup/SKILL.md +108 -0
  77. package/skills/dexe-vote-execute/SKILL.md +64 -0
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Server-side proposal action builders — the shared core behind the extended
3
+ * `dexe_proposal_create` (see `src/tools/flow.ts`). Each entry maps a short
4
+ * `proposalType` (e.g. `token_transfer`) to a zod param schema + a pure(ish)
5
+ * builder that returns the on-chain `actionsOnFor`, the frontend metadata
6
+ * `category`, and the `changes` payload the indexer expects.
7
+ *
8
+ * These builders MUST stay byte-parity with the equivalent
9
+ * `dexe_proposal_build_*` tools (verified in `tests/lib/proposalBuilders.test.ts`).
10
+ * Where a pure encoder already exists (token sale tiers, settings tuples) we
11
+ * import it directly so there is a single source of truth for the calldata.
12
+ *
13
+ * A builder throws on bad input; the caller (`runProposalCreate`) turns the
14
+ * throw into an actionable tool error. Builders never broadcast — they only
15
+ * shape actions + metadata for the flow to deposit/create/vote.
16
+ */
17
+ import { z } from "zod";
18
+ import { Interface, isAddress, ZeroAddress } from "ethers";
19
+ import { checkBlacklist, blacklistError } from "./blacklist.js";
20
+ import { findForbiddenSelector, dangerousSelectorError } from "./dangerousSelectors.js";
21
+ import { ProposalSettingsSchema, toSettingsTuple, } from "../tools/proposalBuildMore.js";
22
+ import { buildTokenSaleMultiActions, tierSchema, } from "../tools/proposalBuildComplex.js";
23
+ // ---------- ABI fragments (identical strings to the build tools) ----------
24
+ const ERC20_TRANSFER_ABI = new Interface([
25
+ "function transfer(address to, uint256 amount) returns (bool)",
26
+ "function approve(address spender, uint256 amount) returns (bool)",
27
+ ]);
28
+ const ERC721_TRANSFER_ABI = new Interface([
29
+ "function transferFrom(address from, address to, uint256 tokenId)",
30
+ ]);
31
+ const GOV_SETTINGS_ABI = new Interface([
32
+ "function editSettings(uint256[] ids, tuple(bool earlyCompletion, bool delegatedVotingAllowed, bool validatorsVote, uint64 duration, uint64 durationValidators, uint64 executionDelay, uint128 quorum, uint128 quorumValidators, uint256 minVotesForVoting, uint256 minVotesForCreating, tuple(address rewardToken, uint256 creationReward, uint256 executionReward, uint256 voteRewardsCoefficient) rewardsInfo, string executorDescription)[] params)",
33
+ "function addSettings(tuple(bool earlyCompletion, bool delegatedVotingAllowed, bool validatorsVote, uint64 duration, uint64 durationValidators, uint64 executionDelay, uint128 quorum, uint128 quorumValidators, uint256 minVotesForVoting, uint256 minVotesForCreating, tuple(address rewardToken, uint256 creationReward, uint256 executionReward, uint256 voteRewardsCoefficient) rewardsInfo, string executorDescription)[] settings)",
34
+ ]);
35
+ const EXPERT_NFT_ABI = new Interface([
36
+ "function mint(address to, string uri)",
37
+ "function burn(address from)",
38
+ ]);
39
+ const DISTRIBUTION_PROPOSAL_ABI = new Interface([
40
+ "function execute(uint256 proposalId, address token, uint256 amount)",
41
+ ]);
42
+ function changes(proposedChanges) {
43
+ return { changes: { proposedChanges, currentChanges: {} } };
44
+ }
45
+ // ---------- builders ----------
46
+ const tokenTransferBuilder = {
47
+ schema: z.object({
48
+ token: z.string().default("").describe("ERC20 token contract (ignored when isNative=true)"),
49
+ recipient: z.string().describe("Recipient address"),
50
+ amount: z.string().describe("Amount in wei / smallest unit"),
51
+ isNative: z.boolean().default(false).describe("True for native BNB/ETH transfer"),
52
+ }),
53
+ async build(raw, { ctx }) {
54
+ const p = raw;
55
+ if (!isAddress(p.recipient))
56
+ throw new Error(`Invalid recipient: ${p.recipient}`);
57
+ if (p.isNative) {
58
+ return {
59
+ actionsOnFor: [{ executor: p.recipient, value: p.amount, data: "0x" }],
60
+ category: "tokenTransfer",
61
+ metadataExtra: changes({ data: [{ tokenAmount: p.amount, receiverAddress: p.recipient }], tokenAddress: ZeroAddress }),
62
+ summary: `Native transfer → ${p.recipient} (${p.amount} wei)`,
63
+ };
64
+ }
65
+ if (!isAddress(p.token))
66
+ throw new Error(`Invalid token: ${p.token}`);
67
+ const bl = await checkBlacklist(ctx.config, p.token, p.recipient);
68
+ if (bl.status === "blacklisted")
69
+ throw new Error(blacklistError(p.token, p.recipient));
70
+ const data = ERC20_TRANSFER_ABI.encodeFunctionData("transfer", [p.recipient, BigInt(p.amount)]);
71
+ return {
72
+ actionsOnFor: [{ executor: p.token, value: "0", data }],
73
+ category: "tokenTransfer",
74
+ metadataExtra: changes({ data: [{ tokenAmount: p.amount, receiverAddress: p.recipient }], tokenAddress: p.token }),
75
+ summary: `ERC20(${p.token}).transfer(${p.recipient}, ${p.amount})`,
76
+ };
77
+ },
78
+ };
79
+ const withdrawTreasuryBuilder = {
80
+ schema: z.object({
81
+ receiver: z.string().describe("Treasury withdrawal recipient"),
82
+ token: z.string().default("").describe("ERC20 token contract (omit for NFT-only)"),
83
+ amount: z.string().default("0").describe("ERC20 amount in wei (omit/0 for NFT-only)"),
84
+ nftAddress: z.string().default("").describe("ERC721 contract (omit for token-only)"),
85
+ nftIds: z.array(z.string()).default([]).describe("NFT ids; one transferFrom per id"),
86
+ }),
87
+ async build(raw, { ctx, govPool }) {
88
+ const p = raw;
89
+ if (!isAddress(p.receiver))
90
+ throw new Error(`Invalid receiver: ${p.receiver}`);
91
+ const wantToken = p.token.length > 0 && BigInt(p.amount) > 0n;
92
+ const wantNfts = p.nftAddress.length > 0 && p.nftIds.length > 0;
93
+ if (!wantToken && !wantNfts) {
94
+ throw new Error("Nothing to withdraw — supply `token` + non-zero `amount`, and/or `nftAddress` + `nftIds`.");
95
+ }
96
+ if (wantToken && !isAddress(p.token))
97
+ throw new Error(`Invalid token: ${p.token}`);
98
+ if (wantNfts && !isAddress(p.nftAddress))
99
+ throw new Error(`Invalid nftAddress: ${p.nftAddress}`);
100
+ // withdraw_treasury MUST emit external token.transfer, NEVER GovPool.withdraw
101
+ // (failure mode 8 — "Gov: invalid internal data"). Treasury sits on GovPool
102
+ // as a plain holding, so each withdrawal is an external ERC20/721 call.
103
+ const actionsOnFor = [];
104
+ if (wantToken) {
105
+ const bl = await checkBlacklist(ctx.config, p.token, p.receiver);
106
+ if (bl.status === "blacklisted")
107
+ throw new Error(blacklistError(p.token, p.receiver));
108
+ actionsOnFor.push({
109
+ executor: p.token,
110
+ value: "0",
111
+ data: ERC20_TRANSFER_ABI.encodeFunctionData("transfer", [p.receiver, BigInt(p.amount)]),
112
+ });
113
+ }
114
+ if (wantNfts) {
115
+ for (const id of p.nftIds) {
116
+ actionsOnFor.push({
117
+ executor: p.nftAddress,
118
+ value: "0",
119
+ data: ERC721_TRANSFER_ABI.encodeFunctionData("transferFrom", [govPool, p.receiver, BigInt(id)]),
120
+ });
121
+ }
122
+ }
123
+ return {
124
+ actionsOnFor,
125
+ category: "withdrawDeposit",
126
+ metadataExtra: changes({ receiver: p.receiver, token: p.token, amount: p.amount, nftAddress: p.nftAddress, nftIds: p.nftIds }),
127
+ summary: `Withdraw treasury → ${p.receiver} (${actionsOnFor.length} action${actionsOnFor.length === 1 ? "" : "s"})`,
128
+ };
129
+ },
130
+ };
131
+ const changeVotingSettingsBuilder = {
132
+ schema: z.object({
133
+ govSettings: z.string().describe("GovSettings address (dexe_dao_info.helpers.settings)"),
134
+ settings: z.array(ProposalSettingsSchema).min(1),
135
+ settingsIds: z.array(z.string()).default([]).describe("Ids to edit (parallel to settings). Empty => addSettings"),
136
+ }),
137
+ async build(raw) {
138
+ const p = raw;
139
+ if (!isAddress(p.govSettings))
140
+ throw new Error(`Invalid govSettings: ${p.govSettings}`);
141
+ if (p.settingsIds.length > 0 && p.settingsIds.length !== p.settings.length) {
142
+ throw new Error("settingsIds length must match settings length when editing");
143
+ }
144
+ const tuples = p.settings.map(toSettingsTuple);
145
+ const method = p.settingsIds.length > 0 ? "editSettings" : "addSettings";
146
+ const data = method === "editSettings"
147
+ ? GOV_SETTINGS_ABI.encodeFunctionData(method, [p.settingsIds.map((n) => BigInt(n)), tuples])
148
+ : GOV_SETTINGS_ABI.encodeFunctionData(method, [tuples]);
149
+ return {
150
+ actionsOnFor: [{ executor: p.govSettings, value: "0", data }],
151
+ category: "changeSettings",
152
+ metadataExtra: changes({ mode: method, settingsIds: p.settingsIds, settings: p.settings }),
153
+ summary: `Change voting settings (${method}, ${p.settings.length} entries)`,
154
+ };
155
+ },
156
+ };
157
+ const addExpertBuilder = {
158
+ schema: z.object({
159
+ expertNftContract: z.string().describe("ExpertNft address (local: govPool.getNftContracts().expertNft; global: dexeExpertNft)"),
160
+ scope: z.enum(["local", "global"]),
161
+ nominatedUser: z.string(),
162
+ uri: z.string().default(""),
163
+ }),
164
+ async build(raw) {
165
+ const p = raw;
166
+ if (!isAddress(p.expertNftContract))
167
+ throw new Error(`Invalid expertNftContract: ${p.expertNftContract}`);
168
+ if (!isAddress(p.nominatedUser))
169
+ throw new Error(`Invalid nominatedUser: ${p.nominatedUser}`);
170
+ const data = EXPERT_NFT_ABI.encodeFunctionData("mint", [p.nominatedUser, p.uri]);
171
+ return {
172
+ actionsOnFor: [{ executor: p.expertNftContract, value: "0", data }],
173
+ category: p.scope === "global" ? "globalExpert" : "localExpert",
174
+ metadataExtra: changes({ scope: p.scope, nominatedUser: p.nominatedUser, expertNftContract: p.expertNftContract, uri: p.uri }),
175
+ summary: `Add ${p.scope} expert → ${p.nominatedUser}`,
176
+ };
177
+ },
178
+ };
179
+ const removeExpertBuilder = {
180
+ schema: z.object({
181
+ expertNftContract: z.string(),
182
+ scope: z.enum(["local", "global"]),
183
+ nominatedUser: z.string(),
184
+ }),
185
+ async build(raw) {
186
+ const p = raw;
187
+ if (!isAddress(p.expertNftContract))
188
+ throw new Error(`Invalid expertNftContract: ${p.expertNftContract}`);
189
+ if (!isAddress(p.nominatedUser))
190
+ throw new Error(`Invalid nominatedUser: ${p.nominatedUser}`);
191
+ const data = EXPERT_NFT_ABI.encodeFunctionData("burn", [p.nominatedUser]);
192
+ return {
193
+ actionsOnFor: [{ executor: p.expertNftContract, value: "0", data }],
194
+ category: p.scope === "global" ? "globalExpertRemoval" : "localExpertRemoval",
195
+ metadataExtra: changes({ scope: p.scope, nominatedUser: p.nominatedUser, expertNftContract: p.expertNftContract }),
196
+ summary: `Remove ${p.scope} expert → ${p.nominatedUser}`,
197
+ };
198
+ },
199
+ };
200
+ const tokenDistributionBuilder = {
201
+ schema: z.object({
202
+ distributionProposal: z.string().describe("DistributionProposal address"),
203
+ proposalId: z.string().describe("Expected proposalId (usually latestProposalId + 1)"),
204
+ token: z.string(),
205
+ amount: z.string(),
206
+ isNative: z.boolean().default(false).describe("True for native token — sends value instead of approve"),
207
+ }),
208
+ async build(raw) {
209
+ const p = raw;
210
+ if (!isAddress(p.distributionProposal))
211
+ throw new Error(`Invalid distributionProposal: ${p.distributionProposal}`);
212
+ if (!isAddress(p.token))
213
+ throw new Error(`Invalid token: ${p.token}`);
214
+ const executeData = DISTRIBUTION_PROPOSAL_ABI.encodeFunctionData("execute", [BigInt(p.proposalId), p.token, BigInt(p.amount)]);
215
+ const actionsOnFor = [];
216
+ if (p.isNative) {
217
+ actionsOnFor.push({ executor: p.distributionProposal, value: p.amount, data: executeData });
218
+ }
219
+ else {
220
+ const approveData = ERC20_TRANSFER_ABI.encodeFunctionData("approve", [p.distributionProposal, BigInt(p.amount)]);
221
+ actionsOnFor.push({ executor: p.token, value: "0", data: approveData });
222
+ actionsOnFor.push({ executor: p.distributionProposal, value: "0", data: executeData });
223
+ }
224
+ return {
225
+ actionsOnFor,
226
+ category: "tokenDistribution",
227
+ metadataExtra: changes({ tokenAddress: p.token, tokenAmount: p.amount, proposalId: p.proposalId }),
228
+ summary: `Token distribution → ${p.amount} of ${p.token} via proposal #${p.proposalId}`,
229
+ };
230
+ },
231
+ };
232
+ const tokenSaleBuilder = {
233
+ schema: z.object({
234
+ tokenSaleProposal: z.string().describe("TokenSaleProposal contract address"),
235
+ tiers: z.array(tierSchema).min(1),
236
+ latestTierId: z.string().default("0").describe("Current latestTierId() — bump when extending an existing sale"),
237
+ }),
238
+ async build(raw) {
239
+ const p = raw;
240
+ // Reuse the canonical multi-tier encoder (single source of truth, also used
241
+ // by the OTC composites). Guarantees calldata parity with the build tool.
242
+ const built = buildTokenSaleMultiActions({
243
+ tokenSaleProposal: p.tokenSaleProposal,
244
+ tiers: p.tiers,
245
+ latestTierId: p.latestTierId,
246
+ });
247
+ const meta = built.metadata;
248
+ return {
249
+ actionsOnFor: built.actions,
250
+ category: "tokenSale",
251
+ metadataExtra: meta.changes ? { changes: meta.changes } : {},
252
+ summary: `Token sale tiers → ${built.tierNames}`,
253
+ };
254
+ },
255
+ };
256
+ const customAbiBuilder = {
257
+ schema: z.object({
258
+ target: z.string().describe("Target contract the DAO will call"),
259
+ signature: z.string().describe("Full function signature, e.g. 'function setX(uint256)'"),
260
+ method: z.string().describe("Method name matching the signature"),
261
+ args: z.array(z.unknown()).default([]),
262
+ value: z.string().default("0"),
263
+ }),
264
+ async build(raw) {
265
+ const p = raw;
266
+ if (!isAddress(p.target))
267
+ throw new Error(`Invalid target: ${p.target}`);
268
+ const iface = new Interface([p.signature]);
269
+ const coerced = p.args.map((a) => {
270
+ if (typeof a === "string" && /^-?\d+$/.test(a) && a.length > 9) {
271
+ try {
272
+ return BigInt(a);
273
+ }
274
+ catch {
275
+ return a;
276
+ }
277
+ }
278
+ return a;
279
+ });
280
+ const data = iface.encodeFunctionData(p.method, coerced);
281
+ const forbidden = findForbiddenSelector(data);
282
+ if (forbidden)
283
+ throw new Error(dangerousSelectorError(forbidden, p.target));
284
+ return {
285
+ actionsOnFor: [{ executor: p.target, value: p.value, data }],
286
+ metadataExtra: {},
287
+ summary: `${p.target}.${p.method}(${p.args.length} args)`,
288
+ };
289
+ },
290
+ };
291
+ /**
292
+ * Registry keyed by the short `proposalType` accepted by `dexe_proposal_create`.
293
+ * Extend this to wire another catalog type into the composite.
294
+ */
295
+ export const PROPOSAL_BUILDERS = {
296
+ token_transfer: tokenTransferBuilder,
297
+ withdraw_treasury: withdrawTreasuryBuilder,
298
+ change_voting_settings: changeVotingSettingsBuilder,
299
+ add_expert: addExpertBuilder,
300
+ remove_expert: removeExpertBuilder,
301
+ token_distribution: tokenDistributionBuilder,
302
+ token_sale: tokenSaleBuilder,
303
+ custom_abi: customAbiBuilder,
304
+ };
305
+ /** proposalType values `dexe_proposal_create` accepts directly. */
306
+ export const FLOW_PROPOSAL_TYPES = [
307
+ "modify_dao_profile",
308
+ "custom",
309
+ ...Object.keys(PROPOSAL_BUILDERS),
310
+ ];
311
+ //# sourceMappingURL=proposalBuilders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposalBuilders.js","sourceRoot":"","sources":["../../src/lib/proposalBuilders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Persistent operational state (Phase 3 / v0.14.0). The MCP server otherwise
3
+ * remembers nothing between sessions — every session re-derives which DAOs
4
+ * exist, which chain was last used, etc. This is a tiny JSON store that records
5
+ * DAOs deployed via `dexe_dao_create` and proposals broadcast via
6
+ * `dexe_proposal_create`, so `dexe_context` can surface them next session.
7
+ *
8
+ * Design: single-process, load-once-cache, atomic write (temp + rename).
9
+ * Tolerant — a missing/corrupt/newer file never throws into a tool; it degrades
10
+ * to empty state so a disk hiccup can't brick a broadcast.
11
+ */
12
+ export declare const STATE_VERSION = 1;
13
+ export interface KnownDao {
14
+ name: string;
15
+ govPool: string;
16
+ chainId: number;
17
+ userKeeper?: string;
18
+ token?: string;
19
+ txHash?: string;
20
+ /** ISO-8601 timestamp of when it was recorded. */
21
+ deployedAt: string;
22
+ }
23
+ export interface RecentProposal {
24
+ govPool: string;
25
+ chainId: number;
26
+ title?: string;
27
+ descriptionURL?: string;
28
+ txHash?: string;
29
+ createdAt: string;
30
+ }
31
+ export interface PersistedState {
32
+ version: number;
33
+ knownDaos: KnownDao[];
34
+ lastChainId?: number;
35
+ recentProposals: RecentProposal[];
36
+ /** address (lowercased) → human label. */
37
+ walletLabels: Record<string, string>;
38
+ }
39
+ /** Resolve the state file path: DEXE_STATE_PATH override, else ~/.dexe-mcp/state.json. */
40
+ export declare function resolveStatePath(override?: string): string;
41
+ export declare class StateStore {
42
+ private readonly path;
43
+ private cache;
44
+ constructor(path: string);
45
+ /** Load (and cache) the state. Never throws — degrades to empty on any error. */
46
+ load(): PersistedState;
47
+ private readFromDisk;
48
+ /** Atomic write: temp file + rename. Best-effort — logs and swallows errors. */
49
+ private persist;
50
+ getState(): PersistedState;
51
+ /**
52
+ * Record a deployed DAO. De-dupes by (govPool, chainId): a repeat deploy of
53
+ * the same address updates the existing entry and moves it to the front.
54
+ */
55
+ recordDao(dao: KnownDao): void;
56
+ /** Record a broadcast proposal (most-recent first, capped). */
57
+ recordProposal(p: RecentProposal): void;
58
+ setLastChainId(chainId: number): void;
59
+ setWalletLabel(address: string, label: string): void;
60
+ /** Most-recently recorded DAO, or null. */
61
+ lastDao(): KnownDao | null;
62
+ }
63
+ //# sourceMappingURL=stateStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateStore.d.ts","sourceRoot":"","sources":["../../src/lib/stateStore.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AASD,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,KAAK,CAA+B;gBAEf,IAAI,EAAE,MAAM;IAEzC,iFAAiF;IACjF,IAAI,IAAI,cAAc;IAMtB,OAAO,CAAC,YAAY;IA+BpB,gFAAgF;IAChF,OAAO,CAAC,OAAO;IAef,QAAQ,IAAI,cAAc;IAI1B;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;IAc9B,+DAA+D;IAC/D,cAAc,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI;IAUvC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKrC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQpD,2CAA2C;IAC3C,OAAO,IAAI,QAAQ,GAAG,IAAI;CAG3B"}
@@ -0,0 +1,128 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ /**
5
+ * Persistent operational state (Phase 3 / v0.14.0). The MCP server otherwise
6
+ * remembers nothing between sessions — every session re-derives which DAOs
7
+ * exist, which chain was last used, etc. This is a tiny JSON store that records
8
+ * DAOs deployed via `dexe_dao_create` and proposals broadcast via
9
+ * `dexe_proposal_create`, so `dexe_context` can surface them next session.
10
+ *
11
+ * Design: single-process, load-once-cache, atomic write (temp + rename).
12
+ * Tolerant — a missing/corrupt/newer file never throws into a tool; it degrades
13
+ * to empty state so a disk hiccup can't brick a broadcast.
14
+ */
15
+ export const STATE_VERSION = 1;
16
+ const MAX_DAOS = 50;
17
+ const MAX_PROPOSALS = 25;
18
+ function emptyState() {
19
+ return { version: STATE_VERSION, knownDaos: [], recentProposals: [], walletLabels: {} };
20
+ }
21
+ /** Resolve the state file path: DEXE_STATE_PATH override, else ~/.dexe-mcp/state.json. */
22
+ export function resolveStatePath(override) {
23
+ const raw = (override ?? process.env.DEXE_STATE_PATH)?.trim();
24
+ if (raw)
25
+ return raw;
26
+ return join(homedir(), ".dexe-mcp", "state.json");
27
+ }
28
+ export class StateStore {
29
+ path;
30
+ cache = null;
31
+ constructor(path) {
32
+ this.path = path;
33
+ }
34
+ /** Load (and cache) the state. Never throws — degrades to empty on any error. */
35
+ load() {
36
+ if (this.cache)
37
+ return this.cache;
38
+ this.cache = this.readFromDisk();
39
+ return this.cache;
40
+ }
41
+ readFromDisk() {
42
+ try {
43
+ if (!existsSync(this.path))
44
+ return emptyState();
45
+ const raw = readFileSync(this.path, "utf8");
46
+ const parsed = JSON.parse(raw);
47
+ if (!parsed || typeof parsed !== "object" || parsed.version !== STATE_VERSION) {
48
+ // Unknown/older schema — start fresh rather than risk misreads. (A real
49
+ // migration ladder can slot in here when STATE_VERSION bumps.)
50
+ if (parsed && parsed.version !== undefined && parsed.version !== STATE_VERSION) {
51
+ process.stderr.write(`[dexe-mcp] state.json version ${parsed.version} != ${STATE_VERSION}; starting fresh.\n`);
52
+ }
53
+ return emptyState();
54
+ }
55
+ return {
56
+ version: STATE_VERSION,
57
+ knownDaos: Array.isArray(parsed.knownDaos) ? parsed.knownDaos : [],
58
+ lastChainId: typeof parsed.lastChainId === "number" ? parsed.lastChainId : undefined,
59
+ recentProposals: Array.isArray(parsed.recentProposals) ? parsed.recentProposals : [],
60
+ walletLabels: parsed.walletLabels && typeof parsed.walletLabels === "object" ? parsed.walletLabels : {},
61
+ };
62
+ }
63
+ catch (err) {
64
+ process.stderr.write(`[dexe-mcp] could not read state at ${this.path} (${err instanceof Error ? err.message : String(err)}); using empty state.\n`);
65
+ return emptyState();
66
+ }
67
+ }
68
+ /** Atomic write: temp file + rename. Best-effort — logs and swallows errors. */
69
+ persist(state) {
70
+ this.cache = state;
71
+ try {
72
+ const dir = dirname(this.path);
73
+ if (!existsSync(dir))
74
+ mkdirSync(dir, { recursive: true });
75
+ const tmp = `${this.path}.tmp`;
76
+ writeFileSync(tmp, JSON.stringify(state, null, 2), "utf8");
77
+ renameSync(tmp, this.path);
78
+ }
79
+ catch (err) {
80
+ process.stderr.write(`[dexe-mcp] could not persist state to ${this.path} (${err instanceof Error ? err.message : String(err)}).\n`);
81
+ }
82
+ }
83
+ getState() {
84
+ return this.load();
85
+ }
86
+ /**
87
+ * Record a deployed DAO. De-dupes by (govPool, chainId): a repeat deploy of
88
+ * the same address updates the existing entry and moves it to the front.
89
+ */
90
+ recordDao(dao) {
91
+ const state = this.load();
92
+ const key = (d) => `${d.chainId}:${d.govPool.toLowerCase()}`;
93
+ const k = key(dao);
94
+ const rest = state.knownDaos.filter((d) => key(d) !== k);
95
+ const next = {
96
+ ...state,
97
+ knownDaos: [dao, ...rest].slice(0, MAX_DAOS),
98
+ lastChainId: dao.chainId,
99
+ };
100
+ this.persist(next);
101
+ }
102
+ /** Record a broadcast proposal (most-recent first, capped). */
103
+ recordProposal(p) {
104
+ const state = this.load();
105
+ const next = {
106
+ ...state,
107
+ recentProposals: [p, ...state.recentProposals].slice(0, MAX_PROPOSALS),
108
+ lastChainId: p.chainId,
109
+ };
110
+ this.persist(next);
111
+ }
112
+ setLastChainId(chainId) {
113
+ const state = this.load();
114
+ this.persist({ ...state, lastChainId: chainId });
115
+ }
116
+ setWalletLabel(address, label) {
117
+ const state = this.load();
118
+ this.persist({
119
+ ...state,
120
+ walletLabels: { ...state.walletLabels, [address.toLowerCase()]: label },
121
+ });
122
+ }
123
+ /** Most-recently recorded DAO, or null. */
124
+ lastDao() {
125
+ return this.load().knownDaos[0] ?? null;
126
+ }
127
+ }
128
+ //# sourceMappingURL=stateStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateStore.js","sourceRoot":"","sources":["../../src/lib/stateStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Time formatting helpers for on-chain timestamps.
3
+ *
4
+ * Contracts store times as Unix seconds (UTC-based, timezone-agnostic). Raw
5
+ * seconds are unreadable to humans, so read tools should surface a companion
6
+ * UTC string alongside the raw value to avoid any local-timezone confusion.
7
+ */
8
+ /**
9
+ * Format a Unix timestamp (seconds) as an unambiguous UTC string.
10
+ *
11
+ * @example unixToUtc(1783100759) // "2026-07-03 17:45:59 UTC"
12
+ * @returns "" for zero/invalid input — `0` is the contract's "unset" sentinel
13
+ * (e.g. no vesting), and an empty string reads better than "1970-...".
14
+ */
15
+ export declare function unixToUtc(sec: bigint | number | string): string;
16
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/lib/time.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAO/D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Time formatting helpers for on-chain timestamps.
3
+ *
4
+ * Contracts store times as Unix seconds (UTC-based, timezone-agnostic). Raw
5
+ * seconds are unreadable to humans, so read tools should surface a companion
6
+ * UTC string alongside the raw value to avoid any local-timezone confusion.
7
+ */
8
+ /**
9
+ * Format a Unix timestamp (seconds) as an unambiguous UTC string.
10
+ *
11
+ * @example unixToUtc(1783100759) // "2026-07-03 17:45:59 UTC"
12
+ * @returns "" for zero/invalid input — `0` is the contract's "unset" sentinel
13
+ * (e.g. no vesting), and an empty string reads better than "1970-...".
14
+ */
15
+ export function unixToUtc(sec) {
16
+ const n = Number(sec);
17
+ if (!Number.isFinite(n) || n <= 0)
18
+ return "";
19
+ return new Date(n * 1000)
20
+ .toISOString()
21
+ .replace("T", " ")
22
+ .replace(/\.\d{3}Z$/, " UTC");
23
+ }
24
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/lib/time.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,GAA6B;IACrD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;SACtB,WAAW,EAAE;SACb,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;SACjB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolContext } from "./context.js";
3
+ import { SignerManager } from "../lib/signer.js";
4
+ import type { StateStore } from "../lib/stateStore.js";
5
+ export declare function registerDaoCreateTools(server: McpServer, ctx: ToolContext, signer: SignerManager, state?: StateStore): void;
6
+ //# sourceMappingURL=daoCreate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daoCreate.d.ts","sourceRoot":"","sources":["../../src/tools/daoCreate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgCvD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,UAAU,GACjB,IAAI,CAiJN"}