@dxos/assistant-toolkit 0.8.4-main.abd8ff62ef → 0.8.4-main.bc2380dfbc

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 (193) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/neutral/{add-artifact-BA5WQRDU.mjs → add-artifact-4IVGW6CI.mjs} +4 -4
  3. package/dist/lib/neutral/{add-artifact-BA5WQRDU.mjs.map → add-artifact-4IVGW6CI.mjs.map} +3 -3
  4. package/dist/lib/neutral/{agent-M2EW5M36.mjs → agent-F4L7UXME.mjs} +5 -5
  5. package/dist/lib/neutral/{agent-M2EW5M36.mjs.map → agent-F4L7UXME.mjs.map} +2 -2
  6. package/dist/lib/neutral/{chunk-CLHVRIYF.mjs → chunk-5GPL2WXU.mjs} +35 -36
  7. package/dist/lib/neutral/chunk-5GPL2WXU.mjs.map +7 -0
  8. package/dist/lib/neutral/{chunk-CVUA23QI.mjs → chunk-7UCYAP3T.mjs} +17 -17
  9. package/dist/lib/neutral/chunk-7UCYAP3T.mjs.map +7 -0
  10. package/dist/lib/neutral/{chunk-TO5IX24K.mjs → chunk-ANSF2BHN.mjs} +3 -3
  11. package/dist/lib/neutral/chunk-ANSF2BHN.mjs.map +7 -0
  12. package/dist/lib/neutral/{chunk-D5MG5OKX.mjs → chunk-BCT55UTL.mjs} +2 -2
  13. package/dist/lib/neutral/{chunk-J37DYY7A.mjs → chunk-COL54UJ3.mjs} +12 -3
  14. package/dist/lib/neutral/chunk-COL54UJ3.mjs.map +7 -0
  15. package/dist/lib/neutral/{chunk-E2XRNXWP.mjs → chunk-KS3IA6FQ.mjs} +11 -10
  16. package/dist/lib/neutral/chunk-KS3IA6FQ.mjs.map +7 -0
  17. package/dist/lib/neutral/{chunk-KY2TIPJ5.mjs → chunk-MMQ7HFL4.mjs} +4 -5
  18. package/dist/lib/neutral/chunk-MMQ7HFL4.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-PLGEBNTO.mjs +65 -0
  20. package/dist/lib/neutral/chunk-PLGEBNTO.mjs.map +7 -0
  21. package/dist/lib/neutral/{chunk-JCYLFOFK.mjs → chunk-W2722TC5.mjs} +5 -5
  22. package/dist/lib/neutral/{chunk-JCYLFOFK.mjs.map → chunk-W2722TC5.mjs.map} +3 -3
  23. package/dist/lib/neutral/{context-add-IIDPRRVB.mjs → context-add-S5MBW2NA.mjs} +4 -4
  24. package/dist/lib/neutral/context-add-S5MBW2NA.mjs.map +7 -0
  25. package/dist/lib/neutral/{context-remove-RDYV4PD4.mjs → context-remove-35O5T5N5.mjs} +4 -4
  26. package/dist/lib/neutral/context-remove-35O5T5N5.mjs.map +7 -0
  27. package/dist/lib/neutral/{create-project-GLDEAWTT.mjs → create-project-3AGXJ4TD.mjs} +5 -5
  28. package/dist/lib/neutral/{enable-blueprints-LBDZH2CY.mjs → enable-blueprints-IVKST3WH.mjs} +4 -4
  29. package/dist/lib/neutral/enable-blueprints-IVKST3WH.mjs.map +7 -0
  30. package/dist/lib/neutral/{fetch-messages-PWGUG5G3.mjs → fetch-messages-QOBBCTGC.mjs} +2 -2
  31. package/dist/lib/neutral/{get-context-B55SX5Y4.mjs → get-context-FBYWIP72.mjs} +4 -4
  32. package/dist/lib/neutral/{get-context-B55SX5Y4.mjs.map → get-context-FBYWIP72.mjs.map} +3 -3
  33. package/dist/lib/neutral/index.mjs +67 -57
  34. package/dist/lib/neutral/index.mjs.map +3 -3
  35. package/dist/lib/neutral/{load-LI7HHVD6.mjs → load-GAT3T2AD.mjs} +2 -2
  36. package/dist/lib/neutral/meta.json +1 -1
  37. package/dist/lib/neutral/{object-create-52Z7YKIA.mjs → object-create-PL3WRP74.mjs} +3 -3
  38. package/dist/lib/neutral/{object-delete-I266YAXI.mjs → object-delete-PZJQN5KW.mjs} +2 -2
  39. package/dist/lib/neutral/{object-update-HY4GI7LA.mjs → object-update-R43N3VJX.mjs} +2 -2
  40. package/dist/lib/neutral/{project-2YBPW5N7.mjs → project-VVXXUMAI.mjs} +4 -4
  41. package/dist/lib/neutral/{project-rules-XUBEPDP6.mjs → project-rules-KSVSOZJV.mjs} +3 -3
  42. package/dist/lib/neutral/{prompt-2WZQERT4.mjs → prompt-INL55Q2B.mjs} +10 -7
  43. package/dist/lib/neutral/{prompt-2WZQERT4.mjs.map → prompt-INL55Q2B.mjs.map} +3 -3
  44. package/dist/lib/neutral/{qualifier-2AC2ICOB.mjs → qualifier-DAF4H7V3.mjs} +11 -11
  45. package/dist/lib/neutral/qualifier-DAF4H7V3.mjs.map +7 -0
  46. package/dist/lib/neutral/{query-B3NOYFCK.mjs → query-MP5NSQKO.mjs} +3 -4
  47. package/dist/lib/neutral/query-MP5NSQKO.mjs.map +7 -0
  48. package/dist/lib/neutral/{query-blueprints-KXADGHSA.mjs → query-blueprints-PLWYVOI3.mjs} +2 -2
  49. package/dist/lib/neutral/{relation-create-Z3NGW4VU.mjs → relation-create-YAAAFTR2.mjs} +3 -3
  50. package/dist/lib/neutral/{relation-delete-LXY7W2YO.mjs → relation-delete-IEPKERFR.mjs} +2 -2
  51. package/dist/lib/neutral/{schema-add-4TXJO2V7.mjs → schema-add-5BNIINRS.mjs} +2 -2
  52. package/dist/lib/neutral/{schema-list-PJS5AFZ3.mjs → schema-list-54UK7S4R.mjs} +2 -2
  53. package/dist/lib/neutral/{sync-issues-LOLHZNFL.mjs → sync-issues-DWY76B3M.mjs} +6 -7
  54. package/dist/lib/neutral/sync-issues-DWY76B3M.mjs.map +7 -0
  55. package/dist/lib/neutral/{sync-triggers-EYJM4QWR.mjs → sync-triggers-NOIQLELD.mjs} +8 -9
  56. package/dist/lib/neutral/{sync-triggers-EYJM4QWR.mjs.map → sync-triggers-NOIQLELD.mjs.map} +3 -3
  57. package/dist/lib/neutral/{tag-add-5NOHUTIE.mjs → tag-add-NLVRGTC6.mjs} +2 -2
  58. package/dist/lib/neutral/{tag-remove-QTKYDJAW.mjs → tag-remove-N4HFBIA2.mjs} +2 -2
  59. package/dist/lib/neutral/testing/index.mjs +3 -3
  60. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  61. package/dist/lib/neutral/{update-blueprints-N2AK2VUR.mjs → update-blueprints-2SNK6HLG.mjs} +2 -2
  62. package/dist/lib/neutral/update-tasks-QQUR53RN.mjs +13 -0
  63. package/dist/lib/neutral/update-tasks-QQUR53RN.mjs.map +7 -0
  64. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts +10 -8
  65. package/dist/types/src/blueprints/blueprint-manager/functions/definitions.d.ts.map +1 -1
  66. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts +6 -5
  67. package/dist/types/src/blueprints/blueprint-manager/functions/enable-blueprints.d.ts.map +1 -1
  68. package/dist/types/src/blueprints/blueprint-manager/functions/query-blueprints.d.ts +4 -3
  69. package/dist/types/src/blueprints/database/functions/context-add.d.ts +2 -2
  70. package/dist/types/src/blueprints/database/functions/context-add.d.ts.map +1 -1
  71. package/dist/types/src/blueprints/database/functions/context-remove.d.ts +2 -2
  72. package/dist/types/src/blueprints/database/functions/context-remove.d.ts.map +1 -1
  73. package/dist/types/src/blueprints/database/functions/definitions.d.ts +3 -3
  74. package/dist/types/src/blueprints/database/functions/definitions.d.ts.map +1 -1
  75. package/dist/types/src/blueprints/database/functions/query.d.ts +1 -2
  76. package/dist/types/src/blueprints/database/functions/query.d.ts.map +1 -1
  77. package/dist/types/src/blueprints/linear/functions/sync-issues.d.ts.map +1 -1
  78. package/dist/types/src/blueprints/planning/functions/index.d.ts +1 -1
  79. package/dist/types/src/blueprints/planning/functions/index.d.ts.map +1 -1
  80. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts +14 -1
  81. package/dist/types/src/blueprints/planning/functions/update-tasks.d.ts.map +1 -1
  82. package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts +2 -0
  83. package/dist/types/src/blueprints/planning/functions/update-tasks.test.d.ts.map +1 -0
  84. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts +1 -5
  85. package/dist/types/src/blueprints/project/functions/add-artifact.d.ts.map +1 -1
  86. package/dist/types/src/blueprints/project/functions/definitions.d.ts +16 -8
  87. package/dist/types/src/blueprints/project/functions/definitions.d.ts.map +1 -1
  88. package/dist/types/src/blueprints/project/functions/get-context.d.ts +1 -12
  89. package/dist/types/src/blueprints/project/functions/get-context.d.ts.map +1 -1
  90. package/dist/types/src/blueprints/project/functions/qualifier.d.ts +8 -4
  91. package/dist/types/src/blueprints/project/functions/qualifier.d.ts.map +1 -1
  92. package/dist/types/src/blueprints/project-wizard/functions/create-project.d.ts +6 -2
  93. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts +12 -4
  94. package/dist/types/src/blueprints/project-wizard/functions/definitions.d.ts.map +1 -1
  95. package/dist/types/src/blueprints/project-wizard/functions/sync-triggers.d.ts +6 -2
  96. package/dist/types/src/blueprints/testing.d.ts +4 -4
  97. package/dist/types/src/blueprints/testing.d.ts.map +1 -1
  98. package/dist/types/src/crud/graph.d.ts +5 -7
  99. package/dist/types/src/crud/graph.d.ts.map +1 -1
  100. package/dist/types/src/functions/agent/definitions.d.ts +6 -5
  101. package/dist/types/src/functions/agent/definitions.d.ts.map +1 -1
  102. package/dist/types/src/sync/sync.d.ts +1 -2
  103. package/dist/types/src/sync/sync.d.ts.map +1 -1
  104. package/dist/types/src/types/Agent.d.ts +9 -7
  105. package/dist/types/src/types/Agent.d.ts.map +1 -1
  106. package/dist/types/src/types/McpServer.d.ts +4 -1
  107. package/dist/types/src/types/McpServer.d.ts.map +1 -1
  108. package/dist/types/src/types/Plan.d.ts.map +1 -1
  109. package/dist/types/tsconfig.tsbuildinfo +1 -1
  110. package/package.json +26 -26
  111. package/src/blueprints/automation/blueprint.ts +1 -1
  112. package/src/blueprints/blueprint-manager/blueprint.conversations.json +1 -1
  113. package/src/blueprints/blueprint-manager/blueprint.test.ts +21 -17
  114. package/src/blueprints/blueprint-manager/blueprint.ts +2 -2
  115. package/src/blueprints/blueprint-manager/functions/definitions.ts +2 -2
  116. package/src/blueprints/blueprint-manager/functions/enable-blueprints.ts +2 -2
  117. package/src/blueprints/browser/blueprint.test.ts +3 -3
  118. package/src/blueprints/browser/blueprint.ts +1 -1
  119. package/src/blueprints/database/blueprint.conversations.json +1 -1
  120. package/src/blueprints/database/blueprint.test.ts +6 -6
  121. package/src/blueprints/database/blueprint.ts +1 -1
  122. package/src/blueprints/database/functions/context-add.ts +2 -2
  123. package/src/blueprints/database/functions/context-remove.ts +2 -2
  124. package/src/blueprints/database/functions/definitions.ts +16 -16
  125. package/src/blueprints/database/functions/query.ts +2 -3
  126. package/src/blueprints/discord/blueprint.ts +1 -1
  127. package/src/blueprints/discord/functions/fetch-messages.test.ts +7 -2
  128. package/src/blueprints/linear/blueprint.ts +1 -1
  129. package/src/blueprints/linear/functions/linear.test.ts +1 -2
  130. package/src/blueprints/linear/functions/sync-issues.ts +1 -2
  131. package/src/blueprints/memory/blueprint.conversations.json +1 -1
  132. package/src/blueprints/memory/blueprint.ts +1 -1
  133. package/src/blueprints/planning/blueprint.ts +1 -1
  134. package/src/blueprints/planning/functions/index.ts +1 -1
  135. package/src/blueprints/planning/functions/{definitions.ts → update-tasks.md} +29 -50
  136. package/src/blueprints/planning/functions/update-tasks.test.ts +55 -0
  137. package/src/blueprints/planning/functions/update-tasks.ts +25 -3
  138. package/src/blueprints/project/blueprint.conversations.json +1 -1
  139. package/src/blueprints/project/blueprint.test.ts +15 -17
  140. package/src/blueprints/project/blueprint.ts +2 -2
  141. package/src/blueprints/project/functions/add-artifact.ts +1 -0
  142. package/src/blueprints/project/functions/agent.ts +1 -1
  143. package/src/blueprints/project/functions/definitions.ts +8 -8
  144. package/src/blueprints/project/functions/get-context.ts +1 -0
  145. package/src/blueprints/project/functions/qualifier.ts +5 -5
  146. package/src/blueprints/project-wizard/functions/sync-triggers.ts +4 -9
  147. package/src/blueprints/testing.ts +10 -4
  148. package/src/blueprints/websearch/blueprint.conversations.json +1 -1
  149. package/src/crud/graph.test.ts +1 -1
  150. package/src/crud/graph.ts +125 -127
  151. package/src/functions/agent/definitions.ts +8 -3
  152. package/src/functions/agent/prompt.conversations.json +1 -1
  153. package/src/functions/agent/prompt.test.ts +8 -11
  154. package/src/functions/agent/prompt.ts +5 -2
  155. package/src/sync/sync.ts +1 -2
  156. package/src/types/Agent.ts +28 -29
  157. package/src/types/McpServer.ts +5 -5
  158. package/src/types/Plan.ts +1 -0
  159. package/dist/lib/neutral/chunk-CLHVRIYF.mjs.map +0 -7
  160. package/dist/lib/neutral/chunk-CVUA23QI.mjs.map +0 -7
  161. package/dist/lib/neutral/chunk-E2XRNXWP.mjs.map +0 -7
  162. package/dist/lib/neutral/chunk-J37DYY7A.mjs.map +0 -7
  163. package/dist/lib/neutral/chunk-KY2TIPJ5.mjs.map +0 -7
  164. package/dist/lib/neutral/chunk-MMTKJBB5.mjs +0 -140
  165. package/dist/lib/neutral/chunk-MMTKJBB5.mjs.map +0 -7
  166. package/dist/lib/neutral/chunk-TO5IX24K.mjs.map +0 -7
  167. package/dist/lib/neutral/context-add-IIDPRRVB.mjs.map +0 -7
  168. package/dist/lib/neutral/context-remove-RDYV4PD4.mjs.map +0 -7
  169. package/dist/lib/neutral/enable-blueprints-LBDZH2CY.mjs.map +0 -7
  170. package/dist/lib/neutral/qualifier-2AC2ICOB.mjs.map +0 -7
  171. package/dist/lib/neutral/query-B3NOYFCK.mjs.map +0 -7
  172. package/dist/lib/neutral/sync-issues-LOLHZNFL.mjs.map +0 -7
  173. package/dist/lib/neutral/update-tasks-ML2FCYU5.mjs +0 -46
  174. package/dist/lib/neutral/update-tasks-ML2FCYU5.mjs.map +0 -7
  175. package/dist/types/src/blueprints/planning/functions/definitions.d.ts +0 -11
  176. package/dist/types/src/blueprints/planning/functions/definitions.d.ts.map +0 -1
  177. /package/dist/lib/neutral/{chunk-D5MG5OKX.mjs.map → chunk-BCT55UTL.mjs.map} +0 -0
  178. /package/dist/lib/neutral/{create-project-GLDEAWTT.mjs.map → create-project-3AGXJ4TD.mjs.map} +0 -0
  179. /package/dist/lib/neutral/{fetch-messages-PWGUG5G3.mjs.map → fetch-messages-QOBBCTGC.mjs.map} +0 -0
  180. /package/dist/lib/neutral/{load-LI7HHVD6.mjs.map → load-GAT3T2AD.mjs.map} +0 -0
  181. /package/dist/lib/neutral/{object-create-52Z7YKIA.mjs.map → object-create-PL3WRP74.mjs.map} +0 -0
  182. /package/dist/lib/neutral/{object-delete-I266YAXI.mjs.map → object-delete-PZJQN5KW.mjs.map} +0 -0
  183. /package/dist/lib/neutral/{object-update-HY4GI7LA.mjs.map → object-update-R43N3VJX.mjs.map} +0 -0
  184. /package/dist/lib/neutral/{project-2YBPW5N7.mjs.map → project-VVXXUMAI.mjs.map} +0 -0
  185. /package/dist/lib/neutral/{project-rules-XUBEPDP6.mjs.map → project-rules-KSVSOZJV.mjs.map} +0 -0
  186. /package/dist/lib/neutral/{query-blueprints-KXADGHSA.mjs.map → query-blueprints-PLWYVOI3.mjs.map} +0 -0
  187. /package/dist/lib/neutral/{relation-create-Z3NGW4VU.mjs.map → relation-create-YAAAFTR2.mjs.map} +0 -0
  188. /package/dist/lib/neutral/{relation-delete-LXY7W2YO.mjs.map → relation-delete-IEPKERFR.mjs.map} +0 -0
  189. /package/dist/lib/neutral/{schema-add-4TXJO2V7.mjs.map → schema-add-5BNIINRS.mjs.map} +0 -0
  190. /package/dist/lib/neutral/{schema-list-PJS5AFZ3.mjs.map → schema-list-54UK7S4R.mjs.map} +0 -0
  191. /package/dist/lib/neutral/{tag-add-5NOHUTIE.mjs.map → tag-add-NLVRGTC6.mjs.map} +0 -0
  192. /package/dist/lib/neutral/{tag-remove-QTKYDJAW.mjs.map → tag-remove-N4HFBIA2.mjs.map} +0 -0
  193. /package/dist/lib/neutral/{update-blueprints-N2AK2VUR.mjs.map → update-blueprints-2SNK6HLG.mjs.map} +0 -0
