daycare-cli 2026.2.25 → 2026.2.26

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 (309) hide show
  1. package/dist/engine/agents/agent.d.ts +7 -5
  2. package/dist/engine/agents/agent.d.ts.map +1 -1
  3. package/dist/engine/agents/agent.js +45 -45
  4. package/dist/engine/agents/agent.js.map +1 -1
  5. package/dist/engine/agents/agent.spec.js +95 -46
  6. package/dist/engine/agents/agent.spec.js.map +1 -1
  7. package/dist/engine/agents/agentSystem.d.ts +13 -9
  8. package/dist/engine/agents/agentSystem.d.ts.map +1 -1
  9. package/dist/engine/agents/agentSystem.js +146 -89
  10. package/dist/engine/agents/agentSystem.js.map +1 -1
  11. package/dist/engine/agents/agentSystem.spec.js +89 -32
  12. package/dist/engine/agents/agentSystem.spec.js.map +1 -1
  13. package/dist/engine/agents/agentSystemDurableInbox.spec.js +66 -11
  14. package/dist/engine/agents/agentSystemDurableInbox.spec.js.map +1 -1
  15. package/dist/engine/agents/context.d.ts +21 -2
  16. package/dist/engine/agents/context.d.ts.map +1 -1
  17. package/dist/engine/agents/context.js +41 -4
  18. package/dist/engine/agents/context.js.map +1 -1
  19. package/dist/engine/agents/context.spec.js +15 -5
  20. package/dist/engine/agents/context.spec.js.map +1 -1
  21. package/dist/engine/agents/ops/agentDescriptorRead.d.ts +2 -2
  22. package/dist/engine/agents/ops/agentDescriptorRead.d.ts.map +1 -1
  23. package/dist/engine/agents/ops/agentDescriptorRead.js +2 -2
  24. package/dist/engine/agents/ops/agentDescriptorRead.js.map +1 -1
  25. package/dist/engine/agents/ops/agentDescriptorWrite.d.ts +3 -3
  26. package/dist/engine/agents/ops/agentDescriptorWrite.d.ts.map +1 -1
  27. package/dist/engine/agents/ops/agentDescriptorWrite.js +7 -24
  28. package/dist/engine/agents/ops/agentDescriptorWrite.js.map +1 -1
  29. package/dist/engine/agents/ops/agentDescriptorWrite.spec.js +6 -4
  30. package/dist/engine/agents/ops/agentDescriptorWrite.spec.js.map +1 -1
  31. package/dist/engine/agents/ops/agentHistoryAppend.d.ts +2 -2
  32. package/dist/engine/agents/ops/agentHistoryAppend.d.ts.map +1 -1
  33. package/dist/engine/agents/ops/agentHistoryAppend.js +2 -2
  34. package/dist/engine/agents/ops/agentHistoryAppend.js.map +1 -1
  35. package/dist/engine/agents/ops/agentHistoryLoad.d.ts +2 -2
  36. package/dist/engine/agents/ops/agentHistoryLoad.d.ts.map +1 -1
  37. package/dist/engine/agents/ops/agentHistoryLoad.js +2 -2
  38. package/dist/engine/agents/ops/agentHistoryLoad.js.map +1 -1
  39. package/dist/engine/agents/ops/agentHistoryLoad.spec.js +10 -8
  40. package/dist/engine/agents/ops/agentHistoryLoad.spec.js.map +1 -1
  41. package/dist/engine/agents/ops/agentHistoryLoadAll.d.ts +2 -2
  42. package/dist/engine/agents/ops/agentHistoryLoadAll.d.ts.map +1 -1
  43. package/dist/engine/agents/ops/agentHistoryLoadAll.js +2 -2
  44. package/dist/engine/agents/ops/agentHistoryLoadAll.js.map +1 -1
  45. package/dist/engine/agents/ops/agentHistoryLoadAll.spec.js +10 -8
  46. package/dist/engine/agents/ops/agentHistoryLoadAll.spec.js.map +1 -1
  47. package/dist/engine/agents/ops/agentInferencePromptWrite.d.ts +2 -2
  48. package/dist/engine/agents/ops/agentInferencePromptWrite.d.ts.map +1 -1
  49. package/dist/engine/agents/ops/agentInferencePromptWrite.js +2 -6
  50. package/dist/engine/agents/ops/agentInferencePromptWrite.js.map +1 -1
  51. package/dist/engine/agents/ops/agentInferencePromptWrite.spec.js +3 -1
  52. package/dist/engine/agents/ops/agentInferencePromptWrite.spec.js.map +1 -1
  53. package/dist/engine/agents/ops/agentLoopRun.d.ts.map +1 -1
  54. package/dist/engine/agents/ops/agentLoopRun.js +5 -7
  55. package/dist/engine/agents/ops/agentLoopRun.js.map +1 -1
  56. package/dist/engine/agents/ops/agentLoopRun.spec.js +2 -0
  57. package/dist/engine/agents/ops/agentLoopRun.spec.js.map +1 -1
  58. package/dist/engine/agents/ops/agentPath.d.ts +2 -2
  59. package/dist/engine/agents/ops/agentPath.d.ts.map +1 -1
  60. package/dist/engine/agents/ops/agentPath.js +2 -2
  61. package/dist/engine/agents/ops/agentPath.js.map +1 -1
  62. package/dist/engine/agents/ops/agentStateRead.d.ts +2 -2
  63. package/dist/engine/agents/ops/agentStateRead.d.ts.map +1 -1
  64. package/dist/engine/agents/ops/agentStateRead.js +2 -2
  65. package/dist/engine/agents/ops/agentStateRead.js.map +1 -1
  66. package/dist/engine/agents/ops/agentStateRead.spec.js +13 -9
  67. package/dist/engine/agents/ops/agentStateRead.spec.js.map +1 -1
  68. package/dist/engine/agents/ops/agentStateWrite.d.ts +2 -2
  69. package/dist/engine/agents/ops/agentStateWrite.d.ts.map +1 -1
  70. package/dist/engine/agents/ops/agentStateWrite.js +4 -4
  71. package/dist/engine/agents/ops/agentStateWrite.js.map +1 -1
  72. package/dist/engine/agents/ops/agentSystemPrompt.d.ts +1 -1
  73. package/dist/engine/agents/ops/agentSystemPrompt.d.ts.map +1 -1
  74. package/dist/engine/agents/ops/agentSystemPrompt.js +1 -1
  75. package/dist/engine/agents/ops/agentSystemPrompt.js.map +1 -1
  76. package/dist/engine/agents/ops/agentSystemPrompt.spec.js +6 -2
  77. package/dist/engine/agents/ops/agentSystemPrompt.spec.js.map +1 -1
  78. package/dist/engine/agents/ops/agentSystemPromptContext.d.ts +2 -3
  79. package/dist/engine/agents/ops/agentSystemPromptContext.d.ts.map +1 -1
  80. package/dist/engine/agents/ops/agentSystemPromptSectionAgentsTopologySignalsChannels.d.ts +1 -1
  81. package/dist/engine/agents/ops/agentSystemPromptSectionAgentsTopologySignalsChannels.d.ts.map +1 -1
  82. package/dist/engine/agents/ops/agentSystemPromptSectionAgentsTopologySignalsChannels.js +1 -1
  83. package/dist/engine/agents/ops/agentSystemPromptSectionAgentsTopologySignalsChannels.js.map +1 -1
  84. package/dist/engine/agents/ops/agentSystemPromptSectionAutonomousOperation.d.ts +1 -1
  85. package/dist/engine/agents/ops/agentSystemPromptSectionAutonomousOperation.d.ts.map +1 -1
  86. package/dist/engine/agents/ops/agentSystemPromptSectionAutonomousOperation.js +1 -1
  87. package/dist/engine/agents/ops/agentSystemPromptSectionAutonomousOperation.js.map +1 -1
  88. package/dist/engine/agents/ops/agentSystemPromptSectionEnvironment.d.ts +1 -1
  89. package/dist/engine/agents/ops/agentSystemPromptSectionEnvironment.d.ts.map +1 -1
  90. package/dist/engine/agents/ops/agentSystemPromptSectionEnvironment.js +1 -1
  91. package/dist/engine/agents/ops/agentSystemPromptSectionEnvironment.js.map +1 -1
  92. package/dist/engine/agents/ops/agentSystemPromptSectionFormatting.d.ts +1 -1
  93. package/dist/engine/agents/ops/agentSystemPromptSectionFormatting.d.ts.map +1 -1
  94. package/dist/engine/agents/ops/agentSystemPromptSectionFormatting.js +1 -1
  95. package/dist/engine/agents/ops/agentSystemPromptSectionFormatting.js.map +1 -1
  96. package/dist/engine/agents/ops/agentSystemPromptSectionMemory.d.ts +1 -1
  97. package/dist/engine/agents/ops/agentSystemPromptSectionMemory.d.ts.map +1 -1
  98. package/dist/engine/agents/ops/agentSystemPromptSectionMemory.js +1 -1
  99. package/dist/engine/agents/ops/agentSystemPromptSectionMemory.js.map +1 -1
  100. package/dist/engine/agents/ops/agentSystemPromptSectionModels.d.ts +1 -1
  101. package/dist/engine/agents/ops/agentSystemPromptSectionModels.d.ts.map +1 -1
  102. package/dist/engine/agents/ops/agentSystemPromptSectionModels.js +1 -1
  103. package/dist/engine/agents/ops/agentSystemPromptSectionModels.js.map +1 -1
  104. package/dist/engine/agents/ops/agentSystemPromptSectionModels.spec.js +5 -1
  105. package/dist/engine/agents/ops/agentSystemPromptSectionModels.spec.js.map +1 -1
  106. package/dist/engine/agents/ops/agentSystemPromptSectionPermissions.d.ts +1 -1
  107. package/dist/engine/agents/ops/agentSystemPromptSectionPermissions.d.ts.map +1 -1
  108. package/dist/engine/agents/ops/agentSystemPromptSectionPermissions.js +1 -1
  109. package/dist/engine/agents/ops/agentSystemPromptSectionPermissions.js.map +1 -1
  110. package/dist/engine/agents/ops/agentSystemPromptSectionPreamble.d.ts +1 -1
  111. package/dist/engine/agents/ops/agentSystemPromptSectionPreamble.d.ts.map +1 -1
  112. package/dist/engine/agents/ops/agentSystemPromptSectionPreamble.js +1 -1
  113. package/dist/engine/agents/ops/agentSystemPromptSectionPreamble.js.map +1 -1
  114. package/dist/engine/agents/ops/agentSystemPromptSectionSkills.d.ts +1 -1
  115. package/dist/engine/agents/ops/agentSystemPromptSectionSkills.d.ts.map +1 -1
  116. package/dist/engine/agents/ops/agentSystemPromptSectionSkills.js +1 -1
  117. package/dist/engine/agents/ops/agentSystemPromptSectionSkills.js.map +1 -1
  118. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.d.ts +1 -1
  119. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.d.ts.map +1 -1
  120. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.js +3 -4
  121. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.js.map +1 -1
  122. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.spec.js +2 -2
  123. package/dist/engine/agents/ops/agentSystemPromptSectionToolCalling.spec.js.map +1 -1
  124. package/dist/engine/agents/ops/agentSystemPromptWrite.d.ts +3 -3
  125. package/dist/engine/agents/ops/agentSystemPromptWrite.d.ts.map +1 -1
  126. package/dist/engine/agents/ops/agentSystemPromptWrite.js +4 -3
  127. package/dist/engine/agents/ops/agentSystemPromptWrite.js.map +1 -1
  128. package/dist/engine/agents/ops/agentSystemPromptWrite.spec.js +5 -3
  129. package/dist/engine/agents/ops/agentSystemPromptWrite.spec.js.map +1 -1
  130. package/dist/engine/apps/appExecute.d.ts.map +1 -1
  131. package/dist/engine/apps/appExecute.js +7 -5
  132. package/dist/engine/apps/appExecute.js.map +1 -1
  133. package/dist/engine/apps/appExecute.spec.js +19 -10
  134. package/dist/engine/apps/appExecute.spec.js.map +1 -1
  135. package/dist/engine/apps/appInstallToolBuild.js +4 -3
  136. package/dist/engine/apps/appInstallToolBuild.js.map +1 -1
  137. package/dist/engine/channels/channels.d.ts.map +1 -1
  138. package/dist/engine/channels/channels.js +9 -11
  139. package/dist/engine/channels/channels.js.map +1 -1
  140. package/dist/engine/channels/channels.spec.js +4 -4
  141. package/dist/engine/channels/channels.spec.js.map +1 -1
  142. package/dist/engine/cron/crons.d.ts.map +1 -1
  143. package/dist/engine/cron/crons.js +2 -1
  144. package/dist/engine/cron/crons.js.map +1 -1
  145. package/dist/engine/cron/crons.spec.js +3 -5
  146. package/dist/engine/cron/crons.spec.js.map +1 -1
  147. package/dist/engine/cron/ops/cronScheduler.js +2 -2
  148. package/dist/engine/cron/ops/cronScheduler.js.map +1 -1
  149. package/dist/engine/engine.d.ts +5 -0
  150. package/dist/engine/engine.d.ts.map +1 -1
  151. package/dist/engine/engine.js +39 -15
  152. package/dist/engine/engine.js.map +1 -1
  153. package/dist/engine/engine.spec.js +9 -4
  154. package/dist/engine/engine.spec.js.map +1 -1
  155. package/dist/engine/expose/exposes.d.ts.map +1 -1
  156. package/dist/engine/expose/exposes.js +9 -2
  157. package/dist/engine/expose/exposes.js.map +1 -1
  158. package/dist/engine/heartbeat/heartbeats.d.ts.map +1 -1
  159. package/dist/engine/heartbeat/heartbeats.js +17 -8
  160. package/dist/engine/heartbeat/heartbeats.js.map +1 -1
  161. package/dist/engine/heartbeat/heartbeats.spec.js +1 -1
  162. package/dist/engine/heartbeat/heartbeats.spec.js.map +1 -1
  163. package/dist/engine/heartbeat/ops/heartbeatScheduler.js +2 -2
  164. package/dist/engine/heartbeat/ops/heartbeatScheduler.js.map +1 -1
  165. package/dist/engine/ipc/server.d.ts.map +1 -1
  166. package/dist/engine/ipc/server.js +11 -3
  167. package/dist/engine/ipc/server.js.map +1 -1
  168. package/dist/engine/ipc/serverMemoryRoutesRegister.d.ts +3 -2
  169. package/dist/engine/ipc/serverMemoryRoutesRegister.d.ts.map +1 -1
  170. package/dist/engine/ipc/serverMemoryRoutesRegister.js +3 -2
  171. package/dist/engine/ipc/serverMemoryRoutesRegister.js.map +1 -1
  172. package/dist/engine/ipc/serverMemoryRoutesRegister.spec.js +3 -2
  173. package/dist/engine/ipc/serverMemoryRoutesRegister.spec.js.map +1 -1
  174. package/dist/engine/memory/memory.d.ts +6 -5
  175. package/dist/engine/memory/memory.d.ts.map +1 -1
  176. package/dist/engine/memory/memory.js +12 -12
  177. package/dist/engine/memory/memory.js.map +1 -1
  178. package/dist/engine/memory/memory.spec.js +10 -6
  179. package/dist/engine/memory/memory.spec.js.map +1 -1
  180. package/dist/engine/memory/memorySessionObserve.spec.js +3 -3
  181. package/dist/engine/memory/memorySessionObserve.spec.js.map +1 -1
  182. package/dist/engine/memory/memoryWorker.d.ts +2 -1
  183. package/dist/engine/memory/memoryWorker.d.ts.map +1 -1
  184. package/dist/engine/memory/memoryWorker.js +3 -1
  185. package/dist/engine/memory/memoryWorker.js.map +1 -1
  186. package/dist/engine/memory/memoryWorker.spec.js +4 -2
  187. package/dist/engine/memory/memoryWorker.spec.js.map +1 -1
  188. package/dist/engine/modules/rlm/rlmTool.spec.js +7 -4
  189. package/dist/engine/modules/rlm/rlmTool.spec.js.map +1 -1
  190. package/dist/engine/modules/rlm/rlmToolsForContextResolve.d.ts.map +1 -1
  191. package/dist/engine/modules/rlm/rlmToolsForContextResolve.js +2 -4
  192. package/dist/engine/modules/rlm/rlmToolsForContextResolve.js.map +1 -1
  193. package/dist/engine/modules/rlm/rlmToolsForContextResolve.spec.js +5 -3
  194. package/dist/engine/modules/rlm/rlmToolsForContextResolve.spec.js.map +1 -1
  195. package/dist/engine/modules/toolResolver.spec.js +2 -2
  196. package/dist/engine/modules/toolResolver.spec.js.map +1 -1
  197. package/dist/engine/modules/tools/agentCompactTool.d.ts.map +1 -1
  198. package/dist/engine/modules/tools/agentCompactTool.js +5 -1
  199. package/dist/engine/modules/tools/agentCompactTool.js.map +1 -1
  200. package/dist/engine/modules/tools/agentCompactTool.spec.js +9 -5
  201. package/dist/engine/modules/tools/agentCompactTool.spec.js.map +1 -1
  202. package/dist/engine/modules/tools/agentModelSetToolBuild.spec.js +5 -8
  203. package/dist/engine/modules/tools/agentModelSetToolBuild.spec.js.map +1 -1
  204. package/dist/engine/modules/tools/agentResetTool.d.ts.map +1 -1
  205. package/dist/engine/modules/tools/agentResetTool.js +5 -1
  206. package/dist/engine/modules/tools/agentResetTool.js.map +1 -1
  207. package/dist/engine/modules/tools/agentResetTool.spec.js +12 -7
  208. package/dist/engine/modules/tools/agentResetTool.spec.js.map +1 -1
  209. package/dist/engine/modules/tools/background.d.ts.map +1 -1
  210. package/dist/engine/modules/tools/background.js +5 -40
  211. package/dist/engine/modules/tools/background.js.map +1 -1
  212. package/dist/engine/modules/tools/background.spec.js +3 -2
  213. package/dist/engine/modules/tools/background.spec.js.map +1 -1
  214. package/dist/engine/modules/tools/memoryNodeReadToolBuild.js +2 -2
  215. package/dist/engine/modules/tools/memoryNodeReadToolBuild.js.map +1 -1
  216. package/dist/engine/modules/tools/memoryNodeReadToolBuild.spec.js +3 -4
  217. package/dist/engine/modules/tools/memoryNodeReadToolBuild.spec.js.map +1 -1
  218. package/dist/engine/modules/tools/memoryNodeWriteToolBuild.d.ts.map +1 -1
  219. package/dist/engine/modules/tools/memoryNodeWriteToolBuild.js +2 -3
  220. package/dist/engine/modules/tools/memoryNodeWriteToolBuild.js.map +1 -1
  221. package/dist/engine/modules/tools/memoryNodeWriteToolBuild.spec.js +3 -4
  222. package/dist/engine/modules/tools/memoryNodeWriteToolBuild.spec.js.map +1 -1
  223. package/dist/engine/modules/tools/memorySearchToolBuild.d.ts.map +1 -1
  224. package/dist/engine/modules/tools/memorySearchToolBuild.js +2 -2
  225. package/dist/engine/modules/tools/memorySearchToolBuild.js.map +1 -1
  226. package/dist/engine/modules/tools/permanentAgentToolBuild.d.ts.map +1 -1
  227. package/dist/engine/modules/tools/permanentAgentToolBuild.js +12 -10
  228. package/dist/engine/modules/tools/permanentAgentToolBuild.js.map +1 -1
  229. package/dist/engine/modules/tools/permanentAgentToolBuild.spec.js +2 -1
  230. package/dist/engine/modules/tools/permanentAgentToolBuild.spec.js.map +1 -1
  231. package/dist/engine/modules/tools/sendUserMessageTool.d.ts.map +1 -1
  232. package/dist/engine/modules/tools/sendUserMessageTool.js +6 -2
  233. package/dist/engine/modules/tools/sendUserMessageTool.js.map +1 -1
  234. package/dist/engine/modules/tools/sendUserMessageTool.spec.js +5 -4
  235. package/dist/engine/modules/tools/sendUserMessageTool.spec.js.map +1 -1
  236. package/dist/engine/modules/tools/sessionHistoryToolBuild.d.ts.map +1 -1
  237. package/dist/engine/modules/tools/sessionHistoryToolBuild.js +7 -3
  238. package/dist/engine/modules/tools/sessionHistoryToolBuild.js.map +1 -1
  239. package/dist/engine/modules/tools/sessionHistoryToolBuild.spec.js +23 -18
  240. package/dist/engine/modules/tools/sessionHistoryToolBuild.spec.js.map +1 -1
  241. package/dist/engine/modules/tools/skillToolBuild.d.ts.map +1 -1
  242. package/dist/engine/modules/tools/skillToolBuild.js +6 -2
  243. package/dist/engine/modules/tools/skillToolBuild.js.map +1 -1
  244. package/dist/engine/modules/tools/skillToolBuild.spec.js +5 -3
  245. package/dist/engine/modules/tools/skillToolBuild.spec.js.map +1 -1
  246. package/dist/engine/modules/tools/subuserConfigureToolBuild.d.ts.map +1 -1
  247. package/dist/engine/modules/tools/subuserConfigureToolBuild.js +3 -2
  248. package/dist/engine/modules/tools/subuserConfigureToolBuild.js.map +1 -1
  249. package/dist/engine/modules/tools/subuserCreateToolBuild.d.ts.map +1 -1
  250. package/dist/engine/modules/tools/subuserCreateToolBuild.js +4 -3
  251. package/dist/engine/modules/tools/subuserCreateToolBuild.js.map +1 -1
  252. package/dist/engine/modules/tools/subuserCreateToolBuild.spec.js +3 -4
  253. package/dist/engine/modules/tools/subuserCreateToolBuild.spec.js.map +1 -1
  254. package/dist/engine/modules/tools/subuserListToolBuild.js +1 -4
  255. package/dist/engine/modules/tools/subuserListToolBuild.js.map +1 -1
  256. package/dist/engine/modules/tools/topologyToolBuild.d.ts.map +1 -1
  257. package/dist/engine/modules/tools/topologyToolBuild.js +2 -2
  258. package/dist/engine/modules/tools/topologyToolBuild.js.map +1 -1
  259. package/dist/engine/modules/tools/topologyToolBuild.spec.js +29 -23
  260. package/dist/engine/modules/tools/topologyToolBuild.spec.js.map +1 -1
  261. package/dist/engine/modules/tools/types.d.ts +1 -2
  262. package/dist/engine/modules/tools/types.d.ts.map +1 -1
  263. package/dist/engine/processes/processes.d.ts.map +1 -1
  264. package/dist/engine/processes/processes.js +7 -2
  265. package/dist/engine/processes/processes.js.map +1 -1
  266. package/dist/engine/signals/signals.js +9 -2
  267. package/dist/engine/signals/signals.js.map +1 -1
  268. package/dist/plugins/dashboard/site/404.html +1 -1
  269. package/dist/plugins/dashboard/site/agent.html +1 -1
  270. package/dist/plugins/dashboard/site/agent.txt +1 -1
  271. package/dist/plugins/dashboard/site/agents.html +1 -1
  272. package/dist/plugins/dashboard/site/agents.txt +1 -1
  273. package/dist/plugins/dashboard/site/automations.html +1 -1
  274. package/dist/plugins/dashboard/site/automations.txt +1 -1
  275. package/dist/plugins/dashboard/site/connectors.html +1 -1
  276. package/dist/plugins/dashboard/site/connectors.txt +1 -1
  277. package/dist/plugins/dashboard/site/index.html +1 -1
  278. package/dist/plugins/dashboard/site/index.txt +1 -1
  279. package/dist/plugins/dashboard/site/memory.html +1 -1
  280. package/dist/plugins/dashboard/site/memory.txt +1 -1
  281. package/dist/plugins/dashboard/site/processes.html +1 -1
  282. package/dist/plugins/dashboard/site/processes.txt +1 -1
  283. package/dist/plugins/dashboard/site/providers.html +1 -1
  284. package/dist/plugins/dashboard/site/providers.txt +1 -1
  285. package/dist/plugins/dashboard/site/signals.html +1 -1
  286. package/dist/plugins/dashboard/site/signals.txt +1 -1
  287. package/dist/plugins/dashboard/site/telemetry.html +1 -1
  288. package/dist/plugins/dashboard/site/telemetry.txt +1 -1
  289. package/dist/plugins/dashboard/site/tools.html +1 -1
  290. package/dist/plugins/dashboard/site/tools.txt +1 -1
  291. package/dist/plugins/database/__tests__/plugin.spec.js +4 -3
  292. package/dist/plugins/database/__tests__/plugin.spec.js.map +1 -1
  293. package/dist/plugins/monty-python/tool.spec.js +4 -2
  294. package/dist/plugins/monty-python/tool.spec.js.map +1 -1
  295. package/dist/plugins/shell/tool.spec.js +4 -2
  296. package/dist/plugins/shell/tool.spec.js.map +1 -1
  297. package/dist/storage/delayedSignalsRepository.d.ts +1 -1
  298. package/dist/storage/delayedSignalsRepository.d.ts.map +1 -1
  299. package/dist/storage/delayedSignalsRepository.js +29 -22
  300. package/dist/storage/delayedSignalsRepository.js.map +1 -1
  301. package/dist/storage/signalSubscriptionsRepository.js +3 -3
  302. package/dist/storage/signalSubscriptionsRepository.js.map +1 -1
  303. package/dist/types.d.ts +1 -1
  304. package/dist/types.d.ts.map +1 -1
  305. package/dist/types.js +1 -1
  306. package/dist/types.js.map +1 -1
  307. package/package.json +1 -1
  308. /package/dist/plugins/dashboard/site/_next/static/{Tn0eCf61QYHaE96GNMJsm → X_oqQhoSTmj1_qmNPx-r5}/_buildManifest.js +0 -0
  309. /package/dist/plugins/dashboard/site/_next/static/{Tn0eCf61QYHaE96GNMJsm → X_oqQhoSTmj1_qmNPx-r5}/_ssgManifest.js +0 -0
