@dxos/assistant-toolkit 0.10.0 → 0.11.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.
Files changed (397) hide show
  1. package/dist/lib/chunk-Chat.mjs +144 -0
  2. package/dist/lib/chunk-Chat.mjs.map +1 -0
  3. package/dist/lib/chunk-Memory.mjs +19 -0
  4. package/dist/lib/chunk-Memory.mjs.map +1 -0
  5. package/dist/lib/{neutral/agent-rules-KWCBKJ5W.mjs → chunk-agent-rules.mjs} +8 -15
  6. package/dist/lib/chunk-agent-rules.mjs.map +1 -0
  7. package/dist/lib/chunk-agent.mjs +45 -0
  8. package/dist/lib/chunk-agent.mjs.map +1 -0
  9. package/dist/lib/chunk-artifact-add.mjs +31 -0
  10. package/dist/lib/chunk-artifact-add.mjs.map +1 -0
  11. package/dist/lib/chunk-artifact-list.mjs +23 -0
  12. package/dist/lib/chunk-artifact-list.mjs.map +1 -0
  13. package/dist/lib/chunk-context-add.mjs +16 -0
  14. package/dist/lib/chunk-context-add.mjs.map +1 -0
  15. package/dist/lib/chunk-context-remove.mjs +16 -0
  16. package/dist/lib/chunk-context-remove.mjs.map +1 -0
  17. package/dist/lib/chunk-create-agent.mjs +23 -0
  18. package/dist/lib/chunk-create-agent.mjs.map +1 -0
  19. package/dist/lib/chunk-definitions.mjs +52 -0
  20. package/dist/lib/chunk-definitions.mjs.map +1 -0
  21. package/dist/lib/chunk-definitions2.mjs +56 -0
  22. package/dist/lib/chunk-definitions2.mjs.map +1 -0
  23. package/dist/lib/chunk-definitions3.mjs +24 -0
  24. package/dist/lib/chunk-definitions3.mjs.map +1 -0
  25. package/dist/lib/chunk-delete.mjs +14 -0
  26. package/dist/lib/chunk-delete.mjs.map +1 -0
  27. package/dist/lib/chunk-enable-skills.mjs +39 -0
  28. package/dist/lib/chunk-enable-skills.mjs.map +1 -0
  29. package/dist/lib/chunk-fetch-messages.mjs +113 -0
  30. package/dist/lib/chunk-fetch-messages.mjs.map +1 -0
  31. package/dist/lib/chunk-fetch.mjs +20 -0
  32. package/dist/lib/chunk-fetch.mjs.map +1 -0
  33. package/dist/lib/chunk-get-context.mjs +55 -0
  34. package/dist/lib/chunk-get-context.mjs.map +1 -0
  35. package/dist/lib/chunk-get-current-date.mjs +17 -0
  36. package/dist/lib/chunk-get-current-date.mjs.map +1 -0
  37. package/dist/lib/chunk-load.mjs +13 -0
  38. package/dist/lib/chunk-load.mjs.map +1 -0
  39. package/dist/lib/chunk-object-create.mjs +42 -0
  40. package/dist/lib/chunk-object-create.mjs.map +1 -0
  41. package/dist/lib/chunk-object-delete.mjs +14 -0
  42. package/dist/lib/chunk-object-delete.mjs.map +1 -0
  43. package/dist/lib/chunk-object-update.mjs +19 -0
  44. package/dist/lib/chunk-object-update.mjs.map +1 -0
  45. package/dist/lib/chunk-operations.mjs +714 -0
  46. package/dist/lib/chunk-operations.mjs.map +1 -0
  47. package/dist/lib/chunk-plan-reminder.mjs +80 -0
  48. package/dist/lib/chunk-plan-reminder.mjs.map +1 -0
  49. package/dist/lib/chunk-query-skills.mjs +12 -0
  50. package/dist/lib/chunk-query-skills.mjs.map +1 -0
  51. package/dist/lib/chunk-query.mjs +36 -0
  52. package/dist/lib/chunk-query.mjs.map +1 -0
  53. package/dist/lib/chunk-query2.mjs +18 -0
  54. package/dist/lib/chunk-query2.mjs.map +1 -0
  55. package/dist/lib/chunk-relation-create.mjs +41 -0
  56. package/dist/lib/chunk-relation-create.mjs.map +1 -0
  57. package/dist/lib/chunk-relation-delete.mjs +14 -0
  58. package/dist/lib/chunk-relation-delete.mjs.map +1 -0
  59. package/dist/lib/chunk-relay.mjs +76 -0
  60. package/dist/lib/chunk-relay.mjs.map +1 -0
  61. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  62. package/dist/lib/chunk-run-instructions.mjs +145 -0
  63. package/dist/lib/chunk-run-instructions.mjs.map +1 -0
  64. package/dist/lib/chunk-save.mjs +17 -0
  65. package/dist/lib/chunk-save.mjs.map +1 -0
  66. package/dist/lib/chunk-schema-add.mjs +19 -0
  67. package/dist/lib/chunk-schema-add.mjs.map +1 -0
  68. package/dist/lib/chunk-schema-list.mjs +29 -0
  69. package/dist/lib/chunk-schema-list.mjs.map +1 -0
  70. package/dist/lib/chunk-set-alarm.mjs +55 -0
  71. package/dist/lib/chunk-set-alarm.mjs.map +1 -0
  72. package/dist/lib/chunk-sync-automation.mjs +130 -0
  73. package/dist/lib/chunk-sync-automation.mjs.map +1 -0
  74. package/dist/lib/chunk-sync-issues.mjs +127 -0
  75. package/dist/lib/chunk-sync-issues.mjs.map +1 -0
  76. package/dist/lib/chunk-sync.mjs +91 -0
  77. package/dist/lib/chunk-sync.mjs.map +1 -0
  78. package/dist/lib/chunk-tag-add.mjs +14 -0
  79. package/dist/lib/chunk-tag-add.mjs.map +1 -0
  80. package/dist/lib/chunk-tag-remove.mjs +14 -0
  81. package/dist/lib/chunk-tag-remove.mjs.map +1 -0
  82. package/dist/lib/chunk-types.mjs +198 -0
  83. package/dist/lib/chunk-types.mjs.map +1 -0
  84. package/dist/lib/chunk-update-tasks.mjs +34 -0
  85. package/dist/lib/chunk-update-tasks.mjs.map +1 -0
  86. package/dist/lib/index.mjs +614 -0
  87. package/dist/lib/index.mjs.map +1 -0
  88. package/dist/lib/testing.mjs +102 -0
  89. package/dist/lib/testing.mjs.map +1 -0
  90. package/dist/types/src/skills/agent/operations/definitions.d.ts +16 -46
  91. package/dist/types/src/skills/agent/operations/definitions.d.ts.map +1 -1
  92. package/dist/types/src/skills/agent/operations/get-context.test.d.ts +2 -0
  93. package/dist/types/src/skills/agent/operations/get-context.test.d.ts.map +1 -0
  94. package/dist/types/src/skills/agent/operations/index.d.ts.map +1 -1
  95. package/dist/types/src/skills/agent/operations/relay.d.ts +11 -0
  96. package/dist/types/src/skills/agent/operations/relay.d.ts.map +1 -0
  97. package/dist/types/src/skills/agent/operations/relay.test.d.ts +2 -0
  98. package/dist/types/src/skills/agent/operations/relay.test.d.ts.map +1 -0
  99. package/dist/types/src/skills/agent/skill.d.ts.map +1 -1
  100. package/dist/types/src/skills/agent-wizard/operations/definitions.d.ts +4 -1
  101. package/dist/types/src/skills/agent-wizard/operations/definitions.d.ts.map +1 -1
  102. package/dist/types/src/skills/agent-wizard/operations/sync-automation.d.ts +26 -0
  103. package/dist/types/src/skills/agent-wizard/operations/sync-automation.d.ts.map +1 -0
  104. package/dist/types/src/skills/agent-wizard/operations/sync-automation.test.d.ts +2 -0
  105. package/dist/types/src/skills/agent-wizard/operations/sync-automation.test.d.ts.map +1 -0
  106. package/dist/types/src/skills/agent-wizard/skill.d.ts.map +1 -1
  107. package/dist/types/src/skills/database/operations/context-add.test.d.ts +2 -0
  108. package/dist/types/src/skills/database/operations/context-add.test.d.ts.map +1 -0
  109. package/dist/types/src/skills/database/operations/context-remove.test.d.ts +2 -0
  110. package/dist/types/src/skills/database/operations/context-remove.test.d.ts.map +1 -0
  111. package/dist/types/src/skills/database/operations/definitions.d.ts +7 -2
  112. package/dist/types/src/skills/database/operations/definitions.d.ts.map +1 -1
  113. package/dist/types/src/skills/database/operations/load.test.d.ts +2 -0
  114. package/dist/types/src/skills/database/operations/load.test.d.ts.map +1 -0
  115. package/dist/types/src/skills/database/operations/object-create.d.ts +4 -1
  116. package/dist/types/src/skills/database/operations/object-create.d.ts.map +1 -1
  117. package/dist/types/src/skills/database/operations/object-create.test.d.ts +2 -0
  118. package/dist/types/src/skills/database/operations/object-create.test.d.ts.map +1 -0
  119. package/dist/types/src/skills/database/operations/object-delete.test.d.ts +2 -0
  120. package/dist/types/src/skills/database/operations/object-delete.test.d.ts.map +1 -0
  121. package/dist/types/src/skills/database/operations/object-update.test.d.ts +2 -0
  122. package/dist/types/src/skills/database/operations/object-update.test.d.ts.map +1 -0
  123. package/dist/types/src/skills/database/operations/query.test.d.ts +2 -0
  124. package/dist/types/src/skills/database/operations/query.test.d.ts.map +1 -0
  125. package/dist/types/src/skills/database/operations/relation-create.test.d.ts +2 -0
  126. package/dist/types/src/skills/database/operations/relation-create.test.d.ts.map +1 -0
  127. package/dist/types/src/skills/database/operations/schema-add.d.ts +3 -1
  128. package/dist/types/src/skills/database/operations/schema-add.test.d.ts +2 -0
  129. package/dist/types/src/skills/database/operations/schema-add.test.d.ts.map +1 -0
  130. package/dist/types/src/skills/database/operations/schema-list.test.d.ts +2 -0
  131. package/dist/types/src/skills/database/operations/schema-list.test.d.ts.map +1 -0
  132. package/dist/types/src/skills/database/operations/tag-add.test.d.ts +2 -0
  133. package/dist/types/src/skills/database/operations/tag-add.test.d.ts.map +1 -0
  134. package/dist/types/src/skills/database/operations/tag-remove.test.d.ts +2 -0
  135. package/dist/types/src/skills/database/operations/tag-remove.test.d.ts.map +1 -0
  136. package/dist/types/src/skills/delegation/operations/delegate-task.d.ts +6 -5
  137. package/dist/types/src/skills/delegation/operations/delegate-task.d.ts.map +1 -1
  138. package/dist/types/src/skills/index.d.ts +1 -0
  139. package/dist/types/src/skills/index.d.ts.map +1 -1
  140. package/dist/types/src/skills/linear/operations/sync-issues.d.ts.map +1 -1
  141. package/dist/types/src/skills/memory/operations/delete.test.d.ts +2 -0
  142. package/dist/types/src/skills/memory/operations/delete.test.d.ts.map +1 -0
  143. package/dist/types/src/skills/memory/operations/query.test.d.ts +2 -0
  144. package/dist/types/src/skills/memory/operations/query.test.d.ts.map +1 -0
  145. package/dist/types/src/skills/memory/operations/save.test.d.ts +2 -0
  146. package/dist/types/src/skills/memory/operations/save.test.d.ts.map +1 -0
  147. package/dist/types/src/skills/planning/operations/definitions.d.ts +1 -3
  148. package/dist/types/src/skills/planning/operations/definitions.d.ts.map +1 -1
  149. package/dist/types/src/skills/planning/operations/plan-reminder.d.ts +7 -6
  150. package/dist/types/src/skills/planning/operations/plan-reminder.d.ts.map +1 -1
  151. package/dist/types/src/skills/planning/operations/plan-reminder.test.d.ts +2 -0
  152. package/dist/types/src/skills/planning/operations/plan-reminder.test.d.ts.map +1 -0
  153. package/dist/types/src/skills/planning/operations/update-tasks.d.ts +3 -1
  154. package/dist/types/src/skills/planning/operations/update-tasks.d.ts.map +1 -1
  155. package/dist/types/src/skills/project/index.d.ts +3 -0
  156. package/dist/types/src/skills/project/index.d.ts.map +1 -0
  157. package/dist/types/src/skills/project/operations/artifact-add.d.ts +5 -0
  158. package/dist/types/src/skills/project/operations/artifact-add.d.ts.map +1 -0
  159. package/dist/types/src/skills/project/operations/artifact-list.d.ts +5 -0
  160. package/dist/types/src/skills/project/operations/artifact-list.d.ts.map +1 -0
  161. package/dist/types/src/skills/project/operations/definitions.d.ts +23 -0
  162. package/dist/types/src/skills/project/operations/definitions.d.ts.map +1 -0
  163. package/dist/types/src/skills/project/operations/index.d.ts +4 -0
  164. package/dist/types/src/skills/project/operations/index.d.ts.map +1 -0
  165. package/dist/types/src/skills/project/skill.d.ts +4 -0
  166. package/dist/types/src/skills/project/skill.d.ts.map +1 -0
  167. package/dist/types/src/skills/project/skill.test.d.ts.map +1 -0
  168. package/dist/types/src/skills/skill-manager/skill.d.ts.map +1 -1
  169. package/dist/types/src/supervisor/delegation-strategy.d.ts +5 -5
  170. package/dist/types/src/supervisor/delegation-strategy.d.ts.map +1 -1
  171. package/dist/types/src/supervisor/delegation-strategy.test.d.ts +2 -0
  172. package/dist/types/src/supervisor/delegation-strategy.test.d.ts.map +1 -0
  173. package/dist/types/src/sync/sync.test.d.ts +2 -0
  174. package/dist/types/src/sync/sync.test.d.ts.map +1 -0
  175. package/dist/types/src/testing/index.d.ts +1 -0
  176. package/dist/types/src/testing/index.d.ts.map +1 -1
  177. package/dist/types/src/testing/operations.d.ts +7 -0
  178. package/dist/types/src/testing/operations.d.ts.map +1 -0
  179. package/dist/types/src/types/Agent.d.ts +28 -31
  180. package/dist/types/src/types/Agent.d.ts.map +1 -1
  181. package/dist/types/src/types/Chat.d.ts +28 -14
  182. package/dist/types/src/types/Chat.d.ts.map +1 -1
  183. package/dist/types/src/types/Chat.test.d.ts +2 -0
  184. package/dist/types/src/types/Chat.test.d.ts.map +1 -0
  185. package/dist/types/src/types/index.d.ts +1 -2
  186. package/dist/types/src/types/index.d.ts.map +1 -1
  187. package/dist/types/tsconfig.tsbuildinfo +1 -1
  188. package/package.json +30 -29
  189. package/src/operations/run-instructions.test.ts +26 -34
  190. package/src/operations/skill-resolution.test.ts +6 -1
  191. package/src/skills/agent/operations/definitions.ts +18 -62
  192. package/src/skills/agent/operations/get-context.test.ts +81 -0
  193. package/src/skills/agent/operations/get-context.ts +9 -36
  194. package/src/skills/agent/operations/index.ts +1 -3
  195. package/src/skills/agent/operations/relay.test.ts +63 -0
  196. package/src/skills/agent/operations/relay.ts +124 -0
  197. package/src/skills/agent/skill.ts +3 -15
  198. package/src/skills/agent-wizard/operations/create-agent.ts +3 -3
  199. package/src/skills/agent-wizard/operations/definitions.ts +19 -4
  200. package/src/skills/agent-wizard/operations/index.ts +1 -1
  201. package/src/skills/agent-wizard/operations/sync-automation.test.ts +103 -0
  202. package/src/skills/agent-wizard/operations/sync-automation.ts +205 -0
  203. package/src/skills/agent-wizard/skill.ts +9 -10
  204. package/src/skills/alarm/skill.test.ts +2 -2
  205. package/src/skills/browser/skill.test.ts +4 -4
  206. package/src/skills/database/operations/context-add.test.ts +46 -0
  207. package/src/skills/database/operations/context-remove.test.ts +46 -0
  208. package/src/skills/database/operations/definitions.ts +23 -7
  209. package/src/skills/database/operations/load.test.ts +38 -0
  210. package/src/skills/database/operations/object-create.test.ts +116 -0
  211. package/src/skills/database/operations/object-create.ts +13 -2
  212. package/src/skills/database/operations/object-delete.test.ts +37 -0
  213. package/src/skills/database/operations/object-update.test.ts +39 -0
  214. package/src/skills/database/operations/query.test.ts +128 -0
  215. package/src/skills/database/operations/relation-create.test.ts +46 -0
  216. package/src/skills/database/operations/schema-add.test.ts +79 -0
  217. package/src/skills/database/operations/schema-list.test.ts +42 -0
  218. package/src/skills/database/operations/tag-add.test.ts +41 -0
  219. package/src/skills/database/operations/tag-remove.test.ts +43 -0
  220. package/src/skills/delegation/operations/delegate-task.test.ts +51 -36
  221. package/src/skills/delegation/operations/delegate-task.ts +31 -48
  222. package/src/skills/discord/operations/fetch-messages.test.ts +2 -2
  223. package/src/skills/github/operations/fetch-prs.ts +1 -1
  224. package/src/skills/index.ts +1 -0
  225. package/src/skills/linear/operations/linear.test.ts +1 -1
  226. package/src/skills/linear/operations/sync-issues.ts +6 -23
  227. package/src/skills/memory/operations/delete.test.ts +37 -0
  228. package/src/skills/memory/operations/query.test.ts +76 -0
  229. package/src/skills/memory/operations/save.test.ts +43 -0
  230. package/src/skills/planning/operations/definitions.ts +9 -6
  231. package/src/skills/planning/operations/plan-reminder.test.ts +123 -0
  232. package/src/skills/planning/operations/plan-reminder.ts +49 -31
  233. package/src/skills/planning/operations/update-tasks.md +23 -22
  234. package/src/skills/planning/operations/update-tasks.test.ts +31 -17
  235. package/src/skills/planning/operations/update-tasks.ts +17 -25
  236. package/src/skills/project/index.ts +6 -0
  237. package/src/skills/project/operations/artifact-add.ts +47 -0
  238. package/src/skills/project/operations/artifact-list.ts +41 -0
  239. package/src/skills/project/operations/definitions.ts +63 -0
  240. package/src/skills/project/operations/index.ts +12 -0
  241. package/src/skills/project/skill.test.ts +78 -0
  242. package/src/skills/project/skill.ts +42 -0
  243. package/src/skills/skill-manager/operations/definitions.ts +1 -1
  244. package/src/skills/skill-manager/skill.test.ts +1 -1
  245. package/src/skills/skill-manager/skill.ts +7 -5
  246. package/src/skills/websearch/skill.test.ts +2 -2
  247. package/src/supervisor/delegation-strategy.test.ts +129 -0
  248. package/src/supervisor/delegation-strategy.ts +92 -56
  249. package/src/sync/sync.test.ts +95 -0
  250. package/src/sync/sync.ts +5 -3
  251. package/src/testing/index.ts +1 -0
  252. package/src/testing/operations.ts +65 -0
  253. package/src/types/Agent.test.ts +36 -66
  254. package/src/types/Agent.ts +108 -137
  255. package/src/types/Chat.test.ts +234 -0
  256. package/src/types/Chat.ts +80 -26
  257. package/src/types/index.ts +1 -2
  258. package/dist/lib/neutral/add-artifact-5JNUYLCA.mjs +0 -24
  259. package/dist/lib/neutral/add-artifact-5JNUYLCA.mjs.map +0 -7
  260. package/dist/lib/neutral/agent-BFAYIBJI.mjs +0 -65
  261. package/dist/lib/neutral/agent-BFAYIBJI.mjs.map +0 -7
  262. package/dist/lib/neutral/agent-rules-KWCBKJ5W.mjs.map +0 -7
  263. package/dist/lib/neutral/chunk-3KA66YBF.mjs +0 -62
  264. package/dist/lib/neutral/chunk-3KA66YBF.mjs.map +0 -7
  265. package/dist/lib/neutral/chunk-6SGNFL6I.mjs +0 -85
  266. package/dist/lib/neutral/chunk-6SGNFL6I.mjs.map +0 -7
  267. package/dist/lib/neutral/chunk-BDTGFPM7.mjs +0 -113
  268. package/dist/lib/neutral/chunk-BDTGFPM7.mjs.map +0 -7
  269. package/dist/lib/neutral/chunk-EPQCDGIV.mjs +0 -27
  270. package/dist/lib/neutral/chunk-EPQCDGIV.mjs.map +0 -7
  271. package/dist/lib/neutral/chunk-H4W22FFJ.mjs +0 -232
  272. package/dist/lib/neutral/chunk-H4W22FFJ.mjs.map +0 -7
  273. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  274. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  275. package/dist/lib/neutral/chunk-JBTXZQ5G.mjs +0 -60
  276. package/dist/lib/neutral/chunk-JBTXZQ5G.mjs.map +0 -7
  277. package/dist/lib/neutral/chunk-JKOOA5OS.mjs +0 -97
  278. package/dist/lib/neutral/chunk-JKOOA5OS.mjs.map +0 -7
  279. package/dist/lib/neutral/chunk-JTEBE7KA.mjs +0 -66
  280. package/dist/lib/neutral/chunk-JTEBE7KA.mjs.map +0 -7
  281. package/dist/lib/neutral/chunk-KLFXJ2Z3.mjs +0 -36
  282. package/dist/lib/neutral/chunk-KLFXJ2Z3.mjs.map +0 -7
  283. package/dist/lib/neutral/chunk-LBA5UOLF.mjs +0 -87
  284. package/dist/lib/neutral/chunk-LBA5UOLF.mjs.map +0 -7
  285. package/dist/lib/neutral/chunk-LL3MOQUZ.mjs +0 -120
  286. package/dist/lib/neutral/chunk-LL3MOQUZ.mjs.map +0 -7
  287. package/dist/lib/neutral/chunk-MFVIGJBW.mjs +0 -68
  288. package/dist/lib/neutral/chunk-MFVIGJBW.mjs.map +0 -7
  289. package/dist/lib/neutral/chunk-PBARVBNJ.mjs +0 -86
  290. package/dist/lib/neutral/chunk-PBARVBNJ.mjs.map +0 -7
  291. package/dist/lib/neutral/chunk-VJ5QBYM5.mjs +0 -61
  292. package/dist/lib/neutral/chunk-VJ5QBYM5.mjs.map +0 -7
  293. package/dist/lib/neutral/chunk-YQSQRSXG.mjs +0 -367
  294. package/dist/lib/neutral/chunk-YQSQRSXG.mjs.map +0 -7
  295. package/dist/lib/neutral/chunk-Z2HFOZXK.mjs +0 -191
  296. package/dist/lib/neutral/chunk-Z2HFOZXK.mjs.map +0 -7
  297. package/dist/lib/neutral/context-add-DZTPB3FK.mjs +0 -22
  298. package/dist/lib/neutral/context-add-DZTPB3FK.mjs.map +0 -7
  299. package/dist/lib/neutral/context-remove-XSBOM4VJ.mjs +0 -22
  300. package/dist/lib/neutral/context-remove-XSBOM4VJ.mjs.map +0 -7
  301. package/dist/lib/neutral/create-agent-5WTOFIEK.mjs +0 -35
  302. package/dist/lib/neutral/create-agent-5WTOFIEK.mjs.map +0 -7
  303. package/dist/lib/neutral/definitions-VRR5OGXI.mjs +0 -17
  304. package/dist/lib/neutral/definitions-VRR5OGXI.mjs.map +0 -7
  305. package/dist/lib/neutral/delegate-task-UX64NK4M.mjs +0 -13
  306. package/dist/lib/neutral/delegate-task-UX64NK4M.mjs.map +0 -7
  307. package/dist/lib/neutral/delete-IU7HPU3K.mjs +0 -19
  308. package/dist/lib/neutral/delete-IU7HPU3K.mjs.map +0 -7
  309. package/dist/lib/neutral/enable-skills-FHEJXQVB.mjs +0 -47
  310. package/dist/lib/neutral/enable-skills-FHEJXQVB.mjs.map +0 -7
  311. package/dist/lib/neutral/fetch-5LY25EBR.mjs +0 -24
  312. package/dist/lib/neutral/fetch-5LY25EBR.mjs.map +0 -7
  313. package/dist/lib/neutral/fetch-messages-CQMDI36G.mjs +0 -139
  314. package/dist/lib/neutral/fetch-messages-CQMDI36G.mjs.map +0 -7
  315. package/dist/lib/neutral/get-context-Q4YY6DRV.mjs +0 -77
  316. package/dist/lib/neutral/get-context-Q4YY6DRV.mjs.map +0 -7
  317. package/dist/lib/neutral/get-current-date-JR5F7ZS3.mjs +0 -17
  318. package/dist/lib/neutral/get-current-date-JR5F7ZS3.mjs.map +0 -7
  319. package/dist/lib/neutral/index.mjs +0 -875
  320. package/dist/lib/neutral/index.mjs.map +0 -7
  321. package/dist/lib/neutral/load-S6HC5TGX.mjs +0 -17
  322. package/dist/lib/neutral/load-S6HC5TGX.mjs.map +0 -7
  323. package/dist/lib/neutral/meta.json +0 -1
  324. package/dist/lib/neutral/object-create-PVDQ62CG.mjs +0 -32
  325. package/dist/lib/neutral/object-create-PVDQ62CG.mjs.map +0 -7
  326. package/dist/lib/neutral/object-delete-3CSL6XI6.mjs +0 -18
  327. package/dist/lib/neutral/object-delete-3CSL6XI6.mjs.map +0 -7
  328. package/dist/lib/neutral/object-update-NIGMZINM.mjs +0 -28
  329. package/dist/lib/neutral/object-update-NIGMZINM.mjs.map +0 -7
  330. package/dist/lib/neutral/plan-reminder-N4X6JPBI.mjs +0 -88
  331. package/dist/lib/neutral/plan-reminder-N4X6JPBI.mjs.map +0 -7
  332. package/dist/lib/neutral/qualifier-5CIRZYX5.mjs +0 -91
  333. package/dist/lib/neutral/qualifier-5CIRZYX5.mjs.map +0 -7
  334. package/dist/lib/neutral/query-K4R7UHLU.mjs +0 -32
  335. package/dist/lib/neutral/query-K4R7UHLU.mjs.map +0 -7
  336. package/dist/lib/neutral/query-NCTCRYTD.mjs +0 -59
  337. package/dist/lib/neutral/query-NCTCRYTD.mjs.map +0 -7
  338. package/dist/lib/neutral/query-skills-7GQFSU4V.mjs +0 -17
  339. package/dist/lib/neutral/query-skills-7GQFSU4V.mjs.map +0 -7
  340. package/dist/lib/neutral/relation-create-QKXHTL7G.mjs +0 -34
  341. package/dist/lib/neutral/relation-create-QKXHTL7G.mjs.map +0 -7
  342. package/dist/lib/neutral/relation-delete-PDIWT2JX.mjs +0 -18
  343. package/dist/lib/neutral/relation-delete-PDIWT2JX.mjs.map +0 -7
  344. package/dist/lib/neutral/run-instructions-72ASH5EZ.mjs +0 -165
  345. package/dist/lib/neutral/run-instructions-72ASH5EZ.mjs.map +0 -7
  346. package/dist/lib/neutral/save-UYVRA4RS.mjs +0 -23
  347. package/dist/lib/neutral/save-UYVRA4RS.mjs.map +0 -7
  348. package/dist/lib/neutral/schema-add-5NOK2RWE.mjs +0 -25
  349. package/dist/lib/neutral/schema-add-5NOK2RWE.mjs.map +0 -7
  350. package/dist/lib/neutral/schema-list-BZUR5KMX.mjs +0 -37
  351. package/dist/lib/neutral/schema-list-BZUR5KMX.mjs.map +0 -7
  352. package/dist/lib/neutral/set-alarm-BD3NEYSU.mjs +0 -65
  353. package/dist/lib/neutral/set-alarm-BD3NEYSU.mjs.map +0 -7
  354. package/dist/lib/neutral/sync-issues-O76MCMD3.mjs +0 -166
  355. package/dist/lib/neutral/sync-issues-O76MCMD3.mjs.map +0 -7
  356. package/dist/lib/neutral/sync-triggers-YBTLPCUB.mjs +0 -138
  357. package/dist/lib/neutral/sync-triggers-YBTLPCUB.mjs.map +0 -7
  358. package/dist/lib/neutral/tag-add-L5WNOBYY.mjs +0 -18
  359. package/dist/lib/neutral/tag-add-L5WNOBYY.mjs.map +0 -7
  360. package/dist/lib/neutral/tag-remove-WV5RPE5W.mjs +0 -18
  361. package/dist/lib/neutral/tag-remove-WV5RPE5W.mjs.map +0 -7
  362. package/dist/lib/neutral/testing/index.mjs +0 -65
  363. package/dist/lib/neutral/testing/index.mjs.map +0 -7
  364. package/dist/lib/neutral/update-tasks-HX4ILWOU.mjs +0 -46
  365. package/dist/lib/neutral/update-tasks-HX4ILWOU.mjs.map +0 -7
  366. package/dist/types/src/skills/agent/operations/add-artifact.d.ts +0 -4
  367. package/dist/types/src/skills/agent/operations/add-artifact.d.ts.map +0 -1
  368. package/dist/types/src/skills/agent/operations/agent.d.ts +0 -4
  369. package/dist/types/src/skills/agent/operations/agent.d.ts.map +0 -1
  370. package/dist/types/src/skills/agent/operations/qualifier.d.ts +0 -5
  371. package/dist/types/src/skills/agent/operations/qualifier.d.ts.map +0 -1
  372. package/dist/types/src/skills/agent/skill.test.d.ts.map +0 -1
  373. package/dist/types/src/skills/agent-wizard/operations/sync-triggers.d.ts +0 -8
  374. package/dist/types/src/skills/agent-wizard/operations/sync-triggers.d.ts.map +0 -1
  375. package/dist/types/src/skills/database/skill.test.d.ts +0 -2
  376. package/dist/types/src/skills/database/skill.test.d.ts.map +0 -1
  377. package/dist/types/src/skills/memory/skill.test.d.ts +0 -2
  378. package/dist/types/src/skills/memory/skill.test.d.ts.map +0 -1
  379. package/dist/types/src/skills/planning/skill.test.d.ts +0 -2
  380. package/dist/types/src/skills/planning/skill.test.d.ts.map +0 -1
  381. package/dist/types/src/types/Plan.d.ts +0 -80
  382. package/dist/types/src/types/Plan.d.ts.map +0 -1
  383. package/src/operations/run-instructions.conversations.json +0 -1
  384. package/src/skills/agent/operations/add-artifact.ts +0 -20
  385. package/src/skills/agent/operations/agent.ts +0 -69
  386. package/src/skills/agent/operations/qualifier.ts +0 -97
  387. package/src/skills/agent/skill.conversations.json +0 -1
  388. package/src/skills/agent/skill.test.ts +0 -728
  389. package/src/skills/agent-wizard/operations/sync-triggers.ts +0 -169
  390. package/src/skills/database/skill.conversations.json +0 -1
  391. package/src/skills/database/skill.test.ts +0 -531
  392. package/src/skills/memory/skill.conversations.json +0 -1
  393. package/src/skills/memory/skill.test.ts +0 -138
  394. package/src/skills/planning/skill.conversations.json +0 -1
  395. package/src/skills/planning/skill.test.ts +0 -123
  396. package/src/types/Plan.ts +0 -123
  397. /package/dist/types/src/skills/{agent → project}/skill.test.d.ts +0 -0
