@xopcai/xopc 0.0.145 → 0.0.147

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 (380) hide show
  1. package/README.md +2 -2
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/demo-memory/src/index.js +6 -4
  4. package/dist/extensions/demo-memory/src/index.js.map +1 -1
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/Combination-14nmIgxH.js +41 -0
  7. package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BEUxdhZx.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
  9. package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
  10. package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.js → appearance-settings-C6iMpwOM.js} +1 -1
  13. package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.js → block-editor-Bw72pO7S.js} +31 -31
  20. package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
  21. package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
  22. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-BVFNT2zW.js → connector-logo-DIMP4NWY.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
  31. package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
  32. package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
  33. package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
  34. package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
  35. package/dist/gateway/static/root/assets/{extension-page-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.js → gateway-settings-BvndV7TP.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goal-create-dialog-C4Kw0mfS.js → goal-create-dialog-DrVHKXHq.js} +1 -1
  41. package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
  42. package/dist/gateway/static/root/assets/{goals-config-api-B0jm5JaA.js → goals-config-api-B6YJB_ct.js} +1 -1
  43. package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
  44. package/dist/gateway/static/root/assets/{goals-settings-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.js → heartbeat-settings-CoCwIOIg.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
  47. package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
  48. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
  50. package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
  51. package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
  53. package/dist/gateway/static/root/assets/{markdown-split-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.js → media-plugins-3Lxliy9D.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
  56. package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
  57. package/dist/gateway/static/root/assets/{notes-page-BgLyndCO.js → notes-page-BJtT4vSf.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
  64. package/dist/gateway/static/root/assets/{save-bar-controls-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.js → schema-form-Dhv-SmjG.js} +1 -1
  67. package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-collapsible-section-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.js → settings-page-layout-DaFwstQw.js} +1 -1
  74. package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-BOhlPsS1.js → share-preview-page-Bi00uXzV.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-CWxSvuwD.js → system-settings-panel-Cxaph7hW.js} +1 -1
  80. package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
  81. package/dist/gateway/static/root/assets/{typed-models-lib-qROAvqTw.js → typed-models-lib-CcZ_tyFY.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
  83. package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
  84. package/dist/gateway/static/root/assets/{user-profile-fields-editor-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
  85. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
  86. package/dist/gateway/static/root/assets/{utils-D53uRXVr.js → utils-CiZK2KwH.js} +1 -1
  87. package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
  88. package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
  89. package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D_x9ELJp.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
  92. package/dist/gateway/static/root/index.html +10 -9
  93. package/dist/package.js +1 -1
  94. package/dist/src/activity/types.d.ts +1 -1
  95. package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
  96. package/dist/src/agent/agent-manager.d.ts +1 -1
  97. package/dist/src/agent/agent-manager.js +5 -4
  98. package/dist/src/agent/agent-manager.js.map +1 -1
  99. package/dist/src/agent/background-review/coordinator.js +0 -1
  100. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  101. package/dist/src/agent/background-review/settings.d.ts +1 -1
  102. package/dist/src/agent/background-review/settings.js +10 -17
  103. package/dist/src/agent/background-review/settings.js.map +1 -1
  104. package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
  105. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  106. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  107. package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
  108. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  109. package/dist/src/agent/code-intelligence/binary.js +1 -1
  110. package/dist/src/agent/context/project-context.d.ts +14 -0
  111. package/dist/src/agent/context/project-context.js +23 -1
  112. package/dist/src/agent/context/project-context.js.map +1 -1
  113. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  114. package/dist/src/agent/context/workspace.d.ts +1 -2
  115. package/dist/src/agent/context/workspace.js +2 -4
  116. package/dist/src/agent/context/workspace.js.map +1 -1
  117. package/dist/src/agent/embedded/run-for-session.js +1 -2
  118. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  119. package/dist/src/agent/embedded/run-turn.js +6 -1
  120. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  121. package/dist/src/agent/embedded/types.d.ts +17 -0
  122. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
  123. package/dist/src/agent/memory/builtin-memory-store.js +2 -2
  124. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  125. package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
  126. package/dist/src/agent/memory/builtin-provider.js +21 -48
  127. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  128. package/dist/src/agent/memory/context/planner.js +48 -9
  129. package/dist/src/agent/memory/context/planner.js.map +1 -1
  130. package/dist/src/agent/memory/context/types.d.ts +7 -1
  131. package/dist/src/agent/memory/context-fence.js +1 -1
  132. package/dist/src/agent/memory/context-fence.js.map +1 -1
  133. package/dist/src/agent/memory/create-memory-manager.js +2 -9
  134. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  135. package/dist/src/agent/memory/dreaming/config.js +5 -10
  136. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
  138. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
  139. package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
  140. package/dist/src/agent/memory/dreaming/scope.js +8 -8
  141. package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
  142. package/dist/src/agent/memory/manager.d.ts +1 -5
  143. package/dist/src/agent/memory/manager.js +2 -23
  144. package/dist/src/agent/memory/manager.js.map +1 -1
  145. package/dist/src/agent/memory/memory-config.d.ts +3 -3
  146. package/dist/src/agent/memory/memory-config.js +9 -14
  147. package/dist/src/agent/memory/memory-config.js.map +1 -1
  148. package/dist/src/agent/memory/types.d.ts +9 -5
  149. package/dist/src/agent/memory/understanding/service.js +21 -8
  150. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  151. package/dist/src/agent/memory/understanding/types.d.ts +5 -0
  152. package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
  153. package/dist/src/agent/memory/user-context-coordinator.js +6 -2
  154. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  155. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
  156. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  157. package/dist/src/agent/prompt/memory/index.d.ts +1 -2
  158. package/dist/src/agent/prompt/memory/index.js +6 -7
  159. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  161. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  162. package/dist/src/agent/service/direct-turn-helpers.js +13 -2
  163. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  164. package/dist/src/agent/tools/curated-memory-tool.js +4 -4
  165. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  166. package/dist/src/agent/tools/factory.d.ts +1 -1
  167. package/dist/src/agent/tools/factory.js +2 -2
  168. package/dist/src/agent/tools/factory.js.map +1 -1
  169. package/dist/src/agent/tools/memory-tool.js +1 -1
  170. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  171. package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
  172. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  173. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
  174. package/dist/src/agent/workspace-runtime/registry.js +6 -11
  175. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  176. package/dist/src/agent-manifest/index.js +2 -2
  177. package/dist/src/agent-manifest/prompt.js +1 -7
  178. package/dist/src/agent-manifest/prompt.js.map +1 -1
  179. package/dist/src/agent-manifest/schema.d.ts +0 -598
  180. package/dist/src/agent-manifest/schema.js +2 -143
  181. package/dist/src/agent-manifest/schema.js.map +1 -1
  182. package/dist/src/agent-manifest/validator.js +0 -12
  183. package/dist/src/agent-manifest/validator.js.map +1 -1
  184. package/dist/src/agent-runtime/index.js +1 -1
  185. package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
  186. package/dist/src/agent-runtime/memory-runtime.js +8 -7
  187. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  188. package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
  189. package/dist/src/agent-runtime/runtime-profile.js +2 -2
  190. package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
  191. package/dist/src/chat-commands/agent-edit.js +1 -2
  192. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  193. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  194. package/dist/src/cli/commands/init.js +0 -22
  195. package/dist/src/cli/commands/init.js.map +1 -1
  196. package/dist/src/cli/templates.d.ts +1 -1
  197. package/dist/src/cli/templates.js +1 -16
  198. package/dist/src/cli/templates.js.map +1 -1
  199. package/dist/src/commands/agents.config.js +0 -10
  200. package/dist/src/commands/agents.config.js.map +1 -1
  201. package/dist/src/config/agent-profile.js +1 -1
  202. package/dist/src/config/index.js +2 -2
  203. package/dist/src/config/paths.d.ts +0 -1
  204. package/dist/src/config/paths.js +1 -2
  205. package/dist/src/config/paths.js.map +1 -1
  206. package/dist/src/config/schema.d.ts +118 -532
  207. package/dist/src/config/schema.js +32 -26
  208. package/dist/src/config/schema.js.map +1 -1
  209. package/dist/src/extensions/loader.js +2 -1
  210. package/dist/src/extensions/loader.js.map +1 -1
  211. package/dist/src/gateway/agents-admin.d.ts +0 -2
  212. package/dist/src/gateway/agents-admin.js +1 -7
  213. package/dist/src/gateway/agents-admin.js.map +1 -1
  214. package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
  215. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  216. package/dist/src/gateway/chat-stream/mapper.js +26 -0
  217. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  218. package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
  219. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
  220. package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
  221. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  222. package/dist/src/gateway/heartbeat/service.js +1 -1
  223. package/dist/src/gateway/hono/app.js +3 -1
  224. package/dist/src/gateway/hono/app.js.map +1 -1
  225. package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
  226. package/dist/src/gateway/hono/lib/config-payload.js +0 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/routes/agents.js +6 -12
  229. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
  231. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
  233. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/dreaming.js +9 -20
  235. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/index.js +4 -0
  237. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
  239. package/dist/src/gateway/hono/routes/local-apps.js +99 -0
  240. package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
  241. package/dist/src/gateway/hono/routes/memory.js +48 -65
  242. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  243. package/dist/src/gateway/hono/routes/projects.js +2 -2
  244. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
  246. package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
  247. package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
  248. package/dist/src/gateway/hono/routes/you.d.ts +3 -0
  249. package/dist/src/gateway/hono/routes/you.js +358 -91
  250. package/dist/src/gateway/hono/routes/you.js.map +1 -1
  251. package/dist/src/gateway/service.d.ts +3 -0
  252. package/dist/src/gateway/service.js +12 -0
  253. package/dist/src/gateway/service.js.map +1 -1
  254. package/dist/src/heartbeat/index.js +1 -1
  255. package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
  256. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
  257. package/dist/src/local-apps/acceptance.d.ts +30 -0
  258. package/dist/src/local-apps/acceptance.js +93 -0
  259. package/dist/src/local-apps/acceptance.js.map +1 -0
  260. package/dist/src/local-apps/index.d.ts +5 -0
  261. package/dist/src/local-apps/index.js +4 -0
  262. package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
  263. package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
  264. package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
  265. package/dist/src/local-apps/runtime-entry.d.ts +8 -0
  266. package/dist/src/local-apps/runtime-entry.js +25 -0
  267. package/dist/src/local-apps/runtime-entry.js.map +1 -0
  268. package/dist/src/local-apps/scaffold.d.ts +8 -0
  269. package/dist/src/local-apps/scaffold.js +122 -0
  270. package/dist/src/local-apps/scaffold.js.map +1 -0
  271. package/dist/src/local-apps/service.d.ts +37 -0
  272. package/dist/src/local-apps/service.js +553 -0
  273. package/dist/src/local-apps/service.js.map +1 -0
  274. package/dist/src/local-apps/store.d.ts +44 -0
  275. package/dist/src/local-apps/store.js +195 -0
  276. package/dist/src/local-apps/store.js.map +1 -0
  277. package/dist/src/local-apps/types.d.ts +105 -0
  278. package/dist/src/local-apps/types.js +1 -0
  279. package/dist/src/storage/sqlite/index.d.ts +3 -2
  280. package/dist/src/storage/sqlite/index.js +4 -3
  281. package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
  282. package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
  283. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  284. package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
  285. package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
  286. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  287. package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
  288. package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
  289. package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
  290. package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
  291. package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
  292. package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
  293. package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
  294. package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
  295. package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
  296. package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
  297. package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -0
  298. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  299. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  300. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  301. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  302. package/dist/src/storage/sqlite/schema.js +1 -1
  303. package/dist/src/storage/sqlite/schema.sql +20 -0
  304. package/dist/src/user-context/config.d.ts +227 -0
  305. package/dist/src/user-context/config.js +158 -0
  306. package/dist/src/user-context/config.js.map +1 -0
  307. package/dist/src/user-context/import.d.ts +1 -1
  308. package/dist/src/user-context/import.js +6 -1
  309. package/dist/src/user-context/import.js.map +1 -1
  310. package/dist/src/user-context/owner.d.ts +5 -0
  311. package/dist/src/user-context/owner.js +9 -0
  312. package/dist/src/user-context/owner.js.map +1 -0
  313. package/dist/src/user-context/projection.d.ts +11 -9
  314. package/dist/src/user-context/projection.js +74 -47
  315. package/dist/src/user-context/projection.js.map +1 -1
  316. package/dist/src/user-context/runtime.d.ts +13 -0
  317. package/dist/src/user-context/runtime.js +36 -0
  318. package/dist/src/user-context/runtime.js.map +1 -0
  319. package/dist/src/work-discovery/analyzer.d.ts +11 -0
  320. package/dist/src/work-discovery/analyzer.js +171 -0
  321. package/dist/src/work-discovery/analyzer.js.map +1 -0
  322. package/dist/src/work-discovery/index.d.ts +5 -0
  323. package/dist/src/work-discovery/index.js +5 -0
  324. package/dist/src/work-discovery/probe.d.ts +12 -0
  325. package/dist/src/work-discovery/probe.js +335 -0
  326. package/dist/src/work-discovery/probe.js.map +1 -0
  327. package/dist/src/work-discovery/repository.d.ts +11 -0
  328. package/dist/src/work-discovery/repository.js +100 -0
  329. package/dist/src/work-discovery/repository.js.map +1 -0
  330. package/dist/src/work-discovery/service.d.ts +30 -0
  331. package/dist/src/work-discovery/service.js +387 -0
  332. package/dist/src/work-discovery/service.js.map +1 -0
  333. package/dist/src/work-discovery/types.d.ts +114 -0
  334. package/dist/src/work-discovery/types.js +1 -0
  335. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  336. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  337. package/package.json +5 -3
  338. package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
  339. package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
  340. package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
  341. package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
  342. package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
  343. package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
  344. package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
  345. package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
  346. package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
  347. package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
  348. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
  349. package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
  350. package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
  351. package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
  352. package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
  353. package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
  354. package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
  355. package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
  356. package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
  357. package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
  358. package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
  359. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
  360. package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
  361. package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
  362. package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
  363. package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
  364. package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
  365. package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
  366. package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
  367. package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
  368. package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
  369. package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
  370. package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
  371. package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
  372. package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
  373. package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
  374. package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
  375. package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
  376. package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
  377. package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
  378. package/dist/src/agent/memory/access-policy.d.ts +0 -12
  379. package/dist/src/agent/memory/access-policy.js +0 -44
  380. package/dist/src/agent/memory/access-policy.js.map +0 -1
@@ -20,12 +20,12 @@ function parseCreateBody(raw) {
20
20
  description: typeof body.description === "string" ? body.description : void 0
21
21
  };
22
22
  if (Object.hasOwn(body, "version")) out.version = Number(body.version);
23
+ if (Object.hasOwn(body, "memory")) return { error: "memory is not a capability preset field" };
23
24
  for (const key of [
24
25
  "extends",
25
26
  "models",
26
27
  "tools",
27
28
  "skills",
28
- "memory",
29
29
  "workflows",
30
30
  "boundaries",
31
31
  "runtime",
@@ -45,12 +45,12 @@ function parseUpdateBody(raw) {
45
45
  if (Object.hasOwn(body, "name")) out.name = String(body.name ?? "");
46
46
  if (Object.hasOwn(body, "description")) out.description = body.description === null ? null : String(body.description ?? "");
47
47
  if (Object.hasOwn(body, "version")) out.version = Number(body.version);
48
+ if (Object.hasOwn(body, "memory")) return { error: "memory is not a capability preset field" };
48
49
  for (const key of [
49
50
  "extends",
50
51
  "models",
51
52
  "tools",
52
53
  "skills",
53
- "memory",
54
54
  "workflows",
55
55
  "boundaries",
56
56
  "runtime",
@@ -1 +1 @@
1
- {"version":3,"file":"capability-presets.js","names":[],"sources":["../../../../../src/gateway/hono/routes/capability-presets.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { CapabilityPresetSchema } from '../../../agent-manifest/schema.js';\nimport type { Config } from '../../../config/schema.js';\nimport {\n listCapabilityPresets,\n prepareCreateCapabilityPreset,\n prepareDeleteCapabilityPreset,\n prepareUpdateCapabilityPreset,\n type CreateCapabilityPresetBody,\n type UpdateCapabilityPresetBody,\n} from '../../capability-presets-admin.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseJsonObject(raw: unknown): Record<string, unknown> | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'body must be an object' };\n }\n return raw as Record<string, unknown>;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateBody(raw: unknown): CreateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: CreateCapabilityPresetBody = {\n id: typeof body.id === 'string' ? body.id : undefined,\n name: typeof body.name === 'string' ? body.name : undefined,\n description: typeof body.description === 'string' ? body.description : undefined,\n };\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n for (const key of ['extends', 'models', 'tools', 'skills', 'memory', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nfunction parseUpdateBody(raw: unknown): UpdateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: UpdateCapabilityPresetBody = {};\n if (Object.hasOwn(body, 'name')) out.name = String(body.name ?? '');\n if (Object.hasOwn(body, 'description')) {\n out.description = body.description === null ? null : String(body.description ?? '');\n }\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n for (const key of ['extends', 'models', 'tools', 'skills', 'memory', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n if (body[key] === null) {\n out[key] = null as never;\n continue;\n }\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nexport function registerCapabilityPresetsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/capability-presets', async (c) => {\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.post('/api/capability-presets', strictRateLimitMiddleware, async (c) => {\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseCreateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareCreateCapabilityPreset(service.currentConfig as Config, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({\n ok: true,\n payload: {\n presetId: prep.data.presetId,\n presets: listCapabilityPresets(service.currentConfig as Config),\n },\n });\n });\n\n authenticated.patch('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseUpdateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareUpdateCapabilityPreset(service.currentConfig as Config, id, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.delete('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const prep = prepareDeleteCapabilityPreset(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"capability-presets.js","names":[],"sources":["../../../../../src/gateway/hono/routes/capability-presets.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { CapabilityPresetSchema } from '../../../agent-manifest/schema.js';\nimport type { Config } from '../../../config/schema.js';\nimport {\n listCapabilityPresets,\n prepareCreateCapabilityPreset,\n prepareDeleteCapabilityPreset,\n prepareUpdateCapabilityPreset,\n type CreateCapabilityPresetBody,\n type UpdateCapabilityPresetBody,\n} from '../../capability-presets-admin.js';\nimport { normalizeAgentId } from '../../../agent/agent-scope.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction parseJsonObject(raw: unknown): Record<string, unknown> | { error: string } {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n return { error: 'body must be an object' };\n }\n return raw as Record<string, unknown>;\n}\n\nfunction isParseError(value: unknown): value is { error: string } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'error' in value &&\n typeof (value as { error: string }).error === 'string'\n );\n}\n\nfunction parseCreateBody(raw: unknown): CreateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: CreateCapabilityPresetBody = {\n id: typeof body.id === 'string' ? body.id : undefined,\n name: typeof body.name === 'string' ? body.name : undefined,\n description: typeof body.description === 'string' ? body.description : undefined,\n };\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n if (Object.hasOwn(body, 'memory')) return { error: 'memory is not a capability preset field' };\n for (const key of ['extends', 'models', 'tools', 'skills', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nfunction parseUpdateBody(raw: unknown): UpdateCapabilityPresetBody | { error: string } {\n const body = parseJsonObject(raw);\n if (isParseError(body)) return body;\n const out: UpdateCapabilityPresetBody = {};\n if (Object.hasOwn(body, 'name')) out.name = String(body.name ?? '');\n if (Object.hasOwn(body, 'description')) {\n out.description = body.description === null ? null : String(body.description ?? '');\n }\n if (Object.hasOwn(body, 'version')) out.version = Number(body.version);\n if (Object.hasOwn(body, 'memory')) return { error: 'memory is not a capability preset field' };\n for (const key of ['extends', 'models', 'tools', 'skills', 'workflows', 'boundaries', 'runtime', 'locks'] as const) {\n if (!Object.hasOwn(body, key)) continue;\n if (body[key] === null) {\n out[key] = null as never;\n continue;\n }\n const parsed = CapabilityPresetSchema.pick({ [key]: true } as Record<typeof key, true>).safeParse({\n [key]: body[key],\n });\n if (!parsed.success) {\n return { error: `${key} ${parsed.error.issues[0]?.message ?? 'is invalid'}` };\n }\n out[key] = parsed.data[key] as never;\n }\n return out;\n}\n\nexport function registerCapabilityPresetsRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n authenticated.get('/api/capability-presets', async (c) => {\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.post('/api/capability-presets', strictRateLimitMiddleware, async (c) => {\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseCreateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareCreateCapabilityPreset(service.currentConfig as Config, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({\n ok: true,\n payload: {\n presetId: prep.data.presetId,\n presets: listCapabilityPresets(service.currentConfig as Config),\n },\n });\n });\n\n authenticated.patch('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n let raw: unknown;\n try {\n raw = await c.req.json();\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON' } }, 400);\n }\n const body = parseUpdateBody(raw);\n if (isParseError(body)) {\n return c.json({ ok: false, error: { message: body.error } }, 400);\n }\n const prep = prepareUpdateCapabilityPreset(service.currentConfig as Config, id, body);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n\n authenticated.delete('/api/capability-presets/:id', strictRateLimitMiddleware, async (c) => {\n const id = normalizeAgentId(c.req.param('id') ?? '');\n const prep = prepareDeleteCapabilityPreset(service.currentConfig as Config, id);\n if (prep.ok === false) {\n return c.json({ ok: false, error: { message: prep.error } }, prep.status ?? 400);\n }\n const save = await service.saveConfig(prep.data.nextConfig);\n if (!save.saved) {\n return c.json({ ok: false, error: { message: save.error ?? 'save failed' } }, 500);\n }\n return c.json({ ok: true, payload: listCapabilityPresets(service.currentConfig as Config) });\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { init_agent_scope, normalizeAgentId, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
2
1
  import { DREAMING_DIR_RELATIVE, DREAMING_LAST_RUN_RELATIVE, SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../../../agent/memory/dreaming/constants.js";
3
2
  import { clearStaleDreamingLock, loadDreamingStore, resetDreamingStore } from "../../../agent/memory/dreaming/short-term-store.js";
4
3
  import { resolveDreamingAgentScope } from "../../../agent/memory/dreaming/scope.js";
@@ -11,21 +10,11 @@ import { previewDreamingDeepPromotion } from "../../../agent/memory/dreaming/pre
11
10
  import path from "node:path";
12
11
  import fs from "node:fs/promises";
13
12
  //#region src/gateway/hono/routes/dreaming.ts
14
- init_agent_scope();
15
13
  function isRecord(v) {
16
14
  return v !== null && typeof v === "object" && !Array.isArray(v);
17
15
  }
18
- function requestedAgentIdFrom(c, body) {
19
- return (isRecord(body) && typeof body.agentId === "string" ? body.agentId : void 0) ?? c.req.query("agentId");
20
- }
21
- function hasEnabledAgent(cfg, agentId) {
22
- const normalized = normalizeAgentId(agentId);
23
- return cfg.agents.list.some((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === normalized);
24
- }
25
- function resolveRouteScope(cfg, requestedAgentId) {
26
- const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(cfg));
27
- if (!hasEnabledAgent(cfg, agentId)) throw new Error(`Agent not found: ${agentId}`);
28
- return resolveDreamingAgentScope(cfg, agentId);
16
+ function resolveRouteScope(cfg) {
17
+ return resolveDreamingAgentScope(cfg);
29
18
  }
30
19
  async function readLockInfo(dreamingRoot) {
31
20
  const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);
@@ -115,7 +104,7 @@ function registerDreamingRoutes(authenticated, deps) {
115
104
  const cfg = service.currentConfig;
116
105
  let scope;
117
106
  try {
118
- scope = resolveRouteScope(cfg, c.req.query("agentId"));
107
+ scope = resolveRouteScope(cfg);
119
108
  } catch (err) {
120
109
  const message = err instanceof Error ? err.message : String(err);
121
110
  return c.json({
@@ -151,7 +140,7 @@ function registerDreamingRoutes(authenticated, deps) {
151
140
  const cfg = service.currentConfig;
152
141
  let scope;
153
142
  try {
154
- scope = resolveRouteScope(cfg, c.req.query("agentId"));
143
+ scope = resolveRouteScope(cfg);
155
144
  } catch (err) {
156
145
  const message = err instanceof Error ? err.message : String(err);
157
146
  return c.json({
@@ -187,7 +176,7 @@ function registerDreamingRoutes(authenticated, deps) {
187
176
  const cfg = service.currentConfig;
188
177
  let scope;
189
178
  try {
190
- scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));
179
+ scope = resolveRouteScope(cfg);
191
180
  } catch (err) {
192
181
  const message = err instanceof Error ? err.message : String(err);
193
182
  return c.json({
@@ -215,14 +204,14 @@ function registerDreamingRoutes(authenticated, deps) {
215
204
  workspaceDir: scope.workspaceDir,
216
205
  dreamingRoot: scope.memoriesDir,
217
206
  config: dreaming.phases.rem,
218
- sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,
207
+ sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,
219
208
  promotionWritePolicy: dreaming.promotionWritePolicy.decision
220
209
  }) : await runDreamingDeepPromotion({
221
210
  agentId: scope.agentId,
222
211
  workspaceDir: scope.workspaceDir,
223
212
  dreamingRoot: scope.memoriesDir,
224
213
  config: dreaming.phases.deep,
225
- sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy
214
+ sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy
226
215
  });
227
216
  service.emit("dreaming.phase.end", {
228
217
  agentId: scope.agentId,
@@ -264,7 +253,7 @@ function registerDreamingRoutes(authenticated, deps) {
264
253
  const action = isRecord(body) && typeof body.action === "string" ? body.action.trim() : "";
265
254
  let scope;
266
255
  try {
267
- scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));
256
+ scope = resolveRouteScope(cfg);
268
257
  } catch (err) {
269
258
  const message = err instanceof Error ? err.message : String(err);
270
259
  return c.json({
@@ -310,7 +299,7 @@ function registerDreamingRoutes(authenticated, deps) {
310
299
  const cfg = service.currentConfig;
311
300
  let scope;
312
301
  try {
313
- scope = resolveRouteScope(cfg, c.req.query("agentId"));
302
+ scope = resolveRouteScope(cfg);
314
303
  } catch (err) {
315
304
  const message = err instanceof Error ? err.message : String(err);
316
305
  return c.json({
@@ -1 +1 @@
1
- {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport { normalizeAgentId, resolveDefaultAgentId } from '../../../agent/agent-scope.js';\nimport {\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { runLightSweep } from '../../../agent/memory/dreaming/light-sweep.js';\nimport { runDreamingDeepPromotion } from '../../../agent/memory/dreaming/deep-promotion.js';\nimport { runRemPatterns } from '../../../agent/memory/dreaming/rem-patterns.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport { resolveDreamingAgentScope, type DreamingAgentScope } from '../../../agent/memory/dreaming/scope.js';\nimport {\n clearStaleDreamingLock,\n loadDreamingStore,\n resetDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction requestedAgentIdFrom(c: { req: { query(name: string): string | undefined } }, body?: unknown): string | undefined {\n const fromBody = isRecord(body) && typeof body.agentId === 'string' ? body.agentId : undefined;\n return fromBody ?? c.req.query('agentId');\n}\n\nfunction hasEnabledAgent(cfg: Config, agentId: string): boolean {\n const normalized = normalizeAgentId(agentId);\n return cfg.agents.list.some((agent) => agent.enabled !== false && normalizeAgentId(agent.id) === normalized);\n}\n\nfunction resolveRouteScope(cfg: Config, requestedAgentId?: string): DreamingAgentScope {\n const agentId = normalizeAgentId(requestedAgentId || resolveDefaultAgentId(cfg));\n if (!hasEnabledAgent(cfg, agentId)) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n return resolveDreamingAgentScope(cfg, agentId);\n}\n\nasync function readLockInfo(dreamingRoot: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n dreamingRoot: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(dreamingRoot, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n dreamingRoot: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(dreamingRoot, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const { store } = await loadDreamingStore({ dreamingRoot: scope.memoriesDir });\n const lock = await readLockInfo(scope.memoriesDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(scope.memoriesDir),\n readPhaseLastRun(scope.memoriesDir, 'last-run-light.json'),\n readPhaseLastRun(scope.memoriesDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n agentId: scope.agentId,\n memory: scope.memory,\n workspaceDir: scope.workspaceDir,\n memoriesDir: scope.memoriesDir,\n config: scope.config,\n storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE),\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: scope.config.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const dreaming = scope.config;\n if (!dreaming.enabled || !dreaming.phases[requestedPhase].enabled) {\n return c.json({\n ok: false,\n error: { message: `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.` },\n }, 400);\n }\n\n try {\n service.emit('dreaming.phase.start', {\n agentId: scope.agentId,\n phase: requestedPhase,\n timestamp: new Date().toISOString(),\n });\n\n const result =\n requestedPhase === 'light'\n ? await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.light,\n })\n : requestedPhase === 'rem'\n ? await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.rem,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n promotionWritePolicy: dreaming.promotionWritePolicy.decision,\n })\n : await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.deep,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n });\n\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: true,\n timestamp: new Date().toISOString(),\n });\n\n return c.json({ ok: true, payload: { agentId: scope.agentId, phase: requestedPhase, result } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: false,\n error: em,\n timestamp: new Date().toISOString(),\n });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, requestedAgentIdFrom(c, body));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n await resetDreamingStore({ dreamingRoot: scope.memoriesDir });\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, reset: true, storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE) },\n });\n }\n\n const lockPath = path.join(scope.memoriesDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const cleared = await clearStaleDreamingLock(scope.memoriesDir);\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, cleared, lockPath },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 409);\n }\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg, c.req.query('agentId'));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(scope.memoriesDir, limit);\n return c.json({ ok: true, payload: { agentId: scope.agentId, events } });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dreaming.js","names":[],"sources":["../../../../../src/gateway/hono/routes/dreaming.ts"],"sourcesContent":["import type { Hono } from 'hono';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { type Config } from '../../../config/schema.js';\nimport {\n DREAMING_DIR_RELATIVE,\n DREAMING_LAST_RUN_RELATIVE,\n SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n SHORT_TERM_RECALL_STORE_RELATIVE,\n type DreamingPhaseId,\n} from '../../../agent/memory/dreaming/constants.js';\nimport { readDreamingEvents } from '../../../agent/memory/dreaming/events.js';\nimport { previewDreamingDeepPromotion } from '../../../agent/memory/dreaming/preview.js';\nimport { runLightSweep } from '../../../agent/memory/dreaming/light-sweep.js';\nimport { runDreamingDeepPromotion } from '../../../agent/memory/dreaming/deep-promotion.js';\nimport { runRemPatterns } from '../../../agent/memory/dreaming/rem-patterns.js';\nimport { parseDreamingLastRunFile, type DreamingDeepLastRun } from '../../../agent/memory/dreaming/last-run.js';\nimport { resolveDreamingAgentScope, type DreamingAgentScope } from '../../../agent/memory/dreaming/scope.js';\nimport {\n clearStaleDreamingLock,\n loadDreamingStore,\n resetDreamingStore,\n type DreamingStore,\n} from '../../../agent/memory/dreaming/short-term-store.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction resolveRouteScope(cfg: Config): DreamingAgentScope {\n return resolveDreamingAgentScope(cfg);\n}\n\nasync function readLockInfo(dreamingRoot: string): Promise<\n | { locked: false }\n | { locked: true; path: string; content: string; mtimeMs?: number }\n> {\n const lockPath = path.join(dreamingRoot, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const [content, st] = await Promise.all([fs.readFile(lockPath, 'utf-8'), fs.stat(lockPath)]);\n return {\n locked: true,\n path: SHORT_TERM_PROMOTION_LOCK_RELATIVE,\n content: content.trim(),\n mtimeMs: st.mtimeMs,\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { locked: false };\n return { locked: true, path: SHORT_TERM_PROMOTION_LOCK_RELATIVE, content: 'unknown', mtimeMs: undefined };\n }\n}\n\nasync function readLastRun(\n dreamingRoot: string,\n): Promise<\n | { exists: false }\n | {\n exists: true;\n path: string;\n raw: unknown;\n record: DreamingDeepLastRun | null;\n parseError: string | null;\n }\n> {\n const fullPath = path.join(dreamingRoot, DREAMING_LAST_RUN_RELATIVE);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n let raw: unknown;\n try {\n raw = JSON.parse(text) as unknown;\n } catch (parseErr) {\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: parseErr instanceof Error ? parseErr.message : String(parseErr),\n };\n }\n const record = parseDreamingLastRunFile(raw);\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw,\n record,\n parseError: record ? null : 'Invalid or unsupported last-run.json (expected v2 deep record).',\n };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return {\n exists: true,\n path: DREAMING_LAST_RUN_RELATIVE,\n raw: null,\n record: null,\n parseError: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nasync function readPhaseLastRun(\n dreamingRoot: string,\n filename: string,\n): Promise<{ exists: false } | { exists: true; path: string; raw: unknown }> {\n const relPath = path.join(DREAMING_DIR_RELATIVE, filename);\n const fullPath = path.join(dreamingRoot, relPath);\n try {\n const text = await fs.readFile(fullPath, 'utf-8');\n const raw = JSON.parse(text) as unknown;\n return { exists: true, path: relPath, raw };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException | undefined)?.code;\n if (code === 'ENOENT') return { exists: false };\n return { exists: false };\n }\n}\n\nfunction storeStats(store: DreamingStore): {\n version: number;\n updatedAt: string;\n entryCount: number;\n promotedCount: number;\n lastPromotedAt: string | null;\n} {\n const entries = Object.values(store.entries ?? {});\n const promoted = entries.filter((e) => typeof e.promotedAt === 'string' && e.promotedAt.trim());\n const lastPromotedAt = promoted\n .map((e) => e.promotedAt!)\n .sort((a, b) => (a < b ? 1 : a > b ? -1 : 0))[0];\n return {\n version: store.version,\n updatedAt: store.updatedAt,\n entryCount: entries.length,\n promotedCount: promoted.length,\n lastPromotedAt: lastPromotedAt ?? null,\n };\n}\n\nexport function registerDreamingRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service } = deps;\n\n authenticated.get('/api/dreaming', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const { store } = await loadDreamingStore({ dreamingRoot: scope.memoriesDir });\n const lock = await readLockInfo(scope.memoriesDir);\n\n // Read all three phase last-run files in parallel.\n const [lastRun, lightLastRun, remLastRun] = await Promise.all([\n readLastRun(scope.memoriesDir),\n readPhaseLastRun(scope.memoriesDir, 'last-run-light.json'),\n readPhaseLastRun(scope.memoriesDir, 'last-run-rem.json'),\n ]);\n\n return c.json({\n ok: true,\n payload: {\n agentId: scope.agentId,\n memory: scope.memory,\n workspaceDir: scope.workspaceDir,\n memoriesDir: scope.memoriesDir,\n config: scope.config,\n storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE),\n store: storeStats(store),\n lock,\n lastRun,\n lightLastRun,\n remLastRun,\n },\n });\n });\n\n authenticated.get('/api/dreaming/preview', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Number(rawLimit) : 20;\n\n const preview = await previewDreamingDeepPromotion({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: scope.config.deep,\n limit: Number.isFinite(limit) ? limit : 20,\n });\n\n return c.json({ ok: true, payload: preview });\n });\n\n authenticated.post('/api/dreaming/run', async (c) => {\n let body: unknown;\n try { body = await c.req.json(); } catch { body = {}; }\n const requestedPhase: DreamingPhaseId =\n isRecord(body) && typeof body.phase === 'string' && ['light', 'deep', 'rem'].includes(body.phase)\n ? (body.phase as DreamingPhaseId)\n : 'deep';\n\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n const dreaming = scope.config;\n if (!dreaming.enabled || !dreaming.phases[requestedPhase].enabled) {\n return c.json({\n ok: false,\n error: { message: `Dreaming ${requestedPhase} phase is disabled in config. Enable it first.` },\n }, 400);\n }\n\n try {\n service.emit('dreaming.phase.start', {\n agentId: scope.agentId,\n phase: requestedPhase,\n timestamp: new Date().toISOString(),\n });\n\n const result =\n requestedPhase === 'light'\n ? await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.light,\n })\n : requestedPhase === 'rem'\n ? await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.rem,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n promotionWritePolicy: dreaming.promotionWritePolicy.decision,\n })\n : await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: dreaming.phases.deep,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n });\n\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: true,\n timestamp: new Date().toISOString(),\n });\n\n return c.json({ ok: true, payload: { agentId: scope.agentId, phase: requestedPhase, result } });\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n service.emit('dreaming.phase.end', {\n agentId: scope.agentId,\n phase: requestedPhase,\n ok: false,\n error: em,\n timestamp: new Date().toISOString(),\n });\n return c.json({ ok: false, error: { message: em || 'Failed to trigger job' } }, 400);\n }\n });\n\n authenticated.post('/api/dreaming/action', async (c) => {\n const cfg = service.currentConfig as Config;\n\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n body = {};\n }\n const action = isRecord(body) && typeof body.action === 'string' ? body.action.trim() : '';\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n if (action !== 'reset_store' && action !== 'clear_lock') {\n return c.json({ ok: false, error: { message: 'Invalid action' } }, 400);\n }\n\n if (action === 'reset_store') {\n await resetDreamingStore({ dreamingRoot: scope.memoriesDir });\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, reset: true, storePath: path.join(scope.memoriesDir, SHORT_TERM_RECALL_STORE_RELATIVE) },\n });\n }\n\n const lockPath = path.join(scope.memoriesDir, SHORT_TERM_PROMOTION_LOCK_RELATIVE);\n try {\n const cleared = await clearStaleDreamingLock(scope.memoriesDir);\n return c.json({\n ok: true,\n payload: { agentId: scope.agentId, cleared, lockPath },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 409);\n }\n });\n\n authenticated.get('/api/dreaming/events', async (c) => {\n const cfg = service.currentConfig as Config;\n let scope: DreamingAgentScope;\n try {\n scope = resolveRouteScope(cfg);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return c.json({ ok: false, error: { message } }, 404);\n }\n\n const rawLimit = c.req.query('limit');\n const limit = rawLimit ? Math.min(Math.max(Number(rawLimit) || 50, 1), 200) : 50;\n\n const events = await readDreamingEvents(scope.memoriesDir, limit);\n return c.json({ ok: true, payload: { agentId: scope.agentId, events } });\n });\n}\n"],"mappings":"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"}
@@ -6,6 +6,8 @@ import { registerMemoryRoutes } from "./memory.js";
6
6
  import { registerProjectsRoutes } from "./projects.js";
7
7
  import { registerSearchRoutes } from "./search.js";
8
8
  import { registerMobileRoutes } from "./mobile.js";
9
+ import { registerLocalAppsRoutes } from "./local-apps.js";
10
+ import { registerWorkDiscoveryRoutes } from "./work-discovery.js";
9
11
  import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
10
12
  //#region src/gateway/hono/routes/index.ts
11
13
  function registerCoreAuthenticatedRoutes(authenticated, deps) {
@@ -15,6 +17,8 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
15
17
  registerMemoryRoutes(authenticated, deps);
16
18
  registerActivityRoutes(authenticated, deps);
17
19
  registerProjectsRoutes(authenticated, deps);
20
+ registerLocalAppsRoutes(authenticated, deps);
21
+ registerWorkDiscoveryRoutes(authenticated, deps);
18
22
  registerSearchRoutes(authenticated, deps);
19
23
  registerMobileRoutes(authenticated, deps);
20
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerActivityRoutes } from './activity.js';\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport { registerSearchRoutes } from './search.js';\nimport { registerMobileRoutes } from './mobile.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerActivityRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n registerSearchRoutes(authenticated, deps);\n registerMobileRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;AAC3C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,sBAAqB,eAAe,KAAK;;AAG3C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/gateway/hono/routes/index.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { registerActivityRoutes } from './activity.js';\nimport { registerAgentStreamRoutes } from './agent-stream.js';\nimport { registerSessionsRoutes } from './sessions.js';\nimport { registerStatusRoutes } from './status.js';\nimport { registerMemoryRoutes } from './memory.js';\nimport { registerProjectsRoutes } from './projects.js';\nimport { registerSearchRoutes } from './search.js';\nimport { registerMobileRoutes } from './mobile.js';\nimport { registerLocalAppsRoutes } from './local-apps.js';\nimport { registerWorkDiscoveryRoutes } from './work-discovery.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport {\n mountAppLazyRoutePrefixes,\n registerAuthenticatedLazyRouteFallback,\n} from './lazy-fallback.js';\n\nexport function registerCoreAuthenticatedRoutes(\n authenticated: Hono,\n deps: AuthenticatedRouteDeps,\n): void {\n registerStatusRoutes(authenticated, deps);\n registerAgentStreamRoutes(authenticated, deps);\n registerSessionsRoutes(authenticated, deps);\n registerMemoryRoutes(authenticated, deps);\n registerActivityRoutes(authenticated, deps);\n registerProjectsRoutes(authenticated, deps);\n registerLocalAppsRoutes(authenticated, deps);\n registerWorkDiscoveryRoutes(authenticated, deps);\n registerSearchRoutes(authenticated, deps);\n registerMobileRoutes(authenticated, deps);\n}\n\nexport function registerAuthenticatedRoutes(app: Hono, authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n registerCoreAuthenticatedRoutes(authenticated, deps);\n registerAuthenticatedLazyRouteFallback(authenticated, deps);\n mountAppLazyRoutePrefixes(app, { service: deps.service, deps });\n}\n\nexport type { AuthenticatedRouteDeps } from './deps.js';\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,gCACd,eACA,MACM;AACN,sBAAqB,eAAe,KAAK;AACzC,2BAA0B,eAAe,KAAK;AAC9C,wBAAuB,eAAe,KAAK;AAC3C,sBAAqB,eAAe,KAAK;AACzC,wBAAuB,eAAe,KAAK;AAC3C,wBAAuB,eAAe,KAAK;AAC3C,yBAAwB,eAAe,KAAK;AAC5C,6BAA4B,eAAe,KAAK;AAChD,sBAAqB,eAAe,KAAK;AACzC,sBAAqB,eAAe,KAAK;;AAG3C,SAAgB,4BAA4B,KAAW,eAAqB,MAAoC;AAC9G,iCAAgC,eAAe,KAAK;AACpD,wCAAuC,eAAe,KAAK;AAC3D,2BAA0B,KAAK;EAAE,SAAS,KAAK;EAAS;EAAM,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Hono } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ import type { GatewayService } from '../../service.js';
4
+ export declare function registerPublicLocalAppPreviewRoutes(app: Hono, service: GatewayService): void;
5
+ export declare function registerLocalAppsRoutes(app: Hono, deps: AuthenticatedRouteDeps): void;
@@ -0,0 +1,99 @@
1
+ import { readLocalAppAcceptanceConfig } from "../../../local-apps/acceptance.js";
2
+ import { extensionAssetMimeType } from "../lib/extension-assets.js";
3
+ import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
4
+ import { relative, resolve } from "node:path";
5
+ import { existsSync, readFileSync, statSync } from "node:fs";
6
+ //#region src/gateway/hono/routes/local-apps.ts
7
+ const LOCAL_APP_PREVIEW_CSP = `default-src 'self'; script-src 'self' 'sha256-${LOCAL_APP_RUNTIME_BRIDGE_HASH}'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; connect-src 'none'; frame-ancestors 'self'; frame-src 'none'; base-uri 'none'; object-src 'none'; form-action 'none'`;
8
+ function registerPublicLocalAppPreviewRoutes(app, service) {
9
+ app.get("/api/local-apps/preview/:token/*", (c) => {
10
+ const origin = c.req.header("origin");
11
+ const cors = { "Access-Control-Allow-Origin": origin === "null" ? "null" : origin || "*" };
12
+ const preview = service.localApps.resolvePreview(c.req.param("token"));
13
+ if (!preview) return c.json({ error: "Preview not found" }, 404, cors);
14
+ const prefix = `/api/local-apps/preview/${preview.previewToken}/`;
15
+ let assetPath = c.req.path.startsWith(prefix) ? c.req.path.slice(prefix.length) : "";
16
+ try {
17
+ assetPath = decodeURIComponent(assetPath);
18
+ } catch {
19
+ return c.json({ error: "Invalid asset path" }, 400, cors);
20
+ }
21
+ if (!assetPath || assetPath.includes("..")) return c.json({ error: "Invalid asset path" }, 400, cors);
22
+ const root = resolve(preview.uiRoot);
23
+ const fullPath = resolve(root, assetPath);
24
+ const rel = relative(root, fullPath);
25
+ if (rel.startsWith("..") || rel === "") return c.json({ error: "Path traversal denied" }, 403, cors);
26
+ if (!existsSync(fullPath) || !statSync(fullPath).isFile()) return c.json({ error: "Not found" }, 404, cors);
27
+ const mimeType = extensionAssetMimeType(assetPath);
28
+ const content = readFileSync(fullPath);
29
+ let textContent = null;
30
+ if (mimeType.startsWith("text/html")) {
31
+ let acceptance;
32
+ try {
33
+ acceptance = readLocalAppAcceptanceConfig(preview.uiRoot);
34
+ } catch {
35
+ acceptance = {
36
+ schemaVersion: 1,
37
+ scenarios: []
38
+ };
39
+ }
40
+ textContent = injectLocalAppRuntimeBridge(content.toString("utf8"), acceptance);
41
+ } else if (mimeType.startsWith("text/")) textContent = content.toString("utf8");
42
+ return new Response(textContent ?? new Uint8Array(content), { headers: {
43
+ "Content-Type": mimeType,
44
+ "Content-Security-Policy": LOCAL_APP_PREVIEW_CSP,
45
+ "Cache-Control": "no-store",
46
+ "X-Content-Type-Options": "nosniff",
47
+ ...cors
48
+ } });
49
+ });
50
+ }
51
+ function registerLocalAppsRoutes(app, deps) {
52
+ app.get("/api/local-apps", (c) => c.json({ apps: deps.service.localApps.list() }));
53
+ app.post("/api/local-apps", async (c) => {
54
+ const body = await c.req.json();
55
+ if (typeof body.name !== "string" || typeof body.idea !== "string") return c.json({ error: "name and idea are required" }, 400);
56
+ const appDetail = deps.service.localApps.create({
57
+ name: body.name,
58
+ idea: body.idea,
59
+ description: typeof body.description === "string" ? body.description : void 0
60
+ });
61
+ return c.json({ app: appDetail }, 201);
62
+ });
63
+ app.get("/api/local-apps/:id", (c) => {
64
+ const appDetail = deps.service.localApps.get(c.req.param("id"));
65
+ return appDetail ? c.json({ app: appDetail }) : c.json({ error: "Local app not found" }, 404);
66
+ });
67
+ app.post("/api/local-apps/:id/validate", (c) => {
68
+ return c.json({ validation: deps.service.localApps.validate(c.req.param("id")) });
69
+ });
70
+ app.post("/api/local-apps/:id/acceptance-runs", async (c) => {
71
+ const body = await c.req.json();
72
+ const acceptance = deps.service.localApps.recordAcceptance(c.req.param("id"), body);
73
+ return c.json({ acceptance }, 201);
74
+ });
75
+ app.post("/api/local-apps/:id/install", async (c) => {
76
+ const appDetail = await deps.service.localApps.install(c.req.param("id"));
77
+ return c.json({ app: appDetail });
78
+ });
79
+ app.post("/api/local-apps/:id/releases/:releaseId/rollback", async (c) => {
80
+ const appDetail = await deps.service.localApps.rollback(c.req.param("id"), c.req.param("releaseId"));
81
+ return c.json({ app: appDetail });
82
+ });
83
+ app.post("/api/local-apps/:id/enable", async (c) => {
84
+ const appDetail = await deps.service.localApps.setEnabled(c.req.param("id"), true);
85
+ return c.json({ app: appDetail });
86
+ });
87
+ app.post("/api/local-apps/:id/disable", async (c) => {
88
+ const appDetail = await deps.service.localApps.setEnabled(c.req.param("id"), false);
89
+ return c.json({ app: appDetail });
90
+ });
91
+ app.delete("/api/local-apps/:id/install", async (c) => {
92
+ const appDetail = await deps.service.localApps.uninstall(c.req.param("id"));
93
+ return c.json({ app: appDetail });
94
+ });
95
+ }
96
+ //#endregion
97
+ export { registerLocalAppsRoutes, registerPublicLocalAppPreviewRoutes };
98
+
99
+ //# sourceMappingURL=local-apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-apps.js","names":[],"sources":["../../../../../src/gateway/hono/routes/local-apps.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\n\nimport type { Hono } from 'hono';\n\nimport { extensionAssetMimeType } from '../lib/extension-assets.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\nimport type { GatewayService } from '../../service.js';\nimport {\n injectLocalAppRuntimeBridge,\n LOCAL_APP_RUNTIME_BRIDGE_HASH,\n} from '../../../local-apps/preview-runtime-bridge.js';\nimport { readLocalAppAcceptanceConfig } from '../../../local-apps/acceptance.js';\nimport type { RecordLocalAppAcceptanceInput } from '../../../local-apps/types.js';\n\nconst LOCAL_APP_PREVIEW_CSP =\n \"default-src 'self'; \" +\n `script-src 'self' 'sha256-${LOCAL_APP_RUNTIME_BRIDGE_HASH}'; ` +\n \"style-src 'self' 'unsafe-inline'; \" +\n \"img-src 'self' data: blob:; \" +\n \"connect-src 'none'; \" +\n \"frame-ancestors 'self'; \" +\n \"frame-src 'none'; \" +\n \"base-uri 'none'; \" +\n \"object-src 'none'; \" +\n \"form-action 'none'\";\n\nexport function registerPublicLocalAppPreviewRoutes(app: Hono, service: GatewayService): void {\n app.get('/api/local-apps/preview/:token/*', (c) => {\n const origin = c.req.header('origin');\n const cors = { 'Access-Control-Allow-Origin': origin === 'null' ? 'null' : origin || '*' } as const;\n const preview = service.localApps.resolvePreview(c.req.param('token'));\n if (!preview) return c.json({ error: 'Preview not found' }, 404, cors);\n const prefix = `/api/local-apps/preview/${preview.previewToken}/`;\n let assetPath = c.req.path.startsWith(prefix) ? c.req.path.slice(prefix.length) : '';\n try {\n assetPath = decodeURIComponent(assetPath);\n } catch {\n return c.json({ error: 'Invalid asset path' }, 400, cors);\n }\n if (!assetPath || assetPath.includes('..')) return c.json({ error: 'Invalid asset path' }, 400, cors);\n const root = resolve(preview.uiRoot);\n const fullPath = resolve(root, assetPath);\n const rel = relative(root, fullPath);\n if (rel.startsWith('..') || rel === '') return c.json({ error: 'Path traversal denied' }, 403, cors);\n if (!existsSync(fullPath) || !statSync(fullPath).isFile()) return c.json({ error: 'Not found' }, 404, cors);\n const mimeType = extensionAssetMimeType(assetPath);\n const content = readFileSync(fullPath);\n let textContent: string | null = null;\n if (mimeType.startsWith('text/html')) {\n let acceptance;\n try {\n acceptance = readLocalAppAcceptanceConfig(preview.uiRoot);\n } catch {\n acceptance = { schemaVersion: 1 as const, scenarios: [] };\n }\n textContent = injectLocalAppRuntimeBridge(content.toString('utf8'), acceptance);\n } else if (mimeType.startsWith('text/')) {\n textContent = content.toString('utf8');\n }\n return new Response(textContent ?? new Uint8Array(content), {\n headers: {\n 'Content-Type': mimeType,\n 'Content-Security-Policy': LOCAL_APP_PREVIEW_CSP,\n 'Cache-Control': 'no-store',\n 'X-Content-Type-Options': 'nosniff',\n ...cors,\n },\n });\n });\n}\n\nexport function registerLocalAppsRoutes(app: Hono, deps: AuthenticatedRouteDeps): void {\n app.get('/api/local-apps', (c) => c.json({ apps: deps.service.localApps.list() }));\n\n app.post('/api/local-apps', async (c) => {\n const body = await c.req.json<Record<string, unknown>>();\n if (typeof body.name !== 'string' || typeof body.idea !== 'string') {\n return c.json({ error: 'name and idea are required' }, 400);\n }\n const appDetail = deps.service.localApps.create({\n name: body.name,\n idea: body.idea,\n description: typeof body.description === 'string' ? body.description : undefined,\n });\n return c.json({ app: appDetail }, 201);\n });\n\n app.get('/api/local-apps/:id', (c) => {\n const appDetail = deps.service.localApps.get(c.req.param('id'));\n return appDetail ? c.json({ app: appDetail }) : c.json({ error: 'Local app not found' }, 404);\n });\n\n app.post('/api/local-apps/:id/validate', (c) => {\n return c.json({ validation: deps.service.localApps.validate(c.req.param('id')) });\n });\n\n app.post('/api/local-apps/:id/acceptance-runs', async (c) => {\n const body = await c.req.json<Record<string, unknown>>();\n const acceptance = deps.service.localApps.recordAcceptance(\n c.req.param('id'),\n body as unknown as RecordLocalAppAcceptanceInput,\n );\n return c.json({ acceptance }, 201);\n });\n\n app.post('/api/local-apps/:id/install', async (c) => {\n const appDetail = await deps.service.localApps.install(c.req.param('id'));\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/releases/:releaseId/rollback', async (c) => {\n const appDetail = await deps.service.localApps.rollback(\n c.req.param('id'),\n c.req.param('releaseId'),\n );\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/enable', async (c) => {\n const appDetail = await deps.service.localApps.setEnabled(c.req.param('id'), true);\n return c.json({ app: appDetail });\n });\n\n app.post('/api/local-apps/:id/disable', async (c) => {\n const appDetail = await deps.service.localApps.setEnabled(c.req.param('id'), false);\n return c.json({ app: appDetail });\n });\n\n app.delete('/api/local-apps/:id/install', async (c) => {\n const appDetail = await deps.service.localApps.uninstall(c.req.param('id'));\n return c.json({ app: appDetail });\n });\n}\n"],"mappings":"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"}