@dg-kit/tools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # @dg-kit/tools
2
+
3
+ LLM-facing tool definitions for DG-Lab Coyote control.
4
+
5
+ Six device tools (`start`, `stop`, `adjust_strength`, `change_wave`, `burst`, `design_wave`) plus a `timer` tool, all generating JSON Schema for direct injection into OpenAI / Anthropic / MCP tool-call APIs. Each tool validates its inputs (zod) and returns a `ToolExecutionPlan` — a `DeviceCommand` for the device tools, an inline string for `design_wave` after saving, or a `TimerCommand` for `timer`.
6
+
7
+ ## Rate-limit policy
8
+
9
+ Tools that hint at "per-turn" caps (`adjust_strength`, `burst`, `design_wave`) accept an injectable `RateLimitPolicy`. Consumers pick the implementation that matches their runtime model:
10
+
11
+ - **DG-Agent** (turn-based): `createTurnRateLimitPolicy()` — counters reset on each new user turn.
12
+ - **DG-MCP** (stateless RPC): `createSlidingWindowRateLimitPolicy({ windowMs })` — keeps a timestamp ring and rejects calls that exceed the window cap.
13
+ - **No-op**: `createNoOpRateLimitPolicy()` — always allows; useful in tests.
14
+
15
+ ```ts
16
+ import { createDefaultToolRegistry } from '@dg-kit/tools';
17
+
18
+ const registry = createDefaultToolRegistry({
19
+ waveformLibrary,
20
+ rateLimitPolicy: createSlidingWindowRateLimitPolicy({ windowMs: 5000 }),
21
+ });
22
+
23
+ const tools = await registry.listDefinitions(); // → ToolDefinition[]
24
+ const plan = await registry.resolve(toolCall); // → ToolExecutionPlan
25
+ ```
@@ -0,0 +1,3 @@
1
+ export { ToolRegistry, createDefaultToolRegistry, type DefaultToolRegistryDeps, type ToolDefinitionHints, type ToolHandler, } from './registry.js';
2
+ export { createNoOpRateLimitPolicy, createSlidingWindowRateLimitPolicy, createTurnRateLimitPolicy, type PerTurnOptions, type RateLimitPolicy, type SlidingWindowOptions, } from './policy.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { ToolRegistry, createDefaultToolRegistry, } from './registry.js';
2
+ export { createNoOpRateLimitPolicy, createSlidingWindowRateLimitPolicy, createTurnRateLimitPolicy, } from './policy.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,yBAAyB,GAI1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,kCAAkC,EAClC,yBAAyB,GAI1B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Rate-limit policy interface, injected into the tool registry by consumers.
3
+ *
4
+ * Different runtimes have different notions of "how often a tool can be
5
+ * called": DG-Agent counts per-turn; DG-MCP doesn't have turns and prefers a
6
+ * sliding time window. Both implement the same interface.
7
+ */
8
+ export interface RateLimitPolicy {
9
+ /** Called before resolving a tool call. Reject to deny. */
10
+ shouldAllow(toolName: string): {
11
+ allow: true;
12
+ } | {
13
+ allow: false;
14
+ reason: string;
15
+ };
16
+ /** Called after a tool call has been admitted. */
17
+ recordCall(toolName: string): void;
18
+ /** Called when the runtime opens a new "turn" (DG-Agent). No-op for stateless runtimes. */
19
+ resetTurn?(): void;
20
+ }
21
+ export declare function createNoOpRateLimitPolicy(): RateLimitPolicy;
22
+ export interface SlidingWindowOptions {
23
+ /** Window length in milliseconds. */
24
+ windowMs: number;
25
+ /** Per-tool maximum call count within the window. Tools not listed are unrestricted. */
26
+ caps: Record<string, number>;
27
+ /** Optional clock override (testing). */
28
+ now?: () => number;
29
+ }
30
+ export declare function createSlidingWindowRateLimitPolicy(options: SlidingWindowOptions): RateLimitPolicy;
31
+ export interface PerTurnOptions {
32
+ /** Per-tool maximum call count within a turn. Tools not listed are unrestricted. */
33
+ caps: Record<string, number>;
34
+ }
35
+ export declare function createTurnRateLimitPolicy(options: PerTurnOptions): RateLimitPolicy;
36
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,kDAAkD;IAClD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,SAAS,CAAC,IAAI,IAAI,CAAC;CACpB;AAED,wBAAgB,yBAAyB,IAAI,eAAe,CAK3D;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CAiCjG;AAED,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAyBlF"}
package/dist/policy.js ADDED
@@ -0,0 +1,68 @@
1
+ export function createNoOpRateLimitPolicy() {
2
+ return {
3
+ shouldAllow: () => ({ allow: true }),
4
+ recordCall: () => undefined,
5
+ };
6
+ }
7
+ export function createSlidingWindowRateLimitPolicy(options) {
8
+ const now = options.now ?? (() => Date.now());
9
+ const history = new Map();
10
+ function prune(toolName) {
11
+ const cutoff = now() - options.windowMs;
12
+ const list = history.get(toolName) ?? [];
13
+ const fresh = list.filter((t) => t >= cutoff);
14
+ history.set(toolName, fresh);
15
+ return fresh;
16
+ }
17
+ return {
18
+ shouldAllow(toolName) {
19
+ const cap = options.caps[toolName];
20
+ if (cap === undefined || cap < 0)
21
+ return { allow: true };
22
+ const fresh = prune(toolName);
23
+ if (fresh.length >= cap) {
24
+ return {
25
+ allow: false,
26
+ reason: `工具 ${toolName} 在最近 ${Math.round(options.windowMs / 1000)} 秒内已被调用 ${fresh.length} 次(上限 ${cap})`,
27
+ };
28
+ }
29
+ return { allow: true };
30
+ },
31
+ recordCall(toolName) {
32
+ const cap = options.caps[toolName];
33
+ if (cap === undefined || cap < 0)
34
+ return;
35
+ const fresh = prune(toolName);
36
+ fresh.push(now());
37
+ history.set(toolName, fresh);
38
+ },
39
+ };
40
+ }
41
+ export function createTurnRateLimitPolicy(options) {
42
+ let counts = new Map();
43
+ return {
44
+ shouldAllow(toolName) {
45
+ const cap = options.caps[toolName];
46
+ if (cap === undefined || cap < 0)
47
+ return { allow: true };
48
+ const used = counts.get(toolName) ?? 0;
49
+ if (used >= cap) {
50
+ return {
51
+ allow: false,
52
+ reason: `工具 ${toolName} 本回合已调用 ${used} 次(上限 ${cap}),请换一种方式继续`,
53
+ };
54
+ }
55
+ return { allow: true };
56
+ },
57
+ recordCall(toolName) {
58
+ const cap = options.caps[toolName];
59
+ if (cap === undefined || cap < 0)
60
+ return;
61
+ counts.set(toolName, (counts.get(toolName) ?? 0) + 1);
62
+ },
63
+ resetTurn() {
64
+ counts = new Map();
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { DeviceCommand, ToolCall, ToolDefinition, ToolExecutionPlan, WaveformLibrary } from '@dg-kit/core';
2
+ import { type RateLimitPolicy } from './policy.js';
3
+ export interface ToolHandler {
4
+ name: string;
5
+ displayName?: string;
6
+ definition: ToolDefinition | (() => Promise<ToolDefinition> | ToolDefinition);
7
+ summarizeCommand?: (command: DeviceCommand) => string;
8
+ toExecutionPlan(args: Record<string, unknown>): Promise<ToolExecutionPlan> | ToolExecutionPlan;
9
+ }
10
+ export declare class ToolRegistry {
11
+ private readonly rateLimitPolicy;
12
+ private readonly handlers;
13
+ constructor(rateLimitPolicy?: RateLimitPolicy);
14
+ register(handler: ToolHandler): void;
15
+ resolve(toolCall: ToolCall): Promise<ToolExecutionPlan>;
16
+ listDefinitions(): Promise<ToolDefinition[]>;
17
+ getDisplayName(name: string): string | undefined;
18
+ summarizeCommand(name: string, command: DeviceCommand): string | undefined;
19
+ /** Reset turn-scoped counters (no-op for non-turn policies). */
20
+ resetTurn(): void;
21
+ }
22
+ export interface ToolDefinitionHints {
23
+ maxColdStartStrength?: number;
24
+ maxAdjustStrengthStep?: number;
25
+ maxAdjustStrengthCallsPerTurn?: number;
26
+ maxBurstDurationMs?: number;
27
+ maxBurstCallsPerTurn?: number;
28
+ }
29
+ export interface DefaultToolRegistryDeps {
30
+ waveformLibrary?: WaveformLibrary;
31
+ toolDefinitionHints?: ToolDefinitionHints;
32
+ /** Rate-limit policy. Defaults to a no-op policy if omitted. */
33
+ rateLimitPolicy?: RateLimitPolicy;
34
+ }
35
+ export declare function createDefaultToolRegistry(deps: DefaultToolRegistryDeps): ToolRegistry;
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,iBAAiB,EACjB,eAAe,EAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,cAAc,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC,CAAC;IAC9E,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,MAAM,CAAC;IACtD,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;CAChG;AAED,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,eAAe;IAF5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBAE9B,eAAe,GAAE,eAA6C;IAE3F,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI9B,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgBvD,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAclD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS;IAI1E,gEAAgE;IAChE,SAAS,IAAI,IAAI;CAGlB;AAcD,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,gEAAgE;IAChE,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,YAAY,CAiiBrF"}
@@ -0,0 +1,612 @@
1
+ import { compileWaveformDesign } from '@dg-kit/waveforms';
2
+ import { z } from 'zod';
3
+ import { createNoOpRateLimitPolicy } from './policy.js';
4
+ export class ToolRegistry {
5
+ rateLimitPolicy;
6
+ handlers = new Map();
7
+ constructor(rateLimitPolicy = createNoOpRateLimitPolicy()) {
8
+ this.rateLimitPolicy = rateLimitPolicy;
9
+ }
10
+ register(handler) {
11
+ this.handlers.set(handler.name, handler);
12
+ }
13
+ async resolve(toolCall) {
14
+ const handler = this.handlers.get(toolCall.name);
15
+ if (!handler) {
16
+ throw new Error(`未知工具:${toolCall.name}`);
17
+ }
18
+ const decision = this.rateLimitPolicy.shouldAllow(toolCall.name);
19
+ if (!decision.allow) {
20
+ throw new Error(decision.reason);
21
+ }
22
+ const plan = await handler.toExecutionPlan(toolCall.args);
23
+ this.rateLimitPolicy.recordCall(toolCall.name);
24
+ return plan;
25
+ }
26
+ async listDefinitions() {
27
+ return Promise.all([...this.handlers.values()].map(async (handler) => {
28
+ const definition = typeof handler.definition === 'function'
29
+ ? await handler.definition()
30
+ : handler.definition;
31
+ return handler.displayName && !definition.displayName
32
+ ? { ...definition, displayName: handler.displayName }
33
+ : definition;
34
+ }));
35
+ }
36
+ getDisplayName(name) {
37
+ return this.handlers.get(name)?.displayName;
38
+ }
39
+ summarizeCommand(name, command) {
40
+ return this.handlers.get(name)?.summarizeCommand?.(command);
41
+ }
42
+ /** Reset turn-scoped counters (no-op for non-turn policies). */
43
+ resetTurn() {
44
+ this.rateLimitPolicy.resetTurn?.();
45
+ }
46
+ }
47
+ const channelSchema = z.enum(['A', 'B']);
48
+ const channelParameter = {
49
+ type: 'string',
50
+ enum: ['A', 'B'],
51
+ description: '通道 A 或 B',
52
+ };
53
+ const MAX_START_STRENGTH_HINT = 10;
54
+ const MAX_ADJUST_STEP_HINT = 10;
55
+ const MAX_BURST_DURATION_HINT_MS = 5_000;
56
+ const DEFAULT_START_WAVEFORM_ID = 'pulse_mid';
57
+ export function createDefaultToolRegistry(deps) {
58
+ const registry = new ToolRegistry(deps.rateLimitPolicy);
59
+ const maxColdStartStrengthHint = normalizeHint(deps.toolDefinitionHints?.maxColdStartStrength, MAX_START_STRENGTH_HINT, 0);
60
+ const maxAdjustStrengthStepHint = normalizeHint(deps.toolDefinitionHints?.maxAdjustStrengthStep, MAX_ADJUST_STEP_HINT, 1);
61
+ const maxAdjustCallsHint = normalizeHint(deps.toolDefinitionHints?.maxAdjustStrengthCallsPerTurn, 2, 1);
62
+ const maxBurstDurationMsHint = normalizeHint(deps.toolDefinitionHints?.maxBurstDurationMs, MAX_BURST_DURATION_HINT_MS, 100);
63
+ const maxBurstCallsHint = normalizeHint(deps.toolDefinitionHints?.maxBurstCallsPerTurn, 1, 1);
64
+ registry.register({
65
+ name: 'start',
66
+ displayName: '启动通道',
67
+ summarizeCommand(command) {
68
+ if (command.type !== 'start')
69
+ return '启动通道';
70
+ return `启动 ${command.channel} 通道,强度 ${command.strength},波形 ${command.waveform.id}`;
71
+ },
72
+ async definition() {
73
+ const waveformDescription = await buildWaveformDescriptionText(deps.waveformLibrary);
74
+ return {
75
+ name: 'start',
76
+ description: [
77
+ '【启动通道】启动一个通道,同时设置初始强度和波形。',
78
+ '触发:通道当前停止,需要从零开始时使用。',
79
+ '不用:通道已运行 → 想加点强度用 adjust_strength,想换波形用 change_wave,想结束用 stop。',
80
+ `约束:单次启动强度上限 ${maxColdStartStrengthHint}(受安全设置约束),完成后先描述结果并询问感受,不要在同一回合连续追加多次强度。`,
81
+ waveformDescription ? `可用波形:${waveformDescription}。` : '',
82
+ ]
83
+ .filter(Boolean)
84
+ .join('\n'),
85
+ parameters: {
86
+ type: 'object',
87
+ properties: {
88
+ channel: channelParameter,
89
+ strength: {
90
+ type: 'integer',
91
+ minimum: 0,
92
+ maximum: maxColdStartStrengthHint,
93
+ description: `启动时的初始强度,范围 [0, ${maxColdStartStrengthHint}]。`,
94
+ },
95
+ waveformId: await buildWaveformIdParameter(deps.waveformLibrary),
96
+ loop: {
97
+ type: 'boolean',
98
+ description: '是否循环播放波形,默认 true。',
99
+ },
100
+ },
101
+ required: ['channel', 'strength', 'waveformId'],
102
+ },
103
+ };
104
+ },
105
+ async toExecutionPlan(args) {
106
+ const parsed = z
107
+ .object({
108
+ channel: channelSchema,
109
+ strength: z.coerce.number().int().min(0).max(200),
110
+ waveformId: z.string().min(1).optional(),
111
+ waveform: z.string().min(1).optional(),
112
+ loop: z.preprocess((v) => {
113
+ if (typeof v === 'string')
114
+ return v.toLowerCase() !== 'false' && v !== '0' && v !== '';
115
+ return v;
116
+ }, z.boolean().optional().default(true)),
117
+ })
118
+ .parse(args);
119
+ const waveform = await resolveWaveform(deps.waveformLibrary, parsed.waveformId ?? parsed.waveform ?? DEFAULT_START_WAVEFORM_ID);
120
+ return {
121
+ type: 'device',
122
+ command: {
123
+ type: 'start',
124
+ channel: parsed.channel,
125
+ strength: parsed.strength,
126
+ waveform,
127
+ loop: parsed.loop,
128
+ },
129
+ };
130
+ },
131
+ });
132
+ registry.register({
133
+ name: 'stop',
134
+ displayName: '停止通道',
135
+ summarizeCommand(command) {
136
+ if (command.type !== 'stop')
137
+ return '停止通道';
138
+ return command.channel ? `停止 ${command.channel} 通道` : '停止全部通道';
139
+ },
140
+ definition: {
141
+ name: 'stop',
142
+ description: [
143
+ '【停止通道】停止一个通道,省略 channel 则停止全部通道。',
144
+ '触发:用户表达"停一下/够了/关掉",或需要结束输出时。',
145
+ '不用:start(strength=0) 或其他变通方式不能代替 stop。',
146
+ '约束:无次数上限。',
147
+ ].join('\n'),
148
+ parameters: {
149
+ type: 'object',
150
+ properties: {
151
+ channel: {
152
+ ...channelParameter,
153
+ description: '要停止的通道,省略则停止全部。',
154
+ },
155
+ },
156
+ },
157
+ },
158
+ toExecutionPlan(args) {
159
+ const parsed = z
160
+ .object({
161
+ channel: channelSchema.optional(),
162
+ })
163
+ .parse(args);
164
+ return {
165
+ type: 'device',
166
+ command: {
167
+ type: 'stop',
168
+ channel: parsed.channel,
169
+ },
170
+ };
171
+ },
172
+ });
173
+ registry.register({
174
+ name: 'adjust_strength',
175
+ displayName: '调节强度',
176
+ summarizeCommand(command) {
177
+ if (command.type !== 'adjustStrength')
178
+ return '调节强度';
179
+ return `调整 ${command.channel} 通道强度 ${command.delta > 0 ? '+' : ''}${command.delta}`;
180
+ },
181
+ definition: {
182
+ name: 'adjust_strength',
183
+ description: [
184
+ '【调节强度】在不改变波形的前提下相对调整一个通道的强度。',
185
+ '触发:通道运行中,需要小步推进、轻微回落、边缘控制时使用。',
186
+ '不用:想换波形 → change_wave;通道未启动 → start。',
187
+ `约束:本回合最多调用 ${maxAdjustCallsHint} 次,单步幅度 ±${maxAdjustStrengthStepHint},优先选小幅度(约 1/3 上限)做平稳推进,每次调整后停下来观察反馈。`,
188
+ ].join('\n'),
189
+ parameters: {
190
+ type: 'object',
191
+ properties: {
192
+ channel: channelParameter,
193
+ delta: {
194
+ type: 'integer',
195
+ minimum: -maxAdjustStrengthStepHint,
196
+ maximum: maxAdjustStrengthStepHint,
197
+ description: `本次变化量(正增负减),范围 [-${maxAdjustStrengthStepHint}, ${maxAdjustStrengthStepHint}]。`,
198
+ },
199
+ },
200
+ required: ['channel', 'delta'],
201
+ },
202
+ },
203
+ toExecutionPlan(args) {
204
+ const parsed = z
205
+ .object({
206
+ channel: channelSchema,
207
+ delta: z.coerce.number().int().min(-200).max(200),
208
+ })
209
+ .parse(args);
210
+ return {
211
+ type: 'device',
212
+ command: {
213
+ type: 'adjustStrength',
214
+ channel: parsed.channel,
215
+ delta: parsed.delta,
216
+ },
217
+ };
218
+ },
219
+ });
220
+ registry.register({
221
+ name: 'change_wave',
222
+ displayName: '切换波形',
223
+ summarizeCommand(command) {
224
+ if (command.type !== 'changeWave')
225
+ return '切换波形';
226
+ return `切换 ${command.channel} 通道波形为 ${command.waveform.id}`;
227
+ },
228
+ async definition() {
229
+ const waveformDescription = await buildWaveformDescriptionText(deps.waveformLibrary);
230
+ return {
231
+ name: 'change_wave',
232
+ description: [
233
+ '【切换波形】在不改变强度的前提下更换一个通道的波形。',
234
+ '触发:已启动后想换节奏、换触感时使用。',
235
+ '不用:想加强 → adjust_strength;通道未启动 → start。',
236
+ '约束:仅切波形不动强度,切换后停下来描述新感觉。',
237
+ waveformDescription ? `可用波形:${waveformDescription}。` : '',
238
+ ]
239
+ .filter(Boolean)
240
+ .join('\n'),
241
+ parameters: {
242
+ type: 'object',
243
+ properties: {
244
+ channel: channelParameter,
245
+ waveformId: await buildWaveformIdParameter(deps.waveformLibrary),
246
+ loop: {
247
+ type: 'boolean',
248
+ description: '是否循环播放波形,默认 true。',
249
+ },
250
+ },
251
+ required: ['channel', 'waveformId'],
252
+ },
253
+ };
254
+ },
255
+ async toExecutionPlan(args) {
256
+ const parsed = z
257
+ .object({
258
+ channel: channelSchema,
259
+ waveformId: z.string().min(1).optional(),
260
+ waveform: z.string().min(1).optional(),
261
+ loop: z.preprocess((v) => {
262
+ if (typeof v === 'string')
263
+ return v.toLowerCase() !== 'false' && v !== '0' && v !== '';
264
+ return v;
265
+ }, z.boolean().optional().default(true)),
266
+ })
267
+ .parse(args);
268
+ const waveformId = parsed.waveformId ?? parsed.waveform;
269
+ if (!waveformId) {
270
+ throw new Error('change_wave 缺少 waveformId 参数');
271
+ }
272
+ const waveform = await resolveWaveform(deps.waveformLibrary, waveformId);
273
+ return {
274
+ type: 'device',
275
+ command: {
276
+ type: 'changeWave',
277
+ channel: parsed.channel,
278
+ waveform,
279
+ loop: parsed.loop,
280
+ },
281
+ };
282
+ },
283
+ });
284
+ registry.register({
285
+ name: 'burst',
286
+ displayName: '脉冲增强',
287
+ summarizeCommand(command) {
288
+ if (command.type !== 'burst')
289
+ return '脉冲增强';
290
+ return `对 ${command.channel} 通道执行脉冲,强度 ${command.strength},持续 ${command.durationMs}ms`;
291
+ },
292
+ definition: {
293
+ name: 'burst',
294
+ description: [
295
+ '【短时脉冲】把一个正在运行的通道短暂拉到目标强度,持续一段时间后自动回落。',
296
+ '触发:制造短促峰值、强烈点射感时使用。',
297
+ '不用:通道未启动 → 先 start;想长期提升强度 → adjust_strength。',
298
+ `约束:本回合最多调用 ${maxBurstCallsHint} 次,单次时长 100-${maxBurstDurationMsHint}ms,完成后先停下来观察反馈。`,
299
+ ].join('\n'),
300
+ parameters: {
301
+ type: 'object',
302
+ properties: {
303
+ channel: channelParameter,
304
+ strength: {
305
+ type: 'integer',
306
+ minimum: 0,
307
+ maximum: 200,
308
+ description: '脉冲期间的目标强度(受设备上限和用户上限约束)。',
309
+ },
310
+ durationMs: {
311
+ type: 'integer',
312
+ minimum: 100,
313
+ maximum: maxBurstDurationMsHint,
314
+ description: `脉冲持续时间(毫秒),范围 [100, ${maxBurstDurationMsHint}]。`,
315
+ },
316
+ },
317
+ required: ['channel', 'strength', 'durationMs'],
318
+ },
319
+ },
320
+ toExecutionPlan(args) {
321
+ const parsed = z
322
+ .object({
323
+ channel: channelSchema,
324
+ strength: z.coerce.number().int().min(0).max(200),
325
+ durationMs: z.coerce.number().int().min(100).max(20_000).optional(),
326
+ duration_ms: z.coerce.number().int().min(100).max(20_000).optional(),
327
+ })
328
+ .parse(args);
329
+ const durationMs = parsed.durationMs ?? parsed.duration_ms;
330
+ if (durationMs == null) {
331
+ throw new Error('burst 缺少 durationMs 参数');
332
+ }
333
+ return {
334
+ type: 'device',
335
+ command: {
336
+ type: 'burst',
337
+ channel: parsed.channel,
338
+ strength: parsed.strength,
339
+ durationMs,
340
+ },
341
+ };
342
+ },
343
+ });
344
+ registry.register({
345
+ name: 'timer',
346
+ displayName: '设置定时器',
347
+ definition: {
348
+ name: 'timer',
349
+ description: [
350
+ '【设置定时器】指定秒数后由系统触发一次内部跟进。',
351
+ '触发:需要"过一会儿再问"、"稍后提醒"的流程时使用。',
352
+ '不用:想立即跟进直接发文字回复,不需要定时器。',
353
+ '约束:到期回合是内部触发不是用户消息,到期回合只能简短跟进,禁止自动操作设备。',
354
+ ].join('\n'),
355
+ parameters: {
356
+ type: 'object',
357
+ properties: {
358
+ seconds: {
359
+ type: 'integer',
360
+ minimum: 1,
361
+ maximum: 3600,
362
+ description: '倒计时秒数,范围 [1, 3600]。',
363
+ },
364
+ label: {
365
+ type: 'string',
366
+ description: '给这次提醒起一个简短标签,方便到期时识别用途。',
367
+ },
368
+ },
369
+ required: ['seconds', 'label'],
370
+ },
371
+ },
372
+ toExecutionPlan(args) {
373
+ const parsed = z
374
+ .object({
375
+ seconds: z.coerce.number().int().min(1).max(3600),
376
+ label: z.string().min(1),
377
+ })
378
+ .parse(args);
379
+ return {
380
+ type: 'timer',
381
+ command: {
382
+ type: 'timer',
383
+ seconds: parsed.seconds,
384
+ label: parsed.label,
385
+ },
386
+ };
387
+ },
388
+ });
389
+ registry.register({
390
+ name: 'design_wave',
391
+ displayName: '设计波形',
392
+ summarizeCommand(command) {
393
+ if (command.type === 'start') {
394
+ return `设计并启动波形 ${command.waveform.id} 到 ${command.channel} 通道`;
395
+ }
396
+ return '设计波形';
397
+ },
398
+ definition: {
399
+ name: 'design_wave',
400
+ description: [
401
+ '【设计波形】组合一组段落生成新的自定义波形,保存到波形库后可立即播放或留待后用。',
402
+ '触发:用户描述的体感无法用现有波形组合表达时使用(如 "先慢慢渐入再变成连续敲击")。',
403
+ '不用:内置或已导入的波形够用 → 直接 start / change_wave;只想加减强度 → adjust_strength。',
404
+ '约束:单回合最多调用 1 次;总时长 100-30000ms(建议 1-10s);保存的波形会出现在用户的自定义波形列表里。',
405
+ '段落原语:ramp(强度线性变化)、hold(恒定强度)、pulse(高低交替节拍)、silence(静默间隔)。',
406
+ ].join('\n'),
407
+ parameters: {
408
+ type: 'object',
409
+ properties: {
410
+ name: {
411
+ type: 'string',
412
+ description: '给波形起一个简短中文名(如"渐入潮汐"、"短促电击")。',
413
+ },
414
+ description: {
415
+ type: 'string',
416
+ description: '一句体感说明(用户和后续的 AI 都靠这段决定是否选用此波形)。',
417
+ },
418
+ segments: {
419
+ type: 'array',
420
+ minItems: 1,
421
+ description: '段落列表,按顺序拼接成完整波形。',
422
+ items: {
423
+ oneOf: [
424
+ {
425
+ type: 'object',
426
+ properties: {
427
+ type: { type: 'string', enum: ['ramp'] },
428
+ from: { type: 'integer', minimum: 0, maximum: 100 },
429
+ to: { type: 'integer', minimum: 0, maximum: 100 },
430
+ durationMs: { type: 'integer', minimum: 100, maximum: 30_000 },
431
+ frequencyMs: { type: 'integer', minimum: 10, maximum: 1000 },
432
+ },
433
+ required: ['type', 'from', 'to', 'durationMs'],
434
+ },
435
+ {
436
+ type: 'object',
437
+ properties: {
438
+ type: { type: 'string', enum: ['hold'] },
439
+ intensity: { type: 'integer', minimum: 0, maximum: 100 },
440
+ durationMs: { type: 'integer', minimum: 100, maximum: 30_000 },
441
+ frequencyMs: { type: 'integer', minimum: 10, maximum: 1000 },
442
+ },
443
+ required: ['type', 'intensity', 'durationMs'],
444
+ },
445
+ {
446
+ type: 'object',
447
+ properties: {
448
+ type: { type: 'string', enum: ['pulse'] },
449
+ intensity: { type: 'integer', minimum: 0, maximum: 100 },
450
+ onMs: { type: 'integer', minimum: 50, maximum: 1000 },
451
+ offMs: { type: 'integer', minimum: 50, maximum: 1000 },
452
+ count: { type: 'integer', minimum: 1, maximum: 50 },
453
+ frequencyMs: { type: 'integer', minimum: 10, maximum: 1000 },
454
+ },
455
+ required: ['type', 'intensity', 'onMs', 'offMs', 'count'],
456
+ },
457
+ {
458
+ type: 'object',
459
+ properties: {
460
+ type: { type: 'string', enum: ['silence'] },
461
+ durationMs: { type: 'integer', minimum: 100, maximum: 5000 },
462
+ },
463
+ required: ['type', 'durationMs'],
464
+ },
465
+ ],
466
+ },
467
+ },
468
+ playOnChannel: {
469
+ type: 'string',
470
+ enum: ['A', 'B'],
471
+ description: '可选:保存后立刻在该通道启动播放(需同时填 playOnStrength)。',
472
+ },
473
+ playOnStrength: {
474
+ type: 'integer',
475
+ minimum: 0,
476
+ maximum: 100,
477
+ description: '可选:立即播放时的初始强度(受冷启动上限约束)。',
478
+ },
479
+ },
480
+ required: ['name', 'description', 'segments'],
481
+ },
482
+ },
483
+ async toExecutionPlan(args) {
484
+ const segmentSchema = z.discriminatedUnion('type', [
485
+ z.object({
486
+ type: z.literal('ramp'),
487
+ from: z.coerce.number().int().min(0).max(100),
488
+ to: z.coerce.number().int().min(0).max(100),
489
+ durationMs: z.coerce.number().int().min(100).max(30_000),
490
+ frequencyMs: z.coerce.number().int().min(10).max(1000).optional(),
491
+ }),
492
+ z.object({
493
+ type: z.literal('hold'),
494
+ intensity: z.coerce.number().int().min(0).max(100),
495
+ durationMs: z.coerce.number().int().min(100).max(30_000),
496
+ frequencyMs: z.coerce.number().int().min(10).max(1000).optional(),
497
+ }),
498
+ z.object({
499
+ type: z.literal('pulse'),
500
+ intensity: z.coerce.number().int().min(0).max(100),
501
+ onMs: z.coerce.number().int().min(50).max(1000),
502
+ offMs: z.coerce.number().int().min(50).max(1000),
503
+ count: z.coerce.number().int().min(1).max(50),
504
+ frequencyMs: z.coerce.number().int().min(10).max(1000).optional(),
505
+ }),
506
+ z.object({
507
+ type: z.literal('silence'),
508
+ durationMs: z.coerce.number().int().min(100).max(5000),
509
+ }),
510
+ ]);
511
+ const parsed = z
512
+ .object({
513
+ name: z.string().min(1).max(40),
514
+ description: z.string().min(1).max(120),
515
+ segments: z.array(segmentSchema).min(1),
516
+ playOnChannel: z.enum(['A', 'B']).optional(),
517
+ playOnStrength: z.coerce.number().int().min(0).max(100).optional(),
518
+ })
519
+ .parse(args);
520
+ if (!deps.waveformLibrary?.save) {
521
+ throw new Error('当前环境的波形库不支持保存');
522
+ }
523
+ const compiled = compileWaveformDesign(parsed.segments);
524
+ const idSeed = parsed.name
525
+ .toLowerCase()
526
+ .replace(/[^a-z0-9]+/g, '-')
527
+ .replace(/^-|-$/g, '') || 'designed';
528
+ const waveform = {
529
+ id: `ai-${idSeed}-${Date.now().toString(36)}`,
530
+ name: parsed.name,
531
+ description: parsed.description,
532
+ frames: compiled.frames,
533
+ };
534
+ await deps.waveformLibrary.save(waveform);
535
+ const summary = {
536
+ ok: true,
537
+ waveformId: waveform.id,
538
+ name: waveform.name,
539
+ description: waveform.description,
540
+ totalDurationMs: compiled.totalDurationMs,
541
+ frameCount: compiled.frames.length,
542
+ };
543
+ if (parsed.playOnChannel && typeof parsed.playOnStrength === 'number') {
544
+ return {
545
+ type: 'device',
546
+ command: {
547
+ type: 'start',
548
+ channel: parsed.playOnChannel,
549
+ strength: parsed.playOnStrength,
550
+ waveform,
551
+ loop: true,
552
+ },
553
+ };
554
+ }
555
+ return {
556
+ type: 'inline',
557
+ output: JSON.stringify({
558
+ ...summary,
559
+ _hint: '波形已保存。可在下一回合用 start / change_wave 引用此 waveformId 播放。',
560
+ }),
561
+ };
562
+ },
563
+ });
564
+ return registry;
565
+ }
566
+ async function buildWaveformIdParameter(waveformLibrary) {
567
+ if (!waveformLibrary) {
568
+ return {
569
+ type: 'string',
570
+ description: '波形 ID',
571
+ };
572
+ }
573
+ const waveforms = await waveformLibrary.list();
574
+ const waveformIds = waveforms.map((waveform) => waveform.id);
575
+ const waveformDescription = buildWaveformSummaryText(waveforms);
576
+ return {
577
+ type: 'string',
578
+ enum: waveformIds,
579
+ description: `波形 ID - ${waveformDescription}`,
580
+ };
581
+ }
582
+ async function buildWaveformDescriptionText(waveformLibrary) {
583
+ if (!waveformLibrary) {
584
+ return '';
585
+ }
586
+ return buildWaveformSummaryText(await waveformLibrary.list());
587
+ }
588
+ function buildWaveformSummaryText(waveforms) {
589
+ if (waveforms.length === 0) {
590
+ return '当前波形库为空';
591
+ }
592
+ return waveforms
593
+ .map((waveform) => `${waveform.id}(${waveform.name}${waveform.description ? `:${waveform.description}` : ''})`)
594
+ .join(';');
595
+ }
596
+ async function resolveWaveform(waveformLibrary, waveformId) {
597
+ if (!waveformLibrary) {
598
+ throw new Error(`波形库不可用,无法解析 "${waveformId}"`);
599
+ }
600
+ const waveform = await waveformLibrary.getById(waveformId);
601
+ if (!waveform) {
602
+ throw new Error(`未知波形:${waveformId}`);
603
+ }
604
+ return waveform;
605
+ }
606
+ function normalizeHint(value, fallback, min) {
607
+ const parsed = typeof value === 'number' ? value : Number(value);
608
+ if (!Number.isFinite(parsed))
609
+ return fallback;
610
+ return Math.max(min, Math.round(parsed));
611
+ }
612
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@dg-kit/tools",
3
+ "version": "0.1.0",
4
+ "description": "LLM tool definitions and execution-plan resolver for DG-Lab Coyote control",
5
+ "license": "MIT",
6
+ "author": "0xNullAI",
7
+ "homepage": "https://github.com/0xNullAI/DG-Kit/tree/main/packages/tools",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/0xNullAI/DG-Kit.git",
11
+ "directory": "packages/tools"
12
+ },
13
+ "type": "module",
14
+ "main": "./src/index.ts",
15
+ "types": "./src/index.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./src/index.ts",
19
+ "import": "./src/index.ts"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public",
28
+ "main": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js"
34
+ }
35
+ }
36
+ },
37
+ "dependencies": {
38
+ "@dg-kit/core": "0.1.0",
39
+ "@dg-kit/waveforms": "0.1.0",
40
+ "zod": "^3.23.8"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.json",
44
+ "typecheck": "tsc -p tsconfig.json --noEmit"
45
+ },
46
+ "keywords": [
47
+ "dg-lab",
48
+ "coyote",
49
+ "llm",
50
+ "tools",
51
+ "agent"
52
+ ]
53
+ }