@@ -8,7 +8,7 @@ import { cuid2Is } from "../../utils/cuid2Is.js";
8
8
  import { Memory } from "../memory/memory.js";
9
9
  import { UserHome } from "../users/userHome.js";
10
10
  import { Agent } from "./agent.js";
11
- import { Context } from "./context.js";
11
+ import { contextForAgent, contextForUser } from "./context.js";
12
12
  import { agentDescriptorCacheKey } from "./ops/agentDescriptorCacheKey.js";
13
13
  import { agentDescriptorMatchesStrategy } from "./ops/agentDescriptorMatchesStrategy.js";
14
14
  import { agentDescriptorRead } from "./ops/agentDescriptorRead.js";
@@ -102,9 +102,10 @@ export class AgentSystem {
102
102
  const records = await this.storage.agents.findMany();
103
103
  for (const record of records) {
104
104
  const agentId = record.id;
105
+ const ctx = contextForAgent({ userId: record.userId, agentId });
105
106
  let state = null;
106
107
  try {
107
- state = await agentStateRead(this.storage, agentId);
108
+ state = await agentStateRead(this.storage, ctx);
108
109
  }
109
110
  catch (error) {
110
111
  logger.warn({ agentId, error }, "restore: Agent restore skipped due to invalid persisted data");
@@ -126,17 +127,16 @@ export class AgentSystem {
126
127
  deliverAt: state.updatedAt + AGENT_POISON_PILL_DELAY_MS
127
128
  });
128
129
  }
129
- const key = agentDescriptorCacheKey(descriptor);
130
+ const key = agentCacheKeyForCtx(ctx, descriptor);
130
131
  this.keyMap.set(key, agentId);
131
132
  logger.info({ agentId }, "restore: Agent restore skipped (sleeping)");
132
133
  continue;
133
134
  }
