@dxos/assistant-toolkit 0.8.4-staging.60fe92afc8 → 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.
Files changed (89) hide show
  1. package/dist/lib/neutral/{add-artifact-54DVWE53.mjs → add-artifact-QEQP6T7Z.mjs} +4 -4
  2. package/dist/lib/neutral/{agent-LCBDWP74.mjs → agent-BU6PB7J6.mjs} +4 -4
  3. package/dist/lib/neutral/{agent-rules-3TBAIVTS.mjs → agent-rules-L3AHRSR4.mjs} +4 -4
  4. package/dist/lib/neutral/{chunk-URUJQGI6.mjs → chunk-5HANNHZZ.mjs} +11 -2
  5. package/dist/lib/neutral/chunk-5HANNHZZ.mjs.map +7 -0
  6. package/dist/lib/neutral/{chunk-KC2LPECT.mjs → chunk-ABOAU3NN.mjs} +4 -4
  7. package/dist/lib/neutral/chunk-ABOAU3NN.mjs.map +7 -0
  8. package/dist/lib/neutral/{chunk-RNIUE4LK.mjs → chunk-CUT6GB2W.mjs} +2 -2
  9. package/dist/lib/neutral/{chunk-Z3KITY4U.mjs → chunk-JZHXJBSM.mjs} +2 -2
  10. package/dist/lib/neutral/chunk-JZHXJBSM.mjs.map +7 -0
  11. package/dist/lib/neutral/{chunk-3YH7MWSD.mjs → chunk-KZDQGI3S.mjs} +2 -2
  12. package/dist/lib/neutral/{chunk-JRUTUKPS.mjs → chunk-OK3P6URP.mjs} +3 -3
  13. package/dist/lib/neutral/{chunk-BOB6M2YM.mjs → chunk-WTUY5UCA.mjs} +3 -3
  14. package/dist/lib/neutral/{chunk-BOB6M2YM.mjs.map → chunk-WTUY5UCA.mjs.map} +1 -1
  15. package/dist/lib/neutral/chunk-ZA5WZL4H.mjs +97 -0
  16. package/dist/lib/neutral/chunk-ZA5WZL4H.mjs.map +7 -0
  17. package/dist/lib/neutral/{create-agent-KUTBEXLJ.mjs → create-agent-7PBQFYHF.mjs} +6 -6
  18. package/dist/lib/neutral/{definitions-6HU2P7R7.mjs → definitions-BHRGH45G.mjs} +4 -4
  19. package/dist/lib/neutral/{delegate-task-E7WLHT6S.mjs → delegate-task-IQJSRLN3.mjs} +4 -4
  20. package/dist/lib/neutral/{get-context-X4FCUMLK.mjs → get-context-6SZ7HOV4.mjs} +4 -4
  21. package/dist/lib/neutral/index.mjs +61 -18
  22. package/dist/lib/neutral/index.mjs.map +4 -4
  23. package/dist/lib/neutral/meta.json +1 -1
  24. package/dist/lib/neutral/{prompt-QL7TTLM3.mjs → prompt-37GJGKNM.mjs} +4 -4
  25. package/dist/lib/neutral/{prompt-QL7TTLM3.mjs.map → prompt-37GJGKNM.mjs.map} +1 -1
  26. package/dist/lib/neutral/{qualifier-QAW6LSYF.mjs → qualifier-DHPHY3YH.mjs} +4 -4
  27. package/dist/lib/neutral/{sync-triggers-JEVTYIGU.mjs → sync-triggers-CI6ECSZX.mjs} +5 -5
  28. package/dist/lib/neutral/testing/index.mjs +2 -12
  29. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  30. package/dist/lib/neutral/{update-tasks-N65UQUHS.mjs → update-tasks-R5YXESZ6.mjs} +4 -4
  31. package/dist/types/src/blueprints/agent/operations/definitions.d.ts +6 -4
  32. package/dist/types/src/blueprints/agent/operations/definitions.d.ts.map +1 -1
  33. package/dist/types/src/blueprints/agent-wizard/operations/create-agent.d.ts +3 -2
  34. package/dist/types/src/blueprints/agent-wizard/operations/definitions.d.ts +6 -4
  35. package/dist/types/src/blueprints/agent-wizard/operations/definitions.d.ts.map +1 -1
  36. package/dist/types/src/blueprints/agent-wizard/operations/sync-triggers.d.ts +3 -2
  37. package/dist/types/src/blueprints/delegation/operations/delegate-task.d.ts +4 -2
  38. package/dist/types/src/blueprints/delegation/operations/delegate-task.d.ts.map +1 -1
  39. package/dist/types/src/blueprints/planning/operations/update-tasks.d.ts.map +1 -1
  40. package/dist/types/src/functions/agent/definitions.d.ts +2 -2
  41. package/dist/types/src/supervisor/delegation-strategy.d.ts.map +1 -1
  42. package/dist/types/src/supervisor/index.d.ts +1 -0
  43. package/dist/types/src/supervisor/index.d.ts.map +1 -1
  44. package/dist/types/src/supervisor/plan-completion-guard.d.ts +6 -0
  45. package/dist/types/src/supervisor/plan-completion-guard.d.ts.map +1 -0
  46. package/dist/types/src/testing/plugins.d.ts.map +1 -1
  47. package/dist/types/src/types/Agent.d.ts +3 -2
  48. package/dist/types/src/types/Agent.d.ts.map +1 -1
  49. package/dist/types/src/types/Chat.d.ts +4 -4
  50. package/dist/types/src/types/Plan.d.ts +14 -3
  51. package/dist/types/src/types/Plan.d.ts.map +1 -1
  52. package/dist/types/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +27 -26
  54. package/src/blueprints/agent/blueprint.conversations.json +1 -1
  55. package/src/blueprints/database/blueprint.conversations.json +1 -1
  56. package/src/blueprints/delegation/operations/delegate-task.test.ts +68 -4
  57. package/src/blueprints/delegation/operations/delegate-task.ts +47 -11
  58. package/src/blueprints/memory/blueprint.conversations.json +1 -1
  59. package/src/blueprints/planning/operations/update-tasks.ts +4 -3
  60. package/src/functions/agent/definitions.ts +1 -1
  61. package/src/functions/agent/prompt.conversations.json +1 -1
  62. package/src/functions/agent/prompt.ts +1 -1
  63. package/src/supervisor/delegation-strategy.ts +8 -1
  64. package/src/supervisor/index.ts +1 -0
  65. package/src/supervisor/plan-completion-guard.ts +50 -0
  66. package/src/testing/plugins.tsx +2 -21
  67. package/src/types/Chat.ts +1 -1
  68. package/src/types/Plan.ts +14 -0
  69. package/dist/lib/neutral/chunk-KC2LPECT.mjs.map +0 -7
  70. package/dist/lib/neutral/chunk-U5FCQXA2.mjs +0 -69
  71. package/dist/lib/neutral/chunk-U5FCQXA2.mjs.map +0 -7
  72. package/dist/lib/neutral/chunk-URUJQGI6.mjs.map +0 -7
  73. package/dist/lib/neutral/chunk-Z3KITY4U.mjs.map +0 -7
  74. package/src/blueprints/blueprint-manager/blueprint.conversations.json +0 -1
  75. package/src/blueprints/browser/blueprint.conversations.json +0 -1
  76. package/src/blueprints/websearch/blueprint.conversations.json +0 -1
  77. /package/dist/lib/neutral/{add-artifact-54DVWE53.mjs.map → add-artifact-QEQP6T7Z.mjs.map} +0 -0
  78. /package/dist/lib/neutral/{agent-LCBDWP74.mjs.map → agent-BU6PB7J6.mjs.map} +0 -0
  79. /package/dist/lib/neutral/{agent-rules-3TBAIVTS.mjs.map → agent-rules-L3AHRSR4.mjs.map} +0 -0
  80. /package/dist/lib/neutral/{chunk-RNIUE4LK.mjs.map → chunk-CUT6GB2W.mjs.map} +0 -0
  81. /package/dist/lib/neutral/{chunk-3YH7MWSD.mjs.map → chunk-KZDQGI3S.mjs.map} +0 -0
  82. /package/dist/lib/neutral/{chunk-JRUTUKPS.mjs.map → chunk-OK3P6URP.mjs.map} +0 -0
  83. /package/dist/lib/neutral/{create-agent-KUTBEXLJ.mjs.map → create-agent-7PBQFYHF.mjs.map} +0 -0
  84. /package/dist/lib/neutral/{definitions-6HU2P7R7.mjs.map → definitions-BHRGH45G.mjs.map} +0 -0
  85. /package/dist/lib/neutral/{delegate-task-E7WLHT6S.mjs.map → delegate-task-IQJSRLN3.mjs.map} +0 -0
  86. /package/dist/lib/neutral/{get-context-X4FCUMLK.mjs.map → get-context-6SZ7HOV4.mjs.map} +0 -0
  87. /package/dist/lib/neutral/{qualifier-QAW6LSYF.mjs.map → qualifier-DHPHY3YH.mjs.map} +0 -0
  88. /package/dist/lib/neutral/{sync-triggers-JEVTYIGU.mjs.map → sync-triggers-CI6ECSZX.mjs.map} +0 -0
  89. /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* Operation.invoke(DelegateTask, { title: 'Research widgets' }).pipe(
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({ title: 'Research widgets', status: 'in-progress' });
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
- Records the work as an in-progress task on the plan and returns the updated plan.
23
- Use this to hand off work that can proceed in the background while you continue the conversation.
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
- title: Schema.String.annotations({
29
- description: 'Short title describing the work to delegate to a sub-agent.',
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
- Obj.update(plan, (plan) => {
45
- // Mark as delegated so the supervisor's reconcile loop picks it up (and ordinary
46
- // `update-tasks` tasks are NOT spawned as sub-agents).
47
- Plan.addTasks(plan, [{ title, status: 'in-progress', delegated: true }]);
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>