@xopcai/xopc 0.0.29 → 0.0.31

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 (632) hide show
  1. package/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
  2. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  3. package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
  4. package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
  5. package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
  6. package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
  8. package/dist/extensions/telegram/src/config-schema.js +17 -4
  9. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  10. package/dist/extensions/telegram/src/plugin.js +4 -17
  11. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  16. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
  17. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
  18. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
  21. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
  22. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
  23. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
  24. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
  25. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
  26. package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
  27. package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
  31. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
  33. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
  34. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
  35. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
  36. package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
  37. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
  38. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
  39. package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
  40. package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
  42. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
  43. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
  44. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
  45. package/dist/gateway/static/root/index.html +2 -2
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-manager.d.ts +5 -7
  48. package/dist/src/agent/agent-manager.js +21 -19
  49. package/dist/src/agent/agent-manager.js.map +1 -1
  50. package/dist/src/agent/ipc/inbox.js +4 -2
  51. package/dist/src/agent/ipc/inbox.js.map +1 -1
  52. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  53. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  54. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  55. package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
  56. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  57. package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
  58. package/dist/src/agent/prompt/system-prompt.js +3 -17
  59. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  60. package/dist/src/agent/service/btw-query.d.ts +16 -0
  61. package/dist/src/agent/service/btw-query.js +88 -0
  62. package/dist/src/agent/service/btw-query.js.map +1 -0
  63. package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
  64. package/dist/src/agent/service/build-direct-message-content.js +75 -0
  65. package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
  66. package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
  67. package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
  68. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
  69. package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
  70. package/dist/src/agent/service/process-direct-one-shot.js +67 -0
  71. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
  72. package/dist/src/agent/service/process-direct-streaming.js +12 -1
  73. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  74. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
  75. package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
  76. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
  77. package/dist/src/agent/service/session-context-report.d.ts +19 -0
  78. package/dist/src/agent/service/session-context-report.js +47 -0
  79. package/dist/src/agent/service/session-context-report.js.map +1 -0
  80. package/dist/src/agent/service/webchat-tts.d.ts +28 -0
  81. package/dist/src/agent/service/webchat-tts.js +73 -0
  82. package/dist/src/agent/service/webchat-tts.js.map +1 -0
  83. package/dist/src/agent/service.d.ts +8 -12
  84. package/dist/src/agent/service.js +74 -379
  85. package/dist/src/agent/service.js.map +1 -1
  86. package/dist/src/agent/skills/config.js +4 -3
  87. package/dist/src/agent/skills/config.js.map +1 -1
  88. package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
  89. package/dist/src/agent/skills/format-skills-prompt.js +3 -24
  90. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  91. package/dist/src/agent/skills/hub-lock.js +4 -5
  92. package/dist/src/agent/skills/hub-lock.js.map +1 -1
  93. package/dist/src/agent/skills/index.js +9 -21
  94. package/dist/src/agent/skills/index.js.map +1 -1
  95. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
  96. package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
  97. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
  98. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
  99. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
  100. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
  101. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
  102. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
  103. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
  104. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
  105. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
  106. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
  107. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
  108. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
  109. package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
  110. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
  111. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
  112. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
  113. package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
  114. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
  115. package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
  116. package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
  117. package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
  118. package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
  119. package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
  120. package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
  121. package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
  122. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
  123. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
  124. package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
  125. package/dist/src/agent/skills/skill-view-path.js +66 -3
  126. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  127. package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
  128. package/dist/src/agent/skills/skills-marketplace.js +18 -0
  129. package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
  130. package/dist/src/agent/skills/test-framework.d.ts +0 -1
  131. package/dist/src/agent/skills/test-framework.js +2 -20
  132. package/dist/src/agent/skills/test-framework.js.map +1 -1
  133. package/dist/src/agent/skills/types.d.ts +12 -6
  134. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  135. package/dist/src/agent/tools/image-generate-tool.js +2 -2
  136. package/dist/src/auth/credentials.js +8 -6
  137. package/dist/src/auth/credentials.js.map +1 -1
  138. package/dist/src/auth/profiles/store.js +5 -3
  139. package/dist/src/auth/profiles/store.js.map +1 -1
  140. package/dist/src/channels/manager.js +1 -1
  141. package/dist/src/channels/outbound/persist-store.js +4 -4
  142. package/dist/src/channels/outbound/persist-store.js.map +1 -1
  143. package/dist/src/cli/commands/config.js +8 -6
  144. package/dist/src/cli/commands/config.js.map +1 -1
  145. package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
  146. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  147. package/dist/src/cli/commands/init.js +4 -2
  148. package/dist/src/cli/commands/init.js.map +1 -1
  149. package/dist/src/config/loader.js +3 -1
  150. package/dist/src/config/loader.js.map +1 -1
  151. package/dist/src/config/models-json.js +4 -5
  152. package/dist/src/config/models-json.js.map +1 -1
  153. package/dist/src/config/schema.d.ts +12 -4
  154. package/dist/src/config/schema.js +31 -5
  155. package/dist/src/config/schema.js.map +1 -1
  156. package/dist/src/cron/persistence.d.ts +1 -3
  157. package/dist/src/cron/persistence.js +6 -17
  158. package/dist/src/cron/persistence.js.map +1 -1
  159. package/dist/src/cron/validation.js +1 -1
  160. package/dist/src/cron/validation.js.map +1 -1
  161. package/dist/src/extensions/activation-context.js +0 -1
  162. package/dist/src/extensions/activation-context.js.map +1 -1
  163. package/dist/src/extensions/lockfile.js +4 -2
  164. package/dist/src/extensions/lockfile.js.map +1 -1
  165. package/dist/src/gateway/auth.d.ts +0 -9
  166. package/dist/src/gateway/auth.js +1 -12
  167. package/dist/src/gateway/auth.js.map +1 -1
  168. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
  169. package/dist/src/gateway/hono/lib/extension-store.js +4 -4
  170. package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
  171. package/dist/src/gateway/hono/routes/channels.js +5 -3
  172. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  173. package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
  174. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  175. package/dist/src/gateway/hono/routes/config.js +23 -2
  176. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  177. package/dist/src/gateway/hono/routes/sessions.js +124 -2
  178. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  179. package/dist/src/gateway/hono/sse.js +9 -2
  180. package/dist/src/gateway/hono/sse.js.map +1 -1
  181. package/dist/src/gateway/index.js +2 -2
  182. package/dist/src/gateway/lock.js +1 -1
  183. package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
  184. package/dist/src/gateway/service/run-gateway-agent.js +163 -0
  185. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
  186. package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
  187. package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
  188. package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
  189. package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
  190. package/dist/src/gateway/service/session-chat-ids.js +33 -0
  191. package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
  192. package/dist/src/gateway/service/sse-hub.d.ts +10 -0
  193. package/dist/src/gateway/service/sse-hub.js +55 -0
  194. package/dist/src/gateway/service/sse-hub.js.map +1 -0
  195. package/dist/src/gateway/service/types.d.ts +9 -0
  196. package/dist/src/gateway/service/types.js +1 -0
  197. package/dist/src/gateway/service.d.ts +42 -33
  198. package/dist/src/gateway/service.js +92 -246
  199. package/dist/src/gateway/service.js.map +1 -1
  200. package/dist/src/infra/update-lock.js +4 -2
  201. package/dist/src/infra/update-lock.js.map +1 -1
  202. package/dist/src/infra/update-startup.js +5 -14
  203. package/dist/src/infra/update-startup.js.map +1 -1
  204. package/dist/src/infra/write-file-atomic.d.ts +18 -0
  205. package/dist/src/infra/write-file-atomic.js +115 -0
  206. package/dist/src/infra/write-file-atomic.js.map +1 -0
  207. package/dist/src/session/abort-cutoff.d.ts +6 -0
  208. package/dist/src/session/abort-cutoff.js +10 -0
  209. package/dist/src/session/abort-cutoff.js.map +1 -0
  210. package/dist/src/session/compaction-checkpoints.d.ts +8 -0
  211. package/dist/src/session/compaction-checkpoints.js +21 -0
  212. package/dist/src/session/compaction-checkpoints.js.map +1 -0
  213. package/dist/src/session/config-store.js +4 -2
  214. package/dist/src/session/config-store.js.map +1 -1
  215. package/dist/src/session/index.d.ts +8 -1
  216. package/dist/src/session/index.js +7 -1
  217. package/dist/src/session/manager.d.ts +26 -1
  218. package/dist/src/session/manager.js +39 -2
  219. package/dist/src/session/manager.js.map +1 -1
  220. package/dist/src/session/patch-metadata.d.ts +12 -0
  221. package/dist/src/session/patch-metadata.js +23 -0
  222. package/dist/src/session/patch-metadata.js.map +1 -0
  223. package/dist/src/session/search-index.d.ts +2 -0
  224. package/dist/src/session/search-index.js +30 -2
  225. package/dist/src/session/search-index.js.map +1 -1
  226. package/dist/src/session/session-context-for-llm.d.ts +32 -0
  227. package/dist/src/session/session-context-for-llm.js +60 -0
  228. package/dist/src/session/session-context-for-llm.js.map +1 -0
  229. package/dist/src/session/store.d.ts +53 -2
  230. package/dist/src/session/store.js +427 -145
  231. package/dist/src/session/store.js.map +1 -1
  232. package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
  233. package/dist/src/session/strip-webchat-early-save.js +17 -0
  234. package/dist/src/session/strip-webchat-early-save.js.map +1 -0
  235. package/dist/src/session/transcript-format.d.ts +46 -0
  236. package/dist/src/session/transcript-format.js +88 -0
  237. package/dist/src/session/transcript-format.js.map +1 -0
  238. package/dist/src/session/types.d.ts +37 -0
  239. package/dist/src/session/types.js.map +1 -1
  240. package/dist/src/utils/logger/log-store.js +4 -3
  241. package/dist/src/utils/logger/log-store.js.map +1 -1
  242. package/dist/src/voice/tts/merge-config.js +0 -1
  243. package/dist/src/voice/tts/merge-config.js.map +1 -1
  244. package/dist/src/voice/tts/service.js +1 -2
  245. package/dist/src/voice/tts/service.js.map +1 -1
  246. package/package.json +1 -1
  247. package/skills/business/company-values/SKILL-zh.md +80 -0
  248. package/skills/business/company-values/SKILL.md +80 -0
  249. package/skills/business/find-community/SKILL-zh.md +50 -0
  250. package/skills/business/find-community/SKILL.md +50 -0
  251. package/skills/business/first-customers/SKILL-zh.md +76 -0
  252. package/skills/business/first-customers/SKILL.md +76 -0
  253. package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
  254. package/skills/business/grow-sustainably/SKILL.md +92 -0
  255. package/skills/business/marketing-plan/SKILL-zh.md +100 -0
  256. package/skills/business/marketing-plan/SKILL.md +100 -0
  257. package/skills/business/minimalist-review/SKILL-zh.md +82 -0
  258. package/skills/business/minimalist-review/SKILL.md +82 -0
  259. package/skills/business/mvp/SKILL-zh.md +81 -0
  260. package/skills/business/mvp/SKILL.md +81 -0
  261. package/skills/business/pricing/SKILL-zh.md +64 -0
  262. package/skills/business/pricing/SKILL.md +64 -0
  263. package/skills/business/processize/SKILL-zh.md +91 -0
  264. package/skills/business/processize/SKILL.md +91 -0
  265. package/skills/business/validate-idea/SKILL-zh.md +68 -0
  266. package/skills/business/validate-idea/SKILL.md +68 -0
  267. package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
  268. package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
  269. package/skills/creative/algorithmic-art/SKILL.md +405 -0
  270. package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
  271. package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
  272. package/skills/creative/canvas-design/LICENSE.txt +202 -0
  273. package/skills/creative/canvas-design/SKILL-zh.md +130 -0
  274. package/skills/creative/canvas-design/SKILL.md +130 -0
  275. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  276. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  277. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  278. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  279. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  280. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  281. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  282. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  283. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  284. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  285. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  286. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  287. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  288. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  289. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  290. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  291. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  292. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  293. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  294. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  295. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  296. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  297. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  298. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  299. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  300. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  301. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  302. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  303. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  304. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  305. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  306. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  307. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  308. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  309. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  310. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  311. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  312. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  313. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  314. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  315. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  316. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  317. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  318. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  319. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  320. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  321. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  322. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  323. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  324. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  325. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  326. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  327. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  328. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  329. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  330. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  331. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  332. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  333. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  334. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  335. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  336. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  337. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  338. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  339. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  340. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  341. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  342. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  343. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  344. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  345. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  346. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  347. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  348. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  349. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  350. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  351. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  352. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  353. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  354. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  355. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  356. package/skills/creative/frontend-design/LICENSE.txt +177 -0
  357. package/skills/creative/frontend-design/SKILL-zh.md +42 -0
  358. package/skills/creative/frontend-design/SKILL.md +42 -0
  359. package/skills/creative/theme-factory/LICENSE.txt +202 -0
  360. package/skills/creative/theme-factory/SKILL-zh.md +59 -0
  361. package/skills/creative/theme-factory/SKILL.md +59 -0
  362. package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
  363. package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
  364. package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
  365. package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
  366. package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
  367. package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
  368. package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
  369. package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
  370. package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
  371. package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
  372. package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
  373. package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
  374. package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
  375. package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
  376. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  377. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  378. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  379. package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
  380. package/skills/documents/doc-coauthoring/SKILL.md +375 -0
  381. package/skills/documents/docx/SKILL-zh.md +590 -0
  382. package/skills/{docx → documents/docx}/SKILL.md +11 -11
  383. package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
  384. package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
  385. package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
  386. package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
  387. package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
  388. package/skills/documents/pdf/SKILL-zh.md +314 -0
  389. package/skills/documents/pptx/SKILL-zh.md +232 -0
  390. package/skills/{pptx → documents/pptx}/editing.md +3 -3
  391. package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
  392. package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
  393. package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
  394. package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
  395. package/skills/documents/xlsx/SKILL-zh.md +292 -0
  396. package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
  397. package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
  398. package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
  399. package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
  400. package/skills/meta/skill-creator/LICENSE.txt +202 -0
  401. package/skills/meta/skill-creator/SKILL-zh.md +483 -0
  402. package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
  403. package/skills/tools/find-skills/SKILL-zh.md +440 -0
  404. package/skills/tools/github/SKILL-zh.md +48 -0
  405. package/skills/tools/internal-comms/LICENSE.txt +202 -0
  406. package/skills/tools/internal-comms/SKILL-zh.md +32 -0
  407. package/skills/tools/internal-comms/SKILL.md +32 -0
  408. package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
  409. package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
  410. package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
  411. package/skills/tools/internal-comms/examples/general-comms.md +16 -0
  412. package/skills/tools/summarize/SKILL-zh.md +47 -0
  413. package/skills/tools/weather/SKILL-zh.md +46 -0
  414. package/skills/tools/webapp-testing/LICENSE.txt +202 -0
  415. package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
  416. package/skills/tools/webapp-testing/SKILL.md +96 -0
  417. package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
  418. package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
  419. package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
  420. package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
  421. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
  422. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
  423. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
  424. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
  425. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
  426. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
  427. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
  428. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
  429. package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
  430. package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
  431. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
  432. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
  433. package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
  434. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
  435. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
  436. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
  437. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
  438. package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
  439. package/dist/src/agent/skills/skills-store-client.js.map +0 -1
  440. package/dist/src/stt/index.d.ts +0 -1
  441. package/dist/src/stt/index.js +0 -8
  442. /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
  443. /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
  444. /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
  445. /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
  446. /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
  447. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  448. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  449. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  450. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  451. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  452. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  453. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  454. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  455. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  456. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  457. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  458. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  459. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  460. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  461. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  462. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  463. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  464. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  465. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  466. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  467. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  468. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  469. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  470. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  471. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  472. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  473. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  474. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  475. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  476. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  477. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  478. /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
  479. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  480. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  481. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  482. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  483. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  484. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  485. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  486. /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
  487. /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
  488. /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
  489. /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
  490. /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
  491. /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
  492. /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
  493. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
  494. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
  495. /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
  496. /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
  497. /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
  498. /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
  499. /package/skills/{pdf → documents/pdf}/forms.md +0 -0
  500. /package/skills/{pdf → documents/pdf}/reference.md +0 -0
  501. /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
  502. /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
  503. /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
  504. /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
  505. /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
  506. /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
  507. /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
  508. /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
  509. /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
  510. /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
  511. /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
  512. /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
  513. /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
  514. /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
  515. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
  516. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
  517. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  518. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  519. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  520. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  521. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  522. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  523. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  524. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  525. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  526. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  527. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  528. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  529. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  530. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  531. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  532. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  533. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  534. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  535. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  536. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  537. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  538. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  539. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  540. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  541. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  542. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  543. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  544. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  545. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  546. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  547. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  548. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
  549. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  550. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  551. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  552. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  553. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  554. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  555. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  556. /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
  557. /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
  558. /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
  559. /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
  560. /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
  561. /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
  562. /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
  563. /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
  564. /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
  565. /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
  566. /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
  567. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  568. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  569. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  570. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  571. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  572. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  573. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  574. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  575. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  576. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  577. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  578. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  579. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  580. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  581. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  582. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  583. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  584. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  585. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  586. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  587. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  588. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  589. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  590. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  591. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  592. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  593. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  594. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  595. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  596. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  597. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  598. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
  599. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  600. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  601. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  602. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  603. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  604. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  605. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  606. /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
  607. /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
  608. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
  609. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
  610. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
  611. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
  612. /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
  613. /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
  614. /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
  615. /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
  616. /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
  617. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
  618. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
  619. /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
  620. /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
  621. /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
  622. /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
  623. /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
  624. /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
  625. /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
  626. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
  627. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
  628. /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
  629. /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
  630. /package/skills/{github → tools/github}/SKILL.md +0 -0
  631. /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
  632. /package/skills/{weather → tools/weather}/SKILL.md +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"process-direct-streaming.js","names":["msgEvent"],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentEvent, AgentMessage } from '@mariozechner/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport {\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport {\n extractTextContent,\n extractThinkingContent,\n extractThinkingFromAssistantMessage,\n} from '../context/workspace.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runAgentTurnWithModelFallbacks } from '../orchestration/run-agent-turn-with-fallbacks.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { serializeAgentToolResultForSse } from '../service-inbound-utils.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { AgentEventHandler } from '../orchestration/agent-event-handler.js';\nimport type { AgentOrchestrator } from '../orchestration/agent-orchestrator.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\n/** Logger shape expected by {@link runAgentTurnWithModelFallbacks}. */\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\n/**\n * Explicit collaborators for {@link runProcessDirectStreaming} (gateway webchat / CLI direct stream).\n * Bound by `AgentService` from its private fields and methods.\n */\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentManager;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentEventHandler: AgentEventHandler;\n sessionStore: SessionStore;\n prepareLoadedSessionMessages: (sessionKey: string, messages: AgentMessage[]) => AgentMessage[];\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n agentOrchestrator: Pick<AgentOrchestrator, 'abort'>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n persistAgentSessionMessages: (sessionKey: string) => Promise<void>;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const {\n log,\n parseSessionKey,\n initDirectStreamingSession,\n registerWebchatSsePublisher,\n unregisterWebchatSsePublisher,\n agentManager,\n hydrateSessionWorkspaceFromStore,\n hydrateSessionModelFromStore,\n agentEventHandler,\n sessionStore,\n prepareLoadedSessionMessages,\n modelManager,\n applyResolvedThinkingLevel,\n getConfig,\n sessionConfigStore,\n attachmentRootsForSession,\n agentOrchestrator,\n commandHandler,\n prepareInboundAttachments,\n buildMessageContent,\n persistAgentSessionMessages,\n maybeEmitWebchatTts,\n endDirectRequestContext,\n } = deps;\n\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = parseSessionKey(sessionKey);\n const context = initDirectStreamingSession(sessionKey, channel, chatId);\n\n const eventQueue: ProcessDirectStreamingSseEvent[] = [];\n let resolveWaiting: (() => void) | null = null;\n let agentDone = false;\n\n let lastSentContent = '';\n let lastSentThinking = '';\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const enqueueSseEvent = (event: ProcessDirectStreamingSseEvent) => {\n eventQueue.push(event);\n if (resolveWaiting) {\n resolveWaiting();\n resolveWaiting = null;\n }\n };\n\n const pushEvent = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n enqueueSseEvent(visible);\n }\n };\n\n if (channel === 'webchat') {\n registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n\n await hydrateSessionWorkspaceFromStore(sessionKey);\n const agent = agentManager.getOrCreateAgent(sessionKey);\n await hydrateSessionModelFromStore(sessionKey);\n const unsubscribeStreaming = agent.subscribe((event: AgentEvent) => {\n agentEventHandler.handle(event, context);\n\n switch (event.type) {\n case 'tool_execution_start': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_start',\n toolCallId: toolEvent.toolCallId,\n toolName,\n args: toolEvent.args,\n });\n break;\n }\n case 'tool_execution_end': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_end',\n toolCallId: toolEvent.toolCallId,\n toolName,\n isError: toolEvent.isError,\n result: serializeAgentToolResultForSse(toolEvent.result),\n });\n break;\n }\n case 'message_update': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_update' }>;\n if (msgEvent.message?.role === 'assistant') {\n const msgContent = msgEvent.message.content;\n const blocks = Array.isArray(msgContent)\n ? (msgContent as Array<{ type: string; text?: string }>)\n : undefined;\n const fullText = blocks ? extractTextContent(blocks) : String(msgContent);\n const thinkingFromBlocks = blocks ? extractThinkingContent(blocks) : '';\n const thinkingFromReasoning = extractThinkingFromAssistantMessage(msgEvent.message);\n const thinkingText =\n thinkingFromReasoning.length >= thinkingFromBlocks.length\n ? thinkingFromReasoning\n : thinkingFromBlocks;\n\n if (fullText.length > lastSentContent.length) {\n const delta = fullText.slice(lastSentContent.length);\n if (delta) {\n pushEvent({ type: 'token', content: delta });\n lastSentContent = fullText;\n }\n } else if (fullText.length < lastSentContent.length) {\n pushEvent({ type: 'token', content: fullText });\n lastSentContent = fullText;\n }\n\n if (thinkingText.length > lastSentThinking.length) {\n const thDelta = thinkingText.slice(lastSentThinking.length);\n if (thDelta) {\n pushEvent({ type: 'thinking', content: thDelta, delta: true });\n lastSentThinking = thinkingText;\n }\n } else if (thinkingText.length < lastSentThinking.length) {\n pushEvent({ type: 'thinking', content: thinkingText, delta: false });\n lastSentThinking = thinkingText;\n }\n }\n break;\n }\n case 'message_start': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n lastSentContent = '';\n lastSentThinking = '';\n pushEvent({ type: 'thinking', status: 'started' });\n }\n break;\n }\n case 'message_end': {\n pushEvent({ type: 'message_end' });\n break;\n }\n case 'agent_start': {\n pushEvent({ type: 'progress', stage: 'thinking', message: 'Thinking...' });\n break;\n }\n case 'agent_end': {\n pushEvent({ type: 'progress', stage: 'idle', message: 'Done' });\n break;\n }\n default:\n break;\n }\n });\n\n try {\n const prepared = await prepareInboundAttachments(sessionKey, input.attachments);\n let loaded = await sessionStore.load(sessionKey);\n const lastMsg = loaded[loaded.length - 1] as { role?: string; webchatEarlySave?: boolean } | undefined;\n if (lastMsg?.role === 'user' && lastMsg.webchatEarlySave === true) {\n loaded = loaded.slice(0, -1);\n }\n agent.state.messages = prepareLoadedSessionMessages(sessionKey, loaded);\n\n await modelManager.applyModelForSession(agent, sessionKey);\n await applyResolvedThinkingLevel(sessionKey, input.thinking);\n {\n const defReason = (getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, defReason);\n }\n\n const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.stt);\n const { text: mergedUserText, inboundVoice } = await mergeVoiceTranscriptsIntoUserText(\n attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n agentOrchestrator.abort(sessionKey);\n agentDone = true;\n pushEvent({ type: '__done__' });\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n } else {\n signal.addEventListener('abort', armAbort, { once: true });\n }\n }\n\n const commandInfo = parseSlashCommand(mergedUserText);\n let ranSlashCommand = false;\n /** Plain text to persist for webchat slash turns (SSE can be dropped by the UI; disk is source of truth). */\n let webchatSlashReceipt: string | undefined;\n if (!abortHandled && commandInfo) {\n if (commandRegistry.has(commandInfo.command)) {\n ranSlashCommand = true;\n try {\n const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(\n commandInfo.command,\n commandInfo.args,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n },\n );\n if (aggregatedText?.trim()) {\n webchatSlashReceipt = aggregatedText.trim();\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. For `/goal`, that usually means the goal was saved; the assistant will not run until your next normal message (or an auto-continuation after an assistant reply).';\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n } catch (cmdErr) {\n const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);\n log.warn({ err: cmdErr, sessionKey, command: commandInfo.command }, `Slash command failed: ${em}`);\n webchatSlashReceipt = `Command error: ${em}`;\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n pushEvent({ type: '__done__' });\n agentDone = true;\n } else if (commandInfo.command === 'goal') {\n // `/goal` is provided by the `standing-goal` bundled extension; avoid silent LLM fallback.\n ranSlashCommand = true;\n webchatSlashReceipt =\n 'The /goal command is not available: the `standing-goal` extension is not loaded.\\n\\n' +\n 'Fix: add `\"standing-goal\"` to `extensions.enabled` in your xopc config (or remove it from `extensions.disabled`), then restart the gateway. ' +\n 'If you use a strict allowlist, include `standing-goal` in `extensions.enabled`.';\n pushEvent({\n type: 'token',\n content: webchatSlashReceipt,\n });\n pushEvent({ type: '__done__' });\n agentDone = true;\n }\n }\n\n let messageContent:\n | Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>\n | undefined;\n if (!abortHandled && !ranSlashCommand) {\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n messageContent = await buildMessageContent(textForAgent, prepared, sessionKey);\n }\n\n if (!abortHandled && !ranSlashCommand && messageContent !== undefined) {\n const agentPromise = (async () => {\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n const userPlain = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n await runAgentTurnWithModelFallbacks({\n agent,\n sessionKey,\n modelManager,\n userMessage: userMessageForModel,\n log,\n getConfig,\n beforeUserPrompt: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),\n });\n agentManager.afterAgentTurn(sessionKey, userPlain);\n agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n })();\n\n agentPromise\n .then(() => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: '__done__' });\n })\n .catch((err) => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n pushEvent({ type: '__done__' });\n });\n }\n\n while (true) {\n if (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') break;\n yield event;\n } else if (agentDone) {\n break;\n } else {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n }\n\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') continue;\n yield event;\n }\n\n // Persist slash command text to the session file so the gateway console can show a receipt even when\n // the browser drops SSE tokens (e.g. session key mismatch during hydration).\n if (channel === 'webchat' && ranSlashCommand && webchatSlashReceipt?.trim()) {\n try {\n const loaded = await sessionStore.load(sessionKey);\n const text = webchatSlashReceipt.trim();\n // Minimal assistant row for session JSON; full AssistantMessage metadata is LLM-turn specific.\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text }],\n timestamp: Date.now(),\n } as AgentMessage;\n await sessionStore.save(sessionKey, [...loaded, assistantMsg]);\n } catch (err) {\n log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n // Slash-only turns never hydrate the early-saved user row into pi-agent state; persisting here would\n // write an empty/stale transcript over the gateway `SessionManager` copy (and break e.g. `/goal`).\n if (!ranSlashCommand) {\n await persistAgentSessionMessages(sessionKey);\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n } finally {\n if (channel === 'webchat') {\n unregisterWebchatSsePublisher(sessionKey);\n }\n unsubscribeStreaming();\n endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-direct-streaming.js","names":["msgEvent"],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentEvent, AgentMessage } from '@mariozechner/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InternalAttachmentRoots } from '../../channels/attachments/inbound-persist.js';\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport {\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n stripTrailingWebchatEarlySaveUserIfPresent,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport {\n extractTextContent,\n extractThinkingContent,\n extractThinkingFromAssistantMessage,\n} from '../context/workspace.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runAgentTurnWithModelFallbacks } from '../orchestration/run-agent-turn-with-fallbacks.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { serializeAgentToolResultForSse } from '../service-inbound-utils.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { AgentEventHandler } from '../orchestration/agent-event-handler.js';\nimport type { AgentOrchestrator } from '../orchestration/agent-orchestrator.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\n\nexport type DirectStreamInboundAttachment = {\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n workspaceRelativePath?: string;\n};\n\n/** Logger shape expected by {@link runAgentTurnWithModelFallbacks}. */\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\n/**\n * Explicit collaborators for {@link runProcessDirectStreaming} (gateway webchat / CLI direct stream).\n * Bound by `AgentService` from its private fields and methods.\n */\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentManager;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentEventHandler: AgentEventHandler;\n sessionStore: SessionStore;\n prepareLoadedSessionMessages: (sessionKey: string, messages: AgentMessage[]) => AgentMessage[];\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n attachmentRootsForSession: (sessionKey: string) => InternalAttachmentRoots;\n agentOrchestrator: Pick<AgentOrchestrator, 'abort'>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<DirectStreamInboundAttachment[] | undefined>;\n buildMessageContent: (\n content: string,\n attachments: DirectStreamInboundAttachment[] | undefined,\n sessionKey: string,\n ) => Promise<Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>>;\n persistAgentSessionMessages: (sessionKey: string) => Promise<void>;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; workspaceRelativePath: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const {\n log,\n parseSessionKey,\n initDirectStreamingSession,\n registerWebchatSsePublisher,\n unregisterWebchatSsePublisher,\n agentManager,\n hydrateSessionWorkspaceFromStore,\n hydrateSessionModelFromStore,\n agentEventHandler,\n sessionStore,\n prepareLoadedSessionMessages,\n modelManager,\n applyResolvedThinkingLevel,\n getConfig,\n sessionConfigStore,\n attachmentRootsForSession,\n agentOrchestrator,\n commandHandler,\n prepareInboundAttachments,\n buildMessageContent,\n persistAgentSessionMessages,\n maybeEmitWebchatTts,\n endDirectRequestContext,\n } = deps;\n\n const sessionKey = input.sessionKey ?? 'cli:direct';\n const { channel, chatId } = parseSessionKey(sessionKey);\n const context = initDirectStreamingSession(sessionKey, channel, chatId);\n\n const eventQueue: ProcessDirectStreamingSseEvent[] = [];\n let resolveWaiting: (() => void) | null = null;\n let agentDone = false;\n\n let lastSentContent = '';\n let lastSentThinking = '';\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const enqueueSseEvent = (event: ProcessDirectStreamingSseEvent) => {\n eventQueue.push(event);\n if (resolveWaiting) {\n resolveWaiting();\n resolveWaiting = null;\n }\n };\n\n const pushEvent = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n enqueueSseEvent(visible);\n }\n };\n\n if (channel === 'webchat') {\n registerWebchatSsePublisher(sessionKey, (e) => pushEvent(e));\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n\n await hydrateSessionWorkspaceFromStore(sessionKey);\n const agent = agentManager.getOrCreateAgent(sessionKey);\n await hydrateSessionModelFromStore(sessionKey);\n const unsubscribeStreaming = agent.subscribe((event: AgentEvent) => {\n agentEventHandler.handle(event, context);\n\n switch (event.type) {\n case 'tool_execution_start': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_start',\n toolCallId: toolEvent.toolCallId,\n toolName,\n args: toolEvent.args,\n });\n break;\n }\n case 'tool_execution_end': {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const toolName =\n typeof toolEvent.toolName === 'string' && toolEvent.toolName.trim()\n ? toolEvent.toolName.trim()\n : 'unknown';\n pushEvent({\n type: 'tool_end',\n toolCallId: toolEvent.toolCallId,\n toolName,\n isError: toolEvent.isError,\n result: serializeAgentToolResultForSse(toolEvent.result),\n });\n break;\n }\n case 'message_update': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_update' }>;\n if (msgEvent.message?.role === 'assistant') {\n const msgContent = msgEvent.message.content;\n const blocks = Array.isArray(msgContent)\n ? (msgContent as Array<{ type: string; text?: string }>)\n : undefined;\n const fullText = blocks ? extractTextContent(blocks) : String(msgContent);\n const thinkingFromBlocks = blocks ? extractThinkingContent(blocks) : '';\n const thinkingFromReasoning = extractThinkingFromAssistantMessage(msgEvent.message);\n const thinkingText =\n thinkingFromReasoning.length >= thinkingFromBlocks.length\n ? thinkingFromReasoning\n : thinkingFromBlocks;\n\n if (fullText.length > lastSentContent.length) {\n const delta = fullText.slice(lastSentContent.length);\n if (delta) {\n pushEvent({ type: 'token', content: delta });\n lastSentContent = fullText;\n }\n } else if (fullText.length < lastSentContent.length) {\n pushEvent({ type: 'token', content: fullText });\n lastSentContent = fullText;\n }\n\n if (thinkingText.length > lastSentThinking.length) {\n const thDelta = thinkingText.slice(lastSentThinking.length);\n if (thDelta) {\n pushEvent({ type: 'thinking', content: thDelta, delta: true });\n lastSentThinking = thinkingText;\n }\n } else if (thinkingText.length < lastSentThinking.length) {\n pushEvent({ type: 'thinking', content: thinkingText, delta: false });\n lastSentThinking = thinkingText;\n }\n }\n break;\n }\n case 'message_start': {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n lastSentContent = '';\n lastSentThinking = '';\n pushEvent({ type: 'thinking', status: 'started' });\n }\n break;\n }\n case 'message_end': {\n pushEvent({ type: 'message_end' });\n break;\n }\n case 'agent_start': {\n pushEvent({ type: 'progress', stage: 'thinking', message: 'Thinking...' });\n break;\n }\n case 'agent_end': {\n pushEvent({ type: 'progress', stage: 'idle', message: 'Done' });\n break;\n }\n default:\n break;\n }\n });\n\n try {\n const prepared = await prepareInboundAttachments(sessionKey, input.attachments);\n let loaded = await sessionStore.load(sessionKey);\n const lastMsg = loaded[loaded.length - 1] as { role?: string; webchatEarlySave?: boolean } | undefined;\n if (lastMsg?.role === 'user' && lastMsg.webchatEarlySave === true) {\n loaded = loaded.slice(0, -1);\n }\n agent.state.messages = prepareLoadedSessionMessages(sessionKey, loaded);\n\n await modelManager.applyModelForSession(agent, sessionKey);\n await applyResolvedThinkingLevel(sessionKey, input.thinking);\n {\n const defReason = (getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(sessionConfigStore, sessionKey, defReason);\n }\n\n const sttCfg = mergeSttConfigFromAppConfig(getConfig()?.stt);\n const { text: mergedUserText, inboundVoice } = await mergeVoiceTranscriptsIntoUserText(\n attachmentRootsForSession(sessionKey),\n prepared,\n input.content,\n sttCfg,\n );\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n agentOrchestrator.abort(sessionKey);\n agentDone = true;\n pushEvent({ type: '__done__' });\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n } else {\n signal.addEventListener('abort', armAbort, { once: true });\n }\n }\n\n const commandInfo = parseSlashCommand(mergedUserText);\n let ranSlashCommand = false;\n /** Plain text to persist for webchat slash turns (SSE can be dropped by the UI; disk is source of truth). */\n let webchatSlashReceipt: string | undefined;\n if (!abortHandled && commandInfo) {\n if (commandRegistry.has(commandInfo.command)) {\n ranSlashCommand = true;\n try {\n const { aggregatedText } = await commandHandler.executeCommandAndAggregateReply(\n commandInfo.command,\n commandInfo.args,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n },\n );\n if (aggregatedText?.trim()) {\n webchatSlashReceipt = aggregatedText.trim();\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. For `/goal`, that usually means the goal was saved; the assistant will not run until your next normal message (or an auto-continuation after an assistant reply).';\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n } catch (cmdErr) {\n const em = cmdErr instanceof Error ? cmdErr.message : String(cmdErr);\n log.warn({ err: cmdErr, sessionKey, command: commandInfo.command }, `Slash command failed: ${em}`);\n webchatSlashReceipt = `Command error: ${em}`;\n pushEvent({ type: 'token', content: webchatSlashReceipt });\n }\n pushEvent({ type: '__done__' });\n agentDone = true;\n } else if (commandInfo.command === 'goal') {\n // `/goal` is provided by the `standing-goal` bundled extension; avoid silent LLM fallback.\n ranSlashCommand = true;\n webchatSlashReceipt =\n 'The /goal command is not available: the `standing-goal` extension is not loaded.\\n\\n' +\n 'Fix: add `\"standing-goal\"` to `extensions.enabled` in your xopc config (or remove it from `extensions.disabled`), then restart the gateway. ' +\n 'If you use a strict allowlist, include `standing-goal` in `extensions.enabled`.';\n pushEvent({\n type: 'token',\n content: webchatSlashReceipt,\n });\n pushEvent({ type: '__done__' });\n agentDone = true;\n }\n }\n\n let messageContent:\n | Array<{ type: 'text'; text: string } | { type: 'image'; data: string; mimeType: string }>\n | undefined;\n if (!abortHandled && !ranSlashCommand) {\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n messageContent = await buildMessageContent(textForAgent, prepared, sessionKey);\n }\n\n if (!abortHandled && !ranSlashCommand && messageContent !== undefined) {\n const agentPromise = (async () => {\n const userMessage = {\n role: 'user' as const,\n content: messageContent,\n timestamp: Date.now(),\n };\n const userPlain = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n await runAgentTurnWithModelFallbacks({\n agent,\n sessionKey,\n modelManager,\n userMessage: userMessageForModel,\n log,\n getConfig,\n beforeUserPrompt: () => agentManager.beginBackgroundReviewUserTurn(sessionKey),\n });\n agentManager.afterAgentTurn(sessionKey, userPlain);\n agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n })();\n\n agentPromise\n .then(() => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: '__done__' });\n })\n .catch((err) => {\n if (abortHandled) {\n return;\n }\n agentDone = true;\n pushEvent({ type: 'error', content: err instanceof Error ? err.message : String(err) });\n pushEvent({ type: '__done__' });\n });\n }\n\n while (true) {\n if (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') break;\n yield event;\n } else if (agentDone) {\n break;\n } else {\n await new Promise<void>((resolve) => {\n resolveWaiting = resolve;\n });\n }\n }\n\n while (eventQueue.length > 0) {\n const event = eventQueue.shift()!;\n if (event.type === '__done__') continue;\n yield event;\n }\n\n // Persist slash command text to the session file so the gateway console can show a receipt even when\n // the browser drops SSE tokens (e.g. session key mismatch during hydration).\n if (channel === 'webchat' && ranSlashCommand && webchatSlashReceipt?.trim()) {\n try {\n const loaded = await sessionStore.load(sessionKey);\n const text = webchatSlashReceipt.trim();\n // Minimal assistant row for session JSON; full AssistantMessage metadata is LLM-turn specific.\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text }],\n timestamp: Date.now(),\n } as AgentMessage;\n await sessionStore.save(sessionKey, [...loaded, assistantMsg]);\n } catch (err) {\n log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n // Slash-only turns never hydrate the early-saved user row into pi-agent state; persisting here would\n // write an empty/stale transcript over the gateway `SessionManager` copy (and break e.g. `/goal`).\n if (!ranSlashCommand) {\n if (userAborted && channel === 'webchat') {\n try {\n await stripTrailingWebchatEarlySaveUserIfPresent(sessionStore, sessionKey);\n } catch (stripErr) {\n log.warn({ err: stripErr, sessionKey }, 'Failed to strip trailing webchat early-save after abort');\n }\n }\n await persistAgentSessionMessages(sessionKey);\n }\n\n if (!userAborted) {\n const ttsAudioEvent = await maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n yield ttsAudioEvent;\n }\n }\n } finally {\n if (channel === 'webchat') {\n unregisterWebchatSsePublisher(sessionKey);\n }\n unsubscribeStreaming();\n endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import type { CronService } from '../../cron/index.js';
