@kaleidorg/mind 0.2.0 → 0.4.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/dist/capabilities.d.ts +4 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +7 -0
- package/dist/capabilities.js.map +1 -1
- package/dist/engine.d.ts +9 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/funnel.d.ts +6 -0
- package/dist/funnel.d.ts.map +1 -1
- package/dist/funnel.js +26 -6
- package/dist/funnel.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/kaleidoswap/contract.d.ts +72 -0
- package/dist/kaleidoswap/contract.d.ts.map +1 -0
- package/dist/kaleidoswap/contract.js +125 -0
- package/dist/kaleidoswap/contract.js.map +1 -0
- package/dist/knowledge/btc-map.d.ts +87 -0
- package/dist/knowledge/btc-map.d.ts.map +1 -0
- package/dist/knowledge/btc-map.js +365 -0
- package/dist/knowledge/btc-map.js.map +1 -0
- package/dist/lsps1/contract.d.ts +55 -0
- package/dist/lsps1/contract.d.ts.map +1 -0
- package/dist/lsps1/contract.js +91 -0
- package/dist/lsps1/contract.js.map +1 -0
- package/dist/memory/store.d.ts +7 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +43 -3
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +12 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/qvac/assistant.d.ts +73 -0
- package/dist/qvac/assistant.d.ts.map +1 -0
- package/dist/qvac/assistant.js +97 -0
- package/dist/qvac/assistant.js.map +1 -0
- package/dist/qvac/config.d.ts +64 -0
- package/dist/qvac/config.d.ts.map +1 -0
- package/dist/qvac/config.js +71 -0
- package/dist/qvac/config.js.map +1 -0
- package/dist/qvac/delegate.d.ts +48 -0
- package/dist/qvac/delegate.d.ts.map +1 -0
- package/dist/qvac/delegate.js +51 -0
- package/dist/qvac/delegate.js.map +1 -0
- package/dist/qvac/index.d.ts +19 -0
- package/dist/qvac/index.d.ts.map +1 -0
- package/dist/qvac/index.js +19 -0
- package/dist/qvac/index.js.map +1 -0
- package/dist/qvac/parse.d.ts +44 -0
- package/dist/qvac/parse.d.ts.map +1 -0
- package/dist/qvac/parse.js +28 -0
- package/dist/qvac/parse.js.map +1 -0
- package/dist/qvac/provider.d.ts +49 -0
- package/dist/qvac/provider.d.ts.map +1 -0
- package/dist/qvac/provider.js +68 -0
- package/dist/qvac/provider.js.map +1 -0
- package/dist/qvac/stream.d.ts +37 -0
- package/dist/qvac/stream.d.ts.map +1 -0
- package/dist/qvac/stream.js +29 -0
- package/dist/qvac/stream.js.map +1 -0
- package/dist/qvac/text.d.ts +19 -0
- package/dist/qvac/text.d.ts.map +1 -0
- package/dist/qvac/text.js +56 -0
- package/dist/qvac/text.js.map +1 -0
- package/dist/qvac/voice.d.ts +69 -0
- package/dist/qvac/voice.d.ts.map +1 -0
- package/dist/qvac/voice.js +51 -0
- package/dist/qvac/voice.js.map +1 -0
- package/dist/recipe/kaleidoswap-atomic.d.ts +27 -0
- package/dist/recipe/kaleidoswap-atomic.d.ts.map +1 -0
- package/dist/recipe/kaleidoswap-atomic.js +111 -0
- package/dist/recipe/kaleidoswap-atomic.js.map +1 -0
- package/dist/recipe/runner.d.ts.map +1 -1
- package/dist/recipe/runner.js +13 -1
- package/dist/recipe/runner.js.map +1 -1
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +20 -2
- package/dist/skills/registry.js.map +1 -1
- package/dist/wallet/confirm.d.ts +12 -0
- package/dist/wallet/confirm.d.ts.map +1 -0
- package/dist/wallet/confirm.js +67 -0
- package/dist/wallet/confirm.js.map +1 -0
- package/package.json +16 -1
- package/skills/README.md +6 -1
- package/skills/kaleido-lsps/SKILL.md +56 -0
- package/skills/kaleido-trading/SKILL.md +85 -18
- package/skills/merchant-finder/SKILL.md +87 -0
- package/skills/paid-data/SKILL.md +12 -0
- package/skills/wallet-assistant/SKILL.md +38 -0
- package/src/capabilities.ts +12 -0
- package/src/context/context.test.ts +6 -2
- package/src/engine.ts +6 -0
- package/src/funnel.ts +32 -7
- package/src/index.ts +43 -0
- package/src/kaleidoswap/contract.test.ts +147 -0
- package/src/kaleidoswap/contract.ts +212 -0
- package/src/knowledge/btc-map.test.ts +188 -0
- package/src/knowledge/btc-map.ts +446 -0
- package/src/lsps1/contract.test.ts +81 -0
- package/src/lsps1/contract.ts +132 -0
- package/src/memory/memory.test.ts +55 -0
- package/src/memory/store.ts +49 -4
- package/src/memory/types.ts +13 -0
- package/src/qvac/assistant.test.ts +132 -0
- package/src/qvac/assistant.ts +146 -0
- package/src/qvac/config.test.ts +44 -0
- package/src/qvac/config.ts +76 -0
- package/src/qvac/delegate.test.ts +68 -0
- package/src/qvac/delegate.ts +71 -0
- package/src/qvac/index.ts +72 -0
- package/src/qvac/parse.test.ts +52 -0
- package/src/qvac/parse.ts +57 -0
- package/src/qvac/provider.test.ts +107 -0
- package/src/qvac/provider.ts +124 -0
- package/src/qvac/stream.test.ts +79 -0
- package/src/qvac/stream.ts +56 -0
- package/src/qvac/text.test.ts +70 -0
- package/src/qvac/text.ts +60 -0
- package/src/qvac/voice.test.ts +151 -0
- package/src/qvac/voice.ts +122 -0
- package/src/recipe/kaleidoswap-atomic.test.ts +138 -0
- package/src/recipe/kaleidoswap-atomic.ts +117 -0
- package/src/recipe/runner.ts +13 -1
- package/src/skills/registry.ts +21 -2
- package/src/skills/skills.test.ts +42 -0
- package/src/wallet/confirm.test.ts +57 -0
- package/src/wallet/confirm.ts +74 -0
- package/skills/kaleido-wallet/SKILL.md +0 -28
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createQvacProvider — turns `@qvac/sdk` `completion()` into the shared
|
|
3
|
+
* `@kaleidorg/mind` `LLMProvider` the Engine/Funnel consumes. This is the one
|
|
4
|
+
* place the SDK is called for inference; every host (rate, desktop provider,
|
|
5
|
+
* cli) uses it instead of hand-rolling its own completion wrapper.
|
|
6
|
+
*
|
|
7
|
+
* The SDK functions are *injected*, not imported, so this package carries no
|
|
8
|
+
* runtime dependency on `@qvac/sdk` (the import below is type-only and erased).
|
|
9
|
+
* Hosts pass their own `completion`/`cancel` — rate the static RN import, the
|
|
10
|
+
* desktop sidecar its lazily-loaded SDK facade — which also makes this provider
|
|
11
|
+
* unit-testable with a fake completion.
|
|
12
|
+
*
|
|
13
|
+
* The host owns model lifecycle (load/unload, local-vs-delegated) and passes
|
|
14
|
+
* `getModelId()` so a turn always runs against the currently-loaded model.
|
|
15
|
+
* Tools are forwarded by schema only; the Engine executes them via its
|
|
16
|
+
* ToolSources, so signing/spending stays on the host even when inference is
|
|
17
|
+
* delegated to a desktop peer.
|
|
18
|
+
*/
|
|
19
|
+
import type * as QvacSdk from '@qvac/sdk';
|
|
20
|
+
import type { LLMProvider, TurnInput } from '../providers/types.js';
|
|
21
|
+
type CompletionFn = typeof QvacSdk.completion;
|
|
22
|
+
type CancelFn = typeof QvacSdk.cancel;
|
|
23
|
+
export interface QvacProviderOptions {
|
|
24
|
+
/** The SDK's `completion` (injected — see module docs). */
|
|
25
|
+
completion: CompletionFn;
|
|
26
|
+
/** The SDK's `cancel` (injected). */
|
|
27
|
+
cancel: CancelFn;
|
|
28
|
+
/** Resolve the loaded model id for this turn (null ⇒ not loaded → throws). */
|
|
29
|
+
getModelId: () => string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Default sampling temperature. Omit to leave it to the SDK/model default —
|
|
32
|
+
* `generationParams` is only sent when a temperature or max-tokens is set, so
|
|
33
|
+
* a host that passes neither preserves the SDK's own defaults.
|
|
34
|
+
*/
|
|
35
|
+
defaultTemperature?: number;
|
|
36
|
+
/** Default max output tokens — caps a turn so it can't ramble. Omit for uncapped. */
|
|
37
|
+
defaultMaxTokens?: number;
|
|
38
|
+
/** Stream the model's `<think>` reasoning, when a host wants to surface it. */
|
|
39
|
+
onThinking?: (token: string) => void;
|
|
40
|
+
}
|
|
41
|
+
/** TurnInput plus the per-call knobs the funnel/voice paths pass through. */
|
|
42
|
+
export interface QvacTurnInput extends TurnInput {
|
|
43
|
+
temperature?: number;
|
|
44
|
+
maxTokens?: number;
|
|
45
|
+
onThinking?: (token: string) => void;
|
|
46
|
+
}
|
|
47
|
+
export declare function createQvacProvider(options: QvacProviderOptions): LLMProvider;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/qvac/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,KAAK,OAAO,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAc,MAAM,uBAAuB,CAAC;AAGhF,KAAK,YAAY,GAAG,OAAO,OAAO,CAAC,UAAU,CAAC;AAC9C,KAAK,QAAQ,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,UAAU,EAAE,YAAY,CAAC;IACzB,qCAAqC;IACrC,MAAM,EAAE,QAAQ,CAAC;IACjB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,WAAW,CAwE5E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { consumeRun } from './stream.js';
|
|
2
|
+
export function createQvacProvider(options) {
|
|
3
|
+
return {
|
|
4
|
+
name: 'qvac',
|
|
5
|
+
async runTurn(input) {
|
|
6
|
+
const modelId = options.getModelId();
|
|
7
|
+
if (!modelId)
|
|
8
|
+
throw new Error('QVAC model not loaded');
|
|
9
|
+
const history = input.system
|
|
10
|
+
? [{ role: 'system', content: input.system }, ...input.messages]
|
|
11
|
+
: input.messages;
|
|
12
|
+
// Tools are forwarded by schema only (name/description/parameters). We
|
|
13
|
+
// carry `parameters` through verbatim (Zod for in-process tools, JSON
|
|
14
|
+
// Schema for MCP) — the model only needs the shape to pick a call; the
|
|
15
|
+
// Engine validates + executes.
|
|
16
|
+
const tools = input.tools.length
|
|
17
|
+
? input.tools.map((t) => ({
|
|
18
|
+
name: t.name,
|
|
19
|
+
description: t.description,
|
|
20
|
+
parameters: t.parameters,
|
|
21
|
+
}))
|
|
22
|
+
: undefined;
|
|
23
|
+
// QVAC 0.13 nests sampling under `generationParams`; top-level
|
|
24
|
+
// `temperature`/`max_tokens` (as older rate code passed) are dropped by
|
|
25
|
+
// validation, so the cap silently no-op'd. Build it here, and only send it
|
|
26
|
+
// when a value is set so a host that passes neither keeps SDK defaults.
|
|
27
|
+
const temp = input.temperature ?? options.defaultTemperature;
|
|
28
|
+
const predict = input.maxTokens ?? options.defaultMaxTokens;
|
|
29
|
+
const generationParams = temp !== undefined || predict !== undefined
|
|
30
|
+
? {
|
|
31
|
+
...(temp !== undefined ? { temp } : {}),
|
|
32
|
+
...(predict !== undefined ? { predict } : {}),
|
|
33
|
+
}
|
|
34
|
+
: undefined;
|
|
35
|
+
const run = options.completion({
|
|
36
|
+
modelId,
|
|
37
|
+
history,
|
|
38
|
+
stream: true,
|
|
39
|
+
// Split `<think>` into separate thinkingDelta events so reasoning never
|
|
40
|
+
// pollutes the visible answer.
|
|
41
|
+
captureThinking: true,
|
|
42
|
+
...(generationParams ? { generationParams } : {}),
|
|
43
|
+
...(tools ? { tools } : {}),
|
|
44
|
+
});
|
|
45
|
+
const result = await consumeRun(run, {
|
|
46
|
+
onToken: input.onToken,
|
|
47
|
+
onThinking: input.onThinking ?? options.onThinking,
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
text: result.text,
|
|
51
|
+
rawContent: result.rawContent,
|
|
52
|
+
toolCalls: result.toolCalls,
|
|
53
|
+
requestId: result.requestId,
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
async cancel(requestId) {
|
|
57
|
+
// The cancel only lands once the server has begun the request; a same-tick
|
|
58
|
+
// cancel may race the begin and is logged as a no-match by the SDK.
|
|
59
|
+
try {
|
|
60
|
+
await options.cancel({ requestId });
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.warn('[qvac] cancel failed:', err);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/qvac/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consume a QVAC `completion()` run: drain the event stream (forwarding visible
|
|
3
|
+
* + thinking tokens) and fold the `final` frame into a ParsedTurn.
|
|
4
|
+
*
|
|
5
|
+
* Defined over a structural `CompletionRunLike` (not the SDK type) so it stays
|
|
6
|
+
* SDK-free and unit-testable with a fake run — the real `CompletionRun` is
|
|
7
|
+
* assignable to it. The actual `@qvac/sdk` import lives in `provider.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import { type ParsedTurn, type QvacFinalLike } from './parse.js';
|
|
10
|
+
/** Minimal shape of a QVAC completion event we react to. */
|
|
11
|
+
export interface CompletionEventLike {
|
|
12
|
+
type: string;
|
|
13
|
+
/** Present on `contentDelta` / `thinkingDelta` / `rawDelta`. */
|
|
14
|
+
text?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Structural subset of `completion()`'s return we depend on. */
|
|
17
|
+
export interface CompletionRunLike {
|
|
18
|
+
requestId: string;
|
|
19
|
+
events: AsyncIterable<CompletionEventLike>;
|
|
20
|
+
final: Promise<QvacFinalLike>;
|
|
21
|
+
}
|
|
22
|
+
export interface StreamHandlers {
|
|
23
|
+
/** Visible assistant tokens (excludes `<think>` reasoning). */
|
|
24
|
+
onToken?: (token: string) => void;
|
|
25
|
+
/** The model's `<think>` reasoning, streamed separately. */
|
|
26
|
+
onThinking?: (token: string) => void;
|
|
27
|
+
}
|
|
28
|
+
export interface ConsumedTurn extends ParsedTurn {
|
|
29
|
+
requestId: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Stream a run to completion. `contentDelta` → onToken (and the streamed
|
|
33
|
+
* fallback text), `thinkingDelta` → onThinking. Returns the parsed turn plus the
|
|
34
|
+
* run's `requestId` (for cancellation bookkeeping by the caller).
|
|
35
|
+
*/
|
|
36
|
+
export declare function consumeRun(run: CompletionRunLike, handlers?: StreamHandlers): Promise<ConsumedTurn>;
|
|
37
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/qvac/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9E,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IAC3C,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,GAAE,cAAmB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAYvB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consume a QVAC `completion()` run: drain the event stream (forwarding visible
|
|
3
|
+
* + thinking tokens) and fold the `final` frame into a ParsedTurn.
|
|
4
|
+
*
|
|
5
|
+
* Defined over a structural `CompletionRunLike` (not the SDK type) so it stays
|
|
6
|
+
* SDK-free and unit-testable with a fake run — the real `CompletionRun` is
|
|
7
|
+
* assignable to it. The actual `@qvac/sdk` import lives in `provider.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import { finalToTurn } from './parse.js';
|
|
10
|
+
/**
|
|
11
|
+
* Stream a run to completion. `contentDelta` → onToken (and the streamed
|
|
12
|
+
* fallback text), `thinkingDelta` → onThinking. Returns the parsed turn plus the
|
|
13
|
+
* run's `requestId` (for cancellation bookkeeping by the caller).
|
|
14
|
+
*/
|
|
15
|
+
export async function consumeRun(run, handlers = {}) {
|
|
16
|
+
let streamed = '';
|
|
17
|
+
for await (const event of run.events) {
|
|
18
|
+
if (event.type === 'contentDelta' && typeof event.text === 'string') {
|
|
19
|
+
streamed += event.text;
|
|
20
|
+
handlers.onToken?.(event.text);
|
|
21
|
+
}
|
|
22
|
+
else if (event.type === 'thinkingDelta' && typeof event.text === 'string') {
|
|
23
|
+
handlers.onThinking?.(event.text);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const final = await run.final;
|
|
27
|
+
return { ...finalToTurn(final, streamed), requestId: run.requestId };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/qvac/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAC;AA2B9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAsB,EACtB,WAA2B,EAAE;IAE7B,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpE,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC;YACvB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5E,QAAQ,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC;IAC9B,OAAO,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure text helpers for QVAC output. No SDK, no platform — safe to run and test
|
|
3
|
+
* anywhere. Lifted verbatim from rate's QVACService so every host shares one
|
|
4
|
+
* implementation instead of drifting copies.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Clean a raw assistant completion into user-visible text:
|
|
8
|
+
* - drop `<think>…</think>` reasoning (small models leak it into content),
|
|
9
|
+
* - drop a leading `{"name":…,"arguments":…}` tool-call object some tiny models
|
|
10
|
+
* emit as plain text, keeping any natural-language sentence that follows.
|
|
11
|
+
*/
|
|
12
|
+
export declare function cleanAssistantVisibleText(text: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Make text safe for the SUPERTONIC TTS model: redact payment strings (so they
|
|
15
|
+
* are never read aloud), strip markdown/code, normalize smart punctuation, and
|
|
16
|
+
* drop any non-ASCII or backtick (U+0060) the model can't synthesize.
|
|
17
|
+
*/
|
|
18
|
+
export declare function sanitizeForSupertonic(text: string): string;
|
|
19
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/qvac/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB9D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsB1D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure text helpers for QVAC output. No SDK, no platform — safe to run and test
|
|
3
|
+
* anywhere. Lifted verbatim from rate's QVACService so every host shares one
|
|
4
|
+
* implementation instead of drifting copies.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Clean a raw assistant completion into user-visible text:
|
|
8
|
+
* - drop `<think>…</think>` reasoning (small models leak it into content),
|
|
9
|
+
* - drop a leading `{"name":…,"arguments":…}` tool-call object some tiny models
|
|
10
|
+
* emit as plain text, keeping any natural-language sentence that follows.
|
|
11
|
+
*/
|
|
12
|
+
export function cleanAssistantVisibleText(text) {
|
|
13
|
+
let cleaned = text
|
|
14
|
+
// Qwen-style reasoning sometimes arrives in contentText. Never show/speak it.
|
|
15
|
+
.replace(/<think\b[\s\S]*?<\/think>/gi, ' ')
|
|
16
|
+
.replace(/<think\b[\s\S]*$/gi, ' ')
|
|
17
|
+
.replace(/\s+/g, ' ')
|
|
18
|
+
.trim();
|
|
19
|
+
// Some small local models emit a tool-call object as plain text. Drop the
|
|
20
|
+
// leading fragment and keep any natural-language sentence that follows.
|
|
21
|
+
const toolPrefix = cleaned.match(/^\s*\{?\s*"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*/i);
|
|
22
|
+
if (toolPrefix) {
|
|
23
|
+
cleaned = cleaned.slice(toolPrefix[0].length).replace(/^\s*\{?\s*/, '').trim();
|
|
24
|
+
}
|
|
25
|
+
return cleaned
|
|
26
|
+
.replace(/\s+/g, ' ')
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Make text safe for the SUPERTONIC TTS model: redact payment strings (so they
|
|
31
|
+
* are never read aloud), strip markdown/code, normalize smart punctuation, and
|
|
32
|
+
* drop any non-ASCII or backtick (U+0060) the model can't synthesize.
|
|
33
|
+
*/
|
|
34
|
+
export function sanitizeForSupertonic(text) {
|
|
35
|
+
const normalized = text
|
|
36
|
+
.replace(/\b(?:lightning:)?ln(?:bc|tb|bcrt)[a-z0-9]{40,}\b/gi, 'Lightning invoice')
|
|
37
|
+
.replace(/\blnurl[0-9a-z]{40,}\b/gi, 'Lightning payment link')
|
|
38
|
+
.replace(/```[\s\S]*?```/g, ' ')
|
|
39
|
+
.replace(/`([^`]*)`/g, '$1')
|
|
40
|
+
.replace(/[`´ˋ′*_~#<>|[\]{}]/g, ' ')
|
|
41
|
+
.replace(/[“”]/g, '"')
|
|
42
|
+
.replace(/[‘’]/g, "'")
|
|
43
|
+
.replace(/[•·]/g, '. ')
|
|
44
|
+
.replace(/[^\x09\x0A\x0D\x20-\x7E]/g, ' ')
|
|
45
|
+
.replace(/\s+/g, ' ');
|
|
46
|
+
return Array.from(normalized)
|
|
47
|
+
.filter((ch) => {
|
|
48
|
+
const code = ch.charCodeAt(0);
|
|
49
|
+
return (code === 0x09 || code === 0x0A || code === 0x0D || (code >= 0x20 && code <= 0x7E)) &&
|
|
50
|
+
code !== 0x60;
|
|
51
|
+
})
|
|
52
|
+
.join('')
|
|
53
|
+
.replace(/\s+/g, ' ')
|
|
54
|
+
.trim();
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/qvac/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,IAAI,OAAO,GAAG,IAAI;QAChB,8EAA8E;SAC7E,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC;SAClC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IAEV,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC7F,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,OAAO,OAAO;SACX,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,oDAAoD,EAAE,mBAAmB,CAAC;SAClF,OAAO,CAAC,0BAA0B,EAAE,wBAAwB,CAAC;SAC7D,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACnC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;SAC1B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;YACxF,IAAI,KAAK,IAAI,CAAC;IAClB,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC;SACR,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice runtime ops shared across hosts: one-shot transcription (Whisper) and
|
|
3
|
+
* speech synthesis (SUPERTONIC TTS). Like the provider, the SDK functions are
|
|
4
|
+
* injected (type-only `@qvac/sdk` import, erased at build) so this carries no
|
|
5
|
+
* runtime SDK dependency and is unit-testable with fakes.
|
|
6
|
+
*
|
|
7
|
+
* The host still owns model lifecycle (download, load, local-vs-delegated) and
|
|
8
|
+
* audio I/O (mic capture, playback). It passes the loaded model-id resolvers;
|
|
9
|
+
* this module does the SDK calls + the text gating that must be identical
|
|
10
|
+
* everywhere (payment-string redaction, U+0060 refusal, file:// stripping).
|
|
11
|
+
*
|
|
12
|
+
* The streaming voice-assistant loop (transcribeStream + VAD) builds on top of
|
|
13
|
+
* these in a later pass.
|
|
14
|
+
*/
|
|
15
|
+
import type * as QvacSdk from '@qvac/sdk';
|
|
16
|
+
import type { VoiceTranscriptEvent } from './assistant.js';
|
|
17
|
+
type TranscribeFn = typeof QvacSdk.transcribe;
|
|
18
|
+
type TextToSpeechFn = typeof QvacSdk.textToSpeech;
|
|
19
|
+
type TranscribeStreamFn = typeof QvacSdk.transcribeStream;
|
|
20
|
+
/** 16-bit PCM samples plus their sample rate, ready for the host to play. */
|
|
21
|
+
export interface PcmAudio {
|
|
22
|
+
pcm: number[];
|
|
23
|
+
sampleRate: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A live VAD transcription session: feed mic audio with `write()`, iterate to
|
|
27
|
+
* receive `text`/`vad`/`endOfTurn` events, `end()` when audio stops. Pass it
|
|
28
|
+
* straight to `runVoiceAssistant`.
|
|
29
|
+
*/
|
|
30
|
+
export interface VoiceSession {
|
|
31
|
+
write(audioChunk: Uint8Array): void;
|
|
32
|
+
end(): void;
|
|
33
|
+
destroy(): void;
|
|
34
|
+
[Symbol.asyncIterator](): AsyncIterator<VoiceTranscriptEvent>;
|
|
35
|
+
}
|
|
36
|
+
export interface QvacVoiceOptions {
|
|
37
|
+
/** The SDK's `transcribe` (injected). */
|
|
38
|
+
transcribe: TranscribeFn;
|
|
39
|
+
/** The SDK's `textToSpeech` (injected). */
|
|
40
|
+
textToSpeech: TextToSpeechFn;
|
|
41
|
+
/** The SDK's `transcribeStream` (injected) — only needed for `openVoiceSession`. */
|
|
42
|
+
transcribeStream?: TranscribeStreamFn;
|
|
43
|
+
/** Resolve the loaded Whisper model id (null ⇒ not loaded → throws). */
|
|
44
|
+
getWhisperModelId: () => string | null;
|
|
45
|
+
/** Resolve the loaded TTS model id (null ⇒ not loaded → returns null). */
|
|
46
|
+
getTtsModelId: () => string | null;
|
|
47
|
+
/** TTS output sample rate; defaults to SUPERTONIC-2's 44.1 kHz. */
|
|
48
|
+
ttsSampleRate?: number;
|
|
49
|
+
}
|
|
50
|
+
export interface QvacVoice {
|
|
51
|
+
/** Transcribe an audio file (path or `file://` URI) to text. */
|
|
52
|
+
transcribeAudio(audioUri: string): Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Synthesize speech for `text`. Returns PCM + sample rate, or `null` when TTS
|
|
55
|
+
* is unavailable or the text is empty after sanitization (host falls back to
|
|
56
|
+
* the system voice). Payment strings are redacted so they're never read aloud.
|
|
57
|
+
*/
|
|
58
|
+
synthesizeSpeech(text: string): Promise<PcmAudio | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Open a hands-free VAD transcription session (continuous voice). Requires
|
|
61
|
+
* `transcribeStream` to have been provided. Merge in `paramsOverride` to tune
|
|
62
|
+
* the defaults ({@link DEFAULT_VOICE_STREAM_PARAMS}). Feed the returned session
|
|
63
|
+
* to `runVoiceAssistant`.
|
|
64
|
+
*/
|
|
65
|
+
openVoiceSession(paramsOverride?: Record<string, unknown>): Promise<VoiceSession>;
|
|
66
|
+
}
|
|
67
|
+
export declare function createQvacVoice(options: QvacVoiceOptions): QvacVoice;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=voice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/qvac/voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,OAAO,MAAM,WAAW,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,KAAK,YAAY,GAAG,OAAO,OAAO,CAAC,UAAU,CAAC;AAC9C,KAAK,cAAc,GAAG,OAAO,OAAO,CAAC,YAAY,CAAC;AAClD,KAAK,kBAAkB,GAAG,OAAO,OAAO,CAAC,gBAAgB,CAAC;AAE1D,6EAA6E;AAC7E,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACpC,GAAG,IAAI,IAAI,CAAC;IACZ,OAAO,IAAI,IAAI,CAAC;IAChB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,UAAU,EAAE,YAAY,CAAC;IACzB,2CAA2C;IAC3C,YAAY,EAAE,cAAc,CAAC;IAC7B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACvC,0EAA0E;IAC1E,aAAa,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACnC,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzD;;;;;OAKG;IACH,gBAAgB,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,CA+CpE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { sanitizeForSupertonic } from './text.js';
|
|
2
|
+
import { TTS_SAMPLE_RATE, DEFAULT_VOICE_STREAM_PARAMS } from './config.js';
|
|
3
|
+
export function createQvacVoice(options) {
|
|
4
|
+
const sampleRate = options.ttsSampleRate ?? TTS_SAMPLE_RATE;
|
|
5
|
+
return {
|
|
6
|
+
async transcribeAudio(audioUri) {
|
|
7
|
+
const modelId = options.getWhisperModelId();
|
|
8
|
+
if (!modelId)
|
|
9
|
+
throw new Error('Whisper model not loaded');
|
|
10
|
+
// The SDK's native file reader wants a plain filesystem path, not a
|
|
11
|
+
// `file://` URI — the URI raises AUDIO_FILE_NOT_FOUND even when present.
|
|
12
|
+
const audioChunk = audioUri.replace('file://', '');
|
|
13
|
+
return await options.transcribe({ modelId, audioChunk });
|
|
14
|
+
},
|
|
15
|
+
async synthesizeSpeech(text) {
|
|
16
|
+
const modelId = options.getTtsModelId();
|
|
17
|
+
if (!modelId)
|
|
18
|
+
return null;
|
|
19
|
+
const trimmed = sanitizeForSupertonic(text);
|
|
20
|
+
if (!trimmed)
|
|
21
|
+
return null;
|
|
22
|
+
// Belt-and-suspenders: SUPERTONIC chokes on U+0060; sanitize already
|
|
23
|
+
// strips it, so refuse if any slipped through rather than crash the voice.
|
|
24
|
+
if (Array.from(trimmed).some((ch) => ch.charCodeAt(0) === 0x60))
|
|
25
|
+
return null;
|
|
26
|
+
const result = options.textToSpeech({
|
|
27
|
+
modelId,
|
|
28
|
+
text: trimmed,
|
|
29
|
+
inputType: 'text',
|
|
30
|
+
stream: false,
|
|
31
|
+
});
|
|
32
|
+
const pcm = await result.buffer;
|
|
33
|
+
return { pcm, sampleRate };
|
|
34
|
+
},
|
|
35
|
+
async openVoiceSession(paramsOverride = {}) {
|
|
36
|
+
if (!options.transcribeStream) {
|
|
37
|
+
throw new Error('transcribeStream not provided — pass it in QvacVoiceOptions for voice sessions');
|
|
38
|
+
}
|
|
39
|
+
const modelId = options.getWhisperModelId();
|
|
40
|
+
if (!modelId)
|
|
41
|
+
throw new Error('Whisper model not loaded');
|
|
42
|
+
const session = await options.transcribeStream({
|
|
43
|
+
modelId,
|
|
44
|
+
...DEFAULT_VOICE_STREAM_PARAMS,
|
|
45
|
+
...paramsOverride,
|
|
46
|
+
});
|
|
47
|
+
return session;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/qvac/voice.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AA0D3E,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,IAAI,eAAe,CAAC;IAE5D,OAAO;QACL,KAAK,CAAC,eAAe,CAAC,QAAgB;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1D,oEAAoE;YACpE,yEAAyE;YACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAiC,CAAC,CAAC;QAC1F,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;YACjC,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAE1B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,qEAAqE;YACrE,2EAA2E;YAC3E,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE7E,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;gBAClC,OAAO;gBACP,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE,KAAK;aACmB,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,iBAA0C,EAAE;YACjE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;YACpG,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC;gBAC7C,OAAO;gBACP,GAAG,2BAA2B;gBAC9B,GAAG,cAAc;aACmB,CAAC,CAAC;YACxC,OAAO,OAAkC,CAAC;QAC5C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in "atomic swap on KaleidoSwap" recipe — trust-minimised chain.
|
|
3
|
+
*
|
|
4
|
+
* Most users want the simple market-order swap (`swapRecipe` over generic
|
|
5
|
+
* `get_swap_quote` / `execute_swap`). This recipe is the EXPLICIT atomic path:
|
|
6
|
+
* the user creates an RGB/LN receive invoice, the maker locks the swap, the
|
|
7
|
+
* user pays the maker's Lightning invoice, and the maker releases.
|
|
8
|
+
*
|
|
9
|
+
* Triggered only by explicit atomic-swap intent ("atomic swap", "trustless
|
|
10
|
+
* swap", "htlc swap") so it never preempts the simpler swap path for vague
|
|
11
|
+
* phrasings.
|
|
12
|
+
*
|
|
13
|
+
* "atomic swap 100000 sats for usdt"
|
|
14
|
+
* ↓ 1 model inference (slot extraction)
|
|
15
|
+
* kaleidoswap_get_quote ← maker prices the swap
|
|
16
|
+
* rln_create_rgb_invoice ← user's node prepares receive (if to_asset is RGB)
|
|
17
|
+
* rln_create_ln_invoice ← (alt) if to_asset is BTC
|
|
18
|
+
* kaleidoswap_atomic_init 🔒 ← maker locks the swap, returns its invoice
|
|
19
|
+
* rln_pay_invoice 🔒 ← user pays the maker
|
|
20
|
+
* kaleidoswap_atomic_execute 🔒 ← (final) maker releases the asset
|
|
21
|
+
*
|
|
22
|
+
* Two-or-three confirmation gates are intentional: each represents a distinct
|
|
23
|
+
* decision point. The host's confirm UI describes what's about to happen.
|
|
24
|
+
*/
|
|
25
|
+
import type { Recipe } from './types.js';
|
|
26
|
+
export declare const kaleidoswapAtomicRecipe: Recipe;
|
|
27
|
+
//# sourceMappingURL=kaleidoswap-atomic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaleidoswap-atomic.d.ts","sourceRoot":"","sources":["../../src/recipe/kaleidoswap-atomic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAUzC,eAAO,MAAM,uBAAuB,EAAE,MAiFrC,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in "atomic swap on KaleidoSwap" recipe — trust-minimised chain.
|
|
3
|
+
*
|
|
4
|
+
* Most users want the simple market-order swap (`swapRecipe` over generic
|
|
5
|
+
* `get_swap_quote` / `execute_swap`). This recipe is the EXPLICIT atomic path:
|
|
6
|
+
* the user creates an RGB/LN receive invoice, the maker locks the swap, the
|
|
7
|
+
* user pays the maker's Lightning invoice, and the maker releases.
|
|
8
|
+
*
|
|
9
|
+
* Triggered only by explicit atomic-swap intent ("atomic swap", "trustless
|
|
10
|
+
* swap", "htlc swap") so it never preempts the simpler swap path for vague
|
|
11
|
+
* phrasings.
|
|
12
|
+
*
|
|
13
|
+
* "atomic swap 100000 sats for usdt"
|
|
14
|
+
* ↓ 1 model inference (slot extraction)
|
|
15
|
+
* kaleidoswap_get_quote ← maker prices the swap
|
|
16
|
+
* rln_create_rgb_invoice ← user's node prepares receive (if to_asset is RGB)
|
|
17
|
+
* rln_create_ln_invoice ← (alt) if to_asset is BTC
|
|
18
|
+
* kaleidoswap_atomic_init 🔒 ← maker locks the swap, returns its invoice
|
|
19
|
+
* rln_pay_invoice 🔒 ← user pays the maker
|
|
20
|
+
* kaleidoswap_atomic_execute 🔒 ← (final) maker releases the asset
|
|
21
|
+
*
|
|
22
|
+
* Two-or-three confirmation gates are intentional: each represents a distinct
|
|
23
|
+
* decision point. The host's confirm UI describes what's about to happen.
|
|
24
|
+
*/
|
|
25
|
+
import { extractSwap } from './swap.js';
|
|
26
|
+
const ATOMIC_INTENT = /\b(atomic|trustless|htlc)\b.*\b(swap|exchange|convert|trade)\b|\b(swap|exchange|convert|trade)\b.*\b(atomic|trustless|htlc)\b/i;
|
|
27
|
+
function isBtc(asset) {
|
|
28
|
+
return String(asset ?? '').toUpperCase() === 'BTC';
|
|
29
|
+
}
|
|
30
|
+
export const kaleidoswapAtomicRecipe = {
|
|
31
|
+
name: 'kaleidoswap-atomic',
|
|
32
|
+
description: 'Trust-minimised atomic swap on KaleidoSwap: quote, prepare a receive invoice on the user\'s node, lock the swap with the maker, pay, and execute.',
|
|
33
|
+
match: (t) => ATOMIC_INTENT.test(t),
|
|
34
|
+
triggers: ['atomic swap', 'trustless swap', 'htlc swap'],
|
|
35
|
+
slots: [
|
|
36
|
+
{ name: 'from_asset', type: 'string', description: 'Asset to spend (BTC / USDT / XAUT)', required: true },
|
|
37
|
+
{ name: 'to_asset', type: 'string', description: 'Asset to receive (BTC / USDT / XAUT)', required: true },
|
|
38
|
+
{ name: 'amount', type: 'number', description: 'Amount of from_asset to swap' },
|
|
39
|
+
],
|
|
40
|
+
extract: extractSwap,
|
|
41
|
+
confident: (s) => !!s.from_asset && !!s.to_asset && !!s.amount,
|
|
42
|
+
steps: [
|
|
43
|
+
// 1. Maker quotes the swap. Returns { quote_id, receive_amount, fees, ttl_ms, ... }.
|
|
44
|
+
{
|
|
45
|
+
tool: 'kaleidoswap_get_quote',
|
|
46
|
+
as: 'quote',
|
|
47
|
+
args: (ctx) => ({
|
|
48
|
+
from_asset: ctx.slots.from_asset,
|
|
49
|
+
to_asset: ctx.slots.to_asset,
|
|
50
|
+
amount: ctx.slots.amount,
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
// 2a. User's node creates an RGB receive invoice (when to_asset is an RGB asset).
|
|
54
|
+
{
|
|
55
|
+
tool: 'rln_create_rgb_invoice',
|
|
56
|
+
as: 'receive_rgb',
|
|
57
|
+
args: (ctx) => {
|
|
58
|
+
const q = ctx.results.quote;
|
|
59
|
+
return { asset: ctx.slots.to_asset, amount: q?.receive_amount };
|
|
60
|
+
},
|
|
61
|
+
skipIf: (ctx) => isBtc(ctx.slots.to_asset),
|
|
62
|
+
},
|
|
63
|
+
// 2b. User's node creates an LN receive invoice (when to_asset is BTC).
|
|
64
|
+
{
|
|
65
|
+
tool: 'rln_create_ln_invoice',
|
|
66
|
+
as: 'receive_ln',
|
|
67
|
+
args: (ctx) => {
|
|
68
|
+
const q = ctx.results.quote;
|
|
69
|
+
return { amount_sats: q?.receive_amount };
|
|
70
|
+
},
|
|
71
|
+
skipIf: (ctx) => !isBtc(ctx.slots.to_asset),
|
|
72
|
+
},
|
|
73
|
+
// 3. Maker locks the swap. Returns { atomic_id, maker_invoice }. Spend-gated.
|
|
74
|
+
{
|
|
75
|
+
tool: 'kaleidoswap_atomic_init',
|
|
76
|
+
as: 'atomic',
|
|
77
|
+
args: (ctx) => {
|
|
78
|
+
const rgb = ctx.results.receive_rgb;
|
|
79
|
+
const ln = ctx.results.receive_ln;
|
|
80
|
+
const q = ctx.results.quote;
|
|
81
|
+
return {
|
|
82
|
+
quote_id: q?.quote_id,
|
|
83
|
+
receive_invoice: rgb?.invoice ?? ln?.invoice,
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
// 4. User pays the maker's Lightning invoice. Spend-gated by the wallet contract.
|
|
88
|
+
{
|
|
89
|
+
tool: 'rln_pay_invoice',
|
|
90
|
+
as: 'paid',
|
|
91
|
+
args: (ctx) => {
|
|
92
|
+
const a = ctx.results.atomic;
|
|
93
|
+
return { invoice: a?.maker_invoice };
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
// 5. Maker releases the receive asset → swap completes. Spend-gated.
|
|
98
|
+
final: {
|
|
99
|
+
tool: 'kaleidoswap_atomic_execute',
|
|
100
|
+
args: (ctx) => {
|
|
101
|
+
const a = ctx.results.atomic;
|
|
102
|
+
return { atomic_id: a?.atomic_id };
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
summary: (ctx) => {
|
|
106
|
+
const q = ctx.results.quote;
|
|
107
|
+
const tail = q?.receive_amount ? ` ≈ ${q.receive_amount} ${ctx.slots.to_asset}` : '';
|
|
108
|
+
return `Atomic swap: ${ctx.slots.amount} ${ctx.slots.from_asset} → ${ctx.slots.to_asset}${tail}.`;
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=kaleidoswap-atomic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaleidoswap-atomic.js","sourceRoot":"","sources":["../../src/recipe/kaleidoswap-atomic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/recipe/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAItE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACrG,wCAAwC;IACxC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAChF,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,iFAAiF;AACjF,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBjE;AAED,oFAAoF;AACpF,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/recipe/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAC;AAItE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACrG,wCAAwC;IACxC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAChF,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,iFAAiF;AACjF,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBjE;AAED,oFAAoF;AACpF,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsD3G;AAED,wFAAwF;AACxF,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAW;gBACd,OAAO,GAAE,MAAM,EAAO;IAGlC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAGzB,IAAI,IAAI,MAAM,EAAE;IAGhB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAGrC,mEAAmE;IACnE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAQpC"}
|
package/dist/recipe/runner.js
CHANGED
|
@@ -37,11 +37,23 @@ export async function runRecipe(recipe, text, opts) {
|
|
|
37
37
|
ctx.slots = ex.slots;
|
|
38
38
|
inferences = ex.inferences;
|
|
39
39
|
}
|
|
40
|
-
// Deterministic steps.
|
|
40
|
+
// Deterministic steps. Intermediate spend tools fire the same confirmation
|
|
41
|
+
// gate as the final step — recipes with multi-spend chains (e.g. atomic
|
|
42
|
+
// swaps) MUST have every money-moving call gated, never just the last one.
|
|
43
|
+
// Missing onConfirm fails closed, matching the Engine.
|
|
41
44
|
for (const step of recipe.steps) {
|
|
42
45
|
if (step.skipIf?.(ctx))
|
|
43
46
|
continue;
|
|
44
47
|
const args = step.args(ctx);
|
|
48
|
+
const def = await opts.tools.getDef(step.tool);
|
|
49
|
+
if (def?.requiresConfirmation) {
|
|
50
|
+
const decision = opts.onConfirm
|
|
51
|
+
? await opts.onConfirm({ name: step.tool, arguments: args })
|
|
52
|
+
: { approved: false, reason: 'no confirmation handler available' };
|
|
53
|
+
if (!decision.approved) {
|
|
54
|
+
return { recipe: recipe.name, slots: ctx.slots, results: ctx.results, text: 'Cancelled — nothing was sent.', status: 'cancelled', inferences };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
45
57
|
const result = await opts.tools.execute(step.tool, args);
|
|
46
58
|
ctx.results[step.as ?? step.tool] = result;
|
|
47
59
|
opts.onStep?.(step.tool, args, result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/recipe/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAcvC,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAqB,EACrB,MAAc,EACd,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,UAAU,GAA0D,EAAE,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK;QAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5G,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,6CAA6C;QAC1D,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;KAChH,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,EAAE,QAAQ,YAAY,iGAAiG;QAC7H,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3C,KAAK,EAAE,CAAC,WAAW,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,KAAK,EAAG,IAAI,EAAE,SAAqC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,IAAsB;IAClF,MAAM,GAAG,GAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC1E,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAC3D,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YACrB,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;QAC7B,CAAC;QAED,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/recipe/runner.ts"],"names":[],"mappings":"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"}
|