@kaleidorg/mind 0.7.0 → 0.8.1

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 (136) hide show
  1. package/README.md +96 -8
  2. package/dist/context/compress.d.ts.map +1 -1
  3. package/dist/context/compress.js +1 -0
  4. package/dist/context/compress.js.map +1 -1
  5. package/dist/context/rgb-units.d.ts +18 -0
  6. package/dist/context/rgb-units.d.ts.map +1 -0
  7. package/dist/context/rgb-units.js +86 -0
  8. package/dist/context/rgb-units.js.map +1 -0
  9. package/dist/engine.d.ts +59 -1
  10. package/dist/engine.d.ts.map +1 -1
  11. package/dist/engine.js +196 -17
  12. package/dist/engine.js.map +1 -1
  13. package/dist/fastpath/fastpath.d.ts +6 -1
  14. package/dist/fastpath/fastpath.d.ts.map +1 -1
  15. package/dist/fastpath/fastpath.js +16 -2
  16. package/dist/fastpath/fastpath.js.map +1 -1
  17. package/dist/fastpath/render.d.ts +2 -0
  18. package/dist/fastpath/render.d.ts.map +1 -0
  19. package/dist/fastpath/render.js +58 -0
  20. package/dist/fastpath/render.js.map +1 -0
  21. package/dist/funnel.d.ts.map +1 -1
  22. package/dist/funnel.js +34 -18
  23. package/dist/funnel.js.map +1 -1
  24. package/dist/guards.d.ts +63 -0
  25. package/dist/guards.d.ts.map +1 -0
  26. package/dist/guards.js +284 -0
  27. package/dist/guards.js.map +1 -0
  28. package/dist/index.d.ts +9 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +7 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/kaleidoswap/contract.d.ts +3 -4
  33. package/dist/kaleidoswap/contract.d.ts.map +1 -1
  34. package/dist/kaleidoswap/contract.js +3 -17
  35. package/dist/kaleidoswap/contract.js.map +1 -1
  36. package/dist/providers/openai.d.ts +64 -0
  37. package/dist/providers/openai.d.ts.map +1 -0
  38. package/dist/providers/openai.js +233 -0
  39. package/dist/providers/openai.js.map +1 -0
  40. package/dist/providers/types.d.ts +33 -0
  41. package/dist/providers/types.d.ts.map +1 -1
  42. package/dist/qvac/config.d.ts +1 -1
  43. package/dist/qvac/config.js +1 -1
  44. package/dist/qvac/index.d.ts +1 -0
  45. package/dist/qvac/index.d.ts.map +1 -1
  46. package/dist/qvac/index.js +1 -0
  47. package/dist/qvac/index.js.map +1 -1
  48. package/dist/qvac/models.d.ts +31 -0
  49. package/dist/qvac/models.d.ts.map +1 -0
  50. package/dist/qvac/models.js +80 -0
  51. package/dist/qvac/models.js.map +1 -0
  52. package/dist/qvac/parse.d.ts +11 -0
  53. package/dist/qvac/parse.d.ts.map +1 -1
  54. package/dist/qvac/parse.js +29 -7
  55. package/dist/qvac/parse.js.map +1 -1
  56. package/dist/qvac/provider.d.ts +14 -4
  57. package/dist/qvac/provider.d.ts.map +1 -1
  58. package/dist/qvac/provider.js +33 -8
  59. package/dist/qvac/provider.js.map +1 -1
  60. package/dist/qvac/stream.d.ts +3 -5
  61. package/dist/qvac/stream.d.ts.map +1 -1
  62. package/dist/qvac/stream.js.map +1 -1
  63. package/dist/qvac/tools.d.ts +5 -0
  64. package/dist/qvac/tools.d.ts.map +1 -1
  65. package/dist/qvac/tools.js +10 -0
  66. package/dist/qvac/tools.js.map +1 -1
  67. package/dist/recipe/issue-asset.d.ts.map +1 -1
  68. package/dist/recipe/issue-asset.js +42 -16
  69. package/dist/recipe/issue-asset.js.map +1 -1
  70. package/dist/recipe/runner.d.ts.map +1 -1
  71. package/dist/recipe/runner.js +1 -0
  72. package/dist/recipe/runner.js.map +1 -1
  73. package/dist/recipe/submarine-pay.d.ts +17 -0
  74. package/dist/recipe/submarine-pay.d.ts.map +1 -0
  75. package/dist/recipe/submarine-pay.js +79 -0
  76. package/dist/recipe/submarine-pay.js.map +1 -0
  77. package/dist/skills/registry.js +1 -1
  78. package/dist/skills/select.d.ts +20 -0
  79. package/dist/skills/select.d.ts.map +1 -0
  80. package/dist/skills/select.js +32 -0
  81. package/dist/skills/select.js.map +1 -0
  82. package/dist/submarine/contract.d.ts +42 -0
  83. package/dist/submarine/contract.d.ts.map +1 -0
  84. package/dist/submarine/contract.js +73 -0
  85. package/dist/submarine/contract.js.map +1 -0
  86. package/dist/testing/mock-wallet.d.ts +24 -0
  87. package/dist/testing/mock-wallet.d.ts.map +1 -1
  88. package/dist/testing/mock-wallet.js +75 -6
  89. package/dist/testing/mock-wallet.js.map +1 -1
  90. package/dist/wallet/confirm.d.ts.map +1 -1
  91. package/dist/wallet/confirm.js +27 -9
  92. package/dist/wallet/confirm.js.map +1 -1
  93. package/package.json +6 -1
  94. package/skills/README.md +1 -0
  95. package/skills/kaleido-trading/SKILL.md +22 -28
  96. package/skills/kaleido-trading/references/api.md +3 -3
  97. package/skills/rgb-lightning-node/SKILL.md +32 -12
  98. package/skills/spark-wallet/SKILL.md +1 -0
  99. package/skills/submarine-swaps/SKILL.md +48 -0
  100. package/src/context/compress.ts +1 -0
  101. package/src/context/rgb-units.test.ts +42 -0
  102. package/src/context/rgb-units.ts +89 -0
  103. package/src/engine.test.ts +133 -3
  104. package/src/engine.ts +254 -19
  105. package/src/fastpath/fastpath.ts +22 -2
  106. package/src/fastpath/render.test.ts +39 -0
  107. package/src/fastpath/render.ts +56 -0
  108. package/src/funnel.mind.test.ts +15 -17
  109. package/src/funnel.ts +34 -19
  110. package/src/guards.test.ts +399 -0
  111. package/src/guards.ts +299 -0
  112. package/src/index.ts +37 -1
  113. package/src/kaleidoswap/contract.test.ts +8 -16
  114. package/src/kaleidoswap/contract.ts +4 -32
  115. package/src/providers/openai.test.ts +127 -0
  116. package/src/providers/openai.ts +282 -0
  117. package/src/providers/types.ts +35 -0
  118. package/src/qvac/config.ts +1 -1
  119. package/src/qvac/index.ts +10 -0
  120. package/src/qvac/models.ts +98 -0
  121. package/src/qvac/parse.test.ts +7 -0
  122. package/src/qvac/parse.ts +33 -1
  123. package/src/qvac/provider.test.ts +54 -1
  124. package/src/qvac/provider.ts +49 -13
  125. package/src/qvac/stream.ts +3 -5
  126. package/src/qvac/tools.ts +10 -0
  127. package/src/recipe/issue-asset.test.ts +39 -0
  128. package/src/recipe/issue-asset.ts +41 -13
  129. package/src/recipe/runner.ts +1 -0
  130. package/src/recipe/submarine-pay.test.ts +87 -0
  131. package/src/recipe/submarine-pay.ts +78 -0
  132. package/src/skills/registry.ts +1 -1
  133. package/src/skills/select.ts +41 -0
  134. package/src/submarine/contract.ts +112 -0
  135. package/src/testing/mock-wallet.ts +73 -6
  136. package/src/wallet/confirm.ts +27 -9