134
135
  const inbox = new AgentInbox(agentId);
135
136
  const userHome = this.userHomeForUserId(record.userId);
136
- const agent = Agent.restore(agentId, record.userId, descriptor, state, inbox, this, userHome);
137
+ const agent = Agent.restore(ctx, descriptor, state, inbox, this, userHome);
137
138
  const registered = this.registerEntry({
138
- agentId,
139
- userId: record.userId,
139
+ ctx,
140
140
  descriptor,
141
141
  agent,
142
142
  inbox
@@ -160,20 +160,20 @@ export class AgentSystem {
160
160
  this.startEntryIfRunning(entry);
161
161
  }
162
162
  }
163
- async post(target, item) {
163
+ async post(ctx, target, item) {
164
164
  if (this.stage === "idle" && (item.type === "message" || item.type === "system_message")) {
165
165
  const agentType = "descriptor" in target ? target.descriptor.type : "agent";
166
166
  logger.warn({ agentType }, "load: AgentSystem received message before load");
167
167
  }
168
168
  const targetLabel = "descriptor" in target ? `descriptor:${target.descriptor.type}` : `agent:${target.agentId}`;
169
169
  logger.debug(`receive: post() received itemType=${item.type} target=${targetLabel} stage=${this.stage}`);
170
- const entry = await this.resolveEntry(target, item);
170
+ const entry = await this.resolveEntry(ctx, target, item);
171
171
  await this.enqueueEntry(entry, item, null);
172
- logger.debug(`event: post() queued item agentId=${entry.agentId} inboxSize=${entry.inbox.size()}`);
172
+ logger.debug(`event: post() queued item agentId=${entry.ctx.agentId} inboxSize=${entry.inbox.size()}`);
173
173
  this.startEntryIfRunning(entry);
174
174
  }
175
- async postAndAwait(target, item) {
176
- const entry = await this.resolveEntry(target, item);
175
+ async postAndAwait(ctx, target, item) {
176
+ const entry = await this.resolveEntry(ctx, target, item);
177
177
  const completion = this.createCompletion();
178
178
  await this.enqueueEntry(entry, item, completion.completion);
179
179
  this.startEntryIfRunning(entry);
@@ -183,16 +183,16 @@ export class AgentSystem {
183
183
  * Resolves a target to its concrete agent id, creating/restoring when needed.
184
184
  * Expects: descriptor targets are valid for agent creation.
185
185
  */
186
- async agentIdForTarget(target) {
187
- const entry = await this.resolveEntry(target, {
186
+ async agentIdForTarget(ctx, target) {
187
+ const entry = await this.resolveEntry(ctx, target, {
188
188
  type: "message",
189
189
  message: { text: null },
190
190
  context: {}
191
191
  });
192
- return entry.agentId;
192
+ return entry.ctx.agentId;
193
193
  }
194
- async tokensForTarget(target) {
195
- const entry = await this.resolveEntry(target, {
194
+ async tokensForTarget(ctx, target) {
195
+ const entry = await this.resolveEntry(ctx, target, {
196
196
  type: "message",
197
197
  message: { text: null },
198
198
  context: {}
@@ -212,7 +212,11 @@ export class AgentSystem {
212
212
  return true;
213
213
  }
214
214
  try {
215
- const descriptor = await agentDescriptorRead(this.storage, agentId);
215
+ const context = await this.contextForAgentId(agentId);
216
+ if (!context) {
217
+ return false;
218
+ }
219
+ const descriptor = await agentDescriptorRead(this.storage, context);
216
220
  return !!descriptor;
217
221
  }
218
222
  catch {
@@ -226,13 +230,13 @@ export class AgentSystem {
226
230
  async contextForAgentId(agentId) {
227
231
  const loaded = this.entries.get(agentId);
228
232
  if (loaded) {
229
- return new Context(loaded.agentId, loaded.userId);
233
+ return loaded.ctx;
230
234
  }
231
235
  const record = await this.storage.agents.findById(agentId);
232
236
  if (!record) {
233
237
  return null;
234
238
  }
235
- return new Context(record.id, record.userId);
239
+ return contextForAgent({ userId: record.userId, agentId: record.id });
236
240
  }
237
241
  async signalDeliver(signal, subscriptions) {
238
242
  await Promise.all(subscriptions.map(async (subscription) => {
@@ -244,7 +248,7 @@ export class AgentSystem {
244
248
  return;
245
249
  }
246
250
  try {
247
- await this.post({ agentId: subscription.ctx.agentId }, {
251
+ await this.post(context, { agentId: subscription.ctx.agentId }, {
248
252
  type: "signal",
249
253
  signal,
250
254
  subscriptionPattern: subscription.pattern
@@ -266,18 +270,21 @@ export class AgentSystem {
266
270
  * The current tool completes but remaining queued tools are cancelled.
267
271
  * Wakes the agent if sleeping.
268
272
  */
269
- async steer(agentId, steering) {
273
+ async steer(ctx, agentId, steering) {
270
274
  const entry = this.entries.get(agentId);
271
275
  if (!entry) {
272
276
  throw new Error(`Agent not found: ${agentId}`);
273
277
  }
278
+ if (ctx.userId !== entry.ctx.userId) {
279
+ throw new Error(`Cannot steer agent from another user: ${agentId}`);
280
+ }
274
281
  let woke = false;
275
282
  await entry.lock.inLock(async () => {
276
283
  woke = await this.wakeEntryIfSleeping(entry);
277
284
  entry.inbox.steer(steering);
278
285
  });
279
286
  if (woke) {
280
- await this.signalLifecycle(entry.agentId, "wake");
287
+ await this.signalLifecycle(entry.ctx.agentId, "wake");
281
288
  }
282
289
  logger.info({ agentId, origin: steering.origin }, "event: Steering message delivered");
283
290
  this.startEntryIfRunning(entry);
@@ -292,7 +299,7 @@ export class AgentSystem {
292
299
  return false;
293
300
  }
294
301
  const aborted = entry.agent.abortInference();
295
- logger.info({ agentId: entry.agentId, aborted }, "event: Abort inference requested");
302
+ logger.info({ agentId: entry.ctx.agentId, aborted }, "event: Abort inference requested");
296
303
  return aborted;
297
304
  }
298
305
  markStopped(agentId, error) {
@@ -318,7 +325,7 @@ export class AgentSystem {
318
325
  return;
319
326
  }
320
327
  entry.agent.state.state = "sleeping";
321
- await agentStateWrite(this.storage, agentId, entry.agent.state);
328
+ await agentStateWrite(this.storage, entry.ctx, entry.agent.state);
322
329
  this.eventBus.emit("agent.sleep", { agentId, reason });
323
330
  logger.debug({ agentId, reason }, "event: Agent entered sleep mode");
324
331
  // Mark session for memory processing on idle
@@ -342,9 +349,9 @@ export class AgentSystem {
342
349
  await this.signalLifecycle(agentId, "sleep");
343
350
  }
344
351
  }
345
- agentFor(strategy) {
352
+ agentFor(ctx, strategy) {
346
353
  const candidates = Array.from(this.entries.values()).filter((entry) => {
347
- return agentDescriptorMatchesStrategy(entry.descriptor, strategy);
354
+ return entry.ctx.userId === ctx.userId && agentDescriptorMatchesStrategy(entry.descriptor, strategy);
348
355
  });
349
356
  if (candidates.length === 0) {
350
357
  return null;
@@ -354,7 +361,7 @@ export class AgentSystem {
354
361
  const bTime = agentTimestampGet(b.agent.state.updatedAt);
355
362
  return bTime - aTime;
356
363
  });
357
- return candidates[0]?.agentId ?? null;
364
+ return candidates[0]?.ctx.agentId ?? null;
358
365
  }
359
366
  /**
360
367
  * Returns the descriptor for an agent by id.
@@ -399,7 +406,7 @@ export class AgentSystem {
399
406
  }
400
407
  entry.agent.state.modelOverride = override;
401
408
  entry.agent.state.updatedAt = Date.now();
402
- await agentStateWrite(this.storage, agentId, entry.agent.state);
409
+ await agentStateWrite(this.storage, entry.ctx, entry.agent.state);
403
410
  return true;
404
411
  }
405
412
  async inReadLock(operation) {
@@ -412,30 +419,37 @@ export class AgentSystem {
412
419
  if ("agentId" in target) {
413
420
  return this.entries.get(target.agentId) ?? null;
414
421
  }
415
- const key = agentDescriptorCacheKey(target.descriptor);
416
- const agentId = this.keyMap.get(key);
417
- if (!agentId) {
418
- return null;
422
+ const descriptorKey = agentDescriptorCacheKey(target.descriptor);
423
+ for (const entry of this.entries.values()) {
424
+ if (agentDescriptorCacheKey(entry.descriptor) === descriptorKey) {
425
+ return entry;
426
+ }
419
427
  }
420
- return this.entries.get(agentId) ?? null;
428
+ return null;
421
429
  }
422
- async resolveEntry(target, _item) {
430
+ async resolveEntry(ctx, target, _item) {
423
431
  if ("agentId" in target) {
424
432
  const existing = this.entries.get(target.agentId);
425
433
  if (existing) {
426
434
  if (existing.agent.state.state === "dead" || existing.terminating) {
427
435
  throw deadErrorBuild(target.agentId);
428
436
  }
437
+ if (existing.ctx.userId !== ctx.userId) {
438
+ throw new Error(`Cannot post to agent from another user: ${target.agentId}`);
439
+ }
429
440
  return existing;
430
441
  }
431
442
  const restored = await this.restoreAgent(target.agentId, { allowSleeping: true });
432
443
  if (restored) {
444
+ if (restored.ctx.userId !== ctx.userId) {
445
+ throw new Error(`Cannot post to agent from another user: ${target.agentId}`);
446
+ }
433
447
  return restored;
434
448
  }
435
449
  throw new Error(`Agent not found: ${target.agentId}`);
436
450
  }
437
451
  const descriptor = target.descriptor;
438
- const key = agentDescriptorCacheKey(descriptor);
452
+ const key = agentCacheKeyForCtx(ctx, descriptor);
439
453
  const existingAgentId = this.keyMap.get(key);
440
454
  if (existingAgentId) {
441
455
  const existing = this.entries.get(existingAgentId);
@@ -443,10 +457,16 @@ export class AgentSystem {
443
457
  if (existing.agent.state.state === "dead" || existing.terminating) {
444
458
  throw deadErrorBuild(existingAgentId);
445
459
  }
460
+ if (existing.ctx.userId !== ctx.userId) {
461
+ throw new Error(`Cannot resolve agent from another user: ${existingAgentId}`);
462
+ }
446
463
  return existing;
447
464
  }
448
465
  const restored = await this.restoreAgent(existingAgentId, { allowSleeping: true });
449
466
  if (restored) {
467
+ if (restored.ctx.userId !== ctx.userId) {
468
+ throw new Error(`Cannot resolve agent from another user: ${existingAgentId}`);
469
+ }
450
470
  return restored;
451
471
  }
452
472
  }
@@ -456,10 +476,16 @@ export class AgentSystem {
456
476
  if (existing.agent.state.state === "dead" || existing.terminating) {
457
477
  throw deadErrorBuild(descriptor.id);
458
478
  }
479
+ if (existing.ctx.userId !== ctx.userId) {
480
+ throw new Error(`Cannot resolve agent from another user: ${descriptor.id}`);
481
+ }
459
482
  return existing;
460
483
  }
461
484
  const restored = await this.restoreAgent(descriptor.id, { allowSleeping: true });
462
485
  if (restored) {
486
+ if (restored.ctx.userId !== ctx.userId) {
487
+ throw new Error(`Cannot resolve agent from another user: ${descriptor.id}`);
488
+ }
463
489
  return restored;
464
490
  }
465
491
  }
@@ -469,12 +495,15 @@ export class AgentSystem {
469
495
  : descriptor;
470
496
  logger.debug(`event: Creating agent entry agentId=${agentId} type=${resolvedDescriptor.type}`);
471
497
  const inbox = new AgentInbox(agentId);
472
- const userId = await this.resolveUserIdForDescriptor(resolvedDescriptor);
473
- const userHome = this.userHomeForUserId(userId);
474
- const agent = await Agent.create(agentId, resolvedDescriptor, userId, inbox, this, userHome);
498
+ const userId = await this.resolveUserIdForDescriptor(ctx, resolvedDescriptor);
499
+ if (userId !== ctx.userId) {
500
+ throw new Error(`Cannot create agent for another user: ${agentId}`);
501
+ }
502
+ const createdCtx = contextForAgent({ userId, agentId });
503
+ const userHome = this.userHomeForCtx(createdCtx);
504
+ const agent = await Agent.create(createdCtx, resolvedDescriptor, inbox, this, userHome);
475
505
  const entry = this.registerEntry({
476
- agentId,
477
- userId,
506
+ ctx: createdCtx,
478
507
  descriptor: resolvedDescriptor,
479
508
  agent,
480
509
  inbox
@@ -484,8 +513,7 @@ export class AgentSystem {
484
513
  }
485
514
  registerEntry(input) {
486
515
  const entry = {
487
- agentId: input.agentId,
488
- userId: input.userId,
516
+ ctx: input.ctx,
489
517
  descriptor: input.descriptor,
490
518
  agent: input.agent,
491
519
  inbox: input.inbox,
@@ -493,21 +521,21 @@ export class AgentSystem {
493
521
  terminating: false,
494
522
  lock: new AsyncLock()
495
523
  };
496
- this.entries.set(input.agentId, entry);
497
- const key = agentDescriptorCacheKey(input.descriptor);
498
- this.keyMap.set(key, input.agentId);
524
+ this.entries.set(input.ctx.agentId, entry);
525
+ const key = agentCacheKeyForCtx(input.ctx, input.descriptor);
526
+ this.keyMap.set(key, input.ctx.agentId);
499
527
  return entry;
500
528
  }
501
529
  startEntryIfRunning(entry) {
502
530
  if (this.stage !== "running") {
503
- logger.debug(`skip: startEntryIfRunning skipped agentId=${entry.agentId} reason=stage:${this.stage}`);
531
+ logger.debug(`skip: startEntryIfRunning skipped agentId=${entry.ctx.agentId} reason=stage:${this.stage}`);
504
532
  return;
505
533
  }
506
534
  if (entry.running) {
507
- logger.debug(`skip: startEntryIfRunning skipped agentId=${entry.agentId} reason=already-running`);
535
+ logger.debug(`skip: startEntryIfRunning skipped agentId=${entry.ctx.agentId} reason=already-running`);
508
536
  return;
509
537
  }
510
- logger.debug(`start: startEntryIfRunning starting agentId=${entry.agentId} type=${entry.descriptor.type}`);
538
+ logger.debug(`start: startEntryIfRunning starting agentId=${entry.ctx.agentId} type=${entry.descriptor.type}`);
511
539
  entry.running = true;
512
540
  entry.agent.start();
513
541
  }
@@ -517,28 +545,28 @@ export class AgentSystem {
517
545
  woke = await this.wakeEntryIfSleeping(entry);
518
546
  const postedAt = Date.now();
519
547
  const generatedId = createId();
520
- await this.storage.inbox.insert(generatedId, entry.agentId, postedAt, item.type, inboxItemSerialize(item));
548
+ await this.storage.inbox.insert(generatedId, entry.ctx.agentId, postedAt, item.type, inboxItemSerialize(item));
521
549
  const queued = entry.inbox.post(item, completion, { id: generatedId, postedAt });
522
550
  if (queued.id !== generatedId) {
523
551
  // Message merge consumed the new row into an existing queue entry.
524
552
  await this.storage.inbox.delete(generatedId);
525
- await this.storage.inbox.insert(queued.id, entry.agentId, queued.postedAt, queued.item.type, inboxItemSerialize(queued.item));
553
+ await this.storage.inbox.insert(queued.id, entry.ctx.agentId, queued.postedAt, queued.item.type, inboxItemSerialize(queued.item));
526
554
  }
527
555
  });
528
556
  if (woke) {
529
- await this.signalLifecycle(entry.agentId, "wake");
557
+ await this.signalLifecycle(entry.ctx.agentId, "wake");
530
558
  }
531
559
  }
532
560
  async replayPersistedInboxItems(entry) {
533
561
  await entry.lock.inLock(async () => {
534
- const rows = await this.storage.inbox.findByAgentId(entry.agentId);
562
+ const rows = await this.storage.inbox.findByAgentId(entry.ctx.agentId);
535
563
  for (const row of rows) {
536
564
  try {
537
565
  const item = inboxItemDeserialize(row.data);
538
566
  entry.inbox.post(item, null, { id: row.id, postedAt: row.postedAt, merge: false });
539
567
  }
540
568
  catch (error) {
541
- logger.warn({ agentId: entry.agentId, inboxItemId: row.id, error }, "restore: Dropping invalid persisted inbox row");
569
+ logger.warn({ agentId: entry.ctx.agentId, inboxItemId: row.id, error }, "restore: Dropping invalid persisted inbox row");
542
570
  await this.storage.inbox.delete(row.id);
543
571
  }
544
572
  }
@@ -548,12 +576,12 @@ export class AgentSystem {
548
576
  if (entry.agent.state.state !== "sleeping") {
549
577
  return false;
550
578
  }
551
- await this.cancelIdleSignal(entry.agentId);
552
- await this.cancelPoisonPill(entry.agentId, { descriptor: entry.descriptor });
579
+ await this.cancelIdleSignal(entry.ctx.agentId);
580
+ await this.cancelPoisonPill(entry.ctx.agentId, { descriptor: entry.descriptor });
553
581
  entry.agent.state.state = "active";
554
- await agentStateWrite(this.storage, entry.agentId, entry.agent.state);
555
- this.eventBus.emit("agent.woke", { agentId: entry.agentId });
556
- logger.debug({ agentId: entry.agentId }, "event: Agent woke from sleep");
582
+ await agentStateWrite(this.storage, entry.ctx, entry.agent.state);
583
+ this.eventBus.emit("agent.woke", { agentId: entry.ctx.agentId });
584
+ logger.debug({ agentId: entry.ctx.agentId }, "event: Agent woke from sleep");
557
585
  return true;
558
586
  }
559
587
  async scheduleIdleSignal(agentId) {
@@ -688,8 +716,12 @@ export class AgentSystem {
688
716
  let descriptor = null;
689
717
  let state = null;
690
718
  try {
691
- descriptor = await agentDescriptorRead(this.storage, agentId);
692
- state = await agentStateRead(this.storage, agentId);
719
+ const context = await this.contextForAgentId(agentId);
720
+ if (!context) {
721
+ return;
722
+ }
723
+ descriptor = await agentDescriptorRead(this.storage, context);
724
+ state = await agentStateRead(this.storage, context);
693
725
  }
694
726
  catch (error) {
695
727
  logger.warn({ agentId, error }, "error: Poison-pill read failed");
@@ -704,7 +736,11 @@ export class AgentSystem {
704
736
  await this.cancelPoisonPill(agentId, { descriptor });
705
737
  state.state = "dead";
706
738
  state.updatedAt = Date.now();
707
- await agentStateWrite(this.storage, agentId, state);
739
+ const context = await this.contextForAgentId(agentId);
740
+ if (!context) {
741
+ return;
742
+ }
743
+ await agentStateWrite(this.storage, context, state);
708
744
  await this.storage.inbox.deleteByAgentId(agentId);
709
745
  this.eventBus.emit("agent.dead", { agentId, reason: "poison-pill" });
710
746
  }
@@ -717,43 +753,45 @@ export class AgentSystem {
717
753
  pending = [];
718
754
  return;
719
755
  }
720
- await this.cancelIdleSignal(entry.agentId);
721
- await this.cancelPoisonPill(entry.agentId, { descriptor: entry.descriptor });
756
+ await this.cancelIdleSignal(entry.ctx.agentId);
757
+ await this.cancelPoisonPill(entry.ctx.agentId, { descriptor: entry.descriptor });
722
758
  entry.agent.state.state = "dead";
723
759
  entry.agent.state.updatedAt = Date.now();
724
- await agentStateWrite(this.storage, entry.agentId, entry.agent.state);
760
+ await agentStateWrite(this.storage, entry.ctx, entry.agent.state);
725
761
  pending = entry.inbox.drainPending();
726
- await this.storage.inbox.deleteByAgentId(entry.agentId);
762
+ await this.storage.inbox.deleteByAgentId(entry.ctx.agentId);
727
763
  changed = true;
728
764
  });
729
765
  if (!changed) {
730
766
  return;
731
767
  }
732
768
  entry.running = false;
733
- this.entries.delete(entry.agentId);
734
- const key = agentDescriptorCacheKey(entry.descriptor);
769
+ this.entries.delete(entry.ctx.agentId);
770
+ const key = agentCacheKeyForCtx(entry.ctx, entry.descriptor);
735
771
  this.keyMap.delete(key);
736
- const deadError = deadErrorBuild(entry.agentId);
772
+ const deadError = deadErrorBuild(entry.ctx.agentId);
737
773
  for (const queued of pending) {
738
774
  queued.completion?.reject(deadError);
739
775
  }
740
- this.eventBus.emit("agent.dead", { agentId: entry.agentId, reason });
776
+ this.eventBus.emit("agent.dead", { agentId: entry.ctx.agentId, reason });
741
777
  }
742
778
  async restoreAgent(agentId, options) {
743
779
  let descriptor = null;
744
780
  let state = null;
745
- let recordUserId = "";
781
+ let ctx = null;
746
782
  try {
747
- descriptor = await agentDescriptorRead(this.storage, agentId);
748
- state = await agentStateRead(this.storage, agentId);
749
- const record = await this.storage.agents.findById(agentId);
750
- recordUserId = record?.userId ?? "";
783
+ ctx = await this.contextForAgentId(agentId);
784
+ if (!ctx) {
785
+ return null;
786
+ }
787
+ descriptor = await agentDescriptorRead(this.storage, ctx);
788
+ state = await agentStateRead(this.storage, ctx);
751
789
  }
752
790
  catch (error) {
753
791
  logger.warn({ agentId, error }, "error: Agent restore failed due to invalid persisted data");
754
792
  return null;
755
793
  }
756
- if (!descriptor || !state || !recordUserId) {
794
+ if (!descriptor || !state || !ctx) {
757
795
  return null;
758
796
  }
759
797
  if (state.state === "dead") {
@@ -763,11 +801,10 @@ export class AgentSystem {
763
801
  return null;
764
802
  }
765
803
  const inbox = new AgentInbox(agentId);
766
- const userHome = this.userHomeForUserId(recordUserId);
767
- const agent = Agent.restore(agentId, recordUserId, descriptor, state, inbox, this, userHome);
804
+ const userHome = this.userHomeForCtx(ctx);
805
+ const agent = Agent.restore(ctx, descriptor, state, inbox, this, userHome);
768
806
  const entry = this.registerEntry({
769
- agentId,
770
- userId: recordUserId,
807
+ ctx,
771
808
  descriptor,
772
809
  agent,
773
810
  inbox
@@ -777,23 +814,33 @@ export class AgentSystem {
777
814
  this.startEntryIfRunning(entry);
778
815
  return entry;
779
816
  }
780
- async resolveUserIdForDescriptor(descriptor) {
817
+ async resolveUserIdForDescriptor(ctx, descriptor) {
781
818
  if (descriptor.type === "user") {
782
819
  const connectorKey = userConnectorKeyCreate(descriptor.connector, descriptor.userId);
783
820
  return this.resolveUserIdForConnectorKey(connectorKey);
784
821
  }
785
- if (descriptor.type === "subagent" || descriptor.type === "app") {
822
+ if (descriptor.type === "subagent" || descriptor.type === "app" || descriptor.type === "memory-search") {
786
823
  const parent = await this.contextForAgentId(descriptor.parentAgentId);
787
824
  if (parent) {
788
825
  return parent.userId;
789
826
  }
790
- return this.ownerUserIdEnsure();
827
+ throw new Error("Parent agent not found");
828
+ }
829
+ if (descriptor.type === "memory-agent") {
830
+ const source = await this.contextForAgentId(descriptor.id);
831
+ if (source) {
832
+ return source.userId;
833
+ }
834
+ throw new Error("Source agent not found for memory-agent");
791
835
  }
792
836
  // Subuser gateway agents belong to the subuser — descriptor.id IS the subuser's userId
793
837
  if (descriptor.type === "subuser") {
794
838
  return descriptor.id;
795
839
  }
796
- return this.ownerUserIdEnsure();
840
+ if (descriptor.type === "system" || descriptor.type === "cron" || descriptor.type === "permanent") {
841
+ return ctx.userId;
842
+ }
843
+ throw new Error("Cannot resolve user for descriptor");
797
844
  }
798
845
  async resolveUserIdForConnectorKey(connectorKey) {
799
846
  try {
@@ -804,14 +851,14 @@ export class AgentSystem {
804
851
  }
805
852
  }
806
853
  catch (error) {
807
- logger.warn({ connectorKey, error }, "warn: Failed to resolve connector user; falling back to owner");
854
+ logger.warn({ connectorKey, error }, "warn: Failed to resolve connector user");
808
855
  }
809
- return this.ownerUserIdEnsure();
856
+ throw new Error("User not found for connector key");
810
857
  }
811
- async ownerUserIdEnsure() {
858
+ async ownerCtxEnsure() {
812
859
  const owner = await this.storage.users.findOwner();
813
860
  if (owner) {
814
- return owner.id;
861
+ return contextForUser({ userId: owner.id });
815
862
  }
816
863
  const now = Date.now();
817
864
  const ownerId = createId();
@@ -822,12 +869,12 @@ export class AgentSystem {
822
869
  createdAt: now,
823
870
  updatedAt: now
824
871
  });
825
- return ownerId;
872
+ return contextForUser({ userId: ownerId });
826
873
  }
827
874
  catch {
828
875
  const recovered = await this.storage.users.findOwner();
829
876
  if (recovered) {
830
- return recovered.id;
877
+ return contextForUser({ userId: recovered.id });
831
878
  }
832
879
  throw new Error("Failed to resolve owner user");
833
880
  }
@@ -839,6 +886,13 @@ export class AgentSystem {
839
886
  userHomeForUserId(userId) {
840
887
  return new UserHome(this.config.current.usersDir, userId);
841
888
  }
889
+ /**
890
+ * Resolves a UserHome facade from caller context.
891
+ * Expects: ctx.userId belongs to an existing or soon-to-be-created runtime user.
892
+ */
893
+ userHomeForCtx(ctx) {
894
+ return this.userHomeForUserId(ctx.userId);
895
+ }
842
896
  createCompletion() {
843
897
  let resolve = null;
844
898
  let reject = null;
@@ -858,6 +912,9 @@ export class AgentSystem {
858
912
  function lifecycleSignalTypeBuild(agentId, state) {
859
913
  return `agent:${agentId}:${state}`;
860
914
  }
915
+ function agentCacheKeyForCtx(ctx, descriptor) {
916
+ return `${ctx.userId}:${agentDescriptorCacheKey(descriptor)}`;
917
+ }
861
918
  function parsePoisonPillAgentId(signalType) {
862
919
  const parts = signalType.split(":");
863
920
  if (parts.length !== 3) {