kira-wallet 0.1.0 → 0.1.3

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 (42) hide show
  1. package/README.md +109 -90
  2. package/THIRD_PARTY_NOTICES.md +17 -0
  3. package/curve_pricing.py +6 -2
  4. package/docs/AGENT_TOOLS.md +36 -27
  5. package/docs/CLI.md +74 -17
  6. package/docs/KIRA_LIVE_QA.md +154 -0
  7. package/docs/ONBOARDING_CHAT_CONTRACT.md +33 -2
  8. package/docs/RELEASE.md +94 -25
  9. package/kira_agent.py +220 -21
  10. package/kira_cli.py +30 -12
  11. package/kira_config.py +9 -5
  12. package/kira_jobs.py +4 -2
  13. package/kira_ows.py +114 -0
  14. package/kira_research_tools.py +105 -0
  15. package/native_assets.py +56 -0
  16. package/onchain.cjs +28 -4
  17. package/ows_bridge.cjs +26 -0
  18. package/package.json +14 -5
  19. package/pipeline-onchain.cjs +6 -3
  20. package/viewer/README.md +22 -5
  21. package/viewer/details.py +8 -0
  22. package/viewer/model.py +65 -8
  23. package/viewer/onboarding.py +13 -0
  24. package/viewer/refresh_prices.py +41 -10
  25. package/viewer/server.py +35 -6
  26. package/viewer/static/agent.js +40 -14
  27. package/viewer/static/app.js +51 -20
  28. package/viewer/static/chat-workspace.css +120 -0
  29. package/viewer/static/chat-workspace.js +84 -0
  30. package/viewer/static/index.html +42 -26
  31. package/viewer/static/jobs.js +6 -5
  32. package/viewer/static/markdown.js +64 -0
  33. package/viewer/static/ows-logo.svg +24 -0
  34. package/viewer/static/ows.js +98 -0
  35. package/viewer/static/report.css +135 -0
  36. package/viewer/static/report.js +35 -0
  37. package/viewer/static/selects.js +44 -0
  38. package/viewer/static/watching.js +11 -0
  39. package/viewer/static/workspace.css +7 -0
  40. package/viewer/static/workspace.js +28 -37
  41. package/viewer/token_images.py +69 -7
  42. package/wallet.py +8 -2
package/README.md CHANGED
@@ -1,116 +1,135 @@
1
- # Kira Wallet
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/realproject7/kira-wallet/v0.1.2/viewer/static/kira-explain.png" width="140" alt="Kira, your wallet research partner">
3
+ </p>
2
4
 
3
- A local EVM wallet research workspace with Kira and durable research jobs.
4
- It records direct holdings, Mint Club bonding curves and DEX liquidity evidence.
5
- Missing coverage and prices stay unknown.
5
+ <h1 align="center">Kira Wallet</h1>
6
+ <p align="center"><strong>Manage your wallets. With your own AI.</strong></p>
7
+ <p align="center">
8
+ <a href="https://kirawallet.app">Website</a> ·
9
+ <a href="https://github.com/realproject7/kira-wallet/releases">Releases</a> ·
10
+ <a href="docs/CLI.md">CLI guide</a>
11
+ </p>
6
12
 
7
- Original code and character assets are open source under MIT. Third-party
8
- references retain their own terms; see [notices](THIRD_PARTY_NOTICES.md). The npm
9
- first npm publication is prepared for the operator. No signing, transfers or trades
10
- are implemented.
13
+ Bring the AI you already use to your wallets. Add public wallet addresses, see
14
+ what you hold across supported EVM chains, and ask Kira to research your tokens
15
+ or refresh your holdings. Kira runs on your computer and uses your existing
16
+ Codex or Claude Code account.
11
17
 
12
- ## Local installation
18
+ ![Kira portfolio overview with network allocation and research priorities](docs/screenshots/kira-readme-overview.jpg)
13
19
 
14
- Requirements: Node.js 22 or newer and Python 3.11 or newer. macOS is verified.
15
- Analysis and daemon lifecycle currently require POSIX process and file-lock APIs.
20
+ ## Get started
21
+
22
+ **Requires Node.js 22+ and Python 3.11+. macOS is verified.** The research and
23
+ background-process features require a POSIX environment.
24
+
25
+ Install Kira:
16
26
 
17
27
  ```sh
18
- npm install --ignore-scripts
19
- node bin/kira.cjs init
20
- node bin/kira.cjs doctor
21
- node bin/kira.cjs setup
28
+ npm install -g kira-wallet
29
+ kira setup
22
30
  ```
23
31
 
