@stelis/say-ur-intent 0.0.7 → 0.1.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.
- package/README.md +57 -171
- package/docs/AGENT_BEHAVIOR.md +9 -8
- package/docs/LOCAL_DB_ARCHITECTURE.md +33 -0
- package/docs/MCP_SETUP.md +56 -2
- package/docs/SIGNABLE_ADAPTER_CONTRACT.md +22 -10
- package/docs/UTILITY_INDEX.md +25 -0
- package/docs/WALLET_IDENTITY.md +5 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
# Say Ur Intent
|
|
2
2
|
|
|
3
|
-
Say Ur Intent is a local-first
|
|
3
|
+
Say Ur Intent is a local-first Sui review and evidence layer for AI clients.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
It turns a supported AI-requested Sui action into a local review page where the
|
|
6
|
+
user reads the transaction summary, inspects the transaction (PTB) as a graph,
|
|
7
|
+
and signs in their own wallet. The AI client never receives signing authority or
|
|
8
|
+
executable transaction bytes.
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
*The local review page: deterministic review checks, review-time simulation
|
|
13
|
+
evidence, and the transaction shown as a labeled PTB graph — what the user
|
|
14
|
+
reviews before signing in their own wallet.*
|
|
15
|
+
|
|
16
|
+
For natural-language Sui DeFi questions, the current release also returns
|
|
17
|
+
verified, AI-readable evidence before any transaction is built. That answer path
|
|
18
|
+
stays separate from account-bound swap review, where the review server builds
|
|
8
19
|
local unsigned transaction material internally and, once every review evidence
|
|
9
|
-
stage completes, the local review page offers a digest-gated handoff,
|
|
10
|
-
user-controlled wallet signing, and execution-receipt recording.
|
|
11
|
-
|
|
20
|
+
stage completes, the local review page offers a digest-gated byte handoff,
|
|
21
|
+
user-controlled wallet signing, and execution-receipt recording. MCP responses
|
|
22
|
+
never sign, execute, or return transaction bytes; the only transaction-byte path
|
|
23
|
+
is the same-machine, digest-gated wallet handoff initiated from the local review
|
|
24
|
+
page.
|
|
12
25
|
|
|
13
26
|
Users can ask ordinary questions:
|
|
14
27
|
|
|
@@ -36,17 +49,19 @@ Say Ur Intent is one product, but it must be read at three distinct layers. Do n
|
|
|
36
49
|
|
|
37
50
|
In one sentence: Say Ur Intent is a local-first Sui intent evidence and review layer that progresses from verified evidence to user-controlled wallet signing only after Say Ur Intent independently builds or verifies the transaction material and shows a human-readable local review.
|
|
38
51
|
|
|
39
|
-
DeepBook
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
DeepBook and FlowX are the current Sui liquidity and price sources in this
|
|
53
|
+
release: DeepBook provides scoped conversion, price, and orderbook evidence, and
|
|
54
|
+
FlowX provides indicative CLMM route quotes. Wallet and Sui balance reads
|
|
55
|
+
describe held assets. They do not define the whole product.
|
|
42
56
|
|
|
43
57
|
Say Ur Intent does not custody funds, hold private keys, or autonomously trade
|
|
44
58
|
on behalf of users.
|
|
45
59
|
By current design, it does not rank venues, choose routes, make best-price
|
|
46
60
|
recommendations, or silently choose settlement tokens for users.
|
|
47
61
|
|
|
48
|
-
The current release can build local unsigned transaction material
|
|
49
|
-
account-bound DeepBook swap review
|
|
62
|
+
The current release can build local unsigned transaction material inside the
|
|
63
|
+
account-bound DeepBook and FlowX swap review paths. It does not expose
|
|
64
|
+
transaction bytes.
|
|
50
65
|
Wallet signing is user-controlled on the local review page after a
|
|
51
66
|
digest-gated handoff; MCP responses never request signatures, provide signing
|
|
52
67
|
readiness, or execute payments.
|
|
@@ -64,8 +79,8 @@ The current release flow is:
|
|
|
64
79
|
The user states an intent in natural language.
|
|
65
80
|
Say Ur Intent resolves the supported Sui mainnet evidence surface.
|
|
66
81
|
The AI answers only from returned evidence and boundaries.
|
|
67
|
-
|
|
68
|
-
the natural-language intent evidence answer.
|
|
82
|
+
Supported swap transaction material build is an account-bound review step, not
|
|
83
|
+
part of the natural-language intent evidence answer.
|
|
69
84
|
```
|
|
70
85
|
|
|
71
86
|
The current release implements intent evidence for supported Sui mainnet reads.
|
|
@@ -73,17 +88,6 @@ It can also create a read-only, non-signable local review session from a
|
|
|
73
88
|
structured external payment or Sui action proposal. External proposal ingestion
|
|
74
89
|
does not trust external transaction material or send anything for wallet signing.
|
|
75
90
|
|
|
76
|
-
Key terms used below:
|
|
77
|
-
|
|
78
|
-
- Sui: the mainnet blockchain whose DeFi state this project reads.
|
|
79
|
-
- MCP: Model Context Protocol, the tool-calling interface used by AI clients.
|
|
80
|
-
- DeepBook: Sui's onchain order book protocol.
|
|
81
|
-
- SDK: Software Development Kit, a version-pinned library dependency used by this repository.
|
|
82
|
-
- gRPC and GraphQL: Sui SDK transports used by this runtime for mainnet reads.
|
|
83
|
-
- dApp Kit: Sui's wallet connection library for web apps.
|
|
84
|
-
- stdio: standard input/output, the local transport used by MCP clients to talk to this server.
|
|
85
|
-
- Stelis: the GitHub and npm namespace for this package. Say Ur Intent is the product and runtime name.
|
|
86
|
-
|
|
87
91
|
For setup, see [docs/MCP_SETUP.md](docs/MCP_SETUP.md).
|
|
88
92
|
For the MCP API reference, see [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md).
|
|
89
93
|
For the AI-client answer playbook, see [docs/AGENT_BEHAVIOR.md](docs/AGENT_BEHAVIOR.md).
|
|
@@ -104,7 +108,7 @@ The current release can run as a local stdio MCP server and expose mainnet Sui D
|
|
|
104
108
|
- user-requested bounded Sui transaction digest lookup, account activity scans, sent-function activity scans with known-wallet-only persistence, and stored normalized activity summaries;
|
|
105
109
|
- read-only external proposal review sessions that display proposed action, asset flow, recipient or target, freshness, missing evidence, user choices, unsupported claims, and non-signable reason;
|
|
106
110
|
- local Say Ur Intent review evidence and review-session status reads;
|
|
107
|
-
- account-bound DeepBook and FlowX swap review progress through local unsigned transaction material build, internal Sui transaction digest binding, object ownership evidence, quote/policy provenance binding, human-readable review facts, and review-time simulation evidence; when every stage completes the review reaches `ready_for_wallet_review` and the local review page offers a digest-gated byte handoff, user-controlled wallet signing, and execution-receipt recording.
|
|
111
|
+
- account-bound DeepBook and FlowX swap review progress through local unsigned transaction material build, internal Sui transaction digest binding, object ownership evidence, quote/policy provenance binding, human-readable review facts, and review-time simulation evidence; when every stage completes the review reaches `ready_for_wallet_review` and the local review page offers a digest-gated byte handoff, user-controlled wallet signing, and execution-receipt recording. MCP responses never sign, execute, or return transaction bytes; transaction bytes flow only through the same-machine, digest-gated wallet handoff initiated from the local review page.
|
|
108
112
|
|
|
109
113
|
It also includes:
|
|
110
114
|
|
|
@@ -131,7 +135,7 @@ payloads before storage, and records why the review is non-signable.
|
|
|
131
135
|
|
|
132
136
|
Blocked signing is session-scoped: a review session stays blocked while
|
|
133
137
|
required review evidence is missing for that session (for example
|
|
134
|
-
`wallet_review_contract_emit_missing`). When account-bound
|
|
138
|
+
`wallet_review_contract_emit_missing`). When an account-bound supported swap
|
|
135
139
|
review completes local transaction material, digest binding, object ownership,
|
|
136
140
|
quote/policy provenance, human-readable review evidence, and review-time
|
|
137
141
|
simulation evidence, the review layer emits a schema-validated
|
|
@@ -148,11 +152,11 @@ The signable adapter and PTB visualization boundary is documented in
|
|
|
148
152
|
`WalletReviewAdapterContract` as pre-signing review evidence when every
|
|
149
153
|
required evidence stage is complete; the contract carries the transaction
|
|
150
154
|
commitment hash only.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
155
|
+
|
|
156
|
+
Wallet signing and the digest-gated byte handoff happen only on the local
|
|
157
|
+
review page through the user's own wallet, never through MCP responses. MCP
|
|
158
|
+
responses do not return executable transaction material or signing data, and
|
|
159
|
+
do not provide signing readiness.
|
|
156
160
|
|
|
157
161
|
Fiat cash-out, P&L, tax, and cost-basis support are not part of the current release.
|
|
158
162
|
|
|
@@ -200,38 +204,9 @@ For quote responses alone, these conclusions are unsupported:
|
|
|
200
204
|
- cost basis is not available;
|
|
201
205
|
- actionable signing data is not available.
|
|
202
206
|
|
|
203
|
-
##
|
|
204
|
-
|
|
205
|
-
This package targets Node.js 22+. Node 22 or 24 LTS is recommended.
|
|
206
|
-
|
|
207
|
-
Use this path when you download the repository from GitHub and want to test the local build in an MCP client:
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
git clone https://github.com/stelis-dev/say-ur-intent.git
|
|
211
|
-
cd say-ur-intent
|
|
212
|
-
npm install
|
|
213
|
-
npm run build
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
No Sui endpoint setup is required for the default path. For MCP stdio configuration from a local checkout, point the client at the built runtime:
|
|
217
|
-
|
|
218
|
-
```json
|
|
219
|
-
{
|
|
220
|
-
"command": "node",
|
|
221
|
-
"args": ["/absolute/path/to/say-ur-intent/dist/runtime/start.js"]
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
Do not wrap the stdio server in a shell command that writes ordinary text to stdout. Stdout is reserved for MCP JSON-RPC messages; logs go to stderr.
|
|
226
|
-
|
|
227
|
-
Client-specific setup for Claude Code, Claude Desktop, Codex, and Cursor lives in [docs/MCP_SETUP.md](docs/MCP_SETUP.md). That file is the canonical setup guide; this README keeps only the short path.
|
|
207
|
+
## Install
|
|
228
208
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
```text
|
|
232
|
-
Register this repository as a local stdio MCP server using the built /absolute/path/to/say-ur-intent/dist/runtime/start.js file.
|
|
233
|
-
Use the default Sui mainnet endpoint unless I explicitly ask for a custom provider.
|
|
234
|
-
```
|
|
209
|
+
Install from the MCP registry (server `io.github.stelis-dev/say-ur-intent`) or with `npx -y @stelis/say-ur-intent`. For per-client configuration (Claude Code, Claude Desktop, Codex, Cursor) and running from a local checkout, see [docs/MCP_SETUP.md](docs/MCP_SETUP.md).
|
|
235
210
|
|
|
236
211
|
After the MCP server is connected, use [docs/MCP_SETUP.md](docs/MCP_SETUP.md#first-use-flow) for first-use setup, [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md) for API fields and statuses, and [docs/AGENT_BEHAVIOR.md](docs/AGENT_BEHAVIOR.md) for user-question flow and response wording.
|
|
237
212
|
|
|
@@ -241,20 +216,6 @@ Product docs, registry, AI responses, UX copy, and signable actions are mainnet-
|
|
|
241
216
|
|
|
242
217
|
Unsupported protocol experiments are not product functionality and are not included in the package docs, MCP resources, registry support lists, UX copy, or signable-action lists.
|
|
243
218
|
|
|
244
|
-
## Commands
|
|
245
|
-
|
|
246
|
-
```bash
|
|
247
|
-
npm install
|
|
248
|
-
npm run typecheck
|
|
249
|
-
npm run build
|
|
250
|
-
npm test
|
|
251
|
-
npm run release:check
|
|
252
|
-
npm run generate:deepbook-registry
|
|
253
|
-
npm run smoke:mainnet
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
`npm run generate:deepbook-registry` writes `registry/generated/deepbook-mainnet.json`, which is ignored by Git because generated registry data must include provenance and should be regenerated from the pinned SDK.
|
|
257
|
-
|
|
258
219
|
## MCP Tools
|
|
259
220
|
|
|
260
221
|
The canonical MCP API reference lives in [docs/MCP_TOOLS.md](docs/MCP_TOOLS.md).
|
|
@@ -299,105 +260,30 @@ AI client answer behavior must be mirrored in runtime-facing instructions, resou
|
|
|
299
260
|
- `docs/LOCAL_DB_ARCHITECTURE.md`: local SQLite storage boundaries for maintainers.
|
|
300
261
|
- `docs/SDK_API.md`: pinned SDK API notes and source-verification boundaries.
|
|
301
262
|
- `docs/FRONTEND_POLICY.md`: review-app frontend implementation policy for coding agents.
|
|
302
|
-
- `docs/SIGNABLE_ADAPTER_CONTRACT.md`: wallet-review adapter and PTB visualization contract.
|
|
263
|
+
- `docs/SIGNABLE_ADAPTER_CONTRACT.md`: wallet-review adapter and PTB visualization contract. It defines the pre-signing review evidence and commitment boundary; wallet signing still happens only through the local review page, not through MCP.
|
|
303
264
|
- `AGENTS.md`: root repository development contract and non-negotiable product boundaries for coding agents working on this codebase.
|
|
304
265
|
- `docs/AGENT_DEVELOPMENT_POLICY.md`: detailed binding development, review, documentation, source-of-truth, and completion policies for coding agents.
|
|
305
266
|
|
|
306
267
|
## Contract Name Registry
|
|
307
268
|
|
|
308
|
-
The PTB visualization on the review page can show
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
269
|
+
The PTB visualization on the review page can show human-readable labels in place
|
|
270
|
+
of raw addresses, with a toggle back to raw addresses and a copyable Mermaid
|
|
271
|
+
source that always keeps raw addresses. A label is identity display only, not a
|
|
272
|
+
safety, trust, route-quality, or signing-readiness signal, and only registered
|
|
273
|
+
addresses are relabeled.
|
|
313
274
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
[`src/core/action/contractNameRegistry.ts`](src/core/action/contractNameRegistry.ts).
|
|
318
|
-
Only packages listed in this registry are relabeled; every other package keeps
|
|
319
|
-
its raw address.
|
|
320
|
-
|
|
321
|
-
## For Maintainers
|
|
322
|
-
|
|
323
|
-
This section is for people operating releases, running smoke checks, changing runtime storage, or debugging startup. Normal users and MCP client users can stop at the documentation map above.
|
|
275
|
+
Two pinned, context-aware registries in
|
|
276
|
+
[`src/core/action/contractNameRegistry.ts`](src/core/action/contractNameRegistry.ts)
|
|
277
|
+
drive this:
|
|
324
278
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
export SUI_GRAPHQL_URL="https://graphql.mainnet.sui.io/graphql" # optional override; default is the built-in mainnet GraphQL endpoint
|
|
332
|
-
export SMOKE_SUI_ADDRESS="0x..."
|
|
333
|
-
export SMOKE_DEEPBOOK_POOL_KEY="DEEP_SUI"
|
|
334
|
-
export SMOKE_QUOTE_AMOUNT="1000000000" # raw integer units; for SUI, 1000000000 = 1 SUI
|
|
335
|
-
# Optional: export SMOKE_INSPECT_DIGEST="..."
|
|
336
|
-
# Optional: export SMOKE_INSPECT_RANDOM_LATEST="true"
|
|
337
|
-
npm run build
|
|
338
|
-
npm run smoke:mainnet
|
|
339
|
-
```
|
|
279
|
+
- packages, relabeled only in `<address>::` path position — the DeepBook swap
|
|
280
|
+
package by its Move Registry (MVR) name `@deepbook/core`, and the Sui framework
|
|
281
|
+
packages by their Move aliases (`std`, `sui`, `sui_system`);
|
|
282
|
+
- well-known Sui system objects, relabeled only as a bare object id — `Clock`,
|
|
283
|
+
`SuiSystemState`, `Random`, `DenyList`, `CoinRegistry`, and the address-based
|
|
284
|
+
balance `AccumulatorRoot`.
|
|
340
285
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
It samples one digest from the latest GraphQL transaction page and calls `read.inspect_sui_transaction` without passing the smoke address.
|
|
347
|
-
|
|
348
|
-
This checks current transaction-read shape without pinning a specific user address or exercising the stored relation path.
|
|
349
|
-
|
|
350
|
-
The smoke script currently calls:
|
|
351
|
-
|
|
352
|
-
- wallet assets;
|
|
353
|
-
- DeepBook orderbook;
|
|
354
|
-
- raw-quantity quote;
|
|
355
|
-
- `read.scan_sui_account_activity` for `SMOKE_SUI_ADDRESS` with limit 5;
|
|
356
|
-
- `read.summarize_sui_activity_scan` through active account context with limit 5.
|
|
357
|
-
|
|
358
|
-
If `SMOKE_FUNCTION_TARGET` is set to a full `package::module::function`, it also calls `read.scan_sui_function_activity` and `read.summarize_sui_function_activity_scan` with limit 5.
|
|
359
|
-
|
|
360
|
-
If unset, function activity smoke is recorded as not run with `notRunReason: "missing_env"`.
|
|
361
|
-
|
|
362
|
-
Empty activity pages are valid smoke outcomes. They are recorded with `rowCount: 0` and `emptyAccepted: true`.
|
|
363
|
-
|
|
364
|
-
If `SMOKE_INSPECT_DIGEST` is set, the script also calls `read.inspect_sui_transaction` for that digest and the smoke address.
|
|
365
|
-
|
|
366
|
-
DeepBook orderbook and raw-quantity quote reads use an internal mainnet SDK simulation sender placeholder, not a user's wallet. The display-amount quote path is covered by automated tests, not by this smoke script. This smoke script does not exercise account-bound DeepBook transaction-material build or digest binding; that path needs a separate funded-account material-build smoke before smoke results are treated as product-grade proof for that review stage.
|
|
367
|
-
|
|
368
|
-
Wallet asset summaries and active-account activity summaries use the smoke address through a wallet identity session created by the smoke script. Browser wallet behavior is checked separately.
|
|
369
|
-
|
|
370
|
-
Smoke result files record activity status, row count, source, window/order flags, persistence, and evidence summary only. They do not record raw GraphQL payloads, transaction bytes, signatures, raw transaction details, or compact transaction aggregates.
|
|
371
|
-
|
|
372
|
-
### Runtime Boundary
|
|
373
|
-
|
|
374
|
-
The runtime starts these local components:
|
|
375
|
-
|
|
376
|
-
- a local SQLite store;
|
|
377
|
-
- a mainnet guard for the configured Sui gRPC endpoint;
|
|
378
|
-
- the local review HTTP server on `127.0.0.1`;
|
|
379
|
-
- the stdio MCP transport.
|
|
380
|
-
|
|
381
|
-
The GraphQL endpoint is also mainnet-guarded when it is saved through settings, imported from a local-data backup, or first used by Sui activity tools.
|
|
382
|
-
|
|
383
|
-
Stdout is reserved for MCP JSON-RPC messages. Logs go to stderr.
|
|
384
|
-
|
|
385
|
-
### Local Data
|
|
386
|
-
|
|
387
|
-
The runtime creates a local SQLite file for account read context and Say Ur Intent review activity evidence. Users do not install a database server separately.
|
|
388
|
-
|
|
389
|
-
Override the app data directory only when needed:
|
|
390
|
-
|
|
391
|
-
```bash
|
|
392
|
-
export SAY_UR_INTENT_DATA_DIR="/path/to/local/app-data"
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
The stored active account is for reading wallet state only. It does not let the toolkit sign transactions on your behalf.
|
|
396
|
-
|
|
397
|
-
User-requested bounded transaction scans can store normalized facts only when a transaction is related to a known local wallet. This product does not run a background or complete wallet history indexer.
|
|
398
|
-
|
|
399
|
-
The default Sui mainnet gRPC and GraphQL endpoints are stored in the local SQLite settings table on first run.
|
|
400
|
-
|
|
401
|
-
To inspect settings or change local data, ask your AI client to create a Say Ur Intent local settings session and open the returned settings URL in the same machine's system browser.
|
|
402
|
-
|
|
403
|
-
Endpoint changes apply after the MCP server restarts.
|
|
286
|
+
If you maintain a Sui DeFi protocol that has a registered MVR name and want its
|
|
287
|
+
package to display that name in the review graph, open a pull request adding your
|
|
288
|
+
mainnet package address and MVR name to the package registry. Every unregistered
|
|
289
|
+
address keeps its raw form.
|
package/docs/AGENT_BEHAVIOR.md
CHANGED
|
@@ -10,7 +10,7 @@ It is not the contributor rulebook and it is not enforcement. Development rules
|
|
|
10
10
|
|
|
11
11
|
| Surface | Status | Behavior |
|
|
12
12
|
| --- | --- | --- |
|
|
13
|
-
| Sui mainnet state reads | Current | Use read tools for supported balances, DeepBook pools, token registry metadata, mid-price snapshots, orderbook context, raw-quantity quotes, and DeepBook account inventory. |
|
|
13
|
+
| Sui mainnet state reads | Current | Use read tools for supported balances, DeepBook pools, FlowX pools, token registry metadata, mid-price snapshots, orderbook context, raw-quantity quotes, and DeepBook account inventory. |
|
|
14
14
|
| DeepBook and FlowX swap review sessions | Digest-gated handoff; user-controlled signing on the review page | A review URL can be created. The review URL displays the proposal and local review evidence. The account-bound review can build local unsigned DeepBook or FlowX swap transaction material inside the review server, internally bind a Sui transaction digest to that stored material, and derive object ownership, quote/policy provenance, human-readable review facts, and review-time simulation evidence from the same private review artifacts. This release does not provide a sign action, signing data, MCP-visible transaction bytes, or signing readiness. The local review page requests a digest-gated byte handoff for a `ready_for_wallet_review` state, then the user signs in their own wallet and the page records the execution receipt. |
|
|
15
15
|
| External proposal review sessions | Non-signable review in the current release | `action.prepare_external_proposal_review` can create a review URL from a structured external payment or Sui action proposal. Treat the proposal as untrusted display and review context only. It does not build, verify, simulate, sign, or execute transaction material. |
|
|
16
16
|
| Wallet signing | User-controlled on the local review page | MCP tools do not return signing readiness, signing data, or executable transaction bytes. Signing and execution happen only in the user's wallet from the local review page after the digest-gated handoff; results are recorded as execution receipts keyed by the review session. |
|
|
@@ -154,13 +154,13 @@ transaction material. Do not treat it as route selection. Do not treat it as
|
|
|
154
154
|
settlement-token selection. Do not treat it as payment execution readiness. Do
|
|
155
155
|
not treat it as signing data or signing readiness.
|
|
156
156
|
|
|
157
|
-
After a DeepBook review session is wallet-account bound, `session.get_review_status` can include review-state checks, `reviewState.adapterLifecycle`, `reviewState.humanReadableReview`, and `reviewState.simulation`. The review page renders those fields as local review evidence.
|
|
157
|
+
After a DeepBook or FlowX review session is wallet-account bound, `session.get_review_status` can include review-state checks, `reviewState.adapterLifecycle`, `reviewState.humanReadableReview`, and `reviewState.simulation`. The review page renders those fields as local review evidence.
|
|
158
158
|
|
|
159
|
-
Use `reviewState.adapterLifecycle.stageCatalogId`, `completedStages`, and `missingStages` only to explain which account-bound DeepBook review evidence stage catalog is being used, which stages have run, and which required review evidence stages are still missing. If `transaction_material_build_or_verify` is completed, say only that the review server built local unsigned transaction material and kept bytes internal. If `digest_commitment` is completed, say only that the review server internally bound a Sui transaction digest to that stored local material. If `object_ownership` is completed, say only that the review server derived object ownership evidence from the stored local material and Sui owner/type reads. If `review_time_simulation` is completed, say only that the review server simulated the stored local unsigned material with checks enabled and exposed a redacted simulation summary. `reviewState.humanReadableReview` is valid only after `human_readable_review` is completed and not missing; `reviewState.simulation` is valid only after `review_time_simulation` is completed and not missing. Do not provide or infer transaction bytes, signing data, signing readiness, or execution readiness from those stages. This lifecycle stops at review-time simulation; the digest-gated byte handoff follows an emitted contract, while wallet signing and execution receipt happen on the local review page under the user's control. Use those checks to explain what the local review layer verified before signing. Do not describe them as wallet readiness, signing readiness, route quality, execution safety, or public transaction bytes. The MCP layer never signs, executes, or returns transaction bytes.
|
|
159
|
+
Use `reviewState.adapterLifecycle.stageCatalogId`, `completedStages`, and `missingStages` only to explain which account-bound DeepBook or FlowX review evidence stage catalog is being used, which stages have run, and which required review evidence stages are still missing. If `transaction_material_build_or_verify` is completed, say only that the review server built local unsigned transaction material and kept bytes internal. If `digest_commitment` is completed, say only that the review server internally bound a Sui transaction digest to that stored local material. If `object_ownership` is completed, say only that the review server derived object ownership evidence from the stored local material and Sui owner/type reads. If `review_time_simulation` is completed, say only that the review server simulated the stored local unsigned material with checks enabled and exposed a redacted simulation summary. `reviewState.humanReadableReview` is valid only after `human_readable_review` is completed and not missing; `reviewState.simulation` is valid only after `review_time_simulation` is completed and not missing. Do not provide or infer transaction bytes, signing data, signing readiness, or execution readiness from those stages. This lifecycle stops at review-time simulation; the digest-gated byte handoff follows an emitted contract, while wallet signing and execution receipt happen on the local review page under the user's control. Use those checks to explain what the local review layer verified before signing. Do not describe them as wallet readiness, signing readiness, route quality, execution safety, or public transaction bytes. The MCP layer never signs, executes, or returns transaction bytes.
|
|
160
160
|
|
|
161
161
|
Use `reviewState.humanReadableReview` only as displayable review facts projected
|
|
162
|
-
from verified local review evidence. Its `kind` currently identifies the
|
|
163
|
-
swap review projection. Its `assetFlow` raw amounts, coin types, decimals,
|
|
162
|
+
from verified local review evidence. Its `kind` currently identifies the shared
|
|
163
|
+
DeepBook and FlowX swap review projection. Its `assetFlow` raw amounts, coin types, decimals,
|
|
164
164
|
minimum output, fee facts, target pool, and direction are derived from the
|
|
165
165
|
material-bound quote policy evidence, while object ownership is cited only as
|
|
166
166
|
review evidence from stored transaction material and Sui owner/type reads.
|
|
@@ -185,9 +185,10 @@ review-time simulation to one transaction commitment hash. It is not
|
|
|
185
185
|
transaction bytes, not signing data, not signing readiness, not wallet
|
|
186
186
|
handoff, not execution readiness, and not a route recommendation. If the
|
|
187
187
|
review is blocked on `wallet_review_contract_emit_missing`, say that contract
|
|
188
|
-
assembly declined and use the failed
|
|
189
|
-
`deepbook_wallet_review_contract_emit_missing`
|
|
190
|
-
|
|
188
|
+
assembly declined and use the failed adapter-prefixed emit-missing check message
|
|
189
|
+
for the concrete reason: `deepbook_wallet_review_contract_emit_missing` for a
|
|
190
|
+
DeepBook review and `flowx_wallet_review_contract_emit_missing` for a FlowX
|
|
191
|
+
review.
|
|
191
192
|
|
|
192
193
|
If a response includes a `PtbVisualizationArtifact`, answer from its Mermaid
|
|
193
194
|
text, diagnostics, `generatedAt`, `source`, and `unsupportedUse` fields only
|
|
@@ -4,6 +4,39 @@ Say Ur Intent uses a local SQLite database for durable product state that must s
|
|
|
4
4
|
|
|
5
5
|
This document is for maintainers and contributors who change local state, import/export behavior, activity queries, or review evidence storage. Product users normally need only the README and `docs/MCP_SETUP.md`.
|
|
6
6
|
|
|
7
|
+
## Runtime Boundary
|
|
8
|
+
|
|
9
|
+
The runtime starts these local components:
|
|
10
|
+
|
|
11
|
+
- a local SQLite store;
|
|
12
|
+
- a mainnet guard for the configured Sui gRPC endpoint;
|
|
13
|
+
- the local review HTTP server on `127.0.0.1`;
|
|
14
|
+
- the stdio MCP transport.
|
|
15
|
+
|
|
16
|
+
The GraphQL endpoint is also mainnet-guarded when it is saved through settings, imported from a local-data backup, or first used by Sui activity tools.
|
|
17
|
+
|
|
18
|
+
Stdout is reserved for MCP JSON-RPC messages. Logs go to stderr.
|
|
19
|
+
|
|
20
|
+
## Local Data
|
|
21
|
+
|
|
22
|
+
The runtime creates a local SQLite file for account read context and Say Ur Intent review activity evidence. Users do not install a database server separately.
|
|
23
|
+
|
|
24
|
+
Override the app data directory only when needed:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
export SAY_UR_INTENT_DATA_DIR="/path/to/local/app-data"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The stored active account is for reading wallet state only. It does not let the toolkit sign transactions on your behalf.
|
|
31
|
+
|
|
32
|
+
User-requested bounded transaction scans can store normalized facts only when a transaction is related to a known local wallet. This product does not run a background or complete wallet history indexer.
|
|
33
|
+
|
|
34
|
+
The default Sui mainnet gRPC and GraphQL endpoints are stored in the local SQLite settings table on first run.
|
|
35
|
+
|
|
36
|
+
To inspect settings or change local data, ask your AI client to create a Say Ur Intent local settings session and open the returned settings URL in the same machine's system browser.
|
|
37
|
+
|
|
38
|
+
Endpoint changes apply after the MCP server restarts.
|
|
39
|
+
|
|
7
40
|
## Engine
|
|
8
41
|
|
|
9
42
|
The runtime uses the `better-sqlite3` npm package for normal SQLite file semantics and incremental writes. Users do not install a separate database server.
|
package/docs/MCP_SETUP.md
CHANGED
|
@@ -8,6 +8,17 @@ The README keeps only the short entry path; client-specific setup, restart behav
|
|
|
8
8
|
|
|
9
9
|
Say Ur Intent is tested from a local checkout in this repository state.
|
|
10
10
|
|
|
11
|
+
## Key terms
|
|
12
|
+
|
|
13
|
+
- Sui: the mainnet blockchain whose DeFi state this project reads.
|
|
14
|
+
- MCP: Model Context Protocol, the tool-calling interface used by AI clients.
|
|
15
|
+
- DeepBook: Sui's onchain order book protocol.
|
|
16
|
+
- SDK: Software Development Kit, a version-pinned library dependency used by this repository.
|
|
17
|
+
- gRPC and GraphQL: Sui SDK transports used by this runtime for mainnet reads.
|
|
18
|
+
- dApp Kit: Sui's wallet connection library for web apps.
|
|
19
|
+
- stdio: standard input/output, the local transport used by MCP clients to talk to this server.
|
|
20
|
+
- Stelis: the GitHub and npm namespace for this package. Say Ur Intent is the product and runtime name.
|
|
21
|
+
|
|
11
22
|
## Requirements
|
|
12
23
|
|
|
13
24
|
- Node.js 22+. Node 22 or 24 LTS is recommended.
|
|
@@ -64,9 +75,46 @@ On native Windows clients that need `cmd`, use the same command through `cmd /c`
|
|
|
64
75
|
}
|
|
65
76
|
```
|
|
66
77
|
|
|
78
|
+
To delegate local setup to an AI coding agent, tell it:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
Register this repository as a local stdio MCP server using the built /absolute/path/to/say-ur-intent/dist/runtime/start.js file.
|
|
82
|
+
Use the default Sui mainnet endpoint unless I explicitly ask for a custom provider.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Commands
|
|
86
|
+
|
|
87
|
+
These `npm run` scripts run from a local checkout. They are developer and maintainer scripts, not MCP tools or packaged product commands:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm install
|
|
91
|
+
npm run typecheck
|
|
92
|
+
npm run build
|
|
93
|
+
npm test
|
|
94
|
+
npm run release:check
|
|
95
|
+
npm run generate:deepbook-registry
|
|
96
|
+
npm run smoke:mainnet
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`npm run generate:deepbook-registry` writes `registry/generated/deepbook-mainnet.json`, which is ignored by Git because generated registry data must include provenance and should be regenerated from the pinned SDK.
|
|
100
|
+
|
|
101
|
+
## Install from the MCP Registry
|
|
102
|
+
|
|
103
|
+
If your MCP client can install servers from the
|
|
104
|
+
[MCP Registry](https://registry.modelcontextprotocol.io/v0/servers?search=say-ur-intent),
|
|
105
|
+
find the `io.github.stelis-dev/say-ur-intent` entry and install it through your
|
|
106
|
+
client. The resulting stdio server command is equivalent to:
|
|
107
|
+
|
|
108
|
+
```sh
|
|
109
|
+
npx -y @stelis/say-ur-intent
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Clients that do not install from the registry use the published-package and
|
|
113
|
+
per-client configuration below, which give the exact `command` and `args`.
|
|
114
|
+
|
|
67
115
|
## Published Package Setup
|
|
68
116
|
|
|
69
|
-
|
|
117
|
+
`@stelis/say-ur-intent` is on npm; there are two ways to run it. Both start
|
|
70
118
|
the same `say-ur-intent` stdio MCP server; pick based on whether you want
|
|
71
119
|
automatic updates or the fastest, most reliable startup.
|
|
72
120
|
|
|
@@ -542,7 +590,13 @@ If the user supplied a specific Sui address for `read.summarize_wallet_assets` o
|
|
|
542
590
|
|
|
543
591
|
### NPM command returns 404
|
|
544
592
|
|
|
545
|
-
|
|
593
|
+
`@stelis/say-ur-intent` is published to npm, so a 404 is not a "package does not
|
|
594
|
+
exist" state. Treat it as a transient registry/network reachability issue, a
|
|
595
|
+
mistyped package name, or a request for a version that does not exist: confirm
|
|
596
|
+
the spelling, check `npm view @stelis/say-ur-intent version`, retry after any
|
|
597
|
+
registry/proxy outage clears, and ensure no private/alternate npm registry is
|
|
598
|
+
configured. Developer Checkout Setup or `npm run release:check` remains an
|
|
599
|
+
option for testing local changes, not a substitute for an unpublished package.
|
|
546
600
|
|
|
547
601
|
## Client Snippets
|
|
548
602
|
|
|
@@ -4,10 +4,10 @@ This document defines the contract boundary for wallet-review adapters.
|
|
|
4
4
|
It is a product and implementation contract, not a current feature announcement.
|
|
5
5
|
|
|
6
6
|
The current release can build local unsigned transaction material for the
|
|
7
|
-
account-bound DeepBook swap review
|
|
8
|
-
digest to that stored material. The byte handoff to the
|
|
9
|
-
is gated on recomputed-digest equality, and the review page
|
|
10
|
-
user-controlled wallet signing with execution receipts recorded on the
|
|
7
|
+
account-bound DeepBook swap and FlowX swap review stages and internally bind a
|
|
8
|
+
Sui transaction digest to that stored material. The byte handoff to the
|
|
9
|
+
same-machine browser is gated on recomputed-digest equality, and the review page
|
|
10
|
+
offers user-controlled wallet signing with execution receipts recorded on the
|
|
11
11
|
session. No MCP tool returns
|
|
12
12
|
transaction bytes, signing data, signing readiness, executable transaction
|
|
13
13
|
material, or payment execution readiness.
|
|
@@ -18,7 +18,7 @@ The source-level schema for this contract lives in
|
|
|
18
18
|
## Current Status
|
|
19
19
|
|
|
20
20
|
The contract schema is implemented in TypeScript and Zod, and the runtime
|
|
21
|
-
DeepBook account-bound swap
|
|
21
|
+
DeepBook and FlowX account-bound swap reviews emit it. When an account-bound review
|
|
22
22
|
completes every evidence stage (local unsigned transaction material, internal
|
|
23
23
|
digest commitment, object ownership, quote/policy provenance, human-readable
|
|
24
24
|
review facts, and review-time simulation), the review layer assembles those
|
|
@@ -118,11 +118,12 @@ and it serves the same-machine browser only. After the gate passes, the
|
|
|
118
118
|
review page requests the wallet signature; the signature, execution, and
|
|
119
119
|
receipt stay user-controlled and never flow through the MCP layer.
|
|
120
120
|
|
|
121
|
-
The current release builds local unsigned DeepBook swap
|
|
122
|
-
inside account-bound review, binds a Sui transaction digest
|
|
123
|
-
material, hands the digest-verified bytes to the same-machine
|
|
124
|
-
lets the user sign and execute in their wallet with the receipt
|
|
125
|
-
the review session. The MCP layer never requests signatures or
|
|
121
|
+
The current release builds local unsigned DeepBook swap and FlowX swap
|
|
122
|
+
transaction material inside account-bound review, binds a Sui transaction digest
|
|
123
|
+
to the stored material, hands the digest-verified bytes to the same-machine
|
|
124
|
+
browser, and lets the user sign and execute in their wallet with the receipt
|
|
125
|
+
recorded on the review session. The MCP layer never requests signatures or
|
|
126
|
+
executes.
|
|
126
127
|
|
|
127
128
|
## Adapter Contract
|
|
128
129
|
|
|
@@ -275,6 +276,17 @@ emitted wallet review contract as `reviewState.ptbVisualization`. PTB
|
|
|
275
276
|
visualization stays visualization-only evidence: it is not a runtime
|
|
276
277
|
transaction builder, not wallet handoff, and not a signing-readiness surface.
|
|
277
278
|
|
|
279
|
+
The producer emits the Mermaid flowchart as two parallel streams. `mermaid.text`
|
|
280
|
+
keeps raw package addresses for audit and copy. `mermaid.namedText` is a second
|
|
281
|
+
relabeled stream produced by `applyContractNamesToMermaid`
|
|
282
|
+
(`src/core/action/ptbVisualizationProducer.ts`,
|
|
283
|
+
`src/core/action/contractNameRegistry.ts`): it labels registered packages
|
|
284
|
+
(`@deepbook/core`; the Sui framework `std`/`sui`/`sui_system`) and well-known
|
|
285
|
+
objects (`SuiSystemState`, `Clock`, `Random`, `DenyList`, `CoinRegistry`,
|
|
286
|
+
`AccumulatorRoot`) while keeping the raw addresses available. These names are a
|
|
287
|
+
display label, not a safety, ownership, or trust signal, and the on-chain Move
|
|
288
|
+
Registry name is not yet verified on chain.
|
|
289
|
+
|
|
278
290
|
## Adapter Registration And Stage Vocabulary
|
|
279
291
|
|
|
280
292
|
Review adapters register through `ReviewAdapterDescriptor` entries in
|
package/docs/UTILITY_INDEX.md
CHANGED
|
@@ -44,6 +44,31 @@ Source-checkout scripts are not packaged product commands, MCP tools, review-tim
|
|
|
44
44
|
| Sui GraphQL function filter probe | `npm exec -- tsx scripts/sui-graphql-function-filter-probe.ts [--endpoint <mainnet-graphql-url>] [--sample-size <1-50>] [--timeout-ms <ms>]` | Manual, source evidence only | Runs a read-only Sui mainnet GraphQL source-shape probe for function-filter diagnostics; see notes below. |
|
|
45
45
|
| Sui CLI transaction diagnostics | `npm exec -- tsx scripts/sui-cli-transaction-diagnostics.ts -- --help` | Manual, source checkout only | Allowlisted local `sui` CLI debug evidence. See notes below. |
|
|
46
46
|
|
|
47
|
+
## Mainnet Read Smoke
|
|
48
|
+
|
|
49
|
+
This is a manual maintainer check for a specific mainnet provider. Normal quickstart use does not require Sui endpoint setup. Run it for people operating releases or debugging mainnet read shape.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
export SUI_GRPC_URL="https://fullnode.mainnet.sui.io:443"
|
|
53
|
+
export SUI_GRAPHQL_URL="https://graphql.mainnet.sui.io/graphql" # optional override; default is the built-in mainnet GraphQL endpoint
|
|
54
|
+
export SMOKE_SUI_ADDRESS="0x..."
|
|
55
|
+
export SMOKE_DEEPBOOK_POOL_KEY="DEEP_SUI"
|
|
56
|
+
export SMOKE_QUOTE_AMOUNT="1000000000" # raw integer units; for SUI, 1000000000 = 1 SUI
|
|
57
|
+
# Optional: export SMOKE_INSPECT_DIGEST="..."
|
|
58
|
+
# Optional: export SMOKE_INSPECT_RANDOM_LATEST="true"
|
|
59
|
+
npm run build
|
|
60
|
+
npm run smoke:mainnet
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`SUI_GRPC_URL` must be only scheme, host, and explicit port. Do not include credentials, a path, query string, or fragment.
|
|
64
|
+
`SMOKE_SUI_ADDRESS` must be a 32-byte hex Sui address, for example `0x` followed by 64 hex characters.
|
|
65
|
+
`SMOKE_INSPECT_DIGEST` is optional. Use a digest whose sender or returned balance-change owner is `SMOKE_SUI_ADDRESS` to exercise the stored digest-lookup path; otherwise the lookup can still return `ok` with `persistence.stored: false`.
|
|
66
|
+
`SMOKE_INSPECT_RANDOM_LATEST=true` is optional and only used when `SMOKE_INSPECT_DIGEST` is unset. It samples one digest from the latest GraphQL transaction page and calls `read.inspect_sui_transaction` without passing the smoke address. This checks current transaction-read shape without pinning a specific user address or exercising the stored relation path.
|
|
67
|
+
|
|
68
|
+
DeepBook orderbook and raw-quantity quote reads use an internal mainnet SDK simulation sender placeholder, not a user's wallet. The display-amount quote path is covered by automated tests, not by this smoke script. This smoke script does not exercise account-bound DeepBook transaction-material build or digest binding; that path needs a separate funded-account material-build smoke before smoke results are treated as product-grade proof for that review stage.
|
|
69
|
+
|
|
70
|
+
Wallet asset summaries and active-account activity summaries use the smoke address through a wallet identity session created by the smoke script. Browser wallet behavior is checked separately. This smoke script does not record raw GraphQL payloads, transaction bytes, signatures, raw transaction details, or compact transaction aggregates.
|
|
71
|
+
|
|
47
72
|
## Mainnet Read Smoke Notes
|
|
48
73
|
|
|
49
74
|
Run `npm run build` first because `npm run smoke:mainnet` executes `dist/runtime/smokeMainnetRead.js`.
|
package/docs/WALLET_IDENTITY.md
CHANGED
|
@@ -50,10 +50,11 @@ truth, shows it in the header, and never connects a wallet itself. For the
|
|
|
50
50
|
signing step it relies on dapp-kit autoconnect restoring the signer on the
|
|
51
51
|
same fixed-port origin where the wallet was connected. That review origin is a
|
|
52
52
|
single per-machine port (default 8765, overridable per registration with
|
|
53
|
-
SAY_UR_INTENT_REVIEW_PORT): when a
|
|
54
|
-
held by a
|
|
55
|
-
and
|
|
56
|
-
|
|
53
|
+
SAY_UR_INTENT_REVIEW_PORT): when a second Say Ur Intent instance finds the port
|
|
54
|
+
already held by a healthy Say Ur Intent review peer, it does not stop that peer
|
|
55
|
+
and does not start a port war; it defers to the peer on the shared origin and
|
|
56
|
+
takes the origin over only when that owner exits. A port held by any other
|
|
57
|
+
(non-Say-Ur-Intent) process is never taken over. The record is
|
|
57
58
|
read context and wallet preference only; it is not signing authorization.
|
|
58
59
|
|
|
59
60
|
## Status Model
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stelis/say-ur-intent",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"mcpName": "io.github.stelis-dev/say-ur-intent",
|
|
5
5
|
"description": "Say Ur Intent is a local-first toolkit for helping AI applications and users inspect Sui DeFi actions before execution.",
|
|
6
6
|
"license": "MIT",
|