@@ -0,0 +1,76 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Schema from 'effect/Schema';
8
+
9
+ import { Operation } from '@dxos/compute';
10
+ import { Database, Obj } from '@dxos/echo';
11
+ import { TestHelpers } from '@dxos/effect/testing';
12
+ import { EntityId } from '@dxos/keys';
13
+
14
+ import { OperationTestLayer } from '../../../testing';
15
+ import { Memory } from '../../../types/Memory';
16
+ import { QueryMemories } from './definitions';
17
+
18
+ EntityId.dangerouslyDisableRandomness();
19
+
20
+ describe('QueryMemories', () => {
21
+ it.effect(
22
+ 'lists every memory when no text is given',
23
+ Effect.fnUntraced(
24
+ function* (_) {
25
+ yield* seed();
26
+
27
+ const results = yield* Operation.invoke(QueryMemories, {});
28
+
29
+ expect((yield* titles(results)).sort()).toEqual(['Favourite colour', 'Favourite language']);
30
+ },
31
+ Effect.provide(OperationTestLayer),
32
+ TestHelpers.provideTestContext,
33
+ ),
34
+ );
35
+
36
+ it.effect(
37
+ 'narrows to the memories matching the search text',
38
+ Effect.fnUntraced(
39
+ function* (_) {
40
+ yield* seed();
41
+
42
+ const results = yield* Operation.invoke(QueryMemories, { text: 'colour' });
43
+
44
+ expect(yield* titles(results)).toEqual(['Favourite colour']);
45
+ },
46
+ Effect.provide(OperationTestLayer),
47
+ TestHelpers.provideTestContext,
48
+ ),
49
+ );
50
+
51
+ it.effect(
52
+ 'caps the result count at the given limit',
53
+ Effect.fnUntraced(
54
+ function* (_) {
55
+ yield* seed();
56
+
57
+ const results = yield* Operation.invoke(QueryMemories, { limit: 1 });
58
+
59
+ expect(results).toHaveLength(1);
60
+ },
61
+ Effect.provide(OperationTestLayer),
62
+ TestHelpers.provideTestContext,
63
+ ),
64
+ );
65
+ });
66
+
67
+ const titles = (results: readonly unknown[]) =>
68
+ Schema.decodeUnknown(Schema.Array(Schema.Struct({ title: Schema.String })))(results).pipe(
69
+ Effect.map((rows) => rows.map((row) => row.title)),
70
+ );
71
+
72
+ const seed = Effect.fnUntraced(function* () {
73
+ yield* Database.add(Obj.make(Memory, { title: 'Favourite colour', content: 'The colour blue.' }));
74
+ yield* Database.add(Obj.make(Memory, { title: 'Favourite language', content: 'TypeScript.' }));
75
+ yield* Database.flush();
76
+ });
@@ -0,0 +1,43 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Schema from 'effect/Schema';
8
+
9
+ import { Operation } from '@dxos/compute';
10
+ import { Database, Filter, Query } from '@dxos/echo';
11
+ import { TestHelpers } from '@dxos/effect/testing';
12
+ import { EntityId } from '@dxos/keys';
13
+
14
+ import { OperationTestLayer } from '../../../testing';
15
+ import { Memory } from '../../../types/Memory';
16
+ import { SaveMemory } from './definitions';
17
+
18
+ EntityId.dangerouslyDisableRandomness();
19
+
20
+ describe('SaveMemory', () => {
21
+ it.effect(
22
+ 'persists a memory with the given title and content',
23
+ Effect.fnUntraced(
24
+ function* (_) {
25
+ const saved = yield* Operation.invoke(SaveMemory, {
26
+ title: 'Favourite language',
27
+ content: 'TypeScript',
28
+ });
29
+
30
+ const memories = yield* Database.query(Query.select(Filter.type(Memory))).run;
31
+ expect(memories).toHaveLength(1);
32
+ expect(memories[0].title).toBe('Favourite language');
33
+ expect(memories[0].content).toBe('TypeScript');
34
+
35
+ // The handler returns the stored entity so the agent can reference it by id.
36
+ const { id } = yield* Schema.decodeUnknown(Schema.Struct({ id: Schema.String }))(saved);
37
+ expect(id).toBe(memories[0].id);
38
+ },
39
+ Effect.provide(OperationTestLayer),
40
+ TestHelpers.provideTestContext,
41
+ ),
42
+ );
43
+ });
@@ -10,13 +10,16 @@ import { Operation } from '@dxos/compute';
10
10
  import { Database } from '@dxos/echo';
