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 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
- **Kira 0.2.2 is published on npm; this branch prepares 0.2.3.** Kira supplies wallet tools and a full-window
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
@@ -1,6 +1,6 @@
1
1
  # Kira tools for your agent
2
2
 
3
- Kira 0.2.0 provides one local application contract to the CLI, optional stdio
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 global `--data-dir` must precede the command:
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. Agents must leave passphrase entry to the human. OWS absence
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
- ## Candidate 0.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
- points to the currently published 0.2.2 guide until the next site update.
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
- Freeze the final archive from the validated, landed source and dry-run that
30
- exact archive. Release publication and website deployment remain operator
31
- actions. Preparation does not establish registry publication.
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.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
- if not registered or receipt.get('registration_requested') or any(j['key_hash']==digest(registration_key) for j in store.list()):
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kira-wallet",
3
- "version": "0.2.3",
3
+ "version": "1.0.0",
4
4
  "description": "Local wallet research for your agent session and a human-controlled web workspace.",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -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':'Awaiting analysis'}</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>`;
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'):'Analysis will appear here when it is ready.';
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):'Awaiting analysis';
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.'):'Analysis will appear here when it is ready.';}
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';}
@@ -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; await loadOws();
85
- $('ows-dialog').close(); navigate(result.job_id ? '#/activity' : '#/wallet/'+result.connection.address.toLowerCase());
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(); }