@stelis/say-ur-intent 0.0.0 → 0.0.2

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 (234) hide show
  1. package/README.md +4 -39
  2. package/dist/adapters/adapterLifecycleValidators.js +7 -0
  3. package/dist/adapters/adapterPromptSurfaces.js +71 -0
  4. package/dist/adapters/deepbook/deepbookHumanReviewProducer.js +175 -0
  5. package/dist/adapters/deepbook/deepbookQuotePolicy.js +112 -0
  6. package/dist/adapters/deepbook/deepbookReviewEvidence.js +507 -0
  7. package/dist/adapters/deepbook/deepbookReviewLifecycle.js +85 -0
  8. package/dist/adapters/deepbook/deepbookSwapIntent.js +79 -0
  9. package/dist/adapters/deepbook/deepbookTransactionMaterialProducer.js +269 -0
  10. package/dist/adapters/flowx/flowxSwapHumanReviewProducer.js +176 -0
  11. package/dist/adapters/flowx/flowxSwapIntent.js +79 -0
  12. package/dist/adapters/flowx/flowxSwapQuotePolicy.js +104 -0
  13. package/dist/adapters/flowx/flowxSwapReviewEvidence.js +468 -0
  14. package/dist/adapters/flowx/flowxSwapReviewLifecycle.js +85 -0
  15. package/dist/adapters/flowx/flowxSwapTransactionMaterialProducer.js +362 -0
  16. package/dist/adapters/intentPlanFactories.js +59 -0
  17. package/dist/adapters/reviewAdapters.js +81 -0
  18. package/dist/core/action/adapterLifecycleValidation.js +12 -0
  19. package/dist/core/action/forbiddenFields.js +43 -0
  20. package/dist/core/action/humanReadableReviewEvidence.js +203 -0
  21. package/dist/core/action/humanReadableReviewProjectionVerifier.js +29 -0
  22. package/dist/core/action/ptbVisualizationProducer.js +66 -0
  23. package/dist/core/action/reviewCheckResults.js +6 -0
  24. package/dist/core/action/reviewStateValidation.js +11 -0
  25. package/dist/core/action/reviewTimeSimulationEvidence.js +471 -0
  26. package/dist/core/action/schemas.js +529 -0
  27. package/dist/core/action/signableAdapterContract.js +993 -0
  28. package/dist/core/action/swapHumanReadableReviewProjection.js +124 -0
  29. package/dist/core/action/swapQuotePolicyEvidence.js +278 -0
  30. package/dist/core/action/transactionObjectOwnershipEvidence.js +247 -0
  31. package/dist/core/action/transactionObjectOwnershipProducer.js +329 -0
  32. package/dist/core/action/types.js +35 -0
  33. package/dist/core/action/walletReviewContractAssembler.js +282 -0
  34. package/dist/core/activity/activityStore.js +15 -0
  35. package/dist/core/activity/localDataService.js +258 -0
  36. package/dist/core/activity/localDataTypes.js +11 -0
  37. package/dist/core/activity/localDataValidation.js +396 -0
  38. package/dist/core/activity/schemaVersion.js +1 -0
  39. package/dist/core/activity/sqliteActivityStore.js +820 -0
  40. package/dist/core/activity/sqliteActivityStoreRows.js +430 -0
  41. package/dist/core/activity/sqliteActivityStoreSchema.js +258 -0
  42. package/dist/core/activity/sqliteActivityStoreTypes.js +5 -0
  43. package/dist/core/activity/suiFunctionTarget.js +43 -0
  44. package/dist/core/activity/transactionActivityAccountEffects.js +189 -0
  45. package/dist/core/activity/transactionActivityAnalysis.js +295 -0
  46. package/dist/core/activity/transactionActivityClassifier.js +306 -0
  47. package/dist/core/activity/transactionActivityDetails.js +229 -0
  48. package/dist/core/activity/transactionActivityProtocolRules.js +218 -0
  49. package/dist/core/activity/transactionActivityScanPolicy.js +170 -0
  50. package/dist/core/activity/transactionActivityService.js +379 -0
  51. package/dist/core/activity/transactionActivityTypes.js +18 -0
  52. package/dist/core/eventlog/sink.js +35 -0
  53. package/dist/core/evidence/settlementFamilies.js +87 -0
  54. package/dist/core/evidence/userAnswerUse.js +1 -0
  55. package/dist/core/numeric/rawU64.js +63 -0
  56. package/dist/core/preferences/preferencesStore.js +26 -0
  57. package/dist/core/preferences/sqlitePreferencesRepository.js +136 -0
  58. package/dist/core/proposal/externalProposalReview.js +347 -0
  59. package/dist/core/proposal/schemas.js +208 -0
  60. package/dist/core/proposal/types.js +35 -0
  61. package/dist/core/read/amounts.js +14 -0
  62. package/dist/core/read/coinMetadata.js +60 -0
  63. package/dist/core/read/deepbookRawQuoteClient.js +86 -0
  64. package/dist/core/read/deepbookReadHelpers.js +265 -0
  65. package/dist/core/read/deepbookRegistry.js +133 -0
  66. package/dist/core/read/flowxQuoteClient.js +117 -0
  67. package/dist/core/read/flowxReadHelpers.js +145 -0
  68. package/dist/core/read/flowxRegistry.js +174 -0
  69. package/dist/core/read/intentEvidenceResponseFormatting.js +228 -0
  70. package/dist/core/read/readResponseGuidance.js +451 -0
  71. package/dist/core/read/readService.js +1164 -0
  72. package/dist/core/read/readServiceTypes.js +59 -0
  73. package/dist/core/read/settlementParityFormatting.js +82 -0
  74. package/dist/core/read/walletReadHelpers.js +99 -0
  75. package/dist/core/review/reviewChecks.js +54 -0
  76. package/dist/core/review/reviewComputation.js +38 -0
  77. package/dist/core/review/reviewComputationResult.js +87 -0
  78. package/dist/core/session/localSession.js +31 -0
  79. package/dist/core/session/privateReviewArtifacts.js +73 -0
  80. package/dist/core/session/sessionErrors.js +9 -0
  81. package/dist/core/session/sessionStore.js +821 -0
  82. package/dist/core/session/settingsSession.js +1 -0
  83. package/dist/core/session/settingsSessions.js +43 -0
  84. package/dist/core/session/status.js +86 -0
  85. package/dist/core/session/transactionMaterialStore.js +205 -0
  86. package/dist/core/session/wait.js +102 -0
  87. package/dist/core/session/walletIdentity.js +103 -0
  88. package/dist/core/session/walletIdentitySessions.js +189 -0
  89. package/dist/core/suiAddress.js +18 -0
  90. package/dist/core/suiEndpoint.js +72 -0
  91. package/dist/mcp/activeAccountResponse.js +24 -0
  92. package/dist/mcp/prompts.js +146 -0
  93. package/dist/mcp/registerTool.js +19 -0
  94. package/dist/mcp/resources.js +72 -0
  95. package/dist/mcp/responseGuidance.js +381 -0
  96. package/dist/mcp/result.js +17 -0
  97. package/dist/mcp/schemas.js +8 -0
  98. package/dist/mcp/server.js +30 -0
  99. package/dist/mcp/serverInfo.js +123 -0
  100. package/dist/mcp/toolErrors.js +105 -0
  101. package/dist/mcp/toolNames.js +50 -0
  102. package/dist/mcp/tools/account/index.js +44 -0
  103. package/dist/mcp/tools/action/prepareSuiActionReview.js +120 -0
  104. package/dist/mcp/tools/read/commonSchemas.js +43 -0
  105. package/dist/mcp/tools/read/deepbookReadTools.js +453 -0
  106. package/dist/mcp/tools/read/flowxReadTools.js +135 -0
  107. package/dist/mcp/tools/read/index.js +16 -0
  108. package/dist/mcp/tools/read/readToolHelpers.js +68 -0
  109. package/dist/mcp/tools/read/reviewActivityTools.js +176 -0
  110. package/dist/mcp/tools/read/serverStatusTools.js +103 -0
  111. package/dist/mcp/tools/read/transactionActivityOutput.js +300 -0
  112. package/dist/mcp/tools/read/transactionActivityTools.js +544 -0
  113. package/dist/mcp/tools/read/walletReadTools.js +733 -0
  114. package/dist/mcp/tools/session/executionResultTools.js +92 -0
  115. package/dist/mcp/tools/session/index.js +8 -0
  116. package/dist/mcp/tools/session/shared.js +79 -0
  117. package/dist/mcp/tools/session/statusTools.js +134 -0
  118. package/dist/mcp/tools/session/walletIdentityTools.js +119 -0
  119. package/dist/mcp/tools/settings/index.js +64 -0
  120. package/dist/review-app/analysis.css +1 -0
  121. package/dist/review-app/analysis.js +1 -0
  122. package/dist/review-app/arc-BjIacwQm.js +1 -0
  123. package/dist/review-app/architecture-U656AL7Q-aSB9x1OK.js +1 -0
  124. package/dist/review-app/architectureDiagram-VXUJARFQ-C5W6re2I.js +36 -0
  125. package/dist/review-app/array-BmXUUrU6.js +1 -0
  126. package/dist/review-app/blockDiagram-VD42YOAC-20MLNcUm.js +122 -0
  127. package/dist/review-app/c4Diagram-YG6GDRKO-BZXRrcck.js +10 -0
  128. package/dist/review-app/channel-lk2p_CUu.js +1 -0
  129. package/dist/review-app/chunk-4BX2VUAB-BPITOdjX.js +1 -0
  130. package/dist/review-app/chunk-55IACEB6-Dz-pyw5k.js +1 -0
  131. package/dist/review-app/chunk-76Q3JFCE-cK_X1P_l.js +1 -0
  132. package/dist/review-app/chunk-ABZYJK2D-Dt4W53JI.js +81 -0
  133. package/dist/review-app/chunk-ATLVNIR6-fZHLXURb.js +1 -0
  134. package/dist/review-app/chunk-B4BG7PRW-BbgcjusC.js +165 -0
  135. package/dist/review-app/chunk-BJD4TVEz.js +1 -0
  136. package/dist/review-app/chunk-CVBHYZKI-CViawAKX.js +1 -0
  137. package/dist/review-app/chunk-DI55MBZ5-C5aoul-d.js +220 -0
  138. package/dist/review-app/chunk-FMBD7UC4-Chxmw62A.js +15 -0
  139. package/dist/review-app/chunk-FPAJGGOC-DDHjQ09H.js +80 -0
  140. package/dist/review-app/chunk-FWNWRKHM-CVVQUptk.js +1 -0
  141. package/dist/review-app/chunk-HN2XXSSU-yzNpjaSZ.js +1 -0
  142. package/dist/review-app/chunk-JA3XYJ7Z-C5ZJdU01.js +70 -0
  143. package/dist/review-app/chunk-JZLCHNYA-BBST4Cnk.js +54 -0
  144. package/dist/review-app/chunk-LBM3YZW2-CdwAPuHr.js +1 -0
  145. package/dist/review-app/chunk-LHMN2FUI-BtB5uDcp.js +1 -0
  146. package/dist/review-app/chunk-O7ZBX7Z2-pxdK4Sa3.js +1 -0
  147. package/dist/review-app/chunk-QN33PNHL-CbVv3uGK.js +1 -0
  148. package/dist/review-app/chunk-QXUST7PY-DKM2-t2c.js +7 -0
  149. package/dist/review-app/chunk-QZHKN3VN-C5ni2pN_.js +1 -0
  150. package/dist/review-app/chunk-S3R3BYOJ-BWvOhDs0.js +2 -0
  151. package/dist/review-app/chunk-S6J4BHB3-D9Fk0YeD.js +1 -0
  152. package/dist/review-app/chunk-T53DSG4Q-C1qEyzyV.js +1 -0
  153. package/dist/review-app/chunk-TZMSLE5B-B--7eU69.js +1 -0
  154. package/dist/review-app/classDiagram-2ON5EDUG-DlL1m2bp.js +1 -0
  155. package/dist/review-app/classDiagram-v2-WZHVMYZB-FXRskT1j.js +1 -0
  156. package/dist/review-app/clone-BZZb7gpZ.js +1 -0
  157. package/dist/review-app/cose-bilkent-S5V4N54A-CRIb8XEO.js +1 -0
  158. package/dist/review-app/cytoscape.esm-C7jYqDP5.js +321 -0
  159. package/dist/review-app/dagre-6UL2VRFP-FNCAXbdE.js +4 -0
  160. package/dist/review-app/dagre-Be46QtUd.js +1 -0
  161. package/dist/review-app/defaultLocale-BaWNtAUL.js +1 -0
  162. package/dist/review-app/diagram-PSM6KHXK-ylLWjiNM.js +24 -0
  163. package/dist/review-app/diagram-QEK2KX5R-BCDcESxs.js +43 -0
  164. package/dist/review-app/diagram-S2PKOQOG-Vdrc-vrO.js +24 -0
  165. package/dist/review-app/dist-WPc74x_f.js +1 -0
  166. package/dist/review-app/erDiagram-Q2GNP2WA-E5ZsUbDF.js +60 -0
  167. package/dist/review-app/flatten-DHf9IeNI.js +1 -0
  168. package/dist/review-app/flowDiagram-NV44I4VS-DBSQuj6x.js +162 -0
  169. package/dist/review-app/ganttDiagram-LVOFAZNH-CKUOsqwl.js +267 -0
  170. package/dist/review-app/gitGraph-F6HP7TQM-DsAD6qK1.js +1 -0
  171. package/dist/review-app/gitGraphDiagram-NY62KEGX-BCeIMWdl.js +65 -0
  172. package/dist/review-app/graphlib-CiX5CXxR.js +1 -0
  173. package/dist/review-app/http-DMvwuuFk.js +1 -0
  174. package/dist/review-app/identity-DY8PXc6t.js +1 -0
  175. package/dist/review-app/info-NVLQJR56-Dlx1nZic.js +1 -0
  176. package/dist/review-app/infoDiagram-F6ZHWCRC-CAuANIrz.js +2 -0
  177. package/dist/review-app/init-BvqephKz.js +1 -0
  178. package/dist/review-app/journeyDiagram-XKPGCS4Q-C-Z9phnx.js +139 -0
  179. package/dist/review-app/kanban-definition-3W4ZIXB7-DufgZABq.js +89 -0
  180. package/dist/review-app/katex-B-Z-NXXN.js +257 -0
  181. package/dist/review-app/line-DiIv3Jgw.js +1 -0
  182. package/dist/review-app/linear-Cv-UPvo1.js +1 -0
  183. package/dist/review-app/math-kmyYrkHL.js +1 -0
  184. package/dist/review-app/mermaid-parser.core-DkwUYTPl.js +4 -0
  185. package/dist/review-app/mindmap-definition-VGOIOE7T-TM_CqdmV.js +68 -0
  186. package/dist/review-app/ordinal-BliTlkoG.js +1 -0
  187. package/dist/review-app/packet-BFZMPI3H-DqbnU92v.js +1 -0
  188. package/dist/review-app/path-AEo9W6mQ.js +1 -0
  189. package/dist/review-app/pie-7BOR55EZ-LJzaLkgr.js +1 -0
  190. package/dist/review-app/pieDiagram-ADFJNKIX-BAs8OfRS.js +30 -0
  191. package/dist/review-app/quadrantDiagram-AYHSOK5B-CyUDZP5S.js +7 -0
  192. package/dist/review-app/radar-NHE76QYJ-DBpHc8_Y.js +1 -0
  193. package/dist/review-app/reduce-B-HuPpdd.js +1 -0
  194. package/dist/review-app/requirementDiagram-UZGBJVZJ-BEHix78P.js +64 -0
  195. package/dist/review-app/review.css +1 -0
  196. package/dist/review-app/review.js +43 -0
  197. package/dist/review-app/sankeyDiagram-TZEHDZUN-B2bKbmsm.js +10 -0
  198. package/dist/review-app/sequenceDiagram-WL72ISMW-DVLOORFJ.js +145 -0
  199. package/dist/review-app/settings.css +1 -0
  200. package/dist/review-app/settings.js +1 -0
  201. package/dist/review-app/src-Buml7cM5.js +1 -0
  202. package/dist/review-app/stateDiagram-FKZM4ZOC-sFGGp2kV.js +1 -0
  203. package/dist/review-app/stateDiagram-v2-4FDKWEC3-BHfCF4dX.js +1 -0
  204. package/dist/review-app/timeline-definition-IT6M3QCI-BESnBijC.js +61 -0
  205. package/dist/review-app/treemap-KMMF4GRG-wnVLBDeQ.js +1 -0
  206. package/dist/review-app/walletStatus-CcojOdGy.js +7 -0
  207. package/dist/review-app/xychartDiagram-PRI3JC2R-BGWVfCx4.js +7 -0
  208. package/dist/review-server/assets.js +48 -0
  209. package/dist/review-server/html.js +66 -0
  210. package/dist/review-server/http.js +47 -0
  211. package/dist/review-server/middleware/hostOrigin.js +48 -0
  212. package/dist/review-server/middleware/reviewToken.js +7 -0
  213. package/dist/review-server/reviewServerPolicy.js +10 -0
  214. package/dist/review-server/server.js +568 -0
  215. package/dist/review-server/settingsApi.js +182 -0
  216. package/dist/review-server/walletIdentityResponse.js +13 -0
  217. package/dist/runtime/config.js +103 -0
  218. package/dist/runtime/localSettingsService.js +198 -0
  219. package/dist/runtime/logger.js +50 -0
  220. package/dist/runtime/reviewServerAcquire.js +128 -0
  221. package/dist/runtime/smokeMainnetRead.js +529 -0
  222. package/dist/runtime/smokeMainnetReadAssertions.js +308 -0
  223. package/dist/runtime/start.js +295 -0
  224. package/dist/runtime/suiEndpoint.js +97 -0
  225. package/dist/runtime/suiTransactionGraphqlMapping.js +200 -0
  226. package/dist/runtime/suiTransactionGraphqlQueries.js +231 -0
  227. package/dist/runtime/suiTransactionGraphqlSource.js +148 -0
  228. package/docs/AGENT_BEHAVIOR.md +1 -1
  229. package/docs/AGENT_DEVELOPMENT_POLICY.md +20 -0
  230. package/docs/FRONTEND_POLICY.md +4 -3
  231. package/docs/MCP_SETUP.md +59 -7
  232. package/docs/MCP_TOOLS.md +1 -1
  233. package/docs/SDK_API.md +5 -1
  234. package/package.json +3 -2
