@agentprojectcontext/apx 1.81.0 → 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 +21 -11
  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,204 @@
1
+ // stable-diffusion.cpp native adapter — asynchronous job + polling.
2
+ //
3
+ // POST /sdcpp/v1/img_gen → { id, poll_url, status: "queued" }
4
+ // GET /sdcpp/v1/jobs/<id> → { status, queue_position, result, error }
5
+ // POST /sdcpp/v1/jobs/<id>/cancel
6
+ // GET /sdcpp/v1/capabilities → model, samplers, schedulers, defaults, limits
7
+ //
8
+ // Statuses seen from the server: queued → generating → completed (or failed,
9
+ // with `error` set). The finished job carries
10
+ // result: { images: [{ b64_json }], output_format: "png" }
11
+ //
12
+ // This is the adapter to prefer for anything unattended. The A1111 route holds
13
+ // one socket open for the whole render, so a queued job behind someone else's
14
+ // batch looks like a hung request; here the socket closes immediately and the
15
+ // caller polls, which also means we can report queue position while waiting.
16
+ //
17
+ // One model per server: stable-diffusion.cpp loads a checkpoint at launch, so
18
+ // there is no field to switch it and `model` is declared unsupported rather
19
+ // than quietly ignored.
20
+ //
21
+ // ── ControlNet ─────────────────────────────────────────────────────────────
22
+ // A `control_image` conditions the render on the structure of a picture —
23
+ // pose, composition, edges — while the prompt still decides everything else.
24
+ // It rides on this native route (the A1111 shim has no field for it), needs a
25
+ // server launched with a ControlNet model loaded, and `control_strength`
26
+ // (0..1, default 0.8) sets how hard the structure is enforced.
27
+ //
28
+ // This is NOT img2img: the control image is never the canvas, so the output
29
+ // does not start from those pixels. To *edit* a picture use the a1111
30
+ // adapter's `init_image` instead.
31
+ //
32
+ // The finished job's envelope is the trap here — `result.images[0].b64_json`.
33
+ // It is not a list of strings the way the A1111 route answers, and it is not
34
+ // `.b64` or `.data`; imagesFrom() below is what absorbs that difference.
35
+
36
+ import { postJson, getJson, probeUrl, joinUrl, trimBase, writeImage, decodeBase64Image, toRawBase64 } from "./shared.js";
37
+
38
+ const DEFAULT_POLL_MS = 1200;
39
+ const DEFAULT_TIMEOUT_S = 900;
40
+ const TERMINAL_OK = new Set(["completed", "succeeded", "success", "done"]);
41
+ const TERMINAL_BAD = new Set(["failed", "error", "cancelled", "canceled"]);
42
+
43
+ function headersFor(config) {
44
+ const h = {};
45
+ if (config.api_key) h.authorization = `Bearer ${config.api_key}`;
46
+ return h;
47
+ }
48
+
49
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
50
+
51
+ /**
52
+ * The server hands back a relative poll_url ("/sdcpp/v1/jobs/<id>"). Honor it
53
+ * rather than rebuilding the path: a server behind a sub-path proxy tells us
54
+ * where it really lives, and reconstructing would send us to a 404.
55
+ */
56
+ function pollUrlFor(config, submitted) {
57
+ const rel = submitted?.poll_url;
58
+ if (typeof rel === "string" && rel.startsWith("/")) return trimBase(config.base_url) + rel;
59
+ if (typeof rel === "string" && /^https?:/i.test(rel)) return rel;
60
+ return joinUrl(config.base_url, `/sdcpp/v1/jobs/${submitted?.id}`);
61
+ }
62
+
63
+ /** Pull the base64 images out of whichever envelope the build uses. */
64
+ function imagesFrom(result) {
65
+ if (!result) return [];
66
+ const list = result.images || result.data || [];
67
+ return list
68
+ .map((item) => (typeof item === "string" ? item : item?.b64_json || item?.b64 || item?.image))
69
+ .filter(Boolean);
70
+ }
71
+
72
+ export default {
73
+ id: "sdcpp",
74
+
75
+ // `model` is absent on purpose — see the header.
76
+ supports: [
77
+ "negative_prompt", "width", "height", "steps", "cfg_scale",
78
+ "seed", "sampler", "scheduler", "count", "format",
79
+ "control_image", "control_strength",
80
+ ],
81
+
82
+ async isAvailable(config = {}) {
83
+ if (!config.base_url) return false;
84
+ return probeUrl(joinUrl(config.base_url, "/sdcpp/v1/capabilities"), {
85
+ headers: headersFor(config),
86
+ });
87
+ },
88
+
89
+ async generate({
90
+ prompt, negative_prompt, width, height, steps, cfg_scale, seed,
91
+ sampler, scheduler, count, format, outDir, config = {}, signal, onProgress,
92
+ control_image, control_strength,
93
+ }) {
94
+ if (!config.base_url) throw new Error("sdcpp: base_url required");
95
+
96
+ const sample_params = {};
97
+ if (steps) sample_params.sample_steps = steps;
98
+ if (sampler) sample_params.sample_method = sampler;
99
+ if (scheduler) sample_params.scheduler = scheduler;
100
+ if (cfg_scale != null) sample_params.guidance = { txt_cfg: cfg_scale };
101
+
102
+ const body = { prompt };
103
+ if (negative_prompt) body.negative_prompt = negative_prompt;
104
+ if (width) body.width = width;
105
+ if (height) body.height = height;
106
+ if (count) body.batch_count = count;
107
+ if (seed != null) body.seed = seed;
108
+ if (format) body.output_format = format;
109
+ // Bare base64: this server decodes the "data:…;base64," prefix as pixels
110
+ // and fails inside the sampler without naming the field.
111
+ if (control_image) {
112
+ body.control_image = toRawBase64(control_image);
113
+ body.control_strength = control_strength != null ? control_strength : 0.8;
114
+ }
115
+ if (Object.keys(sample_params).length) body.sample_params = sample_params;
116
+
117
+ const submitted = await postJson(
118
+ joinUrl(config.base_url, "/sdcpp/v1/img_gen"),
119
+ body,
120
+ { headers: headersFor(config), signal, timeoutMs: 60_000 }
121
+ );
122
+ if (!submitted?.id) throw new Error("sdcpp: server did not return a job id");
123
+
124
+ const pollUrl = pollUrlFor(config, submitted);
125
+ const intervalMs = Number(config.poll_interval_ms) || DEFAULT_POLL_MS;
126
+ const deadline = Date.now() + (Number(config.timeout_s) || DEFAULT_TIMEOUT_S) * 1000;
127
+
128
+ let job = submitted;
129
+ while (true) {
130
+ if (signal?.aborted) {
131
+ // Best-effort: tell the server to stop burning GPU on a job nobody
132
+ // is waiting for any more. Failure here is not worth surfacing.
133
+ fetch(`${pollUrl}/cancel`, { method: "POST", headers: headersFor(config) }).catch(() => {});
134
+ throw new Error("sdcpp: cancelled");
135
+ }
136
+ if (Date.now() > deadline) {
137
+ fetch(`${pollUrl}/cancel`, { method: "POST", headers: headersFor(config) }).catch(() => {});
138
+ throw new Error(`sdcpp: job ${submitted.id} timed out`);
139
+ }
140
+ await sleep(intervalMs);
141
+
142
+ try {
143
+ job = await getJson(pollUrl, { headers: headersFor(config), timeoutMs: 30_000 });
144
+ } catch (e) {
145
+ // A restarting server drops its job table and answers "job not found".
146
+ // Say so plainly — the generic 4xx text sends people hunting for a bug
147
+ // in the request instead of looking at the box.
148
+ if (/not found/i.test(e.message)) {
149
+ throw new Error(`sdcpp: job ${submitted.id} disappeared (the server restarted mid-render)`);
150
+ }
151
+ throw e;
152
+ }
153
+
154
+ const status = String(job?.status || "").toLowerCase();
155
+ if (onProgress) onProgress({ status, queue_position: job?.queue_position ?? null });
156
+ if (TERMINAL_BAD.has(status)) {
157
+ throw new Error(`sdcpp: job ${status}${job?.error ? ` — ${job.error}` : ""}`);
158
+ }
159
+ if (TERMINAL_OK.has(status)) break;
160
+ }
161
+
162
+ const b64s = imagesFrom(job?.result);
163
+ if (!b64s.length) throw new Error("sdcpp: job completed with no images");
164
+ const outFormat = job?.result?.output_format || format;
165
+
166
+ return {
167
+ images: b64s.map((b64, i) =>
168
+ ({ ...writeImage(decodeBase64Image(b64), { outDir, provider: "sdcpp", format: outFormat, index: i }),
169
+ seed: seed >= 0 ? seed : null })),
170
+ model: null, // filled in by the facade from capabilities() when known
171
+ meta: {
172
+ job_id: submitted.id,
173
+ elapsed_s: job?.completed && job?.started ? job.completed - job.started : null,
174
+ ...(control_image ? { mode: "controlnet", control_strength: body.control_strength } : {}),
175
+ },
176
+ };
177
+ },
178
+
179
+ /**
180
+ * The richest catalog of the three adapters: the settings UI reads samplers,
181
+ * schedulers and the server's own defaults straight off it, so nothing has
182
+ * to be hardcoded per install.
183
+ */
184
+ async capabilities(config = {}) {
185
+ if (!config.base_url) return null;
186
+ try {
187
+ const caps = await getJson(joinUrl(config.base_url, "/sdcpp/v1/capabilities"), {
188
+ headers: headersFor(config),
189
+ timeoutMs: 8000,
190
+ });
191
+ if (!caps) return null;
192
+ return {
193
+ models: caps.model ? [caps.model.stem || caps.model.name].filter(Boolean) : [],
194
+ samplers: caps.samplers || [],
195
+ schedulers: caps.schedulers || [],
196
+ defaults: caps.defaults || null,
197
+ modes: caps.supported_modes || [],
198
+ formats: caps.output_formats_by_mode?.img_gen || caps.output_formats || [],
199
+ };
200
+ } catch {
201
+ return null;
202
+ }
203
+ },
204
+ };
@@ -0,0 +1,218 @@
1
+ // Helpers shared by every image adapter. Nothing here talks to a specific
2
+ // server — it is the plumbing three of the four adapters would otherwise each
3
+ // grow their own copy of (base64 → file, size parsing, endpoint joining).
4
+
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { randomUUID } from "node:crypto";
8
+
9
+ /** Strip a trailing slash so `${base}/v1/x` never becomes `//v1/x`. */
10
+ export function trimBase(url) {
11
+ return String(url || "").replace(/\/+$/, "");
12
+ }
13
+
14
+ /**
15
+ * Join a base URL and a path, tolerating a base that already carries the API
16
+ * prefix. A user who pastes `http://host:8189/v1` into the OpenAI field and one
17
+ * who pastes `http://host:8189` must both end up at /v1/images/generations —
18
+ * getting this wrong is the single most common way a local endpoint "doesn't
19
+ * work" (it 404s and the error says nothing about the URL).
20
+ */
21
+ export function joinUrl(base, suffix) {
22
+ const b = trimBase(base);
23
+ const s = suffix.startsWith("/") ? suffix : `/${suffix}`;
24
+ // e.g. base ".../v1" + suffix "/v1/images/generations" → don't repeat /v1
25
+ const firstSeg = s.split("/")[1];
26
+ if (firstSeg && b.endsWith(`/${firstSeg}`)) {
27
+ return b + s.slice(firstSeg.length + 1);
28
+ }
29
+ return b + s;
30
+ }
31
+
32
+ /** "512x768" → { width: 512, height: 768 }. Returns null when unparseable. */
33
+ export function parseSize(size) {
34
+ const m = /^\s*(\d{2,5})\s*[x×*]\s*(\d{2,5})\s*$/.exec(String(size || ""));
35
+ if (!m) return null;
36
+ return { width: Number(m[1]), height: Number(m[2]) };
37
+ }
38
+
39
+ /** Reverse of parseSize — what OpenAI-shaped APIs want. */
40
+ export function formatSize(width, height) {
41
+ return `${width}x${height}`;
42
+ }
43
+
44
+ const MIME_BY_EXT = {
45
+ png: "image/png",
46
+ jpg: "image/jpeg",
47
+ jpeg: "image/jpeg",
48
+ webp: "image/webp",
49
+ gif: "image/gif",
50
+ };
51
+
52
+ export function mimeFor(format) {
53
+ return MIME_BY_EXT[String(format || "png").toLowerCase()] || "application/octet-stream";
54
+ }
55
+
56
+ /**
57
+ * Sniff the real container from the first bytes. Servers lie about (or omit)
58
+ * the format: stable-diffusion.cpp answers `output_format: "png"` for a
59
+ * request that asked for webp. The file extension should describe the actual
60
+ * bytes, or every viewer downstream has to guess.
61
+ */
62
+ export function sniffFormat(buf, fallback = "png") {
63
+ if (!buf || buf.length < 12) return fallback;
64
+ if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) return "png";
65
+ if (buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) return "jpeg";
66
+ if (buf.toString("ascii", 0, 4) === "RIFF" && buf.toString("ascii", 8, 12) === "WEBP") return "webp";
67
+ if (buf.toString("ascii", 0, 3) === "GIF") return "gif";
68
+ return fallback;
69
+ }
70
+
71
+ /**
72
+ * Write one decoded image into `outDir` and describe it. `index` only shapes
73
+ * the filename, so a batch stays ordered on disk the way it was generated.
74
+ */
75
+ export function writeImage(buf, { outDir, provider, format, index = 0 }) {
76
+ const ext = sniffFormat(buf, format);
77
+ fs.mkdirSync(outDir, { recursive: true });
78
+ const suffix = index > 0 ? `-${index + 1}` : "";
79
+ const file = path.join(outDir, `${provider}-${randomUUID()}${suffix}.${ext === "jpeg" ? "jpg" : ext}`);
80
+ fs.writeFileSync(file, buf);
81
+ return { path: file, bytes: buf.length, mime: mimeFor(ext), format: ext };
82
+ }
83
+
84
+ /** Decode a base64 payload, tolerating a `data:image/png;base64,…` prefix. */
85
+ export function decodeBase64Image(b64) {
86
+ const raw = String(b64 || "").replace(/^data:[^;]+;base64,/, "");
87
+ if (!raw) throw new Error("empty image payload");
88
+ return Buffer.from(raw, "base64");
89
+ }
90
+
91
+ /**
92
+ * Outbound counterpart of decodeBase64Image: hand a server bare base64.
93
+ *
94
+ * Diffusion servers are inconsistent about the `data:` prefix — A1111 strips it,
95
+ * stable-diffusion.cpp does not and decodes the literal "data:image/png;base64,"
96
+ * as image bytes, which fails deep inside the sampler with a message that names
97
+ * neither the field nor the prefix. Normalizing on the way out costs nothing and
98
+ * removes a whole class of "the reference image did nothing" reports.
99
+ */
100
+ export function toRawBase64(b64) {
101
+ const raw = String(b64 || "").replace(/^data:[^;]+;base64,/, "").trim();
102
+ if (!raw) throw new Error("empty image payload");
103
+ return raw;
104
+ }
105
+
106
+ /**
107
+ * Pixel dimensions of a PNG or JPEG, straight from the header bytes.
108
+ *
109
+ * There is no image library in this tree and this does not need one: an
110
+ * inpainting mask whose size differs from the canvas is the single most common
111
+ * way the feature "does nothing", and the servers accept the mismatch silently.
112
+ * Reading two headers is enough to turn that into an error that names the fix.
113
+ *
114
+ * Returns null for anything it cannot parse — callers treat that as "unknown",
115
+ * never as "mismatched", so an exotic-but-valid file is not rejected.
116
+ */
117
+ export function imageSize(buf) {
118
+ if (!buf || buf.length < 24) return null;
119
+ // PNG: an 8-byte signature, then the IHDR chunk with width/height at 16..24.
120
+ if (buf[0] === 0x89 && buf.toString("ascii", 1, 4) === "PNG") {
121
+ return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
122
+ }
123
+ // JPEG: walk the marker segments to the first SOF, which carries the size.
124
+ if (buf[0] === 0xff && buf[1] === 0xd8) {
125
+ let i = 2;
126
+ while (i + 9 < buf.length) {
127
+ if (buf[i] !== 0xff) { i++; continue; }
128
+ const marker = buf[i + 1];
129
+ // SOF0-SOF15, minus the four that are not frame headers (DHT/JPG/DAC/RST).
130
+ if (marker >= 0xc0 && marker <= 0xcf &&
131
+ marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
132
+ return { height: buf.readUInt16BE(i + 5), width: buf.readUInt16BE(i + 7) };
133
+ }
134
+ i += 2 + buf.readUInt16BE(i + 2);
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+
140
+ /**
141
+ * A stand-in for an image payload in anything a human or a log will read.
142
+ *
143
+ * The resolved request travels back to the caller and into `--json`; a 700 KB
144
+ * base64 string in there turns a readable receipt into an unreadable one and
145
+ * bloats every stored session. The size is what a reader actually wants.
146
+ */
147
+ export function redactImagePayload(b64) {
148
+ const n = String(b64 || "").length;
149
+ return `<base64 ${Math.round((n * 3) / 4 / 1024)} KB>`;
150
+ }
151
+
152
+ /**
153
+ * POST JSON and parse the reply, turning a non-2xx into an Error whose message
154
+ * carries the server's own words — a 400 from a diffusion server usually names
155
+ * the offending field, and swallowing that costs the user the fix.
156
+ */
157
+ export async function postJson(url, body, { headers = {}, signal, timeoutMs } = {}) {
158
+ const ctrl = timeoutMs ? new AbortController() : null;
159
+ const timer = ctrl ? setTimeout(() => ctrl.abort(), timeoutMs) : null;
160
+ try {
161
+ const res = await fetch(url, {
162
+ method: "POST",
163
+ headers: { "content-type": "application/json", ...headers },
164
+ body: JSON.stringify(body),
165
+ signal: signal || ctrl?.signal,
166
+ });
167
+ const text = await res.text();
168
+ let json = null;
169
+ try { json = text ? JSON.parse(text) : null; } catch { /* keep text */ }
170
+ if (!res.ok) {
171
+ const detail = json?.error?.message || json?.error || json?.detail || text;
172
+ throw new Error(`${res.status}: ${String(detail).slice(0, 300)}`);
173
+ }
174
+ return json;
175
+ } finally {
176
+ if (timer) clearTimeout(timer);
177
+ }
178
+ }
179
+
180
+ /** GET JSON with the same error shaping as postJson. */
181
+ export async function getJson(url, { headers = {}, signal, timeoutMs } = {}) {
182
+ const ctrl = timeoutMs ? new AbortController() : null;
183
+ const timer = ctrl ? setTimeout(() => ctrl.abort(), timeoutMs) : null;
184
+ try {
185
+ const res = await fetch(url, { headers, signal: signal || ctrl?.signal });
186
+ const text = await res.text();
187
+ let json = null;
188
+ try { json = text ? JSON.parse(text) : null; } catch { /* keep text */ }
189
+ if (!res.ok) {
190
+ const detail = json?.error?.message || json?.error || json?.detail || text;
191
+ throw new Error(`${res.status}: ${String(detail).slice(0, 300)}`);
192
+ }
193
+ return json;
194
+ } finally {
195
+ if (timer) clearTimeout(timer);
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Is this endpoint answering at all? Used by isAvailable() probes: a
201
+ * configured-but-unreachable local server must not win the routing chain, or
202
+ * every generation fails with a connection error instead of falling through to
203
+ * the next engine.
204
+ */
205
+ export async function probeUrl(url, { headers = {}, timeoutMs = 1500 } = {}) {
206
+ try {
207
+ const ctrl = new AbortController();
208
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
209
+ try {
210
+ const res = await fetch(url, { headers, signal: ctrl.signal });
211
+ return res.ok;
212
+ } finally {
213
+ clearTimeout(timer);
214
+ }
215
+ } catch {
216
+ return false;
217
+ }
218
+ }
@@ -0,0 +1,260 @@
1
+ // Unified image-generation facade. Callers don't pick the engine — the
2
+ // selector does, exactly like core/voice/tts.js does for speech.
3
+ //
4
+ // generate({ prompt, ... }) → { images: [{path, …}], provider, model, … }
5
+ // listProviders() → catalog + availability for the settings UI
6
+ // capabilities({ provider }) → live model/sampler list from one server
7
+ //
8
+ // Files land under ~/.apx/images/<YYYY-MM-DD>/ and STAY there: a generated
9
+ // picture is an artifact the user asked for, not a scratch file, and nothing
10
+ // is ever written into a project checkout unless a caller passes an explicit
11
+ // destination.
12
+
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import { IMAGES_DIR } from "#core/config/paths.js";
16
+ import { readConfig } from "#core/config/index.js";
17
+ import {
18
+ selectImageEngine,
19
+ listAvailableImageEngines,
20
+ getImageAdapter,
21
+ providerConfig,
22
+ imagesConfig,
23
+ resolveMode,
24
+ resolveChainOrder,
25
+ } from "./engines/index.js";
26
+ import { parseSize, redactImagePayload } from "./engines/shared.js";
27
+
28
+ export { IMAGES_DIR };
29
+
30
+ /**
31
+ * Family-wide fallbacks. Deliberately conservative — 512² at 20 steps renders
32
+ * on any machine — and every one of them is overridable per call, then per
33
+ * engine (images.<id>.defaults), then globally (images.defaults).
34
+ */
35
+ export const FAMILY_DEFAULTS = Object.freeze({
36
+ width: 512,
37
+ height: 512,
38
+ steps: 20,
39
+ cfg_scale: 7,
40
+ seed: -1,
41
+ count: 1,
42
+ format: "png",
43
+ negative_prompt: "",
44
+ sampler: "",
45
+ scheduler: "",
46
+ });
47
+
48
+ /** Every knob an adapter may be asked to honor. Order is display order. */
49
+ export const REQUEST_OPTIONS = Object.freeze([
50
+ "negative_prompt", "width", "height", "steps", "cfg_scale",
51
+ "seed", "sampler", "scheduler", "count", "format", "model",
52
+ "init_image", "denoising_strength", "control_image", "control_strength",
53
+ "mask", "mask_blur", "inpainting_fill", "inpaint_full_res",
54
+ ]);
55
+
56
+ /**
57
+ * The two ways a caller can hand in a reference picture. They are different
58
+ * operations against different routes, not two spellings of one:
59
+ *
60
+ * init_image the canvas the sampler starts from (img2img, a1111 route)
61
+ * control_image a structural hint it renders around (ControlNet, sdcpp route)
62
+ *
63
+ * `mask` is not a third one: it is a modifier on init_image that confines the
64
+ * repaint to part of the canvas (inpainting), which is why it rides the same
65
+ * route and is refused on its own.
66
+ *
67
+ * No engine speaks both, which is exactly why they are separate keys — folding
68
+ * them into one "reference image" would make the engine silently pick a
69
+ * meaning, and the two produce very different pictures.
70
+ */
71
+ export const IMAGE_INPUTS = Object.freeze(["init_image", "control_image", "mask"]);
72
+
73
+ /** Swap base64 payloads for a size marker in anything echoed back to a caller. */
74
+ function redactInputs(request) {
75
+ const out = { ...request };
76
+ for (const k of IMAGE_INPUTS) {
77
+ if (out[k]) out[k] = redactImagePayload(out[k]);
78
+ }
79
+ return out;
80
+ }
81
+
82
+ /** Today's folder under the gallery. Dated so a busy week stays navigable. */
83
+ export function imageOutDir(now = new Date()) {
84
+ const day = now.toISOString().slice(0, 10);
85
+ const dir = path.join(IMAGES_DIR, day);
86
+ fs.mkdirSync(dir, { recursive: true });
87
+ return dir;
88
+ }
89
+
90
+ /** Drop undefined/empty entries so a later layer's value isn't masked by "". */
91
+ function present(obj) {
92
+ const out = {};
93
+ for (const [k, v] of Object.entries(obj || {})) {
94
+ if (v === undefined || v === null || v === "") continue;
95
+ out[k] = v;
96
+ }
97
+ return out;
98
+ }
99
+
100
+ /**
101
+ * Fold the four layers of settings into one request. Later wins:
102
+ * family defaults → images.defaults → images.<engine>.defaults → the call.
103
+ * A `size: "768x512"` at any layer expands into width/height, because that is
104
+ * how humans and OpenAI-shaped APIs say it.
105
+ */
106
+ export function resolveRequest({ imgCfg = {}, engineCfg = {}, request = {} } = {}) {
107
+ const expand = (layer) => {
108
+ const copy = present(layer);
109
+ if (copy.size) {
110
+ const parsed = parseSize(copy.size);
111
+ delete copy.size;
112
+ if (parsed) Object.assign(copy, parsed);
113
+ }
114
+ return copy;
115
+ };
116
+ return {
117
+ ...FAMILY_DEFAULTS,
118
+ ...expand(imgCfg.defaults),
119
+ ...expand(engineCfg.defaults),
120
+ ...expand(request),
121
+ };
122
+ }
123
+
124
+ /**
125
+ * Which of the caller's *explicit* knobs this engine cannot honor.
126
+ *
127
+ * Project rule: an adapter must honor — or explicitly declare it lacks — every
128
+ * option the family passes. Declaring is what `supports` does; this is the
129
+ * other half, so `--steps 8` against an OpenAI endpoint says so out loud
130
+ * instead of rendering something silently different from what was asked.
131
+ */
132
+ export function ignoredOptions(adapter, request = {}) {
133
+ const supported = new Set(adapter?.supports || []);
134
+ return REQUEST_OPTIONS.filter((k) => {
135
+ if (supported.has(k)) return false;
136
+ const v = request[k];
137
+ if (v === undefined || v === null || v === "") return false;
138
+ // A default-valued knob was not "asked for" — only report a real choice.
139
+ if (k === "seed" && Number(v) === -1) return false;
140
+ if (k === "count" && Number(v) === 1) return false;
141
+ return true;
142
+ });
143
+ }
144
+
145
+ /**
146
+ * Generate one or more images. Throws on real errors; only falls back to the
147
+ * mock engine when nothing at all is configured AND no provider was forced
148
+ * (same contract as synthesize()).
149
+ *
150
+ * @param {object} opts
151
+ * @param {string} opts.prompt What to draw. Required.
152
+ * @param {string} [opts.negative_prompt] What to avoid.
153
+ * @param {number} [opts.width] Pixels; also settable as `size`.
154
+ * @param {number} [opts.height]
155
+ * @param {string} [opts.size] "768x512" — expands to width/height.
156
+ * @param {number} [opts.steps] Sampling steps.
157
+ * @param {number} [opts.cfg_scale] Prompt adherence.
158
+ * @param {number} [opts.seed] -1 for random.
159
+ * @param {string} [opts.sampler] Engine-specific sampler id.
160
+ * @param {string} [opts.scheduler] Engine-specific scheduler id.
161
+ * @param {number} [opts.count] How many images.
162
+ * @param {string} [opts.format] png | jpeg | webp.
163
+ * @param {string} [opts.model] Checkpoint / model id.
164
+ * @param {string} [opts.provider] Force an engine (skips the chain).
165
+ * @param {string} [opts.outDir] Where to write; defaults to the gallery.
166
+ * @param {object} [opts.globalConfig] Pass-in for tests; else readConfig().
167
+ * @param {Function}[opts.onProgress] ({status, queue_position}) while polling.
168
+ * @param {AbortSignal} [opts.signal]
169
+ * @returns {Promise<{images, provider, model, prompt, request, ignored, elapsed_ms, meta}>}
170
+ */
171
+ export async function generate({
172
+ prompt,
173
+ provider,
174
+ outDir,
175
+ globalConfig,
176
+ onProgress,
177
+ signal,
178
+ ...rest
179
+ } = {}) {
180
+ if (typeof prompt !== "string" || !prompt.trim()) {
181
+ throw new Error("generate: prompt required");
182
+ }
183
+ const cfg = globalConfig || readConfig() || {};
184
+ const { provider: selected, adapter, engineConfig } = await selectImageEngine({
185
+ globalConfig: cfg,
186
+ provider,
187
+ });
188
+
189
+ const request = resolveRequest({
190
+ imgCfg: imagesConfig(cfg),
191
+ engineCfg: engineConfig,
192
+ request: rest,
193
+ });
194
+ const declaredIgnored = ignoredOptions(adapter, { ...present(rest) });
195
+
196
+ const dir = outDir || imageOutDir();
197
+ const started = Date.now();
198
+ const result = await adapter.generate({
199
+ ...request,
200
+ prompt: prompt.trim(),
201
+ outDir: dir,
202
+ config: engineConfig,
203
+ parentEnginesCfg: cfg.engines,
204
+ onProgress,
205
+ signal,
206
+ });
207
+
208
+ // An adapter may discover, from the reply, that the server dropped something
209
+ // it had declared support for — a single-checkpoint clone answering 200 to a
210
+ // checkpoint switch it never made. The static declaration is the promise;
211
+ // this is the receipt.
212
+ const ignored = [...new Set([...declaredIgnored, ...(result.unhonored || [])])];
213
+
214
+ return {
215
+ images: result.images || [],
216
+ provider: selected,
217
+ // Only claim the requested model when the adapter could actually act on
218
+ // it: a server that hosts one checkpoint would otherwise report back the
219
+ // name it just ignored, which reads as "your model was used".
220
+ model: result.model
221
+ || (adapter.supports?.includes("model") ? request.model : null)
222
+ || null,
223
+ prompt: prompt.trim(),
224
+ // Redacted: the payload is up to a megabyte of base64 and this object ends
225
+ // up in --json, in logs and in stored sessions.
226
+ request: redactInputs(request),
227
+ ignored,
228
+ elapsed_ms: Date.now() - started,
229
+ meta: result.meta || {},
230
+ };
231
+ }
232
+
233
+ /** Engines, availability, and the configured routing — for CLI and settings. */
234
+ export async function listProviders(globalConfig) {
235
+ const cfg = globalConfig || readConfig() || {};
236
+ const imgCfg = imagesConfig(cfg);
237
+ return {
238
+ configured_provider: imgCfg.provider || "auto",
239
+ mode: resolveMode(imgCfg),
240
+ order: resolveChainOrder(imgCfg),
241
+ defaults: { ...FAMILY_DEFAULTS, ...present(imgCfg.defaults) },
242
+ engines: await listAvailableImageEngines(cfg),
243
+ };
244
+ }
245
+
246
+ /**
247
+ * Ask one server what it can do (models, samplers, schedulers). Returns null
248
+ * when the engine has no catalog route or is unreachable — the settings UI
249
+ * treats that as "type it by hand", not as an error.
250
+ */
251
+ export async function capabilities({ provider, globalConfig } = {}) {
252
+ const cfg = globalConfig || readConfig() || {};
253
+ const id = provider && provider !== "auto"
254
+ ? provider
255
+ : (await selectImageEngine({ globalConfig: cfg })).provider;
256
+ const adapter = getImageAdapter(id, cfg);
257
+ if (typeof adapter.capabilities !== "function") return { provider: id, capabilities: null };
258
+ const caps = await adapter.capabilities(providerConfig(cfg, id), cfg.engines);
259
+ return { provider: id, capabilities: caps };
260
+ }