@@ -28,7 +28,7 @@ const make = () =>
28
28
  description: 'Persistent memory storage and retrieval.',
29
29
  agentCanEnable: true,
30
30
  instructions: {
31
- source: Ref.make(Text.make(instructions)),
31
+ source: Ref.make(Text.make({ content: instructions })),
32
32
  },
33
33
  tools: Blueprint.toolDefinitions({ operations: [SaveMemory, QueryMemories, DeleteMemory] }),
34
34
  });
@@ -12,7 +12,7 @@ const make = () =>
12
12
  Blueprint.make({
13
13
  key: BLUEPRINT_KEY,
14
14
  name: 'Planning',
15
- description: 'Plans and tracks complex tasks with artifact management.',
15
+ description: 'Plans and tracks complex tasks using artifacts.',
16
16
  tools: Blueprint.toolDefinitions({ operations: [UpdateTasks] }),
17
17
  });
18
18
 
@@ -4,6 +4,6 @@
4
4
 
5
5
  import { OperationHandlerSet } from '@dxos/compute';
6
6
 
7
- export * from './definitions';
7
+ export * from './update-tasks';
8
8
 
9
9
  export const PlanningHandlers = OperationHandlerSet.lazy(() => import('./update-tasks'));
@@ -1,41 +1,38 @@
1
- //
2
- // Copyright 2026 DXOS.org
3
- //
1
+ ## PLANNING TOOL
4
2
 
