@zktx.io/sui-mcp 0.5.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 (218) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSES/@mysten-bcs-2.0.5-Apache-2.0.txt +205 -0
  3. package/LICENSES/@mysten-sui-2.17.0-Apache-2.0.txt +201 -0
  4. package/LICENSES/@mysten-utils-0.3.3-Apache-2.0.txt +205 -0
  5. package/LICENSES/fancy-canvas-2.1.0-MIT.txt +7 -0
  6. package/LICENSES/lightweight-charts-5.2.0-NOTICE.txt +2 -0
  7. package/README.md +288 -0
  8. package/dist/adapters/adapterLifecycleValidators.js +5 -0
  9. package/dist/adapters/adapterPromptSurfaces.js +60 -0
  10. package/dist/adapters/deepbook/deepbookHumanReviewProducer.js +178 -0
  11. package/dist/adapters/deepbook/deepbookQuotePolicy.js +112 -0
  12. package/dist/adapters/deepbook/deepbookReviewEvidence.js +507 -0
  13. package/dist/adapters/deepbook/deepbookReviewLifecycle.js +85 -0
  14. package/dist/adapters/deepbook/deepbookSwapIntent.js +79 -0
  15. package/dist/adapters/deepbook/deepbookTransactionMaterialProducer.js +254 -0
  16. package/dist/adapters/intentPlanFactories.js +51 -0
  17. package/dist/adapters/reviewAdapters.js +47 -0
  18. package/dist/core/action/adapterLifecycleValidation.js +12 -0
  19. package/dist/core/action/contractNameRegistry.js +151 -0
  20. package/dist/core/action/forbiddenFields.js +43 -0
  21. package/dist/core/action/humanReadableReviewEvidence.js +193 -0
  22. package/dist/core/action/humanReadableReviewProjectionVerifier.js +29 -0
  23. package/dist/core/action/ptbVisualizationProducer.js +71 -0
  24. package/dist/core/action/receiptPtbGraph.js +29 -0
  25. package/dist/core/action/reviewCheckResults.js +6 -0
  26. package/dist/core/action/reviewStateValidation.js +11 -0
  27. package/dist/core/action/reviewTimeSimulationEvidence.js +470 -0
  28. package/dist/core/action/schemas.js +491 -0
  29. package/dist/core/action/signableAdapterContract.js +998 -0
  30. package/dist/core/action/suiChainReceiptEvidence.js +106 -0
  31. package/dist/core/action/suiChainReceiptMapping.js +107 -0
  32. package/dist/core/action/suiChainReceiptReader.js +211 -0
  33. package/dist/core/action/suiChainReceiptVerifier.js +178 -0
  34. package/dist/core/action/swapHumanReadableReviewProjection.js +130 -0
  35. package/dist/core/action/swapQuotePolicyEvidence.js +271 -0
  36. package/dist/core/action/transactionFunding.js +244 -0
  37. package/dist/core/action/transactionObjectOwnershipEvidence.js +256 -0
  38. package/dist/core/action/transactionObjectOwnershipProducer.js +323 -0
  39. package/dist/core/action/types.js +33 -0
  40. package/dist/core/action/walletReviewContractAssembler.js +286 -0
  41. package/dist/core/activity/accountAssetTimeline.js +157 -0
  42. package/dist/core/activity/accountAssetTimelineUsdcReferences.js +120 -0
  43. package/dist/core/activity/activityStore.js +16 -0
  44. package/dist/core/activity/externalActivityCoverage.js +76 -0
  45. package/dist/core/activity/externalActivityTransactionStream.js +82 -0
  46. package/dist/core/activity/localDataService.js +296 -0
  47. package/dist/core/activity/localDataTypes.js +11 -0
  48. package/dist/core/activity/localDataValidation.js +439 -0
  49. package/dist/core/activity/schemaVersion.js +2 -0
  50. package/dist/core/activity/sqliteActivityStore.js +1068 -0
  51. package/dist/core/activity/sqliteActivityStoreRows.js +389 -0
  52. package/dist/core/activity/sqliteActivityStoreSchema.js +367 -0
  53. package/dist/core/activity/sqliteActivityStoreTypes.js +5 -0
  54. package/dist/core/activity/suiFunctionTarget.js +43 -0
  55. package/dist/core/activity/transactionActivityAccountEffects.js +186 -0
  56. package/dist/core/activity/transactionActivityAnalysis.js +295 -0
  57. package/dist/core/activity/transactionActivityClassifier.js +306 -0
  58. package/dist/core/activity/transactionActivityDetails.js +229 -0
  59. package/dist/core/activity/transactionActivityProtocolRules.js +218 -0
  60. package/dist/core/activity/transactionActivityScanPolicy.js +170 -0
  61. package/dist/core/activity/transactionActivityService.js +379 -0
  62. package/dist/core/activity/transactionActivityTypes.js +18 -0
  63. package/dist/core/eventlog/sink.js +35 -0
  64. package/dist/core/evidence/settlementFamilies.js +85 -0
  65. package/dist/core/evidence/userAnswerUse.js +1 -0
  66. package/dist/core/numeric/rawU64.js +63 -0
  67. package/dist/core/preferences/preferencesStore.js +26 -0
  68. package/dist/core/preferences/sqlitePreferencesRepository.js +136 -0
  69. package/dist/core/proposal/externalProposalReview.js +347 -0
  70. package/dist/core/proposal/schemas.js +208 -0
  71. package/dist/core/proposal/types.js +35 -0
  72. package/dist/core/read/amounts.js +14 -0
  73. package/dist/core/read/coinMetadata.js +60 -0
  74. package/dist/core/read/deepbookOfficialIndexerSource.js +373 -0
  75. package/dist/core/read/deepbookRawQuoteClient.js +86 -0
  76. package/dist/core/read/deepbookReadHelpers.js +321 -0
  77. package/dist/core/read/deepbookRegistry.js +157 -0
  78. package/dist/core/read/deepbookSourceOwners.js +159 -0
  79. package/dist/core/read/deepbookUsdcChartService.js +342 -0
  80. package/dist/core/read/intentEvidenceResponseFormatting.js +228 -0
  81. package/dist/core/read/readCardInputs.js +19 -0
  82. package/dist/core/read/readCardResult.js +40 -0
  83. package/dist/core/read/readResponseGuidance.js +402 -0
  84. package/dist/core/read/readService.js +1639 -0
  85. package/dist/core/read/readServiceTypes.js +88 -0
  86. package/dist/core/read/settlementParityFormatting.js +82 -0
  87. package/dist/core/read/walletReadHelpers.js +99 -0
  88. package/dist/core/review/reviewChecks.js +45 -0
  89. package/dist/core/review/reviewComputation.js +38 -0
  90. package/dist/core/review/reviewComputationResult.js +87 -0
  91. package/dist/core/session/cardSession.js +31 -0
  92. package/dist/core/session/cardSessionStore.js +204 -0
  93. package/dist/core/session/keyedRecordStore.js +18 -0
  94. package/dist/core/session/liveReviewSessionContract.js +3 -0
  95. package/dist/core/session/localSession.js +31 -0
  96. package/dist/core/session/privateReviewArtifacts.js +75 -0
  97. package/dist/core/session/reviewValidity.js +49 -0
  98. package/dist/core/session/sessionErrors.js +9 -0
  99. package/dist/core/session/sessionRecordStore.js +40 -0
  100. package/dist/core/session/sessionStore.js +655 -0
  101. package/dist/core/session/settingsSession.js +1 -0
  102. package/dist/core/session/settingsSessions.js +45 -0
  103. package/dist/core/session/sqliteCardStore.js +88 -0
  104. package/dist/core/session/sqliteSessionStore.js +213 -0
  105. package/dist/core/session/sqliteTransactionMaterialStore.js +64 -0
  106. package/dist/core/session/sqliteWalletWorkflowStore.js +821 -0
  107. package/dist/core/session/status.js +60 -0
  108. package/dist/core/session/transactionMaterialStore.js +221 -0
  109. package/dist/core/session/transactionRequest.js +72 -0
  110. package/dist/core/session/wait.js +79 -0
  111. package/dist/core/session/walletConnection.js +92 -0
  112. package/dist/core/session/walletRuntime.js +38 -0
  113. package/dist/core/session/walletWorkflow.js +608 -0
  114. package/dist/core/session/workflowState.js +80 -0
  115. package/dist/core/session/workflowView.js +150 -0
  116. package/dist/core/suiAddress.js +18 -0
  117. package/dist/core/suiEndpoint.js +72 -0
  118. package/dist/mcp/activeAccountResponse.js +24 -0
  119. package/dist/mcp/prompts.js +146 -0
  120. package/dist/mcp/registerTool.js +19 -0
  121. package/dist/mcp/resources.js +72 -0
  122. package/dist/mcp/responseGuidance.js +326 -0
  123. package/dist/mcp/result.js +17 -0
  124. package/dist/mcp/schemas.js +11 -0
  125. package/dist/mcp/server.js +32 -0
  126. package/dist/mcp/serverInfo.js +131 -0
  127. package/dist/mcp/toolErrors.js +118 -0
  128. package/dist/mcp/toolNames.js +58 -0
  129. package/dist/mcp/tools/account/index.js +44 -0
  130. package/dist/mcp/tools/action/prepareSuiActionReview.js +126 -0
  131. package/dist/mcp/tools/read/commonSchemas.js +43 -0
  132. package/dist/mcp/tools/read/deepbookReadTools.js +686 -0
  133. package/dist/mcp/tools/read/index.js +14 -0
  134. package/dist/mcp/tools/read/readToolHelpers.js +97 -0
  135. package/dist/mcp/tools/read/reviewActivityTools.js +179 -0
  136. package/dist/mcp/tools/read/serverStatusTools.js +100 -0
  137. package/dist/mcp/tools/read/transactionActivityOutput.js +371 -0
  138. package/dist/mcp/tools/read/transactionActivityTools.js +858 -0
  139. package/dist/mcp/tools/read/walletReadTools.js +734 -0
  140. package/dist/mcp/tools/session/executionResultTools.js +44 -0
  141. package/dist/mcp/tools/session/index.js +8 -0
  142. package/dist/mcp/tools/session/shared.js +36 -0
  143. package/dist/mcp/tools/session/statusTools.js +69 -0
  144. package/dist/mcp/tools/session/walletConnectionTools.js +69 -0
  145. package/dist/mcp/tools/settings/index.js +66 -0
  146. package/dist/mcp-app/account.html +3133 -0
  147. package/dist/mcp-app/account.notices.txt +973 -0
  148. package/dist/mcp-app/chart.html +3354 -0
  149. package/dist/mcp-app/chart.notices.txt +1194 -0
  150. package/dist/mcp-app/connect.html +3179 -0
  151. package/dist/mcp-app/connect.notices.txt +1012 -0
  152. package/dist/mcp-app/receipt.html +8430 -0
  153. package/dist/mcp-app/receipt.notices.txt +3549 -0
  154. package/dist/mcp-app/review.html +8430 -0
  155. package/dist/mcp-app/review.notices.txt +3549 -0
  156. package/dist/mcp-ui/contracts.js +31 -0
  157. package/dist/mcp-ui/readCards.js +28 -0
  158. package/dist/mcp-ui/tools.js +134 -0
  159. package/dist/review-app/brand-dark.svg +1 -0
  160. package/dist/review-app/brand-light.svg +1 -0
  161. package/dist/review-app/favicon.svg +1 -0
  162. package/dist/review-app/settings.css +1 -0
  163. package/dist/review-app/settings.js +1 -0
  164. package/dist/review-app/ui.css +809 -0
  165. package/dist/review-server/assets.js +48 -0
  166. package/dist/review-server/html.js +45 -0
  167. package/dist/review-server/http.js +47 -0
  168. package/dist/review-server/middleware/hostOrigin.js +48 -0
  169. package/dist/review-server/middleware/reviewToken.js +7 -0
  170. package/dist/review-server/reviewServerPolicy.js +1 -0
  171. package/dist/review-server/server.js +72 -0
  172. package/dist/review-server/settingsApi.js +158 -0
  173. package/dist/runtime/application.js +203 -0
  174. package/dist/runtime/config.js +97 -0
  175. package/dist/runtime/localSettingsService.js +198 -0
  176. package/dist/runtime/logger.js +66 -0
  177. package/dist/runtime/reviewDependencies.js +58 -0
  178. package/dist/runtime/reviewServerAcquire.js +93 -0
  179. package/dist/runtime/runtimeTermination.js +60 -0
  180. package/dist/runtime/shared/authenticatedFetch.js +127 -0
  181. package/dist/runtime/shared/control.js +93 -0
  182. package/dist/runtime/shared/dataAccess.js +66 -0
  183. package/dist/runtime/shared/mcpHttp.js +84 -0
  184. package/dist/runtime/shared/ownerLease.js +50 -0
  185. package/dist/runtime/shared/server.js +98 -0
  186. package/dist/runtime/shared/stdio.js +113 -0
  187. package/dist/runtime/smokeMainnetRead.js +391 -0
  188. package/dist/runtime/smokeMainnetReadAssertions.js +306 -0
  189. package/dist/runtime/smokeReview.js +40 -0
  190. package/dist/runtime/start.js +90 -0
  191. package/dist/runtime/suiEndpoint.js +97 -0
  192. package/dist/runtime/suiTransactionGraphqlMapping.js +200 -0
  193. package/dist/runtime/suiTransactionGraphqlQueries.js +231 -0
  194. package/dist/runtime/suiTransactionGraphqlSource.js +148 -0
  195. package/dist/runtime/walletConnectConfig.js +3 -0
  196. package/dist/runtime/walletConnectStorage.js +99 -0
  197. package/dist/runtime/walletConnectTransport.js +128 -0
  198. package/dist/runtime/walletSdkChild.js +3 -0
  199. package/dist/runtime/walletSdkChildRuntime.js +160 -0
  200. package/dist/runtime/walletSdkIpc.js +26 -0
  201. package/dist/runtime/walletSdkProcess.js +358 -0
  202. package/docs/AGENT_BEHAVIOR.md +524 -0
  203. package/docs/AGENT_DEVELOPMENT_POLICY.md +815 -0
  204. package/docs/FRONTEND_POLICY.md +534 -0
  205. package/docs/LOCAL_DB_ARCHITECTURE.md +381 -0
  206. package/docs/MCP_SETUP.md +742 -0
  207. package/docs/MCP_TOOLS.md +1318 -0
  208. package/docs/SDK_API.md +206 -0
  209. package/docs/SIGNABLE_ADAPTER_CONTRACT.md +396 -0
  210. package/docs/TRANSACTION_ACTIVITY_LOG.md +194 -0
  211. package/docs/UTILITY_INDEX.md +275 -0
  212. package/docs/WALLET_CONNECTION.md +238 -0
  213. package/docs/golden-scenarios/BEHAVIOR_MATRIX.md +166 -0
  214. package/docs/golden-scenarios/INTENT_EVIDENCE_GOLDEN_ANSWERS.md +161 -0
  215. package/docs/golden-scenarios/INTENT_EVIDENCE_MATRIX.md +259 -0
  216. package/package.json +79 -0
  217. package/protocols/deepbook-margin.md +15 -0
  218. package/protocols/deepbook-v3.md +24 -0
