@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
@@ -0,0 +1,115 @@
1
+ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import path from "node:path";
3
+ import { chmodSync, closeSync, copyFileSync, fsyncSync, mkdirSync, openSync, renameSync, rmSync, writeFileSync } from "node:fs";
4
+ import { randomUUID } from "node:crypto";
5
+ import { chmod, copyFile, mkdir, open, rename, rm } from "node:fs/promises";
6
+ //#region src/infra/write-file-atomic.ts
7
+ /**
8
+ * Durable single-file writes: temp file → fsync → rename to target.
9
+ * Avoids torn JSON when the process dies mid-write.
10
+ */
11
+ function errno(err) {
12
+ return err instanceof Error ? err.code : void 0;
13
+ }
14
+ function replaceTempWithTargetSync(tempPath, filePath, mode) {
15
+ try {
16
+ renameSync(tempPath, filePath);
17
+ return;
18
+ } catch (err) {
19
+ const code = errno(err);
20
+ if (process.platform !== "win32" || code !== "EPERM" && code !== "EEXIST") throw err;
21
+ }
22
+ copyFileSync(tempPath, filePath);
23
+ try {
24
+ chmodSync(filePath, mode);
25
+ } catch {}
26
+ rmSync(tempPath, { force: true });
27
+ }
28
+ async function replaceTempWithTarget(tempPath, filePath, mode) {
29
+ try {
30
+ await rename(tempPath, filePath);
31
+ return;
32
+ } catch (err) {
33
+ const code = errno(err);
34
+ if (process.platform !== "win32" || code !== "EPERM" && code !== "EEXIST") throw err;
35
+ }
36
+ await copyFile(tempPath, filePath);
37
+ try {
38
+ await chmod(filePath, mode);
39
+ } catch {}
40
+ await rm(tempPath, { force: true }).catch(() => void 0);
41
+ }
42
+ /**
43
+ * Write UTF-8 text atomically. Creates parent directories when missing.
44
+ */
45
+ async function writeTextAtomic(filePath, content, options) {
46
+ const mode = options?.mode ?? 384;
47
+ const dir = path.dirname(filePath);
48
+ const mkdirOpts = { recursive: true };
49
+ if (typeof options?.ensureDirMode === "number") mkdirOpts.mode = options.ensureDirMode;
50
+ await mkdir(dir, mkdirOpts);
51
+ const tmp = `${filePath}.${randomUUID()}.tmp`;
52
+ try {
53
+ const handle = await open(tmp, "w", mode);
54
+ try {
55
+ await handle.writeFile(content, { encoding: "utf8" });
56
+ await handle.sync();
57
+ } finally {
58
+ await handle.close().catch(() => void 0);
59
+ }
60
+ try {
61
+ await chmod(tmp, mode);
62
+ } catch {}
63
+ await replaceTempWithTarget(tmp, filePath, mode);
64
+ try {
65
+ await chmod(filePath, mode);
66
+ } catch {}
67
+ } finally {
68
+ await rm(tmp, { force: true }).catch(() => void 0);
69
+ }
70
+ try {
71
+ const dirHandle = await open(dir, "r");
72
+ try {
73
+ await dirHandle.sync();
74
+ } finally {
75
+ await dirHandle.close().catch(() => void 0);
76
+ }
77
+ } catch {}
78
+ }
79
+ /**
80
+ * Synchronous atomic UTF-8 write (temp → fsync → rename). For CLI / sync stores.
81
+ */
82
+ function writeTextAtomicSync(filePath, content, options) {
83
+ const mode = options?.mode ?? 384;
84
+ const dir = path.dirname(filePath);
85
+ const mkdirOpts = { recursive: true };
86
+ if (typeof options?.ensureDirMode === "number") mkdirOpts.mode = options.ensureDirMode;
87
+ mkdirSync(dir, mkdirOpts);
88
+ const tmp = `${filePath}.${randomUUID()}.tmp`;
89
+ try {
90
+ writeFileSync(tmp, content, { encoding: "utf8" });
91
+ const fd = openSync(tmp, "r+");
92
+ try {
93
+ fsyncSync(fd);
94
+ } finally {
95
+ closeSync(fd);
96
+ }
97
+ try {
98
+ chmodSync(tmp, mode);
99
+ } catch {}
100
+ replaceTempWithTargetSync(tmp, filePath, mode);
101
+ try {
102
+ chmodSync(filePath, mode);
103
+ } catch {}
104
+ } finally {
105
+ try {
106
+ rmSync(tmp, { force: true });
107
+ } catch {}
108
+ }
109
+ }
110
+ var init_write_file_atomic = __esmMin((() => {}));
111
+ //#endregion
112
+ init_write_file_atomic();
113
+ export { init_write_file_atomic, writeTextAtomic, writeTextAtomicSync };
114
+
115
+ //# sourceMappingURL=write-file-atomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-file-atomic.js","names":[],"sources":["../../../src/infra/write-file-atomic.ts"],"sourcesContent":["/**\n * Durable single-file writes: temp file → fsync → rename to target.\n * Avoids torn JSON when the process dies mid-write.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport {\n chmodSync,\n closeSync,\n copyFileSync,\n fsyncSync,\n mkdirSync,\n openSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { mkdir, open, rename, rm, copyFile, chmod } from 'node:fs/promises';\nimport path from 'node:path';\n\nfunction errno(err: unknown): string | undefined {\n return err instanceof Error ? (err as NodeJS.ErrnoException).code : undefined;\n}\n\nfunction replaceTempWithTargetSync(tempPath: string, filePath: string, mode: number): void {\n try {\n renameSync(tempPath, filePath);\n return;\n } catch (err) {\n const code = errno(err);\n if (process.platform !== 'win32' || (code !== 'EPERM' && code !== 'EEXIST')) {\n throw err;\n }\n }\n\n copyFileSync(tempPath, filePath);\n try {\n chmodSync(filePath, mode);\n } catch {\n /* best-effort */\n }\n rmSync(tempPath, { force: true });\n}\n\nasync function replaceTempWithTarget(tempPath: string, filePath: string, mode: number): Promise<void> {\n try {\n await rename(tempPath, filePath);\n return;\n } catch (err) {\n const code = errno(err);\n if (process.platform !== 'win32' || (code !== 'EPERM' && code !== 'EEXIST')) {\n throw err;\n }\n }\n\n await copyFile(tempPath, filePath);\n try {\n await chmod(filePath, mode);\n } catch {\n /* best-effort */\n }\n await rm(tempPath, { force: true }).catch(() => undefined);\n}\n\n/**\n * Write UTF-8 text atomically. Creates parent directories when missing.\n */\nexport async function writeTextAtomic(\n filePath: string,\n content: string,\n options?: { mode?: number; ensureDirMode?: number },\n): Promise<void> {\n const mode = options?.mode ?? 0o600;\n const dir = path.dirname(filePath);\n const mkdirOpts: { recursive: true; mode?: number } = { recursive: true };\n if (typeof options?.ensureDirMode === 'number') {\n mkdirOpts.mode = options.ensureDirMode;\n }\n await mkdir(dir, mkdirOpts);\n\n const tmp = `${filePath}.${randomUUID()}.tmp`;\n try {\n const handle = await open(tmp, 'w', mode);\n try {\n await handle.writeFile(content, { encoding: 'utf8' });\n await handle.sync();\n } finally {\n await handle.close().catch(() => undefined);\n }\n try {\n await chmod(tmp, mode);\n } catch {\n /* best-effort */\n }\n await replaceTempWithTarget(tmp, filePath, mode);\n try {\n await chmod(filePath, mode);\n } catch {\n /* best-effort */\n }\n } finally {\n await rm(tmp, { force: true }).catch(() => undefined);\n }\n\n try {\n const dirHandle = await open(dir, 'r');\n try {\n await dirHandle.sync();\n } finally {\n await dirHandle.close().catch(() => undefined);\n }\n } catch {\n /* best-effort directory sync */\n }\n}\n\n/**\n * Synchronous atomic UTF-8 write (temp → fsync → rename). For CLI / sync stores.\n */\nexport function writeTextAtomicSync(\n filePath: string,\n content: string,\n options?: { mode?: number; ensureDirMode?: number },\n): void {\n const mode = options?.mode ?? 0o600;\n const dir = path.dirname(filePath);\n const mkdirOpts: { recursive: true; mode?: number } = { recursive: true };\n if (typeof options?.ensureDirMode === 'number') {\n mkdirOpts.mode = options.ensureDirMode;\n }\n mkdirSync(dir, mkdirOpts);\n\n const tmp = `${filePath}.${randomUUID()}.tmp`;\n try {\n writeFileSync(tmp, content, { encoding: 'utf8' });\n const fd = openSync(tmp, 'r+');\n try {\n fsyncSync(fd);\n } finally {\n closeSync(fd);\n }\n try {\n chmodSync(tmp, mode);\n } catch {\n /* best-effort */\n }\n replaceTempWithTargetSync(tmp, filePath, mode);\n try {\n chmodSync(filePath, mode);\n } catch {\n /* best-effort */\n }\n } finally {\n try {\n rmSync(tmp, { force: true });\n } catch {\n /* ignore */\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAS,MAAM,KAAkC;AAC/C,QAAO,eAAe,QAAS,IAA8B,OAAO,KAAA;;AAGtE,SAAS,0BAA0B,UAAkB,UAAkB,MAAoB;AACzF,KAAI;AACF,aAAW,UAAU,SAAS;AAC9B;UACO,KAAK;EACZ,MAAM,OAAO,MAAM,IAAI;AACvB,MAAI,QAAQ,aAAa,WAAY,SAAS,WAAW,SAAS,SAChE,OAAM;;AAIV,cAAa,UAAU,SAAS;AAChC,KAAI;AACF,YAAU,UAAU,KAAK;SACnB;AAGR,QAAO,UAAU,EAAE,OAAO,MAAM,CAAC;;AAGnC,eAAe,sBAAsB,UAAkB,UAAkB,MAA6B;AACpG,KAAI;AACF,QAAM,OAAO,UAAU,SAAS;AAChC;UACO,KAAK;EACZ,MAAM,OAAO,MAAM,IAAI;AACvB,MAAI,QAAQ,aAAa,WAAY,SAAS,WAAW,SAAS,SAChE,OAAM;;AAIV,OAAM,SAAS,UAAU,SAAS;AAClC,KAAI;AACF,QAAM,MAAM,UAAU,KAAK;SACrB;AAGR,OAAM,GAAG,UAAU,EAAE,OAAO,MAAM,CAAC,CAAC,YAAY,KAAA,EAAU;;;;;AAM5D,eAAsB,gBACpB,UACA,SACA,SACe;CACf,MAAM,OAAO,SAAS,QAAQ;CAC9B,MAAM,MAAM,KAAK,QAAQ,SAAS;CAClC,MAAM,YAAgD,EAAE,WAAW,MAAM;AACzE,KAAI,OAAO,SAAS,kBAAkB,SACpC,WAAU,OAAO,QAAQ;AAE3B,OAAM,MAAM,KAAK,UAAU;CAE3B,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AACxC,KAAI;EACF,MAAM,SAAS,MAAM,KAAK,KAAK,KAAK,KAAK;AACzC,MAAI;AACF,SAAM,OAAO,UAAU,SAAS,EAAE,UAAU,QAAQ,CAAC;AACrD,SAAM,OAAO,MAAM;YACX;AACR,SAAM,OAAO,OAAO,CAAC,YAAY,KAAA,EAAU;;AAE7C,MAAI;AACF,SAAM,MAAM,KAAK,KAAK;UAChB;AAGR,QAAM,sBAAsB,KAAK,UAAU,KAAK;AAChD,MAAI;AACF,SAAM,MAAM,UAAU,KAAK;UACrB;WAGA;AACR,QAAM,GAAG,KAAK,EAAE,OAAO,MAAM,CAAC,CAAC,YAAY,KAAA,EAAU;;AAGvD,KAAI;EACF,MAAM,YAAY,MAAM,KAAK,KAAK,IAAI;AACtC,MAAI;AACF,SAAM,UAAU,MAAM;YACd;AACR,SAAM,UAAU,OAAO,CAAC,YAAY,KAAA,EAAU;;SAE1C;;;;;AAQV,SAAgB,oBACd,UACA,SACA,SACM;CACN,MAAM,OAAO,SAAS,QAAQ;CAC9B,MAAM,MAAM,KAAK,QAAQ,SAAS;CAClC,MAAM,YAAgD,EAAE,WAAW,MAAM;AACzE,KAAI,OAAO,SAAS,kBAAkB,SACpC,WAAU,OAAO,QAAQ;AAE3B,WAAU,KAAK,UAAU;CAEzB,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AACxC,KAAI;AACF,gBAAc,KAAK,SAAS,EAAE,UAAU,QAAQ,CAAC;EACjD,MAAM,KAAK,SAAS,KAAK,KAAK;AAC9B,MAAI;AACF,aAAU,GAAG;YACL;AACR,aAAU,GAAG;;AAEf,MAAI;AACF,aAAU,KAAK,KAAK;UACd;AAGR,4BAA0B,KAAK,UAAU,KAAK;AAC9C,MAAI;AACF,aAAU,UAAU,KAAK;UACnB;WAGA;AACR,MAAI;AACF,UAAO,KAAK,EAAE,OAAO,MAAM,CAAC;UACtB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Webchat abort cutoff (OpenClaw-style): stale in-flight POSTs after /api/agent/abort
3
+ * are ignored when the client sends `clientCreatedAtMs` from send time.
4
+ */
5
+ import type { SessionMetadata } from './types.js';
6
+ export declare function shouldSkipWebchatInboundByAbortCutoff(meta: SessionMetadata | null | undefined, clientCreatedAtMs?: number): boolean;
@@ -0,0 +1,10 @@
1
+ //#region src/session/abort-cutoff.ts
2
+ function shouldSkipWebchatInboundByAbortCutoff(meta, clientCreatedAtMs) {
3
+ if (!meta?.abortCutoffTimestamp) return false;
4
+ if (typeof clientCreatedAtMs !== "number" || !Number.isFinite(clientCreatedAtMs)) return false;
5
+ return clientCreatedAtMs <= meta.abortCutoffTimestamp;
6
+ }
7
+ //#endregion
8
+ export { shouldSkipWebchatInboundByAbortCutoff };
9
+
10
+ //# sourceMappingURL=abort-cutoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort-cutoff.js","names":[],"sources":["../../../src/session/abort-cutoff.ts"],"sourcesContent":["/**\n * Webchat abort cutoff (OpenClaw-style): stale in-flight POSTs after /api/agent/abort\n * are ignored when the client sends `clientCreatedAtMs` from send time.\n */\n\nimport type { SessionMetadata } from './types.js';\n\nexport function shouldSkipWebchatInboundByAbortCutoff(\n meta: SessionMetadata | null | undefined,\n clientCreatedAtMs?: number,\n): boolean {\n if (!meta?.abortCutoffTimestamp) {\n return false;\n }\n if (typeof clientCreatedAtMs !== 'number' || !Number.isFinite(clientCreatedAtMs)) {\n return false;\n }\n return clientCreatedAtMs <= meta.abortCutoffTimestamp;\n}\n"],"mappings":";AAOA,SAAgB,sCACd,MACA,mBACS;AACT,KAAI,CAAC,MAAM,qBACT,QAAO;AAET,KAAI,OAAO,sBAAsB,YAAY,CAAC,OAAO,SAAS,kBAAkB,CAC9E,QAAO;AAET,QAAO,qBAAqB,KAAK"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Pre-compaction transcript snapshots ({safeKey}.compaction-backup.{uuid}.json).
3
+ * OpenClaw-style listing and id normalization for gateway APIs.
4
+ */
5
+ /**
6
+ * Accept raw uuid or full backup filename stem; returns lowercase uuid or null.
7
+ */
8
+ export declare function normalizeCompactionCheckpointId(raw: string): string | null;
@@ -0,0 +1,21 @@
1
+ //#region src/session/compaction-checkpoints.ts
2
+ /**
3
+ * Pre-compaction transcript snapshots ({safeKey}.compaction-backup.{uuid}.json).
4
+ * OpenClaw-style listing and id normalization for gateway APIs.
5
+ */
6
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
7
+ /**
8
+ * Accept raw uuid or full backup filename stem; returns lowercase uuid or null.
9
+ */
10
+ function normalizeCompactionCheckpointId(raw) {
11
+ const t = raw.trim();
12
+ if (!t) return null;
13
+ if (UUID_RE.test(t)) return t.toLowerCase();
14
+ const m = t.match(/\.compaction-backup\.([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\.json$/i);
15
+ if (m?.[1] && UUID_RE.test(m[1])) return m[1].toLowerCase();
16
+ return null;
17
+ }
18
+ //#endregion
19
+ export { normalizeCompactionCheckpointId };
20
+
21
+ //# sourceMappingURL=compaction-checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-checkpoints.js","names":[],"sources":["../../../src/session/compaction-checkpoints.ts"],"sourcesContent":["/**\n * Pre-compaction transcript snapshots ({safeKey}.compaction-backup.{uuid}.json).\n * OpenClaw-style listing and id normalization for gateway APIs.\n */\n\nconst UUID_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Accept raw uuid or full backup filename stem; returns lowercase uuid or null.\n */\nexport function normalizeCompactionCheckpointId(raw: string): string | null {\n const t = raw.trim();\n if (!t) return null;\n if (UUID_RE.test(t)) {\n return t.toLowerCase();\n }\n const m = t.match(/\\.compaction-backup\\.([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\\.json$/i);\n if (m?.[1] && UUID_RE.test(m[1])) {\n return m[1].toLowerCase();\n }\n return null;\n}\n"],"mappings":";;;;;AAKA,MAAM,UACJ;;;;AAKF,SAAgB,gCAAgC,KAA4B;CAC1E,MAAM,IAAI,IAAI,MAAM;AACpB,KAAI,CAAC,EAAG,QAAO;AACf,KAAI,QAAQ,KAAK,EAAE,CACjB,QAAO,EAAE,aAAa;CAExB,MAAM,IAAI,EAAE,MAAM,yGAAyG;AAC3H,KAAI,IAAI,MAAM,QAAQ,KAAK,EAAE,GAAG,CAC9B,QAAO,EAAE,GAAG,aAAa;AAE3B,QAAO"}
@@ -1,8 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
3
4
  import { join } from "path";
4
5
  import { existsSync } from "fs";
5
- import { mkdir, readFile, writeFile } from "fs/promises";
6
+ import { mkdir, readFile } from "fs/promises";
6
7
  //#region src/session/config-store.ts
7
8
  /**
8
9
  * Session Config Store
@@ -11,6 +12,7 @@ import { mkdir, readFile, writeFile } from "fs/promises";
11
12
  * Stores thinking level, reasoning visibility, verbose mode, and other
12
13
  * session-specific settings that can be overridden via commands.
13
14
  */
15
+ init_write_file_atomic();
14
16
  init_logger();
15
17
  const log = createLogger("SessionConfigStore");
16
18
  /**
@@ -64,7 +66,7 @@ var SessionConfigStore = class {
64
66
  updatedAt: Date.now()
65
67
  };
66
68
  try {
67
- await writeFile(configPath, JSON.stringify(configWithTimestamp, null, 2), "utf-8");
69
+ await writeTextAtomic(configPath, JSON.stringify(configWithTimestamp, null, 2));
68
70
  log.debug({ sessionKey }, "Session config saved");
69
71
  } catch (error) {
70
72
  log.error({
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","names":[],"sources":["../../../src/session/config-store.ts"],"sourcesContent":["/**\n * Session Config Store\n * \n * Manages session-level configuration persistence.\n * Stores thinking level, reasoning visibility, verbose mode, and other\n * session-specific settings that can be overridden via commands.\n */\n\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { createLogger } from '../utils/logger.js';\nimport type { ThinkLevel, ReasoningLevel, VerboseLevel, ElevatedMode } from '../agent/transcript/thinking-types.js';\n\nconst log = createLogger('SessionConfigStore');\n\n/**\n * Session-level agent configuration.\n * These settings override agent defaults for a specific session.\n */\nexport interface SessionAgentConfig {\n /** Thinking level for this session */\n thinkingLevel?: ThinkLevel;\n /** Reasoning visibility for this session */\n reasoningLevel?: ReasoningLevel;\n /** Verbose level for this session */\n verboseLevel?: VerboseLevel;\n /** Elevated mode for this session */\n elevatedMode?: ElevatedMode;\n /** Model override for this session */\n modelOverride?: string;\n /** Provider override for this session */\n providerOverride?: string;\n /** Absolute markdown workspace root for this session (set once; immutable after save). */\n workingDirectoryOverride?: string;\n /** Last updated timestamp */\n updatedAt?: number;\n}\n\n/**\n * Session config store manager.\n * Each session can have its own configuration that overrides agent defaults.\n */\nexport class SessionConfigStore {\n private configDir: string;\n\n /** @param agentHomeDir — `resolveAgentHomeDir(…)` (parent of `sessions/` transcript store) */\n constructor(agentHomeDir: string) {\n this.configDir = join(agentHomeDir, 'sessions', 'config');\n }\n\n /**\n * Initialize the config store\n */\n async initialize(): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n log.debug('Session config store initialized');\n }\n\n /**\n * Get the config file path for a session\n */\n private getConfigPath(sessionKey: string): string {\n // Sanitize session key to be a valid filename\n const safeKey = sessionKey.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(this.configDir, `${safeKey}.json`);\n }\n\n /**\n * Get config for a session\n */\n async get(sessionKey: string): Promise<SessionAgentConfig | null> {\n const configPath = this.getConfigPath(sessionKey);\n \n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = await readFile(configPath, 'utf-8');\n const config = JSON.parse(content) as SessionAgentConfig;\n return config;\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to read session config');\n return null;\n }\n }\n\n /**\n * Set config for a session (full replacement)\n */\n async set(sessionKey: string, config: SessionAgentConfig): Promise<void> {\n const configPath = this.getConfigPath(sessionKey);\n const configWithTimestamp = {\n ...config,\n updatedAt: Date.now(),\n };\n\n try {\n await writeFile(configPath, JSON.stringify(configWithTimestamp, null, 2), 'utf-8');\n log.debug({ sessionKey }, 'Session config saved');\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to save session config');\n throw error;\n }\n }\n\n /**\n * Update config for a session (partial update)\n */\n async update(sessionKey: string, partial: Partial<SessionAgentConfig>): Promise<SessionAgentConfig> {\n const existing = await this.get(sessionKey);\n const updated = {\n ...existing,\n ...partial,\n updatedAt: Date.now(),\n };\n \n await this.set(sessionKey, updated);\n return updated;\n }\n\n /**\n * Delete config for a session\n */\n async delete(sessionKey: string): Promise<void> {\n const configPath = this.getConfigPath(sessionKey);\n \n if (existsSync(configPath)) {\n try {\n const { unlink } = await import('fs/promises');\n await unlink(configPath);\n log.debug({ sessionKey }, 'Session config deleted');\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to delete session config');\n throw error;\n }\n }\n }\n\n /**\n * Check if config exists for a session\n */\n async has(sessionKey: string): Promise<boolean> {\n const configPath = this.getConfigPath(sessionKey);\n return existsSync(configPath);\n }\n\n /**\n * Get all session configs\n */\n async getAll(): Promise<Map<string, SessionAgentConfig>> {\n const { readdir } = await import('fs/promises');\n const configs = new Map<string, SessionAgentConfig>();\n\n try {\n const files = await readdir(this.configDir);\n \n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n \n const sessionKey = file.replace('.json', '').replace(/_/g, '-');\n const config = await this.get(sessionKey);\n \n if (config) {\n configs.set(sessionKey, config);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to list session configs');\n }\n\n return configs;\n }\n\n /**\n * Clear all session configs\n */\n async clear(): Promise<void> {\n const { readdir, rm } = await import('fs/promises');\n \n try {\n const files = await readdir(this.configDir);\n \n for (const file of files) {\n if (file.endsWith('.json')) {\n await rm(join(this.configDir, file), { force: true });\n }\n }\n \n log.debug('All session configs cleared');\n } catch (error) {\n log.error({ error }, 'Failed to clear session configs');\n throw error;\n }\n }\n}\n\n// ========== Helper Functions ==========\n\n/**\n * Resolve thinking level for a session.\n * Returns session config if set, otherwise falls back to agent defaults.\n */\nexport async function resolveThinkingLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: ThinkLevel\n): Promise<ThinkLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.thinkingLevel) {\n return config.thinkingLevel;\n }\n \n return agentDefault;\n}\n\n/**\n * Resolve reasoning level for a session.\n */\nexport async function resolveReasoningLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: ReasoningLevel\n): Promise<ReasoningLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.reasoningLevel) {\n return config.reasoningLevel;\n }\n \n return agentDefault;\n}\n\n/**\n * Resolve verbose level for a session.\n */\nexport async function resolveVerboseLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: VerboseLevel\n): Promise<VerboseLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.verboseLevel) {\n return config.verboseLevel;\n }\n \n return agentDefault;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config-store.js","names":[],"sources":["../../../src/session/config-store.ts"],"sourcesContent":["/**\n * Session Config Store\n * \n * Manages session-level configuration persistence.\n * Stores thinking level, reasoning visibility, verbose mode, and other\n * session-specific settings that can be overridden via commands.\n */\n\nimport { readFile, mkdir } from 'fs/promises';\nimport { writeTextAtomic } from '../infra/write-file-atomic.js';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { createLogger } from '../utils/logger.js';\nimport type { ThinkLevel, ReasoningLevel, VerboseLevel, ElevatedMode } from '../agent/transcript/thinking-types.js';\n\nconst log = createLogger('SessionConfigStore');\n\n/**\n * Session-level agent configuration.\n * These settings override agent defaults for a specific session.\n */\nexport interface SessionAgentConfig {\n /** Thinking level for this session */\n thinkingLevel?: ThinkLevel;\n /** Reasoning visibility for this session */\n reasoningLevel?: ReasoningLevel;\n /** Verbose level for this session */\n verboseLevel?: VerboseLevel;\n /** Elevated mode for this session */\n elevatedMode?: ElevatedMode;\n /** Model override for this session */\n modelOverride?: string;\n /** Provider override for this session */\n providerOverride?: string;\n /** Absolute markdown workspace root for this session (set once; immutable after save). */\n workingDirectoryOverride?: string;\n /** Last updated timestamp */\n updatedAt?: number;\n}\n\n/**\n * Session config store manager.\n * Each session can have its own configuration that overrides agent defaults.\n */\nexport class SessionConfigStore {\n private configDir: string;\n\n /** @param agentHomeDir — `resolveAgentHomeDir(…)` (parent of `sessions/` transcript store) */\n constructor(agentHomeDir: string) {\n this.configDir = join(agentHomeDir, 'sessions', 'config');\n }\n\n /**\n * Initialize the config store\n */\n async initialize(): Promise<void> {\n await mkdir(this.configDir, { recursive: true });\n log.debug('Session config store initialized');\n }\n\n /**\n * Get the config file path for a session\n */\n private getConfigPath(sessionKey: string): string {\n // Sanitize session key to be a valid filename\n const safeKey = sessionKey.replace(/[^a-zA-Z0-9_-]/g, '_');\n return join(this.configDir, `${safeKey}.json`);\n }\n\n /**\n * Get config for a session\n */\n async get(sessionKey: string): Promise<SessionAgentConfig | null> {\n const configPath = this.getConfigPath(sessionKey);\n \n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = await readFile(configPath, 'utf-8');\n const config = JSON.parse(content) as SessionAgentConfig;\n return config;\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to read session config');\n return null;\n }\n }\n\n /**\n * Set config for a session (full replacement)\n */\n async set(sessionKey: string, config: SessionAgentConfig): Promise<void> {\n const configPath = this.getConfigPath(sessionKey);\n const configWithTimestamp = {\n ...config,\n updatedAt: Date.now(),\n };\n\n try {\n await writeTextAtomic(configPath, JSON.stringify(configWithTimestamp, null, 2));\n log.debug({ sessionKey }, 'Session config saved');\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to save session config');\n throw error;\n }\n }\n\n /**\n * Update config for a session (partial update)\n */\n async update(sessionKey: string, partial: Partial<SessionAgentConfig>): Promise<SessionAgentConfig> {\n const existing = await this.get(sessionKey);\n const updated = {\n ...existing,\n ...partial,\n updatedAt: Date.now(),\n };\n \n await this.set(sessionKey, updated);\n return updated;\n }\n\n /**\n * Delete config for a session\n */\n async delete(sessionKey: string): Promise<void> {\n const configPath = this.getConfigPath(sessionKey);\n \n if (existsSync(configPath)) {\n try {\n const { unlink } = await import('fs/promises');\n await unlink(configPath);\n log.debug({ sessionKey }, 'Session config deleted');\n } catch (error) {\n log.error({ sessionKey, error }, 'Failed to delete session config');\n throw error;\n }\n }\n }\n\n /**\n * Check if config exists for a session\n */\n async has(sessionKey: string): Promise<boolean> {\n const configPath = this.getConfigPath(sessionKey);\n return existsSync(configPath);\n }\n\n /**\n * Get all session configs\n */\n async getAll(): Promise<Map<string, SessionAgentConfig>> {\n const { readdir } = await import('fs/promises');\n const configs = new Map<string, SessionAgentConfig>();\n\n try {\n const files = await readdir(this.configDir);\n \n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n \n const sessionKey = file.replace('.json', '').replace(/_/g, '-');\n const config = await this.get(sessionKey);\n \n if (config) {\n configs.set(sessionKey, config);\n }\n }\n } catch (error) {\n log.error({ error }, 'Failed to list session configs');\n }\n\n return configs;\n }\n\n /**\n * Clear all session configs\n */\n async clear(): Promise<void> {\n const { readdir, rm } = await import('fs/promises');\n \n try {\n const files = await readdir(this.configDir);\n \n for (const file of files) {\n if (file.endsWith('.json')) {\n await rm(join(this.configDir, file), { force: true });\n }\n }\n \n log.debug('All session configs cleared');\n } catch (error) {\n log.error({ error }, 'Failed to clear session configs');\n throw error;\n }\n }\n}\n\n// ========== Helper Functions ==========\n\n/**\n * Resolve thinking level for a session.\n * Returns session config if set, otherwise falls back to agent defaults.\n */\nexport async function resolveThinkingLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: ThinkLevel\n): Promise<ThinkLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.thinkingLevel) {\n return config.thinkingLevel;\n }\n \n return agentDefault;\n}\n\n/**\n * Resolve reasoning level for a session.\n */\nexport async function resolveReasoningLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: ReasoningLevel\n): Promise<ReasoningLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.reasoningLevel) {\n return config.reasoningLevel;\n }\n \n return agentDefault;\n}\n\n/**\n * Resolve verbose level for a session.\n */\nexport async function resolveVerboseLevel(\n sessionConfigStore: SessionConfigStore,\n sessionKey: string,\n agentDefault?: VerboseLevel\n): Promise<VerboseLevel | undefined> {\n const config = await sessionConfigStore.get(sessionKey);\n \n if (config?.verboseLevel) {\n return config.verboseLevel;\n }\n \n return agentDefault;\n}\n"],"mappings":"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"}
@@ -9,8 +9,15 @@ export { SessionConfigStore, resolveThinkingLevel, resolveReasoningLevel, resolv
9
9
  export { resolveEffectiveThinkingLevel, resolveEffectiveReasoningLevel } from './thinking-resolve.js';
10
10
  export type { SessionAgentConfig } from './config-store.js';
11
11
  export { normalizeWorkingDirectoryInput, effectiveWorkspacePathForSession, } from './session-workspace.js';
12
- export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionIndex, type SessionListQuery, type PaginatedResult, type SessionStats, type ExportFormat, type SessionExport, } from './types.js';
12
+ export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionIndex, type SessionListQuery, type PaginatedResult, type SessionStats, type ExportFormat, type SessionExport, type SessionTranscriptSummary, type CompactionCheckpointSummary, type CompactionCheckpointDetail, } from './types.js';
13
+ export { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';
14
+ export { shouldSkipWebchatInboundByAbortCutoff } from './abort-cutoff.js';
15
+ export { stripTrailingWebchatEarlySaveUserIfPresent } from './strip-webchat-early-save.js';
13
16
  export type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';
14
17
  export type { WindowConfig } from '../agent/memory/window.js';
15
18
  export { maybeAutoTitleSessionStore, generateSessionTitleFromMessages, sanitizeSessionTitle, fallbackTitleFromMessages, isWebchatSessionKey, shouldAutoTitleSessionKey, } from './session-title.js';
16
19
  export { messagesToClientHistory, flattenMessageContent, type ClientHistoryMessage } from './client-history.js';
20
+ export { XOPC_SESSION_TRANSCRIPT_TYPE, CURRENT_SESSION_TRANSCRIPT_VERSION, parseStoredTranscriptJson, buildTranscriptEnvelope, } from './transcript-format.js';
21
+ export { buildSessionContextForLlm, isTranscriptContextEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray, type TranscriptStoredRow, type XopcTranscriptContextEntry, } from './session-context-for-llm.js';
22
+ export type { XopcSessionTranscriptV1, TranscriptCompactionRecord, } from './transcript-format.js';
23
+ export { applySessionPatchToMetadata, type SessionPatchBody } from './patch-metadata.js';
@@ -1,13 +1,19 @@
1
1
  import { fileStemToSessionKey } from "./session-file-key.js";
2
+ import { buildSessionContextForLlm, isTranscriptContextEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
3
+ import { CURRENT_SESSION_TRANSCRIPT_VERSION, XOPC_SESSION_TRANSCRIPT_TYPE, buildTranscriptEnvelope, parseStoredTranscriptJson } from "./transcript-format.js";
2
4
  import { SessionSearchIndex } from "./search-index.js";
3
5
  import { getOrLoadSessionSearchIndex, invalidateSessionSearchIndexCache } from "./search-index-cache.js";
4
6
  import { fallbackTitleFromMessages, generateSessionTitleFromMessages, isWebchatSessionKey, maybeAutoTitleSessionStore, sanitizeSessionTitle, shouldAutoTitleSessionKey } from "./session-title.js";
5
7
  import { resolveSessionShardRelativePath, sanitizeSessionPathSegment } from "./shard-path.js";
6
8
  import { SessionStatus } from "./types.js";
9
+ import { normalizeCompactionCheckpointId } from "./compaction-checkpoints.js";
7
10
  import { SessionStore } from "./store.js";
11
+ import { applySessionPatchToMetadata } from "./patch-metadata.js";
8
12
  import { SessionManager } from "./manager.js";
9
13
  import { SessionConfigStore, resolveReasoningLevel, resolveThinkingLevel, resolveVerboseLevel } from "./config-store.js";
10
14
  import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "./thinking-resolve.js";
11
15
  import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "./session-workspace.js";
16
+ import { shouldSkipWebchatInboundByAbortCutoff } from "./abort-cutoff.js";
17
+ import { stripTrailingWebchatEarlySaveUserIfPresent } from "./strip-webchat-early-save.js";
12
18
  import { flattenMessageContent, messagesToClientHistory } from "./client-history.js";
13
- export { SessionConfigStore, SessionManager, SessionSearchIndex, SessionStatus, SessionStore, effectiveWorkspacePathForSession, fallbackTitleFromMessages, fileStemToSessionKey, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, invalidateSessionSearchIndexCache, isWebchatSessionKey, maybeAutoTitleSessionStore, messagesToClientHistory, normalizeWorkingDirectoryInput, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveSessionShardRelativePath, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionPathSegment, sanitizeSessionTitle, shouldAutoTitleSessionKey };
19
+ export { CURRENT_SESSION_TRANSCRIPT_VERSION, SessionConfigStore, SessionManager, SessionSearchIndex, SessionStatus, SessionStore, XOPC_SESSION_TRANSCRIPT_TYPE, applySessionPatchToMetadata, buildSessionContextForLlm, buildTranscriptEnvelope, effectiveWorkspacePathForSession, fallbackTitleFromMessages, fileStemToSessionKey, flattenMessageContent, generateSessionTitleFromMessages, getOrLoadSessionSearchIndex, invalidateSessionSearchIndexCache, isTranscriptContextEntry, isWebchatSessionKey, maybeAutoTitleSessionStore, mergeLlmMessagesPreservingContextRows, messagesToClientHistory, normalizeCompactionCheckpointId, normalizeWorkingDirectoryInput, parseStoredTranscriptJson, resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel, resolveReasoningLevel, resolveSessionShardRelativePath, resolveThinkingLevel, resolveVerboseLevel, sanitizeSessionPathSegment, sanitizeSessionTitle, shouldAutoTitleSessionKey, shouldSkipWebchatInboundByAbortCutoff, stripTrailingWebchatEarlySaveUserIfPresent, transcriptRowsFromJsonArray };
@@ -3,6 +3,9 @@ import { SessionStore } from './store.js';
3
3
  import type { SessionMetadata, SessionDetail, SessionListQuery, PaginatedResult, GlobalSessionStats, ExportFormat, SessionStatus } from './types.js';
4
4
  import type { Message } from './types.js';
5
5
  import type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';
6
+ import type { XopcSessionTranscriptV1 } from './transcript-format.js';
7
+ import type { XopcTranscriptContextEntry } from './session-context-for-llm.js';
8
+ import { type SessionPatchBody } from './patch-metadata.js';
6
9
  import type { WindowConfig } from '../agent/memory/window.js';
7
10
  import type { Config } from '../config/schema.js';
8
11
  export interface SessionManagerConfig {
@@ -24,7 +27,19 @@ export declare class SessionManager extends EventEmitter {
24
27
  * Subagent sessions have keys starting with 'subagent:'.
25
28
  */
26
29
  listSubagents(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>>;
27
- getSession(key: string): Promise<SessionDetail | null>;
30
+ getSession(key: string, options?: {
31
+ includeTranscriptSummary?: boolean;
32
+ includeTranscriptRows?: boolean;
33
+ }): Promise<SessionDetail | null>;
34
+ /**
35
+ * OpenClaw-style `sessions.patch`: partial metadata (name, tags, customData shallow merge).
36
+ */
37
+ patchSession(key: string, patch: SessionPatchBody): Promise<{
38
+ ok: true;
39
+ } | {
40
+ ok: false;
41
+ error: string;
42
+ }>;
28
43
  getSessionMetadata(key: string): Promise<SessionMetadata | null>;
29
44
  deleteSession(key: string): Promise<boolean>;
30
45
  deleteSessions(keys: string[]): Promise<{
@@ -77,8 +92,14 @@ export declare class SessionManager extends EventEmitter {
77
92
  }) => void): void;
78
93
  /** Load messages for a session key */
79
94
  loadMessages(key: string): Promise<import("@mariozechner/pi-agent-core/dist/types.js").AgentMessage[]>;
95
+ /** Wrapped transcript document (stable id, compaction history); null if missing or not a valid envelope. */
96
+ loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null>;
80
97
  /** Save messages for a session key */
81
98
  saveMessages(key: string, messages: any[]): Promise<void>;
99
+ /**
100
+ * Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).
101
+ */
102
+ appendTranscriptContextEntry(key: string, entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>): Promise<void>;
82
103
  /** Delete session data */
83
104
  delete(key: string): Promise<void>;
84
105
  /** Token/window stats for a message list */
@@ -105,6 +126,10 @@ export declare class SessionManager extends EventEmitter {
105
126
  totalTokensAfter: number;
106
127
  lastCompactionAt: any;
107
128
  }>;
129
+ /** List pre-compaction transcript snapshots (newest first). */
130
+ listCompactionCheckpoints(key: string): Promise<import("./types.js").CompactionCheckpointSummary[]>;
131
+ getCompactionCheckpointDetail(key: string, checkpointId: string): Promise<import("./types.js").CompactionCheckpointDetail>;
132
+ restoreCompactionCheckpoint(key: string, checkpointId: string): Promise<void>;
108
133
  /** Estimate token usage for messages */
109
134
  estimateTokenUsage(key: string, messages: any[]): Promise<number>;
110
135
  }
@@ -1,6 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { SessionStore } from "./store.js";
4
+ import { applySessionPatchToMetadata } from "./patch-metadata.js";
4
5
  import EventEmitter$1 from "events";
5
6
  //#region src/session/manager.ts
6
7
  init_logger();
@@ -44,11 +45,26 @@ var SessionManager = class extends EventEmitter$1 {
44
45
  hasMore: false
45
46
  };
46
47
  }
47
- async getSession(key) {
48
- const session = await this.store.get(key);
48
+ async getSession(key, options) {
49
+ const session = await this.store.get(key, options);
49
50
  if (session) this.emit("sessionAccessed", { key });
50
51
  return session;
51
52
  }
53
+ /**
54
+ * OpenClaw-style `sessions.patch`: partial metadata (name, tags, customData shallow merge).
55
+ */
56
+ async patchSession(key, patch) {
57
+ const meta = await this.store.getMetadata(key);
58
+ if (!meta) return {
59
+ ok: false,
60
+ error: "Session not found"
61
+ };
62
+ const updates = applySessionPatchToMetadata(meta, patch);
63
+ if (Object.keys(updates).length === 0) return { ok: true };
64
+ await this.store.updateMetadata(key, updates);
65
+ this.emit("sessionUpdated", { key });
66
+ return { ok: true };
67
+ }
52
68
  async getSessionMetadata(key) {
53
69
  return this.store.getMetadata(key);
54
70
  }
@@ -178,10 +194,21 @@ var SessionManager = class extends EventEmitter$1 {
178
194
  async loadMessages(key) {
179
195
  return this.store.loadMessages(key);
180
196
  }
197
+ /** Wrapped transcript document (stable id, compaction history); null if missing or not a valid envelope. */
198
+ async loadTranscriptDocument(key) {
199
+ return this.store.loadTranscriptDocument(key);
200
+ }
181
201
  /** Save messages for a session key */
182
202
  async saveMessages(key, messages) {
183
203
  return this.store.saveMessages(key, messages);
184
204
  }
205
+ /**
206
+ * Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).
207
+ */
208
+ async appendTranscriptContextEntry(key, entry) {
209
+ await this.store.appendTranscriptContextEntry(key, entry);
210
+ this.emit("sessionUpdated", { key });
211
+ }
185
212
  /** Delete session data */
186
213
  async delete(key) {
187
214
  await this.store.delete(key);
@@ -202,6 +229,16 @@ var SessionManager = class extends EventEmitter$1 {
202
229
  async getCompactionStats(key) {
203
230
  return this.store.getCompactionStats(key);
204
231
  }
232
+ /** List pre-compaction transcript snapshots (newest first). */
233
+ listCompactionCheckpoints(key) {
234
+ return this.store.listCompactionCheckpoints(key);
235
+ }
236
+ getCompactionCheckpointDetail(key, checkpointId) {
237
+ return this.store.getCompactionCheckpointDetail(key, checkpointId);
238
+ }
239
+ restoreCompactionCheckpoint(key, checkpointId) {
240
+ return this.store.restoreCompactionCheckpoint(key, checkpointId);
241
+ }
205
242
  /** Estimate token usage for messages */
206
243
  async estimateTokenUsage(key, messages) {
207
244
  return this.store.estimateTokens(messages);
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionManager');\n\nexport interface SessionManagerConfig {\n config: Config;\n agentId?: string;\n sessionsDir?: string;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionManager extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionManagerConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n agentId: config.agentId,\n sessionsDir: config.sessionsDir,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n /**\n * List all subagent sessions.\n * Subagent sessions have keys starting with 'subagent:'.\n */\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n // Filter for subagent sessions only\n const subagentQuery: SessionListQuery = {\n ...query,\n search: query.search ? `subagent:${query.search}` : 'subagent:',\n };\n \n const result = await this.store.list(subagentQuery);\n \n // Additional filtering to ensure only subagent sessions\n const subagentSessions = result.items.filter((s) => s.key.startsWith('subagent:'));\n \n return {\n ...result,\n items: subagentSessions,\n total: subagentSessions.length,\n hasMore: false, // Simplified for now\n };\n }\n\n async getSession(key: string): Promise<SessionDetail | null> {\n const session = await this.store.get(key);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n await this.store.updateMetadata(key, { name });\n this.emit('sessionUpdated', { key, name });\n }\n\n /** Partial metadata update (caller merges nested fields like `customData` when needed). */\n async updateSessionMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Save messages for a session key */\n async saveMessages(key: string, messages: any[]) {\n return this.store.saveMessages(key, messages);\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(\n key: string,\n messages: any[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions, force);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","names":["EventEmitter"],"sources":["../../../src/session/manager.ts"],"sourcesContent":["// Session manager - high-level session management service\n\nimport EventEmitter from 'events';\nimport { createLogger } from '../utils/logger.js';\nimport { SessionStore } from './store.js';\nimport type {\n SessionMetadata,\n SessionDetail,\n SessionListQuery,\n PaginatedResult,\n GlobalSessionStats,\n ExportFormat,\n SessionStatus,\n} from './types.js';\nimport type { Message } from './types.js';\nimport type { CompactionConfig, CompactionResult } from '../agent/memory/compaction.js';\nimport type { XopcSessionTranscriptV1 } from './transcript-format.js';\nimport type { XopcTranscriptContextEntry } from './session-context-for-llm.js';\nimport { applySessionPatchToMetadata, type SessionPatchBody } from './patch-metadata.js';\nimport type { WindowConfig } from '../agent/memory/window.js';\nimport type { Config } from '../config/schema.js';\n\nconst log = createLogger('SessionManager');\n\nexport interface SessionManagerConfig {\n config: Config;\n agentId?: string;\n sessionsDir?: string;\n windowConfig?: Partial<WindowConfig>;\n compactionConfig?: Partial<CompactionConfig>;\n}\n\nexport class SessionManager extends EventEmitter {\n private store: SessionStore;\n\n constructor(config: SessionManagerConfig) {\n super();\n this.store = new SessionStore(\n {\n config: config.config,\n agentId: config.agentId,\n sessionsDir: config.sessionsDir,\n },\n config.windowConfig,\n config.compactionConfig\n );\n }\n\n async initialize(): Promise<void> {\n await this.store.initialize();\n this.emit('ready');\n }\n\n /** Low-level store (e.g. cron resolving weixin delivery from session index). */\n getStore(): SessionStore {\n return this.store;\n }\n\n // ========== CRUD Operations ==========\n\n async listSessions(query?: SessionListQuery): Promise<PaginatedResult<SessionMetadata>> {\n return this.store.list(query);\n }\n\n /**\n * List all subagent sessions.\n * Subagent sessions have keys starting with 'subagent:'.\n */\n async listSubagents(query: SessionListQuery = {}): Promise<PaginatedResult<SessionMetadata>> {\n // Filter for subagent sessions only\n const subagentQuery: SessionListQuery = {\n ...query,\n search: query.search ? `subagent:${query.search}` : 'subagent:',\n };\n \n const result = await this.store.list(subagentQuery);\n \n // Additional filtering to ensure only subagent sessions\n const subagentSessions = result.items.filter((s) => s.key.startsWith('subagent:'));\n \n return {\n ...result,\n items: subagentSessions,\n total: subagentSessions.length,\n hasMore: false, // Simplified for now\n };\n }\n\n async getSession(\n key: string,\n options?: { includeTranscriptSummary?: boolean; includeTranscriptRows?: boolean },\n ): Promise<SessionDetail | null> {\n const session = await this.store.get(key, options);\n if (session) {\n this.emit('sessionAccessed', { key });\n }\n return session;\n }\n\n /**\n * OpenClaw-style `sessions.patch`: partial metadata (name, tags, customData shallow merge).\n */\n async patchSession(\n key: string,\n patch: SessionPatchBody,\n ): Promise<{ ok: true } | { ok: false; error: string }> {\n const meta = await this.store.getMetadata(key);\n if (!meta) {\n return { ok: false, error: 'Session not found' };\n }\n const updates = applySessionPatchToMetadata(meta, patch);\n if (Object.keys(updates).length === 0) {\n return { ok: true };\n }\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n return { ok: true };\n }\n\n async getSessionMetadata(key: string): Promise<SessionMetadata | null> {\n return this.store.getMetadata(key);\n }\n\n async deleteSession(key: string): Promise<boolean> {\n const result = await this.store.delete(key);\n if (result) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n async deleteSessions(keys: string[]): Promise<{ success: string[]; failed: string[] }> {\n const result = await this.store.deleteMany(keys);\n for (const key of result.success) {\n this.emit('sessionDeleted', { key });\n }\n return result;\n }\n\n // ========== Metadata Updates ==========\n\n async renameSession(key: string, name: string): Promise<void> {\n await this.store.updateMetadata(key, { name });\n this.emit('sessionUpdated', { key, name });\n }\n\n /** Partial metadata update (caller merges nested fields like `customData` when needed). */\n async updateSessionMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void> {\n await this.store.updateMetadata(key, updates);\n this.emit('sessionUpdated', { key });\n }\n\n async tagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n // Merge tags, remove duplicates\n const mergedTags = [...new Set([...existing.tags, ...tags])];\n await this.store.updateMetadata(key, { tags: mergedTags });\n this.emit('sessionUpdated', { key, tags: mergedTags });\n }\n\n async untagSession(key: string, tags: string[]): Promise<void> {\n const existing = await this.store.getMetadata(key);\n if (!existing) {\n throw new Error(`Session not found: ${key}`);\n }\n\n const filteredTags = existing.tags.filter((t) => !tags.includes(t));\n await this.store.updateMetadata(key, { tags: filteredTags });\n this.emit('sessionUpdated', { key, tags: filteredTags });\n }\n\n async setSessionTags(key: string, tags: string[]): Promise<void> {\n await this.store.updateMetadata(key, { tags: [...new Set(tags)] });\n this.emit('sessionUpdated', { key, tags });\n }\n\n // ========== Status Management ==========\n\n async archiveSession(key: string): Promise<void> {\n await this.store.archive(key);\n this.emit('sessionArchived', { key });\n }\n\n async unarchiveSession(key: string): Promise<void> {\n await this.store.unarchive(key);\n this.emit('sessionRestored', { key });\n }\n\n async pinSession(key: string): Promise<void> {\n await this.store.pin(key);\n this.emit('sessionPinned', { key });\n }\n\n async unpinSession(key: string): Promise<void> {\n await this.store.unpin(key);\n this.emit('sessionUnpinned', { key });\n }\n\n async setSessionStatus(key: string, status: SessionStatus): Promise<void> {\n await this.store.setStatus(key, status);\n this.emit('sessionStatusChanged', { key, status });\n }\n\n // ========== Search ==========\n\n async searchSessions(query: string): Promise<SessionMetadata[]> {\n const result = await this.store.list({ search: query, limit: 100 });\n return result.items;\n }\n\n async searchInSession(key: string, keyword: string): Promise<Message[]> {\n return this.store.searchInSession(key, keyword);\n }\n\n // ========== Export/Import ==========\n\n async exportSession(key: string, format: ExportFormat): Promise<string> {\n return this.store.exportSession(key, format);\n }\n\n // ========== Statistics ==========\n\n async getStats(): Promise<GlobalSessionStats> {\n return this.store.getStats();\n }\n\n // ========== Maintenance ==========\n\n async archiveOldSessions(olderThanDays: number): Promise<number> {\n const count = await this.store.archiveOld(olderThanDays);\n log.info({ count, olderThanDays }, 'Archived old sessions');\n return count;\n }\n\n // ========== Event Helpers ==========\n\n onSessionCreated(callback: (metadata: SessionMetadata) => void): void {\n this.on('sessionCreated', callback);\n }\n\n onSessionUpdated(callback: (data: { key: string; name?: string; tags?: string[] }) => void): void {\n this.on('sessionUpdated', callback);\n }\n\n onSessionDeleted(callback: (data: { key: string }) => void): void {\n this.on('sessionDeleted', callback);\n }\n\n onSessionArchived(callback: (data: { key: string }) => void): void {\n this.on('sessionArchived', callback);\n }\n\n onSessionRestored(callback: (data: { key: string }) => void): void {\n this.on('sessionRestored', callback);\n }\n\n onSessionPinned(callback: (data: { key: string }) => void): void {\n this.on('sessionPinned', callback);\n }\n\n onSessionUnpinned(callback: (data: { key: string }) => void): void {\n this.on('sessionUnpinned', callback);\n }\n\n onSessionStatusChanged(callback: (data: { key: string; status: SessionStatus }) => void): void {\n this.on('sessionStatusChanged', callback);\n }\n\n onSessionAccessed(callback: (data: { key: string }) => void): void {\n this.on('sessionAccessed', callback);\n }\n\n // ========== Store delegation (messages, compaction) ==========\n\n /** Load messages for a session key */\n async loadMessages(key: string) {\n return this.store.loadMessages(key);\n }\n\n /** Wrapped transcript document (stable id, compaction history); null if missing or not a valid envelope. */\n async loadTranscriptDocument(key: string): Promise<XopcSessionTranscriptV1 | null> {\n return this.store.loadTranscriptDocument(key);\n }\n\n /** Save messages for a session key */\n async saveMessages(key: string, messages: any[]) {\n return this.store.saveMessages(key, messages);\n }\n\n /**\n * Append `kind: 'context'` transcript row (persisted, excluded from {@link loadMessages} / LLM).\n */\n async appendTranscriptContextEntry(\n key: string,\n entry: Omit<XopcTranscriptContextEntry, 'kind'> & Partial<Pick<XopcTranscriptContextEntry, 'kind'>>,\n ): Promise<void> {\n await this.store.appendTranscriptContextEntry(key, entry);\n this.emit('sessionUpdated', { key });\n }\n\n /** Delete session data */\n async delete(key: string): Promise<void> {\n await this.store.delete(key);\n }\n\n /** Token/window stats for a message list */\n getWindowStats(messages: any[]) {\n return this.store.getWindowStats(messages);\n }\n\n /** Prepare compaction run */\n prepareCompaction(key: string, messages: any[], contextWindow: number) {\n return this.store.prepareCompaction(key, messages, contextWindow);\n }\n\n /** Compact session messages */\n compact(\n key: string,\n messages: any[],\n contextWindow: number,\n instructions?: string,\n force?: boolean,\n ): Promise<CompactionResult> {\n return this.store.compact(key, messages, contextWindow, instructions, force);\n }\n\n /** Compaction stats for a session */\n async getCompactionStats(key: string) {\n return this.store.getCompactionStats(key);\n }\n\n /** List pre-compaction transcript snapshots (newest first). */\n listCompactionCheckpoints(key: string) {\n return this.store.listCompactionCheckpoints(key);\n }\n\n getCompactionCheckpointDetail(key: string, checkpointId: string) {\n return this.store.getCompactionCheckpointDetail(key, checkpointId);\n }\n\n restoreCompactionCheckpoint(key: string, checkpointId: string) {\n return this.store.restoreCompactionCheckpoint(key, checkpointId);\n }\n\n /** Estimate token usage for messages */\n async estimateTokenUsage(key: string, messages: any[]): Promise<number> {\n return this.store.estimateTokens(messages);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * OpenClaw-style partial session row updates: merge tags and shallow-merge customData.
3
+ */
4
+ import type { SessionMetadata } from './types.js';
5
+ export type SessionPatchBody = {
6
+ name?: string;
7
+ tags?: string[];
8
+ /** When true, `tags` replaces the tag list; otherwise tags are union-merged. */
9
+ replaceTags?: boolean;
10
+ customData?: Record<string, unknown>;
11
+ };
12
+ export declare function applySessionPatchToMetadata(existing: SessionMetadata, patch: SessionPatchBody): Partial<SessionMetadata>;
@@ -0,0 +1,23 @@
1
+ //#region src/session/patch-metadata.ts
2
+ function applySessionPatchToMetadata(existing, patch) {
3
+ const out = {};
4
+ if (typeof patch.name === "string") {
5
+ const t = patch.name.trim();
6
+ if (t.length > 0) out.name = t;
7
+ else out.name = void 0;
8
+ }
9
+ if (patch.tags !== void 0 && Array.isArray(patch.tags)) {
10
+ const normalized = [...new Set(patch.tags.map((t) => String(t).trim()).filter(Boolean))];
11
+ if (patch.replaceTags) out.tags = normalized;
12
+ else out.tags = [...new Set([...existing.tags, ...normalized])];
13
+ }
14
+ if (patch.customData !== void 0 && typeof patch.customData === "object" && patch.customData !== null) out.customData = {
15
+ ...existing.customData ?? {},
16
+ ...patch.customData
17
+ };
18
+ return out;
19
+ }
20
+ //#endregion
21
+ export { applySessionPatchToMetadata };
22
+
23
+ //# sourceMappingURL=patch-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-metadata.js","names":[],"sources":["../../../src/session/patch-metadata.ts"],"sourcesContent":["/**\n * OpenClaw-style partial session row updates: merge tags and shallow-merge customData.\n */\n\nimport type { SessionMetadata } from './types.js';\n\nexport type SessionPatchBody = {\n name?: string;\n tags?: string[];\n /** When true, `tags` replaces the tag list; otherwise tags are union-merged. */\n replaceTags?: boolean;\n customData?: Record<string, unknown>;\n};\n\nexport function applySessionPatchToMetadata(\n existing: SessionMetadata,\n patch: SessionPatchBody,\n): Partial<SessionMetadata> {\n const out: Partial<SessionMetadata> = {};\n\n if (typeof patch.name === 'string') {\n const t = patch.name.trim();\n if (t.length > 0) {\n out.name = t;\n } else {\n out.name = undefined;\n }\n }\n\n if (patch.tags !== undefined && Array.isArray(patch.tags)) {\n const normalized = [...new Set(patch.tags.map((t) => String(t).trim()).filter(Boolean))];\n if (patch.replaceTags) {\n out.tags = normalized;\n } else {\n out.tags = [...new Set([...existing.tags, ...normalized])];\n }\n }\n\n if (patch.customData !== undefined && typeof patch.customData === 'object' && patch.customData !== null) {\n out.customData = { ...(existing.customData ?? {}), ...patch.customData };\n }\n\n return out;\n}\n"],"mappings":";AAcA,SAAgB,4BACd,UACA,OAC0B;CAC1B,MAAM,MAAgC,EAAE;AAExC,KAAI,OAAO,MAAM,SAAS,UAAU;EAClC,MAAM,IAAI,MAAM,KAAK,MAAM;AAC3B,MAAI,EAAE,SAAS,EACb,KAAI,OAAO;MAEX,KAAI,OAAO,KAAA;;AAIf,KAAI,MAAM,SAAS,KAAA,KAAa,MAAM,QAAQ,MAAM,KAAK,EAAE;EACzD,MAAM,aAAa,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC;AACxF,MAAI,MAAM,YACR,KAAI,OAAO;MAEX,KAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,SAAS,MAAM,GAAG,WAAW,CAAC,CAAC;;AAI9D,KAAI,MAAM,eAAe,KAAA,KAAa,OAAO,MAAM,eAAe,YAAY,MAAM,eAAe,KACjG,KAAI,aAAa;EAAE,GAAI,SAAS,cAAc,EAAE;EAAG,GAAG,MAAM;EAAY;AAG1E,QAAO"}
@@ -17,5 +17,7 @@ export declare class SessionSearchIndex {
17
17
  private extractSessionKeyFromPath;
18
18
  private findSessionJsonFiles;
19
19
  private buildWordIndex;
20
+ /** Index `kind: 'context'` `text` / `id` so session search matches audit rows (synthetic slot indices). */
21
+ private mergeContextTextIntoWordIndex;
20
22
  private mergeIntoGlobalIndex;
21
23
  }
@@ -1,5 +1,7 @@
1
1
  import { FILENAMES, init_paths } from "../config/paths.js";
2
2
  import { fileStemToSessionKey } from "./session-file-key.js";
3
+ import { isTranscriptContextEntry } from "./session-context-for-llm.js";
4
+ import { parseStoredTranscriptJson } from "./transcript-format.js";
3
5
  import { basename, join } from "node:path";
4
6
  import { readFile, readdir } from "node:fs/promises";
5
7
  //#region src/session/search-index.ts
@@ -19,10 +21,17 @@ var SessionSearchIndex = class {
19
21
  const files = await this.findSessionJsonFiles(sessionsRoot);
20
22
  for (const file of files) try {
21
23
  const raw = await readFile(file, "utf-8");
22
- const messages = JSON.parse(raw);
23
- if (!Array.isArray(messages)) continue;
24
+ if (!raw.trim()) continue;
25
+ try {
26
+ JSON.parse(raw);
27
+ } catch {
28
+ continue;
29
+ }
30
+ const { messages, rows, envelope } = parseStoredTranscriptJson(raw);
31
+ if (!envelope) continue;
24
32
  const key = this.extractSessionKeyFromPath(file);
25
33
  const wordIndex = this.buildWordIndex(messages);
34
+ this.mergeContextTextIntoWordIndex(wordIndex, rows, messages.length);
26
35
  const indexed = {
27
36
  key,
28
37
  messages,
@@ -84,6 +93,25 @@ var SessionSearchIndex = class {
84
93
  }
85
94
  return index;
86
95
  }
96
+ /** Index `kind: 'context'` `text` / `id` so session search matches audit rows (synthetic slot indices). */
97
+ mergeContextTextIntoWordIndex(wordIndex, rows, llmMessageCount) {
98
+ let slot = 0;
99
+ for (const r of rows) {
100
+ if (!isTranscriptContextEntry(r)) continue;
101
+ const parts = [];
102
+ if (typeof r.text === "string" && r.text.trim()) parts.push(r.text);
103
+ if (typeof r.id === "string" && r.id.trim()) parts.push(r.id);
104
+ const blob = parts.join(" ");
105
+ if (!blob.trim()) continue;
106
+ const words = tokenizeWords(blob);
107
+ const idx = llmMessageCount + slot;
108
+ slot += 1;
109
+ for (const word of words) {
110
+ if (!wordIndex.has(word)) wordIndex.set(word, /* @__PURE__ */ new Set());
111
+ wordIndex.get(word).add(idx);
112
+ }
113
+ }
114
+ }
87
115
  mergeIntoGlobalIndex(sessionKey, wordIndex) {
88
116
  for (const word of wordIndex.keys()) {
89
117
  if (!this.globalWordIndex.has(word)) this.globalWordIndex.set(word, /* @__PURE__ */ new Set());