5
- import * as Schema from 'effect/Schema';
3
+ This tool maintains an organized task list.
4
+ Use this to track progress, break down objectives, and ensure thoroughness.
5
+ If you are asked to create a plan use this tool instead of creating a new document.
6
+ After creating initial tasks, update them silently without announcing changes to the user.
7
+ Important: Do not show or summarize the contents of the task list unless the user asks for this.
6
8
 
7
- import { AiContextService } from '@dxos/assistant';
8
- import { Operation } from '@dxos/compute';
9
- import { Database } from '@dxos/echo';
10
- import { trim } from '@dxos/util';
9
+ ### CORE USAGE PRINCIPLES
11
10
 
12
- import { Plan } from '../../../types';
11
+ Create and manage tasks for: multi-step objectives requiring 3+ distinct actions, complex projects needing careful sequencing,
12
+ user requests for task organization, multiple deliverables provided together, new instructions (capture as tasks immediately with new IDs),
13
+ completed work (mark `done` and add follow-ups), and active work (mark as `in-progress`, limit one at a time).
13
14
 
14
- const INSTRUCTIONS = trim`
15
- TASK MANAGEMENT TOOL - USAGE GUIDELINES
15
+ Skip task management for: single straightforward actions, simple requests achievable in 1-2 steps,
16
+ informational queries, quick lookups or clarifications, and avoid creating verification tasks unless requested.
16
17
 
17
- This tool maintains an organized task list during work sessions to track progress, break down objectives, and ensure thoroughness. After creating initial tasks, update them silently without announcing changes to the user.
18
+ ### TOOL SPECIFICATION
18
19
 
19
- === CORE USAGE PRINCIPLES ===
20
+ `update-tasks` requires an array of task objects. Each task object contains:
20
21
 
21
- Create and manage tasks for: multi-step objectives requiring 3+ distinct actions, complex projects needing careful sequencing, user requests for task organization, multiple deliverables provided together, new instructions (capture as tasks immediately with new IDs), completed work (mark done and add follow-ups), and active work (mark as 'in-progress', limit one at a time).
22
-
23
- Skip task management for: single straightforward actions, simple requests achievable in 1-2 steps, informational queries, quick lookups or clarifications, and avoid creating verification tasks unless requested.
24
-
25
- === TOOL SPECIFICATION ===
26
-
27
- update-tasks requires an array of task objects. Each task object contains:
28
22
  - id (string, required): unique identifier like "task_1" or "research_sources"
29
23
  - title (string, optional): update to clarify or refine task description
30
- - status (string, optional): 'todo' | 'in-progress' | 'done'
24
+ - status (string, optional): `todo` | `in-progress` | `done`
31
25
 
32
- Task status meanings: 'todo' means not yet started, 'in-progress' means currently being worked on, 'done' means completed successfully.
26
+ Task status meanings: 'todo' means not yet started, `in-progress` means currently being worked on, `done` means completed successfully.
33
27
 
34
- === OPERATIONAL GUIDELINES ===
28
+ ### OPERATIONAL GUIDELINES
35
29
 
36
- Update tasks in real-time as work progresses. Mark tasks 'done' immediately upon completion. Maintain only ONE task with 'in-progress' status at a time. Complete current tasks before starting new ones. Use specific, actionable task titles. Break complex work into manageable logical pieces. Batch task updates with other actions when possible for efficiency.
30
+ Update tasks in realtime as work progresses. Mark tasks `done` immediately upon completion.
31
+ Maintain only ONE task with `in-progress` status at a time. Complete current tasks before starting new ones.
32
+ Use specific, actionable task titles. Break complex work into manageable logical pieces.
33
+ Batch task updates with other actions when possible for efficiency.
37
34
 
38
- === USAGE EXAMPLES ===
35
+ ### USAGE EXAMPLES
39
36
 
40
37
  <example type="research_project">
41
38
  <user_message>I need to research sustainable packaging options and write a report comparing costs and environmental impact.</user_message>
@@ -110,28 +107,10 @@ Creates tasks:
110
107
  <reasoning>One-step action with immediate completion, no organizational benefit from tasks.</reasoning>
111
108
  </example>
112
109
 
113
- === BEST PRACTICES ===
114
-
115
- For task creation: use descriptive unique IDs reflecting the work, start first task as 'in-progress', batch initial creation with beginning work. For progress tracking: update status immediately upon completion, keep only one 'in-progress' task unless parallel work is natural, add follow-up tasks as they emerge. For task breakdown: aim for reasonably-scoped tasks, group related small actions into logical units, split tasks requiring different approaches.
116
-
117
- When uncertain whether to use task management, err on the side of creating tasks. Proactive organization demonstrates thoroughness and ensures comprehensive work completion.
118
- `;
119
-
120
- const TaskProps = Schema.Struct({
121
- id: Plan.TaskId,
122
- title: Schema.String,
123
- status: Schema.Literal('todo', 'in-progress', 'done'),
124
- });
125
-
126
- export const UpdateTasks = Operation.make({
127
- meta: {
128
- key: 'org.dxos.function.planning.update-tasks',
129
- name: 'Update tasks',
130
- description: INSTRUCTIONS,
131
- },
132
- input: Schema.Struct({
133
- tasks: Schema.Array(TaskProps),
134
- }),
135
- output: Schema.Any,
136
- services: [AiContextService, Database.Service],
137
- });
110
+ ### BEST PRACTICES
111
+
112
+ For task creation: use descriptive unique IDs reflecting the work, start first task as `in-progress`, batch initial creation with beginning work.
113
+ For progress tracking: update status immediately upon completion, keep only one `in-progress` task unless parallel work is natural, add follow-up tasks as they emerge. For task breakdown: aim for reasonably-scoped tasks, group related small actions into logical units, split tasks requiring different approaches.
114
+
115
+ When uncertain whether to use task management, err on the side of creating tasks.
116
+ Proactive organization demonstrates thoroughness and ensures comprehensive work completion.
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+
8
+ import { Blueprint, Operation } from '@dxos/compute';
9
+ import { Database, Feed, Obj } from '@dxos/echo';
10
+ import { TestHelpers } from '@dxos/effect/testing';
11
+ import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
12
+ import { invariant } from '@dxos/invariant';
13
+ import { ObjectId } from '@dxos/keys';
14
+
15
+ import { Agent, Chat, Plan } from '../../../types';
16
+ import PlanningBlueprint from '../blueprint';
17
+ import { PlanningHandlers } from './index';
18
+ import { UpdateTasks } from './update-tasks';
19
+
20
+ ObjectId.dangerouslyDisableRandomness();
21
+
22
+ const TestLayer = AssistantTestLayer({
23
+ operationHandlers: PlanningHandlers,
24
+ types: [Agent.Agent, Plan.Plan, Chat.Chat, Chat.CompanionTo, Blueprint.Blueprint, Feed.Feed],
25
+ blueprints: [PlanningBlueprint.make()],
26
+ disableLlmMemoization: true,
27
+ });
28
+
29
+ describe('UpdateTasks', () => {
30
+ it.scoped(
31
+ 'adds tasks to the plan',
32
+ Effect.fnUntraced(
33
+ function* ({ expect }) {
34
+ const agent = yield* Agent.makeInitialized(
35
+ { name: 'Planner', instructions: 'Test.' },
36
+ PlanningBlueprint.make(),
37
+ );
38
+ yield* Database.flush();
39
+
40
+ const chatFeed = agent.chat?.target?.feed?.target;
41
+ invariant(chatFeed, 'Agent chat feed not found.');
42
+
43
+ yield* Operation.invoke(UpdateTasks, {
44
+ tasks: [{ id: Plan.TaskId.make('task-1'), title: 'Hello', status: 'todo' }],
45
+ }).pipe(Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getDXN(chatFeed).toString() })));
46
+
47
+ const plan = yield* Database.load(agent.plan);
48
+ expect(plan.tasks).toHaveLength(1);
49
+ expect(plan.tasks[0]).toMatchObject({ id: 'task-1', title: 'Hello', status: 'todo' });
50
+ },
51
+ Effect.provide(TestLayer),
52
+ TestHelpers.provideTestContext,
53
+ ),
54
+ );
55
+ });
@@ -3,18 +3,40 @@
3
3
  //