@@ -0,0 +1,326 @@
1
+ import { EXTERNAL_PROPOSAL_SETTLEMENT_TOKEN_SELECTION_UNSUPPORTED_CLAIM_ID } from "../core/proposal/types.js";
2
+ import { TOOL_NAMES } from "./toolNames.js";
3
+ export function interactionStatusUserAnswerUse(hasWalletObservation = false, hasConnectionConflict = false) {
4
+ return {
5
+ canAnswer: [
6
+ "stored_active_account_read_context",
7
+ "wallet_connections_when_wallet_availability_is_available",
8
+ "connection_qualified_default_asset_account",
9
+ "pending_local_wallet_connection_interactions",
10
+ ...(hasConnectionConflict ? ["multiple_saved_connections_require_user_targeted_disconnection"] : []),
11
+ "pending_local_review_interactions",
12
+ "wallet_operation_availability_separate_from_stored_transaction_facts"
13
+ ],
14
+ cannotAnswer: [
15
+ "wallet_login_or_authentication",
16
+ "implicit_default_unavailability_as_explicit_address_support_for_every_tool",
17
+ "wallet_custody_or_authorization",
18
+ "wallet_unavailability_as_chain_failure_or_lost_stored_result",
19
+ "last_service_observation_as_live_wallet_app_state",
20
+ "sdk_availability_or_recorded_connection_as_account_use_or_signing_authority",
21
+ "transaction_execution_result",
22
+ "transaction_building",
23
+ "signing_data_or_readiness",
24
+ "complete_wallet_history",
25
+ "profit_or_pnl"
26
+ ],
27
+ preconditionFields: ["walletAvailability", "assetReadAccount", ...(hasConnectionConflict ? ["connectionConflict"] : [])],
28
+ answerFields: ["activeAccount", "connections", "assetReadAccount", "pendingWalletConnections", "pendingReviewSessions", "walletAvailability",
29
+ ...(hasConnectionConflict ? ["connectionConflict"] : []),
30
+ ...(hasWalletObservation ? ["walletObservation"] : [])],
31
+ diagnosticOnlyFields: [
32
+ "pendingWalletConnections.truncated",
33
+ "pendingReviewSessions.truncated"
34
+ ],
35
+ followUp: {
36
+ tool: TOOL_NAMES.sessionGetReviewStatus,
37
+ inputFields: ["pendingReviewSessions.items[].reviewSessionId"],
38
+ answerFields: ["pollingStatus", "statusCategory", "reviewState"],
39
+ reason: "Read one review's stored preparation and request facts. The overview lists live input or ongoing work; cancelled input alone is not pending."
40
+ }
41
+ };
42
+ }
43
+ export function executionResultUserAnswerUse(fields = {}) {
44
+ const hasExecutionResult = fields.hasExecutionResult ?? false;
45
+ const hasWaitOutcome = fields.hasWaitOutcome ?? false;
46
+ return {
47
+ canAnswer: [
48
+ "current_local_execution_polling_status",
49
+ "whether_user_action_or_chain_polling_is_still_pending",
50
+ "wallet_operation_availability_separate_from_stored_transaction_facts",
51
+ ...(hasExecutionResult ? ["recorded_review_execution_result"] : [])
52
+ ],
53
+ cannotAnswer: [
54
+ ...(hasExecutionResult ? [] : ["recorded_review_execution_result_without_executionResult_field"]),
55
+ "transaction_execution_guarantee",
56
+ "chain_receipt_as_execution_guarantee",
57
+ "chain_receipt_as_route_quality",
58
+ "chain_receipt_as_fiat_pnl_tax_or_peg_evidence",
59
+ "absolute_safety_verdict",
60
+ "route_quality",
61
+ "wallet_custody_or_authorization",
62
+ "wallet_unavailability_as_chain_failure_or_lost_stored_result",
63
+ "transaction_building",
64
+ "signing_data_or_readiness",
65
+ "complete_wallet_history",
66
+ "profit_or_pnl"
67
+ ],
68
+ answerFields: [
69
+ "walletAvailability", "progress", ...(fields.hasConnectionConflict ? ["connectionConflict"] : []), ...(hasWaitOutcome ? ["waitOutcome"] : []),
70
+ "reviewSessionId",
71
+ "status",
72
+ "pollingStatus",
73
+ "statusCategory",
74
+ "lastActivityAt",
75
+ "pollingHint",
76
+ ...(fields.hasRequest ? ["attemptId", "requestStatus", "request"] : []),
77
+ ...(hasExecutionResult ? ["executionResult"] : [])
78
+ ],
79
+ conclusionRuleFields: [
80
+ "walletAvailability.status", "progress.status", "statusCategory",
81
+ "pollingHint.finalStatuses",
82
+ "pollingHint.userActionRequiredStatuses",
83
+ "pollingHint.nonTerminalStatuses"
84
+ ],
85
+ diagnosticOnlyFields: [],
86
+ followUp: {
87
+ tool: TOOL_NAMES.sessionGetReviewStatus,
88
+ inputFields: ["reviewSessionId"],
89
+ answerFields: ["pollingStatus", "statusCategory", "reviewState"],
90
+ reason: "Use for current review state and checks. Wallet availability describes backend operations, not authorization. An unavailable wait retains stored facts and does not prove chain failure."
91
+ }
92
+ };
93
+ }
94
+ export function reviewStatusUserAnswerUse(hasReviewState, hasAdapterLifecycle = false, hasHumanReadableReview = false, hasSimulation = false, hasConnectionConflict = false) {
95
+ return {
96
+ canAnswer: [
97
+ "current_local_review_session_status",
98
+ "current_review_checks_when_reviewState_is_present",
99
+ ...(hasAdapterLifecycle ? ["current_adapter_review_lifecycle_stage_status"] : []),
100
+ ...(hasHumanReadableReview ? ["current_human_readable_review_facts_projected_from_verified_review_evidence"] : []),
101
+ ...(hasSimulation ? ["current_review_time_simulation_summary_projected_from_private_review_evidence"] : []),
102
+ "whether_user_action_or_chain_polling_is_still_pending",
103
+ "wallet_operation_availability_separate_from_stored_transaction_facts"
104
+ ],
105
+ cannotAnswer: [
106
+ "transaction_execution_guarantee",
107
+ "absolute_safety_verdict",
108
+ "route_quality",
109
+ "wallet_custody_or_authorization",
110
+ "wallet_unavailability_as_chain_failure_or_lost_stored_result",
111
+ "transaction_building",
112
+ "transaction_bytes_or_signatures",
113
+ "signing_data_or_readiness",
114
+ "complete_wallet_history",
115
+ "profit_or_pnl"
116
+ ],
117
+ answerFields: [
118
+ "walletAvailability", "progress", ...(hasConnectionConflict ? ["connectionConflict"] : []), "reviewSessionId",
119
+ "status",
120
+ "pollingStatus",
121
+ "statusCategory",
122
+ ...(hasReviewState
123
+ ? [
124
+ "reviewState.status",
125
+ "reviewState.checks",
126
+ "reviewState.blockedReason",
127
+ "reviewState.refreshReason"
128
+ ]
129
+ : []),
130
+ ...(hasAdapterLifecycle
131
+ ? [
132
+ "reviewState.adapterLifecycle",
133
+ "reviewState.adapterLifecycle.stageCatalogId",
134
+ "reviewState.adapterLifecycle.completedStages",
135
+ "reviewState.adapterLifecycle.missingStages"
136
+ ]
137
+ : []),
138
+ ...(hasHumanReadableReview
139
+ ? [
140
+ "reviewState.humanReadableReview",
141
+ "reviewState.humanReadableReview.kind",
142
+ "reviewState.humanReadableReview.proposedAction",
143
+ "reviewState.humanReadableReview.assetFlow",
144
+ "reviewState.humanReadableReview.targets",
145
+ "reviewState.humanReadableReview.evidenceUsed",
146
+ "reviewState.humanReadableReview.missingEvidence",
147
+ "reviewState.humanReadableReview.requiredUserChoices",
148
+ "reviewState.humanReadableReview.freshness",
149
+ "reviewState.humanReadableReview.unsupportedClaims",
150
+ "reviewState.humanReadableReview.blockingChecks"
151
+ ]
152
+ : []),
153
+ ...(hasSimulation
154
+ ? [
155
+ "reviewState.simulation",
156
+ "reviewState.simulation.provider",
157
+ "reviewState.simulation.checksEnabled",
158
+ "reviewState.simulation.success",
159
+ "reviewState.simulation.gasCostSummary",
160
+ "reviewState.simulation.gasCostSummary.computationCostRaw",
161
+ "reviewState.simulation.gasCostSummary.storageCostRaw",
162
+ "reviewState.simulation.gasCostSummary.storageRebateRaw",
163
+ "reviewState.simulation.gasCostSummary.nonRefundableStorageFeeRaw",
164
+ "reviewState.simulation.balanceChanges",
165
+ "reviewState.simulation.objectChanges"
166
+ ]
167
+ : []),
168
+ "lastActivityAt"
169
+ ],
170
+ diagnosticOnlyFields: [],
171
+ followUp: {
172
+ tool: TOOL_NAMES.sessionGetExecutionResult,
173
+ inputFields: ["reviewSessionId"],
174
+ answerFields: ["executionResult"],
175
+ reason: "Use when the user asks for a recorded execution result; status alone is not transaction execution proof."
176
+ }
177
+ };
178
+ }
179
+ export function reviewActivityListUserAnswerUse() {
180
+ return {
181
+ canAnswer: ["local_review_session_rows_for_the_selected_account", "current_stored_review_status_counts_by_row"],
182
+ cannotAnswer: [
183
+ "sui_wallet_transaction_history",
184
+ "complete_wallet_history",
185
+ "execution_result_detail",
186
+ "transaction_building",
187
+ "signing_data_or_readiness",
188
+ "profit_or_pnl"
189
+ ],
190
+ answerFields: ["activities", "activities[].reviewSessionId", "activities[].reviewStatus", "activities[].updatedAt"],
191
+ diagnosticOnlyFields: ["dataScope", "accountSource", "lowSampleWarning", "lowSampleThreshold", "truncated"],
192
+ followUp: {
193
+ tool: TOOL_NAMES.readGetReviewSessionDetail,
194
+ inputFields: ["activities[].reviewSessionId"],
195
+ answerFields: ["session", "planJson", "intentJson", "stateSnapshots", "transitions", "requests"],
196
+ reason: "Use for stored plan, state snapshot, transition, and execution detail for one review session."
197
+ }
198
+ };
199
+ }
200
+ export function reviewFunnelUserAnswerUse() {
201
+ return {
202
+ canAnswer: ["local_review_lifecycle_counts_for_the_selected_account"],
203
+ cannotAnswer: [
204
+ "sui_wallet_transaction_history",
205
+ "complete_wallet_history",
206
+ "execution_success_rate_for_all_wallet_activity",
207
+ "transaction_building",
208
+ "signing_data_or_readiness",
209
+ "profit_or_pnl"
210
+ ],
211
+ answerFields: ["summary"],
212
+ diagnosticOnlyFields: ["dataScope", "accountSource", "lowSampleWarning", "lowSampleThreshold", "truncated"]
213
+ };
214
+ }
215
+ export function prepareActionReviewUserAnswerUse(fields = {}) {
216
+ const hasBlockingPreliminaryChecks = fields.hasBlockingPreliminaryChecks ?? false;
217
+ return {
218
+ canAnswer: [
219
+ "internal_review_card_for_user_review",
220
+ "preliminary_check_results_for_proposed_plan",
221
+ "proposed_plan_asset_flow_preview",
222
+ ...(hasBlockingPreliminaryChecks ? ["why_signing_is_currently_blocked_for_this_review"] : [])
223
+ ],
224
+ cannotAnswer: [
225
+ "transaction_execution_guarantee",
226
+ "transaction_building",
227
+ "signing_data_or_readiness",
228
+ "wallet_custody_or_authorization",
229
+ "route_quality",
230
+ "fiat_usd_cash_out",
231
+ "profit_or_pnl"
232
+ ],
233
+ answerFields: [
234
+ "reviewSessionId",
235
+ "card",
236
+ "plans",
237
+ "plans[].title",
238
+ "plans[].summary",
239
+ "plans[].assetFlowPreview",
240
+ "plans[].preliminaryChecks",
241
+ "preliminaryChecks"
242
+ ],
243
+ conclusionRuleFields: ["plans[].preliminaryChecks", "preliminaryChecks"],
244
+ diagnosticOnlyFields: ["plans[].adapterData", "plans[].createdAt", "plans[].id"],
245
+ followUp: {
246
+ tool: TOOL_NAMES.sessionGetReviewStatus,
247
+ inputFields: ["reviewSessionId"],
248
+ answerFields: ["pollingStatus", "statusCategory", "reviewState"],
249
+ reason: "Use for current review readiness; the prepare response only describes the proposal and any blocking preliminary checks."
250
+ }
251
+ };
252
+ }
253
+ export function prepareExternalProposalReviewUserAnswerUse() {
254
+ return {
255
+ canAnswer: [
256
+ "internal_review_card_for_user_review",
257
+ "external_proposal_summary_for_local_review",
258
+ "proposal_asset_flow_preview",
259
+ "proposal_recipient_or_target_fields",
260
+ "missing_evidence_for_non_signable_review",
261
+ "required_user_choices_for_non_signable_review",
262
+ "unsupported_claims_for_non_signable_review",
263
+ "why_signing_is_currently_blocked_for_this_review"
264
+ ],
265
+ cannotAnswer: [
266
+ "transaction_execution_guarantee",
267
+ "transaction_building",
268
+ "signing_data_or_readiness",
269
+ "wallet_custody_or_authorization",
270
+ "route_quality",
271
+ EXTERNAL_PROPOSAL_SETTLEMENT_TOKEN_SELECTION_UNSUPPORTED_CLAIM_ID,
272
+ "fiat_usd_cash_out",
273
+ "profit_or_pnl"
274
+ ],
275
+ answerFields: [
276
+ "reviewSessionId",
277
+ "card",
278
+ "plans",
279
+ "plans[].reviewModel.proposedAction",
280
+ "plans[].reviewModel.assetFlow",
281
+ "plans[].reviewModel.recipients",
282
+ "plans[].reviewModel.targets",
283
+ "plans[].reviewModel.evidenceUsed",
284
+ "plans[].reviewModel.missingEvidence",
285
+ "plans[].reviewModel.requiredUserChoices",
286
+ "plans[].reviewModel.unsupportedClaims",
287
+ "plans[].reviewModel.freshness",
288
+ "plans[].reviewModel.blockingChecks",
289
+ "plans[].reviewModel.nonSignableReason",
290
+ "preliminaryChecks"
291
+ ],
292
+ conclusionRuleFields: [
293
+ "plans[].reviewModel.unsupportedClaims",
294
+ "plans[].reviewModel.nonSignableReason",
295
+ "preliminaryChecks"
296
+ ],
297
+ diagnosticOnlyFields: [
298
+ "plans[].adapterData",
299
+ "plans[].createdAt",
300
+ "plans[].id",
301
+ "plans[].reviewModel.rejectedExecutableFields"
302
+ ],
303
+ followUp: {
304
+ tool: TOOL_NAMES.sessionGetReviewStatus,
305
+ inputFields: ["reviewSessionId"],
306
+ answerFields: ["pollingStatus", "statusCategory", "reviewState"],
307
+ reason: "Use for current review status after the user opens the internal card; the prepare response does not make the proposal signable."
308
+ }
309
+ };
310
+ }
311
+ export function reviewSessionDetailUserAnswerUse(options = { hasCurrentRequest: false, hasCurrentExecution: false, hasHistoricalExecution: false }) {
312
+ const hasExecution = options.hasCurrentExecution || options.hasHistoricalExecution;
313
+ return {
314
+ canAnswer: ["stored_local_review_session_plan_and_lifecycle_detail", "stored_review_state_snapshots", "stored_transaction_request_history",
315
+ ...(hasExecution ? ["stored_review_chain_execution_result"] : [])],
316
+ cannotAnswer: ["sui_wallet_transaction_history", "complete_wallet_history", "transaction_execution_guarantee", "absolute_safety_verdict",
317
+ "route_quality", "wallet_custody_or_authorization", "transaction_building", "signing_data_or_readiness", "profit_or_pnl",
318
+ ...(hasExecution ? [] : ["chain_execution_result_without_execution_field"])],
319
+ answerFields: ["session", "planJson", "intentJson", "stateSnapshots", "transitions", "requests",
320
+ ...(options.hasCurrentRequest ? ["request"] : []), ...(options.hasCurrentExecution ? ["request.execution"] : [])],
321
+ diagnosticOnlyFields: ["dataScope", "accountSource", "lowSampleWarning", "lowSampleThreshold", "truncated", "requestCount"],
322
+ followUp: { tool: TOOL_NAMES.sessionGetReviewStatus, inputFields: ["session.reviewSessionId"],
323
+ answerFields: ["status", "pollingStatus", "reviewState"],
324
+ reason: "Read the current DB review and request status. Stored history, including imported history, is not an active approval." }
325
+ };
326
+ }
@@ -0,0 +1,17 @@
1
+ import { assertNoForbiddenMcpFields } from "../core/action/forbiddenFields.js";
2
+ export function okToolResult(data) {
3
+ const payload = { ok: true, data };
4
+ assertNoForbiddenMcpFields(payload);
5
+ return {
6
+ structuredContent: payload,
7
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }]
8
+ };
9
+ }
10
+ export function errorToolResult(error) {
11
+ const payload = { ok: false, error };
12
+ assertNoForbiddenMcpFields(payload);
13
+ return {
14
+ isError: true,
15
+ content: [{ type: "text", text: JSON.stringify(payload, null, 2) }]
16
+ };
17
+ }
@@ -0,0 +1,11 @@
1
+ import { z } from "zod";
2
+ // No-parameter tools. The `.optional()` is load-bearing: it lets the tool be called with
3
+ // no arguments at all (undefined args validate). A bare `{}`/`z.object({})` would instead
4
+ // REQUIRE an (empty) object and reject an argument-less call, so this is not a no-op.
5
+ export const noParamsInputSchema = z.object({}).optional();
6
+ export function successOutputSchema(dataShape) {
7
+ return {
8
+ ok: z.literal(true),
9
+ data: z.object(dataShape)
10
+ };
11
+ }
@@ -0,0 +1,32 @@
1
+ import { registerReadCards } from "../mcp-ui/tools.js";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { registerMcpPrompts } from "./prompts.js";
4
+ import { registerMcpResources } from "./resources.js";
5
+ import { SERVER_INSTRUCTIONS, SERVER_NAME, SERVER_VERSION } from "./serverInfo.js";
6
+ import { assertAllToolNamesValid } from "./toolNames.js";
7
+ import { registerActionTools } from "./tools/action/prepareSuiActionReview.js";
8
+ import { registerAccountTools } from "./tools/account/index.js";
9
+ import { registerReadTools } from "./tools/read/index.js";
10
+ import { registerSettingsTools } from "./tools/settings/index.js";
11
+ import { registerSessionTools } from "./tools/session/index.js";
12
+ export function createMcpServer(deps) {
13
+ assertAllToolNamesValid();
14
+ const server = new McpServer({
15
+ name: SERVER_NAME,
16
+ version: SERVER_VERSION
17
+ }, {
18
+ instructions: SERVER_INSTRUCTIONS
19
+ });
20
+ registerMcpResources(server);
21
+ registerReadCards(server, deps);
22
+ registerMcpPrompts(server, deps.promptSurfaces ?? []);
23
+ registerAccountTools(server, deps);
24
+ registerReadTools(server, deps);
25
+ registerSettingsTools(server, deps);
26
+ registerActionTools(server, deps);
27
+ registerSessionTools(server, deps);
28
+ return server;
29
+ }
30
+ export async function startMcp(server, transport) {
31
+ await server.connect(transport);
32
+ }
@@ -0,0 +1,131 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING } from "../core/read/deepbookSourceOwners.js";
5
+ import { TOOL_NAMES } from "./toolNames.js";
6
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
7
+ const packageMetadata = JSON.parse(readFileSync(resolve(packageRoot, "package.json"), "utf8"));
8
+ export const PACKAGE_NAME = packageMetadata.name;
9
+ export const SERVER_NAME = "sui-mcp";
10
+ export const SERVER_VERSION = packageMetadata.version;
11
+ export const SERVER_NETWORK = "mainnet";
12
+ export const SERVER_RUNTIME = "local_stdio";
13
+ export const SERVER_TRANSPORT = "grpc_graphql";
14
+ export const USD_INTENT_ANSWER_REQUIRED_TOOLS = [
15
+ TOOL_NAMES.readGetServerStatus,
16
+ TOOL_NAMES.readListSettlementAssetGroups,
17
+ TOOL_NAMES.readPreviewIntentEvidence
18
+ ];
19
+ export const USD_PARITY_ANSWER_REQUIRED_TOOLS = [
20
+ TOOL_NAMES.readGetServerStatus,
21
+ TOOL_NAMES.readListSettlementAssetGroups,
22
+ TOOL_NAMES.readSummarizeSettlementAssetGroupParity
23
+ ];
24
+ export const EVIDENCE_POLICY = {
25
+ version: "intent-evidence-alpha-2026-05-23",
26
+ releaseGate: "intent_evidence_v1",
27
+ requiredFirstCheck: true,
28
+ requiredStatusFields: [
29
+ "packageName",
30
+ "version",
31
+ "evidencePolicy.version",
32
+ "network",
33
+ "implementedToolsCount"
34
+ ],
35
+ gates: [
36
+ "server_status_version_check",
37
+ "natural_language_settlement_asset_group_evidence",
38
+ "sdk_sot_no_duplicate_registry_or_amount_parser",
39
+ "requested_account_inference_policy",
40
+ "wallet_balance_snapshot_not_receipt_proof",
41
+ "deepbook_quote_no_fiat_or_route_inference",
42
+ "pnl_unsupported"
43
+ ]
44
+ };
45
+ export const SERVER_INSTRUCTIONS = [
46
+ "Sui MCP is a mainnet-only Sui DeFi intent evidence toolkit. Ordinary MCP tools return evidence or internal cards, never signing authority, bytes or signatures. Only user card selection and wallet approval authorize the backend WalletConnect flow: verify reviewed digest and signer, submit once, then read chain effects. Request status is separate from chain success/failure; uncertain results are read by digest, never resubmitted.",
47
+ "External proposals are untrusted facts; plans[].reviewModel is review context, not transaction material, route/settlement choice, signing/readiness, or execution readiness.",
48
+ "PTB graphs are diagnostics only; not transaction input, wallet authorization, signing/readiness, execution readiness, route quality, or safety.",
49
+ "Use response-local fields: userAnswerUse.answerFields/preconditionFields/conclusionRuleFields/cannotAnswer/diagnosticOnlyFields/followUp, pollingHint, and quantitySemantics.",
50
+ "For USD-denominated payment coverage, balance total, or shortfall questions, call read.get_server_status, then read.list_settlement_asset_groups, then read.preview_intent_evidence. Use toolAvailability.requiredToolsAvailable and responseSummary.doNotCallQuoteToolsForThisQuestion; do not call wallet inventory or quote tools unless user asks a separate inventory or conversion question. For parity, use read.summarize_settlement_asset_group_parity. If toolAvailability cannot be used, say the current MCP server build cannot support the answer.",
51
+ "The active account context is read-only, not login, custody or signing permission. Implicit asset reads require session.get_interaction_status.assetReadAccount: available. Otherwise ask for an address only if the tool accepts account; connected-only tools require connection/account selection or wallet recovery.",
52
+ "Unsupported: other chains, autonomous trading, alerts, investment advice, arbitrary Move/package calls, P&L/tax.",
53
+ "One wallet connection at a time; guidance: suimcp://docs/agent-behavior."
54
+ ].join("\n");
55
+ export const IMPLEMENTED_TOOLS = [
56
+ TOOL_NAMES.uiOpenAccount, TOOL_NAMES.uiOpenReceipt, TOOL_NAMES.uiOpenChart,
57
+ TOOL_NAMES.uiReadCard, TOOL_NAMES.uiSubmitCard, TOOL_NAMES.uiActCard,
58
+ TOOL_NAMES.readGetServerStatus,
59
+ TOOL_NAMES.readListSupportedProtocols,
60
+ TOOL_NAMES.readListDeepbookPools,
61
+ TOOL_NAMES.readListDeepbookTokens,
62
+ TOOL_NAMES.readInspectDeepbookOrderbook,
63
+ TOOL_NAMES.readGetDeepbookMidPrice,
64
+ TOOL_NAMES.readGetDeepbookUsdcPriceHistory,
65
+ TOOL_NAMES.readGetDeepbookUsdcPriceAtTime,
66
+ TOOL_NAMES.readQuoteDeepbookAction,
67
+ TOOL_NAMES.readQuoteDeepbookDisplayAmount,
68
+ TOOL_NAMES.readSummarizeDeepbookAccountInventory,
69
+ TOOL_NAMES.readSummarizeWalletAssets,
70
+ TOOL_NAMES.readClassifyWalletAssets,
71
+ TOOL_NAMES.readListSettlementAssetGroups,
72
+ TOOL_NAMES.readSummarizeSettlementAssetGroupParity,
73
+ TOOL_NAMES.readPreviewIntentEvidence,
74
+ TOOL_NAMES.readListReviewActivity,
75
+ TOOL_NAMES.readSummarizeReviewFunnel,
76
+ TOOL_NAMES.readGetReviewSessionDetail,
77
+ TOOL_NAMES.readInspectSuiTransaction,
78
+ TOOL_NAMES.readScanSuiAccountActivity,
79
+ TOOL_NAMES.readSummarizeSuiActivityScan,
80
+ TOOL_NAMES.readScanSuiFunctionActivity,
81
+ TOOL_NAMES.readSummarizeSuiFunctionActivityScan,
82
+ TOOL_NAMES.readSummarizeSuiAccountActivity,
83
+ TOOL_NAMES.readGetAccountAssetTimeline,
84
+ TOOL_NAMES.settingsCreateLocalSettingsSession,
85
+ TOOL_NAMES.settingsGetLocalSettings,
86
+ TOOL_NAMES.actionPrepareSuiActionReview,
87
+ TOOL_NAMES.actionPrepareExternalProposalReview,
88
+ TOOL_NAMES.accountGetActiveAccount,
89
+ TOOL_NAMES.accountClearActiveAccount,
90
+ TOOL_NAMES.sessionCreateWalletConnection,
91
+ TOOL_NAMES.sessionGetWalletConnection,
92
+ TOOL_NAMES.sessionWaitWalletConnection,
93
+ TOOL_NAMES.sessionOpenReviewManagement,
94
+ TOOL_NAMES.sessionGetInteractionStatus,
95
+ TOOL_NAMES.sessionGetReviewStatus,
96
+ TOOL_NAMES.sessionGetExecutionResult,
97
+ TOOL_NAMES.sessionWaitExecutionResult
98
+ ];
99
+ export const FAIL_CLOSED_TOOLS = [];
100
+ export function toolAvailability(requiredTools) {
101
+ const implemented = new Set(IMPLEMENTED_TOOLS);
102
+ const missingRequiredTools = requiredTools.filter((tool) => !implemented.has(tool));
103
+ return {
104
+ statusTool: TOOL_NAMES.readGetServerStatus,
105
+ packageName: PACKAGE_NAME,
106
+ version: SERVER_VERSION,
107
+ evidencePolicyVersion: EVIDENCE_POLICY.version,
108
+ network: SERVER_NETWORK,
109
+ implementedToolsCount: IMPLEMENTED_TOOLS.length,
110
+ requiredTools: requiredTools.map((name) => ({ name, available: implemented.has(name) })),
111
+ missingRequiredTools,
112
+ requiredToolsAvailable: missingRequiredTools.length === 0,
113
+ unavailableReason: missingRequiredTools.length === 0 ? null : "required_tool_missing_from_current_server_build"
114
+ };
115
+ }
116
+ export const SERVER_LIMITATIONS = [
117
+ "Current asset reads without a user-provided address require a selected account with a usable current wallet connection. session.get_interaction_status.assetReadAccount reports whether that default is available. Only tools with an account input accept explicit addresses; DeepBook account inventory requires a connected selected account. Explicit-address coin balance reads are public-address snapshots and do not create active account context. Active account is read context only, not signing authorization, login, custody, or persistent permission.",
118
+ "Review activity tools summarize local Sui MCP review evidence only. Sui activity tools use user-requested bounded GraphQL reads and store normalized transaction facts only for known wallet context; function activity scans are sent-transaction scans only. They are not background indexers, complete history, balance history, complete gas history, affected-object history, or P&L.",
119
+ `read.get_account_asset_timeline reads stored local account activity facts and returns observed raw net-flow bars with scan coverage. It does not start scans, prove complete wallet history, provide held balances without balanceBars, compute USD value, P&L, tax, cost basis, route advice, transaction-building input, signing data, or signing readiness. Optional USDC references are token-denominated ${DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING.officialIndexerCandleReferences} only, ${DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING.usdcNotFiatUsdAndNotPeg}.`,
120
+ "Sui activity transactionContext facts are transaction-level facts without transaction-wide balance-change aggregates, and they are answer fields only when the response returns them. requestedAccountTransactionFacts, requestedAccount, and requestedAccountEffect are the account-specific balance-change surfaces. Activity quantitySemantics marks balance amountRaw fields as raw integers that require verified decimals for display conversion. accountBalanceChangeInferencePolicy marks whether returned account balance rows can be used or transaction-level context must not be used for account amount inference. Gas raw fields use MIST, and returned gasCost display facts use @mysten/sui MIST_PER_SUI.",
121
+ "Wallet asset classification covers only current coin balances returned by Sui gRPC listBalances for an explicit address or the active account. Wallet balance quantitySemantics marks those reads as current snapshots, not transaction history, receipt proof, acquisition source, object provenance, P&L, cost basis, or signing material. DeepBook account inventory is a separate active-account read surface; neither surface creates routes, funding plans, portfolio plans, or signing material.",
122
+ "High-risk read responses include userAnswerUse. Prefer userAnswerUse.preconditionFields before answering, userAnswerUse.answerFields for the answer path, userAnswerUse.conclusionRuleFields for conclusion limits, userAnswerUse.diagnosticOnlyFields for source or troubleshooting context, and userAnswerUse.followUp when a different tool and field are required. USD intent and parity responses also include toolAvailability as a precondition field for current server-build support.",
123
+ "Intent evidence maps natural-language USD-denominated targets to pinned DeepBook SDK settlement asset groups and current wallet balance evidence. responseSummary.answerCompleteness names the answer class and required fields. Settlement-asset-only answers use responseSummary; selected-target evidence requires user selection provenance and also uses selectedTarget, candidateConversions, and requiredUserChoices when userAnswerUse.answerFields lists them. Direct pool quote evidence is returned and supported only when a quoted candidate exists. responseSummary.doNotUseForConclusion names quote results, outside-settlement-group assets, and route-dependent support as excluded from the conclusion. Intent evidence does not silently choose settlement assets, rank venues or routes, evaluate gas reserve, build transactions, or produce signing material.",
124
+ "DeepBook quotes convert explicit raw or display source inputs through pinned token units and return scoped SDK simulation facts plus raw quote evidence. Their quantitySemantics says canUseForPaymentAnswer and canUseForShortfallAnswer are false, doNotCombineWithPaymentAnswer is true, requiredPaymentAnswerTool is read.preview_intent_evidence, and requiredPaymentAnswerField is responseSummary.",
125
+ "Action preparation returns internal Review cards. A current card with valid UI permission automatically prepares and renews verified conditions for one selected wallet/account; only the explicit Request wallet approval action can request a signature. Supported DeepBook account-bound swap review verifies stored transaction material, digest, ownership, quote/policy, human-readable facts, simulation and PTB evidence. Only a scoped app-only user action and wallet approval authorize the backend WalletConnect request; ordinary MCP calls never sign or submit. Transaction bytes and signatures never enter card/model results. The backend verifies returned transaction digest and signer, submits once, and independently reads chain effects. requestStatus is separate from chain execution success/failure: stopped, request_failed and outcome_unknown do not prove a chain failure. Lost replies are resolved by reading the same request/digest, never automatic resubmission. External proposals remain non-signable. Receipts do not establish execution guarantees, route quality, fiat value, P&L, tax, peg proof or best-price advice.",
126
+ "read.list_deepbook_pools and read.list_deepbook_tokens return static SDK registry metadata, not live liquidity, live token discovery, or active pool state.",
127
+ `DeepBook orderbook, mid-price, and quote outputs are ${DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING.pinnedSdkSnapshots} at fetchedAt; treat them as stale if the user delays.`,
128
+ `DeepBook USDC price history and price-at-time reads use ${DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING.officialIndexerCandleData} for the requested official interval. They are external candle evidence only, not live quotes, historical mid prices, global market prices, fiat USD values, USDC/USD peg guarantees, route recommendations, transaction-building inputs, signing readiness, P&L, cost basis, user-account transaction history, or user-account balance history. Sui MCP does not independently recompute those candle values from chain history for the response.`,
129
+ `ui.open_chart displays ${DEEPBOOK_SOURCE_OWNER_RUNTIME_WORDING.officialIndexerUsdcDenominatedCandles} in an internal read-only card. ui.open_account displays a public-address asset snapshot; ui.open_receipt displays the executed transaction graph when bound UI metadata is available, followed by on-chain facts and a Details slide. Card inputs end after backend admission, expiry or invalidation; chat navigation and frame recreation do not end valid unsubmitted input. Read the same DB state after a lost reply rather than resubmitting. Saved results do not authorize a new query or transaction. These cards are not live feeds, trading interfaces, route recommendations, fiat USD value, P&L, tax, cost basis, signing data, or signing readiness.`,
130
+ "Settings mutations happen through local settings pages on the review server. MCP settings tools create settings sessions or read current settings only."
131
+ ];
@@ -0,0 +1,118 @@
1
+ import { WalletUnavailableError } from "../core/session/walletConnection.js";
2
+ import { WorkflowConflict } from "../core/session/sqliteWalletWorkflowStore.js";
3
+ import { CardError } from "../core/session/cardSessionStore.js";
4
+ import { ActivityStoreReadError } from "../core/activity/activityStore.js";
5
+ import { TransactionActivityError } from "../core/activity/transactionActivityTypes.js";
6
+ import { LocalSettingsError, PreferencesStoreError } from "../core/preferences/preferencesStore.js";
7
+ import { SessionStoreError } from "../core/session/sessionStore.js";
8
+ import { WaitRequestAbortedError } from "../core/session/wait.js";
9
+ import { SuiEndpointError } from "../core/suiEndpoint.js";
10
+ import { errorToolResult } from "./result.js";
11
+ export function activityStoreToolError(error, logger) {
12
+ if (error instanceof ActivityStoreReadError) {
13
+ return errorToolResult({
14
+ kind: error.kind,
15
+ details: error.details
16
+ });
17
+ }
18
+ logger.error("activity store call failed", {
19
+ error: error instanceof Error ? error.message : String(error)
20
+ });
21
+ return errorToolResult({
22
+ kind: "internal_error",
23
+ details: { message: "Activity store call failed" }
24
+ });
25
+ }
26
+ export function transactionActivityToolError(error, logger) {
27
+ if (error instanceof TransactionActivityError) {
28
+ return errorToolResult({
29
+ kind: error.kind,
30
+ details: error.details
31
+ });
32
+ }
33
+ if (error instanceof ActivityStoreReadError) {
34
+ return errorToolResult({
35
+ kind: error.kind,
36
+ details: error.details
37
+ });
38
+ }
39
+ logger.error("transaction activity call failed", {
40
+ error: error instanceof Error ? error.message : String(error)
41
+ });
42
+ return errorToolResult({
43
+ kind: "internal_error",
44
+ details: { message: "Transaction activity call failed" }
45
+ });
46
+ }
47
+ export function sessionDomainToolError(error) {
48
+ if (error instanceof WalletUnavailableError)
49
+ return errorToolResult({ kind: "wallet_unavailable",
50
+ details: { reason: error.reason, message: error.message } });
51
+ if (error instanceof WorkflowConflict || error instanceof CardError) {
52
+ return errorToolResult({ kind: "input_invalid", details: { reason: error.message } });
53
+ }
54
+ if (error instanceof WaitRequestAbortedError) {
55
+ return errorToolResult({
56
+ kind: "request_aborted",
57
+ details: { reason: error.reason }
58
+ });
59
+ }
60
+ if (error instanceof SessionStoreError) {
61
+ return errorToolResult({
62
+ kind: error.code,
63
+ details: { code: error.code, ...error.details }
64
+ });
65
+ }
66
+ return undefined;
67
+ }
68
+ export function sessionStoreToolError(error, logger) {
69
+ const known = sessionDomainToolError(error);
70
+ if (known)
71
+ return known;
72
+ logger.error("session store call failed");
73
+ return errorToolResult({
74
+ kind: "internal_error",
75
+ details: { message: "Session store call failed" }
76
+ });
77
+ }
78
+ export function localSettingsToolError(error, logger) {
79
+ if (error instanceof LocalSettingsError) {
80
+ return errorToolResult({
81
+ kind: error.kind,
82
+ details: error.details
83
+ });
84
+ }
85
+ if (error instanceof PreferencesStoreError) {
86
+ logger.error("local settings store error", {
87
+ error: error.message,
88
+ details: error.details
89
+ });
90
+ return errorToolResult({
91
+ kind: "internal_error",
92
+ details: {
93
+ reason: error.kind,
94
+ message: error.message
95
+ }
96
+ });
97
+ }
98
+ if (error instanceof SuiEndpointError) {
99
+ logger.error("local settings endpoint value error", {
100
+ error: error.message,
101
+ kind: error.kind
102
+ });
103
+ return errorToolResult({
104
+ kind: "internal_error",
105
+ details: {
106
+ reason: error.kind,
107
+ message: error.message
108
+ }
109
+ });
110
+ }
111
+ logger.error("local settings call failed", {
112
+ error: error instanceof Error ? error.message : String(error)
113
+ });
114
+ return errorToolResult({
115
+ kind: "internal_error",
116
+ details: { message: "Local settings call failed" }
117
+ });
118
+ }