@agentprojectcontext/apx 1.80.2 → 1.89.1

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 (838) hide show
  1. package/package.json +9 -8
  2. package/skills/apc-context/SKILL.md +14 -7
  3. package/skills/apx/SKILL.md +62 -2
  4. package/skills/apx-mcp/SKILL.md +42 -15
  5. package/src/core/agent/a2a/peers.js +161 -0
  6. package/src/core/agent/a2a/reply.js +379 -27
  7. package/src/core/agent/abort.js +25 -0
  8. package/src/core/agent/agent-model.js +58 -0
  9. package/src/core/agent/agent-tools.js +101 -0
  10. package/src/core/agent/author-line.js +110 -0
  11. package/src/core/agent/build-agent-system.js +52 -18
  12. package/src/core/agent/channels/voice-context.js +17 -2
  13. package/src/core/agent/closing-floor.js +117 -0
  14. package/src/core/agent/constants.js +119 -11
  15. package/src/core/agent/engine-call.js +56 -0
  16. package/src/core/agent/group/run-group-turn.js +218 -0
  17. package/src/core/agent/group/turn-resolver.js +165 -0
  18. package/src/core/agent/judge.js +138 -11
  19. package/src/core/agent/loop/side-effects.js +106 -3
  20. package/src/core/agent/memory.js +31 -18
  21. package/src/core/agent/model-capabilities.js +47 -0
  22. package/src/core/agent/model-router.js +11 -40
  23. package/src/core/agent/prompt-builder.js +47 -0
  24. package/src/core/agent/prompts/channels/a2a.md +12 -0
  25. package/src/core/agent/prompts/channels/code.md +3 -1
  26. package/src/core/agent/prompts/channels/telegram.md +2 -0
  27. package/src/core/agent/prompts/channels/web_code.md +1 -1
  28. package/src/core/agent/prompts/channels/whatsapp.md +37 -0
  29. package/src/core/agent/prompts/core/agent-base.md +2 -0
  30. package/src/core/agent/prompts/discipline/action.md +1 -0
  31. package/src/core/agent/prompts/discipline/two-segment.md +2 -1
  32. package/src/core/agent/prompts/modes/mobility.md +36 -0
  33. package/src/core/agent/retry.js +42 -0
  34. package/src/core/agent/run-agent.js +322 -25
  35. package/src/core/agent/run-turn.js +253 -0
  36. package/src/core/agent/self-memory.js +18 -52
  37. package/src/core/agent/skills/agent-skills.js +118 -0
  38. package/src/core/agent/skills/catalog.js +1 -1
  39. package/src/core/agent/skills/declared.js +13 -0
  40. package/src/core/agent/skills/index-store.js +8 -1
  41. package/src/core/agent/skills/inspector.js +20 -3
  42. package/src/core/agent/skills/loader.js +18 -3
  43. package/src/core/agent/skills/media.js +121 -0
  44. package/src/core/agent/skills/origin.js +61 -0
  45. package/src/core/agent/skills/sections.js +136 -0
  46. package/src/core/agent/super-agent.js +54 -14
  47. package/src/core/agent/tools/handlers/_calendar.js +50 -0
  48. package/src/core/agent/tools/handlers/add-mcp.js +103 -0
  49. package/src/core/agent/tools/handlers/asana-create-task.js +3 -1
  50. package/src/core/agent/tools/handlers/attach-media.js +56 -0
  51. package/src/core/agent/tools/handlers/calendar-create-event.js +38 -0
  52. package/src/core/agent/tools/handlers/calendar-find-slot.js +39 -0
  53. package/src/core/agent/tools/handlers/calendar-list-events.js +39 -0
  54. package/src/core/agent/tools/handlers/calendar-update-event.js +35 -0
  55. package/src/core/agent/tools/handlers/call-agent.js +14 -6
  56. package/src/core/agent/tools/handlers/call-runtime.js +27 -49
  57. package/src/core/agent/tools/handlers/comment-task.js +78 -0
  58. package/src/core/agent/tools/handlers/complete-task.js +60 -0
  59. package/src/core/agent/tools/handlers/configure-agent.js +70 -0
  60. package/src/core/agent/tools/handlers/create-agent.js +68 -0
  61. package/src/core/agent/tools/handlers/create-task.js +41 -3
  62. package/src/core/agent/tools/handlers/import-agent.js +5 -5
  63. package/src/core/agent/tools/handlers/list-mcp-tools.js +83 -0
  64. package/src/core/agent/tools/handlers/list-routines.js +46 -0
  65. package/src/core/agent/tools/handlers/list-tasks.js +8 -1
  66. package/src/core/agent/tools/handlers/mark-commitment.js +57 -0
  67. package/src/core/agent/tools/handlers/read-skill.js +64 -0
  68. package/src/core/agent/tools/handlers/remember-routine.js +2 -8
  69. package/src/core/agent/tools/handlers/remember.js +82 -6
  70. package/src/core/agent/tools/handlers/remove-agent.js +42 -0
  71. package/src/core/agent/tools/handlers/run-routine.js +94 -0
  72. package/src/core/agent/tools/handlers/run-shell.js +44 -2
  73. package/src/core/agent/tools/handlers/send-telegram.js +41 -19
  74. package/src/core/agent/tools/handlers/set-agent-prompt.js +44 -0
  75. package/src/core/agent/tools/handlers/view-media.js +69 -0
  76. package/src/core/agent/tools/handlers/write-agent-memory.js +52 -0
  77. package/src/core/agent/tools/helpers.js +36 -4
  78. package/src/core/agent/tools/names.js +64 -0
  79. package/src/core/agent/tools/registry-bridge.js +24 -1
  80. package/src/core/agent/tools/registry.js +79 -0
  81. package/src/core/agent/tools/tool-call-parser.js +136 -13
  82. package/src/core/agent/vision-bridge.js +69 -0
  83. package/src/core/apc/agent-identity.js +74 -0
  84. package/src/core/apc/agent-rename-refs.js +187 -0
  85. package/src/core/apc/agent-write.js +312 -0
  86. package/src/core/apc/agents-vault.js +1 -1
  87. package/src/core/apc/blob-keys.js +42 -0
  88. package/src/core/apc/frontmatter.js +166 -10
  89. package/src/core/apc/parser.js +33 -83
  90. package/src/core/apc/paths.js +4 -6
  91. package/src/core/apc/project-memory.js +44 -0
  92. package/src/core/apc/projects-helpers.js +33 -0
  93. package/src/core/apc/scaffold.js +36 -16
  94. package/src/core/channels/telegram/ask-callbacks.js +103 -0
  95. package/src/core/channels/telegram/dispatch.js +154 -30
  96. package/src/core/channels/telegram/helpers.js +59 -7
  97. package/src/core/channels/telegram/inbound/audio.js +26 -30
  98. package/src/core/channels/telegram/inbound/file.js +22 -32
  99. package/src/core/channels/telegram/inbound/photo.js +24 -28
  100. package/src/core/channels/telegram/progress-gate.js +76 -0
  101. package/src/core/channels/telegram/reply.js +151 -43
  102. package/src/core/channels/telegram/voice-note.js +150 -0
  103. package/src/core/config/index.js +53 -54
  104. package/src/core/config/paths.js +117 -31
  105. package/src/core/config/redact.js +89 -4
  106. package/src/core/config/secret-values.js +2 -4
  107. package/src/core/constants/actors.js +5 -0
  108. package/src/core/constants/channels.js +3 -1
  109. package/src/core/constants/task-categories.js +73 -0
  110. package/src/core/constants/task-fields.js +28 -0
  111. package/src/core/engines/_globs.js +33 -0
  112. package/src/core/engines/anthropic.js +19 -1
  113. package/src/core/engines/catalog.js +20 -0
  114. package/src/core/engines/gemini.js +84 -16
  115. package/src/core/engines/index.js +19 -3
  116. package/src/core/engines/mock.js +145 -1
  117. package/src/core/engines/openai-compatible.js +150 -15
  118. package/src/core/engines/presets.js +36 -9
  119. package/src/core/engines/zen.js +131 -0
  120. package/src/core/events/bus.js +140 -0
  121. package/src/core/events/mascot-notify.js +156 -0
  122. package/src/core/http-tools/browser.js +366 -36
  123. package/src/core/http-tools/catalog.js +206 -22
  124. package/src/core/http-tools/grep.js +62 -7
  125. package/src/core/http-tools/registry.js +3 -1
  126. package/src/core/i18n/en.js +34 -3
  127. package/src/core/i18n/es.js +36 -4
  128. package/src/core/i18n/index.js +5 -5
  129. package/src/core/i18n/pt.js +32 -3
  130. package/src/core/identity/self.js +14 -1
  131. package/src/core/images/engines/a1111.js +219 -0
  132. package/src/core/images/engines/index.js +187 -0
  133. package/src/core/images/engines/mock.js +74 -0
  134. package/src/core/images/engines/openai.js +130 -0
  135. package/src/core/images/engines/sdcpp.js +204 -0
  136. package/src/core/images/engines/shared.js +218 -0
  137. package/src/core/images/generate.js +260 -0
  138. package/src/core/integrations/catalog.js +8 -3
  139. package/src/core/integrations/plugins/_google-oauth.js +179 -0
  140. package/src/core/integrations/plugins/asana.js +7 -3
  141. package/src/core/integrations/plugins/calendar.js +404 -0
  142. package/src/core/integrations/store.js +2 -0
  143. package/src/core/memory/broker.js +16 -1
  144. package/src/core/memory/compactor.js +19 -3
  145. package/src/core/memory/consolidate.js +2 -2
  146. package/src/core/memory/dated-log.js +66 -0
  147. package/src/core/memory/embed-engines/custom.js +59 -0
  148. package/src/core/memory/embed-engines/gemini.js +9 -3
  149. package/src/core/memory/embed-engines/index.js +87 -15
  150. package/src/core/memory/embeddings.js +52 -24
  151. package/src/core/memory/index.js +13 -3
  152. package/src/core/memory/indexer.js +83 -27
  153. package/src/core/memory/prune.js +182 -0
  154. package/src/core/memory/store.js +22 -0
  155. package/src/core/memory/summarizer.js +72 -8
  156. package/src/core/mobility/answer.js +80 -0
  157. package/src/core/mobility/geofence.js +667 -0
  158. package/src/core/mobility/osm-route.js +282 -0
  159. package/src/core/mobility/preferences.js +91 -0
  160. package/src/core/mobility/state.js +245 -0
  161. package/src/core/mobility/trip-event.js +384 -0
  162. package/src/core/net/tailscale.js +168 -0
  163. package/src/core/profiles/bundled/secretary/PROFILE.md +32 -42
  164. package/src/core/profiles/bundled/secretary/config.schema.es.json +68 -0
  165. package/src/core/profiles/bundled/secretary/config.schema.json +30 -2
  166. package/src/core/profiles/bundled/secretary/profile.json +3 -1
  167. package/src/core/profiles/bundled/secretary/routines/a2a-sweep.json +20 -0
  168. package/src/core/profiles/bundled/secretary/routines/day-close.json +4 -1
  169. package/src/core/profiles/bundled/secretary/routines/day-open.json +7 -1
  170. package/src/core/profiles/bundled/secretary/routines/watch.json +13 -2
  171. package/src/core/profiles/lifecycle.js +243 -19
  172. package/src/core/profiles/paths.js +12 -0
  173. package/src/core/profiles/store.js +47 -0
  174. package/src/core/routines/active-runs.js +213 -0
  175. package/src/core/routines/delivery.js +612 -0
  176. package/src/core/routines/header.js +88 -0
  177. package/src/core/routines/index.js +26 -0
  178. package/src/core/routines/run-log.js +78 -0
  179. package/src/core/routines/runner.js +629 -66
  180. package/src/core/routines/signals.js +75 -0
  181. package/src/core/runtime-skills/apc-context/SKILL.md +14 -7
  182. package/src/core/runtime-skills/apx/SKILL.md +93 -1
  183. package/src/core/runtime-skills/apx-agency-agents/SKILL.md +2 -2
  184. package/src/core/runtime-skills/apx-agent/SKILL.md +134 -19
  185. package/src/core/runtime-skills/apx-commitment/SKILL.md +134 -0
  186. package/src/core/runtime-skills/apx-image/SKILL.md +60 -0
  187. package/src/core/runtime-skills/apx-integrations/SKILL.md +82 -0
  188. package/src/core/runtime-skills/apx-mcp/SKILL.md +45 -14
  189. package/src/core/runtime-skills/apx-mcp-builder/SKILL.md +4 -4
  190. package/src/core/runtime-skills/apx-profile/SKILL.md +27 -2
  191. package/src/core/runtime-skills/apx-project/SKILL.md +23 -2
  192. package/src/core/runtime-skills/apx-routine/SKILL.md +40 -17
  193. package/src/core/runtime-skills/apx-runtime/SKILL.md +124 -14
  194. package/src/core/runtime-skills/apx-sessions/SKILL.md +7 -6
  195. package/src/core/runtime-skills/apx-skill-builder/SKILL.md +15 -13
  196. package/src/core/runtime-skills/apx-task/SKILL.md +79 -26
  197. package/src/core/runtime-skills/apx-telegram/SKILL.md +12 -12
  198. package/src/core/runtime-skills/apx-transcribe/SKILL.md +56 -0
  199. package/src/core/runtime-skills/apx-voice/SKILL.md +27 -8
  200. package/src/core/runtime-skills/claude-code/SKILL.md +8 -0
  201. package/src/core/runtime-skills/openrouter/SKILL.md +8 -2
  202. package/src/core/runtimes/_spawn.js +9 -1
  203. package/src/core/runtimes/claude-code.js +11 -2
  204. package/src/core/runtimes/codex.js +44 -10
  205. package/src/core/runtimes/index.js +17 -2
  206. package/src/core/runtimes/opencode.js +88 -9
  207. package/src/core/runtimes/outcome.js +119 -0
  208. package/src/core/sessions/index.js +193 -1
  209. package/src/core/stores/agent-inbox.js +109 -23
  210. package/src/core/stores/code-sessions.js +21 -0
  211. package/src/core/stores/commitments.js +27 -3
  212. package/src/core/stores/conversations.js +220 -20
  213. package/src/core/stores/deliveries.js +177 -0
  214. package/src/core/stores/media-archive.js +228 -0
  215. package/src/core/stores/messages.js +1096 -112
  216. package/src/core/stores/organization.js +34 -0
  217. package/src/core/stores/project-memory.js +71 -0
  218. package/src/core/stores/routine-memory.js +16 -8
  219. package/src/core/stores/routines.js +27 -49
  220. package/src/core/stores/sessions.js +4 -8
  221. package/src/core/stores/tasks.js +212 -18
  222. package/src/core/stores/turn-record.js +209 -0
  223. package/src/core/tasks/columns.js +136 -0
  224. package/src/core/tasks/comment-turn.js +258 -0
  225. package/src/core/util/time.js +13 -0
  226. package/src/core/voice/engines/index.js +54 -1
  227. package/src/core/voice/engines/openai.js +50 -4
  228. package/src/core/voice/opus.js +67 -0
  229. package/src/core/voice/pronounceable.js +43 -0
  230. package/src/core/voice/transcription.js +4 -0
  231. package/src/core/voice/tts.js +114 -24
  232. package/src/host/daemon/active-turns.js +188 -0
  233. package/src/host/daemon/api/admin-config.js +9 -0
  234. package/src/host/daemon/api/agents.js +99 -90
  235. package/src/host/daemon/api/artifact-preview.js +7 -6
  236. package/src/host/daemon/api/artifacts.js +3 -2
  237. package/src/host/daemon/api/code.js +55 -9
  238. package/src/host/daemon/api/commitments.js +11 -0
  239. package/src/host/daemon/api/confirm.js +3 -2
  240. package/src/host/daemon/api/conversations.js +543 -35
  241. package/src/host/daemon/api/deck.js +9 -8
  242. package/src/host/daemon/api/deliveries.js +33 -0
  243. package/src/host/daemon/api/desktop.js +5 -4
  244. package/src/host/daemon/api/embeddings.js +15 -6
  245. package/src/host/daemon/api/engines.js +59 -8
  246. package/src/host/daemon/api/exec.js +437 -121
  247. package/src/host/daemon/api/groups.js +215 -0
  248. package/src/host/daemon/api/images.js +107 -0
  249. package/src/host/daemon/api/inbox.js +123 -2
  250. package/src/host/daemon/api/integrations.js +64 -2
  251. package/src/host/daemon/api/mcps.js +7 -6
  252. package/src/host/daemon/api/media.js +283 -0
  253. package/src/host/daemon/api/mobility.js +177 -0
  254. package/src/host/daemon/api/net.js +182 -0
  255. package/src/host/daemon/api/pairing.js +38 -5
  256. package/src/host/daemon/api/profiles.js +30 -2
  257. package/src/host/daemon/api/routines.js +36 -4
  258. package/src/host/daemon/api/runtimes.js +74 -39
  259. package/src/host/daemon/api/sessions-search.js +7 -2
  260. package/src/host/daemon/api/sessions.js +44 -2
  261. package/src/host/daemon/api/shared.js +127 -20
  262. package/src/host/daemon/api/skills.js +11 -4
  263. package/src/host/daemon/api/super-agent.js +384 -53
  264. package/src/host/daemon/api/tasks.js +180 -10
  265. package/src/host/daemon/api/telegram.js +11 -10
  266. package/src/host/daemon/api/thread-faces.js +159 -0
  267. package/src/host/daemon/api/top-level.js +3 -3
  268. package/src/host/daemon/api/transcribe.js +11 -10
  269. package/src/host/daemon/api/tts.js +97 -4
  270. package/src/host/daemon/api/turn-abort.js +23 -0
  271. package/src/host/daemon/api/turns.js +49 -0
  272. package/src/host/daemon/api/voice.js +5 -4
  273. package/src/host/daemon/api/web.js +98 -0
  274. package/src/host/daemon/api.js +39 -0
  275. package/src/host/daemon/delivery-sweep.js +58 -0
  276. package/src/host/daemon/desktop-ws.js +5 -23
  277. package/src/host/daemon/events-ws.js +273 -0
  278. package/src/host/daemon/index.js +59 -15
  279. package/src/host/daemon/plugins/desktop/index.js +17 -4
  280. package/src/host/daemon/plugins/telegram/index.js +78 -40
  281. package/src/host/daemon/pty-bridge.py +99 -0
  282. package/src/host/daemon/routines-scheduler.js +1 -0
  283. package/src/host/daemon/smoke.js +1 -2
  284. package/src/host/daemon/terminal-ws.js +132 -0
  285. package/src/host/daemon/tts-keepwarm.js +87 -0
  286. package/src/host/daemon/wakeup.js +11 -6
  287. package/src/host/daemon/whisper-server.js +44 -0
  288. package/src/host/daemon/whisper-server.py +70 -13
  289. package/src/host/daemon/ws-auth.js +28 -0
  290. package/src/interfaces/android/app/build.gradle +42 -0
  291. package/src/interfaces/android/app/proguard-rules.pro +4 -0
  292. package/src/interfaces/android/app/src/main/AndroidManifest.xml +139 -0
  293. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AlertScreen.java +139 -0
  294. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/AndroidAutoDetector.java +106 -0
  295. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxCarAppService.java +57 -0
  296. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ApxPreferences.java +165 -0
  297. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarAlertStore.java +84 -0
  298. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageActionReceiver.java +47 -0
  299. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/CarMessageNotification.java +152 -0
  300. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonAddress.java +35 -0
  301. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DaemonClient.java +339 -0
  302. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/DeviceLocation.java +38 -0
  303. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ErrandScreen.java +127 -0
  304. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MainActivity.java +872 -0
  305. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationDetector.java +63 -0
  306. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsNavigationListenerService.java +453 -0
  307. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MapsShareIntentParser.java +93 -0
  308. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotBlobCatalog.java +66 -0
  309. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotOverlayService.java +448 -0
  310. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MascotView.java +249 -0
  311. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/MessageFrameParser.java +240 -0
  312. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/NotifyChannels.java +69 -0
  313. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityActionReceiver.java +78 -0
  314. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/ProximityNotification.java +161 -0
  315. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/StartupReceiver.java +57 -0
  316. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelEventGate.java +62 -0
  317. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TravelStatusBanner.java +116 -0
  318. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripLocationService.java +272 -0
  319. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripPlacesSheet.java +203 -0
  320. package/src/interfaces/android/app/src/main/java/dev/agentprojectcontext/apx/TripScreen.java +182 -0
  321. package/src/interfaces/android/app/src/main/res/drawable/app_background.xml +12 -0
  322. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_app.xml +10 -0
  323. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_launcher_foreground.xml +12 -0
  324. package/src/interfaces/android/app/src/main/res/drawable/ic_apx_notification.xml +22 -0
  325. package/src/interfaces/android/app/src/main/res/drawable/ic_trip_car.xml +37 -0
  326. package/src/interfaces/android/app/src/main/res/drawable-nodpi/apx_logo.png +0 -0
  327. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_amatista.png +0 -0
  328. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_aqua.png +0 -0
  329. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_brasa.png +0 -0
  330. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_campana.png +0 -0
  331. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_caracol.png +0 -0
  332. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_carbon.png +0 -0
  333. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cobalto.png +0 -0
  334. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cometa.png +0 -0
  335. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_coral.png +0 -0
  336. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_cubi.png +0 -0
  337. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_eclipse.png +0 -0
  338. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_faro.png +0 -0
  339. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_gajo.png +0 -0
  340. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_iris.png +0 -0
  341. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_kiwi.png +0 -0
  342. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_laguna.png +0 -0
  343. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_lila.png +0 -0
  344. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_menta.png +0 -0
  345. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_nimbo.png +0 -0
  346. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_noche.png +0 -0
  347. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_onyx.png +0 -0
  348. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_orbita.png +0 -0
  349. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_ovni.png +0 -0
  350. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_papa.png +0 -0
  351. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_parche.png +0 -0
  352. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_peon.png +0 -0
  353. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_perla.png +0 -0
  354. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_pino.png +0 -0
  355. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_quad.png +0 -0
  356. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_rubi.png +0 -0
  357. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_saturno.png +0 -0
  358. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trebol.png +0 -0
  359. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_trino.png +0 -0
  360. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_volcan.png +0 -0
  361. package/src/interfaces/android/app/src/main/res/drawable-nodpi/mascot_zafiro.png +0 -0
  362. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  363. package/src/interfaces/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  364. package/src/interfaces/android/app/src/main/res/raw/apx_notification.mp3 +0 -0
  365. package/src/interfaces/android/app/src/main/res/values/colors.xml +4 -0
  366. package/src/interfaces/android/app/src/main/res/values/strings.xml +25 -0
  367. package/src/interfaces/android/app/src/main/res/values/styles.xml +10 -0
  368. package/src/interfaces/android/app/src/main/res/values-v31/styles.xml +14 -0
  369. package/src/interfaces/android/app/src/main/res/xml/automotive_app_desc.xml +9 -0
  370. package/src/interfaces/android/app/src/main/res/xml/network_security_config.xml +10 -0
  371. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/AndroidAutoDetectorTest.java +85 -0
  372. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/CarAlertStoreTest.java +104 -0
  373. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/DaemonAddressTest.java +23 -0
  374. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsNavigationDetectorTest.java +69 -0
  375. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MapsShareIntentParserTest.java +31 -0
  376. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/MessageFrameParserTest.java +180 -0
  377. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TravelEventGateTest.java +64 -0
  378. package/src/interfaces/android/app/src/test/java/dev/agentprojectcontext/apx/TripPlacesSheetTest.java +66 -0
  379. package/src/interfaces/android/build.gradle +3 -0
  380. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  381. package/src/interfaces/android/gradle/wrapper/gradle-wrapper.properties +9 -0
  382. package/src/interfaces/android/gradle.properties +3 -0
  383. package/src/interfaces/android/gradlew +248 -0
  384. package/src/interfaces/android/gradlew.bat +82 -0
  385. package/src/interfaces/android/settings.gradle +18 -0
  386. package/src/interfaces/cli/commands/a2a.js +145 -4
  387. package/src/interfaces/cli/commands/agent.js +247 -22
  388. package/src/interfaces/cli/commands/code.js +1 -1
  389. package/src/interfaces/cli/commands/commitment.js +5 -0
  390. package/src/interfaces/cli/commands/config.js +85 -6
  391. package/src/interfaces/cli/commands/exec.js +90 -1
  392. package/src/interfaces/cli/commands/image.js +314 -0
  393. package/src/interfaces/cli/commands/mcp.js +87 -23
  394. package/src/interfaces/cli/commands/memory.js +35 -22
  395. package/src/interfaces/cli/commands/panel.js +94 -0
  396. package/src/interfaces/cli/commands/profile.js +14 -0
  397. package/src/interfaces/cli/commands/project.js +29 -0
  398. package/src/interfaces/cli/commands/routine.js +45 -10
  399. package/src/interfaces/cli/commands/runtime.js +30 -7
  400. package/src/interfaces/cli/commands/session.js +90 -38
  401. package/src/interfaces/cli/commands/sessions.js +35 -2
  402. package/src/interfaces/cli/commands/skills.js +15 -9
  403. package/src/interfaces/cli/commands/status.js +2 -3
  404. package/src/interfaces/cli/commands/task.js +54 -5
  405. package/src/interfaces/cli/commands/telegram.js +12 -4
  406. package/src/interfaces/cli/commands/transcribe.js +177 -0
  407. package/src/interfaces/cli/help/index.js +311 -72
  408. package/src/interfaces/cli/http.js +61 -13
  409. package/src/interfaces/cli/index.js +1 -1
  410. package/src/interfaces/cli/routes/agent.js +5 -4
  411. package/src/interfaces/cli/routes/commitment.js +3 -2
  412. package/src/interfaces/cli/routes/config.js +7 -2
  413. package/src/interfaces/cli/routes/image.js +11 -0
  414. package/src/interfaces/cli/routes/index.js +2 -0
  415. package/src/interfaces/cli/routes/log.js +1 -1
  416. package/src/interfaces/cli/routes/memory.js +3 -2
  417. package/src/interfaces/cli/routes/panel.js +15 -2
  418. package/src/interfaces/cli/routes/profile.js +3 -2
  419. package/src/interfaces/cli/routes/transcribe.js +10 -0
  420. package/src/interfaces/cli/stdin.js +29 -0
  421. package/src/interfaces/desktop/assets/blobs/amatista.png +0 -0
  422. package/src/interfaces/desktop/assets/blobs/aqua.png +0 -0
  423. package/src/interfaces/desktop/assets/blobs/brasa.png +0 -0
  424. package/src/interfaces/desktop/assets/blobs/campana.png +0 -0
  425. package/src/interfaces/desktop/assets/blobs/caracol.png +0 -0
  426. package/src/interfaces/desktop/assets/blobs/carbon.png +0 -0
  427. package/src/interfaces/desktop/assets/blobs/cobalto.png +0 -0
  428. package/src/interfaces/desktop/assets/blobs/cometa.png +0 -0
  429. package/src/interfaces/desktop/assets/blobs/coral.png +0 -0
  430. package/src/interfaces/desktop/assets/blobs/cubi.png +0 -0
  431. package/src/interfaces/desktop/assets/blobs/eclipse.png +0 -0
  432. package/src/interfaces/desktop/assets/blobs/faro.png +0 -0
  433. package/src/interfaces/desktop/assets/blobs/gajo.png +0 -0
  434. package/src/interfaces/desktop/assets/blobs/iris.png +0 -0
  435. package/src/interfaces/desktop/assets/blobs/kiwi.png +0 -0
  436. package/src/interfaces/desktop/assets/blobs/laguna.png +0 -0
  437. package/src/interfaces/desktop/assets/blobs/lila.png +0 -0
  438. package/src/interfaces/desktop/assets/blobs/menta.png +0 -0
  439. package/src/interfaces/desktop/assets/blobs/nimbo.png +0 -0
  440. package/src/interfaces/desktop/assets/blobs/noche.png +0 -0
  441. package/src/interfaces/desktop/assets/blobs/onyx.png +0 -0
  442. package/src/interfaces/desktop/assets/blobs/orbita.png +0 -0
  443. package/src/interfaces/desktop/assets/blobs/ovni.png +0 -0
  444. package/src/interfaces/desktop/assets/blobs/papa.png +0 -0
  445. package/src/interfaces/desktop/assets/blobs/parche.png +0 -0
  446. package/src/interfaces/desktop/assets/blobs/peon.png +0 -0
  447. package/src/interfaces/desktop/assets/blobs/perla.png +0 -0
  448. package/src/interfaces/desktop/assets/blobs/pino.png +0 -0
  449. package/src/interfaces/desktop/assets/blobs/quad.png +0 -0
  450. package/src/interfaces/desktop/assets/blobs/rubi.png +0 -0
  451. package/src/interfaces/desktop/assets/blobs/saturno.png +0 -0
  452. package/src/interfaces/desktop/assets/blobs/trebol.png +0 -0
  453. package/src/interfaces/desktop/assets/blobs/trino.png +0 -0
  454. package/src/interfaces/desktop/assets/blobs/volcan.png +0 -0
  455. package/src/interfaces/desktop/assets/blobs/zafiro.png +0 -0
  456. package/src/interfaces/desktop/assets/notification.mp3 +0 -0
  457. package/src/interfaces/desktop/main.js +473 -29
  458. package/src/interfaces/desktop/mascot-blobs.js +41 -0
  459. package/src/interfaces/desktop/mascot-preload.js +32 -0
  460. package/src/interfaces/desktop/mascot.css +186 -0
  461. package/src/interfaces/desktop/mascot.html +40 -0
  462. package/src/interfaces/desktop/mascot.js +163 -0
  463. package/src/interfaces/desktop/preload.js +10 -0
  464. package/src/interfaces/desktop/renderer.js +308 -48
  465. package/src/interfaces/desktop/style.css +34 -0
  466. package/src/interfaces/mcp-server/index.js +87 -0
  467. package/src/interfaces/tui/_shims/util-locale.ts +0 -2
  468. package/src/interfaces/tui/app.tsx +0 -6
  469. package/src/interfaces/tui/attach.ts +0 -1
  470. package/src/interfaces/tui/context/sdk-apx.tsx +0 -4
  471. package/src/interfaces/tui/plugin/api.tsx +0 -3
  472. package/src/interfaces/tui/plugin/runtime.ts +0 -3
  473. package/src/interfaces/tui/thread.ts +0 -16
  474. package/src/interfaces/web/README.md +22 -14
  475. package/src/interfaces/web/dist/assets/claude-XtpLmGtF.webp +0 -0
  476. package/src/interfaces/web/dist/assets/codex-DExPUgvh.webp +0 -0
  477. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css +32 -0
  478. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.br +0 -0
  479. package/src/interfaces/web/dist/assets/index-BEoRgIqd.css.gz +0 -0
  480. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js +1074 -0
  481. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.br +0 -0
  482. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.gz +0 -0
  483. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map +1 -0
  484. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.br +0 -0
  485. package/src/interfaces/web/dist/assets/index-C6fXHc1p.js.map.gz +0 -0
  486. package/src/interfaces/web/dist/favicon/dark/site.webmanifest +12 -6
  487. package/src/interfaces/web/dist/favicon/white/site.webmanifest +12 -6
  488. package/src/interfaces/web/dist/index.html +22 -6
  489. package/src/interfaces/web/dist/index.html.br +0 -0
  490. package/src/interfaces/web/dist/index.html.gz +0 -0
  491. package/src/interfaces/web/dist/manifest.webmanifest +25 -0
  492. package/src/interfaces/web/dist/modules/blobs/amatista.png +0 -0
  493. package/src/interfaces/web/dist/modules/blobs/aqua.png +0 -0
  494. package/src/interfaces/web/dist/modules/blobs/brasa.png +0 -0
  495. package/src/interfaces/web/dist/modules/blobs/campana.png +0 -0
  496. package/src/interfaces/web/dist/modules/blobs/caracol.png +0 -0
  497. package/src/interfaces/web/dist/modules/blobs/carbon.png +0 -0
  498. package/src/interfaces/web/dist/modules/blobs/cobalto.png +0 -0
  499. package/src/interfaces/web/dist/modules/blobs/cometa.png +0 -0
  500. package/src/interfaces/web/dist/modules/blobs/coral.png +0 -0
  501. package/src/interfaces/web/dist/modules/blobs/cubi.png +0 -0
  502. package/src/interfaces/web/dist/modules/blobs/eclipse.png +0 -0
  503. package/src/interfaces/web/dist/modules/blobs/faro.png +0 -0
  504. package/src/interfaces/web/dist/modules/blobs/gajo.png +0 -0
  505. package/src/interfaces/web/dist/modules/blobs/iris.png +0 -0
  506. package/src/interfaces/web/dist/modules/blobs/kiwi.png +0 -0
  507. package/src/interfaces/web/dist/modules/blobs/laguna.png +0 -0
  508. package/src/interfaces/web/dist/modules/blobs/lila.png +0 -0
  509. package/src/interfaces/web/dist/modules/blobs/menta.png +0 -0
  510. package/src/interfaces/web/dist/modules/blobs/nimbo.png +0 -0
  511. package/src/interfaces/web/dist/modules/blobs/noche.png +0 -0
  512. package/src/interfaces/web/dist/modules/blobs/onyx.png +0 -0
  513. package/src/interfaces/web/dist/modules/blobs/orbita.png +0 -0
  514. package/src/interfaces/web/dist/modules/blobs/ovni.png +0 -0
  515. package/src/interfaces/web/dist/modules/blobs/papa.png +0 -0
  516. package/src/interfaces/web/dist/modules/blobs/parche.png +0 -0
  517. package/src/interfaces/web/dist/modules/blobs/peon.png +0 -0
  518. package/src/interfaces/web/dist/modules/blobs/perla.png +0 -0
  519. package/src/interfaces/web/dist/modules/blobs/pino.png +0 -0
  520. package/src/interfaces/web/dist/modules/blobs/quad.png +0 -0
  521. package/src/interfaces/web/dist/modules/blobs/rubi.png +0 -0
  522. package/src/interfaces/web/dist/modules/blobs/saturno.png +0 -0
  523. package/src/interfaces/web/dist/modules/blobs/trebol.png +0 -0
  524. package/src/interfaces/web/dist/modules/blobs/trino.png +0 -0
  525. package/src/interfaces/web/dist/modules/blobs/volcan.png +0 -0
  526. package/src/interfaces/web/dist/modules/blobs/zafiro.png +0 -0
  527. package/src/interfaces/web/dist/sw.js +106 -0
  528. package/src/interfaces/web/dist/sw.js.br +0 -0
  529. package/src/interfaces/web/dist/sw.js.gz +0 -0
  530. package/src/interfaces/web/eslint.config.js +83 -0
  531. package/src/interfaces/web/index.html +20 -4
  532. package/src/interfaces/web/package-lock.json +1651 -1280
  533. package/src/interfaces/web/package.json +9 -10
  534. package/src/interfaces/web/pnpm-lock.yaml +867 -869
  535. package/src/interfaces/web/public/favicon/dark/site.webmanifest +12 -6
  536. package/src/interfaces/web/public/favicon/white/site.webmanifest +12 -6
  537. package/src/interfaces/web/public/manifest.webmanifest +25 -0
  538. package/src/interfaces/web/public/modules/blobs/amatista.png +0 -0
  539. package/src/interfaces/web/public/modules/blobs/aqua.png +0 -0
  540. package/src/interfaces/web/public/modules/blobs/brasa.png +0 -0
  541. package/src/interfaces/web/public/modules/blobs/campana.png +0 -0
  542. package/src/interfaces/web/public/modules/blobs/caracol.png +0 -0
  543. package/src/interfaces/web/public/modules/blobs/carbon.png +0 -0
  544. package/src/interfaces/web/public/modules/blobs/cobalto.png +0 -0
  545. package/src/interfaces/web/public/modules/blobs/cometa.png +0 -0
  546. package/src/interfaces/web/public/modules/blobs/coral.png +0 -0
  547. package/src/interfaces/web/public/modules/blobs/cubi.png +0 -0
  548. package/src/interfaces/web/public/modules/blobs/eclipse.png +0 -0
  549. package/src/interfaces/web/public/modules/blobs/faro.png +0 -0
  550. package/src/interfaces/web/public/modules/blobs/gajo.png +0 -0
  551. package/src/interfaces/web/public/modules/blobs/iris.png +0 -0
  552. package/src/interfaces/web/public/modules/blobs/kiwi.png +0 -0
  553. package/src/interfaces/web/public/modules/blobs/laguna.png +0 -0
  554. package/src/interfaces/web/public/modules/blobs/lila.png +0 -0
  555. package/src/interfaces/web/public/modules/blobs/menta.png +0 -0
  556. package/src/interfaces/web/public/modules/blobs/nimbo.png +0 -0
  557. package/src/interfaces/web/public/modules/blobs/noche.png +0 -0
  558. package/src/interfaces/web/public/modules/blobs/onyx.png +0 -0
  559. package/src/interfaces/web/public/modules/blobs/orbita.png +0 -0
  560. package/src/interfaces/web/public/modules/blobs/ovni.png +0 -0
  561. package/src/interfaces/web/public/modules/blobs/papa.png +0 -0
  562. package/src/interfaces/web/public/modules/blobs/parche.png +0 -0
  563. package/src/interfaces/web/public/modules/blobs/peon.png +0 -0
  564. package/src/interfaces/web/public/modules/blobs/perla.png +0 -0
  565. package/src/interfaces/web/public/modules/blobs/pino.png +0 -0
  566. package/src/interfaces/web/public/modules/blobs/quad.png +0 -0
  567. package/src/interfaces/web/public/modules/blobs/rubi.png +0 -0
  568. package/src/interfaces/web/public/modules/blobs/saturno.png +0 -0
  569. package/src/interfaces/web/public/modules/blobs/trebol.png +0 -0
  570. package/src/interfaces/web/public/modules/blobs/trino.png +0 -0
  571. package/src/interfaces/web/public/modules/blobs/volcan.png +0 -0
  572. package/src/interfaces/web/public/modules/blobs/zafiro.png +0 -0
  573. package/src/interfaces/web/public/sw.js +106 -0
  574. package/src/interfaces/web/src/App.tsx +106 -10
  575. package/src/interfaces/web/src/assets/cli/claude.webp +0 -0
  576. package/src/interfaces/web/src/assets/cli/codex.webp +0 -0
  577. package/src/interfaces/web/src/assets/cli/cursor.svg +1 -0
  578. package/src/interfaces/web/src/assets/cli/opencode.png +0 -0
  579. package/src/interfaces/web/src/components/Combobox.tsx +201 -0
  580. package/src/interfaces/web/src/components/MobileHint.tsx +95 -0
  581. package/src/interfaces/web/src/components/MobileLinkDialog.tsx +156 -0
  582. package/src/interfaces/web/src/components/ModelCombobox.tsx +21 -113
  583. package/src/interfaces/web/src/components/{routines/ReadOnlyBlock.tsx → ReadOnlyBlock.tsx} +13 -4
  584. package/src/interfaces/web/src/components/Roby.tsx +5 -3
  585. package/src/interfaces/web/src/components/RobyBubble.tsx +23 -5
  586. package/src/interfaces/web/src/components/RowMenu.tsx +46 -0
  587. package/src/interfaces/web/src/components/TimezoneSelect.tsx +4 -1
  588. package/src/interfaces/web/src/components/Toast.tsx +50 -14
  589. package/src/interfaces/web/src/components/UiSelect.tsx +12 -5
  590. package/src/interfaces/web/src/components/agents/AgentAvatar.tsx +171 -0
  591. package/src/interfaces/web/src/components/agents/AgentFormFields.tsx +42 -11
  592. package/src/interfaces/web/src/components/agents/AgentModelBadge.tsx +157 -0
  593. package/src/interfaces/web/src/components/agents/AgentModelSelect.tsx +57 -0
  594. package/src/interfaces/web/src/components/agents/AgentSkillsPicker.tsx +115 -0
  595. package/src/interfaces/web/src/components/agents/BlobAvatar.tsx +50 -0
  596. package/src/interfaces/web/src/components/agents/blobPresets.ts +50 -0
  597. package/src/interfaces/web/src/components/agents/modelCatalog.ts +66 -0
  598. package/src/interfaces/web/src/components/chat/ActionGroup.tsx +162 -0
  599. package/src/interfaces/web/src/components/chat/AskAnswersCard.tsx +4 -3
  600. package/src/interfaces/web/src/components/chat/AskQuestionsCard.tsx +1 -1
  601. package/src/interfaces/web/src/components/chat/Attachment.tsx +220 -0
  602. package/src/interfaces/web/src/components/chat/ChatList.tsx +226 -51
  603. package/src/interfaces/web/src/components/chat/ChatRowActivity.tsx +45 -0
  604. package/src/interfaces/web/src/components/chat/Composer.tsx +672 -23
  605. package/src/interfaces/web/src/components/chat/ComposerCommands.tsx +175 -0
  606. package/src/interfaces/web/src/components/chat/ComposerSuggest.tsx +215 -0
  607. package/src/interfaces/web/src/components/chat/ContextBar.tsx +133 -65
  608. package/src/interfaces/web/src/components/chat/InlineAskPanel.tsx +107 -47
  609. package/src/interfaces/web/src/components/chat/MessageBubble.tsx +460 -119
  610. package/src/interfaces/web/src/components/chat/MessageList.tsx +165 -18
  611. package/src/interfaces/web/src/components/chat/ReasoningBlock.tsx +58 -0
  612. package/src/interfaces/web/src/components/chat/SessionPicker.tsx +182 -0
  613. package/src/interfaces/web/src/components/chat/SkillTrace.tsx +183 -0
  614. package/src/interfaces/web/src/components/chat/ToolCall.tsx +11 -11
  615. package/src/interfaces/web/src/components/code/CodeContextTab.tsx +87 -53
  616. package/src/interfaces/web/src/components/code/CodeFileTree.tsx +11 -52
  617. package/src/interfaces/web/src/components/code/CodeFileViewer.tsx +5 -4
  618. package/src/interfaces/web/src/components/code/CodeProjectPicker.tsx +31 -7
  619. package/src/interfaces/web/src/components/code/CodeSessionList.tsx +32 -11
  620. package/src/interfaces/web/src/components/code/CodeSidePanel.tsx +33 -3
  621. package/src/interfaces/web/src/components/code/CodeTerminal.tsx +5 -4
  622. package/src/interfaces/web/src/components/code/NewCodeSessionDialog.tsx +164 -0
  623. package/src/interfaces/web/src/components/commitments/CommitmentDetail.tsx +162 -0
  624. package/src/interfaces/web/src/components/commitments/CommitmentFormDialog.tsx +158 -0
  625. package/src/interfaces/web/src/components/commitments/CommitmentList.tsx +194 -0
  626. package/src/interfaces/web/src/components/commitments/commitmentState.tsx +46 -0
  627. package/src/interfaces/web/src/components/common/BulkActionBar.tsx +60 -0
  628. package/src/interfaces/web/src/components/common/ConfirmDialog.tsx +4 -1
  629. package/src/interfaces/web/src/components/common/SelectCheckbox.tsx +40 -0
  630. package/src/interfaces/web/src/components/common/TabNav.tsx +1 -1
  631. package/src/interfaces/web/src/components/cron/CronPicker.tsx +1 -1
  632. package/src/interfaces/web/src/components/files/FileBrowser.tsx +1 -1
  633. package/src/interfaces/web/src/components/files/FileTree.tsx +6 -4
  634. package/src/interfaces/web/src/components/files/FileViewer.tsx +9 -5
  635. package/src/interfaces/web/src/components/files/MarkdownPreview.tsx +45 -9
  636. package/src/interfaces/web/src/components/images/ImageDefaultsCard.tsx +93 -0
  637. package/src/interfaces/web/src/components/images/ImageProviderList.tsx +142 -0
  638. package/src/interfaces/web/src/components/images/ImageProviderModal.tsx +263 -0
  639. package/src/interfaces/web/src/components/images/ImageTestCard.tsx +142 -0
  640. package/src/interfaces/web/src/components/inbox/ChannelFilter.tsx +178 -0
  641. package/src/interfaces/web/src/components/inbox/InboxList.tsx +77 -81
  642. package/src/interfaces/web/src/components/inbox/InboxRowItem.tsx +140 -0
  643. package/src/interfaces/web/src/components/integrations/ComingSoonPlugin.tsx +2 -2
  644. package/src/interfaces/web/src/components/integrations/PluginConnect.tsx +208 -30
  645. package/src/interfaces/web/src/components/integrations/PluginToolsSection.tsx +1 -1
  646. package/src/interfaces/web/src/components/layout/ProjectAvatar.tsx +39 -24
  647. package/src/interfaces/web/src/components/layout/ProjectSidebar.tsx +253 -58
  648. package/src/interfaces/web/src/components/memory/MemoryBrowser.tsx +94 -47
  649. package/src/interfaces/web/src/components/routines/ExecutionsList.tsx +202 -90
  650. package/src/interfaces/web/src/components/routines/RoutineDetail.tsx +28 -6
  651. package/src/interfaces/web/src/components/routines/RoutineEditor.tsx +16 -5
  652. package/src/interfaces/web/src/components/routines/RoutineList.tsx +49 -9
  653. package/src/interfaces/web/src/components/routines/VarTextarea.tsx +1 -1
  654. package/src/interfaces/web/src/components/routines/runChat.ts +121 -0
  655. package/src/interfaces/web/src/components/sessions/SessionDetail.tsx +148 -0
  656. package/src/interfaces/web/src/components/sessions/SessionTerminal.tsx +98 -0
  657. package/src/interfaces/web/src/components/settings/AccessPanel.tsx +205 -0
  658. package/src/interfaces/web/src/components/settings/DefaultRouterCard.tsx +246 -101
  659. package/src/interfaces/web/src/components/settings/DesktopSettingsPanel.tsx +36 -2
  660. package/src/interfaces/web/src/components/settings/DevicesPanel.tsx +19 -6
  661. package/src/interfaces/web/src/components/settings/EmbedProviderList.tsx +274 -0
  662. package/src/interfaces/web/src/components/settings/EnginesPanel.tsx +26 -6
  663. package/src/interfaces/web/src/components/settings/MemoryPanel.tsx +118 -119
  664. package/src/interfaces/web/src/components/settings/NudgePanel.tsx +4 -3
  665. package/src/interfaces/web/src/components/settings/PairDeviceDialog.tsx +15 -4
  666. package/src/interfaces/web/src/components/settings/PanelPrefs.tsx +374 -0
  667. package/src/interfaces/web/src/components/settings/ProfilePanel.tsx +70 -2
  668. package/src/interfaces/web/src/components/settings/RoutingPanel.tsx +2 -1
  669. package/src/interfaces/web/src/components/settings/SkillsInspectorPanel.tsx +102 -43
  670. package/src/interfaces/web/src/components/settings/SkillsManager.tsx +76 -21
  671. package/src/interfaces/web/src/components/settings/SkillsSettings.tsx +10 -3
  672. package/src/interfaces/web/src/components/settings/SuperAgentPanel.tsx +8 -0
  673. package/src/interfaces/web/src/components/settings/TelegramChannelsPanel.tsx +11 -2
  674. package/src/interfaces/web/src/components/settings/TelegramContactsPanel.tsx +19 -8
  675. package/src/interfaces/web/src/components/settings/TelegramRolesPanel.tsx +12 -2
  676. package/src/interfaces/web/src/components/settings/WebPanel.tsx +22 -31
  677. package/src/interfaces/web/src/components/settings/providers/ProviderCard.tsx +15 -3
  678. package/src/interfaces/web/src/components/settings/providers/ProviderModal.tsx +97 -66
  679. package/src/interfaces/web/src/components/settings/providers/ProviderTestDialog.tsx +150 -0
  680. package/src/interfaces/web/src/components/settings/providers/typeStyles.ts +67 -25
  681. package/src/interfaces/web/src/components/settings/providers/types.ts +3 -0
  682. package/src/interfaces/web/src/components/tasks/TaskBoard.tsx +201 -0
  683. package/src/interfaces/web/src/components/tasks/TaskColumnsDialog.tsx +243 -0
  684. package/src/interfaces/web/src/components/tasks/TaskComments.tsx +167 -0
  685. package/src/interfaces/web/src/components/tasks/TaskDetail.tsx +335 -0
  686. package/src/interfaces/web/src/components/tasks/TaskFormDialog.tsx +406 -0
  687. package/src/interfaces/web/src/components/tasks/TaskList.tsx +258 -0
  688. package/src/interfaces/web/src/components/tasks/TaskSubtasks.tsx +126 -0
  689. package/src/interfaces/web/src/components/tasks/columns.ts +51 -0
  690. package/src/interfaces/web/src/components/tasks/taskStatus.tsx +159 -34
  691. package/src/interfaces/web/src/components/tasks/taskViewPrefs.ts +73 -0
  692. package/src/interfaces/web/src/components/tasks/useTaskColumns.ts +31 -0
  693. package/src/interfaces/web/src/components/ui/chat-input.tsx +136 -12
  694. package/src/interfaces/web/src/components/ui/context-menu.tsx +15 -198
  695. package/src/interfaces/web/src/components/ui/dialog.tsx +3 -2
  696. package/src/interfaces/web/src/components/ui/filter-chips.tsx +4 -0
  697. package/src/interfaces/web/src/components/ui/popover.tsx +14 -49
  698. package/src/interfaces/web/src/components/ui/sheet.tsx +2 -1
  699. package/src/interfaces/web/src/components/ui/spinner.tsx +2 -1
  700. package/src/interfaces/web/src/components/ui.tsx +62 -23
  701. package/src/interfaces/web/src/components/voice/VoiceProviderList.tsx +2 -1
  702. package/src/interfaces/web/src/components/voice/VoiceProviderModal.tsx +66 -8
  703. package/src/interfaces/web/src/components/voice/VoiceQvoxInstallCard.tsx +63 -0
  704. package/src/interfaces/web/src/components/voice/VoiceQvoxStatusCard.tsx +51 -0
  705. package/src/interfaces/web/src/components/voice/VoiceSttCard.tsx +4 -3
  706. package/src/interfaces/web/src/components/voice/VoiceTestCard.tsx +38 -4
  707. package/src/interfaces/web/src/constants/index.ts +1 -0
  708. package/src/interfaces/web/src/hooks/useChannelPrefs.ts +39 -0
  709. package/src/interfaces/web/src/hooks/useChat.ts +1092 -85
  710. package/src/interfaces/web/src/hooks/useChatActivity.ts +24 -0
  711. package/src/interfaces/web/src/hooks/useInbox.ts +26 -4
  712. package/src/interfaces/web/src/hooks/useLiveMessages.ts +16 -0
  713. package/src/interfaces/web/src/hooks/useOllamaModels.ts +79 -0
  714. package/src/interfaces/web/src/hooks/useRecorder.ts +198 -0
  715. package/src/interfaces/web/src/hooks/useTokenBootstrap.ts +23 -6
  716. package/src/interfaces/web/src/i18n/en.ts +832 -175
  717. package/src/interfaces/web/src/i18n/es.ts +841 -188
  718. package/src/interfaces/web/src/lib/api/agents.ts +23 -4
  719. package/src/interfaces/web/src/lib/api/code.ts +17 -0
  720. package/src/interfaces/web/src/lib/api/commitments.ts +7 -1
  721. package/src/interfaces/web/src/lib/api/conversations.ts +38 -11
  722. package/src/interfaces/web/src/lib/api/embeddings.ts +3 -0
  723. package/src/interfaces/web/src/lib/api/engines.ts +14 -0
  724. package/src/interfaces/web/src/lib/api/groups.ts +93 -0
  725. package/src/interfaces/web/src/lib/api/images.ts +193 -0
  726. package/src/interfaces/web/src/lib/api/inbox.ts +29 -5
  727. package/src/interfaces/web/src/lib/api/integrations.ts +9 -0
  728. package/src/interfaces/web/src/lib/api/media.ts +126 -0
  729. package/src/interfaces/web/src/lib/api/net.ts +44 -0
  730. package/src/interfaces/web/src/lib/api/profiles.ts +12 -0
  731. package/src/interfaces/web/src/lib/api/projects.ts +9 -1
  732. package/src/interfaces/web/src/lib/api/routines.ts +9 -1
  733. package/src/interfaces/web/src/lib/api/sessions.ts +18 -0
  734. package/src/interfaces/web/src/lib/api/skills.ts +8 -0
  735. package/src/interfaces/web/src/lib/api/super_agent.ts +3 -0
  736. package/src/interfaces/web/src/lib/api/tasks.ts +46 -6
  737. package/src/interfaces/web/src/lib/api/tools.ts +2 -0
  738. package/src/interfaces/web/src/lib/api/transcribe.ts +31 -0
  739. package/src/interfaces/web/src/lib/api/turns.ts +20 -0
  740. package/src/interfaces/web/src/lib/api/voice.ts +72 -2
  741. package/src/interfaces/web/src/lib/api.ts +3 -0
  742. package/src/interfaces/web/src/lib/channels.ts +214 -0
  743. package/src/interfaces/web/src/lib/chat-activity.ts +175 -0
  744. package/src/interfaces/web/src/lib/chat-prefs.ts +48 -0
  745. package/src/interfaces/web/src/lib/code-context.ts +0 -2
  746. package/src/interfaces/web/src/lib/http.ts +51 -17
  747. package/src/interfaces/web/src/lib/inbox-selection.ts +29 -0
  748. package/src/interfaces/web/src/lib/live.ts +252 -0
  749. package/src/interfaces/web/src/lib/net.ts +211 -0
  750. package/src/interfaces/web/src/lib/notify.ts +331 -0
  751. package/src/interfaces/web/src/lib/projectNav.ts +40 -0
  752. package/src/interfaces/web/src/lib/pwa.ts +115 -0
  753. package/src/interfaces/web/src/lib/qvox.ts +24 -0
  754. package/src/interfaces/web/src/lib/slug.ts +3 -0
  755. package/src/interfaces/web/src/lib/tone.ts +150 -0
  756. package/src/interfaces/web/src/main.tsx +15 -4
  757. package/src/interfaces/web/src/screens/ApxAdminScreen.tsx +33 -11
  758. package/src/interfaces/web/src/screens/InboxScreen.tsx +126 -71
  759. package/src/interfaces/web/src/screens/ProjectScreen.tsx +8 -4
  760. package/src/interfaces/web/src/screens/SettingsScreen.tsx +7 -4
  761. package/src/interfaces/web/src/screens/base/AgentDefaultsTab.tsx +30 -9
  762. package/src/interfaces/web/src/screens/base/CommitmentsTab.tsx +150 -168
  763. package/src/interfaces/web/src/screens/base/LogsTab.tsx +8 -7
  764. package/src/interfaces/web/src/screens/base/SessionsTab.tsx +99 -37
  765. package/src/interfaces/web/src/screens/base/WorkspacesTab.tsx +1 -1
  766. package/src/interfaces/web/src/screens/mobile/MobileChat.tsx +85 -0
  767. package/src/interfaces/web/src/screens/mobile/MobileChatList.tsx +244 -0
  768. package/src/interfaces/web/src/screens/mobile/MobileCommitments.tsx +350 -0
  769. package/src/interfaces/web/src/screens/mobile/MobileScreen.tsx +138 -0
  770. package/src/interfaces/web/src/screens/mobile/MobileTabBar.tsx +105 -0
  771. package/src/interfaces/web/src/screens/mobile/MobileTasks.tsx +407 -0
  772. package/src/interfaces/web/src/screens/mobile/NewChatSheet.tsx +313 -0
  773. package/src/interfaces/web/src/screens/mobile/mobileList.tsx +194 -0
  774. package/src/interfaces/web/src/screens/mobile/routes.ts +239 -0
  775. package/src/interfaces/web/src/screens/modules/CodeScreen.tsx +135 -64
  776. package/src/interfaces/web/src/screens/modules/DeckScreen.tsx +0 -1
  777. package/src/interfaces/web/src/screens/modules/ImagesScreen.tsx +172 -0
  778. package/src/interfaces/web/src/screens/modules/VoiceScreen.tsx +36 -4
  779. package/src/interfaces/web/src/screens/project/AgentBrainGraph.tsx +117 -30
  780. package/src/interfaces/web/src/screens/project/AgentDetailScreen.tsx +537 -92
  781. package/src/interfaces/web/src/screens/project/AgentsTab.tsx +344 -93
  782. package/src/interfaces/web/src/screens/project/ArtifactsTab.tsx +1 -1
  783. package/src/interfaces/web/src/screens/project/ChatTab.tsx +1160 -94
  784. package/src/interfaces/web/src/screens/project/IntegrationsTab.tsx +3 -2
  785. package/src/interfaces/web/src/screens/project/McpsTab.tsx +62 -14
  786. package/src/interfaces/web/src/screens/project/Overview.tsx +36 -15
  787. package/src/interfaces/web/src/screens/project/RoutinesTab.tsx +93 -8
  788. package/src/interfaces/web/src/screens/project/SkillsTab.tsx +4 -1
  789. package/src/interfaces/web/src/screens/project/StructureTab.tsx +5 -4
  790. package/src/interfaces/web/src/screens/project/TasksTab.tsx +351 -129
  791. package/src/interfaces/web/src/screens/project/VarsTab.tsx +17 -5
  792. package/src/interfaces/web/src/styles.css +106 -31
  793. package/src/interfaces/web/src/types/daemon.ts +246 -2
  794. package/src/interfaces/web/src/vite-env.d.ts +20 -0
  795. package/src/interfaces/tui/plugin/command-shim.ts +0 -109
  796. package/src/interfaces/web/components.json +0 -25
  797. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js +0 -849
  798. package/src/interfaces/web/dist/assets/index-CvEoGtTf.js.map +0 -1
  799. package/src/interfaces/web/dist/assets/index-DzBBXFaO.css +0 -1
  800. package/src/interfaces/web/src/components/tasks/TaskDetailPanel.tsx +0 -142
  801. package/src/interfaces/web/src/components/ui/accordion.tsx +0 -72
  802. package/src/interfaces/web/src/components/ui/alert-dialog.tsx +0 -187
  803. package/src/interfaces/web/src/components/ui/alert.tsx +0 -76
  804. package/src/interfaces/web/src/components/ui/aspect-ratio.tsx +0 -22
  805. package/src/interfaces/web/src/components/ui/avatar.tsx +0 -107
  806. package/src/interfaces/web/src/components/ui/breadcrumb.tsx +0 -125
  807. package/src/interfaces/web/src/components/ui/button-group.tsx +0 -87
  808. package/src/interfaces/web/src/components/ui/calendar.tsx +0 -221
  809. package/src/interfaces/web/src/components/ui/card.tsx +0 -103
  810. package/src/interfaces/web/src/components/ui/carousel.tsx +0 -242
  811. package/src/interfaces/web/src/components/ui/chart.tsx +0 -371
  812. package/src/interfaces/web/src/components/ui/checkbox.tsx +0 -29
  813. package/src/interfaces/web/src/components/ui/collapsible.tsx +0 -19
  814. package/src/interfaces/web/src/components/ui/combobox.tsx +0 -295
  815. package/src/interfaces/web/src/components/ui/command.tsx +0 -196
  816. package/src/interfaces/web/src/components/ui/direction.tsx +0 -4
  817. package/src/interfaces/web/src/components/ui/drawer.tsx +0 -134
  818. package/src/interfaces/web/src/components/ui/empty.tsx +0 -104
  819. package/src/interfaces/web/src/components/ui/field.tsx +0 -236
  820. package/src/interfaces/web/src/components/ui/hover-card.tsx +0 -51
  821. package/src/interfaces/web/src/components/ui/input-otp.tsx +0 -85
  822. package/src/interfaces/web/src/components/ui/item.tsx +0 -201
  823. package/src/interfaces/web/src/components/ui/menubar.tsx +0 -280
  824. package/src/interfaces/web/src/components/ui/native-select.tsx +0 -61
  825. package/src/interfaces/web/src/components/ui/navigation-menu.tsx +0 -168
  826. package/src/interfaces/web/src/components/ui/pagination.tsx +0 -130
  827. package/src/interfaces/web/src/components/ui/progress.tsx +0 -83
  828. package/src/interfaces/web/src/components/ui/radio-group.tsx +0 -36
  829. package/src/interfaces/web/src/components/ui/resizable.tsx +0 -50
  830. package/src/interfaces/web/src/components/ui/scroll-area.tsx +0 -53
  831. package/src/interfaces/web/src/components/ui/sidebar.tsx +0 -726
  832. package/src/interfaces/web/src/components/ui/slider.tsx +0 -52
  833. package/src/interfaces/web/src/components/ui/sonner.tsx +0 -49
  834. package/src/interfaces/web/src/components/ui/table.tsx +0 -116
  835. package/src/interfaces/web/src/components/ui/toggle-group.tsx +0 -87
  836. package/src/interfaces/web/src/components/ui/toggle.tsx +0 -45
  837. package/src/interfaces/web/src/hooks/use-mobile.ts +0 -19
  838. package/src/interfaces/web/src/screens/base/GlobalTasksTab.tsx +0 -161