24
- The viewer starts at http://127.0.0.1:8787. Data defaults to
25
- `~/.local/share/kira-wallet`, separate from the installed package. Use
26
- `--data-dir /absolute/private/directory` before the command for another portfolio.
27
- The existing workspace viewer can still run at port 8765.
32
+ Open the local app at [127.0.0.1:8787](http://127.0.0.1:8787).
28
33
 
29
- For an isolated sample with synthetic data:
34
+ After your first setup, open Kira with:
30
35
 
31
36
  ```sh
32
- node bin/kira.cjs --data-dir /tmp/kira-sample demo --port 8790
33
- node bin/kira.cjs --data-dir /tmp/kira-sample stop
37
+ kira start
34
38
  ```
35
39
 
36
- ## Research
40
+ It starts your local app and opens the browser. Use `kira stop` to stop it.
41
+ For a viewer without wallet or research actions, use `kira start --read-only`.
42
+
43
+ Prefer an archive? [GitHub releases](https://github.com/realproject7/kira-wallet/releases/tag/v0.1.2)
44
+ include the same package and its checksum.
45
+
46
+ 1. **Add a watching wallet.** Paste a public address and give it a name. Add more
47
+ wallets whenever you need them.
48
+ 2. **Set up discovery.** In **Workspace settings**, connect an indexer for broad
49
+ ERC20 discovery. Public RPC alone has limited discovery; incomplete coverage
50
+ stays visible.
51
+ 3. **Connect your AI.** Install and sign in to the
52
+ [Codex CLI](https://developers.openai.com/codex/cli) or
53
+ [Claude Code](https://code.claude.com/docs/en/quickstart), then choose your
54
+ account from **Connect a model** in Kira Chat. Select one wallet or your whole
55
+ portfolio, test the connection, and choose whether to allow research tools.
56
+ 4. **Ask Kira.** Start with a question, or ask it to refresh a wallet's holdings
57
+ or prices. Follow the job in **Activity** while it runs.
58
+
59
+ Want to look around first? Try the demo:
37
60
 
38
61
  ```sh
39
- kira add <operator-supplied-address> --tag '<exact tag>'
40
- kira refresh '<registered address or tag>'
41
- kira prices '<registered address or tag>'
62
+ kira --data-dir /tmp/kira-demo demo --port 8790
42
63
  ```
43
64
 
44
- From source, substitute `node bin/kira.cjs` for `kira`. Commands create private
45
- runtime data. The viewer detects local updates within five seconds; it does
46
- not poll providers. Resume a failed analysis with the same command and
47
- `--resume <relative snapshot directory>`.
65
+ Open [127.0.0.1:8790](http://127.0.0.1:8790). Stop it with
66
+ `kira --data-dir /tmp/kira-demo stop`.
67
+
68
+ ## What can I ask?
69
+
70
+ - “Which chains do I have ETH worth $10 or more on?”
71
+ - “Find tokens I may have overlooked. Show their quantity, recorded price,
72
+ market venues and any available full-balance exit quote.”
73
+ - “Review my Blast holdings across all my wallets. What is known, and where
74
+ is coverage missing?”
75
+ - “Compare my saved analyses. What changed?”
76
+ - “Refresh prices for my daily wallet, then tell me what the job actually found.”
77
+
78
+ Kira can read approved records, compare saved analyses, and start holdings or
79
+ price research when you enable its wallet tools. It distinguishes recorded spot
80
+ value from an execution quote. Missing prices and holdings stay unknown;
81
+ transfer inactivity needs transfer-history evidence. Testnets and pool liquidity
82
+ are excluded from your portfolio's USD value.
48
83
 
49
- The engine checks official Mint Club deployment scope, discovers indexed held
50
- tokens when configured, pins chain reads to blocks, enumerates reachable bond
51
- registries, queries ERC20 and registered ERC1155 token ID 0 balances, records
52
- curve reserves and burn quotes, and verifies supported DEX pool contracts.
53
- Shared caches contain asset identities, never another wallet's balances.
54
- Registry publication is atomic and analysis writers are serialized.
84
+ ![USDC markets and balances by wallet with matching Kira analysis](docs/screenshots/kira-readme-markets.jpg)
55
85
 
56
- Public RPC can read native balances, known tokens and reachable bond registries.
57
- General ERC20 discovery requires an indexed provider and successful responses.
58
- Testnets, pool TVL and shared curve backing are excluded from wallet USD totals.
59
- Spot value is distinct from an executable redemption estimate.
86
+ *Markets, paired token logos and each wallet's balance in one view.*
60
87
 
61
- See [CLI and provider configuration](docs/CLI.md) and
62
- [viewer behavior](viewer/README.md). Development reports, design concepts and
63
- generation records remain in the source checkout under `docs/` and `prototype/`.
88
+ ## Your wallets, your controls
64
89
 
65
- ## Verification
90
+ - **Watch an existing wallet** using its public address. Watching does not grant
91
+ Kira permission to spend.
92
+ - **Create an OWS wallet** with **Create wallet** in the sidebar, powered by
93
+ [Open Wallet Standard](https://openwallet.sh/).
94
+ Enter the encryption passphrase in the local form. Kira connects the public
95
+ EVM account; keys stay in the local OWS vault.
96
+ - **Choose what AI can see.** Wallet access can be off, limited to one wallet,
97
+ or cover your portfolio. Approved context is sent through your selected
98
+ native CLI and model account. Their data policies still apply.
99
+ - **Keep records locally.** No Kira account or hosted portfolio database is
100
+ required. Chat drafts stay in memory; saving Kira chat history is opt-in.
101
+
102
+ Chat currently handles research and wallet records. Signing, transfers and trade
103
+ execution are not implemented. [Wallet onboarding details](docs/CLI.md#browser-and-local-ows-wallets).
104
+
105
+ ## Useful commands
106
+
107
+ ```sh
108
+ kira add <public-address> --tag 'Daily wallet'
109
+ kira refresh 'Daily wallet'
110
+ kira prices 'Daily wallet'
111
+ kira status
112
+ kira stop
113
+ ```
114
+
115
+ Data defaults to `~/.local/share/kira-wallet`, separate from the installed
116
+ package. Use `--data-dir /absolute/private/directory` before a command to choose
117
+ another workspace. For connection, model or provider help, see the
118
+ [CLI guide](docs/CLI.md) and [viewer guide](viewer/README.md).
119
+
120
+ ## Build and contribute
66
121
 
67
122
  ```sh
123
+ npm install --ignore-scripts
124
+ node bin/kira.cjs setup
68
125
  npm test
69
- node --check pipeline-onchain.cjs
70
- node --check onchain.cjs
126
+ python3 scripts/check-public.py
71
127
  ```
72
128
 
73
- UI changes also require responsive browser and keyboard checks. Installation
74
- checks must use a fresh directory without operator credentials or data.
75
-
76
- ## Durable local workspace
77
-
78
- Development build 0.1.0-dev.2 adds persisted research jobs and opt-in protected
79
- browser controls. Start with `kira start --controls`; the usual start stays
80
- read-only. CLI and browser use the same typed job service for research, exact
81
- wallet names and connection references. Jobs preserve prior results, retain
82
- partial evidence and require explicit interruption recovery. Price jobs keep
83
- immutable overlays. Saved analyses can be compared with exact decimal balance
84
- changes and missing records remain unknown.
85
-
86
- `kira tools` is a read-only local MCP adapter, with no automatic account or
87
- model connection. See [CLI usage](docs/CLI.md), [job contract](docs/JOB_CONTRACT.md),
88
- [tool setup gate](docs/AGENT_TOOLS.md) and [continuation evidence](docs/KIRA_JOBS_BUILD_REPORT.md).
89
-
90
- ## Kira research workspace
91
-
92
- The workspace places Kira's local briefing and connected conversation
93
- beside the evidence. The brand link returns Home. Overview, All tokens
94
- and Activity have distinct tabs; wallet controls stay together. On small
95
- screens, switch directly between Portfolio and Kira.
96
-
97
- All tokens uses existing recorded aggregates with chain-plus-contract identity,
98
- search, network and pricing filters, and 50 rows per page. It does not query
99
- providers. Activity separates active work from persisted job history and shows
100
- state, elapsed time, last progress and recovery controls. Missing progress does
101
- not silently turn a running job into a completed or failed job.
102
-
103
- Run `kira setup` to connect your installed Codex or Claude Code CLI account.
104
- Choose no wallet context, one registered wallet or the whole portfolio. A real
105
- response check verifies the selected model before permissions are saved. Drafts
106
- stay in memory. Kira-local conversation retention is opt-in; provider and native
107
- CLI policies remain separate. Context or model changes start a fresh conversation.
108
- Chat does not sign, trade or automatically start research. See the
109
- [onboarding and conversation contract](docs/ONBOARDING_CHAT_CONTRACT.md), the
110
- [redesign report](docs/KIRA_REDESIGN_REPORT.md) and
111
- [agreed wallet capability direction](docs/WALLET_CAPABILITIES.md).
112
-
113
- For a contribution, use synthetic data and run `python3 scripts/check-public.py`
114
- before a push. Never attach a personal portfolio screenshot, registry, snapshot,
115
- job, credential, local path or log to an issue or PR. Repository history uses a
116
- public noreply identity. The `kira-workspace-v1` tag preserves the prior UI.
129
+ From source, use `node bin/kira.cjs` in place of `kira`.
130
+ [Local AI tool setup](docs/AGENT_TOOLS.md) ·
131
+ [Release preparation](docs/RELEASE.md).
132
+
133
+ Original code and Kira character assets are available under the [MIT license](LICENSE).
134
+ Third-party artwork and references retain their own terms; see
135
+ [Third-party notices](THIRD_PARTY_NOTICES.md).
@@ -11,3 +11,20 @@ license does not relicense them.
11
11
  [Mint Club](https://github.com/Steemhunt/mint.club-v2-contract).
12
12
  - Installed dependencies retain their package licenses. Remote token and chain
13
13
  artwork is referenced from its provider; the app does not claim ownership.
14
+ - Native coin prices and artwork reference [CoinGecko market metadata](https://docs.coingecko.com/reference/coins-markets).
15
+ Provider availability and rate limits apply. Artwork belongs to the respective projects.
16
+
17
+ Open Wallet Standard Node SDK (`@open-wallet-standard/core` 1.4.3) and its
18
+ optional platform bindings are distributed under MIT by their upstream owner.
19
+ The SDK is an optional dependency used for human-submitted encrypted wallet
20
+ creation and public account listing. See
21
+ [Open Wallet Standard](https://github.com/open-wallet-standard/core).
22
+
23
+ The official Open Wallet Standard wordmark in `viewer/static/ows-logo.svg` and
24
+ `site/assets/ows-logo.svg` is copied unchanged from
25
+ [openwallet.sh](https://openwallet.sh/footer-logo.svg). CSS displays its original
26
+ white artwork in black on light backgrounds. The mark belongs to its owner and
27
+ identifies the OWS wallet-creation integration without implying endorsement.
28
+ Its retrieval date and source digest are in `site/assets/ows-artwork-source.json`.
29
+
30
+ CASHCAT, BLAST and USDB artwork in the public reconstructed demo comes from lpTOKEN.fun token metadata, DEX Screener and CoinGecko. Token marks belong to their respective owners and identify the assets without implying affiliation or endorsement. The source URLs and chain-specific contract identities are recorded in `site/assets/token-artwork-sources.json`.
package/curve_pricing.py CHANGED
@@ -17,11 +17,15 @@ def resolve(graph, prices):
17
17
  if key in seen:return None
18
18
  existing=known.get(key)
19
19
  node=nodes.get(key)
20
- if existing and existing.get('usd') is not None and existing.get('quality')!='unreliable':
20
+ unfunded=node and not node.get('error') and node.get('is_curve') and node.get('funded') is False
21
+ if existing and existing.get('usd') is not None and existing.get('quality') not in ('unfunded','unreliable') and (existing.get('basis')!='Curve spot' or not unfunded):
21
22
  cache[key]=existing;return existing
22
23
  if not node or node.get('error') or not node.get('is_curve'):return None
23
24
  if not node['funded']:
24
- return {'chain_id':key[0],'address':node['address'],'usd':None,'basis':'Curve spot','quality':'unfunded'}
25
+ record={'chain_id':key[0],'address':node['address'],'usd':None,'basis':'Curve spot','quality':'unfunded',
26
+ 'curve_reserve':node.get('curve_reserve'),'source':node.get('source'),
27
+ 'observed_at':node.get('observed_at'),'block_number':node.get('block_number')}
28
+ cache[key]=record;return record
25
29
  parent=visit((key[0],node['reserve_token'].lower()),seen|{key})
26
30
  if not parent or parent.get('usd') is None:return None
27
31
  usd=float(node['price_in_reserve'])*parent['usd']
@@ -24,30 +24,39 @@ args = ["--data-dir", "<private-portfolio>", "tools"]
24
24
  Replace the placeholder locally. Do not commit portfolio paths or credentials.
25
25
  Kira does not edit the operator's Codex configuration automatically.
26
26
 
27
- ## Account connection gate
28
-
29
- The browser's Kira notes remain deterministic. Connected chat, OAuth handling
30
- and conversation reconnect are not delivered by this adapter.
31
-
32
- Before connecting a Kira-owned model session, the operator must select the
33
- account/authentication route and approve which portfolio facts may reach the
34
- model. The current official ChatGPT-plan app-server guide describes an app-owned
35
- OAuth access token, Responses provider configuration and token renewal. It does
36
- not establish this account's eligibility. Client registration, consent and
37
- login are operator actions. Do not copy desktop authentication files or use the
38
- internal-only external ChatGPT-token schema variant. No billing claim follows
39
- from a tool handshake or model catalog.
40
-
41
- After the gate, implement the selected auth route and app-server session driver
42
- with saved thread IDs, terminal turn states, reconnect and interruption. Keep
43
- those states distinct from engine jobs. Pin the installed protocol again and
44
- independently review permissions before connecting real private data.
45
-
46
- Sources checked on 2026-10-03:
47
-
48
- - [Official Codex app-server guidance](https://developers.openai.com/siwc/token-sharing-open-source/codex-app-server)
49
- - [Official Codex MCP guidance](https://learn.chatgpt.com/docs/extend/mcp?surface=cli)
50
- - [MCP stdio transport contract](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports)
51
-
52
- Local verification uses synthetic portfolios and a stdin transcript only.
53
- It does not verify a live Codex/MCP client connection or model access.
27
+ ## Connected Kira chat
28
+
29
+ The in-app conversation uses a supported installed Codex or Claude CLI account.
30
+ A generic response check is required before saving a selected provider, model,
31
+ wallet scope and research permission. It sends no wallet facts. Authentication
32
+ stays with the installed CLI. No desktop tokens or authentication files are copied.
33
+
34
+ With research enabled, a bounded host-mediated loop provides portfolio_read,
35
+ wallet_read, token_read, snapshots_list, snapshot_read, snapshots_compare,
36
+ job_list, job_read, holdings_refresh and prices_refresh. Every operation is
37
+ scoped to registered wallets allowed by the conversation. Historical reads use
38
+ normalized financial projections. Unknown values and historical quote times
39
+ remain explicit. Native shell, file, browser and MCP execution stay disabled.
40
+
41
+ Chain evidence includes explicit native balances, including observed zero,
42
+ their observation times and blocks, and registry scan blocks. Empty positive
43
+ holding inventories do not remove these observations. Saved-analysis reads
44
+ also retain snapshot price-reference values and times without provider URLs
45
+ or debug fields. A comparison flag can reflect observation or reference changes
46
+ without proving a balance change or a different set of checked networks.
47
+ Research job reads include the approved wallet identity directly.
48
+
49
+ Refresh tools admit typed durable engine jobs. Current scope and cancellation
50
+ are checked immediately before admission. Queued work is visible in Activity;
51
+ chat cancellation does not cancel engine work already accepted. Duplicate
52
+ refresh requests within one turn reuse the same job. At most eight tool calls,
53
+ 420 seconds and bounded context are permitted per turn. Existing configurations
54
+ keep their research permission off until explicitly enabled.
55
+
56
+ OWS create/list and browser wallet connection are human interfaces, not model
57
+ tools. The agent never receives passphrases, mnemonics, private keys or provider
58
+ credentials. Messages and approved wallet facts reach the selected model service
59
+ through the user's CLI; local storage does not imply an offline model.
60
+
61
+ See [the conversation contract](ONBOARDING_CHAT_CONTRACT.md).
62
+ The standalone stdio MCP adapter above remains read-only and separate.
package/docs/CLI.md CHANGED
@@ -1,21 +1,57 @@
1
1
  # CLI and provider configuration
2
2
 
3
- The npm package carries the Python engine, browser assets and declared viem
3
+ The package carries the Python engine, browser assets and declared viem
4
4
  dependency. It needs no Python packages and no sibling project. The package
5
5
  file list excludes wallets, snapshots, conversations, caches, logs and private settings.
6
- The first release is prepared as a tarball. Registry publication remains an
7
- operator action. The code and original character assets use the MIT license.
6
+ Install Kira from npm, then run `kira setup`:
7
+
8
+ ```sh
9
+ npm install -g kira-wallet
10
+ kira setup
11
+ ```
12
+
13
+ The npm registry currently offers version 0.1.2. The same archive and checksum
14
+ are available from the [GitHub release](https://github.com/realproject7/kira-wallet/releases/tag/v0.1.2).
15
+ Registry publication remains an operator action. The code and original character assets use the MIT license.
8
16
 
9
17
  ## Lifecycle
10
18
 
11
- `kira init` prepares an empty private data directory. `kira start --port 8787`
12
- starts a loopback-only read-only viewer. `kira status` identifies the managed
13
- instance. `kira stop` checks its live instance ID and OS process identity.
19
+ Use `kira setup` for your first setup. For everyday use, `kira start` starts
20
+ the local app with browser controls and opens it in your browser. The default
21
+ port is 8787. Use `--port` to choose another port, or `--no-open` to print the
22
+ URL without opening a browser. `kira status` identifies the managed instance.
23
+ `kira stop` checks its live instance ID and OS process identity before stopping it.
24
+
25
+ `kira init` prepares an empty private data directory. `kira start --read-only`
26
+ starts a loopback-only viewer without wallet or research actions.
14
27
  Another portfolio never silently reuses that server.
15
28
 
16
29
  `kira setup` starts the loopback viewer with local controls and opens its setup
17
30
  screen. Use `--no-open` to print its URL instead. If a read-only viewer is already
18
- running, stop it explicitly before setup. The normal `kira start` remains read-only.
31
+ running, stop it explicitly before setup or a normal start. Changing between
32
+ read-only and control modes requires an explicit stop and restart. Starting
33
+ an already-running app in the same mode reuses its URL. The old `--controls`
34
+ option remains accepted for existing scripts but is no longer needed.
35
+
36
+ These startup defaults apply from 0.1.3. In the published 0.1.2 package, use
37
+ `kira setup` or `kira start --controls` for the full app.
38
+
39
+ The 0.1.2 GitHub release starts with a wallet checklist. Add a public EVM
40
+ address or use the browser wallet picker. Registration starts one explicit
41
+ research job; follow it in Activity and read the saved portfolio report.
42
+ No signature, seed phrase or private key is needed.
43
+
44
+ Public RPC checks known assets and Mint Club. For broader ERC20 discovery,
45
+ open Research connections, select Alchemy and name the private environment
46
+ variable holding its key. Never paste the key into the browser. `kira doctor`
47
+ checks whether the configured key is available. Configuration alone does not
48
+ prove complete coverage; inspect the recorded results and gaps.
49
+
50
+ Connecting Codex or Claude is optional. Use Connect your AI when ready, verify
51
+ a generic response and explicitly choose context permissions. Assistant answers
52
+ render a safe Markdown subset; raw HTML, images and links remain inert text.
53
+ Install the 0.1.1 GitHub archive for this wallet-first setup. The npm registry's
54
+ 0.1.0 package continues to use the earlier account-first setup.
19
55
 
20
56
  ## Your model account
21
57
 
@@ -41,7 +77,7 @@ Kira-local history is opt-in and uses private `conversations/` files. With histo
41
77
  off, conversations and drafts stay in memory. A new server process starts a fresh
42
78
  conversation; saved files remain available locally and are not automatically
43
79
  replayed. Native CLI, administrator policy and provider data policies remain a
44
- separate trust boundary. Chat cannot sign, trade or automatically start research.
80
+ separate trust boundary. With wallet research enabled, Kira can read saved analyses, compare history and queue holdings or price updates. Jobs appear in Activity and continue independently of chat. Signing and trading stay outside the agent.
45
81
  See [the conversation contract](ONBOARDING_CHAT_CONTRACT.md).
46
82
 
47
83
  Global `--data-dir` precedes the command. `KIRA_DATA_DIR` provides the same
@@ -80,10 +116,7 @@ kira discovery alchemy --key-env ALCHEMY_API_KEY --explorers
80
116
  kira config show
81
117
  ```
82
118
 
83
- Custom mode disables public fallback by default. Add `--public-fallback` to
84
- explicitly enable it. That preference applies to all custom-mode chains.
85
- Chains without a configured endpoint remain unavailable while fallback is
86
- disabled. Plain HTTP is accepted only for loopback endpoints.
119
+ Public fallback is automatic for new configurations. A missing or failing custom endpoint uses verified public endpoints, including failures after the initial connection. Reads keep the selected block. `--custom-only` explicitly disables fallback; an existing opt-out is preserved. `--public-fallback` restores it. Plain HTTP is accepted only for loopback endpoints. Public RPC does not provide complete ERC20 discovery.
87
120
 
88
121
  Discovery is independent. Without an indexer, native and reachable Mint Club
89
122
  reads still run and general discovery stays incomplete. Configuring an RPC
@@ -129,9 +162,9 @@ cancelled jobs retain their last good result and unpublished evidence.
129
162
  interrupted jobs. Price jobs retain immutable overlays before updating the
130
163
  viewer projection. A viewer stop does not cancel research jobs.
131
164
 
132
- Start with `kira start --controls` to enable protected browser actions. The
133
- usual start remains read-only. Stop an existing read-only instance before
134
- starting one with controls. Actions need the local session and same origin.
165
+ Start with `kira start` to use protected browser actions. Use `--read-only`
166
+ for a viewer without those actions. Stop an existing instance before switching
167
+ modes. Actions need the local session and same origin.
135
168
  The supported URL uses 127.0.0.1. Browser controls offer wallet registration,
136
169
  exact names, holdings/price refresh, cancel/resume, saved analysis comparison,
137
170
  RPC references and discovery references. The synthetic demo cannot start
@@ -140,5 +173,29 @@ secrets and URLs remain outside the browser.
140
173
 
141
174
  Use `kira --data-dir <private-portfolio> tools` for the read-only stdio adapter.
142
175
  See [the tool guide](AGENT_TOOLS.md) and [job contract](JOB_CONTRACT.md).
143
- Connected chat still requires the operator's account setup and a later session
144
- integration. The local development package remains private and unlicensed.
176
+ Connected chat uses the native CLI account and approved context from setup.
177
+ The published package and original Kira assets are MIT licensed.
178
+
179
+ ## Browser and local OWS wallets
180
+
181
+ Use **Connect wallet** to choose an EIP-6963 browser wallet such as MetaMask.
182
+ The app shows the provider and public accounts, lets you review the account
183
+ before registering it, and provides **Disconnect from Kira**. Disconnecting does
184
+ not remove recorded wallets or revoke extension permissions. Without a browser
185
+ wallet, the chooser explains how to open this same local URL in a compatible
186
+ browser. A phone cannot reach another computer's loopback URL.
187
+
188
+ **Local OWS wallet** lists public EVM descriptors from Open Wallet Standard.
189
+ The optional pinned SDK is `@open-wallet-standard/core` 1.4.3. The vault defaults
190
+ to `~/.ows`; `KIRA_OWS_VAULT` selects another local vault. Creating a new wallet
191
+ requires a human-entered encryption passphrase and uses OWS's encrypted local
192
+ storage. Kira never returns the mnemonic or private key. Back up and recover
193
+ with OWS owner tools. Existing keys and tags are preserved.
194
+
195
+ A private owner receipt serializes creation across apps using the same vault.
196
+ Retrying an interrupted creation recovers its request identity instead of
197
+ creating a second wallet. The browser keeps only the public request identity
198
+ in session storage. It clears password fields immediately. Recovery keeps the
199
+ original encryption passphrase. No signing, key export or account deletion
200
+ endpoint is exposed. OWS absence does not block ordinary address or browser
201
+ wallet onboarding.
@@ -0,0 +1,154 @@
1
+ # Local live acceptance, 2026-10-05
2
+
3
+ The operator requested thorough local product testing while npm publication
4
+ remained unavailable. Testing used a separate empty workspace, the supplied
5
+ public watching address, a separate disposable encrypted OWS vault, configured
6
+ research providers and the installed native Claude CLI. Existing operator
7
+ workspaces and their conversations were preserved.
8
+
9
+ ## Real agent questions
10
+
11
+ Ten questions completed with real native model calls. One additional real turn
12
+ was deliberately stopped through the UI. The connection test is separate from
13
+ this count. No fixture response was substituted for a live answer.
14
+
15
+ | Case | Request | Observed result |
16
+ | --- | --- | --- |
17
+ | 1 | Research progress while the first wallet is still being scanned | Distinguished pending work from saved results and unknown balances. |
18
+ | 2 | Newly created wallet state and available actions | Found an incorrect duplicate-name explanation for an unregistered queued wallet. Fixed the lookup error. |
19
+ | 3 | Recheck wallet identity and native ETH by chain | Corrected the duplicate-name claim. Kept native ETH separate from ERC20 assets and testnets. |
20
+ | 4 | Dormant tokens, market prices, pools and possible sale proceeds | Returned dated balances, prices and recorded burn outputs. Did not invent inactivity or executable DEX quotes. |
21
+ | 5 | Blast mainnet versus Blast Sepolia | Kept networks and wallets separate. Did not infer ownership of popular tokens missing from the record. |
22
+ | 6 | LP ownership versus market links | Identified distinct unpriced token contracts without inventing LP redemption. Exposed an incorrect retraction caused by omitted market details. |
23
+ | 7 | Read specific token market details again | Verified recorded, displayed and omitted pool counts. Corrected the summary/detail misunderstanding after the projection fix. |
24
+ | 8 | Queue exactly one holdings refresh | Created one real durable job. Reported queued/running status without claiming it had already completed. |
25
+ | 9 | Verify the final publication and compare saved analyses | Located the published snapshot. Exposed ambiguous interpretation of coverage metadata and ERC20 versus native RPC checks. |
26
+ | 10 | Recheck ERC20 discovery versus native RPC coverage | Corrected the coverage interpretation and identified unknown native balances. Both snapshots retained the same per-chain completeness/availability flags. |
27
+
28
+ These were not uniformly correct on the first attempt. Cases 2, 6 and 9 drove
29
+ implementation changes and follow-up questions. Case 10 still described the
30
+ exact cause of metadata differences as a possibility rather than using the
31
+ comparison definition; its per-chain conclusion matched the records. Model
32
+ answers remain interpretations of recorded evidence.
33
+
34
+ ## Second question round
35
+
36
+ Ten additional Korean questions completed through the real native Claude CLI.
37
+ All ten received answers without a transport or model-process failure. This
38
+ does not mean every initial answer was factually correct. No new research job,
39
+ wallet, signature or trade was requested by this round.
40
+
41
+ | Case | Request | Observed result |
42
+ | --- | --- | --- |
43
+ | 1 | Mainnet totals, priced/unpriced counts and testnet exclusion | Counts and totals matched. Native observation times were missing from the supplied projection. |
44
+ | 2 | Same-symbol LP tokens and recorded market routes | Kept distinct contracts and quantities separate. Did not infer LP ownership or redemption from a market link. |
45
+ | 3 | Dormant tokens and full-balance disposal | Did not invent transfer history, inactivity or executable dollar proceeds. Preserved historical burn outputs. |
46
+ | 4 | ETH, WETH, Blast mainnet and Blast Sepolia | Kept identities, quantities and valuation scope separate. Exposed the same missing native observations. |
47
+ | 5 | Compare two saved analyses | Incorrectly described changes as timestamps only and treated an empty positive inventory as missing native evidence. |
48
+ | 6 | Verify the comparison flags | Corrected the flag interpretation, but normalized reads still omitted native observations and underlying reference values. |
49
+ | 7 | Read an unregistered wallet name | Returned wallet_not_registered. Did not substitute another wallet or invent a duplicate-name problem. |
50
+ | 8 | Detailed stablecoin markets and best exit | Distinguished recorded/displayed/omitted pools, quote-token prices and absent execution quotes. |
51
+ | 9 | Wallet-specific ERC20 discovery versus native RPC | Correctly separated coverage flags and known holdings from unknown networks. Native observation times remained omitted. |
52
+ | 10 | Chat capabilities and actual research completion | Correctly reported published partial jobs and unsupported creation/trading tools. Job-to-wallet identity required inference because the field was omitted. |
53
+
54
+ The follow-up fix includes explicit native balance observations, their times
55
+ and blocks, registry scan blocks and safe snapshot price-reference values.
56
+ An observed zero remains evidence without becoming a positive holding or
57
+ changing portfolio totals. Unavailable RPC balances remain null. Reference
58
+ source/debug fields remain excluded, including for mixed-case cbBTC references.
59
+ Scoped research job reads now name their approved wallet explicitly.
60
+
61
+ Two additional real questions verify the fix. One continued the original chat
62
+ and checked observations, reference changes and job identities. A separate
63
+ fresh-conversation test repeated the saved-analysis question without older
64
+ answers. Both returned the recorded zero/unknown distinction and correct
65
+ block/reference changes. The continued-chat check also matched every explicit
66
+ job-to-wallet identity. These verification questions are separate from the ten-case count.
67
+ Raw responses, original failures and financial evidence remain private.
68
+
69
+ The final regression suites passed 94 root Python tests and 46 viewer Python
70
+ tests, plus the declared Node and syntax checks. Two independent read-only
71
+ reviews checked the final projection delta. Their mixed-case reference finding
72
+ was corrected and rechecked.
73
+
74
+ ## Wallet and research flows
75
+
76
+ - Added the exact operator-supplied watching address through the real form,
77
+ review step and submission. The research job published after 4m 55s.
78
+ - Created a real encrypted wallet with the pinned OWS SDK through the protected
79
+ local creation endpoint. The disposable passphrase was generated in memory.
80
+ Replaying the same creation identity recovered the same wallet and job.
81
+ No plaintext passphrase was found in the test workspace files.
82
+ - Checked the creation UI and required password validation. No new credential
83
+ was entered through browser automation. Human passphrase entry remains a
84
+ separate device acceptance step.
85
+ - Exercised OWS disconnect, existing-wallet selection and public-account
86
+ relinking through the UI. These preserved the existing registered wallet.
87
+ - The new-wallet research and agent-requested refresh each published after
88
+ roughly 37 seconds. Both retained coverage gaps. Three real research jobs
89
+ were saved, with no duplicate refresh admission.
90
+ - Opened both saved analyses and ran the actual comparison UI. Missing records
91
+ remained unknown. Coverage observations and price references were separate
92
+ from token balance changes.
93
+ - Tested a fresh unregistered-wallet deep link. It now opens Activity instead
94
+ of an empty or stale wallet panel.
95
+
96
+ ## UI and design checks
97
+
98
+ Real browser checks covered Overview, watching and newly created wallet pages,
99
+ All tokens, Activity, token and network details, research notes, settings,
100
+ OWS forms, chat history, new chat, expanded chat and the mobile pane switch.
101
+ The actual browser sizes were 1728 by 941 and 537 by 941. The automation viewport
102
+ setting did not produce 390px, so phone-sized device acceptance is not claimed.
103
+
104
+ The catalog retained unpriced assets, supported testnet inclusion, reset search
105
+ pagination, paged after 50 rows and showed an explicit no-results state.
106
+ A token with many markets showed two pools initially and exposed all remaining
107
+ routes through disclosure. Token artwork loaded for the previously missing
108
+ contract. Token-specific wallet rows measured about 170px with a position and
109
+ 107px without one. Neither browser width had page-level horizontal overflow.
110
+
111
+ The chat header, separate floating composer and background remained aligned.
112
+ Opening hidden mobile chat now follows the latest answer. Switching away and
113
+ back preserves an existing reading position. Clicking the already-active pane
114
+ and resizing the composer do not discard that position. Draft text survived
115
+ page navigation. Deliberate Stop returned an editable draft and no late answer.
116
+ Research notes currently open as the plain Markdown export in another tab.
117
+
118
+ ## Fixes delivered
119
+
120
+ 1. Allow exact-host top-level navigation to the public HTML shell from a link.
121
+ Cross-site API, session, asset and mutation access remain rejected.
122
+ 2. Distinguish an absent wallet from multiple wallets sharing a name.
123
+ 3. Route missing/pending wallet details through Activity, including initial
124
+ state polling.
125
+ 4. Refresh custom dropdown labels after loading saved connection settings.
126
+ 5. Keep code spans opaque inside Markdown emphasis, including literal stars.
127
+ 6. Preserve recorded pool counts and summary notes in scoped agent reads.
128
+ Explain that omitted detail is available through a token-specific read.
129
+ 7. Display registered OWS names or pending connection tags instead of internal
130
+ creation identities, without changing wallet IDs or SDK names.
131
+ 8. Clarify empty holdings, ERC20 discovery versus native RPC availability, and
132
+ timestamp/block changes in comparison evidence.
133
+ 9. Follow the latest mobile answer initially while preserving historical
134
+ reading positions through pane switches and composer resizing.
135
+ 10. Retain scoped native zero/time/block observations and safe historical
136
+ price-reference evidence for accurate saved-analysis comparisons.
137
+ 11. Name the approved wallet in research job reads instead of requiring
138
+ inference from blocks or receipts.
139
+
140
+ ## Verification and release boundaries
141
+
142
+ `npm test` passed: 94 root Python tests, 46 viewer Python tests, all declared
143
+ Node suites and syntax checks. Independent backend and frontend reviewers
144
+ rechecked the final functional deltas. Their findings were fixed and verified.
145
+ A clean 71-member installation passed, including real encrypted OWS creation
146
+ with the pinned SDK and the installed viewer lifecycle. Package privacy checks
147
+ run before packing; the candidate manifest records the exact reviewed source commit.
148
+
149
+ The new candidate is 0.1.2. GitHub v0.1.1 and its archive remain immutable.
150
+ npm latest was still 0.1.0 when checked during this run. No registry publication,
151
+ PR merge, direct default-branch push or production deployment was performed.
152
+ Private screenshots, transcripts, wallet addresses and financial observations
153
+ remain outside the public source and package. The test vault received no funds,
154
+ and no signing or trading was performed.