11
11
  import { DXN } from '@dxos/keys';
12
12
 
13
- import { Plan } from '../../../types';
14
13
  import INSTRUCTIONS from './update-tasks.md?raw';
15
14
 
16
- // Omit `delegated` and `agentPid` from the LLM-facing schema: these are set by the
17
- // delegation tool / runtime, never by ordinary planning, and keeping them out leaves the tool
18
- // schema unchanged.
19
- const SimpleTask = Plan.Task.omit('delegated', 'agentPid');
15
+ /**
16
+ * LLM-facing checklist entry: items are addressed by title (the checklist is markdown — see
17
+ * `Outline.upsertChecklistItems`); `in-progress` renders unchecked, nuance lives in conversation.
18
+ */
19
+ const ChecklistTask = Schema.Struct({
20
+ title: Schema.String.annotations({ description: 'Task title; also the key for updates.' }),
21
+ status: Schema.Literal('todo', 'in-progress', 'done'),
22
+ });
20
23
 
21
24
  export const UpdateTasks = Operation.make({
22
25
  meta: {
@@ -26,7 +29,7 @@ export const UpdateTasks = Operation.make({
26
29
  icon: 'ph--check-square-offset--regular',
27
30
  },
28
31
  input: Schema.Struct({
29
- tasks: Schema.Array(SimpleTask),
32
+ tasks: Schema.Array(ChecklistTask),
30
33
  }),
31
34
  output: Schema.Any,
32
35
  services: [Harness.HarnessService, Database.Service],
@@ -0,0 +1,123 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { describe, expect, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Exit from 'effect/Exit';
8
+
9
+ import { AssistantTestLayerWithTriggers } from '@dxos/agent-runtime/testing';
10
+ import { ScriptedLanguageModel } from '@dxos/ai/testing';
11
+ import { AiContext } from '@dxos/assistant';
12
+ import { Operation, OperationHandlerSet, Skill } from '@dxos/compute';
13
+ import { Database, Feed, Obj, Ref } from '@dxos/echo';
14
+ import { TestHelpers } from '@dxos/effect/testing';
15
+ import { EntityId } from '@dxos/keys';
16
+ import { Text } from '@dxos/schema';
17
+ import { Message, Outline } from '@dxos/types';
18
+
19
+ import { Agent, Chat } from '../../../types';
20
+ import { PlanReminder } from './definitions';
21
+ import { PlanningHandlers } from './index';
22
+
23
+ EntityId.dangerouslyDisableRandomness();
24
+
25
+ describe('PlanReminder', () => {
26
+ it.effect(
27
+ 'attempts a continuation reminder when the model says continue',
28
+ Effect.fnUntraced(
29
+ function* (_) {
30
+ const conversation = yield* setupChatWithChecklist([false]);
31
+
32
+ const exit = yield* Effect.exit(Operation.invoke(PlanReminder, {}).pipe(Effect.provide(conversation)));
33
+
34
+ expect(Exit.isFailure(exit)).toBe(true);
35
+ },
36
+ Effect.provide(layerDeciding('continue')),
37
+ TestHelpers.provideTestContext,
38
+ ),
39
+ );
40
+
41
+ it.effect(
42
+ 'enqueues nothing when the model says stop',
43
+ Effect.fnUntraced(
44
+ function* (_) {
45
+ const conversation = yield* setupChatWithChecklist([false]);
46
+
47
+ const exit = yield* Effect.exit(Operation.invoke(PlanReminder, {}).pipe(Effect.provide(conversation)));
48
+
49
+ expect(Exit.isSuccess(exit)).toBe(true);
50
+ },
51
+ Effect.provide(layerDeciding('stop')),
52
+ TestHelpers.provideTestContext,
53
+ ),
54
+ );
55
+
56
+ it.effect(
57
+ 'is a no-op when every item is checked, without consulting the model',
58
+ Effect.fnUntraced(
59
+ function* (_) {
60
+ const conversation = yield* setupChatWithChecklist([true]);
61
+
62
+ const exit = yield* Effect.exit(Operation.invoke(PlanReminder, {}).pipe(Effect.provide(conversation)));
63
+
64
+ // The script is empty, so reaching the model at all would fail as exhausted.
65
+ expect(Exit.isSuccess(exit)).toBe(true);
66
+ },
67
+ Effect.provide(
68
+ AssistantTestLayerWithTriggers({
69
+ operationHandlers: OperationHandlerSet.merge(PlanningHandlers),
70
+ types,
71
+ aiService: ScriptedLanguageModel.scriptedAiService([]),
72
+ }),
73
+ ),
74
+ TestHelpers.provideTestContext,
75
+ ),
76
+ );
77
+ });
78
+
79
+ /** Creates a chat bound to its feed, carrying an outline checklist with the given item states. */
80
+ const setupChatWithChecklist = Effect.fnUntraced(function* (states: readonly boolean[]) {
81
+ const feed = yield* Database.add(Feed.make());
82
+ const chat = yield* Database.add(Chat.make({ feed: Ref.make(feed) }));
83
+ const { text } = yield* Chat.ensureOutlineText(chat);
84
+ Obj.update(text, (text) => {
85
+ text.content = Outline.upsertChecklistItems(
86
+ text.content,
87
+ states.map((done, index) => ({ title: `Task ${index}`, done })),
88
+ );
89
+ });
90
+ yield* Database.flush();
91
+
92
+ const runtime = yield* Effect.runtime<Database.Service>();
93
+ const binder = new AiContext.Binder({ feed, runtime });
94
+ yield* Effect.promise(() => binder.bind({ objects: [Ref.make(chat)] }));
95
+
96
+ return Operation.withInvocationOptions({ conversation: Obj.getURI(feed) });
97
+ });
98
+
99
+ const types = [
100
+ Agent.Agent,
101
+ Outline.Outline,
102
+ Text.Text,
103
+ Chat.Chat,
104
+ Chat.CompanionTo,
105
+ Skill.Skill,
106
+ Feed.Feed,
107
+ Message.Message,
108
+ AiContext.Binding,
109
+ ];
110
+
111
+ // The hook asks the model whether to keep working; scripting that reply covers both branches, which
112
+ // a single frozen conversation could not.
113
+ //
114
+ // No host process is spawned, so the Tier B enqueue on the continue branch fails with
115
+ // NotSupportedError. That failure is the assertion: it fires exactly when the hook decided to
116
+ // enqueue, and its absence proves it decided not to — observable without reaching into the host's
117
+ // queue, which is where the reminder would otherwise land.
118
+ const layerDeciding = (decision: string) =>
119
+ AssistantTestLayerWithTriggers({
120
+ operationHandlers: OperationHandlerSet.merge(PlanningHandlers),
121
+ types,
122
+ aiService: ScriptedLanguageModel.scriptedAiService([{ parts: [ScriptedLanguageModel.text(decision)] }]),
123
+ });
@@ -10,19 +10,20 @@ import { AiPreprocessor, AiService } from '@dxos/ai';
10
10
  import { Harness } from '@dxos/assistant';
11
11
  import { Operation } from '@dxos/compute';
12
12
  import { Database } from '@dxos/echo';
13
- import { ContentBlock } from '@dxos/types';
13
+ import { ContentBlock, Outline } from '@dxos/types';
14
14
  import { trim } from '@dxos/util';
15
15
 
16
- import { Chat, Plan } from '../../../types';
16
+ import { Chat } from '../../../types';
17
17
  import { PlanReminder } from './definitions';
18
18
 
19
19
  /**
20
- * End-request hook for the planning blueprint. When the session plan still has open tasks, an
21
- * ephemeral check asks the model — given the full conversation — whether the agent should keep
22
- * working: a deterministic reminder alone would trap an agent that legitimately finishes with open
23
- * tasks in an unbreakable re-prompt loop. On "continue" it enqueues a continuation reminder onto the
24
- * owning host's queue (HarnessService Tier B), which keeps the process alive; on "stop" it does
25
- * nothing so the agent may complete with tasks deliberately left open.
20
+ * End-request hook for the planning skill. When the conversation's working outline still has
21
+ * unchecked items, an ephemeral check asks the model — given the full conversation — whether the
22
+ * agent should keep working: a deterministic reminder alone would trap an agent that legitimately
23
+ * finishes with open items in an unbreakable re-prompt loop. On "continue" it enqueues a
24
+ * continuation reminder onto the owning host's queue (HarnessService Tier B), which keeps the
25
+ * process alive; on "stop" it does nothing so the agent may complete with items deliberately left
26
+ * open.
26
27
  */
27
28
  export default PlanReminder.pipe(
28
29
  Operation.withHandler(
@@ -32,27 +33,31 @@ export default PlanReminder.pipe(
32
33
  if (!chat) {
33
34
  return;
34
35
  }
35
- if (!chat?.plan) {
36
+ // Only consult an outline that already exists — the reminder never creates one.
37
+ const outline = yield* resolveExistingOutline(chat);
38
+ if (!outline) {
36
39
  return;
37
40
  }
38
- const plan = yield* Database.load(chat.plan).pipe(Effect.orElseSucceed(() => undefined));
39
- if (!plan || !Plan.hasIncompleteTasks(plan)) {
41
+ const text = yield* Database.load(outline.content).pipe(Effect.orElseSucceed(() => undefined));
42
+ if (!text || !Outline.hasOpenItems(text.content)) {
40
43
  return;
41
44
  }
42
45
 
43
46
  const history = yield* Harness.history;
44
47
  const prompt = Prompt.merge(
45
- yield* AiPreprocessor.preprocessPrompt(history, { system: planCompletionCheckSystem }),
46
- planCompletionCheckPrompt(plan),
48
+ yield* AiPreprocessor.preprocessPrompt(history, { system: checklistCompletionCheckSystem }),
49
+ checklistCompletionCheckPrompt(text.content),
47
50
  );
48
- const { text } = yield* Effect.scoped(LanguageModel.generateText({ prompt }));
51
+ const { text: reply } = yield* Effect.scoped(LanguageModel.generateText({ prompt }));
49
52
 
50
- if (!parseContinueDecision(text)) {
53
+ if (!parseContinueDecision(reply)) {
51
54
  return;
52
55
  }
53
56
 
54
57
  yield* Harness.enqueueMessage({
55
- content: [ContentBlock.Text.make({ text: planContinueReminderPrompt(plan), disposition: 'synthetic' })],
58
+ content: [
59
+ ContentBlock.Text.make({ text: checklistContinueReminderPrompt(text.content), disposition: 'synthetic' }),
60
+ ],
56
61
  });
57
62
  },
58
63
  Effect.provide(AiService.model('com.anthropic.model.claude-sonnet-4-6.default')),
@@ -60,24 +65,37 @@ export default PlanReminder.pipe(
60
65
  ),
61
66
  );
62
67
 
63
- const planCompletionCheckSystem = trim`
64
- You decide whether an agent should stop or continue working on its plan, given the conversation
65
- so far and the agent's remaining plan tasks.
68
+ /**
69
+ * The working outline, if one exists: the parent project's, else the chat's own. Mirrors
70
+ * {@link Chat.ensureOutline}'s resolution order without the create path.
71
+ */
72
+ const resolveExistingOutline = (chat: Chat.Chat) =>
73
+ Effect.gen(function* () {
74
+ const ref = Chat.peekOutlineRef(chat);
75
+ if (!ref) {
76
+ return undefined;
77
+ }
78
+ return yield* Database.load(ref).pipe(Effect.orElseSucceed(() => undefined));
79
+ });
80
+
81
+ const checklistCompletionCheckSystem = trim`
82
+ You decide whether an agent should stop or continue working on its checklist, given the
83
+ conversation so far and the agent's remaining items.
66
84
  Reply with exactly one word: "stop" or "continue". Do not use tools. Do not add explanation.
67
85
  `;
68
86
 
69
- const planCompletionCheckPrompt = (plan: Plan.Plan): string => trim`
70
- The agent is about to finish, but its plan still has incomplete tasks:
87
+ const checklistCompletionCheckPrompt = (markdown: string): string => trim`
88
+ The agent is about to finish, but its checklist still has unchecked items:
71
89
 
72
- <plan>
73
- ${Plan.formatPlan(plan)}
74
- </plan>
90
+ <checklist>
91
+ ${markdown}
92
+ </checklist>
75
93
 
76
- Should the agent STOP now (no more work needed) or CONTINUE working on the plan?
94
+ Should the agent STOP now (no more work needed) or CONTINUE working on the checklist?
77
95
  Reply with exactly one word: "stop" or "continue".
78
96
  `;
79
97
 
80
- /** Prefer an explicit "continue"; treat ambiguous replies as continue so open plan work is not dropped. */
98
+ /** Prefer an explicit "continue"; treat ambiguous replies as continue so open work is not dropped. */
81
99
  const parseContinueDecision = (reply: string): boolean => {
82
100
  const normalized = reply.toLowerCase();
83
101
  if (/\bcontinue\b/.test(normalized)) {
@@ -89,10 +107,10 @@ const parseContinueDecision = (reply: string): boolean => {
89
107
  return true;
90
108
  };
91
109
 
92
- const planContinueReminderPrompt = (plan: Plan.Plan): string => trim`
93
- Your plan still has incomplete tasks — continue working before finishing:
110
+ const checklistContinueReminderPrompt = (markdown: string): string => trim`
111
+ Your checklist still has unchecked items — continue working before finishing:
94
112
 
95
- <plan>
96
- ${Plan.formatPlan(plan)}
97
- </plan>
113
+ <checklist>
114
+ ${markdown}
115
+ </checklist>
98
116
  `;
@@ -9,7 +9,7 @@ Important: Do not show or summarize the contents of the task list unless the use
9
9
  ### CORE USAGE PRINCIPLES
10
10
 
11
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),
12
+ user requests for task organization, multiple deliverables provided together, new instructions (capture as tasks immediately),
13
13
  completed work (mark `done` and add follow-ups), and active work (mark as `in-progress`, limit one at a time).
14
14
 
15
15
  Skip task management for: single straightforward actions, simple requests achievable in 1-2 steps,
@@ -17,13 +17,14 @@ informational queries, quick lookups or clarifications, and avoid creating verif
17
17
 
18
18
  ### TOOL SPECIFICATION
19
19
 
20
- `update-tasks` requires an array of task objects. Each task object contains:
20
+ `update-tasks` requires an array of task objects. The task list is a markdown checklist; the
21
+ title is the key — reuse the exact title to update an existing item, use a new title to add one.
22
+ Each task object contains:
21
23
 
22
- - id (string, required): unique identifier like "task_1" or "research_sources"
23
- - title (string, optional): update to clarify or refine task description
24
- - status (string, optional): `todo` | `in-progress` | `done`
24
+ - title (string, required): specific, actionable task description; also the update key
25
+ - status (string, required): `todo` | `in-progress` | `done`
25
26
 
26
- Task status meanings: 'todo' means not yet started, `in-progress` means currently being worked on, `done` means completed successfully.
27
+ Task status meanings: 'todo' means not yet started, `in-progress` means currently being worked on, `done` means completed successfully (rendered as a checked item).
27
28
 
28
29
  ### OPERATIONAL GUIDELINES
29
30
 
@@ -38,10 +39,10 @@ Batch task updates with other actions when possible for efficiency.
38
39
  <user_message>I need to research sustainable packaging options and write a report comparing costs and environmental impact.</user_message>
39
40
  <assistant_action>
40
41
  Creates tasks:
41
- 1. {id: "research_materials", title: "Research sustainable packaging materials", status: "in-progress"}
42
- 2. {id: "compare_costs", title: "Compile cost comparison data", status: "todo"}
43
- 3. {id: "assess_impact", title: "Evaluate environmental impact metrics", status: "todo"}
44
- 4. {id: "draft_report", title: "Write comparative analysis report", status: "todo"}
42
+ 1. {title: "Research sustainable packaging materials", status: "in-progress"}
43
+ 2. {title: "Compile cost comparison data", status: "todo"}
44
+ 3. {title: "Evaluate environmental impact metrics", status: "todo"}
45
+ 4. {title: "Write comparative analysis report", status: "todo"}
45
46
 
46
47
  Begins research work immediately in same response.
47
48
  </assistant_action>
@@ -52,10 +53,10 @@ Begins research work immediately in same response.
52
53
  <user_message>Help me plan a team retreat - venue, agenda, catering, and send invitations.</user_message>
53
54
  <assistant_action>
54
55
  Creates tasks:
55
- 1. {id: "venue_options", title: "Research and recommend venues", status: "in-progress"}
56
- 2. {id: "draft_agenda", title: "Create retreat agenda", status: "todo"}
57
- 3. {id: "arrange_catering", title: "Coordinate catering options", status: "todo"}
58
- 4. {id: "send_invites", title: "Draft and send invitations", status: "todo"}
56
+ 1. {title: "Research and recommend venues", status: "in-progress"}
57
+ 2. {title: "Create retreat agenda", status: "todo"}
58
+ 3. {title: "Coordinate catering options", status: "todo"}
59
+ 4. {title: "Draft and send invitations", status: "todo"}
59
60
  </assistant_action>
60
61
  <reasoning>Multiple distinct deliverables with dependencies requiring organized tracking.</reasoning>
61
62
  </example>
@@ -64,10 +65,10 @@ Creates tasks:
64
65
  <user_message>Review this 30-page contract for key terms, risks, and negotiation points.</user_message>
65
66
  <assistant_action>
66
67
  Creates tasks:
67
- 1. {id: "extract_key_terms", title: "Identify key contractual terms", status: "in-progress"}
68
- 2. {id: "flag_risks", title: "Flag potential risks and liabilities", status: "todo"}
69
- 3. {id: "negotiation_points", title: "Compile negotiation recommendations", status: "todo"}
70
- 4. {id: "summary_doc", title: "Prepare executive summary", status: "todo"}
68
+ 1. {title: "Identify key contractual terms", status: "in-progress"}
69
+ 2. {title: "Flag potential risks and liabilities", status: "todo"}
70
+ 3. {title: "Compile negotiation recommendations", status: "todo"}
71
+ 4. {title: "Prepare executive summary", status: "todo"}
71
72
  </assistant_action>
72
73
  <reasoning>Substantial analysis work requiring methodical breakdown and systematic review.</reasoning>
73
74
  </example>
@@ -76,9 +77,9 @@ Creates tasks:
76
77
  <user_message>I need: 1) competitor analysis for three companies, 2) SWOT analysis, 3) market positioning recommendations.</user_message>
77
78
  <assistant_action>
78
79
  Creates tasks:
79
- 1. {id: "competitor_research", title: "Research three competitor companies", status: "in-progress"}
80
- 2. {id: "swot_analysis", title: "Develop SWOT analysis", status: "todo"}
81
- 3. {id: "positioning_recs", title: "Create market positioning recommendations", status: "todo"}
80
+ 1. {title: "Research three competitor companies", status: "in-progress"}
81
+ 2. {title: "Develop SWOT analysis", status: "todo"}
82
+ 3. {title: "Create market positioning recommendations", status: "todo"}
82
83
  </assistant_action>
83
84
  <reasoning>User provided numbered list of distinct deliverables requiring separate effort.</reasoning>
84
85
  </example>
@@ -109,7 +110,7 @@ Creates tasks:
109
110
 
110
111
  ### BEST PRACTICES
111
112
 
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 task creation: use specific stable titles (they are the update key), start first task as `in-progress`, batch initial creation with beginning work.
113
114
  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
 
115
116
  When uncertain whether to use task management, err on the side of creating tasks.
@@ -5,15 +5,17 @@
5
5
  import { describe, it } from '@effect/vitest';
6
6
  import * as Effect from 'effect/Effect';
7
7
 
8
+ import { AssistantTestLayer } from '@dxos/agent-runtime/testing';
8
9
  import { AiContext } from '@dxos/assistant';
9
10
  import { Operation, Skill } from '@dxos/compute';
10
11
  import { Database, Feed, Obj, Ref } from '@dxos/echo';
11
12
  import { TestHelpers } from '@dxos/effect/testing';
12
- import { AssistantTestLayer } from '@dxos/functions-runtime/testing';
13
13
  import { invariant } from '@dxos/invariant';
14
14
  import { EntityId } from '@dxos/keys';
15
+ import { Text } from '@dxos/schema';
16
+ import { Outline } from '@dxos/types';
15
17
 
16
- import { Agent, Chat, Plan } from '../../../types';
18
+ import { Agent, Chat } from '../../../types';
17
19
  import PlanningSkill from '../skill';
18
20
  import { UpdateTasks } from './definitions';
19
21
  import { PlanningHandlers } from './index';
@@ -22,31 +24,33 @@ EntityId.dangerouslyDisableRandomness();
22
24
 
23
25
  const TestLayer = AssistantTestLayer({
24
26
  operationHandlers: PlanningHandlers,
25
- types: [Agent.Agent, Plan.Plan, Chat.Chat, Chat.CompanionTo, Skill.Skill, Feed.Feed],
27
+ types: [Agent.Agent, Outline.Outline, Text.Text, Chat.Chat, Chat.CompanionTo, Skill.Skill, Feed.Feed],
26
28
  skills: [PlanningSkill.make()],
27
29
  disableLlmMemoization: true,
28
30
  });
29
31
 
30
32
  describe('UpdateTasks', () => {
31
33
  it.scoped(
32
- 'adds tasks to the plan',
34
+ 'adds items to the checklist',
33
35
  Effect.fnUntraced(
34
36
  function* ({ expect }) {
35
37
  const agent = yield* Agent.makeInitialized({ name: 'Planner', instructions: 'Test.' }, PlanningSkill.make());
36
38
  yield* Database.flush();
37
39
 
38
- const chatFeed = agent.chat?.target?.feed?.target;
40
+ const agentChat = yield* Agent.loadChat(agent);
41
+ const chatFeed = agentChat?.feed?.target;
39
42
  invariant(chatFeed, 'Agent chat feed not found.');
40
43
 
41
44
  yield* Operation.invoke(UpdateTasks, {
42
- tasks: [{ id: Plan.TaskId.make('task-1'), title: 'Hello', status: 'todo' }],
45
+ tasks: [{ title: 'Hello', status: 'todo' }],
43
46
  }).pipe(Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getURI(chatFeed) })));
44
47
 
45
- const chat = yield* Database.load(agent.chat!);
46
- expect(chat.plan).toBeDefined();
47
- const plan = yield* Database.load(chat.plan!);
48
- expect(plan.tasks).toHaveLength(1);
49
- expect(plan.tasks[0]).toMatchObject({ id: 'task-1', title: 'Hello', status: 'todo' });
48
+ const chat = yield* Agent.loadChat(agent);
49
+ invariant(chat, 'Agent chat not found.');
50
+ expect(chat.outline).toBeDefined();
51
+ const outline = yield* Database.load(chat.outline!);
52
+ const text = yield* Database.load(outline.content);
53
+ expect(Outline.parseChecklist(text.content)).toEqual([{ title: 'Hello', done: false }]);
50
54
  },
51
55
  Effect.provide(TestLayer),
52
56
  TestHelpers.provideTestContext,
@@ -54,23 +58,33 @@ describe('UpdateTasks', () => {
54
58
  );
55
59
 
56
60
  it.scoped(
57
- 'adds tasks to the plan without an agent',
61
+ 'adds items to the checklist without an agent, and checks off completed ones',
58
62
  Effect.fnUntraced(
59
63
  function* ({ expect }) {
60
64
  const feed = yield* Database.add(Feed.make());
61
65
  const chat = yield* Database.add(Chat.make({ feed: Ref.make(feed) }));
62
- expect(chat.plan).toBeUndefined();
66
+ expect(chat.outline).toBeUndefined();
63
67
  const runtime = yield* Effect.runtime<Database.Service>();
64
68
  const binder = new AiContext.Binder({ feed, runtime });
65
69
  yield* Effect.promise(() => binder.bind({ objects: [Ref.make(chat)] }));
66
70
 
67
71
  yield* Operation.invoke(UpdateTasks, {
68
- tasks: [{ id: Plan.TaskId.make('task-1'), title: 'Hello', status: 'todo' }],
72
+ tasks: [
73
+ { title: 'Hello', status: 'todo' },
74
+ { title: 'World', status: 'in-progress' },
75
+ ],
69
76
  }).pipe(Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getURI(feed) })));
70
77
 
71
- const plan = yield* Database.load(chat.plan!);
72
- expect(plan.tasks).toHaveLength(1);
73
- expect(plan.tasks[0]).toMatchObject({ id: 'task-1', title: 'Hello', status: 'todo' });
78
+ yield* Operation.invoke(UpdateTasks, {
79
+ tasks: [{ title: 'Hello', status: 'done' }],
80
+ }).pipe(Effect.provide(Operation.withInvocationOptions({ conversation: Obj.getURI(feed) })));
81
+
82
+ const outline = yield* Database.load(chat.outline!);
83
+ const text = yield* Database.load(outline.content);
84
+ expect(Outline.parseChecklist(text.content)).toEqual([
85
+ { title: 'Hello', done: true },
86
+ { title: 'World', done: false },
87
+ ]);
74
88
  },
75
89
  Effect.provide(TestLayer),
76
90
  TestHelpers.provideTestContext,