@@ -0,0 +1,94 @@
1
+ import { listRoutines, getRoutine } from "#core/stores/routines.js";
2
+ import { summarizeToolTrace } from "#core/agent/tool-summary.js";
3
+ import { resolveProject } from "../helpers.js";
4
+
5
+ // Run a routine on demand and WAIT for its verdict.
6
+ //
7
+ // The alternative was `run_shell("apx routine run …")`, and that is how it was
8
+ // being done: through the CLI, through the daemon, with the routine's whole
9
+ // stdout landing in the turn — plus, for anything the CLI could not express,
10
+ // python heredocs that rewrote routines.json by hand. One tool call replaces
11
+ // all of it, and the model gets back a verdict instead of a transcript.
12
+ //
13
+ // Blocking is the point. A routine is a job with an end: the agent says "voy a
14
+ // correr la rutina", stops, and speaks again when there is something to report.
15
+ // Polling in a tool loop would spend an iteration and a slice of context per
16
+ // check and still be slower.
17
+ const REPLY_CAP = 1500;
18
+
19
+ export default {
20
+ name: "run_routine",
21
+ schema: {
22
+ type: "function",
23
+ function: {
24
+ name: "run_routine",
25
+ description:
26
+ "Run one of a project's routines NOW and wait until it finishes. Returns " +
27
+ "its verdict (ok / error), what it reported, and which tools it used. " +
28
+ "Blocking: nothing else happens in this turn until the routine ends, so " +
29
+ "tell the user you are launching it before you call this. Use it to test " +
30
+ "a routine you just created or to trigger a scheduled job early. Use " +
31
+ "list_routines first if you are unsure of the name.",
32
+ parameters: {
33
+ type: "object",
34
+ properties: {
35
+ routine: { type: "string", description: "Routine name (exact, from list_routines)." },
36
+ project: { type: "string", description: "Project id, name or path. Omit for the default project." },
37
+ },
38
+ required: ["routine"],
39
+ },
40
+ },
41
+ },
42
+ makeHandler: ({ projects, plugins, registries, globalConfig, requirePermission }) =>
43
+ async ({ routine: name, project } = {}) => {
44
+ if (!name) return { error: "run_routine: routine is required" };
45
+ // A routine runs with permission_mode "total" by design (a cron has
46
+ // nobody to ask), so triggering one from chat is a real side effect.
47
+ await requirePermission("run_routine", { dangerous: true, args: { routine: name, project } });
48
+
49
+ const p = resolveProject(projects, project);
50
+ if (!p) return { error: `project not found: ${project}` };
51
+
52
+ const r = getRoutine(p.storagePath, name);
53
+ if (!r) {
54
+ return {
55
+ error: `routine "${name}" not found in project ${p.name || p.path}`,
56
+ available: listRoutines(p.storagePath).map((x) => x.name),
57
+ };
58
+ }
59
+
60
+ // Imported here, not at module scope: the runner imports the tool
61
+ // registry (a routine runs a tool loop) and the registry imports this
62
+ // handler, so a static import closes the cycle and one of the two ends
63
+ // up half-initialised. Deferring to call time breaks it.
64
+ const { runRoutineNow } = await import("#core/routines/runner.js");
65
+
66
+ let out;
67
+ try {
68
+ out = await runRoutineNow(
69
+ { project: p, projects, plugins, registries, globalConfig, trigger: "agent" },
70
+ r
71
+ );
72
+ } catch (e) {
73
+ return { routine: name, status: "error", error: e.message };
74
+ }
75
+
76
+ const reply = String(out?.reply || out?.text || "");
77
+ return {
78
+ routine: name,
79
+ project: p.name || p.path,
80
+ status: out?.status === "error" ? "error" : "ok",
81
+ ...(out?.skipped ? { skipped: true, note: out.note } : {}),
82
+ ...(out?.error ? { error: String(out.error).slice(0, 600) } : {}),
83
+ ...(out?.blocked_tools?.length ? { blocked_tools: out.blocked_tools } : {}),
84
+ // What it said, capped: the routine's own ledger and conversation hold
85
+ // the full text, and this is a status report, not a transcript.
86
+ reply: reply.length > REPLY_CAP ? reply.slice(0, REPLY_CAP) + "…(truncated)" : reply,
87
+ // Counts, not arguments — enough to tell "it worked" from "it narrated".
88
+ ...(summarizeToolTrace(out?.trace) ? { tools_used: summarizeToolTrace(out.trace) } : {}),
89
+ ...(out?.conversation_id ? { conversation_id: out.conversation_id } : {}),
90
+ last_run_at: out?.last_run_at,
91
+ next_run_at: out?.next_run_at,
92
+ };
93
+ },
94
+ };
@@ -1,7 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { resolveProject, safePathJoin } from "../helpers.js";
3
3
 
