kira-wallet 0.2.3 → 1.0.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 +1 -4
- package/docs/AGENT_TOOLS.md +1 -1
- package/docs/CLI.md +5 -5
- package/docs/RELEASE.md +65 -6
- package/kira_ows.py +11 -1
- package/package.json +1 -1
- package/viewer/static/app.js +4 -4
- package/viewer/static/ows.js +4 -2
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ web app to manage wallets, inspect token markets and follow research. Your
|
|
|
15
15
|
existing AI agent can use the same records and actions through the Kira CLI or
|
|
16
16
|
optional MCP connection, then open the web app beside your conversation.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Kira supplies wallet tools and a full-window
|
|
19
19
|
management app. Your agent host manages its own conversations, models, files and
|
|
20
20
|
approvals. Kira does not launch a model CLI or require a model login.
|
|
21
21
|
|
|
@@ -29,9 +29,6 @@ npm install -g kira-wallet
|
|
|
29
29
|
kira setup
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
When installing a prepared release before publication, use its verified archive
|
|
33
|
-
instead of assuming the npm default already contains this branch.
|
|
34
|
-
|
|
35
32
|
1. **Connect Alchemy.** Follow the [setup guide](docs/ALCHEMY_SETUP.md). Run
|
|
36
33
|
`kira connect alchemy` in your terminal and enter the app key at the hidden
|
|
37
34
|
prompt. The key stays in a private local file. Existing environment or file
|
package/docs/AGENT_TOOLS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Kira tools for your agent
|
|
2
2
|
|
|
3
|
-
Kira
|
|
3
|
+
Kira provides one local application contract to the CLI, optional stdio
|
|
4
4
|
MCP adapter and human web controls. It supplies wallet logic and saved facts.
|
|
5
5
|
The host agent owns its model, conversation, general tools and approval flow.
|
|
6
6
|
No model process is launched by Kira.
|
package/docs/CLI.md
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
Kira is a local wallet engine, CLI and web interface. Any capable agent
|
|
4
4
|
can use the CLI; MCP is optional. Your agent host supplies its own model,
|
|
5
5
|
conversation, general tools and approvals. Kira does not start a model process.
|
|
6
|
-
Version 0.2.2 is published on npm. This source prepares 0.2.3.
|
|
7
6
|
|
|
8
7
|
## Install and choose a workspace
|
|
9
8
|
|
|
@@ -14,15 +13,13 @@ kira info --json
|
|
|
14
13
|
kira skill
|
|
15
14
|
```
|
|
16
15
|
|
|
17
|
-
Before this version is published, install the prepared package archive to try these
|
|
18
|
-
commands. The default registry install may still provide an earlier version.
|
|
19
16
|
Node.js 22+, Python 3.11+ and a POSIX host are required; macOS is verified.
|
|
20
17
|
The package includes the engine, browser assets and declared dependencies.
|
|
21
18
|
It excludes wallet records, credentials, conversations and logs.
|
|
22
19
|
|
|
23
20
|
The supported CLI uses `~/.local/share/kira-wallet`, independently of the
|
|
24
21
|
current directory or agent session. `KIRA_DATA_DIR` selects another workspace;
|
|
25
|
-
the equivalent
|
|
22
|
+
the equivalent `--data-dir` option also works before or after the command:
|
|
26
23
|
|
|
27
24
|
```sh
|
|
28
25
|
kira --data-dir /absolute/private/workspace info --json
|
|
@@ -245,6 +242,9 @@ Its optional SDK is `@open-wallet-standard/core` 1.4.3; the vault defaults to
|
|
|
245
242
|
passphrase in the local interface. Kira does not return private keys or seed
|
|
246
243
|
phrases. Recovery keeps the original passphrase and interrupted requests retain
|
|
247
244
|
their identity to prevent duplicate creation. Use OWS owner tools for backup
|
|
248
|
-
and recovery.
|
|
245
|
+
and recovery. A newly created wallet is registered and linked without starting
|
|
246
|
+
asset research. Use **Refresh holdings** when you want to check its assets.
|
|
247
|
+
Linking an existing, unregistered OWS wallet still starts its initial research.
|
|
248
|
+
Agents must leave passphrase entry to the human. OWS absence
|
|
249
249
|
does not block ordinary public-address onboarding. Kira exposes no signing,
|
|
250
250
|
trading, key export or account deletion.
|
package/docs/RELEASE.md
CHANGED
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
# Release preparation
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Release candidate: 1.0.0
|
|
4
|
+
|
|
5
|
+
The operator selected 1.0.0 on 2026-10-25. Version 0.2.3 remains the published
|
|
6
|
+
package while live acceptance and the final 1.0.0 archive are prepared. This
|
|
7
|
+
candidate keeps the research engine and saved-data formats from 0.2.3.
|
|
8
|
+
|
|
9
|
+
New OWS wallets are registered and linked without starting asset research.
|
|
10
|
+
Their holdings remain unchecked until an explicit holdings refresh. Linking an
|
|
11
|
+
existing unregistered wallet still starts initial research, and retries recover
|
|
12
|
+
older registration jobs without duplicating or restarting cancelled work.
|
|
13
|
+
The empty wallet screen explains the manual lookup instead of suggesting
|
|
14
|
+
that automatic research is pending. Post-creation navigation waits for saved
|
|
15
|
+
wallet state, and a failed descriptor reload keeps the same recovery request.
|
|
16
|
+
|
|
17
|
+
The 1.x compatibility commitment covers documented CLI commands and
|
|
18
|
+
options, the shared CLI/MCP tool names and documented request/response fields,
|
|
19
|
+
and access to existing wallets, jobs and saved observations. Incompatible
|
|
20
|
+
changes to these interfaces require a new major version. Compatible additions
|
|
21
|
+
use a minor version; compatible fixes use a patch version. Clients must tolerate
|
|
22
|
+
additional response fields. Observation values, provider availability, coverage,
|
|
23
|
+
prices and UI layout are not fixed by this commitment. Internal Python modules,
|
|
24
|
+
cache files and browser-only endpoints are not a supported integration API.
|
|
25
|
+
|
|
26
|
+
Live acceptance completed on the published 0.2.3 research engine, which is
|
|
27
|
+
byte-identical to this candidate. It verified preserved upgrade data, price-only
|
|
28
|
+
refresh and immutable history, browser-wallet connection, human-submitted OWS
|
|
29
|
+
creation, disconnect/reconnect and restart persistence. Optional sell analysis
|
|
30
|
+
reached its natural terminal state with all review targets checked and no
|
|
31
|
+
pending market work. Holdings and prior price evidence stayed unchanged.
|
|
32
|
+
Provider coverage gaps and unavailable quotes remain explicit unknowns.
|
|
33
|
+
|
|
34
|
+
The changed OWS registration flow passed isolated regressions for no automatic
|
|
35
|
+
research, explicit manual refresh, retries, interrupted writes, earlier-version
|
|
36
|
+
job recovery and preserved cancelled jobs. Browser checks with a synthetic
|
|
37
|
+
public descriptor verified the empty account, zero activity jobs and desktop
|
|
38
|
+
and mobile layouts. The OWS key-creation bridge is unchanged from the human
|
|
39
|
+
acceptance. Human grants and passphrases stayed outside the agent; acceptance
|
|
40
|
+
included no signing, trades, funding or key export.
|
|
41
|
+
|
|
42
|
+
The final source passed 265 engine tests, 70 viewer tests, all JavaScript
|
|
43
|
+
suites, clean package installation and lifecycle checks. The locked dependency
|
|
44
|
+
audit reported zero known vulnerabilities. Tracked-source privacy checks found
|
|
45
|
+
no private content; strict history findings are the previously recorded public
|
|
46
|
+
identity metadata and verified normal CLI merge metadata under the policy below.
|
|
47
|
+
The operator publishes the exact archive frozen from the landed source.
|
|
48
|
+
|
|
49
|
+
Installation guidance is version-independent so it does not claim that a
|
|
50
|
+
published package is still a candidate. Review not selected for this release
|
|
51
|
+
preparation; existing audit evidence is retained.
|
|
52
|
+
|
|
53
|
+
## Published 0.2.3
|
|
4
54
|
|
|
5
55
|
Research and price refresh share the Alchemy index fallback and DEX liquidity
|
|
6
56
|
checks. Insufficient or extremely one-sided DEX liquidity stays unpriced;
|
|
@@ -18,7 +68,7 @@ OWS registration retries recover the same admitted job after interrupted
|
|
|
18
68
|
worker launch or receipt storage, including requests saved by 0.2.2. Previously
|
|
19
69
|
registered wallets keep their names, and cancelled jobs remain cancelled.
|
|
20
70
|
Unused embedded-agent completion parsing is removed. The website setup link
|
|
21
|
-
|
|
71
|
+
remains pinned to the 0.2.2 guide until the next site update.
|
|
22
72
|
|
|
23
73
|
One independent review of the four audit PRs found a legacy OWS receipt recovery
|
|
24
74
|
gap, corrected with an upgrade regression. Final verification covers the full
|
|
@@ -26,9 +76,18 @@ suite, isolated installation, exact archive members, CLI/MCP price history and
|
|
|
26
76
|
source/history privacy checks. Synthetic checks do not claim live provider or
|
|
27
77
|
Gemini/Grok account acceptance.
|
|
28
78
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
79
|
+
The operator published 0.2.3 on 2026-10-25, and the npm `latest` tag resolves
|
|
80
|
+
to this version. Its archive was frozen from the landed merge commit
|
|
81
|
+
`7fcdb5eb13f4b4009e86b9880a4130a50721d233`. The registry archive is byte-identical
|
|
82
|
+
to the frozen one, SHA-256
|
|
83
|
+
`fa9b935e6ec410cb098c5caac11693d70da2da763b710093ced71872b2e15a73`.
|
|
84
|
+
The registry SHA-1 and SHA-512 integrity values also match. A fresh isolated
|
|
85
|
+
registry installation matched all 93 members with no extra package files.
|
|
86
|
+
Installed CLI and MCP price-history checks and local app startup and shutdown
|
|
87
|
+
passed with synthetic data, unchanged saved evidence and no research jobs.
|
|
88
|
+
The personal installation and workspace were not changed. Website deployment
|
|
89
|
+
remains a separate operator action. Review not selected for this
|
|
90
|
+
publication-record update.
|
|
32
91
|
|
|
33
92
|
## Published 0.2.2
|
|
34
93
|
|
|
@@ -191,7 +250,7 @@ The earlier unpublished 0.1.2 candidate is preserved in the ignored
|
|
|
191
250
|
`dist/preserved-0.1.2-bad8f02/` directory. Use the current `dist/release.json`
|
|
192
251
|
and its matching archive for publication; do not mix manifests from candidates.
|
|
193
252
|
|
|
194
|
-
Keep published GitHub tags, release assets and npm versions through 0.2.
|
|
253
|
+
Keep published GitHub tags, release assets and npm versions through 0.2.3
|
|
195
254
|
immutable. Do not rebuild them from later documentation commits. Future package
|
|
196
255
|
changes need a new version. Release preparation does not publish a GitHub
|
|
197
256
|
release, promote the website or publish to npm.
|
package/kira_ows.py
CHANGED
|
@@ -106,7 +106,17 @@ class OwsStore:
|
|
|
106
106
|
job=None
|
|
107
107
|
registration_key=str(uuid.uuid5(uuid.UUID(key),'ows-register'))
|
|
108
108
|
# Pre-intent receipts from older versions may already own a queued job.
|
|
109
|
-
|
|
109
|
+
pending_registration=receipt.get('registration_requested') or any(j['key_hash']==digest(registration_key) for j in store.list())
|
|
110
|
+
if create and not pending_registration:
|
|
111
|
+
address=store.normalize('wallet.add',{'address':address,'tag':tag})['address']
|
|
112
|
+
from wallet import register, registry_locked
|
|
113
|
+
with registry_locked(self.root):
|
|
114
|
+
registry=json.loads((self.root/'wallets.json').read_text())
|
|
115
|
+
registered=next((w for w in registry['wallets'] if w['address_key']==address.lower()),None)
|
|
116
|
+
if registered is None:
|
|
117
|
+
registered=register(registry,address,tag)
|
|
118
|
+
atomic(self.root/'wallets.json',registry)
|
|
119
|
+
elif not registered or pending_registration:
|
|
110
120
|
# Record intent before admission: submit can register the wallet
|
|
111
121
|
# before this process has saved its job ID or started a worker.
|
|
112
122
|
if not receipt.get('registration_requested'):
|
package/package.json
CHANGED
package/viewer/static/app.js
CHANGED
|
@@ -156,7 +156,7 @@ function renderHome(){
|
|
|
156
156
|
$('wallet-cards').innerHTML=state.wallets.map(w=>{
|
|
157
157
|
const count=w.mainnet_asset_count??w.assets.filter(a=>a.environment==='mainnet').length,unpriced=w.mainnet_unpriced_count??w.unpriced_count;
|
|
158
158
|
const value=w.analysed_at?w.known_value_usd:null;
|
|
159
|
-
return `<button class="wallet-card" data-wallet="${escapeHTML(w.key)}" aria-label="Open ${escapeHTML(w.name)} holdings"><span class="wallet-card-heading"><span class="card-wallet-icon">${walletGlyph}</span><span class="wallet-card-identity"><strong>${escapeHTML(w.name)}</strong><span>${escapeHTML(shortAddress(w.address))}</span></span><span class="card-arrow" aria-hidden="true">${arrowGlyph}</span></span><span class="wallet-card-value">${money(value)}</span><span class="wallet-card-meta"><span>${w.analysed_at?count+(count===1?' position · ':' positions · ')+unpriced+' unpriced':'
|
|
159
|
+
return `<button class="wallet-card" data-wallet="${escapeHTML(w.key)}" aria-label="Open ${escapeHTML(w.name)} holdings"><span class="wallet-card-heading"><span class="card-wallet-icon">${walletGlyph}</span><span class="wallet-card-identity"><strong>${escapeHTML(w.name)}</strong><span>${escapeHTML(shortAddress(w.address))}</span></span><span class="card-arrow" aria-hidden="true">${arrowGlyph}</span></span><span class="wallet-card-value">${money(value)}</span><span class="wallet-card-meta"><span>${w.analysed_at?count+(count===1?' position · ':' positions · ')+unpriced+' unpriced':'Not checked'}</span><span>${value!=null?share(value,s.known_value_usd)+' of priced value':''}</span></span>${progress(value,s.known_value_usd,w.name+' share of priced value')}</button>`;
|
|
160
160
|
}).join('');
|
|
161
161
|
$('network-allocation').innerHTML=s.networks.map(c=>`<a class="network-row" href="${networkHref(c.id)}" aria-label="Open ${escapeHTML(c.name)} network overview"><div class="network-row-heading"><span class="network-label">${chainIcon(c.name)}${escapeHTML(c.name)}<span class="detail-arrow" aria-hidden="true">${arrowGlyph}</span></span><span class="network-value">${money(c.value_usd)}</span></div><div class="network-row-meta"><span>${c.position_count} ${c.position_count===1?'position':'positions'}${c.value_usd==null?' · Unpriced':''}</span><span>${share(c.value_usd,s.known_value_usd)}</span></div>${progress(c.value_usd,s.known_value_usd,c.name+' share of priced value')}</a>`).join('')||'<p class="panel-empty">Networks appear after analysis.</p>';
|
|
162
162
|
if(typeof renderHomeTokens==='function')renderHomeTokens();
|
|
@@ -170,14 +170,14 @@ function renderWallet(){
|
|
|
170
170
|
$('report-link').hidden=!w.report_url;if(w.report_url)$('report-link').href=safeURL(w.report_url);
|
|
171
171
|
$('total-value').textContent=w.analysed_at?money(w.known_value_usd):'—';
|
|
172
172
|
const partial=w.chains.some(c=>c.environment==='mainnet'&&KiraView.coverageGap(c));
|
|
173
|
-
$('valuation-note').textContent=w.analysed_at?(partial?'Partial portfolio · ':'')+(w.known_value_usd==null?((w.asset_count??w.assets.length)?'Value is unknown because prices are unavailable.':'No positive holdings recorded · unchecked networks remain unknown.'):'Market and curve spot estimates · excludes unpriced assets'):'
|
|
173
|
+
$('valuation-note').textContent=w.analysed_at?(partial?'Partial portfolio · ':'')+(w.known_value_usd==null?((w.asset_count??w.assets.length)?'Value is unknown because prices are unavailable.':'No positive holdings recorded · unchecked networks remain unknown.'):'Market and curve spot estimates · excludes unpriced assets'):'No holdings lookup saved yet.';
|
|
174
174
|
$('asset-count').textContent=w.asset_count??w.assets.length;$('unpriced-count').textContent=w.unpriced_count+' unpriced';
|
|
175
175
|
const mainnets=w.chains.filter(c=>c.environment==='mainnet'&&c.lifecycle?.status!=='retired');
|
|
176
176
|
$('chain-count').textContent=mainnets.filter(c=>c.assets>0).length;
|
|
177
177
|
const coverage=mainnets.filter(c=>c.complete).length;
|
|
178
178
|
$('coverage-note').textContent='Token discovery: '+coverage+' of '+mainnets.length+' mainnets checked';
|
|
179
179
|
$('coverage-note').title='Token discovery and on-chain balance checks are separate. See network coverage details for failures.';
|
|
180
|
-
$('sync-label').textContent=w.analysed_at?'Analysis '+stamp(w.analysed_at):'
|
|
180
|
+
$('sync-label').textContent=w.analysed_at?'Analysis '+stamp(w.analysed_at):'Not checked';
|
|
181
181
|
$('price-time').textContent=w.prices_at?'Prices '+stamp(w.prices_at):'';
|
|
182
182
|
const chainOptions=w.chains.filter(c=>c.assets>0||KiraView.coverageGap(c));
|
|
183
183
|
if(selectedChain!=='all'&&!chainOptions.some(c=>String(c.id)===selectedChain))selectedChain='all';
|
|
@@ -311,7 +311,7 @@ function renderHoldings(){
|
|
|
311
311
|
const c=w.chains.find(c=>String(c.id)===selectedChain);
|
|
312
312
|
$('empty').querySelector('h3').textContent=c&&!c.complete?'Research is incomplete on '+c.name:'No assets in this view';
|
|
313
313
|
$('empty').querySelector('p').textContent=c&&!c.complete?'This chain has not been fully checked. Missing data does not mean a zero balance.':'Choose another chain or lower the minimum value.';
|
|
314
|
-
}else{$('empty').querySelector('h3').textContent=w.analysed_at&&!(w.asset_count??w.assets.length)?'No holdings recorded':'No assets in this view';$('empty').querySelector('p').textContent=w.analysed_at?(!(w.asset_count??w.assets.length)?'No positive balances were found in the checked networks. Refresh holdings to check again.':'Choose another chain or lower the minimum value.'):'
|
|
314
|
+
}else{$('empty').querySelector('h3').textContent=w.analysed_at&&!(w.asset_count??w.assets.length)?'No holdings recorded':'No assets in this view';$('empty').querySelector('p').textContent=w.analysed_at?(!(w.asset_count??w.assets.length)?'No positive balances were found in the checked networks. Refresh holdings to check again.':'Choose another chain or lower the minimum value.'):'Your wallet is saved. Use Refresh holdings to check its assets.';}
|
|
315
315
|
bindImages();
|
|
316
316
|
}
|
|
317
317
|
function timeRange(range){return range?.from?stamp(range.from)+(range.to!==range.from?' – '+stamp(range.to):''):'Not recorded';}
|
package/viewer/static/ows.js
CHANGED
|
@@ -81,8 +81,10 @@ async function submitOws(create, event) {
|
|
|
81
81
|
try {
|
|
82
82
|
const result = await localAPI(create ? '/api/ows/create' : '/api/ows/connect', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(request), signal: AbortSignal.timeout(75000)});
|
|
83
83
|
delete request.passphrase;
|
|
84
|
-
owsRequest = null; saveOwsRequest(); owsSelected = null;
|
|
85
|
-
|
|
84
|
+
await loadOws(); owsRequest = null; saveOwsRequest(); owsSelected = null;
|
|
85
|
+
if (!result.job_id) await poll();
|
|
86
|
+
const address = result.connection.address.toLowerCase();
|
|
87
|
+
$('ows-dialog').close(); navigate(result.job_id ? '#/activity' : state?.wallets?.some(wallet => wallet.key === address) ? '#/wallet/'+address : '#/home');
|
|
86
88
|
toast(result.note);
|
|
87
89
|
} catch (error) { delete request.passphrase; $('ows-error').textContent = error.message; }
|
|
88
90
|
finally { owsBusy = false; renderOws(); }
|