@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,121 @@
1
+ // A skill can carry images (a golf grip, a swing position, a diagram) so an
2
+ // agent can SEND you the right one when it teaches a concept, and — on demand —
3
+ // LOOK at one itself. The model never gets the pixels for free: what rides in
4
+ // the prompt is a cheap text manifest (id → caption). The agent picks an id and
5
+ // attaches it to its message (attach_media), or pulls it into its own context
6
+ // to reason about (view_media).
7
+ //
8
+ // Where the files live:
9
+ // • dir-style skill (~/.apx/skills/<slug>/SKILL.md) → alongside SKILL.md
10
+ // • flat-style skill (<proj>/.apc/skills/<slug>.md) → a sibling <slug>/ dir
11
+ // A `media.json` in that dir is the manifest; without one, image files in the
12
+ // dir are auto-listed (id = filename without extension, no caption).
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+
16
+ const IMAGE_EXT = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".svg"]);
17
+
18
+ const MIME_BY_EXT = {
19
+ ".jpg": "image/jpeg",
20
+ ".jpeg": "image/jpeg",
21
+ ".png": "image/png",
22
+ ".gif": "image/gif",
23
+ ".webp": "image/webp",
24
+ ".bmp": "image/bmp",
25
+ ".svg": "image/svg+xml",
26
+ };
27
+
28
+ /** The asset directory for a resolved skill file (see file header). */
29
+ export function skillAssetsDir(skillFile) {
30
+ if (!skillFile) return "";
31
+ const base = path.basename(skillFile);
32
+ if (base.toLowerCase() === "skill.md") return path.dirname(skillFile);
33
+ // flat "<slug>.md" → sibling "<slug>/"
34
+ return skillFile.replace(/\.md$/i, "");
35
+ }
36
+
37
+ function mimeFor(file) {
38
+ return MIME_BY_EXT[path.extname(file).toLowerCase()] || "application/octet-stream";
39
+ }
40
+
41
+ function isImage(file) {
42
+ return IMAGE_EXT.has(path.extname(file).toLowerCase());
43
+ }
44
+
45
+ /**
46
+ * The media a skill declares (or that simply sit in its asset dir).
47
+ *
48
+ * @param {{slug:string, file:string}} skill a loadSkill() result (needs .file)
49
+ * @returns {Array<{id, file, path, caption, mime, exists}>}
50
+ */
51
+ export function readSkillMedia(skill) {
52
+ const dir = skillAssetsDir(skill?.file);
53
+ if (!dir || !fs.existsSync(dir)) return [];
54
+
55
+ const items = [];
56
+ const seen = new Set(); // ids already taken
57
+ const seenFiles = new Set(); // basenames already claimed by the manifest
58
+
59
+ // 1) explicit manifest
60
+ const manifestPath = path.join(dir, "media.json");
61
+ if (fs.existsSync(manifestPath)) {
62
+ let manifest = [];
63
+ try { manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8")); } catch { manifest = []; }
64
+ const list = Array.isArray(manifest) ? manifest : Array.isArray(manifest?.media) ? manifest.media : [];
65
+ for (const raw of list) {
66
+ if (!raw || typeof raw !== "object") continue;
67
+ const file = String(raw.file || raw.path || "").trim();
68
+ if (!file) continue;
69
+ const id = String(raw.id || file.replace(/\.[^.]+$/, "")).trim();
70
+ if (seen.has(id)) continue;
71
+ seen.add(id);
72
+ seenFiles.add(path.basename(file));
73
+ const abs = path.isAbsolute(file) ? file : path.join(dir, file);
74
+ items.push({
75
+ id,
76
+ file: path.basename(file),
77
+ path: abs,
78
+ caption: String(raw.caption || raw.when || raw.description || "").trim(),
79
+ mime: raw.mime || mimeFor(file),
80
+ exists: fs.existsSync(abs),
81
+ });
82
+ }
83
+ }
84
+
85
+ // 2) auto-discover any image files not already in the manifest
86
+ let entries = [];
87
+ try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { entries = []; }
88
+ for (const e of entries) {
89
+ if (!e.isFile()) continue;
90
+ if (!isImage(e.name)) continue;
91
+ if (seenFiles.has(e.name)) continue; // already described by the manifest
92
+ const id = e.name.replace(/\.[^.]+$/, "");
93
+ if (seen.has(id)) continue;
94
+ seen.add(id);
95
+ const abs = path.join(dir, e.name);
96
+ items.push({
97
+ id,
98
+ file: e.name,
99
+ path: abs,
100
+ caption: "",
101
+ mime: mimeFor(e.name),
102
+ exists: true,
103
+ });
104
+ }
105
+
106
+ return items;
107
+ }
108
+
109
+ /** A one-line-per-image manifest for the system prompt / read_skill result. */
110
+ export function renderMediaManifest(media) {
111
+ const usable = (media || []).filter((m) => m.exists);
112
+ if (!usable.length) return "";
113
+ const lines = usable.map((m) => `- ${m.id}${m.caption ? ` — ${m.caption}` : ""}`);
114
+ return ["Images available (attach with attach_media, inspect with view_media):", ...lines].join("\n");
115
+ }
116
+
117
+ /** Resolve one media item by id within a list. */
118
+ export function findMedia(media, id) {
119
+ const want = String(id || "").trim();
120
+ return (media || []).find((m) => m.id === want) || null;
121
+ }
@@ -0,0 +1,61 @@
1
+ // Where a skill's files actually live — APX may only hold a symlink.
2
+ //
3
+ // `source` is the APX layer (builtin / global / project). `origin` is the
4
+ // host that owns the bytes: claude, cursor, codex, agents, or APX itself.
5
+ // The UI badge uses origin so a linked-in Claude skill does not look like
6
+ // "you wrote this in ~/.apx/skills".
7
+ import fs from "node:fs";
8
+ import os from "node:os";
9
+ import path from "node:path";
10
+
11
+ export const SKILL_ORIGIN_HOSTS = Object.freeze([
12
+ ["claude", [".claude", "skills"]],
13
+ ["cursor", [".cursor", "skills"]],
14
+ ["codex", [".codex", "skills"]],
15
+ ["agents", [".agents", "skills"]],
16
+ ]);
17
+
18
+ function realOrResolve(p) {
19
+ try { return fs.realpathSync(p); } catch { return path.resolve(p); }
20
+ }
21
+
22
+ function homeRelLiteral(p, home) {
23
+ const abs = path.resolve(p);
24
+ const root = path.resolve(home);
25
+ if (abs === root) return "~";
26
+ if (abs.startsWith(root + path.sep)) return "~" + abs.slice(root.length);
27
+ return abs;
28
+ }
29
+
30
+ export function homeRel(p, home = os.homedir()) {
31
+ const abs = realOrResolve(p);
32
+ const root = realOrResolve(home);
33
+ if (abs === root) return "~";
34
+ if (abs.startsWith(root + path.sep)) return "~" + abs.slice(root.length);
35
+ return abs;
36
+ }
37
+
38
+ /**
39
+ * @param {string} file path to SKILL.md (or a flat <slug>.md)
40
+ * @param {{ source?: string, home?: string }} [opts]
41
+ * @returns {{ origin: string, origin_path: string, file_path: string }}
42
+ */
43
+ export function skillOrigin(file, { source, home = os.homedir() } = {}) {
44
+ const filePath = homeRelLiteral(file, home);
45
+ if (source === "builtin") return { origin: "apx", origin_path: filePath, file_path: filePath };
46
+ if (source === "project") return { origin: "project", origin_path: filePath, file_path: filePath };
47
+
48
+ let realFile = file;
49
+ try { realFile = fs.realpathSync(file); } catch { /* broken link — fall through */ }
50
+ const originPath = homeRel(realFile, home);
51
+ const realDir = path.dirname(realOrResolve(realFile));
52
+
53
+ for (const [origin, segs] of SKILL_ORIGIN_HOSTS) {
54
+ const host = path.resolve(home, ...segs);
55
+ const hostReal = fs.existsSync(host) ? realOrResolve(host) : host;
56
+ if (realDir === hostReal || realDir.startsWith(hostReal + path.sep)) {
57
+ return { origin, origin_path: originPath, file_path: filePath };
58
+ }
59
+ }
60
+ return { origin: "global", origin_path: originPath, file_path: filePath };
61
+ }
@@ -0,0 +1,136 @@
1
+ // Splitting a skill body into sections, so a large skill can be loaded one
2
+ // section at a time instead of whole (progressive disclosure). A project agent
3
+ // gets the skill's OUTLINE (its headings) in the system prompt for ~nothing,
4
+ // and pulls the one section it needs with the read_skill tool.
5
+ //
6
+ // Sectioning is by markdown headings. A heading owns everything under it until
7
+ // the next heading at the SAME or a HIGHER level — so a `##` section carries
8
+ // its `###` subsections with it, which is what a reader wants when they ask for
9
+ // "section 2".
10
+
11
+ const HEADING_RE = /^(#{1,6})\s+(.+?)\s*#*$/;
12
+
13
+ /**
14
+ * Parse a markdown body into a flat list of headings with their span.
15
+ * @returns {Array<{level:number, title:string, line:number}>}
16
+ */
17
+ function headings(body) {
18
+ const lines = String(body || "").split("\n");
19
+ const out = [];
20
+ let inFence = false;
21
+ for (let i = 0; i < lines.length; i++) {
22
+ const line = lines[i];
23
+ // Don't mistake a `#` inside a ``` code fence for a heading.
24
+ if (/^\s*(```|~~~)/.test(line)) { inFence = !inFence; continue; }
25
+ if (inFence) continue;
26
+ const m = HEADING_RE.exec(line);
27
+ if (m) out.push({ level: m[1].length, title: m[2].trim(), line: i });
28
+ }
29
+ return out;
30
+ }
31
+
32
+ /**
33
+ * Sections of a skill body: each heading plus the text it owns (down to the
34
+ * next heading at the same or higher level). Text BEFORE the first heading is
35
+ * returned as a leading section with an empty title (the skill's preamble).
36
+ *
37
+ * @returns {Array<{level:number, title:string, text:string}>}
38
+ */
39
+ export function splitSkillSections(body) {
40
+ const text = String(body || "");
41
+ const lines = text.split("\n");
42
+ const heads = headings(text);
43
+ const sections = [];
44
+
45
+ if (!heads.length) {
46
+ const t = text.trim();
47
+ return t ? [{ level: 0, title: "", text: t }] : [];
48
+ }
49
+
50
+ // Preamble before the first heading.
51
+ if (heads[0].line > 0) {
52
+ const pre = lines.slice(0, heads[0].line).join("\n").trim();
53
+ if (pre) sections.push({ level: 0, title: "", text: pre });
54
+ }
55
+
56
+ for (let i = 0; i < heads.length; i++) {
57
+ const h = heads[i];
58
+ // The section ends at the next heading whose level is <= this one's.
59
+ let end = lines.length;
60
+ for (let j = i + 1; j < heads.length; j++) {
61
+ if (heads[j].level <= h.level) { end = heads[j].line; break; }
62
+ }
63
+ sections.push({
64
+ level: h.level,
65
+ title: h.title,
66
+ text: lines.slice(h.line, end).join("\n").trim(),
67
+ });
68
+ }
69
+ return sections;
70
+ }
71
+
72
+ /**
73
+ * A compact outline for the system prompt: the top-level headings (levels 1-2),
74
+ * numbered, so the model can name a section to read_skill without the bodies.
75
+ * @returns {string[]} e.g. ["1. Evaluaciones de Habilidad", "2. Técnica del Swing"]
76
+ */
77
+ export function skillOutline(body, { maxLevel = 2 } = {}) {
78
+ return splitSkillSections(body)
79
+ .filter((s) => s.title && s.level >= 1 && s.level <= maxLevel)
80
+ .map((s) => s.title);
81
+ }
82
+
83
+ function norm(s) {
84
+ return String(s || "")
85
+ .toLowerCase()
86
+ .normalize("NFD")
87
+ .replace(/[̀-ͯ]/g, "")
88
+ .replace(/[^a-z0-9]+/g, " ")
89
+ .trim();
90
+ }
91
+
92
+ /**
93
+ * Find the section a `query` refers to. Accepts a title (fuzzy, accent- and
94
+ * case-insensitive), a leading section number ("2" or "2."), or a substring of
95
+ * a title. Returns the best section, or null.
96
+ *
97
+ * @returns {{title:string, text:string, level:number}|null}
98
+ */
99
+ export function pickSkillSection(body, query) {
100
+ const sections = splitSkillSections(body).filter((s) => s.title);
101
+ if (!sections.length) return null;
102
+ const q = norm(query);
103
+ if (!q) return null;
104
+
105
+ // "2" / "2." → the section whose title starts with that number, else the Nth.
106
+ const numMatch = /^(\d+)\.?$/.exec(String(query).trim());
107
+ if (numMatch) {
108
+ const n = numMatch[1];
109
+ const byPrefix = sections.find((s) => new RegExp(`^${n}\\b`).test(s.title.trim()));
110
+ if (byPrefix) return byPrefix;
111
+ const idx = Number(n) - 1;
112
+ if (idx >= 0 && idx < sections.length) return sections[idx];
113
+ }
114
+
115
+ // Exact normalized title.
116
+ const exact = sections.find((s) => norm(s.title) === q);
117
+ if (exact) return exact;
118
+
119
+ // Query contained in a title, or a title contained in the query.
120
+ const contains = sections.find((s) => {
121
+ const t = norm(s.title);
122
+ return t.includes(q) || q.includes(t);
123
+ });
124
+ if (contains) return contains;
125
+
126
+ // Token overlap — pick the title sharing the most words with the query.
127
+ const qTokens = new Set(q.split(" ").filter(Boolean));
128
+ let best = null;
129
+ let bestScore = 0;
130
+ for (const s of sections) {
131
+ const tTokens = s.title ? norm(s.title).split(" ").filter(Boolean) : [];
132
+ const score = tTokens.reduce((n, tok) => n + (qTokens.has(tok) ? 1 : 0), 0);
133
+ if (score > bestScore) { bestScore = score; best = s; }
134
+ }
135
+ return bestScore > 0 ? best : null;
136
+ }
@@ -13,7 +13,9 @@ import {
13
13
  import { resolveAgentName } from "#core/identity/index.js";
14
14
  import { memoryBlockFor, buildActiveThreadsBlock } from "#core/memory/index.js";
15
15
  import { CHANNELS } from "#core/constants/channels.js";
16
- import { judgeConfig, judgeCompletion, applyJudgeLoop } from "#core/agent/judge.js";
16
+ import { judgeConfig, judgeCompletion, applyJudgeLoop, continuableTurn } from "#core/agent/judge.js";
17
+ import { channelToolIters, MAX_TOOL_ITERS } from "#core/agent/constants.js";
18
+ import { mobilityContextBlock } from "#core/mobility/state.js";
17
19
 
18
20
  export {
19
21
  buildIdentityBlock,
@@ -39,6 +41,7 @@ export async function runSuperAgent({
39
41
  onEvent = null,
40
42
  signal,
41
43
  onToken = null,
44
+ onReasoningToken = null,
42
45
  suppressTools = null,
43
46
  // Channel-specific addendum appended to the system prompt; used by
44
47
  // voice.js to ask for trailing ```suggestions``` JSON on voice/deck
@@ -46,12 +49,19 @@ export async function runSuperAgent({
46
49
  systemSuffix = "",
47
50
  // Per-reply output cap; forwarded to runAgent. Summarize/ask raise it.
48
51
  maxTokens,
49
- // Max tool-loop iterations; forwarded to runAgent. The Code module raises
50
- // this so coding tasks run to completion instead of stopping after a step.
52
+ // Max tool-loop iterations for the TURN the first run plus any judge round
53
+ // that continues it, which share this number rather than each getting it in
54
+ // full. Forwarded to runAgent; the Code module raises it so coding tasks run
55
+ // to completion instead of stopping after a step. Left unset, the channel
56
+ // decides (channelToolIters): the web chat runs to completion, everything
57
+ // else keeps runAgent's conversational default.
51
58
  maxIters,
52
59
  // Structural "keep going until done" contract (finish tool + forced tool
53
60
  // choice). Coding surfaces (web Code build mode, terminal Build) turn this on.
54
61
  completionContract = false,
62
+ // The completion judge, injectable so a test can supply verdicts without an
63
+ // engine. Production always uses the real one.
64
+ judgeCompletionFn = judgeCompletion,
55
65
  // Run tool-free: pure text generation, no tool registry. Used by the
56
66
  // summarize/ask endpoint so a transcript that *mentions* a tool (e.g. the
57
67
  // telegram plugin) can't make the model actually fire it.
@@ -115,11 +125,13 @@ export async function runSuperAgent({
115
125
  const scopedListSkills = (opts = {}) =>
116
126
  filterEnabledSkills(listSkills(opts), { config: globalConfig, projectPath });
117
127
 
128
+ const mobilityBlock = mobilityContextBlock();
129
+ const effectiveContextNote = [contextNote, mobilityBlock].filter(Boolean).join("\n\n");
118
130
  const system = buildSuperAgentSystem({
119
131
  globalConfig,
120
132
  projects,
121
133
  listSkills: scopedListSkills,
122
- contextNote,
134
+ contextNote: effectiveContextNote,
123
135
  channel,
124
136
  channelMeta,
125
137
  relationshipBlock,
@@ -142,7 +154,19 @@ export async function runSuperAgent({
142
154
  ? null
143
155
  : selectModelByRules({ prompt, previousMessages, channel, channelMeta }, globalConfig);
144
156
 
145
- const runOnce = (turnPrompt, history) =>
157
+ // An explicit budget from the caller always wins; otherwise the surface's own
158
+ // default applies. This is where the web chat stops hitting a wall every 9
159
+ // actions and asking whether to keep going — see WEB_TOOL_ITERS.
160
+ //
161
+ // Resolved to a NUMBER here, falling through to runAgent's own default rather
162
+ // than leaving it unset, because this is the turn's total and the judge loop
163
+ // below has to subtract from it. "Whatever runAgent picks" is not a total you
164
+ // can share between rounds.
165
+ const turnMaxIters = maxIters || channelToolIters(globalConfig, channel) || MAX_TOOL_ITERS;
166
+
167
+ // `iters` is what THIS pass may spend, which is the whole budget for the
168
+ // first run and whatever is left for a judge round.
169
+ const runOnce = (turnPrompt, history, iters = turnMaxIters) =>
146
170
  runAgent({
147
171
  globalConfig,
148
172
  system,
@@ -157,21 +181,34 @@ export async function runSuperAgent({
157
181
  onEvent,
158
182
  signal,
159
183
  onToken,
184
+ onReasoningToken,
160
185
  agentName: resolveAgentName(globalConfig),
161
186
  suppressTools,
162
187
  ...(maxTokens ? { maxTokens } : {}),
163
- ...(maxIters ? { maxIters } : {}),
188
+ maxIters: iters,
164
189
  ...(completionContract ? { completionContract: true } : {}),
165
190
  });
166
191
 
167
192
  const result = await runOnce(prompt, previousMessages);
168
193
 
169
- // Goal-completion judge (OpenHands critic pattern): opt-in, and only where
170
- // "done" is a checkable claim — completion-contract turns at the top level.
171
- // Sub-agent runs are excluded (the parent already judges the overall turn);
172
- // tool-free callers (summarize/ask) have nothing to verify.
194
+ // Goal-completion judge (OpenHands critic pattern). Two doors into it:
195
+ //
196
+ // - a completion-contract turn declared itself done, and `judge.enabled`
197
+ // asks for that claim to be checked;
198
+ // - a conversational turn stopped calling tools, which is also what the
199
+ // model does when it just announces its next step. That reads as a task
200
+ // that quit halfway, so the judge continues it instead of leaving the
201
+ // user to type "seguí". Skipped for chat and for a turn that ended asking
202
+ // something — see continuableTurn.
203
+ //
204
+ // Sub-agent runs are excluded (the parent judges the overall turn); tool-free
205
+ // callers (summarize/ask) have nothing to verify; and an aborted turn is the
206
+ // user saying stop, which is the one instruction a judge must not overrule.
173
207
  const jCfg = judgeConfig(globalConfig);
174
- if (!jCfg.enabled || !completionContract || noTools || subagentDepth > 0) {
208
+ const judging = completionContract
209
+ ? jCfg.enabled
210
+ : jCfg.continue_unfinished && continuableTurn(result);
211
+ if (!judging || noTools || subagentDepth > 0 || signal?.aborted) {
175
212
  return result;
176
213
  }
177
214
  // Rolling refinement history: each round sees the original goal, its own
@@ -181,10 +218,13 @@ export async function runSuperAgent({
181
218
  initialResult: result,
182
219
  cfg: jCfg,
183
220
  onEvent,
184
- judgeFn: (r) => judgeCompletion({ goal: prompt, result: r, globalConfig }),
185
- runFollowup: async (followup, prior) => {
221
+ // The turn's whole budget, shared with the run above rather than reissued
222
+ // per round. Without this the ceiling was (1 + max_iterations) × turnMaxIters.
223
+ maxIters: turnMaxIters,
224
+ judgeFn: (r) => judgeCompletionFn({ goal: prompt, result: r, globalConfig }),
225
+ runFollowup: async (followup, prior, { maxIters: roundIters } = {}) => {
186
226
  history.push({ role: "assistant", content: prior.text || "" });
187
- const next = await runOnce(followup, [...history]);
227
+ const next = await runOnce(followup, [...history], roundIters);
188
228
  history.push({ role: "user", content: followup });
189
229
  return next;
190
230
  },
@@ -0,0 +1,50 @@
1
+ // Shared helpers for the calendar agent tools (calendar-*.js). Underscore file,
2
+ // like _asana.js, so it carries no tool `name:` of its own: each tool stays a
3
+ // thin adapter over the pure client in core/integrations/plugins/calendar.js.
4
+ import { resolveProject } from "../helpers.js";
5
+ import { resolveIntegration } from "#core/integrations/index.js";
6
+
7
+ /**
8
+ * The effective calendar config for a project, or an error the model can act
9
+ * on. `calendar_id` is resolved here rather than in each tool: which calendar
10
+ * is a connection detail the owner picked once, not a decision to re-take on
11
+ * every call.
12
+ */
13
+ export function resolveCalendar(projects, project, { needsWrite = false } = {}) {
14
+ const p = resolveProject(projects, project);
15
+ const resolved = resolveIntegration({ projectStorage: p.storagePath, slug: "calendar" });
16
+ if (!resolved) {
17
+ throw new Error(
18
+ "No calendar is connected. Ask the user to connect one in the web panel → Integrations → Plugins → Google Calendar.",
19
+ );
20
+ }
21
+ const config = resolved.record.config || {};
22
+ // Under user OAuth the calendar is always the account's own ("primary"); there
23
+ // is no calendar to pick. But we DO need an authorized connection.
24
+ if (!config.refresh_token) {
25
+ throw new Error(
26
+ "The calendar isn't authorized yet. Ask the user to connect it with Google in the web panel → Integrations → Google Calendar.",
27
+ );
28
+ }
29
+ const calendarId = config.calendar_id || "primary";
30
+ // Read-only is possible, and the agent finding out by way of a 403 from Google
31
+ // is a worse answer than being told here.
32
+ if (needsWrite && !config.write_access) {
33
+ throw new Error(
34
+ "This calendar is connected read-only. The user has to enable write access in the web panel → Integrations → Google Calendar before anything can be scheduled.",
35
+ );
36
+ }
37
+ return { config, calendarId, scope: resolved.scope };
38
+ }
39
+
40
+ /** The optional `project` arg every calendar tool accepts. */
41
+ export const PROJECT_ARG = {
42
+ project: { type: "string", description: "APX project id/name (optional; defaults to current)" },
43
+ };
44
+
45
+ /** Default window: from now to the end of the day, in the machine's timezone. */
46
+ export function todayWindow(now = new Date()) {
47
+ const end = new Date(now);
48
+ end.setHours(23, 59, 59, 999);
49
+ return { timeMin: now.toISOString(), timeMax: end.toISOString() };
50
+ }
@@ -0,0 +1,103 @@
1
+ import {
2
+ readApfMcps, writeApfMcps,
3
+ readRuntimeMcps, writeRuntimeMcps,
4
+ readGlobalMcps, writeGlobalMcps,
5
+ } from "#core/mcp/sources.js";
6
+ import { projectMeta, resolveProject } from "../helpers.js";
7
+
8
+ // Register an MCP server. The super-agent could LIST mcps and CALL their tools
9
+ // but not add one — so wiring a new MCP meant shelling out to `apx mcp add`,
10
+ // the same gap that made building an agent painful. This closes it.
11
+ //
12
+ // Three scopes (see the apx-mcp skill), each a different file with different
13
+ // commit/secrecy semantics:
14
+ // shared → .apc/mcps.json (committed; NON-SECRET hints only)
15
+ // runtime → ~/.apx/projects/<id>/mcps.json (private; where SECRETS live)
16
+ // global → ~/.apx/mcps.json (private; every project)
17
+ function readScope(scope, p) {
18
+ if (scope === "runtime") return readRuntimeMcps(p.storagePath);
19
+ if (scope === "global") return readGlobalMcps();
20
+ return readApfMcps(p.path);
21
+ }
22
+ function writeScope(scope, p, json) {
23
+ if (scope === "runtime") {
24
+ if (!p.storagePath) throw new Error("runtime scope requires a project with a storage path");
25
+ return writeRuntimeMcps(p.storagePath, json);
26
+ }
27
+ if (scope === "global") return writeGlobalMcps(json);
28
+ return writeApfMcps(p.path, json);
29
+ }
30
+
31
+ export default {
32
+ name: "add_mcp",
33
+ schema: {
34
+ type: "function",
35
+ function: {
36
+ name: "add_mcp",
37
+ description:
38
+ "Register (or update) an MCP server so its tools become callable via call_mcp. A stdio server needs `command` (+ optional `args`/`env`); a remote HTTP one needs `url` (+ optional `headers`). Scope decides WHERE it is stored and its secrecy: 'runtime' (default here — private, holds secrets), 'shared' (.apc/mcps.json, committed — NON-SECRET hints only, never a token), or 'global' (private, all projects). Put anything secret in runtime or global, never shared.",
39
+ parameters: {
40
+ type: "object",
41
+ required: ["name"],
42
+ properties: {
43
+ project: { type: "string", description: "Project id, name or path. Omit or 'default' for ~/.apx/projects/default." },
44
+ name: { type: "string", description: "Server name (how you'll reference it in call_mcp)." },
45
+ command: { type: "string", description: "stdio: the executable to spawn (e.g. 'npx')." },
46
+ args: { type: "array", items: { type: "string" }, description: "stdio: arguments for the command." },
47
+ env: { type: "object", description: "stdio: environment variables { KEY: value }." },
48
+ url: { type: "string", description: "http: the remote endpoint URL." },
49
+ headers: { type: "object", description: "http: request headers { Header: value }." },
50
+ scope: { type: "string", enum: ["runtime", "shared", "global"], description: "Where to store it. Default: runtime." },
51
+ enabled: { type: "boolean", description: "Enable it now (default true)." },
52
+ },
53
+ },
54
+ },
55
+ },
56
+ makeHandler: ({ projects, registries, requirePermission }) => async (args = {}) => {
57
+ const { project, name, command, args: cmdArgs, env, url, headers, enabled } = args;
58
+ await requirePermission("add_mcp", { dangerous: true, args: { name, scope: args.scope } });
59
+ if (!name) return { error: "name required" };
60
+ if (!command && !url) return { error: "either command (stdio) or url (http) required" };
61
+ if (command && url) return { error: "pass either command (stdio) or url (http), not both" };
62
+
63
+ const scope = ["runtime", "shared", "global"].includes(args.scope) ? args.scope
64
+ : args.scope === "apc" ? "shared"
65
+ : args.scope ? null : "runtime";
66
+ if (scope === null) return { error: `unknown scope "${args.scope}" (use runtime|shared|global)` };
67
+
68
+ let p;
69
+ try {
70
+ p = resolveProject(projects, project || "default");
71
+ } catch (e) {
72
+ return { error: e.message };
73
+ }
74
+
75
+ try {
76
+ const json = readScope(scope, p);
77
+ json.mcpServers = json.mcpServers || {};
78
+ const existing = json.mcpServers[name] || {};
79
+ json.mcpServers[name] = {
80
+ ...existing,
81
+ ...(command !== undefined ? { command } : {}),
82
+ ...(cmdArgs !== undefined ? { args: cmdArgs } : {}),
83
+ ...(env !== undefined ? { env } : {}),
84
+ ...(url !== undefined ? { url } : {}),
85
+ ...(headers !== undefined ? { headers } : {}),
86
+ enabled: enabled === undefined ? true : !!enabled,
87
+ };
88
+ writeScope(scope, p, json);
89
+ registries?.evictName?.(name);
90
+ projects.rebuild(p.id);
91
+ return {
92
+ ok: true,
93
+ name,
94
+ scope,
95
+ transport: url ? "http" : "stdio",
96
+ project: projectMeta(projects, p),
97
+ hint: "Registered. Use list_mcp_tools to see what it exposes, then call_mcp to run a tool.",
98
+ };
99
+ } catch (e) {
100
+ return { error: e.message };
101
+ }
102
+ },
103
+ };
@@ -15,6 +15,7 @@ export default {
15
15
  name: { type: "string", description: "Task title" },
16
16
  notes: { type: "string", description: "Task description/notes" },
17
17
  project_gid: { type: "string", description: "Optional Asana project gid to add the task to" },
18
+ section_gid: { type: "string", description: "Optional Asana section gid to place the task in (e.g. a backlog column). Only valid together with project_gid." },
18
19
  assignee: { type: "string", description: "Optional assignee (user gid or 'me')" },
19
20
  due_on: { type: "string", description: "Optional due date (YYYY-MM-DD)" },
20
21
  ...PROJECT_ARG,
@@ -23,13 +24,14 @@ export default {
23
24
  },
24
25
  },
25
26
  },
26
- makeHandler: ({ projects }) => async ({ project, name, notes, project_gid, assignee, due_on } = {}) => {
27
+ makeHandler: ({ projects }) => async ({ project, name, notes, project_gid, section_gid, assignee, due_on } = {}) => {
27
28
  const { token, config } = resolveAsana(projects, project);
28
29
  const task = await asana.createTask(token, {
29
30
  workspaceGid: requireWorkspace(config),
30
31
  name,
31
32
  notes,
32
33
  projectGid: project_gid,
34
+ sectionGid: section_gid,
33
35
  assignee,
34
36
  dueOn: due_on,
35
37
  });