4
4
 
5
5
  import * as Effect from 'effect/Effect';
6
+ import * as Schema from 'effect/Schema';
6
7
 
8
+ import { AiContext } from '@dxos/assistant';
7
9
  import { Operation } from '@dxos/compute';
8
10
  import { Database, Obj } from '@dxos/echo';
9
11
  import { trim } from '@dxos/util';
10
12
 
11
13
  import { Plan, Agent } from '../../../types';
12
- import { UpdateTasks } from './definitions';
14
+ import INSTRUCTIONS from './update-tasks.md?raw';
13
15
 
16
+ const SimpleTask = Plan.Task.omit('chat');
17
+
18
+ export const UpdateTasks = Operation.make({
19
+ meta: {
20
+ key: 'org.dxos.function.planning.update-tasks', // TODO(burdon): Are hyphens allowed?
21
+ name: 'Update tasks',
22
+ description: INSTRUCTIONS,
23
+ },
24
+ input: Schema.Struct({
25
+ tasks: Schema.Array(SimpleTask),
26
+ }),
27
+ output: Schema.Any,
28
+ services: [AiContext.Service, Database.Service],
29
+ });
30
+
31
+ /**
32
+ * Updates the planning document (Agent.plan) with the given tasks.
33
+ */
14
34
  export default UpdateTasks.pipe(
15
35
  Operation.withHandler(
16
36
  Effect.fn(function* ({ tasks: newTasks }) {
17
37
  const agent = yield* Agent.getFromChatContext;
38
+ // TODO(burdon): How to specify requirements/preconditions before calling?
39
+ // TODO(burdon): How to report non-technical error?
18
40
  const plan = yield* Database.load(agent.plan);
19
41
 
20
42
  Obj.update(plan, (plan) => {
@@ -34,8 +56,8 @@ export default UpdateTasks.pipe(
34
56
  });
35
57
 
36
58
  return trim`
37
- Tasks updated. Don't forget to mark tasks as done when you're done with them or update their status to 'in-progress' when you start working on them.
38
- Current plan:
59
+ You must update the task status to 'in-progress' when you start and 'done' when complete.
60
+ Current plan updated:
39
61
  <plan>
40
62
  ${Plan.formatPlan(plan)}
41
63
  </plan>