package/dist/engine.js CHANGED
@@ -14,24 +14,69 @@
14
14
  * inference is delegated to a remote provider.
15
15
  */
16
16
  import { compressToolResult } from './context/compress.js';
17
+ import { callKey, declinedToolResult, detectWalletAction, hasCapableTool, noToolReply, findUngroundedPaymentData, fixSatsBtcConversions, ungroundedReply, validateToolArgs, } from './guards.js';
18
+ import { confirmReadback } from './wallet/confirm.js';
19
+ import { annotateRgbBalances, fixRgbBalanceUnits } from './context/rgb-units.js';
20
+ import { selectAvailableSkill } from './skills/select.js';
21
+ const STOPPED_MESSAGE = 'I had to stop after several steps — please try a more specific request.';
22
+ const TOOL_CALL_FAILED_MESSAGE = "I couldn't put together a valid request for that. Please rephrase it with the exact values (asset, amount, recipient).";
23
+ function toolErrorMessage(errors, cutOff) {
24
+ if (cutOff) {
25
+ return 'Your tool call was cut off because the output got too long. Make ONE tool call at a time with only the required arguments, or answer from the results you already have.';
26
+ }
27
+ const detail = errors.map((e) => e.message).join('; ');
28
+ return `Your tool call could not be read (${detail}). Call the tool again with valid JSON arguments that match its schema, or ask the user for the missing values.`;
29
+ }
17
30
  export class Engine {
18
31
  provider;
19
32
  registry;
20
33
  defaultSystem;
21
34
  defaultMaxTurns;
22
35
  compressOpts;
36
+ guardPaymentData;
37
+ fixAmounts;
38
+ thinkOnForcedCalls;
39
+ guardMissingTools;
40
+ endTurnOnDecline;
23
41
  constructor(opts) {
24
42
  this.provider = opts.provider;
25
43
  this.registry = opts.tools;
26
44
  this.defaultSystem = opts.defaultSystem;
27
45
  this.defaultMaxTurns = opts.defaultMaxTurns ?? 5;
46
+ this.guardPaymentData = opts.guardUngroundedPaymentData ?? true;
47
+ this.fixAmounts = opts.fixAmountConversions ?? true;
48
+ this.thinkOnForcedCalls = opts.thinkOnForcedCalls ?? false;
49
+ this.guardMissingTools = opts.guardMissingTools ?? true;
50
+ this.endTurnOnDecline = opts.endTurnOnDecline ?? true;
28
51
  this.compressOpts = opts.compressToolOutput
29
52
  ? opts.compressToolOutput === true
30
53
  ? {}
31
54
  : opts.compressToolOutput
32
55
  : undefined;
33
56
  }
57
+ /**
58
+ * Select the skill for `query` among those that can act with this engine's
59
+ * tools (skills whose `requires-tools` are missing are skipped), then
60
+ * compose its system prompt. Pass the result to runAgentic:
61
+ *
62
+ * const { system, allowedTools } = await engine.composeSkill(skills, question, base);
63
+ * await engine.runAgentic([{ role: 'system', content: system }, { role: 'user', content: question }], { allowedTools });
64
+ */
65
+ async composeSkill(skills, query, base) {
66
+ const skill = selectAvailableSkill(skills, query, await this.registry.listTools());
67
+ return { skill, ...skills.compose(base, skill) };
68
+ }
34
69
  async runAgentic(messages, opts = {}) {
70
+ const sessionKey = opts.sessionKey ?? `mind-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
71
+ try {
72
+ return await this.runAgenticSession(messages, { ...opts, sessionKey });
73
+ }
74
+ finally {
75
+ if (!opts.sessionKey)
76
+ await this.provider.endSession?.(sessionKey).catch(() => { });
77
+ }
78
+ }
79
+ async runAgenticSession(messages, opts) {
35
80
  const maxTurns = opts.maxTurns ?? this.defaultMaxTurns;
36
81
  const hasSystem = messages.some((m) => m.role === 'system');
37
82
  const system = hasSystem ? undefined : this.defaultSystem;
@@ -45,16 +90,35 @@ export class Engine {
45
90
  const executed = [];
46
91
  let lastRequestId;
47
92
  let finalText = '';
93
+ // Set when finalText is one of the engine's own fixed replies, which the
94
+ // answer guards below must not rewrite.
95
+ let engineReply = false;
48
96
  let turns = 0;
49
97
  const inference = [];
50
- for (let turn = 1; turn <= maxTurns; turn++) {
98
+ const seen = new Map();
99
+ let toolErrorRetries = 0;
100
+ const lastUser = [...messages].reverse().find((m) => m.role === 'user')?.content ?? '';
101
+ const action = this.guardMissingTools ? detectWalletAction(lastUser) : null;
102
+ if (action && !hasCapableTool(action, allTools.map((t) => t.name))) {
103
+ const text = noToolReply(action);
104
+ history.push({ role: 'assistant', content: text });
105
+ return { text, turns: 0, toolCalls: [], messages: history, latencyMs: Date.now() - startedAt, inference };
106
+ }
107
+ // A retry after an unreadable tool call does not count against maxTurns.
108
+ for (let turn = 1; turn <= maxTurns + toolErrorRetries; turn++) {
51
109
  turns = turn;
52
110
  if (opts.signal?.aborted)
53
111
  break;
54
112
  const out = await this.provider.runTurn({
113
+ sessionKey: opts.sessionKey,
55
114
  messages: history,
56
115
  tools: allTools,
57
116
  system,
117
+ // A forced first call only picks the tool and its arguments; reasoning
118
+ // there costs most of the turn's time on small models.
119
+ ...(turn === 1 && opts.firstTurnToolChoice && allTools.length
120
+ ? { toolChoice: opts.firstTurnToolChoice, ...(this.thinkOnForcedCalls ? {} : { thinking: 'off' }) }
121
+ : {}),
58
122
  onToken: opts.onToken ? (t) => opts.onToken(t, turn) : undefined,
59
123
  signal: opts.signal,
60
124
  });
@@ -63,38 +127,125 @@ export class Engine {
63
127
  inference.push(out.inference);
64
128
  if (out.requestId)
65
129
  opts.onStart?.(out.requestId, turn);
66
- finalText = (out.text || '').trim();
130
+ finalText = out.incomplete ? '' : (out.text || '').trim();
131
+ // The model tried to call a tool but the call didn't parse: tell it what
132
+ // went wrong and let it try again (once) instead of showing the broken
133
+ // frame as the answer.
134
+ if ((!out.toolCalls || out.toolCalls.length === 0) && out.toolErrors?.length) {
135
+ if (toolErrorRetries < 1) {
136
+ toolErrorRetries += 1;
137
+ const cutOff = out.inference?.status === 'truncated';
138
+ history.push({ role: 'assistant', content: out.rawContent || finalText });
139
+ history.push({ role: 'tool', content: JSON.stringify({ error: toolErrorMessage(out.toolErrors, cutOff) }) });
140
+ continue;
141
+ }
142
+ finalText = TOOL_CALL_FAILED_MESSAGE;
143
+ engineReply = true;
144
+ break;
145
+ }
67
146
  // No tool calls ⇒ the model produced its final answer.
68
- if (!out.toolCalls || out.toolCalls.length === 0)
147
+ if (!out.toolCalls || out.toolCalls.length === 0) {
148
+ if (!finalText && executed.length)
149
+ finalText = await this.recoverAnswer(history, system, executed, inference, opts, turn);
150
+ else if (!finalText && out.incomplete)
151
+ finalText = (out.text || '').trim();
69
152
  break;
153
+ }
70
154
  // Anchor the next turn with the raw assistant frame.
71
155
  history.push({ role: 'assistant', content: out.rawContent || finalText });
156
+ let repeatedAgain = false;
157
+ const declinedThisTurn = [];
72
158
  for (const call of out.toolCalls) {
73
159
  opts.onToolCall?.({ name: call.name, arguments: call.arguments }, turn);
74
160
  const def = await this.registry.getDef(call.name);
161
+ const key = callKey(call.name, call.arguments);
162
+ const previous = seen.get(key);
163
+ let args = call.arguments;
75
164
  let result;
76
- if (def?.requiresConfirmation) {
77
- const decision = opts.onConfirm
78
- ? await opts.onConfirm({ name: call.name, arguments: call.arguments })
79
- : { approved: false, reason: 'no confirmation handler available' };
80
- if (decision.approved) {
81
- result = await this.safeExecute(call.name, call.arguments);
165
+ if (previous) {
166
+ previous.count += 1;
167
+ if (previous.count > 2)
168
+ repeatedAgain = true;
169
+ result = {
170
+ error: `You already called ${call.name} with these arguments; the result was: ` +
171
+ `${this.toHistoryContent(previous.result)}. Do not call it again — answer the user now.`,
172
+ };
173
+ }
174
+ else if (!def) {
175
+ result = { error: `Unknown tool "${call.name}".` };
176
+ }
177
+ else {
178
+ const check = validateToolArgs(def, call.arguments);
179
+ if (!check.ok) {
180
+ result = {
181
+ error: `Invalid arguments for ${call.name}: ${check.errors.join('; ')}. Fix them or ask the user for the missing values.`,
182
+ };
183
+ }
184
+ else if (def.requiresConfirmation) {
185
+ args = check.args;
186
+ const summary = confirmReadback({ name: call.name, arguments: args }) ?? undefined;
187
+ const decision = opts.onConfirm
188
+ ? await opts.onConfirm({ name: call.name, arguments: args, ...(summary ? { summary } : {}) })
189
+ : { approved: false, reason: 'no confirmation handler available' };
190
+ if (decision.approved) {
191
+ result = await this.safeExecute(call.name, args);
192
+ }
193
+ else {
194
+ result = declinedToolResult(call.name, decision.reason);
195
+ declinedThisTurn.push(summary ? summary.replace(/\.?\s*Confirm\?$/, '') : call.name.replace(/_/g, ' '));
196
+ }
82
197
  }
83
198
  else {
84
- result = { declined: true, reason: decision.reason ?? 'user declined' };
199
+ args = check.args;
200
+ result = await this.safeExecute(call.name, args);
85
201
  }
86
202
  }
87
- else {
88
- result = await this.safeExecute(call.name, call.arguments);
203
+ if (!previous) {
204
+ // A mutating (confirm-gated) call can change what reads return.
205
+ if (def?.requiresConfirmation)
206
+ seen.clear();
207
+ seen.set(key, { result, count: 1 });
89
208
  }
90
- executed.push({ name: call.name, arguments: call.arguments, result });
91
- opts.onToolResult?.({ name: call.name, arguments: call.arguments, result }, turn);
92
- history.push({ role: 'tool', content: this.toHistoryContent(result) });
209
+ executed.push({ name: call.name, arguments: args, result });
210
+ opts.onToolResult?.({ name: call.name, arguments: args, result }, turn);
211
+ history.push({ role: 'tool', content: this.toHistoryContent(this.fixAmounts ? annotateRgbBalances(result) : result) });
212
+ }
213
+ if (this.endTurnOnDecline && declinedThisTurn.length && declinedThisTurn.length === out.toolCalls.length) {
214
+ finalText = `Cancelled — you declined: ${declinedThisTurn.join('; ')}. Nothing was sent or changed.`;
215
+ engineReply = true;
216
+ break;
93
217
  }
94
- if (turn === maxTurns && !finalText) {
95
- finalText = 'I had to stop after several steps — please try a more specific request.';
218
+ if (repeatedAgain) {
219
+ const forced = await this.provider.runTurn({
220
+ sessionKey: opts.sessionKey,
221
+ messages: history,
222
+ tools: [],
223
+ system,
224
+ onToken: opts.onToken ? (t) => opts.onToken(t, turn) : undefined,
225
+ signal: opts.signal,
226
+ });
227
+ if (forced.inference)
228
+ inference.push(forced.inference);
229
+ finalText = (forced.text || '').trim() || 'I could not get a different result from the wallet — please try a more specific request.';
230
+ break;
96
231
  }
97
232
  }
233
+ // Never return an empty answer (e.g. the last turn ran out of tokens).
234
+ if (!finalText && !opts.signal?.aborted) {
235
+ finalText = STOPPED_MESSAGE;
236
+ engineReply = true;
237
+ }
238
+ if (this.fixAmounts && finalText && !engineReply) {
239
+ finalText = fixRgbBalanceUnits(fixSatsBtcConversions(finalText), executed.map((e) => e.result));
240
+ }
241
+ if (this.guardPaymentData && finalText && !engineReply) {
242
+ const ungrounded = findUngroundedPaymentData(finalText, [
243
+ ...messages.map((m) => m.content),
244
+ ...executed.map((e) => e.result),
245
+ ]);
246
+ if (ungrounded.length)
247
+ finalText = ungroundedReply(ungrounded);
248
+ }
98
249
  // Append the final answer so the returned conversation is complete (the
99
250
  // loop breaks before pushing the no-tool-call turn).
100
251
  if (finalText)
@@ -109,6 +260,34 @@ export class Engine {
109
260
  inference,
110
261
  };
111
262
  }
263
+ /**
264
+ * The model ran tools but produced no visible answer (e.g. reasoning used the
265
+ * whole output budget). Ask once more without tools; if that is empty too,
266
+ * show the last tool result instead of an empty reply.
267
+ */
268
+ async recoverAnswer(history, system, executed, inference, opts, turn) {
269
+ if (opts.signal?.aborted)
270
+ return '';
271
+ const retry = await this.provider.runTurn({
272
+ sessionKey: opts.sessionKey,
273
+ messages: [
274
+ ...history,
275
+ { role: 'user', content: 'Answer my question now from the tool results above, in a few short sentences.' },
276
+ ],
277
+ tools: [],
278
+ system,
279
+ onToken: opts.onToken ? (t) => opts.onToken(t, turn) : undefined,
280
+ signal: opts.signal,
281
+ });
282
+ if (retry.inference)
283
+ inference.push(retry.inference);
284
+ const text = retry.incomplete ? '' : (retry.text || '').trim();
285
+ if (text)
286
+ return text;
287
+ const last = executed[executed.length - 1];
288
+ const body = compressToolResult(last.result, this.compressOpts ?? {}).content;
289
+ return `I couldn't phrase an answer in time. Here is what ${last.name.replace(/_/g, ' ')} returned:\n\n${body.length > 2000 ? `${body.slice(0, 2000)}…` : body}`;
290
+ }
112
291
  async cancel(requestId) {
113
292
  await this.provider.cancel?.(requestId);
114
293
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export interface FastIntent {
15
15
  name: string;
16
16
  /** Contract tool to call when this intent matches. */
17
17
  tool: string;
18
+ /** Equivalent tools to try, in order, when the host doesn't expose `tool`. */
19
+ fallbackTools?: string[];
18
20
  /** True only when this intent UNAMBIGUOUSLY matches the text. */
19
21
  match: (text: string) => boolean;
20
22
  /** Optional args derived from the text (default: none). */
@@ -22,7 +24,10 @@ export interface FastIntent {
22
24
  }
23
25
  export interface FastHit {
24
26
  intent: FastIntent;
27
+ /** The intent's primary tool. */
25
28
  tool: string;
29
+ /** Primary tool first, then the fallbacks. */
30
+ tools: string[];
26
31
  args: Record<string, unknown>;
27
32
  }
28
33
  export declare class FastPath {
@@ -33,6 +38,6 @@ export declare class FastPath {
33
38
  /** The first unambiguously-matching intent, or null. */
34
39
  select(text: string): FastHit | null;
35
40
  }
36
- /** Default wallet read intents (balance / receive address / price). */
41
+ /** Default wallet read intents (balance / RGB assets / receive address / price). */
37
42
  export declare const WALLET_FAST_INTENTS: FastIntent[];
38
43
  //# sourceMappingURL=fastpath.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastpath.d.ts","sourceRoot":"","sources":["../../src/fastpath/fastpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAe;IAC9B,YAAY,OAAO,GAAE,UAAU,EAAO,EAErC;IACD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAE5B;IACD,IAAI,IAAI,UAAU,EAAE,CAEnB;IACD,wDAAwD;IACxD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAGnC;CACF;AAMD,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,UAAU,EAgB3C,CAAC"}
1
+ {"version":3,"file":"fastpath.d.ts","sourceRoot":"","sources":["../../src/fastpath/fastpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iEAAiE;IACjE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAe;IAC9B,YAAY,OAAO,GAAE,UAAU,EAAO,EAErC;IACD,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAE5B;IACD,IAAI,IAAI,UAAU,EAAE,CAEnB;IACD,wDAAwD;IACxD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAKnC;CACF;AAQD,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,EAAE,UAAU,EA2B3C,CAAC"}
@@ -25,22 +25,36 @@ export class FastPath {
25
25
  /** The first unambiguously-matching intent, or null. */
26
26
  select(text) {
27
27
  const intent = this.intents.find((i) => i.match(text));
28
- return intent ? { intent, tool: intent.tool, args: intent.args?.(text) ?? {} } : null;
28
+ return intent
29
+ ? { intent, tool: intent.tool, tools: [intent.tool, ...(intent.fallbackTools ?? [])], args: intent.args?.(text) ?? {} }
30
+ : null;
29
31
  }
30
32
  }
31
33
  // A "spend or compound" guard — never fast-path anything that moves money or
32
34
  // chains another action ("send", "pay", "and then", "swap").
33
35
  const ACTIONY = /\b(send|pay|transfer|swap|buy|sell|then|after that)\b/i;
34
- /** Default wallet read intents (balance / receive address / price). */
36
+ // Asks that create something are not reads, even when they mention assets.
37
+ const CREATEY = /\b(issue|mint|create|make|new|generate|invoice|receive|request)\b/i;
38
+ /** Default wallet read intents (balance / RGB assets / receive address / price). */
35
39
  export const WALLET_FAST_INTENTS = [
36
40
  {
37
41
  name: 'balance',
38
42
  tool: 'get_balances',
43
+ fallbackTools: ['rln_get_balances', 'wdk_get_balances'],
39
44
  match: (t) => !ACTIONY.test(t) && /\b(balance|funds|how much (do i|have i|i have)|how much.* (do i have|in my wallet))\b/i.test(t),
40
45
  },
46
+ {
47
+ name: 'assets',
48
+ tool: 'rln_list_assets',
49
+ fallbackTools: ['wdk_list_assets'],
50
+ match: (t) => !ACTIONY.test(t) &&
51
+ !CREATEY.test(t) &&
52
+ /\b(which|what|list|show|my)\b[^.?!]*\b(rgb assets?|assets?|tokens?)\b|\b(rgb assets?|tokens?) (do i|i) (have|hold|own)\b/i.test(t),
53
+ },
41
54
  {
42
55
  name: 'address',
43
56
  tool: 'spark_get_address',
57
+ fallbackTools: ['rln_get_address', 'wdk_get_address'],
44
58
  match: (t) => !ACTIONY.test(t) && /\b(receive address|deposit address|my address|an address|get .*address|where.* receive)\b/i.test(t),
45
59
  },
46
60
  {
@@ -1 +1 @@
1
- {"version":3,"file":"fastpath.js","sourceRoot":"","sources":["../../src/fastpath/fastpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH,MAAM,OAAO,QAAQ;IACX,OAAO,CAAe;IAC9B,YAAY,OAAO,GAAiB,EAAE;QACpC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,MAAkB;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,wDAAwD;IACxD,MAAM,CAAC,IAAY;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxF,CAAC;CACF;AAED,6EAA6E;AAC7E,6DAA6D;AAC7D,MAAM,OAAO,GAAG,wDAAwD,CAAC;AAEzE,uEAAuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,wFAAwF,CAAC,IAAI,CAAC,CAAC,CAAC;KACnI;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,4FAA4F,CAAC,IAAI,CAAC,CAAC,CAAC;KACvI;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,2FAA2F,CAAC,IAAI,CAAC,CAAC,CAAC;KACtI;CACF,CAAC"}
1
+ {"version":3,"file":"fastpath.js","sourceRoot":"","sources":["../../src/fastpath/fastpath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAuBH,MAAM,OAAO,QAAQ;IACX,OAAO,CAAe;IAC9B,YAAY,OAAO,GAAiB,EAAE;QACpC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,MAAkB;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,wDAAwD;IACxD,MAAM,CAAC,IAAY;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM;YACX,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;YACvH,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;CACF;AAED,6EAA6E;AAC7E,6DAA6D;AAC7D,MAAM,OAAO,GAAG,wDAAwD,CAAC;AACzE,2EAA2E;AAC3E,MAAM,OAAO,GAAG,oEAAoE,CAAC;AAErF,oFAAoF;AACpF,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,cAAc;QACpB,aAAa,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,wFAAwF,CAAC,IAAI,CAAC,CAAC,CAAC;KACnI;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,iBAAiB;QACvB,aAAa,EAAE,CAAC,iBAAiB,CAAC;QAClC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CACX,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAChB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAChB,2HAA2H,CAAC,IAAI,CAAC,CAAC,CAAC;KACtI;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,mBAAmB;QACzB,aAAa,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;QACrD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,4FAA4F,CAAC,IAAI,CAAC,CAAC,CAAC;KACvI;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,2FAA2F,CAAC,IAAI,CAAC,CAAC,CAAC;KACtI;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function defaultRenderFast(intent: string, result: unknown): string;
2
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/fastpath/render.ts"],"names":[],"mappings":"AA+CA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAQzE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Text for a fast-path result. Tools that answer the same intent return
3
+ * different shapes (aggregate wallet, kaleido-mcp, MockWallet), so each shape
4
+ * is read here instead of asking a model to describe it.
5
+ */
6
+ import { formatRgbAmount } from '../context/rgb-units.js';
7
+ const sats = (n) => `${Number(n ?? 0).toLocaleString('en-US')} sats`;
8
+ function parse(r) {
9
+ if (typeof r !== 'string')
10
+ return r;
11
+ try {
12
+ return JSON.parse(r);
13
+ }
14
+ catch {
15
+ return r;
16
+ }
17
+ }
18
+ function renderBalance(r) {
19
+ if (r.total_sats !== undefined) {
20
+ const n = r.layers?.length ?? 0;
21
+ return `You have ${sats(r.total_sats)}${n > 1 ? ` across ${n} layers` : ''}.`;
22
+ }
23
+ if (r.btc_onchain) {
24
+ const b = r.btc_onchain;
25
+ const lines = [`On-chain: ${sats(b.vanilla_spendable_sats)} spendable.`];
26
+ if (Number(b.colored_spendable_sats))
27
+ lines.push(`RGB UTXOs: ${sats(b.colored_spendable_sats)} (holding RGB assets, not for spending).`);
28
+ if (r.lightning_balance_sat !== undefined)
29
+ lines.push(`Lightning: ${sats(r.lightning_balance_sat)}.`);
30
+ return lines.join('\n');
31
+ }
32
+ if (r.btc_sats !== undefined)
33
+ return `You have ${sats(r.btc_sats)}.`;
34
+ return `Balances:\n${JSON.stringify(r, null, 2)}`;
35
+ }
36
+ function renderAssets(r) {
37
+ const list = Array.isArray(r) ? r : Array.isArray(r?.assets) ? r.assets : [];
38
+ if (!list.length)
39
+ return "You don't hold any RGB assets yet.";
40
+ const rows = list.map((a) => {
41
+ const raw = a.balance?.spendable ?? a.balance?.settled;
42
+ const amount = typeof raw === 'number' ? `${formatRgbAmount(raw, Number(a.precision) || 0)} ${a.ticker}` : 'balance unknown';
43
+ return `- ${a.ticker}${a.name && a.name !== a.ticker ? ` (${a.name})` : ''}: ${amount}`;
44
+ });
45
+ return `Your RGB assets:\n${rows.join('\n')}`;
46
+ }
47
+ export function defaultRenderFast(intent, result) {
48
+ const r = parse(result);
49
+ if (intent === 'balance')
50
+ return renderBalance(r ?? {});
51
+ if (intent === 'assets')
52
+ return renderAssets(r);
53
+ if (intent === 'address') {
54
+ return r?.address ? `Here's your receive address:\n\n\`${r.address}\`` : 'No address available right now.';
55
+ }
56
+ return `Bitcoin is $${Number(r?.price_usd ?? 0).toLocaleString('en-US')}.`;
57
+ }
58
+ //# sourceMappingURL=render.js.map
@@ -0,0 +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;AAI1D,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;AAE9E,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAM;IAC3B,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;QAChC,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAChF,CAAC;IACD,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,0CAA0C,CAAC,CAAC;QACzI,IAAI,CAAC,CAAC,qBAAqB,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACtG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;IACrE,OAAO,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,MAAM,IAAI,GAAU,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,CAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAE,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACtG,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,oCAAoC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC7H,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1F,CAAC,CAAC,CAAC;IACH,OAAO,qBAAqB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAe;IAC/D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAQ,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,iCAAiC,CAAC;IAC7G,CAAC;IACD,OAAO,eAAe,MAAM,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;AAC7E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"funnel.d.ts","sourceRoot":"","sources":["../src/funnel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"funnel.d.ts","sourceRoot":"","sources":["../src/funnel.ts"],"names":[],"mappings":"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"}
package/dist/funnel.js CHANGED
@@ -19,12 +19,15 @@
19
19
  * the contract; with no `onConfirm` the gate fails closed.
20
20
  */
21
21
  import { Engine } from './engine.js';
22
+ import { defaultRenderFast } from './fastpath/render.js';
22
23
  import { FastPath, WALLET_FAST_INTENTS } from './fastpath/fastpath.js';
23
24
  import { RecipeRegistry, runRecipe } from './recipe/runner.js';
24
25
  import { paymentsRecipe } from './recipe/payments.js';
25
26
  import { receiveRecipe } from './recipe/receive.js';
26
27
  import { assetSendRecipe } from './recipe/asset-send.js';
27
28
  import { SkillRegistry } from './skills/registry.js';
29
+ import { selectAvailableSkill } from './skills/select.js';
30
+ import { detectWalletAction, hasCapableTool, noToolReply, wantsToolCall } from './guards.js';
28
31
  /** Base system prompt for the wallet assistant. Hosts may override. */
29
32
  export const DEFAULT_WALLET_SYSTEM = [
30
33
  'You are KaleidoSwap, a concise, privacy-first assistant running inside a',
@@ -65,17 +68,6 @@ export const DEFAULT_WALLET_SYSTEM = [
65
68
  const AMBIENT_MEMORY = ['remember', 'recall'];
66
69
  const AMBIENT_RAG = ['search_knowledge'];
67
70
  const DEFAULT_HISTORY = 8;
68
- function defaultRenderFast(intent, r) {
69
- if (intent === 'balance') {
70
- const sats = Number(r?.total_sats ?? 0);
71
- const n = r?.layers?.length ?? 0;
72
- return `You have ${sats.toLocaleString()} sats${n > 1 ? ` across ${n} layers` : ''}.`;
73
- }
74
- if (intent === 'address') {
75
- return r?.address ? `Here's your receive address:\n\n\`${r.address}\`` : 'No address available right now.';
76
- }
77
- return `Bitcoin is $${Number(r?.price_usd ?? 0).toLocaleString()}.`;
78
- }
79
71
  export class Funnel {
80
72
  provider;
81
73
  registry;
@@ -134,9 +126,16 @@ export class Funnel {
134
126
  // tool — a partial tool surface (e.g. desktop without the core aggregate
135
127
  // helpers) falls through to the agentic tier instead of erroring.
136
128
  const fast = this.fastPath.select(text);
137
- if (fast && (await this.registry.getDef(fast.tool))) {
138
- this.log(`tier=fast-path → ${fast.tool}`);
139
- const r = await this.registry.execute(fast.tool, fast.args);
129
+ let fastTool;
130
+ for (const name of fast?.tools ?? []) {
131
+ if (await this.registry.getDef(name)) {
132
+ fastTool = name;
133
+ break;
134
+ }
135
+ }
136
+ if (fast && fastTool) {
137
+ this.log(`tier=fast-path → ${fastTool}`);
138
+ const r = await this.registry.execute(fastTool, fast.args);
140
139
  return { text: this.renderFast(fast.intent.name, r), tier: 'fast', route: fast.intent.name, intent: fast.intent.name, data: r };
141
140
  }
142
141
  // ── T2: recipe multi-step — fires when:
@@ -204,7 +203,9 @@ export class Funnel {
204
203
  }
205
204
  // ── T1: skill-scoped agentic loop ──
206
205
  const skills = this.skillsFor(settings.disabledSkills);
207
- const skill = skills.select(text);
206
+ const liveTools = (await this.registry.listTools()).map((t) => t.name);
207
+ const present = new Set(liveTools);
208
+ const skill = selectAvailableSkill(skills, text, present);
208
209
  let base = settings.persona ? `${this.system}\n\n## Your persona\n${settings.persona}` : this.system;
209
210
  // Auto-inject relevant knowledge chunks (best-effort — corpus is grounding
210
211
  // truth, history is conversational context; both reach the model but the
@@ -239,7 +240,6 @@ export class Funnel {
239
240
  // leaves the model TOOL-LESS — it then narrates "the tool isn't available"
240
241
  // instead of acting. If NONE of the scoped tools resolve against the live
241
242
  // registry, widen to the full surface so the agent can still work.
242
- const present = new Set((await this.registry.listTools()).map((t) => t.name));
243
243
  if (!scoped.some((n) => present.has(n))) {
244
244
  this.log(`tier=agentic: skill '${skill?.name ?? '?'}' tools resolved to 0 live tools — using full tool surface`);
245
245
  scoped = undefined;
@@ -248,8 +248,23 @@ export class Funnel {
248
248
  else if (disabledAmbient.length) {
249
249
  // No skill matched but a toggle is off: expose everything except the
250
250
  // disabled ambient tools (the sources stay mounted — no rebuild).
251
- const all = (await this.registry.listTools()).map((t) => t.name);
252
- scoped = all.filter((n) => !disabledAmbient.includes(n));
251
+ scoped = liveTools.filter((n) => !disabledAmbient.includes(n));
252
+ }
253
+ // A wallet action with no tool able to perform it: answer deterministically
254
+ // instead of letting the model improvise an invoice/address/payment.
255
+ const action = detectWalletAction(text);
256
+ if (action) {
257
+ const inScope = (scoped ?? liveTools).filter((n) => present.has(n));
258
+ if (!hasCapableTool(action, inScope)) {
259
+ if (scoped && hasCapableTool(action, liveTools)) {
260
+ this.log(`tier=agentic: skill '${skill?.name ?? '?'}' has no tool for ${action.id} — using full tool surface`);
261
+ scoped = liveTools.filter((n) => !disabledAmbient.includes(n));
262
+ }
263
+ else {
264
+ this.log(`tier=agentic: no tool for ${action.id} — refusing`);
265
+ return { text: noToolReply(action), tier: 'agentic', route: 'no-tool', toolCalls: [], turns: 0, inference: [] };
266
+ }
267
+ }
253
268
  }
254
269
  // Trim history so the prompt (system + skill + tools + history) stays
255
270
  // within the small on-device model's context window.
@@ -275,6 +290,7 @@ export class Funnel {
275
290
  },
276
291
  onToolResult: cbs.onToolResult,
277
292
  onConfirm: cbs.onConfirm,
293
+ ...(wantsToolCall(text) ? { firstTurnToolChoice: 'required' } : {}),
278
294
  signal: cbs.signal,
279
295
  });
280
296
  return {