4
- function run(command, { cwd, timeoutMs }) {
4
+ function run(command, { cwd, timeoutMs, abortSignal }) {
5
5
  return new Promise((resolve) => {
6
6
  const child = spawn("sh", ["-lc", command], { cwd, env: process.env });
7
7
  let stdout = "";
@@ -12,10 +12,19 @@ function run(command, { cwd, timeoutMs }) {
12
12
  child.kill("SIGTERM");
13
13
  }, timeoutMs);
14
14
 
15
+ const onAbort = () => {
16
+ child.kill("SIGTERM");
17
+ };
18
+ if (abortSignal) {
19
+ if (abortSignal.aborted) onAbort();
20
+ else abortSignal.addEventListener("abort", onAbort, { once: true });
21
+ }
22
+
15
23
  child.stdout.on("data", (d) => { stdout += d.toString(); });
16
24
  child.stderr.on("data", (d) => { stderr += d.toString(); });
17
25
  child.on("close", (code, signal) => {
18
26
  clearTimeout(timer);
27
+ abortSignal?.removeEventListener("abort", onAbort);
19
28
  resolve({ code, signal, timedOut, stdout, stderr });
20
29
  });
21
30
  });
@@ -43,6 +52,25 @@ function isSafeShellCommand(command) {
43
52
  });
