@kaleidorg/mind 0.10.13 → 0.10.14
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/dist/context/rgb-units.d.ts +6 -0
- package/dist/context/rgb-units.d.ts.map +1 -1
- package/dist/context/rgb-units.js +21 -1
- package/dist/context/rgb-units.js.map +1 -1
- package/dist/fastpath/render.d.ts.map +1 -1
- package/dist/fastpath/render.js +8 -3
- package/dist/fastpath/render.js.map +1 -1
- package/package.json +1 -1
- package/src/context/rgb-units.ts +18 -1
- package/src/fastpath/render.test.ts +21 -0
- package/src/fastpath/render.ts +8 -3
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* balance as sats: the number must equal one of that asset's balances and the
|
|
10
10
|
* nearest ticker before it must be that asset's.
|
|
11
11
|
*/
|
|
12
|
+
/** On-chain spendable + in channels, in raw units; undefined when neither is reported. */
|
|
13
|
+
export declare function rgbHoldings(balance: unknown): {
|
|
14
|
+
onchain: number;
|
|
15
|
+
channels: number;
|
|
16
|
+
total: number;
|
|
17
|
+
} | undefined;
|
|
12
18
|
/** A raw RGB amount in display units, e.g. 1500000 at precision 6 → "1.5". */
|
|
13
19
|
export declare function formatRgbAmount(raw: number, precision: number): string;
|
|
14
20
|
/** Return a copy of `result` where every RGB asset carries `balance_display`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rgb-units.d.ts","sourceRoot":"","sources":["../../src/context/rgb-units.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"rgb-units.d.ts","sourceRoot":"","sources":["../../src/context/rgb-units.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQ9G;AAcD,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAiB5D;AAeD,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAkB/E"}
|
|
@@ -9,12 +9,29 @@
|
|
|
9
9
|
* balance as sats: the number must equal one of that asset's balances and the
|
|
10
10
|
* nearest ticker before it must be that asset's.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
// On-chain fields, plus the asset held in Lightning channels (`offchain_outbound`),
|
|
13
|
+
// which is where most RGB-LN users keep it.
|
|
14
|
+
const BALANCE_FIELDS = ['settled', 'spendable', 'future', 'offchain_outbound'];
|
|
15
|
+
/** On-chain spendable + in channels, in raw units; undefined when neither is reported. */
|
|
16
|
+
export function rgbHoldings(balance) {
|
|
17
|
+
if (!isObj(balance))
|
|
18
|
+
return undefined;
|
|
19
|
+
const onchainRaw = balance.spendable ?? balance.settled;
|
|
20
|
+
const channelsRaw = balance.offchain_outbound;
|
|
21
|
+
if (typeof onchainRaw !== 'number' && typeof channelsRaw !== 'number')
|
|
22
|
+
return undefined;
|
|
23
|
+
const onchain = typeof onchainRaw === 'number' ? onchainRaw : 0;
|
|
24
|
+
const channels = typeof channelsRaw === 'number' ? channelsRaw : 0;
|
|
25
|
+
return { onchain, channels, total: onchain + channels };
|
|
26
|
+
}
|
|
13
27
|
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
14
28
|
function asAsset(v) {
|
|
15
29
|
if (typeof v.ticker !== 'string' || !v.ticker || !isObj(v.balance))
|
|
16
30
|
return null;
|
|
17
31
|
const amounts = BALANCE_FIELDS.map((k) => v.balance[k]).filter((n) => typeof n === 'number');
|
|
32
|
+
const held = rgbHoldings(v.balance);
|
|
33
|
+
if (held && held.channels)
|
|
34
|
+
amounts.push(held.total);
|
|
18
35
|
if (!amounts.length)
|
|
19
36
|
return null;
|
|
20
37
|
const precision = typeof v.precision === 'number' && v.precision > 0 ? v.precision : 0;
|
|
@@ -42,6 +59,9 @@ export function annotateRgbBalances(result) {
|
|
|
42
59
|
if (typeof balance[k] === 'number')
|
|
43
60
|
display[k] = `${formatRgbAmount(balance[k], asset.precision)} ${asset.ticker}`;
|
|
44
61
|
}
|
|
62
|
+
const held = rgbHoldings(balance);
|
|
63
|
+
if (held?.channels)
|
|
64
|
+
display.total = `${formatRgbAmount(held.total, asset.precision)} ${asset.ticker}`;
|
|
45
65
|
out.balance_display = display;
|
|
46
66
|
}
|
|
47
67
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rgb-units.js","sourceRoot":"","sources":["../../src/context/rgb-units.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"rgb-units.js","sourceRoot":"","sources":["../../src/context/rgb-units.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/fastpath/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/fastpath/render.ts"],"names":[],"mappings":"AAoDA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAW1G"}
|
package/dist/fastpath/render.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* different shapes (aggregate wallet, kaleido-mcp, MockWallet), so each shape
|
|
4
4
|
* is read here instead of asking a model to describe it.
|
|
5
5
|
*/
|
|
6
|
-
import { formatRgbAmount } from '../context/rgb-units.js';
|
|
6
|
+
import { formatRgbAmount, rgbHoldings } from '../context/rgb-units.js';
|
|
7
7
|
const sats = (n) => `${Number(n ?? 0).toLocaleString('en-US')} sats`;
|
|
8
8
|
function parse(r) {
|
|
9
9
|
if (typeof r !== 'string')
|
|
@@ -38,8 +38,13 @@ function renderAssets(r) {
|
|
|
38
38
|
if (!list.length)
|
|
39
39
|
return "You don't hold any RGB assets yet.";
|
|
40
40
|
const rows = list.map((a) => {
|
|
41
|
-
const
|
|
42
|
-
const
|
|
41
|
+
const held = rgbHoldings(a.balance);
|
|
42
|
+
const fmt = (raw) => formatRgbAmount(raw, Number(a.precision) || 0);
|
|
43
|
+
const amount = !held
|
|
44
|
+
? 'balance unknown'
|
|
45
|
+
: held.channels
|
|
46
|
+
? `${fmt(held.total)} ${a.ticker} (${fmt(held.channels)} in channels, ${fmt(held.onchain)} on-chain)`
|
|
47
|
+
: `${fmt(held.total)} ${a.ticker}`;
|
|
43
48
|
return `- ${a.ticker}${a.name && a.name !== a.ticker ? ` (${a.name})` : ''}: ${amount}`;
|
|
44
49
|
});
|
|
45
50
|
return `Your RGB assets:\n${rows.join('\n')}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/fastpath/render.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/fastpath/render.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/context/rgb-units.ts
CHANGED
|
@@ -18,13 +18,28 @@ interface RgbAsset {
|
|
|
18
18
|
amounts: number[];
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
// On-chain fields, plus the asset held in Lightning channels (`offchain_outbound`),
|
|
22
|
+
// which is where most RGB-LN users keep it.
|
|
23
|
+
const BALANCE_FIELDS = ['settled', 'spendable', 'future', 'offchain_outbound'] as const;
|
|
24
|
+
|
|
25
|
+
/** On-chain spendable + in channels, in raw units; undefined when neither is reported. */
|
|
26
|
+
export function rgbHoldings(balance: unknown): { onchain: number; channels: number; total: number } | undefined {
|
|
27
|
+
if (!isObj(balance)) return undefined;
|
|
28
|
+
const onchainRaw = balance.spendable ?? balance.settled;
|
|
29
|
+
const channelsRaw = balance.offchain_outbound;
|
|
30
|
+
if (typeof onchainRaw !== 'number' && typeof channelsRaw !== 'number') return undefined;
|
|
31
|
+
const onchain = typeof onchainRaw === 'number' ? onchainRaw : 0;
|
|
32
|
+
const channels = typeof channelsRaw === 'number' ? channelsRaw : 0;
|
|
33
|
+
return { onchain, channels, total: onchain + channels };
|
|
34
|
+
}
|
|
22
35
|
|
|
23
36
|
const isObj = (v: unknown): v is Obj => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
24
37
|
|
|
25
38
|
function asAsset(v: Obj): RgbAsset | null {
|
|
26
39
|
if (typeof v.ticker !== 'string' || !v.ticker || !isObj(v.balance)) return null;
|
|
27
40
|
const amounts = BALANCE_FIELDS.map((k) => (v.balance as Obj)[k]).filter((n): n is number => typeof n === 'number');
|
|
41
|
+
const held = rgbHoldings(v.balance);
|
|
42
|
+
if (held && held.channels) amounts.push(held.total);
|
|
28
43
|
if (!amounts.length) return null;
|
|
29
44
|
const precision = typeof v.precision === 'number' && v.precision > 0 ? v.precision : 0;
|
|
30
45
|
return { ticker: v.ticker, precision, amounts };
|
|
@@ -49,6 +64,8 @@ export function annotateRgbBalances(result: unknown): unknown {
|
|
|
49
64
|
for (const k of BALANCE_FIELDS) {
|
|
50
65
|
if (typeof balance[k] === 'number') display[k] = `${formatRgbAmount(balance[k] as number, asset.precision)} ${asset.ticker}`;
|
|
51
66
|
}
|
|
67
|
+
const held = rgbHoldings(balance);
|
|
68
|
+
if (held?.channels) display.total = `${formatRgbAmount(held.total, asset.precision)} ${asset.ticker}`;
|
|
52
69
|
out.balance_display = display;
|
|
53
70
|
}
|
|
54
71
|
return out;
|
|
@@ -58,3 +58,24 @@ describe('fast path: balance that names an asset', () => {
|
|
|
58
58
|
expect(btcOnly.text).toBe('On-chain: 79,278 sats spendable.\nLightning: 16,500 sats.');
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
|
+
|
|
62
|
+
describe('RGB assets held in Lightning channels', () => {
|
|
63
|
+
const desktopUsdt = {
|
|
64
|
+
ticker: 'USDT',
|
|
65
|
+
name: 'Tether USD',
|
|
66
|
+
precision: 6,
|
|
67
|
+
balance: { settled: 0, future: 0, spendable: 0, offchain_outbound: 6_052_258, offchain_inbound: 13_947_742 },
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
it('counts the channel balance in the fast-path asset list', () => {
|
|
71
|
+
expect(defaultRenderFast('assets', [desktopUsdt])).toBe('Your RGB assets:\n- USDT (Tether USD): 6.052258 USDT (6.052258 in channels, 0 on-chain)');
|
|
72
|
+
expect(defaultRenderFast('assets', [{ ...desktopUsdt, balance: { spendable: 1_000_000 } }])).toBe('Your RGB assets:\n- USDT (Tether USD): 1 USDT');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('shows the model the channel balance and the total', async () => {
|
|
76
|
+
const { annotateRgbBalances, fixRgbBalanceUnits } = await import('../context/rgb-units.js');
|
|
77
|
+
const out = annotateRgbBalances([desktopUsdt]) as Array<{ balance_display: Record<string, string> }>;
|
|
78
|
+
expect(out[0]!.balance_display).toMatchObject({ spendable: '0 USDT', offchain_outbound: '6.052258 USDT', total: '6.052258 USDT' });
|
|
79
|
+
expect(fixRgbBalanceUnits('USDT: 6,052,258 sats', [[desktopUsdt]])).toBe('USDT: 6.052258 USDT');
|
|
80
|
+
});
|
|
81
|
+
});
|
package/src/fastpath/render.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* different shapes (aggregate wallet, kaleido-mcp, MockWallet), so each shape
|
|
4
4
|
* is read here instead of asking a model to describe it.
|
|
5
5
|
*/
|
|
6
|
-
import { formatRgbAmount } from '../context/rgb-units.js';
|
|
6
|
+
import { formatRgbAmount, rgbHoldings } from '../context/rgb-units.js';
|
|
7
7
|
|
|
8
8
|
type Obj = Record<string, any>;
|
|
9
9
|
|
|
@@ -38,8 +38,13 @@ function renderAssets(r: unknown): string {
|
|
|
38
38
|
const list: Obj[] = Array.isArray(r) ? r : Array.isArray((r as Obj)?.assets) ? (r as Obj).assets : [];
|
|
39
39
|
if (!list.length) return "You don't hold any RGB assets yet.";
|
|
40
40
|
const rows = list.map((a) => {
|
|
41
|
-
const
|
|
42
|
-
const
|
|
41
|
+
const held = rgbHoldings(a.balance);
|
|
42
|
+
const fmt = (raw: number) => formatRgbAmount(raw, Number(a.precision) || 0);
|
|
43
|
+
const amount = !held
|
|
44
|
+
? 'balance unknown'
|
|
45
|
+
: held.channels
|
|
46
|
+
? `${fmt(held.total)} ${a.ticker} (${fmt(held.channels)} in channels, ${fmt(held.onchain)} on-chain)`
|
|
47
|
+
: `${fmt(held.total)} ${a.ticker}`;
|
|
43
48
|
return `- ${a.ticker}${a.name && a.name !== a.ticker ? ` (${a.name})` : ''}: ${amount}`;
|
|
44
49
|
});
|
|
45
50
|
return `Your RGB assets:\n${rows.join('\n')}`;
|