@dxos/assistant-toolkit 0.9.0 → 0.9.1-main.c7dcc2e112
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/lib/neutral/{add-artifact-54DVWE53.mjs → add-artifact-QEQP6T7Z.mjs} +4 -4
- package/dist/lib/neutral/{agent-LCBDWP74.mjs → agent-BU6PB7J6.mjs} +4 -4
- package/dist/lib/neutral/{agent-rules-3TBAIVTS.mjs → agent-rules-L3AHRSR4.mjs} +4 -4
- package/dist/lib/neutral/{chunk-URUJQGI6.mjs → chunk-5HANNHZZ.mjs} +11 -2
- package/dist/lib/neutral/chunk-5HANNHZZ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-KC2LPECT.mjs → chunk-ABOAU3NN.mjs} +4 -4
- package/dist/lib/neutral/chunk-ABOAU3NN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-RNIUE4LK.mjs → chunk-CUT6GB2W.mjs} +2 -2
- package/dist/lib/neutral/{chunk-Z3KITY4U.mjs → chunk-JZHXJBSM.mjs} +2 -2
- package/dist/lib/neutral/chunk-JZHXJBSM.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-3YH7MWSD.mjs → chunk-KZDQGI3S.mjs} +2 -2
- package/dist/lib/neutral/{chunk-JRUTUKPS.mjs → chunk-OK3P6URP.mjs} +3 -3
- package/dist/lib/neutral/{chunk-BOB6M2YM.mjs → chunk-WTUY5UCA.mjs} +3 -3
- package/dist/lib/neutral/{chunk-BOB6M2YM.mjs.map → chunk-WTUY5UCA.mjs.map} +1 -1
- package/dist/lib/neutral/chunk-ZA5WZL4H.mjs +97 -0
- package/dist/lib/neutral/chunk-ZA5WZL4H.mjs.map +7 -0
- package/dist/lib/neutral/{create-agent-KUTBEXLJ.mjs → create-agent-7PBQFYHF.mjs} +6 -6
- package/dist/lib/neutral/{definitions-6HU2P7R7.mjs → definitions-BHRGH45G.mjs} +4 -4
- package/dist/lib/neutral/{delegate-task-E7WLHT6S.mjs → delegate-task-IQJSRLN3.mjs} +4 -4
- package/dist/lib/neutral/{get-context-X4FCUMLK.mjs → get-context-6SZ7HOV4.mjs} +4 -4
- package/dist/lib/neutral/index.mjs +61 -18
- package/dist/lib/neutral/index.mjs.map +4 -4
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/{prompt-QL7TTLM3.mjs → prompt-37GJGKNM.mjs} +4 -4
- package/dist/lib/neutral/{prompt-QL7TTLM3.mjs.map → prompt-37GJGKNM.mjs.map} +1 -1
- package/dist/lib/neutral/{qualifier-QAW6LSYF.mjs → qualifier-DHPHY3YH.mjs} +4 -4
- package/dist/lib/neutral/{sync-triggers-JEVTYIGU.mjs → sync-triggers-CI6ECSZX.mjs} +5 -5
- package/dist/lib/neutral/testing/index.mjs +2 -12
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/lib/neutral/{update-tasks-N65UQUHS.mjs → update-tasks-R5YXESZ6.mjs} +4 -4
- package/dist/types/src/blueprints/agent/operations/definitions.d.ts +6 -4
- package/dist/types/src/blueprints/agent/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/agent-wizard/operations/create-agent.d.ts +3 -2
- package/dist/types/src/blueprints/agent-wizard/operations/definitions.d.ts +6 -4
- package/dist/types/src/blueprints/agent-wizard/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/blueprints/agent-wizard/operations/sync-triggers.d.ts +3 -2
- package/dist/types/src/blueprints/delegation/operations/delegate-task.d.ts +4 -2
- package/dist/types/src/blueprints/delegation/operations/delegate-task.d.ts.map +1 -1
- package/dist/types/src/blueprints/planning/operations/update-tasks.d.ts.map +1 -1
- package/dist/types/src/functions/agent/definitions.d.ts +2 -2
- package/dist/types/src/supervisor/delegation-strategy.d.ts.map +1 -1
- package/dist/types/src/supervisor/index.d.ts +1 -0
- package/dist/types/src/supervisor/index.d.ts.map +1 -1
- package/dist/types/src/supervisor/plan-completion-guard.d.ts +6 -0
- package/dist/types/src/supervisor/plan-completion-guard.d.ts.map +1 -0
- package/dist/types/src/testing/plugins.d.ts.map +1 -1
- package/dist/types/src/types/Agent.d.ts +3 -2
- package/dist/types/src/types/Agent.d.ts.map +1 -1
- package/dist/types/src/types/Chat.d.ts +4 -4
- package/dist/types/src/types/Plan.d.ts +14 -3
- package/dist/types/src/types/Plan.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -26
- package/src/blueprints/agent/blueprint.conversations.json +1 -1
- package/src/blueprints/database/blueprint.conversations.json +1 -1
- package/src/blueprints/delegation/operations/delegate-task.test.ts +68 -4
- package/src/blueprints/delegation/operations/delegate-task.ts +47 -11
- package/src/blueprints/memory/blueprint.conversations.json +1 -1
- package/src/blueprints/planning/operations/update-tasks.ts +4 -3
- package/src/functions/agent/definitions.ts +1 -1
- package/src/functions/agent/prompt.conversations.json +1 -1
- package/src/functions/agent/prompt.ts +1 -1
- package/src/supervisor/delegation-strategy.ts +8 -1
- package/src/supervisor/index.ts +1 -0
- package/src/supervisor/plan-completion-guard.ts +50 -0
- package/src/testing/plugins.tsx +2 -21
- package/src/types/Chat.ts +1 -1
- package/src/types/Plan.ts +14 -0
- package/dist/lib/neutral/chunk-KC2LPECT.mjs.map +0 -7
- package/dist/lib/neutral/chunk-U5FCQXA2.mjs +0 -69
- package/dist/lib/neutral/chunk-U5FCQXA2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-URUJQGI6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Z3KITY4U.mjs.map +0 -7
- package/src/blueprints/blueprint-manager/blueprint.conversations.json +0 -1
- package/src/blueprints/browser/blueprint.conversations.json +0 -1
- package/src/blueprints/websearch/blueprint.conversations.json +0 -1
- /package/dist/lib/neutral/{add-artifact-54DVWE53.mjs.map → add-artifact-QEQP6T7Z.mjs.map} +0 -0
- /package/dist/lib/neutral/{agent-LCBDWP74.mjs.map → agent-BU6PB7J6.mjs.map} +0 -0
- /package/dist/lib/neutral/{agent-rules-3TBAIVTS.mjs.map → agent-rules-L3AHRSR4.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-RNIUE4LK.mjs.map → chunk-CUT6GB2W.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-3YH7MWSD.mjs.map → chunk-KZDQGI3S.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-JRUTUKPS.mjs.map → chunk-OK3P6URP.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-agent-KUTBEXLJ.mjs.map → create-agent-7PBQFYHF.mjs.map} +0 -0
- /package/dist/lib/neutral/{definitions-6HU2P7R7.mjs.map → definitions-BHRGH45G.mjs.map} +0 -0
- /package/dist/lib/neutral/{delegate-task-E7WLHT6S.mjs.map → delegate-task-IQJSRLN3.mjs.map} +0 -0
- /package/dist/lib/neutral/{get-context-X4FCUMLK.mjs.map → get-context-6SZ7HOV4.mjs.map} +0 -0
- /package/dist/lib/neutral/{qualifier-QAW6LSYF.mjs.map → qualifier-DHPHY3YH.mjs.map} +0 -0
- /package/dist/lib/neutral/{sync-triggers-JEVTYIGU.mjs.map → sync-triggers-CI6ECSZX.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-tasks-N65UQUHS.mjs.map → update-tasks-R5YXESZ6.mjs.map} +0 -0
|
@@ -26,6 +26,11 @@ const TestLayer = AssistantTestLayer({
|
|
|
26
26
|
disableLlmMemoization: true,
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
+
const invokeDelegateTask = (input: { id?: Plan.TaskId; title?: string }, chatFeed: Feed.Feed) =>
|
|
30
|
+
Operation.invoke(DelegateTask, input).pipe(
|
|
31
|
+
Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getURI(chatFeed) })),
|
|
32
|
+
);
|
|
33
|
+
|
|
29
34
|
describe('DelegateTask', () => {
|
|
30
35
|
it.scoped(
|
|
31
36
|
'adds an in-progress task to the agent plan for delegated work',
|
|
@@ -40,13 +45,72 @@ describe('DelegateTask', () => {
|
|
|
40
45
|
const chatFeed = agent.chat?.target?.feed?.target;
|
|
41
46
|
invariant(chatFeed, 'Agent chat feed not found.');
|
|
42
47
|
|
|
43
|
-
yield*
|
|
44
|
-
Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getURI(chatFeed) })),
|
|
45
|
-
);
|
|
48
|
+
yield* invokeDelegateTask({ title: 'Research widgets' }, chatFeed);
|
|
46
49
|
|
|
47
50
|
const plan = yield* Database.load(agent.plan);
|
|
48
51
|
expect(plan.tasks).toHaveLength(1);
|
|
49
|
-
expect(plan.tasks[0]).toMatchObject({
|
|
52
|
+
expect(plan.tasks[0]).toMatchObject({
|
|
53
|
+
title: 'Research widgets',
|
|
54
|
+
status: 'in-progress',
|
|
55
|
+
delegated: true,
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
Effect.provide(TestLayer),
|
|
59
|
+
TestHelpers.provideTestContext,
|
|
60
|
+
),
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
it.scoped(
|
|
64
|
+
'delegates an existing plan task by id without duplicating',
|
|
65
|
+
Effect.fnUntraced(
|
|
66
|
+
function* ({ expect }) {
|
|
67
|
+
const agent = yield* Agent.makeInitialized(
|
|
68
|
+
{ name: 'Supervisor', instructions: 'Test.' },
|
|
69
|
+
DelegationBlueprint.make(),
|
|
70
|
+
);
|
|
71
|
+
const plan = yield* Database.load(agent.plan);
|
|
72
|
+
const taskId = Plan.TaskId.make('1-ab');
|
|
73
|
+
Obj.update(plan, (plan) => {
|
|
74
|
+
plan.tasks.push({ id: taskId, title: 'Research widgets', status: 'todo' });
|
|
75
|
+
});
|
|
76
|
+
yield* Database.flush();
|
|
77
|
+
|
|
78
|
+
const chatFeed = agent.chat?.target?.feed?.target;
|
|
79
|
+
invariant(chatFeed, 'Agent chat feed not found.');
|
|
80
|
+
|
|
81
|
+
yield* invokeDelegateTask({ id: taskId }, chatFeed);
|
|
82
|
+
|
|
83
|
+
const updated = yield* Database.load(agent.plan);
|
|
84
|
+
expect(updated.tasks).toHaveLength(1);
|
|
85
|
+
expect(updated.tasks[0]).toMatchObject({
|
|
86
|
+
id: taskId,
|
|
87
|
+
title: 'Research widgets',
|
|
88
|
+
status: 'in-progress',
|
|
89
|
+
delegated: true,
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
Effect.provide(TestLayer),
|
|
93
|
+
TestHelpers.provideTestContext,
|
|
94
|
+
),
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
it.scoped(
|
|
98
|
+
'fails when both id and title are provided',
|
|
99
|
+
Effect.fnUntraced(
|
|
100
|
+
function* ({ expect }) {
|
|
101
|
+
const agent = yield* Agent.makeInitialized(
|
|
102
|
+
{ name: 'Supervisor', instructions: 'Test.' },
|
|
103
|
+
DelegationBlueprint.make(),
|
|
104
|
+
);
|
|
105
|
+
yield* Database.flush();
|
|
106
|
+
|
|
107
|
+
const chatFeed = agent.chat?.target?.feed?.target;
|
|
108
|
+
invariant(chatFeed, 'Agent chat feed not found.');
|
|
109
|
+
|
|
110
|
+
const exit = yield* invokeDelegateTask({ id: Plan.TaskId.make('1-ab'), title: 'New task' }, chatFeed).pipe(
|
|
111
|
+
Effect.exit,
|
|
112
|
+
);
|
|
113
|
+
expect(exit._tag).toBe('Failure');
|
|
50
114
|
},
|
|
51
115
|
Effect.provide(TestLayer),
|
|
52
116
|
TestHelpers.provideTestContext,
|
|
@@ -18,15 +18,18 @@ export const DelegateTask = Operation.make({
|
|
|
18
18
|
key: DXN.make('org.dxos.function.delegation.delegateTask'),
|
|
19
19
|
name: 'Delegate task',
|
|
20
20
|
description: trim`
|
|
21
|
-
Delegate a unit of work to a sub-agent.
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
Delegate a unit of work to a sub-agent.
|
|
22
|
+
Provide either \`id\` (an existing plan task from update-tasks) or \`title\` (to create a new task).
|
|
23
|
+
Marks the task in-progress and delegated so the supervisor spawns a background sub-agent.
|
|
24
24
|
`,
|
|
25
25
|
icon: 'ph--share-network--regular',
|
|
26
26
|
},
|
|
27
27
|
input: Schema.Struct({
|
|
28
|
-
|
|
29
|
-
description: '
|
|
28
|
+
id: Schema.optional(Plan.TaskId).annotations({
|
|
29
|
+
description: 'Id of an existing plan task to delegate (from update-tasks).',
|
|
30
|
+
}),
|
|
31
|
+
title: Schema.optional(Schema.String).annotations({
|
|
32
|
+
description: 'Title for a new task to create and delegate. Omit when delegating by id.',
|
|
30
33
|
}),
|
|
31
34
|
}),
|
|
32
35
|
output: Schema.Any,
|
|
@@ -38,14 +41,47 @@ export const DelegateTask = Operation.make({
|
|
|
38
41
|
*/
|
|
39
42
|
export default DelegateTask.pipe(
|
|
40
43
|
Operation.withHandler(
|
|
41
|
-
Effect.fn(function* ({ title }) {
|
|
44
|
+
Effect.fn(function* ({ id, title }) {
|
|
45
|
+
const hasId = id !== undefined;
|
|
46
|
+
const hasTitle = title !== undefined && title.length > 0;
|
|
47
|
+
if (hasId === hasTitle) {
|
|
48
|
+
return yield* Effect.fail(
|
|
49
|
+
new Error('Provide exactly one of `id` (existing plan task) or `title` (new task to create).'),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
42
53
|
const agent = yield* Agent.getFromChatContext;
|
|
43
54
|
const plan = yield* Database.load(agent.plan);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
|
|
56
|
+
if (hasId) {
|
|
57
|
+
const existing = plan.tasks.find((task) => task.id === id);
|
|
58
|
+
if (!existing) {
|
|
59
|
+
return yield* Effect.fail(new Error(`Plan task not found: ${id}`));
|
|
60
|
+
}
|
|
61
|
+
if (existing.status === 'done' || existing.status === 'failed') {
|
|
62
|
+
return yield* Effect.fail(
|
|
63
|
+
new Error(`Plan task "${id}" is already ${existing.status} and cannot be delegated.`),
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
Obj.update(plan, (plan) => {
|
|
68
|
+
const task = plan.tasks.find((task) => task.id === id);
|
|
69
|
+
if (task) {
|
|
70
|
+
task.delegated = true;
|
|
71
|
+
task.status = 'in-progress';
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
} else {
|
|
75
|
+
if (title === undefined) {
|
|
76
|
+
return yield* Effect.fail(
|
|
77
|
+
new Error('Provide exactly one of `id` (existing plan task) or `title` (new task to create).'),
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
Obj.update(plan, (plan) => {
|
|
81
|
+
Plan.addTasks(plan, [{ title, status: 'in-progress', delegated: true }]);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
49
85
|
return trim`
|
|
50
86
|
Delegated work as an in-progress task. Current plan:
|
|
51
87
|
<plan>
|