3
+ /**
4
+ * Reconcile managed Dreaming cron jobs against the current effective config.
5
+ */
6
+ export declare function reconcileManagedDreamingCronJobs(cron: CronService, effectiveConfig: Config | undefined): Promise<void>;
@@ -0,0 +1,70 @@
1
+ import { DREAMING_CRON_NAME, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN } from "../memory/dreaming/constants.js";
2
+ import { resolveDreamingConfig } from "../memory/dreaming/config.js";
3
+ //#region src/agent/service/reconcile-dreaming-cron.ts
4
+ /**
5
+ * Reconcile managed Dreaming cron jobs against the current effective config.
6
+ */
7
+ async function reconcileManagedDreamingCronJobs(cron, effectiveConfig) {
8
+ const dreaming = resolveDreamingConfig(effectiveConfig);
9
+ const managed = (await cron.listJobs()).filter((job) => job.name?.includes?.("[managed-by=xopc.memory.dreaming]") ?? false);
10
+ const phaseSpecs = [
11
+ {
12
+ cronName: DREAMING_LIGHT_CRON_NAME,
13
+ token: DREAMING_LIGHT_SWEEP_TOKEN,
14
+ schedule: dreaming.phases.light.cron,
15
+ phaseEnabled: dreaming.phases.light.enabled
16
+ },
17
+ {
18
+ cronName: DREAMING_CRON_NAME,
19
+ token: DREAMING_SWEEP_TOKEN,
20
+ schedule: dreaming.phases.deep.cron,
21
+ phaseEnabled: dreaming.phases.deep.enabled
22
+ },
23
+ {
24
+ cronName: DREAMING_REM_CRON_NAME,
25
+ token: DREAMING_REM_SWEEP_TOKEN,
26
+ schedule: dreaming.phases.rem.cron,
27
+ phaseEnabled: dreaming.phases.rem.enabled
28
+ }
29
+ ];
30
+ if (!dreaming.enabled) {
31
+ for (const job of managed) await cron.removeJob(job.id).catch(() => {});
32
+ return;
33
+ }
34
+ for (const spec of phaseSpecs) {
35
+ const phaseJobs = managed.filter((job) => job.name === spec.cronName);
36
+ if (!spec.phaseEnabled) {
37
+ for (const job of phaseJobs) await cron.removeJob(job.id).catch(() => {});
38
+ continue;
39
+ }
40
+ const desiredPayload = {
41
+ kind: "agentTurn",
42
+ message: spec.token
43
+ };
44
+ if (phaseJobs.length === 0) {
45
+ await cron.addJob(spec.schedule, {
46
+ name: spec.cronName,
47
+ timezone: dreaming.timezone,
48
+ sessionTarget: "isolated",
49
+ payload: desiredPayload,
50
+ enabled: true
51
+ });
52
+ continue;
53
+ }
54
+ const primary = phaseJobs[0];
55
+ for (const dup of phaseJobs.slice(1)) await cron.removeJob(dup.id).catch(() => {});
56
+ const payloadMessage = primary.payload?.kind === "agentTurn" ? primary.payload.message : primary.payload?.text;
57
+ if (primary.schedule !== spec.schedule || (dreaming.timezone ?? null) !== (primary.timezone ?? null) || primary.sessionTarget !== "isolated" || payloadMessage !== spec.token || primary.enabled !== true || primary.name !== spec.cronName) await cron.updateJob(primary.id, {
58
+ schedule: spec.schedule,
59
+ timezone: dreaming.timezone ?? void 0,
60
+ sessionTarget: "isolated",
61
+ name: spec.cronName,
62
+ payload: desiredPayload,
63
+ enabled: true
64
+ });
65
+ }
66
+ }
67
+ //#endregion
68
+ export { reconcileManagedDreamingCronJobs };
69
+
70
+ //# sourceMappingURL=reconcile-dreaming-cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile-dreaming-cron.js","names":[],"sources":["../../../../src/agent/service/reconcile-dreaming-cron.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport type { CronService } from '../../cron/index.js';\nimport {\n DREAMING_CRON_TAG,\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_CRON_NAME,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_CRON_NAME,\n DREAMING_REM_CRON_NAME,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { resolveDreamingConfig } from '../memory/dreaming/config.js';\n\n/**\n * Reconcile managed Dreaming cron jobs against the current effective config.\n */\nexport async function reconcileManagedDreamingCronJobs(\n cron: CronService,\n effectiveConfig: Config | undefined,\n): Promise<void> {\n const dreaming = resolveDreamingConfig(effectiveConfig);\n const jobs = await cron.listJobs();\n const managed = jobs.filter((job) => job.name?.includes?.(DREAMING_CRON_TAG) ?? false);\n\n const phaseSpecs: Array<{\n cronName: string;\n token: string;\n schedule: string;\n phaseEnabled: boolean;\n }> = [\n {\n cronName: DREAMING_LIGHT_CRON_NAME,\n token: DREAMING_LIGHT_SWEEP_TOKEN,\n schedule: dreaming.phases.light.cron,\n phaseEnabled: dreaming.phases.light.enabled,\n },\n {\n cronName: DREAMING_CRON_NAME,\n token: DREAMING_SWEEP_TOKEN,\n schedule: dreaming.phases.deep.cron,\n phaseEnabled: dreaming.phases.deep.enabled,\n },\n {\n cronName: DREAMING_REM_CRON_NAME,\n token: DREAMING_REM_SWEEP_TOKEN,\n schedule: dreaming.phases.rem.cron,\n phaseEnabled: dreaming.phases.rem.enabled,\n },\n ];\n\n if (!dreaming.enabled) {\n for (const job of managed) {\n await cron.removeJob(job.id).catch(() => {});\n }\n return;\n }\n\n for (const spec of phaseSpecs) {\n const phaseJobs = managed.filter((job) => job.name === spec.cronName);\n\n if (!spec.phaseEnabled) {\n for (const job of phaseJobs) {\n await cron.removeJob(job.id).catch(() => {});\n }\n continue;\n }\n\n const desiredPayload = { kind: 'agentTurn' as const, message: spec.token };\n\n if (phaseJobs.length === 0) {\n await cron.addJob(spec.schedule, {\n name: spec.cronName,\n timezone: dreaming.timezone,\n sessionTarget: 'isolated' as const,\n payload: desiredPayload,\n enabled: true,\n } as any);\n continue;\n }\n\n const primary = phaseJobs[0]!;\n for (const dup of phaseJobs.slice(1)) {\n await cron.removeJob(dup.id).catch(() => {});\n }\n\n const payloadMessage =\n primary.payload?.kind === 'agentTurn'\n ? primary.payload.message\n : (primary.payload as any)?.text;\n const needsUpdate =\n primary.schedule !== spec.schedule ||\n (dreaming.timezone ?? null) !== (primary.timezone ?? null) ||\n primary.sessionTarget !== 'isolated' ||\n payloadMessage !== spec.token ||\n primary.enabled !== true ||\n primary.name !== spec.cronName;\n\n if (needsUpdate) {\n await cron.updateJob(primary.id, {\n schedule: spec.schedule,\n timezone: dreaming.timezone ?? undefined,\n sessionTarget: 'isolated',\n name: spec.cronName,\n payload: desiredPayload,\n enabled: true,\n } as any);\n }\n }\n}\n"],"mappings":";;;;;;AAgBA,eAAsB,iCACpB,MACA,iBACe;CACf,MAAM,WAAW,sBAAsB,gBAAgB;CAEvD,MAAM,WAAU,MADG,KAAK,UAAU,EACb,QAAQ,QAAQ,IAAI,MAAM,WAAA,oCAA6B,IAAI,MAAM;CAEtF,MAAM,aAKD;EACH;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,MAAM;GAChC,cAAc,SAAS,OAAO,MAAM;GACrC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,KAAK;GAC/B,cAAc,SAAS,OAAO,KAAK;GACpC;EACD;GACE,UAAU;GACV,OAAO;GACP,UAAU,SAAS,OAAO,IAAI;GAC9B,cAAc,SAAS,OAAO,IAAI;GACnC;EACF;AAED,KAAI,CAAC,SAAS,SAAS;AACrB,OAAK,MAAM,OAAO,QAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;AAGF,MAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,YAAY,QAAQ,QAAQ,QAAQ,IAAI,SAAS,KAAK,SAAS;AAErE,MAAI,CAAC,KAAK,cAAc;AACtB,QAAK,MAAM,OAAO,UAChB,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;AAE9C;;EAGF,MAAM,iBAAiB;GAAE,MAAM;GAAsB,SAAS,KAAK;GAAO;AAE1E,MAAI,UAAU,WAAW,GAAG;AAC1B,SAAM,KAAK,OAAO,KAAK,UAAU;IAC/B,MAAM,KAAK;IACX,UAAU,SAAS;IACnB,eAAe;IACf,SAAS;IACT,SAAS;IACV,CAAQ;AACT;;EAGF,MAAM,UAAU,UAAU;AAC1B,OAAK,MAAM,OAAO,UAAU,MAAM,EAAE,CAClC,OAAM,KAAK,UAAU,IAAI,GAAG,CAAC,YAAY,GAAG;EAG9C,MAAM,iBACJ,QAAQ,SAAS,SAAS,cACtB,QAAQ,QAAQ,UACf,QAAQ,SAAiB;AAShC,MAPE,QAAQ,aAAa,KAAK,aACzB,SAAS,YAAY,WAAW,QAAQ,YAAY,SACrD,QAAQ,kBAAkB,cAC1B,mBAAmB,KAAK,SACxB,QAAQ,YAAY,QACpB,QAAQ,SAAS,KAAK,SAGtB,OAAM,KAAK,UAAU,QAAQ,IAAI;GAC/B,UAAU,KAAK;GACf,UAAU,SAAS,YAAY,KAAA;GAC/B,eAAe;GACf,MAAM,KAAK;GACX,SAAS;GACT,SAAS;GACV,CAAQ"}
@@ -0,0 +1,19 @@
1
+ /** Assembled snapshot for `/context` (list, detail markdown, or JSON). */
2
+ export type SessionContextReportInput = {
3
+ sessionKey: string;
4
+ mode: 'list' | 'detail' | 'json';
5
+ model: string;
6
+ workspacePath: string;
7
+ agentId: string;
8
+ messageCount: number;
9
+ contextWindowNominal: number;
10
+ estimatedTranscriptTokens: number;
11
+ thinkingDefault?: string;
12
+ reasoningDefault?: string;
13
+ verboseDefault?: string;
14
+ compaction: unknown;
15
+ toolsFlagsSummary: string;
16
+ windowStats: unknown;
17
+ compactionRunStats: unknown;
18
+ };
19
+ export declare function formatSessionContextReport(input: SessionContextReportInput): string;
@@ -0,0 +1,47 @@
1
+ //#region src/agent/service/session-context-report.ts
2
+ function formatSessionContextReport(input) {
3
+ const { sessionKey, mode, model, workspacePath, agentId, messageCount, contextWindowNominal: cw, estimatedTranscriptTokens: estTokens, thinkingDefault, reasoningDefault, verboseDefault, compaction, toolsFlagsSummary, windowStats, compactionRunStats } = input;
4
+ const payload = {
5
+ sessionKey,
6
+ model,
7
+ workspacePath,
8
+ agentId,
9
+ messageCount,
10
+ contextWindowNominal: cw,
11
+ estimatedTranscriptTokens: estTokens,
12
+ approxWindowUsage: cw > 0 ? estTokens / cw : null,
13
+ thinkingDefault,
14
+ reasoningDefault,
15
+ verboseDefault,
16
+ compaction,
17
+ toolsFlagsOn: toolsFlagsSummary,
18
+ windowStats,
19
+ compactionRunStats
20
+ };
21
+ if (mode === "json") return JSON.stringify(payload, null, 2);
22
+ const lines = [
23
+ "📎 *Context overview*",
24
+ "",
25
+ `• Session: \`${sessionKey}\``,
26
+ `• Model: \`${model}\``,
27
+ `• Agent profile: \`${agentId}\``,
28
+ `• Workspace: \`${workspacePath}\``,
29
+ `• Messages: ${messageCount}`,
30
+ `• Est. transcript tokens (rough): ${estTokens}`,
31
+ `• Nominal context budget (4× maxTokens): ${cw}`
32
+ ];
33
+ if (cw > 0) lines.push(`• Approx. usage vs budget: ${(estTokens / cw * 100).toFixed(1)}%`);
34
+ lines.push(`• Thinking / reasoning / verbose defaults: ${thinkingDefault ?? "—"} / ${reasoningDefault ?? "—"} / ${verboseDefault ?? "—"}`, `• Tools (true flags): ${toolsFlagsSummary}`, "", "_Full system prompt, skills, and memory blocks are assembled at agent runtime; use Web settings or logs for deep inspection._");
35
+ if (mode === "detail") {
36
+ lines.push("", "*Compaction config (agents.defaults.compaction):*", "```json");
37
+ lines.push(JSON.stringify(compaction ?? {}, null, 2));
38
+ lines.push("```", "", "*Window stats:*", "```json");
39
+ lines.push(JSON.stringify(windowStats ?? {}, null, 2));
40
+ lines.push("```");
41
+ }
42
+ return lines.join("\n");
43
+ }
44
+ //#endregion
45
+ export { formatSessionContextReport };
46
+
47
+ //# sourceMappingURL=session-context-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-context-report.js","names":[],"sources":["../../../../src/agent/service/session-context-report.ts"],"sourcesContent":["/** Assembled snapshot for `/context` (list, detail markdown, or JSON). */\nexport type SessionContextReportInput = {\n sessionKey: string;\n mode: 'list' | 'detail' | 'json';\n model: string;\n workspacePath: string;\n agentId: string;\n messageCount: number;\n contextWindowNominal: number;\n estimatedTranscriptTokens: number;\n thinkingDefault?: string;\n reasoningDefault?: string;\n verboseDefault?: string;\n compaction: unknown;\n toolsFlagsSummary: string;\n windowStats: unknown;\n compactionRunStats: unknown;\n};\n\nexport function formatSessionContextReport(input: SessionContextReportInput): string {\n const {\n sessionKey,\n mode,\n model,\n workspacePath,\n agentId,\n messageCount,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault,\n reasoningDefault,\n verboseDefault,\n compaction,\n toolsFlagsSummary,\n windowStats,\n compactionRunStats,\n } = input;\n\n const payload: Record<string, unknown> = {\n sessionKey,\n model,\n workspacePath,\n agentId,\n messageCount,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n approxWindowUsage: cw > 0 ? estTokens / cw : null,\n thinkingDefault,\n reasoningDefault,\n verboseDefault,\n compaction,\n toolsFlagsOn: toolsFlagsSummary,\n windowStats,\n compactionRunStats: compactionRunStats,\n };\n\n if (mode === 'json') {\n return JSON.stringify(payload, null, 2);\n }\n\n const lines: string[] = [\n '📎 *Context overview*',\n '',\n `• Session: \\`${sessionKey}\\``,\n `• Model: \\`${model}\\``,\n `• Agent profile: \\`${agentId}\\``,\n `• Workspace: \\`${workspacePath}\\``,\n `• Messages: ${messageCount}`,\n `• Est. transcript tokens (rough): ${estTokens}`,\n `• Nominal context budget (4× maxTokens): ${cw}`,\n ];\n if (cw > 0) {\n lines.push(`• Approx. usage vs budget: ${((estTokens / cw) * 100).toFixed(1)}%`);\n }\n lines.push(\n `• Thinking / reasoning / verbose defaults: ${thinkingDefault ?? '—'} / ${reasoningDefault ?? '—'} / ${verboseDefault ?? '—'}`,\n `• Tools (true flags): ${toolsFlagsSummary}`,\n '',\n '_Full system prompt, skills, and memory blocks are assembled at agent runtime; use Web settings or logs for deep inspection._',\n );\n\n if (mode === 'detail') {\n lines.push('', '*Compaction config (agents.defaults.compaction):*', '```json');\n lines.push(JSON.stringify(compaction ?? {}, null, 2));\n lines.push('```', '', '*Window stats:*', '```json');\n lines.push(JSON.stringify(windowStats ?? {}, null, 2));\n lines.push('```');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":";AAmBA,SAAgB,2BAA2B,OAA0C;CACnF,MAAM,EACJ,YACA,MACA,OACA,eACA,SACA,cACA,sBAAsB,IACtB,2BAA2B,WAC3B,iBACA,kBACA,gBACA,YACA,mBACA,aACA,uBACE;CAEJ,MAAM,UAAmC;EACvC;EACA;EACA;EACA;EACA;EACA,sBAAsB;EACtB,2BAA2B;EAC3B,mBAAmB,KAAK,IAAI,YAAY,KAAK;EAC7C;EACA;EACA;EACA;EACA,cAAc;EACd;EACoB;EACrB;AAED,KAAI,SAAS,OACX,QAAO,KAAK,UAAU,SAAS,MAAM,EAAE;CAGzC,MAAM,QAAkB;EACtB;EACA;EACA,gBAAgB,WAAW;EAC3B,cAAc,MAAM;EACpB,sBAAsB,QAAQ;EAC9B,kBAAkB,cAAc;EAChC,eAAe;EACf,qCAAqC;EACrC,4CAA4C;EAC7C;AACD,KAAI,KAAK,EACP,OAAM,KAAK,+BAAgC,YAAY,KAAM,KAAK,QAAQ,EAAE,CAAC,GAAG;AAElF,OAAM,KACJ,8CAA8C,mBAAmB,IAAI,KAAK,oBAAoB,IAAI,KAAK,kBAAkB,OACzH,yBAAyB,qBACzB,IACA,gIACD;AAED,KAAI,SAAS,UAAU;AACrB,QAAM,KAAK,IAAI,qDAAqD,UAAU;AAC9E,QAAM,KAAK,KAAK,UAAU,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC;AACrD,QAAM,KAAK,OAAO,IAAI,mBAAmB,UAAU;AACnD,QAAM,KAAK,KAAK,UAAU,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC;AACtD,QAAM,KAAK,MAAM;;AAGnB,QAAO,MAAM,KAAK,KAAK"}
@@ -0,0 +1,28 @@
1
+ import type { Config } from '../../config/schema.js';
2
+ import type { AgentManager } from '../agent-manager.js';
3
+ import type { SessionStore } from '../../session/index.js';
4
+ export type WebchatTtsResult = {
5
+ type: 'tts_audio';
6
+ workspaceRelativePath: string;
7
+ mimeType: string;
8
+ name: string;
9
+ };
10
+ export type WebchatTtsDeps = {
11
+ config: Config | undefined;
12
+ agentManager: AgentManager;
13
+ sessionStore: SessionStore;
14
+ log: {
15
+ warn: (obj: Record<string, unknown>, msg: string) => void;
16
+ };
17
+ };
18
+ /**
19
+ * Generate TTS for webchat when config allows; persist under agent home `tts/`.
20
+ */
21
+ export declare function maybeEmitWebchatTts(deps: WebchatTtsDeps, sessionKey: string, hadInboundVoice: boolean): Promise<WebchatTtsResult | null>;
22
+ export declare function appendAttachmentToLastAssistant(sessionStore: SessionStore, sessionKey: string, att: {
23
+ type: string;
24
+ mimeType: string;
25
+ name: string;
26
+ size: number;
27
+ workspaceRelativePath: string;
28
+ }): Promise<void>;
@@ -0,0 +1,73 @@
1
+ import { init_agent_scope, resolveAgentHomeDir } from "../agent-scope.js";
2
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
3
+ import { isTTSAvailable } from "../../voice/tts/factory.js";
4
+ import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
5
+ import { speak } from "../../voice/tts/speak-core.js";
6
+ import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js";
7
+ import { compressAudio } from "../../voice/tts/audio.js";
8
+ import "../../voice/tts/index.js";
9
+ import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
10
+ //#region src/agent/service/webchat-tts.ts
11
+ init_agent_scope();
12
+ /**
13
+ * Generate TTS for webchat when config allows; persist under agent home `tts/`.
14
+ */
15
+ async function maybeEmitWebchatTts(deps, sessionKey, hadInboundVoice) {
16
+ const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.tts);
17
+ if (!isTTSAvailable(ttsConfig)) return null;
18
+ if (!shouldUseTTS(ttsConfig, hadInboundVoice).useTTS) return null;
19
+ const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();
20
+ if (!text) return null;
21
+ try {
22
+ const webOut = getChannelOutputFormat("webchat");
23
+ const fmt = webOut.format;
24
+ const ttsResult = await speak(text, ttsConfig, {
25
+ appConfig: deps.config,
26
+ tts: { format: fmt }
27
+ });
28
+ const { buffer, format } = await compressAudio(Buffer.from(ttsResult.audio), ttsResult.format, webOut.format === "mp3" ? "mp3" : "opus");
29
+ const normalizedMime = format === "opus" || format === "ogg" ? "audio/ogg" : format === "mp3" || format === "mpeg" ? "audio/mpeg" : format === "wav" ? "audio/wav" : `audio/${format}`;
30
+ const cfg = deps.config;
31
+ const persisted = await persistOutboundTtsAudio(resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)), sessionKey, buffer, format);
32
+ await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {
33
+ type: "audio",
34
+ mimeType: normalizedMime,
35
+ name: persisted.name,
36
+ size: persisted.size,
37
+ workspaceRelativePath: persisted.workspaceRelativePath
38
+ });
39
+ return {
40
+ type: "tts_audio",
41
+ workspaceRelativePath: persisted.workspaceRelativePath,
42
+ mimeType: normalizedMime,
43
+ name: persisted.name
44
+ };
45
+ } catch (err) {
46
+ deps.log.warn({
47
+ err,
48
+ sessionKey
49
+ }, "Webchat TTS failed");
50
+ return null;
51
+ }
52
+ }
53
+ async function appendAttachmentToLastAssistant(sessionStore, sessionKey, att) {
54
+ const loaded = await sessionStore.load(sessionKey);
55
+ for (let i = loaded.length - 1; i >= 0; i--) {
56
+ const m = loaded[i];
57
+ if (m.role === "assistant") {
58
+ const prev = m.attachments ?? [];
59
+ if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) return;
60
+ const next = [...prev, att];
61
+ loaded[i] = {
62
+ ...m,
63
+ attachments: next
64
+ };
65
+ await sessionStore.save(sessionKey, loaded);
66
+ return;
67
+ }
68
+ }
69
+ }
70
+ //#endregion
71
+ export { appendAttachmentToLastAssistant, maybeEmitWebchatTts };
72
+
73
+ //# sourceMappingURL=webchat-tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webchat-tts.js","names":[],"sources":["../../../../src/agent/service/webchat-tts.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { persistOutboundTtsAudio } from '../../channels/attachments/outbound-tts-persist.js';\nimport { compressAudio } from '../../voice/tts/audio.js';\nimport { speak } from '../../voice/tts/index.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\nimport { shouldUseTTS, getChannelOutputFormat } from '../../voice/tts/service.js';\nimport { isTTSAvailable } from '../../voice/tts/factory.js';\nimport { resolveAgentHomeDir } from '../agent-scope.js';\nimport { extractProfileAgentId } from '../../config/agent-profile.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { AgentMessage } from '@mariozechner/pi-agent-core';\n\nexport type WebchatTtsResult = {\n type: 'tts_audio';\n workspaceRelativePath: string;\n mimeType: string;\n name: string;\n};\n\nexport type WebchatTtsDeps = {\n config: Config | undefined;\n agentManager: AgentManager;\n sessionStore: SessionStore;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n};\n\n/**\n * Generate TTS for webchat when config allows; persist under agent home `tts/`.\n */\nexport async function maybeEmitWebchatTts(\n deps: WebchatTtsDeps,\n sessionKey: string,\n hadInboundVoice: boolean,\n): Promise<WebchatTtsResult | null> {\n const ttsConfig = mergeTtsConfigFromAppConfig(deps.config?.tts);\n if (!isTTSAvailable(ttsConfig)) {\n return null;\n }\n const decision = shouldUseTTS(ttsConfig, hadInboundVoice);\n if (!decision.useTTS) {\n return null;\n }\n const text = deps.agentManager.getLastAssistantContent(sessionKey)?.trim();\n if (!text) {\n return null;\n }\n try {\n const webOut = getChannelOutputFormat('webchat');\n const fmt = webOut.format as 'opus' | 'mp3' | 'wav';\n const ttsResult = await speak(text, ttsConfig, {\n appConfig: deps.config,\n tts: { format: fmt },\n });\n const { buffer, format } = await compressAudio(\n Buffer.from(ttsResult.audio),\n ttsResult.format,\n webOut.format === 'mp3' ? 'mp3' : 'opus',\n );\n const normalizedMime =\n format === 'opus' || format === 'ogg'\n ? 'audio/ogg'\n : format === 'mp3' || format === 'mpeg'\n ? 'audio/mpeg'\n : format === 'wav'\n ? 'audio/wav'\n : `audio/${format}`;\n const cfg = deps.config!;\n const persisted = await persistOutboundTtsAudio(\n resolveAgentHomeDir(cfg, extractProfileAgentId(sessionKey, cfg)),\n sessionKey,\n buffer,\n format,\n );\n await appendAttachmentToLastAssistant(deps.sessionStore, sessionKey, {\n type: 'audio',\n mimeType: normalizedMime,\n name: persisted.name,\n size: persisted.size,\n workspaceRelativePath: persisted.workspaceRelativePath,\n });\n return {\n type: 'tts_audio',\n workspaceRelativePath: persisted.workspaceRelativePath,\n mimeType: normalizedMime,\n name: persisted.name,\n };\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Webchat TTS failed');\n return null;\n }\n}\n\nexport async function appendAttachmentToLastAssistant(\n sessionStore: SessionStore,\n sessionKey: string,\n att: {\n type: string;\n mimeType: string;\n name: string;\n size: number;\n workspaceRelativePath: string;\n },\n): Promise<void> {\n const loaded = await sessionStore.load(sessionKey);\n for (let i = loaded.length - 1; i >= 0; i--) {\n const m = loaded[i] as { role?: string; attachments?: unknown[] };\n if (m.role === 'assistant') {\n const prev = (m.attachments ?? []) as Array<{ workspaceRelativePath?: string }>;\n if (prev.some((x) => x.workspaceRelativePath === att.workspaceRelativePath)) {\n return;\n }\n const next = [...prev, att];\n loaded[i] = { ...m, attachments: next } as unknown as AgentMessage;\n await sessionStore.save(sessionKey, loaded);\n return;\n }\n }\n}\n"],"mappings":";;;;;;;;;;kBAOwD;;;;AAuBxD,eAAsB,oBACpB,MACA,YACA,iBACkC;CAClC,MAAM,YAAY,4BAA4B,KAAK,QAAQ,IAAI;AAC/D,KAAI,CAAC,eAAe,UAAU,CAC5B,QAAO;AAGT,KAAI,CADa,aAAa,WAAW,gBAC5B,CAAC,OACZ,QAAO;CAET,MAAM,OAAO,KAAK,aAAa,wBAAwB,WAAW,EAAE,MAAM;AAC1E,KAAI,CAAC,KACH,QAAO;AAET,KAAI;EACF,MAAM,SAAS,uBAAuB,UAAU;EAChD,MAAM,MAAM,OAAO;EACnB,MAAM,YAAY,MAAM,MAAM,MAAM,WAAW;GAC7C,WAAW,KAAK;GAChB,KAAK,EAAE,QAAQ,KAAK;GACrB,CAAC;EACF,MAAM,EAAE,QAAQ,WAAW,MAAM,cAC/B,OAAO,KAAK,UAAU,MAAM,EAC5B,UAAU,QACV,OAAO,WAAW,QAAQ,QAAQ,OACnC;EACD,MAAM,iBACJ,WAAW,UAAU,WAAW,QAC5B,cACA,WAAW,SAAS,WAAW,SAC7B,eACA,WAAW,QACT,cACA,SAAS;EACnB,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,MAAM,wBACtB,oBAAoB,KAAK,sBAAsB,YAAY,IAAI,CAAC,EAChE,YACA,QACA,OACD;AACD,QAAM,gCAAgC,KAAK,cAAc,YAAY;GACnE,MAAM;GACN,UAAU;GACV,MAAM,UAAU;GAChB,MAAM,UAAU;GAChB,uBAAuB,UAAU;GAClC,CAAC;AACF,SAAO;GACL,MAAM;GACN,uBAAuB,UAAU;GACjC,UAAU;GACV,MAAM,UAAU;GACjB;UACM,KAAK;AACZ,OAAK,IAAI,KAAK;GAAE;GAAK;GAAY,EAAE,qBAAqB;AACxD,SAAO;;;AAIX,eAAsB,gCACpB,cACA,YACA,KAOe;CACf,MAAM,SAAS,MAAM,aAAa,KAAK,WAAW;AAClD,MAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;EAC3C,MAAM,IAAI,OAAO;AACjB,MAAI,EAAE,SAAS,aAAa;GAC1B,MAAM,OAAQ,EAAE,eAAe,EAAE;AACjC,OAAI,KAAK,MAAM,MAAM,EAAE,0BAA0B,IAAI,sBAAsB,CACzE;GAEF,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI;AAC3B,UAAO,KAAK;IAAE,GAAG;IAAG,aAAa;IAAM;AACvC,SAAM,aAAa,KAAK,YAAY,OAAO;AAC3C"}
@@ -5,6 +5,7 @@ import type { ChannelManager } from '../channels/manager.js';
5
5
  import type { SessionDetail } from '../session/types.js';