44
53
  }
45
54
 
55
+ // Commands that stop or restart the daemon this tool is running INSIDE.
56
+ // Killing your own host mid-turn is not a dangerous-but-valid action, it is a
57
+ // guaranteed loss: the process dies, every in-flight turn dies with it, the
58
+ // stream to the user is cut, and the work of the turn is gone with no report.
59
+ // Seen in production — an agent that had just edited a handler ran `apx restart`
60
+ // "to load the new code" and executed itself two steps from finishing.
61
+ //
62
+ // Checked per command SEGMENT, so `cd x && apx restart` and
63
+ // `sleep 1; apx daemon stop` are both caught, while a segment that merely
64
+ // mentions the command — `echo "run apx restart when I'm done"` — is not.
65
+ const SELF_KILL_RE =
66
+ /^(?:apx\s+(?:restart\b|daemon\s+(?:restart|stop|kill)\b)|(?:pkill|killall)\b.*\bapx[-\s]?daemon\b)/i;
67
+
68
+ export function killsOwnDaemon(command) {
69
+ return String(command || "")
70
+ .split(/\s*(?:;|\||&&|\|\|)\s*/)
71
+ .some((segment) => SELF_KILL_RE.test(segment.trim()));
72
+ }
73
+
46
74
  export default {
47
75
  name: "run_shell",
48
76
  schema: {
@@ -62,15 +90,29 @@ export default {
62
90
  },
63
91
  },
64
92
  },
