@statelyai/agent 2.0.0-next.0 → 2.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/cyan-carpets-perform.md +5 -0
- package/.changeset/fast-donkeys-argue.md +5 -0
- package/.changeset/old-jobs-check.md +5 -0
- package/.changeset/pre.json +4 -1
- package/CHANGELOG.md +12 -0
- package/dist/index.d.mts +19 -25
- package/dist/index.d.ts +19 -25
- package/dist/index.js +43 -39
- package/dist/index.mjs +43 -39
- package/examples/chatbot-alt.ts +1 -1
- package/examples/chatbot.ts +1 -1
- package/examples/cot.ts +1 -1
- package/examples/customer-service-sim.ts +4 -4
- package/examples/email.ts +29 -33
- package/examples/example.ts +1 -1
- package/examples/goal.ts +1 -1
- package/examples/joke.ts +1 -1
- package/examples/jugs.ts +3 -3
- package/examples/multi.ts +1 -1
- package/examples/number.ts +1 -1
- package/examples/raffle.ts +1 -1
- package/examples/river-crossing.ts +3 -3
- package/examples/simple.ts +1 -1
- package/examples/summary.ts +1 -1
- package/examples/support.ts +1 -1
- package/examples/ticTacToe.ts +2 -2
- package/examples/todo.ts +1 -1
- package/examples/tutor.ts +2 -2
- package/examples/verify.ts +1 -1
- package/examples/weather.ts +1 -1
- package/examples/wiki.ts +1 -1
- package/examples/word.ts +1 -1
- package/package.json +5 -3
- package/src/agent.test.ts +150 -10
- package/src/agent.ts +20 -217
- package/src/decide.test.ts +124 -3
- package/src/decide.ts +24 -14
- package/src/middleware.ts +2 -14
- package/src/planners/shortestPath.test.ts +94 -0
- package/src/planners/shortestPath.ts +177 -0
- package/src/planners/{simplePlanner.ts → simple.ts} +6 -12
- package/src/types.ts +15 -8
- package/src/utils.ts +11 -0
- package/vitest.config.ts +9 -3
- package/src/planners/shortestPathPlanner.ts +0 -160
package/dist/index.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
fromTransition
|
|
5
5
|
} from "xstate";
|
|
6
6
|
|
|
7
|
-
// src/planners/
|
|
7
|
+
// src/planners/simple.ts
|
|
8
8
|
import { generateText as generateText2 } from "ai";
|
|
9
9
|
|
|
10
10
|
// src/utils.ts
|
|
@@ -70,8 +70,11 @@ function getTransitions(state, machine) {
|
|
|
70
70
|
});
|
|
71
71
|
return getAllTransitions(resolvedState);
|
|
72
72
|
}
|
|
73
|
+
function isMachineActor(actor) {
|
|
74
|
+
return "src" in actor && typeof actor.src === "object" && actor.src !== null && "definition" in actor.src;
|
|
75
|
+
}
|
|
73
76
|
|
|
74
|
-
// src/planners/
|
|
77
|
+
// src/planners/simple.ts
|
|
75
78
|
import { getNextSnapshot } from "xstate";
|
|
76
79
|
|
|
77
80
|
// src/templates/defaultText.ts
|
|
@@ -189,19 +192,27 @@ async function agentDecide(agent, options) {
|
|
|
189
192
|
state,
|
|
190
193
|
machine,
|
|
191
194
|
model = agent.model,
|
|
195
|
+
messages,
|
|
192
196
|
...otherPlanInput
|
|
193
197
|
} = resolvedOptions;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
198
|
+
let attempts = 0;
|
|
199
|
+
const maxAttempts = resolvedOptions.maxAttempts ?? 2;
|
|
200
|
+
let plan;
|
|
201
|
+
while (attempts++ < maxAttempts) {
|
|
202
|
+
plan = await planner(agent, {
|
|
203
|
+
model,
|
|
204
|
+
goal,
|
|
205
|
+
events,
|
|
206
|
+
state,
|
|
207
|
+
machine,
|
|
208
|
+
messages,
|
|
209
|
+
// TODO: fix UIMessage thing
|
|
210
|
+
...otherPlanInput
|
|
211
|
+
});
|
|
212
|
+
if (plan?.nextEvent) {
|
|
213
|
+
agent.addPlan(plan);
|
|
214
|
+
await resolvedOptions.execute?.(plan.nextEvent);
|
|
215
|
+
}
|
|
205
216
|
}
|
|
206
217
|
return plan;
|
|
207
218
|
}
|
|
@@ -275,7 +286,7 @@ function getToolMap(_agent, input) {
|
|
|
275
286
|
return toolMap;
|
|
276
287
|
}
|
|
277
288
|
|
|
278
|
-
// src/planners/
|
|
289
|
+
// src/planners/simple.ts
|
|
279
290
|
var simplePlannerPromptTemplate = (data) => {
|
|
280
291
|
return `
|
|
281
292
|
${defaultTextTemplate(data)}
|
|
@@ -309,12 +320,13 @@ async function simplePlanner(agent, input) {
|
|
|
309
320
|
}) : void 0;
|
|
310
321
|
const result = await generateText2({
|
|
311
322
|
...rest,
|
|
323
|
+
system: input.system ?? agent.description,
|
|
312
324
|
model,
|
|
313
325
|
messages,
|
|
314
326
|
tools: toolMap,
|
|
315
327
|
toolChoice: input.toolChoice ?? "required"
|
|
316
328
|
});
|
|
317
|
-
result.
|
|
329
|
+
result.response.messages.forEach((m) => {
|
|
318
330
|
const message = m;
|
|
319
331
|
agent.addMessage({
|
|
320
332
|
...message,
|
|
@@ -361,13 +373,11 @@ function createAgentMiddleware(agent) {
|
|
|
361
373
|
},
|
|
362
374
|
wrapGenerate: async ({ doGenerate, params }) => {
|
|
363
375
|
const id = randomId();
|
|
364
|
-
params.prompt.forEach((
|
|
376
|
+
params.prompt.forEach((message) => {
|
|
365
377
|
agent.addMessage({
|
|
366
378
|
id,
|
|
367
|
-
...
|
|
368
|
-
timestamp: Date.now()
|
|
369
|
-
correlationId: params.providerMetadata?.correlationId,
|
|
370
|
-
parentCorrelationId: params.providerMetadata?.parentCorrelationId
|
|
379
|
+
...message,
|
|
380
|
+
timestamp: Date.now()
|
|
371
381
|
});
|
|
372
382
|
});
|
|
373
383
|
const result = await doGenerate();
|
|
@@ -380,9 +390,7 @@ function createAgentMiddleware(agent) {
|
|
|
380
390
|
agent.addMessage({
|
|
381
391
|
id,
|
|
382
392
|
...message,
|
|
383
|
-
timestamp: Date.now()
|
|
384
|
-
correlationId: params.providerMetadata?.correlationId,
|
|
385
|
-
parentCorrelationId: params.providerMetadata?.parentCorrelationId
|
|
393
|
+
timestamp: Date.now()
|
|
386
394
|
});
|
|
387
395
|
});
|
|
388
396
|
const { stream, ...rest } = await doStream();
|
|
@@ -407,9 +415,7 @@ function createAgentMiddleware(agent) {
|
|
|
407
415
|
timestamp: Date.now(),
|
|
408
416
|
role: "assistant",
|
|
409
417
|
content,
|
|
410
|
-
responseId: id
|
|
411
|
-
correlationId: params.providerMetadata?.correlationId,
|
|
412
|
-
parentCorrelationId: params.providerMetadata?.parentCorrelationId
|
|
418
|
+
responseId: id
|
|
413
419
|
});
|
|
414
420
|
}
|
|
415
421
|
});
|
|
@@ -462,8 +468,10 @@ var agentLogic = fromTransition(
|
|
|
462
468
|
});
|
|
463
469
|
break;
|
|
464
470
|
}
|
|
465
|
-
default:
|
|
471
|
+
default: {
|
|
472
|
+
console.warn("Unrecognized event", event);
|
|
466
473
|
break;
|
|
474
|
+
}
|
|
467
475
|
}
|
|
468
476
|
return state;
|
|
469
477
|
},
|
|
@@ -476,22 +484,17 @@ var agentLogic = fromTransition(
|
|
|
476
484
|
);
|
|
477
485
|
function createAgent({
|
|
478
486
|
id,
|
|
479
|
-
name,
|
|
480
487
|
description,
|
|
481
488
|
model,
|
|
482
489
|
events,
|
|
483
490
|
context,
|
|
484
491
|
planner = simplePlanner,
|
|
485
|
-
|
|
486
|
-
getMemory,
|
|
487
|
-
logic = agentLogic,
|
|
488
|
-
...generateTextOptions
|
|
492
|
+
logic = agentLogic
|
|
489
493
|
}) {
|
|
490
494
|
return new Agent({
|
|
491
495
|
id,
|
|
492
496
|
context,
|
|
493
497
|
events,
|
|
494
|
-
name,
|
|
495
498
|
description,
|
|
496
499
|
planner,
|
|
497
500
|
model,
|
|
@@ -602,7 +605,8 @@ var Agent = class extends Actor {
|
|
|
602
605
|
return this.getSnapshot().context.plans;
|
|
603
606
|
}
|
|
604
607
|
interact(actorRef, getInput) {
|
|
605
|
-
const actorRefCheck = isActorRef(actorRef);
|
|
608
|
+
const actorRefCheck = isActorRef(actorRef) && actorRef.src;
|
|
609
|
+
const machine = isMachineActor(actorRef) ? actorRef.src : void 0;
|
|
606
610
|
let prevState = void 0;
|
|
607
611
|
let subscribed = true;
|
|
608
612
|
const agent = this;
|
|
@@ -610,14 +614,14 @@ var Agent = class extends Actor {
|
|
|
610
614
|
const observation = agent.addObservation(observationInput);
|
|
611
615
|
const input = getInput?.(observation);
|
|
612
616
|
if (input) {
|
|
613
|
-
await agentDecide(agent, {
|
|
614
|
-
machine
|
|
617
|
+
const res = await agentDecide(agent, {
|
|
618
|
+
machine,
|
|
615
619
|
state: observation.state,
|
|
616
|
-
execute: async (event) => {
|
|
617
|
-
actorRef.send(event);
|
|
618
|
-
},
|
|
619
620
|
...input
|
|
620
621
|
});
|
|
622
|
+
if (res?.nextEvent) {
|
|
623
|
+
actorRef.send(res.nextEvent);
|
|
624
|
+
}
|
|
621
625
|
}
|
|
622
626
|
prevState = observationInput.state;
|
|
623
627
|
}
|
package/examples/chatbot-alt.ts
CHANGED
package/examples/chatbot.ts
CHANGED
package/examples/cot.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
|
|
|
5
5
|
import { fromTerminal } from './helpers/helpers';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'chain-of-thought',
|
|
9
9
|
model: openai('gpt-4o-mini'),
|
|
10
10
|
events: {
|
|
11
11
|
'agent.think': z.object({
|
|
@@ -5,7 +5,7 @@ import { z } from 'zod';
|
|
|
5
5
|
|
|
6
6
|
// Create customer service agent
|
|
7
7
|
const customerServiceAgent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'customer-service',
|
|
9
9
|
model: openai('gpt-4o'),
|
|
10
10
|
events: {
|
|
11
11
|
'agent.respond': z.object({
|
|
@@ -14,12 +14,12 @@ const customerServiceAgent = createAgent({
|
|
|
14
14
|
.describe('The response from the customer service agent'),
|
|
15
15
|
}),
|
|
16
16
|
},
|
|
17
|
-
|
|
17
|
+
description: 'You are a customer service agent for an airline.',
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
// Create simulated customer agent
|
|
21
21
|
const customerAgent = createAgent({
|
|
22
|
-
|
|
22
|
+
id: 'customer',
|
|
23
23
|
model: openai('gpt-4o-mini'),
|
|
24
24
|
events: {
|
|
25
25
|
'agent.respond': z.object({
|
|
@@ -27,7 +27,7 @@ const customerAgent = createAgent({
|
|
|
27
27
|
}),
|
|
28
28
|
'agent.finish': z.object({}).describe('End the conversation'),
|
|
29
29
|
},
|
|
30
|
-
|
|
30
|
+
description: `You are Harrison, a customer trying to get a refund for a trip to Alaska.
|
|
31
31
|
You want them to give you ALL the money back. Be extremely persistent. This trip happened 5 years ago.
|
|
32
32
|
If you have nothing more to add to the conversation, send agent.finish event.`,
|
|
33
33
|
});
|
package/examples/email.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { assign, createActor, setup } from 'xstate';
|
|
|
5
5
|
import { fromTerminal } from './helpers/helpers';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
9
|
-
model: openai('gpt-4o'),
|
|
8
|
+
id: 'email',
|
|
9
|
+
model: openai('gpt-4o-mini'),
|
|
10
10
|
events: {
|
|
11
11
|
askForClarification: z.object({
|
|
12
12
|
questions: z.array(z.string()).describe('The questions to ask the agent'),
|
|
@@ -15,6 +15,14 @@ const agent = createAgent({
|
|
|
15
15
|
email: z.string().describe('The email to submit'),
|
|
16
16
|
}),
|
|
17
17
|
},
|
|
18
|
+
context: {
|
|
19
|
+
email: z.string().describe('The email to respond to'),
|
|
20
|
+
instructions: z.string().describe('The instructions for the email'),
|
|
21
|
+
clarifications: z
|
|
22
|
+
.array(z.string())
|
|
23
|
+
.describe('The clarifications to the email'),
|
|
24
|
+
replyEmail: z.string().nullable().describe('The email to submit'),
|
|
25
|
+
},
|
|
18
26
|
});
|
|
19
27
|
|
|
20
28
|
const machine = setup({
|
|
@@ -24,14 +32,9 @@ const machine = setup({
|
|
|
24
32
|
email: string;
|
|
25
33
|
instructions: string;
|
|
26
34
|
},
|
|
27
|
-
context:
|
|
28
|
-
email: string;
|
|
29
|
-
instructions: string;
|
|
30
|
-
clarifications: string[];
|
|
31
|
-
replyEmail: string | null;
|
|
32
|
-
},
|
|
35
|
+
context: agent.types.context,
|
|
33
36
|
},
|
|
34
|
-
actors: {
|
|
37
|
+
actors: { getFromTerminal: fromTerminal },
|
|
35
38
|
}).createMachine({
|
|
36
39
|
initial: 'checking',
|
|
37
40
|
context: ({ input }) => ({
|
|
@@ -42,18 +45,6 @@ const machine = setup({
|
|
|
42
45
|
}),
|
|
43
46
|
states: {
|
|
44
47
|
checking: {
|
|
45
|
-
invoke: {
|
|
46
|
-
src: 'agent',
|
|
47
|
-
input: ({ context }) => ({
|
|
48
|
-
context: {
|
|
49
|
-
email: context.email,
|
|
50
|
-
instructions: context.instructions,
|
|
51
|
-
clarifications: context.clarifications,
|
|
52
|
-
},
|
|
53
|
-
messages: agent.getMessages(),
|
|
54
|
-
goal: 'Respond to the email given the instructions and the provided clarifications. If not enough information is provided, ask for clarification. Otherwise, if you are absolutely sure that there is no ambiguous or missing information, create and submit a response email.',
|
|
55
|
-
}),
|
|
56
|
-
},
|
|
57
48
|
on: {
|
|
58
49
|
askForClarification: {
|
|
59
50
|
actions: ({ event }) => console.log(event.questions.join('\n')),
|
|
@@ -78,17 +69,6 @@ const machine = setup({
|
|
|
78
69
|
},
|
|
79
70
|
},
|
|
80
71
|
submitting: {
|
|
81
|
-
invoke: {
|
|
82
|
-
src: 'agent',
|
|
83
|
-
input: ({ context }) => ({
|
|
84
|
-
context: {
|
|
85
|
-
email: context.email,
|
|
86
|
-
instructions: context.instructions,
|
|
87
|
-
clarifications: context.clarifications,
|
|
88
|
-
},
|
|
89
|
-
goal: `Create and submit an email based on the instructions.`,
|
|
90
|
-
}),
|
|
91
|
-
},
|
|
92
72
|
on: {
|
|
93
73
|
submitEmail: {
|
|
94
74
|
actions: assign({
|
|
@@ -109,10 +89,26 @@ const machine = setup({
|
|
|
109
89
|
},
|
|
110
90
|
});
|
|
111
91
|
|
|
112
|
-
createActor(machine, {
|
|
92
|
+
const actor = createActor(machine, {
|
|
113
93
|
input: {
|
|
114
94
|
email: 'That sounds great! When are you available?',
|
|
115
95
|
instructions:
|
|
116
96
|
'Tell them exactly when I am available. Address them by his full (first and last) name.',
|
|
117
97
|
},
|
|
118
98
|
}).start();
|
|
99
|
+
|
|
100
|
+
agent.interact(actor, ({ state }) => {
|
|
101
|
+
if (state.matches('checking')) {
|
|
102
|
+
return {
|
|
103
|
+
goal: 'Respond to the email given the instructions and the provided clarifications. If not enough information is provided, ask for clarification. Otherwise, if you are absolutely sure that there is no ambiguous or missing information, create and submit a response email.',
|
|
104
|
+
context: state.context,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (state.matches('submitting')) {
|
|
109
|
+
return {
|
|
110
|
+
goal: 'Create and submit an email based on the instructions.',
|
|
111
|
+
context: state.context,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
});
|
package/examples/example.ts
CHANGED
package/examples/goal.ts
CHANGED
package/examples/joke.ts
CHANGED
package/examples/jugs.ts
CHANGED
|
@@ -2,10 +2,10 @@ import { createAgent } from '../src';
|
|
|
2
2
|
import { assign, createActor, setup } from 'xstate';
|
|
3
3
|
import { openai } from '@ai-sdk/openai';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import {
|
|
5
|
+
import { experimental_createShortestPathPlanner } from '../src/planners/shortestPath';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'die-hard-solver',
|
|
9
9
|
model: openai('gpt-4o'),
|
|
10
10
|
events: {
|
|
11
11
|
fill3: z.object({}).describe('Fill the 3-gallon jug'),
|
|
@@ -106,7 +106,7 @@ async function main() {
|
|
|
106
106
|
machine: waterJugMachine,
|
|
107
107
|
goal: 'Get exactly 4 gallons of water in the 5-gallon jug',
|
|
108
108
|
state: waterJugActor.getSnapshot(),
|
|
109
|
-
planner:
|
|
109
|
+
planner: experimental_createShortestPathPlanner(),
|
|
110
110
|
});
|
|
111
111
|
|
|
112
112
|
console.log(decision?.nextEvent);
|
package/examples/multi.ts
CHANGED
package/examples/number.ts
CHANGED
package/examples/raffle.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { assign, createActor, log, setup } from 'xstate';
|
|
|
5
5
|
import { fromTerminal } from './helpers/helpers';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'raffle-chooser',
|
|
9
9
|
model: openai('gpt-4o-mini'),
|
|
10
10
|
events: {
|
|
11
11
|
'agent.collectEntries': z.object({}).describe('Collect more entries'),
|
|
@@ -2,10 +2,10 @@ import { createAgent } from '../src';
|
|
|
2
2
|
import { assign, createActor, setup } from 'xstate';
|
|
3
3
|
import { openai } from '@ai-sdk/openai';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import {
|
|
5
|
+
import { experimental_createShortestPathPlanner } from '../src/planners/shortestPath';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'river-crossing-solver',
|
|
9
9
|
model: openai('gpt-4'),
|
|
10
10
|
events: {
|
|
11
11
|
takeWolf: z
|
|
@@ -121,7 +121,7 @@ async function main() {
|
|
|
121
121
|
machine: riverCrossingMachine,
|
|
122
122
|
goal: 'Get all items safely across the river. Remember: Cannot leave wolf with goat or goat with cabbage unattended.',
|
|
123
123
|
state: riverActor.getSnapshot(),
|
|
124
|
-
planner:
|
|
124
|
+
planner: experimental_createShortestPathPlanner(),
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
console.log(decision?.nextEvent);
|
package/examples/simple.ts
CHANGED
package/examples/summary.ts
CHANGED
package/examples/support.ts
CHANGED
package/examples/ticTacToe.ts
CHANGED
|
@@ -39,14 +39,14 @@ const context = {
|
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const xAgent = createAgent({
|
|
42
|
-
|
|
42
|
+
id: 'tic-tac-toe-learner',
|
|
43
43
|
model: openai('gpt-4o-mini'),
|
|
44
44
|
events,
|
|
45
45
|
context,
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
const oAgent = createAgent({
|
|
49
|
-
|
|
49
|
+
id: 'tic-tac-toe-noob',
|
|
50
50
|
model: openai('gpt-4o-mini'),
|
|
51
51
|
events,
|
|
52
52
|
context,
|
package/examples/todo.ts
CHANGED
package/examples/tutor.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { z } from 'zod';
|
|
|
5
5
|
import { openai } from '@ai-sdk/openai';
|
|
6
6
|
|
|
7
7
|
const agent = createAgent({
|
|
8
|
-
|
|
8
|
+
id: 'tutor',
|
|
9
9
|
model: openai('gpt-4o-mini'),
|
|
10
10
|
events: {
|
|
11
11
|
teach: z.object({
|
|
@@ -19,7 +19,7 @@ const agent = createAgent({
|
|
|
19
19
|
response: z.string().describe('The response to the human in Spanish'),
|
|
20
20
|
}),
|
|
21
21
|
},
|
|
22
|
-
|
|
22
|
+
description:
|
|
23
23
|
'You are an expert Spanish tutor. You will respond to the human in Spanish.',
|
|
24
24
|
});
|
|
25
25
|
|
package/examples/verify.ts
CHANGED
package/examples/weather.ts
CHANGED
package/examples/wiki.ts
CHANGED
package/examples/word.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@statelyai/agent",
|
|
3
|
-
"version": "2.0.0-next.
|
|
3
|
+
"version": "2.0.0-next.1",
|
|
4
4
|
"description": "Stateful agents that make decisions based on finite-state machine models",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"@tavily/core": "^0.0.2",
|
|
25
25
|
"@types/node": "^20.17.1",
|
|
26
26
|
"@types/object-hash": "^3.0.6",
|
|
27
|
+
"@vitest/coverage-v8": "^2.1.4",
|
|
27
28
|
"dotenv": "^16.4.5",
|
|
28
29
|
"json-schema-to-ts": "^3.1.1",
|
|
29
30
|
"ts-node": "^10.9.2",
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
},
|
|
39
40
|
"dependencies": {
|
|
40
41
|
"@xstate/graph": "^2.0.1",
|
|
41
|
-
"ai": "^3.4.
|
|
42
|
+
"ai": "^3.4.31",
|
|
42
43
|
"ajv": "^8.17.1",
|
|
43
44
|
"object-hash": "^3.0.0",
|
|
44
45
|
"xstate": "^5.18.2",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"example": "ts-node examples/helpers/runner.ts",
|
|
53
54
|
"changeset": "changeset",
|
|
54
55
|
"release": "changeset publish",
|
|
55
|
-
"version": "changeset version"
|
|
56
|
+
"version": "changeset version",
|
|
57
|
+
"coverage": "vitest run --coverage"
|
|
56
58
|
}
|
|
57
59
|
}
|