@hraness/dawg 0.6.0 → 0.7.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/CHANGELOG.md +126 -0
- package/DAWG.md +655 -141
- package/README.md +27 -25
- package/core/autotune.ts +1119 -0
- package/core/chords.ts +759 -23
- package/core/clips.ts +499 -0
- package/core/diff.ts +182 -99
- package/core/expression.ts +158 -6
- package/core/fx.ts +354 -32
- package/core/granular.ts +91 -0
- package/core/instruments.ts +180 -0
- package/core/keys.ts +573 -4
- package/core/loop.ts +5 -0
- package/core/lyrics.ts +297 -0
- package/core/master.ts +3 -3
- package/core/resonators.ts +306 -4
- package/core/routing.ts +165 -0
- package/core/score.ts +1181 -16
- package/core/sdk/eval-child.ts +7 -2
- package/core/sdk/eval.ts +35 -6
- package/core/sdk/print.ts +354 -6
- package/core/sdk/sync-lyrics.ts +49 -0
- package/core/sdk/v1.ts +3160 -69
- package/core/sections.ts +298 -24
- package/core/sing.ts +815 -0
- package/core/strings.ts +237 -2
- package/core/style-provenance.ts +80 -0
- package/core/styles/africa-mena-southasia.ts +2893 -0
- package/core/styles/americas.ts +3810 -0
- package/core/styles/art.ts +4993 -0
- package/core/styles/base.ts +123 -0
- package/core/styles/cycles.ts +106 -0
- package/core/styles/electronic.ts +2723 -0
- package/core/styles/europe-asia-pacific.ts +2838 -0
- package/core/styles/excerpt.ts +29 -0
- package/core/styles/gamelan.ts +283 -0
- package/core/styles/generate.ts +2199 -0
- package/core/styles/index.ts +515 -0
- package/core/styles/parts.ts +106 -0
- package/core/styles/pop.ts +3189 -0
- package/core/styles/rock.ts +2993 -0
- package/core/styles/roots.ts +4175 -0
- package/core/styles/schema.ts +429 -0
- package/core/styles/taxonomy.ts +940 -0
- package/core/styles/validate.ts +528 -0
- package/core/tempo.ts +32 -2
- package/core/tuning.ts +19 -3
- package/core/vocoder.ts +524 -0
- package/core/winds.ts +652 -0
- package/guides/agent.md +29 -0
- package/guides/arrange.md +30 -0
- package/guides/audition.md +20 -14
- package/guides/automation.md +12 -6
- package/guides/chords.md +16 -14
- package/guides/effects.md +17 -15
- package/guides/faders.md +20 -16
- package/guides/files.md +13 -9
- package/guides/getting-started.md +15 -11
- package/guides/keys.md +19 -15
- package/guides/media.md +17 -12
- package/guides/mix.md +12 -6
- package/guides/music.md +23 -8
- package/guides/notes.md +15 -9
- package/guides/performance.md +15 -10
- package/guides/play.md +21 -13
- package/guides/project.md +25 -8
- package/guides/providers.md +20 -14
- package/guides/resample.md +32 -0
- package/guides/rhythm.md +17 -13
- package/guides/sessions.md +17 -7
- package/guides/show-me.md +31 -0
- package/guides/sound.md +25 -9
- package/guides/sounds.md +15 -12
- package/guides/styles.md +31 -0
- package/guides/tempo.md +15 -10
- package/guides/tracks.md +15 -10
- package/guides/tuning.md +32 -0
- package/guides/voice.md +31 -0
- package/guides/web-search.md +18 -8
- package/native/prebuilt/darwin-arm64/libdawg_sink.dylib +0 -0
- package/native/prebuilt/darwin-x64/libdawg_sink.dylib +0 -0
- package/native/prebuilt/linux-arm64/libdawg_sink.so +0 -0
- package/native/prebuilt/linux-x64/libdawg_sink.so +0 -0
- package/native/prebuilt/manifest.json +21 -0
- package/package.json +5 -2
- package/src/agent/agent.ts +131 -13
- package/src/agent/calibration-tools.ts +53 -0
- package/src/agent/chord-tools.ts +153 -1
- package/src/agent/clip-tools.ts +453 -0
- package/src/agent/command-agent.ts +369 -0
- package/src/agent/drum-tools.ts +2 -2
- package/src/agent/expression-tools.ts +91 -0
- package/src/agent/gateway.ts +246 -60
- package/src/agent/models.ts +53 -12
- package/src/agent/ops.ts +15 -1
- package/src/agent/pack-tools.ts +1 -1
- package/src/agent/planner.ts +13 -0
- package/src/agent/portable-schema.ts +80 -0
- package/src/agent/preview-tool.ts +5 -1
- package/src/agent/provider.ts +22 -8
- package/src/agent/resample-tool.ts +131 -0
- package/src/agent/rhythm-tools.ts +1 -1
- package/src/agent/section-tools.ts +1 -1
- package/src/agent/show-me.ts +497 -0
- package/src/agent/steer.ts +15 -0
- package/src/agent/style-tools.ts +217 -0
- package/src/agent/tool-error.ts +12 -0
- package/src/agent/tools.ts +307 -37
- package/src/agent/usage.ts +2 -2
- package/src/agent/voice-tools.ts +925 -0
- package/src/agent/xcb-agent.ts +16 -6
- package/src/argv.ts +38 -0
- package/src/audio/analysis.ts +253 -0
- package/src/audio/arrange.ts +58 -3
- package/src/audio/autotune-engine.ts +101 -0
- package/src/audio/autotune.ts +640 -0
- package/src/audio/clips.ts +240 -0
- package/src/audio/doctor.ts +86 -0
- package/src/audio/dsp/bandbank.ts +138 -0
- package/src/audio/dsp/envelope.ts +171 -0
- package/src/audio/dsp/follow.ts +120 -0
- package/src/audio/dsp/formant.ts +427 -0
- package/src/audio/dsp/glottal.ts +243 -0
- package/src/audio/dsp/interp.ts +7 -2
- package/src/audio/dsp/lpc.ts +50 -0
- package/src/audio/dsp/periodicity.ts +59 -0
- package/src/audio/dsp/pitch.ts +995 -0
- package/src/audio/dsp/psola.ts +199 -0
- package/src/audio/dsp/shift.ts +256 -0
- package/src/audio/effects/chain.ts +21 -4
- package/src/audio/effects/common.ts +57 -0
- package/src/audio/effects/convolution.ts +113 -5
- package/src/audio/effects/filter.ts +48 -69
- package/src/audio/effects/formant.ts +263 -0
- package/src/audio/effects/gaze.ts +354 -0
- package/src/audio/engine.ts +206 -33
- package/src/audio/fit.ts +80 -3
- package/src/audio/granular.ts +352 -21
- package/src/audio/instrument-check.ts +67 -47
- package/src/audio/instruments.ts +36 -3
- package/src/audio/keys/calibration.ts +56 -0
- package/src/audio/keys/electric.ts +427 -0
- package/src/audio/keys/engine.ts +156 -20
- package/src/audio/keys/organ.ts +1335 -0
- package/src/audio/keys/piano.ts +72 -8
- package/src/audio/keys/sympathetic.ts +127 -0
- package/src/audio/kits.ts +135 -6
- package/src/audio/live-worker.ts +3 -1
- package/src/audio/live.ts +247 -26
- package/src/audio/native.ts +615 -0
- package/src/audio/preview.ts +45 -3
- package/src/audio/render-worker.ts +2 -0
- package/src/audio/renderer.ts +2 -0
- package/src/audio/resample.ts +286 -0
- package/src/audio/resonators.ts +10 -2
- package/src/audio/sampler.ts +252 -24
- package/src/audio/samples.ts +46 -3
- package/src/audio/sing/analysis.ts +193 -0
- package/src/audio/sing/engine.ts +949 -0
- package/src/audio/strings/body.ts +29 -16
- package/src/audio/strings/bow.ts +699 -0
- package/src/audio/strings/engine.ts +274 -22
- package/src/audio/strings/measure.test-helpers.ts +2 -0
- package/src/audio/synth/oscillators.ts +31 -21
- package/src/audio/synth/voice.ts +34 -1
- package/src/audio/vocoder/bank.ts +314 -0
- package/src/audio/vocoder/carrier.ts +165 -0
- package/src/audio/vocoder/control.ts +68 -0
- package/src/audio/vocoder/detect.ts +50 -0
- package/src/audio/vocoder/index.ts +304 -0
- package/src/audio/vocoder/talkbox.ts +143 -0
- package/src/audio/wav.ts +608 -85
- package/src/audio/winds/engine.ts +306 -0
- package/src/audio/winds/filters.ts +153 -0
- package/src/audio/winds/pitch.ts +104 -0
- package/src/audio/winds/trim.ts +104 -0
- package/src/audio/winds/trims.ts +917 -0
- package/src/audio/winds/trims1.ts +297 -0
- package/src/audio/winds/voice.ts +492 -0
- package/src/auth/cli.ts +38 -36
- package/src/auth/credentials.ts +30 -1
- package/src/auth/login.ts +15 -9
- package/src/auth/tui.ts +19 -10
- package/src/commands/arrange.ts +44 -29
- package/src/commands/autotune.ts +421 -0
- package/src/commands/calibration.ts +74 -0
- package/src/commands/clips.ts +887 -0
- package/src/commands/drums.ts +3 -2
- package/src/commands/edit.ts +11 -4
- package/src/commands/expression.ts +104 -23
- package/src/commands/formant.ts +221 -0
- package/src/commands/fx.ts +105 -33
- package/src/commands/grammar.ts +558 -0
- package/src/commands/granular.ts +7 -2
- package/src/commands/help.ts +652 -339
- package/src/commands/history.ts +18 -0
- package/src/commands/keys.ts +293 -17
- package/src/commands/modal.ts +67 -4
- package/src/commands/music.ts +1 -1
- package/src/commands/nearest.ts +53 -0
- package/src/commands/pack.ts +9 -2
- package/src/commands/param-range.ts +56 -0
- package/src/commands/parses.ts +130 -0
- package/src/commands/progression.ts +170 -0
- package/src/commands/resample.ts +281 -0
- package/src/commands/rhythm.ts +3 -0
- package/src/commands/rig.ts +8 -25
- package/src/commands/sample.ts +49 -2
- package/src/commands/shift.ts +119 -0
- package/src/commands/sing.ts +478 -0
- package/src/commands/string.ts +28 -2
- package/src/commands/strum.ts +485 -0
- package/src/commands/style.ts +415 -0
- package/src/commands/time.ts +6 -3
- package/src/commands/tuning.ts +3 -3
- package/src/commands/vocal-pitch.ts +616 -0
- package/src/commands/vocal.ts +147 -0
- package/src/commands/vocoder.ts +627 -0
- package/src/commands/wind.ts +244 -0
- package/src/fs/durable.ts +50 -0
- package/src/lang/glossary.ts +493 -0
- package/src/launch-args.ts +163 -0
- package/src/main.ts +1521 -255
- package/src/media/cli.ts +20 -3
- package/src/media/import.ts +3 -1
- package/src/project/check.ts +26 -3
- package/src/project/clip-pins.ts +72 -0
- package/src/project/init.ts +23 -8
- package/src/project/sync.ts +418 -86
- package/src/render.ts +36 -1
- package/src/session/daemon.ts +3 -0
- package/src/session/meta.ts +14 -0
- package/src/session/origin.ts +154 -0
- package/src/session/port.ts +22 -4
- package/src/session/presence.ts +50 -7
- package/src/session/protocol.ts +5 -1
- package/src/session/rebase.ts +18 -5
- package/src/session/receipt.ts +258 -0
- package/src/session/store.ts +65 -43
- package/src/tui/arrange-menu.ts +65 -31
- package/src/tui/audition.ts +1 -1
- package/src/tui/euclid.ts +18 -13
- package/src/tui/fader.ts +228 -41
- package/src/tui/granular-menu.ts +2 -4
- package/src/tui/menu-clips.ts +297 -0
- package/src/tui/menu-time.ts +20 -13
- package/src/tui/menu-voice.ts +405 -0
- package/src/tui/menu.ts +1377 -193
- package/src/tui/modal-menu.ts +38 -11
- package/src/tui/performance-menu.ts +46 -1
- package/src/tui/play-chords.ts +108 -5
- package/src/tui/play-mode.ts +16 -1
- package/src/tui/play-session.ts +81 -16
- package/src/tui/sing-menu.ts +278 -0
- package/src/tui/style-menu.ts +104 -0
- package/src/tui/vocoder-menu.ts +244 -0
- package/src/tui/wind-menu.ts +144 -0
- package/src/version.ts +8 -0
- package/src/web/fetch.ts +115 -29
- package/tui/activity.ts +180 -9
- package/tui/app.ts +274 -40
- package/tui/clip-row.ts +132 -0
- package/tui/delight.ts +144 -0
- package/tui/drawer.ts +70 -22
- package/tui/frame-gate.ts +76 -0
- package/tui/grammar.ts +112 -63
- package/tui/guide.ts +42 -4
- package/tui/highway.ts +269 -25
- package/tui/hints.ts +192 -0
- package/tui/input.ts +60 -9
- package/tui/keys.ts +1 -1
- package/tui/play-strip.ts +68 -14
- package/tui/prompt.ts +1 -1
- package/tui/screen.ts +144 -14
- package/tui/theme.ts +27 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent tools for the style engine (core/styles): `list_styles` and
|
|
3
|
+
* `style_info` read the taxonomy and cards; `apply_style` generates a song
|
|
4
|
+
* from a style (optionally blended with a second one) and replaces the
|
|
5
|
+
* score with it in one undo step, the same path as the `style` command.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { DiffError, diffScores } from "../../core/diff.ts";
|
|
9
|
+
import { STYLE_TREE, searchStyles } from "../../core/styles/index.ts";
|
|
10
|
+
import {
|
|
11
|
+
STYLE_LIMITS,
|
|
12
|
+
StyleError,
|
|
13
|
+
styleScore,
|
|
14
|
+
} from "../../core/styles/generate.ts";
|
|
15
|
+
import { STYLE_FAMILIES } from "../../core/styles/taxonomy.ts";
|
|
16
|
+
import { resolveStyle } from "../../core/styles/index.ts";
|
|
17
|
+
import {
|
|
18
|
+
describeStyle,
|
|
19
|
+
findStyle,
|
|
20
|
+
generateFromCommand,
|
|
21
|
+
generatedSummary,
|
|
22
|
+
} from "../commands/style.ts";
|
|
23
|
+
import type { AgentTool } from "./tools.ts";
|
|
24
|
+
|
|
25
|
+
class StyleToolError extends Error {
|
|
26
|
+
constructor(message: string) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "ToolArgumentError";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const MAX_LIST = 60;
|
|
33
|
+
|
|
34
|
+
function nodeJSON(id: string) {
|
|
35
|
+
const node = STYLE_TREE.get(id)!;
|
|
36
|
+
return {
|
|
37
|
+
id,
|
|
38
|
+
title: node.title,
|
|
39
|
+
...(node.leaf ? {} : { children: node.children.length }),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function knownStyle(value: unknown, name: string): string {
|
|
44
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 120)
|
|
45
|
+
throw new StyleToolError(`${name} must be a style id or name`);
|
|
46
|
+
const id = findStyle(value);
|
|
47
|
+
if (!id) {
|
|
48
|
+
const near = searchStyles(value, 5).map((match) => match.id);
|
|
49
|
+
throw new StyleToolError(
|
|
50
|
+
`no style "${value}"${near.length ? `; did you mean ${near.join(", ")}` : "; call list_styles with a query"}`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
return id;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function integer(value: unknown, name: string, min: number, max: number) {
|
|
57
|
+
if (value === undefined) return undefined;
|
|
58
|
+
if (
|
|
59
|
+
typeof value !== "number" ||
|
|
60
|
+
!Number.isInteger(value) ||
|
|
61
|
+
value < min ||
|
|
62
|
+
value > max
|
|
63
|
+
)
|
|
64
|
+
throw new StyleToolError(`${name} must be an integer ${min}..${max}`);
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const STYLE_TOOLS = Object.freeze([
|
|
69
|
+
{
|
|
70
|
+
name: "list_styles",
|
|
71
|
+
description:
|
|
72
|
+
"Browse the style taxonomy (read-only). query: ranked search over ids, names, aliases and regions. parent: the children of one style id. Neither: the families and their root styles. Returns ids to pass to style_info and apply_style.",
|
|
73
|
+
parameters: {
|
|
74
|
+
type: "object",
|
|
75
|
+
properties: {
|
|
76
|
+
query: { type: "string", maxLength: 120 },
|
|
77
|
+
parent: { type: "string", maxLength: 120 },
|
|
78
|
+
},
|
|
79
|
+
additionalProperties: false,
|
|
80
|
+
},
|
|
81
|
+
plan(args) {
|
|
82
|
+
for (const key of Object.keys(args))
|
|
83
|
+
if (key !== "query" && key !== "parent")
|
|
84
|
+
throw new StyleToolError(`unknown argument ${key}`);
|
|
85
|
+
let result: unknown;
|
|
86
|
+
let summary: string;
|
|
87
|
+
if (args.query !== undefined) {
|
|
88
|
+
if (typeof args.query !== "string" || !args.query.trim())
|
|
89
|
+
throw new StyleToolError("query must be a non-empty string");
|
|
90
|
+
const matches = searchStyles(args.query, MAX_LIST).map((match) =>
|
|
91
|
+
nodeJSON(match.id),
|
|
92
|
+
);
|
|
93
|
+
result = { query: args.query, matches };
|
|
94
|
+
summary = `styles · ${matches.length} for "${args.query.slice(0, 40)}"`;
|
|
95
|
+
} else if (args.parent !== undefined) {
|
|
96
|
+
const id = knownStyle(args.parent, "parent");
|
|
97
|
+
const node = STYLE_TREE.get(id)!;
|
|
98
|
+
result = {
|
|
99
|
+
parent: id,
|
|
100
|
+
children: node.children.slice(0, MAX_LIST * 2).map(nodeJSON),
|
|
101
|
+
};
|
|
102
|
+
summary = `styles · ${node.children.length} under ${id}`;
|
|
103
|
+
} else {
|
|
104
|
+
result = {
|
|
105
|
+
families: STYLE_FAMILIES.map((family) => ({
|
|
106
|
+
family: family.key,
|
|
107
|
+
title: family.title,
|
|
108
|
+
roots: family.roots.map(nodeJSON),
|
|
109
|
+
})),
|
|
110
|
+
};
|
|
111
|
+
summary = "styles · families";
|
|
112
|
+
}
|
|
113
|
+
const content = JSON.stringify(result);
|
|
114
|
+
return {
|
|
115
|
+
kind: "action",
|
|
116
|
+
summary,
|
|
117
|
+
async run() {
|
|
118
|
+
return { content, summary };
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: "style_info",
|
|
125
|
+
description:
|
|
126
|
+
"Describe one style (read-only): taxonomy path, meter, tempo range, groove and swing, tuning and scales, harmony model, texture roles, and children.",
|
|
127
|
+
parameters: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: { id: { type: "string", maxLength: 120 } },
|
|
130
|
+
required: ["id"],
|
|
131
|
+
additionalProperties: false,
|
|
132
|
+
},
|
|
133
|
+
plan(args) {
|
|
134
|
+
const id = knownStyle(args.id, "id");
|
|
135
|
+
const node = STYLE_TREE.get(id)!;
|
|
136
|
+
const content = JSON.stringify({
|
|
137
|
+
id,
|
|
138
|
+
lines: describeStyle(resolveStyle(id)),
|
|
139
|
+
children: node.children,
|
|
140
|
+
});
|
|
141
|
+
const summary = `style ${id}`;
|
|
142
|
+
return {
|
|
143
|
+
kind: "action",
|
|
144
|
+
summary,
|
|
145
|
+
async run() {
|
|
146
|
+
return { content, summary };
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: "apply_style",
|
|
153
|
+
description: `Replace the whole song with one generated from a style: drums, bass, harmony, melody and form from the style's patterns (one undo step). bars ${STYLE_LIMITS.minBars}..${STYLE_LIMITS.maxBars} (default ${STYLE_LIMITS.defaultBars}); seed picks a variation (same seed, same song). blend + weight (0 is id, 1 is blend) mixes two styles.`,
|
|
154
|
+
parameters: {
|
|
155
|
+
type: "object",
|
|
156
|
+
properties: {
|
|
157
|
+
id: { type: "string", maxLength: 120 },
|
|
158
|
+
bars: {
|
|
159
|
+
type: "integer",
|
|
160
|
+
minimum: STYLE_LIMITS.minBars,
|
|
161
|
+
maximum: STYLE_LIMITS.maxBars,
|
|
162
|
+
},
|
|
163
|
+
seed: { type: "integer", minimum: 0, maximum: STYLE_LIMITS.maxSeed },
|
|
164
|
+
blend: { type: "string", maxLength: 120 },
|
|
165
|
+
weight: { type: "number", minimum: 0, maximum: 1 },
|
|
166
|
+
},
|
|
167
|
+
required: ["id"],
|
|
168
|
+
additionalProperties: false,
|
|
169
|
+
},
|
|
170
|
+
plan(args, context) {
|
|
171
|
+
for (const key of Object.keys(args))
|
|
172
|
+
if (!["id", "bars", "seed", "blend", "weight"].includes(key))
|
|
173
|
+
throw new StyleToolError(`unknown argument ${key}`);
|
|
174
|
+
const id = knownStyle(args.id, "id");
|
|
175
|
+
const bars = integer(
|
|
176
|
+
args.bars,
|
|
177
|
+
"bars",
|
|
178
|
+
STYLE_LIMITS.minBars,
|
|
179
|
+
STYLE_LIMITS.maxBars,
|
|
180
|
+
);
|
|
181
|
+
const seed = integer(args.seed, "seed", 0, STYLE_LIMITS.maxSeed);
|
|
182
|
+
if (args.weight !== undefined && args.blend === undefined)
|
|
183
|
+
throw new StyleToolError("weight needs blend");
|
|
184
|
+
let blend: { id: string; weight: number } | undefined;
|
|
185
|
+
if (args.blend !== undefined) {
|
|
186
|
+
const weight = args.weight ?? 0.5;
|
|
187
|
+
if (
|
|
188
|
+
typeof weight !== "number" ||
|
|
189
|
+
!Number.isFinite(weight) ||
|
|
190
|
+
weight < 0 ||
|
|
191
|
+
weight > 1
|
|
192
|
+
)
|
|
193
|
+
throw new StyleToolError("weight must be 0..1");
|
|
194
|
+
blend = { id: knownStyle(args.blend, "blend"), weight };
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
const generated = generateFromCommand({
|
|
198
|
+
type: "style-apply",
|
|
199
|
+
id,
|
|
200
|
+
...(bars !== undefined ? { bars } : {}),
|
|
201
|
+
...(seed !== undefined ? { seed } : {}),
|
|
202
|
+
...(blend ? { blend } : {}),
|
|
203
|
+
});
|
|
204
|
+
const next = styleScore(generated);
|
|
205
|
+
return {
|
|
206
|
+
kind: "score",
|
|
207
|
+
operations: diffScores(context.score, next),
|
|
208
|
+
summary: generatedSummary(generated).slice(0, 160),
|
|
209
|
+
};
|
|
210
|
+
} catch (error) {
|
|
211
|
+
if (error instanceof StyleError || error instanceof DiffError)
|
|
212
|
+
throw new StyleToolError(error.message);
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
] satisfies AgentTool[]);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool-argument error, in its own module so tool files that `tools.ts`
|
|
3
|
+
* spreads (voice-tools.ts) can throw it without an import cycle.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** A model-supplied argument that the tool refused; never mutates the score. */
|
|
7
|
+
export class ToolArgumentError extends Error {
|
|
8
|
+
constructor(message: string) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "ToolArgumentError";
|
|
11
|
+
}
|
|
12
|
+
}
|