65
- makeHandler: ({ projects, requirePermission }) => async ({ project, cwd = ".", command, timeout_s = 60, confirmed = false }) => {
93
+ makeHandler: (ctx) => async ({ project, cwd = ".", command, timeout_s = 60, confirmed = false }) => {
94
+ const { projects, requirePermission, abortSignal } = ctx;
66
95
  await requirePermission("run_shell", { dangerous: !isSafeShellCommand(command), confirmed, args: { command } });
67
96
  if (!command) throw new Error("run_shell: command required");
97
+ if (killsOwnDaemon(command)) {
98
+ // An error, not a confirmation prompt: there is no answer that makes this
99
+ // succeed. Say why, and say what to do instead — code the agent just wrote
100
+ // is loaded by a restart the USER runs, after the turn has reported back.
101
+ return {
102
+ error:
103
+ "refused: that command restarts or stops the APX daemon you are running inside. " +
104
+ "It would kill this turn before you could report anything. Finish the work and tell " +
105
+ "the user to run it — a daemon restart is theirs to make, not something to do mid-turn.",
106
+ command,
107
+ };
108
+ }
68
109
 
69
110
  const p = resolveProject(projects, project);
70
111
  const workingDir = safePathJoin(p.path, cwd);
71
112
  const result = await run(command, {
72
113
  cwd: workingDir,
73
114
  timeoutMs: Math.max(1, Math.min(timeout_s, 600)) * 1000,
115
+ abortSignal,
74
116
  });
75
117
  return {
76
118
  exit_code: result.code,
@@ -2,26 +2,48 @@ import { canNudge, recordNudge, nudgeFeedbackKeyboard } from "#core/nudge/index.
2
2
  import { CHANNELS } from "#core/constants/channels.js";
3
3
 
4
4
  /**
5
- * Is the person we are about to message the same person who is talking to us
6
- * right now?
5
+ * Is this message a REACTION to something that arrived, or the agent deciding
6
+ * on its own to speak?
7
7
  *
8
- * PUSH PATH 3 OF 4, and the only one whose solicited-ness is not fixed. When
9
- * the turn came in over Telegram and the text is going back to that same chat,
10
- * the user is on the other end waiting — that is a reply, not an interruption,
11
- * and spending their daily budget on it would be wrong. Every other case (a
12
- * routine, a web turn pushing to the phone, a cron) is APX choosing to speak.
8
+ * PUSH PATH 3 OF 4, and the only one whose solicited-ness is not fixed. The
9
+ * budget exists to stop APX inventing reasons to interrupt; it was never meant
10
+ * to swallow an answer to a message somebody actually sent.
11
+ *
12
+ * A turn on a conversation channel EXISTS because something came in a
13
+ * WhatsApp from a contact, a web prompt, an A2A relay. Reporting that to the
14
+ * owner is the point of the bridge, not an interruption the agent thought up,
15
+ * so it does not spend the allowance. Only a self-started turn does: a routine
16
+ * or a cron, which arrive on CHANNELS.ROUTINE and keep paying.
17
+ *
18
+ * Recipient still matters, or "someone messaged me" becomes a licence to push
19
+ * anywhere. Telegram keeps its stricter rule (back to the originating chat
20
+ * only); every other channel may reach the DEFAULT chat — the owner's — and
21
+ * naming an explicit chat_id makes it a push again.
22
+ *
23
+ * NOTE: reactive means unbounded by design. A third party who messages the
24
+ * WhatsApp line controls how often the owner is pinged. That is the trade the
25
+ * owner asked for; the ledger still records every send.
13
26
  */
14
- function isReplyToTheLiveChat(ctx, chatId) {
15
- if (ctx?.channel !== CHANNELS.TELEGRAM) return false;
16
- // buildTelegramMeta (channels/telegram/helpers.js:59) spells it `chatId`.
17
- // Reading `chat_id` here would have silently made every reply look
18
- // unsolicited and started charging the user's budget for their own answers.
19
- const origin = ctx?.channelMeta?.chatId ?? ctx?.channelMeta?.chat_id;
20
- if (!origin) return false;
21
- // No chat_id given means "the channel default", which for a Telegram turn is
22
- // the chat it arrived on.
23
- if (chatId == null || chatId === "") return true;
24
- return String(chatId) === String(origin);
27
+ function isReactiveReply(ctx, chatId) {
28
+ // No channel at all, or a routine/cron turn: the agent chose to speak.
29
+ if (!ctx?.channel) return false;
30
+ if (ctx.channel === CHANNELS.ROUTINE) return false;
31
+
32
+ if (ctx.channel === CHANNELS.TELEGRAM) {
33
+ // buildTelegramMeta (channels/telegram/helpers.js:59) spells it `chatId`.
34
+ // Reading `chat_id` here would have silently made every reply look
35
+ // unsolicited and started charging the user's budget for their own answers.
36
+ const origin = ctx?.channelMeta?.chatId ?? ctx?.channelMeta?.chat_id;
37
+ if (!origin) return false;
38
+ // No chat_id given means "the channel default", which for a Telegram turn
39
+ // is the chat it arrived on.
40
+ if (chatId == null || chatId === "") return true;
41
+ return String(chatId) === String(origin);
42
+ }
43
+
44
+ // WhatsApp, web, desktop, api, a2a…: no Telegram chat of their own, so the
45
+ // default chat is the owner's and that is the only one they get for free.
46
+ return chatId == null || chatId === "";
25
47
  }
26
48
 
27
49
  function decodeBase64(b64) {
@@ -126,7 +148,7 @@ export default {
126
148
  );
127
149
  }
128
150
 
129
- const solicited = isReplyToTheLiveChat(ctx, chat_id);
151
+ const solicited = isReactiveReply(ctx, chat_id);
130
152
  const gate = canNudge(
131
153
  {
132
154
  kind: ctx?.channelMeta?.routineName ? `routine:${ctx.channelMeta.routineName}` : "agent_message",
@@ -0,0 +1,44 @@
1
+ import { setAgentPrompt } from "#core/apc/agent-write.js";
2
+ import { projectMeta, resolveProject } from "../helpers.js";
3
+
4
+ // Replace an existing agent's system prompt (the body of its `.md`), keeping
5
+ // every frontmatter field. The native counterpart of `apx agent set --prompt`
6
+ // and the MCP `agent_set_prompt`, so the super-agent can rewrite an agent's
7
+ // instructions without shelling out or hand-editing the file.
8
+ export default {
9
+ name: "set_agent_prompt",
10
+ schema: {
11
+ type: "function",
12
+ function: {
13
+ name: "set_agent_prompt",
14
+ description:
15
+ "Replace an existing project agent's system prompt (its instructions), keeping its name/role/skills/model. Use this to fix or rewrite what an agent does — not run_shell, not write_file on the .md. `system` is required and non-empty.",
16
+ parameters: {
17
+ type: "object",
18
+ required: ["agent", "system"],
19
+ properties: {
20
+ project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
21
+ agent: { type: "string", description: "Slug of the existing agent (from list_agents)." },
22
+ system: { type: "string", description: "The new full system prompt. REQUIRED, non-empty." },
23
+ },
24
+ },
25
+ },
26
+ },
27
+ makeHandler: ({ projects, requirePermission }) => async ({ project, agent, system } = {}) => {
28
+ await requirePermission("set_agent_prompt", { dangerous: true, args: { agent, project } });
29
+ if (!agent) return { error: "agent required" };
30
+ let p;
31
+ try {
32
+ p = resolveProject(projects, project || "default");
33
+ } catch (e) {
34
+ return { error: e.message };
35
+ }
36
+ try {
37
+ setAgentPrompt(p, agent, system);
38
+ projects.rebuild(p.id);
39
+ return { ok: true, agent, project: projectMeta(projects, p) };
40
+ } catch (e) {
41
+ return { error: e.message };
42
+ }
43
+ },
44
+ };
@@ -0,0 +1,69 @@
1
+ // view_media — load one of a skill's images INTO the agent's own context so it
2
+ // can reason about it (a swing position, a grip, a course diagram). The image
3
+ // manifest (id → caption) rides in the prompt for ~nothing; the pixels are
4
+ // pulled only when the agent asks, on the turn it asks — the same
5
+ // pay-as-you-go rule as read_skill for text.
6
+ //
7
+ // The bytes come back as base64 in an `images` field. run-agent.js lifts that
8
+ // off the JSON result and onto the tool message so a vision engine (Gemini)
9
+ // renders it as an inlineData part; text engines simply ignore it and see the
10
+ // caption. Nothing base64 ever lands in the transcript text.
11
+ import fs from "node:fs";
12
+
13
+ // A guard so a huge asset can't blow the turn's token budget. ~5 MB of base64
14
+ // is already a lot for one image; above that, tell the model to pick another.
15
+ const MAX_BYTES = 5 * 1024 * 1024;
16
+
17
+ export default {
18
+ name: "view_media",
19
+ schema: {
20
+ type: "function",
21
+ function: {
22
+ name: "view_media",
23
+ description:
24
+ "Load one of your skill's images into your own context so you can see and reason about it (a position, a grip, a diagram). Pass the image id from the skill manifest. Only call this when you actually need to look — to attach an image to your reply, use attach_media instead.",
25
+ parameters: {
26
+ type: "object",
27
+ properties: {
28
+ id: { type: "string", description: "image id from the skill manifest" },
29
+ skill: { type: "string", description: "optional skill slug to disambiguate a shared id" },
30
+ },
31
+ required: ["id"],
32
+ },
33
+ },
34
+ },
35
+ makeHandler: (ctx = {}) => ({ id, skill } = {}) => {
36
+ if (!id) throw new Error("view_media: id required");
37
+ const pool = Array.isArray(ctx.attachableMedia) ? ctx.attachableMedia : [];
38
+ if (!pool.length) return { error: "no images available for this agent's skills." };
39
+
40
+ const want = String(id).trim();
41
+ const matches = pool.filter((m) => m.id === want && (!skill || m.skill === skill));
42
+ if (!matches.length) {
43
+ return {
44
+ error: `no image "${want}"${skill ? ` in skill ${skill}` : ""}.`,
45
+ available: pool.map((m) => ({ id: m.id, skill: m.skill, caption: m.caption })),
46
+ };
47
+ }
48
+ const item = matches[0];
49
+ let buf;
50
+ try {
51
+ buf = fs.readFileSync(item.path);
52
+ } catch (e) {
53
+ return { error: `could not read image "${want}": ${e?.message || e}` };
54
+ }
55
+ if (buf.length > MAX_BYTES) {
56
+ return {
57
+ error: `image "${want}" is ${(buf.length / 1048576).toFixed(1)} MB, over the ${(MAX_BYTES / 1048576).toFixed(0)} MB view limit.`,
58
+ };
59
+ }
60
+ return {
61
+ ok: true,
62
+ id: item.id,
63
+ skill: item.skill,
64
+ caption: item.caption || "",
65
+ note: `Loaded image "${item.id}" — described in the caption and shown to you now.`,
66
+ images: [{ data: buf.toString("base64"), mime: item.mime || "image/jpeg" }],
67
+ };
68
+ },
69
+ };
@@ -0,0 +1,52 @@
1
+ import { appendAgentMemory, writeAgentMemory } from "#core/agent/memory.js";
2
+ import { readAgents } from "#core/apc/parser.js";
3
+ import { projectMeta, resolveProject } from "../helpers.js";
4
+
5
+ // Write ANOTHER agent's memory (~/.apx/projects/<id>/agents/<slug>/memory.md).
6
+ // Distinct from `remember`, which writes the super-agent's OWN notebook: this
7
+ // seeds or updates a project agent's memory so it can track progress across
8
+ // runs (e.g. a coach recording which topics it has already taught). Append is
9
+ // the default; `mode: "replace"` overwrites the whole file.
10
+ export default {
11
+ name: "write_agent_memory",
12
+ schema: {
13
+ type: "function",
14
+ function: {
15
+ name: "write_agent_memory",
16
+ description:
17
+ "Write a note into a PROJECT AGENT's own memory.md (not your own notebook — that's `remember`). Use it to seed or update what another agent knows across runs. Default mode appends a dated line under '## Recent context'; mode 'replace' overwrites the whole file. Give the agent slug (from list_agents).",
18
+ parameters: {
19
+ type: "object",
20
+ required: ["agent", "content"],
21
+ properties: {
22
+ project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
23
+ agent: { type: "string", description: "Slug of the agent whose memory to write (from list_agents)." },
24
+ content: { type: "string", description: "The note (append mode) or the full memory body (replace mode)." },
25
+ mode: { type: "string", enum: ["append", "replace"], description: "append (default) adds a dated line under Recent context; replace overwrites." },
26
+ },
27
+ },
28
+ },
29
+ },
30
+ makeHandler: ({ projects, requirePermission }) => async ({ project, agent, content, mode = "append" } = {}) => {
31
+ await requirePermission("write_agent_memory", { dangerous: true, args: { agent, project } });
32
+ if (!agent) return { error: "agent required" };
33
+ if (!content || !String(content).trim()) return { error: "content required" };
34
+ let p;
35
+ try {
36
+ p = resolveProject(projects, project || "default");
37
+ } catch (e) {
38
+ return { error: e.message };
39
+ }
40
+ if (!readAgents(p.path).some((a) => a.slug === agent)) {
41
+ return { error: `agent ${agent} not found in ${projectMeta(projects, p).name}` };
42
+ }
43
+ try {
44
+ const path = mode === "replace"
45
+ ? writeAgentMemory(p, agent, String(content))
46
+ : appendAgentMemory(p, agent, String(content));
47
+ return { ok: true, agent, mode, project: projectMeta(projects, p), path };
48
+ } catch (e) {
49
+ return { error: e.message };
50
+ }
51
+ },
52
+ };
@@ -3,11 +3,39 @@
3
3
  // core/apc/projects-helpers.js and is re-exported here for back-compat.
4
4
  import path from "node:path";
5
5
  import { agentSkills, buildAgentSystem as buildCoreAgentSystem } from "#core/agent/build-agent-system.js";
6
+ import { agentForcedModel } from "#core/agent/agent-model.js";
6
7
  import { buildConfirmDescription } from "#core/confirmation/index.js";
7
8
  import { PERMISSION_MODES, DEFAULT_PERMISSION_MODE } from "#core/constants/permissions.js";
8
9
 
9
10
  export { projectMeta, resolveProject } from "#core/apc/projects-helpers.js";
10
11
 
12
+ /**
13
+ * A missing-argument error that names what the tool actually takes.
14
+ *
15
+ * "task required" is true and useless. The model that triggered it had passed
16
+ * `id` — the key list_tasks hands back — so the error confirmed something was
17
+ * missing without saying what would satisfy it. It retried the identical call,
18
+ * gave up, and left the task open. Naming the accepted keys and echoing the
19
+ * ones that arrived ends that in one step instead of three.
20
+ *
21
+ * @param {string} tool tool name, for the message
22
+ * @param {string} missing the parameter that was not supplied
23
+ * @param {{required?: string[], optional?: string[]}} accepts
24
+ * @param {object} got the args the model actually sent
25
+ */
26
+ export function missingArg(tool, missing, accepts = {}, got = {}) {
27
+ const required = accepts.required || [];
28
+ const optional = accepts.optional || [];
29
+ const sent = Object.keys(got || {});
30
+ return {
31
+ error:
32
+ `${missing} required. ${tool} takes ${required.join(", ") || "(none required)"}` +
33
+ `${optional.length ? ` (optional: ${optional.join(", ")})` : ""}` +
34
+ `${sent.length ? `; you sent ${sent.join(", ")}` : "; you sent nothing"}.`,
35
+ expects: { required, optional },
36
+ };
37
+ }
38
+
11
39
  export function safePathJoin(root, sub = ".") {
12
40
  const target = path.resolve(root, sub || ".");
13
41
  const rootResolved = path.resolve(root);
@@ -24,10 +52,14 @@ export function skillsFromFields(fields = {}) {
24
52
  export function agentRow(agent) {
25
53
  return {
26
54
  slug: agent.slug,
27
- role: agent.fields.Role || null,
28
- model: agent.fields.Model || null,
29
- language: agent.fields.Language || null,
30
- description: agent.fields.Description || null,
55
+ name: agent.name || agent.fields?.Name || agent.slug,
56
+ type: agent.fields?.Type || null,
57
+ role: agent.fields?.Role || null,
58
+ // Only a real override is worth telling the model about — `inherit` says
59
+ // nothing it can act on.
60
+ model: agentForcedModel(agent) || null,
61
+ language: agent.fields?.Language || null,
62
+ description: agent.fields?.Description || null,
31
63
  skills: skillsFromFields(agent.fields),
32
64
  };
33
65
  }
@@ -13,7 +13,14 @@ export const TOOLS = Object.freeze({
13
13
  LIST_AGENTS: "list_agents",
14
14
  LIST_VAULT_AGENTS: "list_vault_agents",
15
15
  IMPORT_AGENT: "import_agent",
16
+ CREATE_AGENT: "create_agent",
17
+ SET_AGENT_PROMPT: "set_agent_prompt",
18
+ WRITE_AGENT_MEMORY: "write_agent_memory",
19
+ CONFIGURE_AGENT: "configure_agent",
20
+ REMOVE_AGENT: "remove_agent",
16
21
  LIST_MCPS: "list_mcps",
22
+ LIST_MCP_TOOLS: "list_mcp_tools",
23
+ ADD_MCP: "add_mcp",
17
24
 
18
25
  // Memory
19
26
  READ_AGENT_MEMORY: "read_agent_memory",
@@ -36,13 +43,23 @@ export const TOOLS = Object.freeze({
36
43
  // Skills + dynamic tool surface
37
44
  LIST_SKILLS: "list_skills",
38
45
  LOAD_SKILL: "load_skill",
46
+ READ_SKILL: "read_skill",
47
+ ATTACH_MEDIA: "attach_media",
48
+ VIEW_MEDIA: "view_media",
39
49
  DISCOVER_TOOLS: "discover_tools",
40
50
 
41
51
  // Tasks
42
52
  LIST_TASKS: "list_tasks",
43
53
  CREATE_TASK: "create_task",
54
+ COMPLETE_TASK: "complete_task",
55
+ COMMENT_TASK: "comment_task",
44
56
  RECORD_COMMITMENT: "record_commitment",
57
+ MARK_COMMITMENT: "mark_commitment",
45
58
  REMEMBER_ROUTINE: "remember_routine",
59
+
60
+ // Routines
61
+ LIST_ROUTINES: "list_routines",
62
+ RUN_ROUTINE: "run_routine",
46
63
  LIST_COMMITMENTS: "list_commitments",
47
64
 
48
65
  // Interaction
@@ -68,6 +85,12 @@ export const TOOLS = Object.freeze({
68
85
  GITHUB_LIST_REPOS: "github_list_repos",
69
86
  GITHUB_CREATE_ISSUE: "github_create_issue",
70
87
 
88
+ // Integrations — Google Calendar plugin (see core/integrations/plugins/calendar.js)
89
+ CALENDAR_LIST_EVENTS: "calendar_list_events",
90
+ CALENDAR_FIND_SLOT: "calendar_find_slot",
91
+ CALENDAR_CREATE_EVENT: "calendar_create_event",
92
+ CALENDAR_UPDATE_EVENT: "calendar_update_event",
93
+
71
94
  // Integrations — Obsidian plugin (see core/integrations/plugins/obsidian.js)
72
95
  OBSIDIAN_SEARCH_NOTES: "obsidian_search_notes",
73
96
  OBSIDIAN_READ_NOTE: "obsidian_read_note",
@@ -104,8 +127,18 @@ export const NATIVE_TOOL_NAMES = new Set([
104
127
  TOOLS.LIST_AGENTS,
105
128
  TOOLS.LIST_VAULT_AGENTS,
106
129
  TOOLS.IMPORT_AGENT,
130
+ TOOLS.CREATE_AGENT,
131
+ TOOLS.SET_AGENT_PROMPT,
132
+ TOOLS.WRITE_AGENT_MEMORY,
133
+ TOOLS.CONFIGURE_AGENT,
134
+ TOOLS.REMOVE_AGENT,
135
+ TOOLS.ADD_MCP,
136
+ TOOLS.COMPLETE_TASK,
137
+ TOOLS.COMMENT_TASK,
138
+ TOOLS.MARK_COMMITMENT,
107
139
  TOOLS.ADD_PROJECT,
108
140
  TOOLS.LIST_MCPS,
141
+ TOOLS.LIST_MCP_TOOLS,
109
142
  TOOLS.READ_AGENT_MEMORY,
110
143
  TOOLS.LIST_FILES,
111
144
  TOOLS.READ_FILE,
@@ -129,6 +162,10 @@ export const NATIVE_TOOL_NAMES = new Set([
129
162
  TOOLS.OBSIDIAN_READ_NOTE,
130
163
  TOOLS.OBSIDIAN_WRITE_NOTE,
131
164
  TOOLS.OBSIDIAN_LIST_NOTES,
165
+ TOOLS.CALENDAR_LIST_EVENTS,
166
+ TOOLS.CALENDAR_FIND_SLOT,
167
+ TOOLS.CALENDAR_CREATE_EVENT,
168
+ TOOLS.CALENDAR_UPDATE_EVENT,
132
169
  TOOLS.SEND_TELEGRAM,
133
170
  TOOLS.SET_IDENTITY,
134
171
  TOOLS.SET_PERMISSION_MODE,
@@ -136,11 +173,16 @@ export const NATIVE_TOOL_NAMES = new Set([
136
173
  TOOLS.REMEMBER,
137
174
  TOOLS.LIST_SKILLS,
138
175
  TOOLS.LOAD_SKILL,
176
+ TOOLS.READ_SKILL,
177
+ TOOLS.ATTACH_MEDIA,
178
+ TOOLS.VIEW_MEDIA,
139
179
  TOOLS.LIST_TASKS,
140
180
  TOOLS.CREATE_TASK,
141
181
  TOOLS.RECORD_COMMITMENT,
142
182
  TOOLS.LIST_COMMITMENTS,
143
183
  TOOLS.REMEMBER_ROUTINE,
184
+ TOOLS.LIST_ROUTINES,
185
+ TOOLS.RUN_ROUTINE,
144
186
  TOOLS.ASK_QUESTIONS,
145
187
  TOOLS.SEARCH_SESSIONS,
146
188
  TOOLS.TRANSCRIBE_AUDIO,
@@ -187,6 +229,7 @@ export const CODE_PLAN_TOOLS = Object.freeze([
187
229
  TOOLS.TAIL_MESSAGES,
188
230
  TOOLS.LIST_SKILLS,
189
231
  TOOLS.LOAD_SKILL,
232
+ TOOLS.READ_SKILL,
190
233
  TOOLS.LIST_TASKS,
191
234
  TOOLS.LIST_COMMITMENTS,
192
235
  TOOLS.ASK_QUESTIONS,
@@ -236,6 +279,15 @@ export const SIDE_EFFECT_TOOLS = new Set([
236
279
  TOOLS.RUN_SHELL,
237
280
  TOOLS.CALL_RUNTIME,
238
281
  TOOLS.ADD_PROJECT,
282
+ TOOLS.CREATE_AGENT,
283
+ TOOLS.SET_AGENT_PROMPT,
284
+ TOOLS.WRITE_AGENT_MEMORY,
285
+ TOOLS.CONFIGURE_AGENT,
286
+ TOOLS.REMOVE_AGENT,
287
+ TOOLS.ADD_MCP,
288
+ TOOLS.COMPLETE_TASK,
289
+ TOOLS.COMMENT_TASK,
290
+ TOOLS.MARK_COMMITMENT,
239
291
  TOOLS.SET_IDENTITY,
240
292
  ]);
241
293
 
@@ -245,6 +297,18 @@ export const SIDE_EFFECT_TOOLS = new Set([
245
297
  */
246
298
  export const ACK_ONLY_TOOLS = new Set([TOOLS.SEND_TELEGRAM]);
247
299
 
300
+ /**
301
+ * Tools that put words in front of a PERSON.
302
+ *
303
+ * Deduping these needs more than the exact (name + args) match every other
304
+ * side effect gets: a model asked to relay something re-words it each time it
305
+ * tries, so three sends with the same content and three different openers all
306
+ * looked distinct and all three arrived. Measured on 2026-08-30 — one WhatsApp
307
+ * from a contact produced three near-identical Telegram messages to the owner.
308
+ * See loop/side-effects.js for the comparison itself.
309
+ */
310
+ export const MESSAGE_TOOLS = new Set([TOOLS.SEND_TELEGRAM]);
311
+
248
312
  /**
249
313
  * Tools whose semantics REQUIRE handing control back to a human. The loop
250
314
  * breaks after these even under a completion contract, because the task
@@ -64,12 +64,35 @@ function buildSchema(entry) {
64
64
  };
65
65
  }
66
66
 
67
+ /**
68
+ * A bridged tool runs in the DAEMON's process, which stands in the apx checkout
69
+ * — so a relative path it is handed resolves against that checkout instead of
70
+ * against the project whose agent asked. `grep {path: "work/marketing/…"}` from
71
+ * Magui in Appsi came back "path does not exist:
72
+ * /…/agentprojectcontext/apx/work/marketing/…". A native tool has the registry
73
+ * to ask (see scopeProjects); a bridged one crosses HTTP and arrives with no
74
+ * project at all, so the caller's directory has to travel WITH the request.
75
+ *
76
+ * Only for the file tools, and only when the caller did not name one: `cwd` is
77
+ * a default for relative paths, never an override of an absolute one.
78
+ */
79
+ function bridgeCwd(entry, args, ctx) {
80
+ if (entry.category !== "file") return null;
81
+ if (args.cwd) return null;
82
+ const scoped = ctx?.projects?.current?.();
83
+ return scoped?.path || null;
84
+ }
85
+
67
86
  function buildHandler(entry) {
68
- return ({ globalConfig }) => async (args = {}) => {
87
+ return (ctx = {}) => async (args = {}) => {
88
+ const { globalConfig } = ctx;
69
89
  const port = globalConfig?.port || process.env.APX_PORT || 7430;
70
90
  const method = String(entry.endpoint?.method || "POST").toUpperCase();
71
91
  let url = `http://127.0.0.1:${port}${entry.endpoint?.path || ""}`;
72
92
 
93
+ const cwd = bridgeCwd(entry, args, ctx);
94
+ if (cwd) args = { ...args, cwd };
95
+
73
96
  const token = daemonToken();
74
97
  const opts = {
75
98
  method,