@@ -0,0 +1,544 @@
1
+ import { z } from "zod";
2
+ import { EXTERNAL_ACTIVITY_SCAN_MAX_LIMIT, REVIEW_ACTIVITY_LIST_MAX_LIMIT, REVIEW_ACTIVITY_LOW_SAMPLE_THRESHOLD } from "../../../core/activity/activityStore.js";
3
+ import { externalActivityGasCostFactSchema, externalActivityTransactionCompactFactsSchema, externalActivityTransactionDetailSchema } from "../../../core/activity/transactionActivityDetails.js";
4
+ import { suiActivityAnalysisLimitations } from "../../../core/activity/transactionActivityAnalysis.js";
5
+ import { suiTransactionDigestSchema } from "../../../core/suiAddress.js";
6
+ import { okToolResult } from "../../result.js";
7
+ import { successOutputSchema } from "../../schemas.js";
8
+ import { transactionActivityToolError } from "../../toolErrors.js";
9
+ import { TOOL_NAMES } from "../../toolNames.js";
10
+ import { fetchedAtSchema, reviewActivityAccountSourceSchema, reviewActivityDataScopeSchema, reviewActivityInputSchema, userAnswerUseSchema } from "./commonSchemas.js";
11
+ import { externalActivityTransactionRecordOutput, inspectSuiTransactionUserAnswerUse, liveSuiActivityUserAnswerUse, requestedAccountTransactionFactOutput, storedSuiActivityUserAnswerUse, suiActivityQuantitySemantics, transactionDetailAvailability, transactionFactAuditOutput, transactionFactOutput } from "./transactionActivityOutput.js";
12
+ const transactionDigestSchema = suiTransactionDigestSchema;
13
+ const externalActivityRelationshipSchema = z.enum(["affected", "sent"]);
14
+ const externalActivityStatusSchema = z.enum(["success", "failure", "unknown"]);
15
+ const externalActivityScanIncompleteReasonSchema = z.enum([
16
+ "limit_reached",
17
+ "ordering_unverified",
18
+ "cursor_invalid",
19
+ "provider_error"
20
+ ]);
21
+ const suiActivityScanInputSchema = {
22
+ account: z.string().min(1).optional(),
23
+ relationship: externalActivityRelationshipSchema.optional(),
24
+ limit: z.number().int().min(1).max(EXTERNAL_ACTIVITY_SCAN_MAX_LIMIT).optional(),
25
+ cursor: z.string().min(1).optional(),
26
+ fromCheckpoint: z.string().regex(/^\d+$/).optional(),
27
+ toCheckpoint: z.string().regex(/^\d+$/).optional(),
28
+ fromTimestamp: fetchedAtSchema.optional(),
29
+ toTimestamp: fetchedAtSchema.optional()
30
+ };
31
+ const suiFunctionActivityScanInputSchema = {
32
+ function: z.string().min(1),
33
+ account: z.string().min(1).optional(),
34
+ limit: z.number().int().min(1).max(EXTERNAL_ACTIVITY_SCAN_MAX_LIMIT).optional(),
35
+ cursor: z.string().min(1).optional(),
36
+ fromCheckpoint: z.string().regex(/^\d+$/).optional(),
37
+ toCheckpoint: z.string().regex(/^\d+$/).optional(),
38
+ fromTimestamp: fetchedAtSchema.optional(),
39
+ toTimestamp: fetchedAtSchema.optional()
40
+ };
41
+ const suiTransactionActivitySourceSchema = z.discriminatedUnion("transport", [
42
+ z.object({
43
+ transport: z.literal("graphql"),
44
+ endpointHost: z.string(),
45
+ chainIdentifier: z.string(),
46
+ method: z.enum(["Query.transaction", "Query.transactions"])
47
+ }),
48
+ z.object({
49
+ transport: z.literal("local_db"),
50
+ method: z.literal("stored_normalized_facts")
51
+ })
52
+ ]);
53
+ const accountBalanceChangeCompletenessSchema = z.enum(["complete", "truncated", "unavailable"]);
54
+ const accountBalanceChangeEvidenceSchema = z.enum([
55
+ "account_balance_changes_returned",
56
+ "no_account_balance_changes_returned",
57
+ "incomplete_account_balance_changes",
58
+ "account_balance_changes_unavailable"
59
+ ]);
60
+ const accountBalanceChangeInferencePolicySchema = z.enum([
61
+ "use_returned_account_balance_changes",
62
+ "account_absence_proven_by_complete_details",
63
+ "do_not_infer_from_transaction_context"
64
+ ]);
65
+ const transactionAccountRoleSchema = z.enum(["sender", "affected_only"]);
66
+ const transactionAccountEffectLimitationSchema = z.enum([
67
+ "provider_balance_changes_truncated",
68
+ "transaction_details_unavailable"
69
+ ]);
70
+ const requestedAccountCoinFlowSchema = z.object({
71
+ coinType: z.string(),
72
+ increaseRaw: z.string().regex(/^\d+$/),
73
+ decreaseRaw: z.string().regex(/^\d+$/),
74
+ netRaw: z.string().regex(/^-?\d+$/),
75
+ transactionCount: z.number().int().positive()
76
+ }).strict();
77
+ const transactionAccountEffectsSchema = z.object({
78
+ account: z.string(),
79
+ scope: z.literal("requested_account"),
80
+ role: transactionAccountRoleSchema,
81
+ sentByAccount: z.boolean(),
82
+ balanceChangeEvidence: accountBalanceChangeEvidenceSchema,
83
+ accountBalanceChangeAbsenceProven: z.boolean(),
84
+ accountBalanceChangeInferencePolicy: accountBalanceChangeInferencePolicySchema,
85
+ balanceChangeCompleteness: accountBalanceChangeCompletenessSchema,
86
+ balanceChanges: z.array(z.object({
87
+ index: z.number().int().nonnegative(),
88
+ coinType: z.string(),
89
+ amountRaw: z.string().regex(/^-?\d+$/),
90
+ direction: z.enum(["increase", "decrease", "zero"])
91
+ }).strict()),
92
+ coinFlows: z.array(z.object({
93
+ coinType: z.string(),
94
+ increaseRaw: z.string().regex(/^\d+$/),
95
+ decreaseRaw: z.string().regex(/^\d+$/),
96
+ netRaw: z.string().regex(/^-?\d+$/)
97
+ }).strict()),
98
+ limitations: z.array(transactionAccountEffectLimitationSchema)
99
+ }).strict();
100
+ const requestedAccountActivitySchema = z.object({
101
+ account: z.string(),
102
+ relationship: externalActivityRelationshipSchema,
103
+ sentCount: z.number().int().nonnegative(),
104
+ affectedOnlyCount: z.number().int().nonnegative(),
105
+ balanceChangeCompleteness: accountBalanceChangeCompletenessSchema,
106
+ coinFlows: z.array(requestedAccountCoinFlowSchema)
107
+ }).strict();
108
+ const suiActivityQuantitySemanticsSchema = z.object({
109
+ kind: z.literal("sui_activity_raw_amounts"),
110
+ rawAmountsOnly: z.literal(true),
111
+ displayConversionRequires: z.literal("verified_coin_metadata_decimals"),
112
+ gasRawUnit: z.literal("MIST"),
113
+ gasUnitSource: z.literal("@mysten/sui MIST_PER_SUI"),
114
+ gasDisplayFields: z.tuple([
115
+ z.literal("transaction.compact.gasCost.display"),
116
+ z.literal("requestedAccountTransactionFacts[].transactionContext.gasCost.display"),
117
+ z.literal("transactions[].transactionContext.gasCost.display"),
118
+ z.literal("analysis.gas.netGasCost.display")
119
+ ]),
120
+ rawAmountFields: z.tuple([
121
+ z.literal("transaction.details.balanceChanges[].amountRaw"),
122
+ z.literal("transaction.requestedAccountEffect.balanceChanges[].amountRaw"),
123
+ z.literal("transaction.requestedAccountEffect.coinFlows[].*Raw"),
124
+ z.literal("requestedAccount.coinFlows[].*Raw"),
125
+ z.literal("requestedAccountTransactionFacts[].accountBalanceChanges[].amountRaw"),
126
+ z.literal("requestedAccountTransactionFacts[].accountCoinFlows[].*Raw"),
127
+ z.literal("requestedAccountTransactionFacts[].requestedAccountEffect.balanceChanges[].amountRaw"),
128
+ z.literal("requestedAccountTransactionFacts[].requestedAccountEffect.coinFlows[].*Raw"),
129
+ z.literal("transactions[].requestedAccountEffect.balanceChanges[].amountRaw"),
130
+ z.literal("transactions[].requestedAccountEffect.coinFlows[].*Raw"),
131
+ z.literal("transactions[].details.balanceChanges[].amountRaw"),
132
+ z.literal("transactions[].compact.balanceChanges[].amountRaw"),
133
+ z.literal("analysis.coinFlows[].*Raw")
134
+ ]),
135
+ notFor: z.tuple([
136
+ z.literal("display_conversion_without_verified_decimals"),
137
+ z.literal("fiat_usd_cash_out"),
138
+ z.literal("profit_or_pnl"),
139
+ z.literal("position_valuation")
140
+ ])
141
+ }).strict();
142
+ const suiTransactionFactSchema = z.object({
143
+ digest: z.string(),
144
+ checkpoint: z.string().optional(),
145
+ timestamp: fetchedAtSchema.optional(),
146
+ status: externalActivityStatusSchema,
147
+ sender: z.string().optional(),
148
+ requestedAccountEffect: transactionAccountEffectsSchema.optional(),
149
+ compact: externalActivityTransactionCompactFactsSchema.optional(),
150
+ details: externalActivityTransactionDetailSchema.optional()
151
+ });
152
+ const requestedAccountTransactionContextSchema = externalActivityTransactionCompactFactsSchema.omit({
153
+ balanceChanges: true
154
+ });
155
+ const suiTransactionAuditFactSchema = z.object({
156
+ digest: z.string(),
157
+ checkpoint: z.string().optional(),
158
+ timestamp: fetchedAtSchema.optional(),
159
+ status: externalActivityStatusSchema,
160
+ sender: z.string().optional(),
161
+ requestedAccountEffect: transactionAccountEffectsSchema.optional(),
162
+ transactionContext: requestedAccountTransactionContextSchema.optional(),
163
+ detailLookup: z.object({
164
+ tool: z.literal("read.inspect_sui_transaction"),
165
+ digest: z.string()
166
+ })
167
+ });
168
+ const requestedAccountTransactionFactSchema = z.object({
169
+ digest: z.string(),
170
+ checkpoint: z.string().optional(),
171
+ timestamp: fetchedAtSchema.optional(),
172
+ status: externalActivityStatusSchema,
173
+ sender: z.string().optional(),
174
+ requestedAccount: z.string(),
175
+ accountScope: z.literal("requested_account"),
176
+ accountRole: transactionAccountRoleSchema,
177
+ sentByAccount: z.boolean(),
178
+ accountBalanceChangeEvidence: accountBalanceChangeEvidenceSchema,
179
+ accountBalanceChangeAbsenceProven: z.boolean(),
180
+ accountBalanceChangeInferencePolicy: accountBalanceChangeInferencePolicySchema,
181
+ accountBalanceChangeCompleteness: accountBalanceChangeCompletenessSchema,
182
+ accountBalanceChanges: transactionAccountEffectsSchema.shape.balanceChanges,
183
+ accountCoinFlows: transactionAccountEffectsSchema.shape.coinFlows,
184
+ accountEffectLimitations: z.array(transactionAccountEffectLimitationSchema),
185
+ requestedAccountEffect: transactionAccountEffectsSchema,
186
+ transactionContext: requestedAccountTransactionContextSchema.optional(),
187
+ detailLookup: z.object({
188
+ tool: z.literal("read.inspect_sui_transaction"),
189
+ digest: z.string()
190
+ })
191
+ });
192
+ const suiActivityAnalysisSchema = z.object({
193
+ overview: z.object({
194
+ transactionCount: z.number().int().nonnegative(),
195
+ analyzedTransactionCount: z.number().int().nonnegative(),
196
+ statusCounts: z.object({
197
+ success: z.number().int().nonnegative(),
198
+ failure: z.number().int().nonnegative(),
199
+ unknown: z.number().int().nonnegative()
200
+ }).strict(),
201
+ relationshipCounts: z.object({
202
+ affected: z.number().int().nonnegative(),
203
+ sent: z.number().int().nonnegative()
204
+ }).strict(),
205
+ earliestTimestamp: fetchedAtSchema.optional(),
206
+ latestTimestamp: fetchedAtSchema.optional(),
207
+ earliestCheckpoint: z.string().optional(),
208
+ latestCheckpoint: z.string().optional()
209
+ }).strict(),
210
+ moveCallTargets: z.array(z.object({
211
+ target: z.string(),
212
+ count: z.number().int().positive()
213
+ }).strict()),
214
+ protocols: z.array(z.object({
215
+ protocolId: z.string(),
216
+ displayName: z.string().optional(),
217
+ count: z.number().int().positive()
218
+ }).strict()),
219
+ coinFlows: z.array(z.object({
220
+ coinType: z.string(),
221
+ increaseRaw: z.string().regex(/^\d+$/),
222
+ decreaseRaw: z.string().regex(/^\d+$/),
223
+ netRaw: z.string().regex(/^-?\d+$/),
224
+ transactionCount: z.number().int().positive()
225
+ }).strict()),
226
+ objectChanges: z.object({
227
+ created: z.number().int().nonnegative(),
228
+ mutated: z.number().int().nonnegative(),
229
+ deleted: z.number().int().nonnegative()
230
+ }).strict(),
231
+ eventTypes: z.array(z.object({
232
+ eventType: z.string(),
233
+ count: z.number().int().positive()
234
+ }).strict()),
235
+ gas: z.object({
236
+ transactionCount: z.number().int().positive(),
237
+ netGasCostRaw: z.string().regex(/^-?\d+$/),
238
+ netGasCost: externalActivityGasCostFactSchema
239
+ }).strict().optional(),
240
+ failures: z.array(z.object({
241
+ message: z.string(),
242
+ count: z.number().int().positive(),
243
+ abortCodeRaw: z.string().regex(/^\d+$/).optional(),
244
+ package: z.string().optional(),
245
+ module: z.string().optional(),
246
+ function: z.string().optional()
247
+ }).strict()),
248
+ limitations: z.array(z.enum(suiActivityAnalysisLimitations))
249
+ }).strict();
250
+ const externalActivityScanRecordSchema = z.object({
251
+ scanId: z.string(),
252
+ kind: z.enum(["digest_lookup", "account_scan", "function_scan"]),
253
+ accountId: z.number().int().positive(),
254
+ account: z.string(),
255
+ relationship: externalActivityRelationshipSchema,
256
+ inputDigest: z.string().optional(),
257
+ fromCheckpoint: z.string().optional(),
258
+ toCheckpoint: z.string().optional(),
259
+ fromTimestamp: fetchedAtSchema.optional(),
260
+ toTimestamp: fetchedAtSchema.optional(),
261
+ limit: z.number().int().min(1).max(EXTERNAL_ACTIVITY_SCAN_MAX_LIMIT),
262
+ requestCursor: z.string().optional(),
263
+ responseCursor: z.string().optional(),
264
+ endpointHost: z.string(),
265
+ chainIdentifier: z.string(),
266
+ fetchedAt: fetchedAtSchema,
267
+ storedCount: z.number().int().nonnegative(),
268
+ skippedCount: z.number().int().nonnegative(),
269
+ hasMore: z.boolean(),
270
+ windowComplete: z.boolean().nullable(),
271
+ incompleteReason: externalActivityScanIncompleteReasonSchema.optional()
272
+ });
273
+ const externalActivityTransactionRecordSchema = z.object({
274
+ accountId: z.number().int().positive(),
275
+ account: z.string(),
276
+ digest: z.string(),
277
+ relationship: externalActivityRelationshipSchema,
278
+ checkpoint: z.string().optional(),
279
+ timestamp: fetchedAtSchema.optional(),
280
+ status: externalActivityStatusSchema,
281
+ knownSenderAccountId: z.number().int().positive().optional(),
282
+ firstScanId: z.string(),
283
+ lastScanId: z.string(),
284
+ firstFetchedAt: fetchedAtSchema,
285
+ lastFetchedAt: fetchedAtSchema,
286
+ lastScanIncompleteReason: externalActivityScanIncompleteReasonSchema.optional(),
287
+ compact: externalActivityTransactionCompactFactsSchema.optional(),
288
+ details: externalActivityTransactionDetailSchema.optional(),
289
+ detailLookup: z.object({
290
+ tool: z.literal("read.inspect_sui_transaction"),
291
+ digest: z.string()
292
+ }).optional()
293
+ });
294
+ const transactionDetailAvailabilitySchema = z.object({
295
+ totalTransactions: z.number().int().nonnegative(),
296
+ withDetails: z.number().int().nonnegative(),
297
+ withoutDetails: z.number().int().nonnegative(),
298
+ detailAvailability: z.enum(["none", "some", "all"]),
299
+ allReturnedTransactionsHaveDetails: z.boolean()
300
+ }).strict();
301
+ const liveActivityScanPersistenceSchema = z.object({
302
+ stored: z.boolean(),
303
+ reason: z.enum(["account_not_known"]).optional(),
304
+ scan: externalActivityScanRecordSchema.optional()
305
+ });
306
+ const liveActivityScanOutputBase = {
307
+ status: z.literal("ok"),
308
+ fetchedAt: fetchedAtSchema,
309
+ account: z.string(),
310
+ accountKnown: z.boolean(),
311
+ accountSource: reviewActivityAccountSourceSchema,
312
+ relationship: externalActivityRelationshipSchema,
313
+ userAnswerUse: userAnswerUseSchema,
314
+ requestedAccount: requestedAccountActivitySchema,
315
+ requestedAccountTransactionFacts: z.array(requestedAccountTransactionFactSchema),
316
+ transactionDetailAvailability: transactionDetailAvailabilitySchema,
317
+ quantitySemantics: suiActivityQuantitySemanticsSchema,
318
+ source: suiTransactionActivitySourceSchema,
319
+ hasMore: z.boolean(),
320
+ continuationCursor: z.string().optional(),
321
+ windowComplete: z.boolean().nullable(),
322
+ orderingVerified: z.boolean(),
323
+ incompleteReason: externalActivityScanIncompleteReasonSchema.optional(),
324
+ persistence: liveActivityScanPersistenceSchema
325
+ };
326
+ const liveFunctionActivityScanOutputBase = {
327
+ ...liveActivityScanOutputBase,
328
+ function: z.string(),
329
+ relationship: z.literal("sent")
330
+ };
331
+ export function registerTransactionActivityTools(server, deps) {
332
+ server.registerTool(TOOL_NAMES.readInspectSuiTransaction, {
333
+ title: "Inspect Sui transaction",
334
+ description: "Lookup one Sui transaction digest. Stores only when sender or balance owner matches a known local wallet.",
335
+ inputSchema: {
336
+ digest: transactionDigestSchema,
337
+ account: z.string().min(1).optional()
338
+ },
339
+ outputSchema: successOutputSchema({
340
+ status: z.literal("ok"),
341
+ fetchedAt: fetchedAtSchema,
342
+ source: suiTransactionActivitySourceSchema,
343
+ userAnswerUse: userAnswerUseSchema,
344
+ quantitySemantics: suiActivityQuantitySemanticsSchema,
345
+ transaction: suiTransactionFactSchema,
346
+ persistence: z.object({
347
+ stored: z.boolean(),
348
+ reason: z.enum(["no_known_wallet_relation", "transaction_not_found"]).optional(),
349
+ account: z.string().optional(),
350
+ relationship: externalActivityRelationshipSchema.optional(),
351
+ scan: externalActivityScanRecordSchema.optional()
352
+ })
353
+ }),
354
+ annotations: { readOnlyHint: false, openWorldHint: false }
355
+ }, async ({ digest, account }) => {
356
+ try {
357
+ const result = await deps.transactionActivityService.inspectSuiTransaction({ digest, account });
358
+ const transaction = transactionFactOutput(result.transaction);
359
+ return okToolResult({
360
+ ...result,
361
+ userAnswerUse: inspectSuiTransactionUserAnswerUse({
362
+ hasSender: transaction.sender !== undefined,
363
+ hasRequestedAccountEffect: transaction.requestedAccountEffect !== undefined,
364
+ hasDetails: transaction.details !== undefined
365
+ }),
366
+ quantitySemantics: suiActivityQuantitySemantics(),
367
+ transaction
368
+ });
369
+ }
370
+ catch (error) {
371
+ return transactionActivityToolError(error, deps.logger);
372
+ }
373
+ });
374
+ server.registerTool(TOOL_NAMES.readScanSuiAccountActivity, {
375
+ title: "Scan Sui account activity rows",
376
+ description: "Bounded GraphQL account activity scan with requested-account facts and digest detail lookups. Not background indexing or complete history.",
377
+ inputSchema: suiActivityScanInputSchema,
378
+ outputSchema: successOutputSchema({
379
+ ...liveActivityScanOutputBase,
380
+ transactions: z.array(suiTransactionAuditFactSchema),
381
+ }),
382
+ annotations: { readOnlyHint: false, openWorldHint: false }
383
+ }, async (input) => {
384
+ try {
385
+ const result = await deps.transactionActivityService.scanSuiAccountActivity(input);
386
+ return okToolResult(liveActivityScanToolOutput(result, transactionFactAuditOutput));
387
+ }
388
+ catch (error) {
389
+ return transactionActivityToolError(error, deps.logger);
390
+ }
391
+ });
392
+ server.registerTool(TOOL_NAMES.readScanSuiFunctionActivity, {
393
+ title: "Scan sent Sui function activity rows",
394
+ description: "Bounded GraphQL scan for transactions the account sent that called one full package::module::function. Returns requested-account facts and digest detail lookups.",
395
+ inputSchema: suiFunctionActivityScanInputSchema,
396
+ outputSchema: successOutputSchema({
397
+ ...liveFunctionActivityScanOutputBase,
398
+ transactions: z.array(suiTransactionAuditFactSchema),
399
+ }),
400
+ annotations: { readOnlyHint: false, openWorldHint: false }
401
+ }, async (input) => {
402
+ try {
403
+ const result = await deps.transactionActivityService.scanSuiFunctionActivity(input);
404
+ return okToolResult(liveActivityScanToolOutput(result, transactionFactAuditOutput));
405
+ }
406
+ catch (error) {
407
+ return transactionActivityToolError(error, deps.logger);
408
+ }
409
+ });
410
+ server.registerTool(TOOL_NAMES.readSummarizeSuiAccountActivity, {
411
+ title: "Summarize Sui account activity",
412
+ description: "Summarize stored normalized Sui activity facts. Not complete history or P&L.",
413
+ inputSchema: {
414
+ ...reviewActivityInputSchema,
415
+ limit: z.number().int().min(1).max(REVIEW_ACTIVITY_LIST_MAX_LIMIT).optional()
416
+ },
417
+ outputSchema: successOutputSchema({
418
+ status: z.literal("ok"),
419
+ dataScope: reviewActivityDataScopeSchema,
420
+ accountSource: reviewActivityAccountSourceSchema,
421
+ userAnswerUse: userAnswerUseSchema,
422
+ quantitySemantics: suiActivityQuantitySemanticsSchema,
423
+ lowSampleWarning: z.boolean(),
424
+ lowSampleThreshold: z.literal(REVIEW_ACTIVITY_LOW_SAMPLE_THRESHOLD),
425
+ truncated: z.boolean(),
426
+ source: suiTransactionActivitySourceSchema,
427
+ summary: z.object({
428
+ transactionCount: z.number().int().nonnegative(),
429
+ statusCounts: z.object({
430
+ success: z.number().int().nonnegative(),
431
+ failure: z.number().int().nonnegative(),
432
+ unknown: z.number().int().nonnegative()
433
+ }),
434
+ relationshipCounts: z.object({
435
+ affected: z.number().int().nonnegative(),
436
+ sent: z.number().int().nonnegative()
437
+ }),
438
+ earliestTimestamp: fetchedAtSchema.optional(),
439
+ latestTimestamp: fetchedAtSchema.optional()
440
+ }),
441
+ analysis: suiActivityAnalysisSchema,
442
+ transactionDetailAvailability: transactionDetailAvailabilitySchema,
443
+ transactions: z.array(externalActivityTransactionRecordSchema)
444
+ }),
445
+ annotations: { readOnlyHint: true, openWorldHint: false }
446
+ }, async ({ account, from, to, limit }) => {
447
+ try {
448
+ const summary = await deps.transactionActivityService.summarizeSuiAccountActivity({
449
+ account,
450
+ from,
451
+ to,
452
+ limit
453
+ });
454
+ const detailAvailability = transactionDetailAvailability(summary.transactions);
455
+ return okToolResult({
456
+ ...summary,
457
+ userAnswerUse: storedSuiActivityUserAnswerUse(detailAvailability),
458
+ quantitySemantics: suiActivityQuantitySemantics(),
459
+ source: {
460
+ transport: "local_db",
461
+ method: "stored_normalized_facts"
462
+ },
463
+ transactionDetailAvailability: detailAvailability,
464
+ transactions: summary.transactions.map(externalActivityTransactionRecordOutput)
465
+ });
466
+ }
467
+ catch (error) {
468
+ return transactionActivityToolError(error, deps.logger);
469
+ }
470
+ });
471
+ server.registerTool(TOOL_NAMES.readSummarizeSuiActivityScan, {
472
+ title: "Summarize Sui activity scan",
473
+ description: "Bounded GraphQL account activity summary with requested-account facts and deterministic normalized-fact analysis. Not complete history or P&L.",
474
+ inputSchema: suiActivityScanInputSchema,
475
+ outputSchema: successOutputSchema({
476
+ ...liveActivityScanOutputBase,
477
+ analysis: suiActivityAnalysisSchema,
478
+ transactions: z.array(suiTransactionAuditFactSchema),
479
+ }),
480
+ annotations: { readOnlyHint: false, openWorldHint: false }
481
+ }, async (input) => {
482
+ try {
483
+ const result = await deps.transactionActivityService.summarizeSuiActivityScan(input);
484
+ return okToolResult(liveActivityScanToolOutput(result, transactionFactAuditOutput));
485
+ }
486
+ catch (error) {
487
+ return transactionActivityToolError(error, deps.logger);
488
+ }
489
+ });
490
+ server.registerTool(TOOL_NAMES.readSummarizeSuiFunctionActivityScan, {
491
+ title: "Summarize sent Sui function activity",
492
+ description: "Bounded sent-function activity summary with requested-account facts and deterministic normalized-fact analysis. Not route, P&L, or position analysis.",
493
+ inputSchema: suiFunctionActivityScanInputSchema,
494
+ outputSchema: successOutputSchema({
495
+ ...liveFunctionActivityScanOutputBase,
496
+ analysis: suiActivityAnalysisSchema,
497
+ transactions: z.array(suiTransactionAuditFactSchema),
498
+ }),
499
+ annotations: { readOnlyHint: false, openWorldHint: false }
500
+ }, async (input) => {
501
+ try {
502
+ const result = await deps.transactionActivityService.summarizeSuiFunctionActivityScan(input);
503
+ return okToolResult(liveActivityScanToolOutput(result, transactionFactAuditOutput));
504
+ }
505
+ catch (error) {
506
+ return transactionActivityToolError(error, deps.logger);
507
+ }
508
+ });
509
+ }
510
+ function liveActivityScanToolOutput(result, transactionOutput) {
511
+ const detailAvailability = transactionDetailAvailability(result.transactions);
512
+ return {
513
+ status: result.status,
514
+ fetchedAt: result.fetchedAt,
515
+ account: result.account,
516
+ accountKnown: result.accountKnown,
517
+ accountSource: result.accountSource,
518
+ ...("function" in result ? { function: result.function } : {}),
519
+ relationship: result.relationship,
520
+ userAnswerUse: liveSuiActivityUserAnswerUse({
521
+ includeAnalysis: "analysis" in result,
522
+ transactionDetailAvailability: detailAvailability
523
+ }),
524
+ requestedAccount: result.requestedAccount,
525
+ requestedAccountTransactionFacts: requestedAccountTransactionFacts(result.transactions),
526
+ transactionDetailAvailability: detailAvailability,
527
+ quantitySemantics: suiActivityQuantitySemantics(),
528
+ source: result.source,
529
+ ...("analysis" in result ? { analysis: result.analysis } : {}),
530
+ transactions: result.transactions.map(transactionOutput),
531
+ hasMore: result.hasMore,
532
+ ...(result.continuationCursor === undefined ? {} : { continuationCursor: result.continuationCursor }),
533
+ windowComplete: result.windowComplete,
534
+ orderingVerified: result.orderingVerified,
535
+ ...(result.incompleteReason === undefined ? {} : { incompleteReason: result.incompleteReason }),
536
+ persistence: result.persistence
537
+ };
538
+ }
539
+ function requestedAccountTransactionFacts(transactions) {
540
+ return transactions.flatMap((transaction) => {
541
+ const fact = requestedAccountTransactionFactOutput(transaction);
542
+ return fact === undefined ? [] : [fact];
543
+ });
544
+ }