6
6
  import { type ReasoningLevel } from './transcript/thinking-types.js';
7
7
  import { type SkillCatalogEntry } from './agent-manager.js';
8
+ import type { SkillMarkdownPreviewPayload } from './skills/types.js';
8
9
  import type { AgentServiceConfig, StreamHandle } from './service.types.js';
9
10
  import type { CompactionResult } from './memory/compaction.js';
10
11
  export type { AgentServiceConfig, AgentContext, StreamHandle } from './service.types.js';
@@ -57,11 +58,8 @@ export declare class AgentService {
57
58
  * Apply config after save or hot reload so the default model updates without restarting the gateway.
58
59
  */
59
60
  applyAgentDefaultsFromConfig(config: Config): void;
60
- getSkillCatalog(): SkillCatalogEntry[];
61
- getSkillMarkdownSource(skillName: string): {
62
- name: string;
63
- markdown: string;
64
- } | null;
61
+ getSkillCatalog(lang?: string): SkillCatalogEntry[];
62
+ getSkillMarkdownSource(skillName: string, lang?: string): SkillMarkdownPreviewPayload | null;
65
63
  refreshSkillsAfterDiskChange(): void;
66
64
  refreshSkillsAfterSkillConfigChange(): void;
67
65
  getModelForSession(sessionKey: string): string;
@@ -108,7 +106,6 @@ export declare class AgentService {
108
106
  private prepareLoadedSessionMessages;
109
107
  private parseSessionKey;
110
108
  private initSessionContext;
111
- private buildMessageContent;
112
109
  /**
113
110
  * Persist inbound file attachments under agent home `inbound/` (non-images with data).
114
111
  * Idempotent if `workspaceRelativePath` is already set on an attachment.
@@ -135,6 +132,10 @@ export declare class AgentService {
135
132
  instructions?: string;
136
133
  force?: boolean;
137
134
  }): Promise<CompactionResult>;
135
+ /**
136
+ * Drop in-memory agent so the next turn reloads transcript from disk (e.g. after checkpoint restore).
137
+ */
138
+ evictSessionAgent(sessionKey: string): void;
138
139
  /**
139
140
  * One-shot LLM answer for /btw: uses transcript as background only; does not persist to session.
140
141
  */
@@ -142,7 +143,6 @@ export declare class AgentService {
142
143
  text: string;
143
144
  error?: string;
144
145
  }>;
145
- private formatMessagesForBtw;
146
146
  /** Markdown or JSON summary for /context (prompt assembly is approximated from config + transcript stats). */
147
147
  getSessionContextReport(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string>;
148
148
  getSessionStats(sessionKey: string, messages: AgentMessage[]): {
@@ -224,11 +224,7 @@ export declare class AgentService {
224
224
  * See `Agent.steer` in `@mariozechner/pi-agent-core`.
225
225
  */
226
226
  steerWebchatSession(sessionKey: string, text: string): Promise<boolean>;
227
- /**
228
- * Generate TTS for webchat when config allows, persist under agent home `tts/`, attach to last assistant turn.
229
- */
230
- private maybeEmitWebchatTts;
231
- private appendAttachmentToLastAssistant;
227
+ private createRunProcessDirectDeps;
232
228
  processDirect(content: string, sessionKey?: string, attachments?: Array<{
233
229
  type: string;
234
230
  mimeType?: string;