cli-jaw 2.2.16 → 2.2.17

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 (411) hide show
  1. package/README.md +10 -1
  2. package/dist/bin/commands/_shared/dashboard-client.js +42 -0
  3. package/dist/bin/commands/_shared/dashboard-client.js.map +1 -0
  4. package/dist/bin/commands/_shared/search-format.js +40 -0
  5. package/dist/bin/commands/_shared/search-format.js.map +1 -0
  6. package/dist/bin/commands/chat-search.js +5 -3
  7. package/dist/bin/commands/chat-search.js.map +1 -1
  8. package/dist/bin/commands/dashboard-chat.js +14 -31
  9. package/dist/bin/commands/dashboard-chat.js.map +1 -1
  10. package/dist/bin/commands/dashboard-memory.js +12 -49
  11. package/dist/bin/commands/dashboard-memory.js.map +1 -1
  12. package/dist/bin/commands/doctor.js +33 -10
  13. package/dist/bin/commands/doctor.js.map +1 -1
  14. package/dist/bin/commands/init.js +13 -1
  15. package/dist/bin/commands/init.js.map +1 -1
  16. package/dist/bin/commands/memory.js +5 -1
  17. package/dist/bin/commands/memory.js.map +1 -1
  18. package/dist/bin/commands/slack.js +57 -3
  19. package/dist/bin/commands/slack.js.map +1 -1
  20. package/dist/bin/commands/tui/input-handler.js +1 -1
  21. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  22. package/dist/bin/commands/tui/slash-command-runner.js +4 -5
  23. package/dist/bin/commands/tui/slash-command-runner.js.map +1 -1
  24. package/dist/bin/postinstall.js +16 -18
  25. package/dist/bin/postinstall.js.map +1 -1
  26. package/dist/lib/media-kind.js +28 -0
  27. package/dist/lib/media-kind.js.map +1 -0
  28. package/dist/lib/upload.js +27 -10
  29. package/dist/lib/upload.js.map +1 -1
  30. package/dist/server.js +35 -51
  31. package/dist/server.js.map +1 -1
  32. package/dist/src/agent/args.js +34 -0
  33. package/dist/src/agent/args.js.map +1 -1
  34. package/dist/src/agent/codex-app-client.js +1016 -135
  35. package/dist/src/agent/codex-app-client.js.map +1 -1
  36. package/dist/src/agent/codex-app-events.js +72 -1
  37. package/dist/src/agent/codex-app-events.js.map +1 -1
  38. package/dist/src/agent/codex-host-pool.js +617 -0
  39. package/dist/src/agent/codex-host-pool.js.map +1 -0
  40. package/dist/src/agent/jwc-runtime.js +12 -4
  41. package/dist/src/agent/jwc-runtime.js.map +1 -1
  42. package/dist/src/agent/kiro-auth.js +10 -4
  43. package/dist/src/agent/kiro-auth.js.map +1 -1
  44. package/dist/src/agent/kiro-runtime.js +45 -8
  45. package/dist/src/agent/kiro-runtime.js.map +1 -1
  46. package/dist/src/agent/lifecycle-handler.js +75 -52
  47. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  48. package/dist/src/agent/memory-flush-controller.js +241 -33
  49. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  50. package/dist/src/agent/prompt-context.js +4 -0
  51. package/dist/src/agent/prompt-context.js.map +1 -1
  52. package/dist/src/agent/runtime-pool.js +64 -34
  53. package/dist/src/agent/runtime-pool.js.map +1 -1
  54. package/dist/src/agent/session-persistence.js +71 -15
  55. package/dist/src/agent/session-persistence.js.map +1 -1
  56. package/dist/src/agent/spawn/queue.js +319 -162
  57. package/dist/src/agent/spawn/queue.js.map +1 -1
  58. package/dist/src/agent/spawn.js +581 -268
  59. package/dist/src/agent/spawn.js.map +1 -1
  60. package/dist/src/bgtask/types.js +1 -1
  61. package/dist/src/bgtask/types.js.map +1 -1
  62. package/dist/src/browser/adaptive-fetch/safety.js +25 -0
  63. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
  64. package/dist/src/browser/connection.js +2 -8
  65. package/dist/src/browser/connection.js.map +1 -1
  66. package/dist/src/cli/capability-probe-worker.js +172 -0
  67. package/dist/src/cli/capability-probe-worker.js.map +1 -0
  68. package/dist/src/cli/capability-probe.js +83 -0
  69. package/dist/src/cli/capability-probe.js.map +1 -0
  70. package/dist/src/cli/claude-models.js +2 -2
  71. package/dist/src/cli/claude-models.js.map +1 -1
  72. package/dist/src/cli/cli-status-worker.js +296 -0
  73. package/dist/src/cli/cli-status-worker.js.map +1 -0
  74. package/dist/src/cli/cli-status.js +81 -0
  75. package/dist/src/cli/cli-status.js.map +1 -0
  76. package/dist/src/cli/command-context.js +17 -5
  77. package/dist/src/cli/command-context.js.map +1 -1
  78. package/dist/src/cli/compact.js +56 -19
  79. package/dist/src/cli/compact.js.map +1 -1
  80. package/dist/src/cli/handlers-runtime.js +6 -4
  81. package/dist/src/cli/handlers-runtime.js.map +1 -1
  82. package/dist/src/cli/handlers.js +7 -2
  83. package/dist/src/cli/handlers.js.map +1 -1
  84. package/dist/src/cli/opencodex-models.js +5 -32
  85. package/dist/src/cli/opencodex-models.js.map +1 -1
  86. package/dist/src/cli/opencodex-runtime.js +82 -0
  87. package/dist/src/cli/opencodex-runtime.js.map +1 -0
  88. package/dist/src/cli/readiness.js +35 -18
  89. package/dist/src/cli/readiness.js.map +1 -1
  90. package/dist/src/cli/registry-live.js +8 -2
  91. package/dist/src/cli/registry-live.js.map +1 -1
  92. package/dist/src/cli/registry.js +1 -1
  93. package/dist/src/cli/registry.js.map +1 -1
  94. package/dist/src/core/browser-open-default.js +6 -4
  95. package/dist/src/core/browser-open-default.js.map +1 -1
  96. package/dist/src/core/browser-open.js +11 -15
  97. package/dist/src/core/browser-open.js.map +1 -1
  98. package/dist/src/core/bus.js +7 -1
  99. package/dist/src/core/bus.js.map +1 -1
  100. package/dist/src/core/chat-sessions.js +121 -12
  101. package/dist/src/core/chat-sessions.js.map +1 -1
  102. package/dist/src/core/cli-detect.js +148 -4
  103. package/dist/src/core/cli-detect.js.map +1 -1
  104. package/dist/src/core/codex-config.js +21 -0
  105. package/dist/src/core/codex-config.js.map +1 -1
  106. package/dist/src/core/compact.js +73 -21
  107. package/dist/src/core/compact.js.map +1 -1
  108. package/dist/src/core/config.js +449 -20
  109. package/dist/src/core/config.js.map +1 -1
  110. package/dist/src/core/db.js +225 -0
  111. package/dist/src/core/db.js.map +1 -1
  112. package/dist/src/core/event-bus.js +49 -4
  113. package/dist/src/core/event-bus.js.map +1 -1
  114. package/dist/src/core/event-scope.js +100 -0
  115. package/dist/src/core/event-scope.js.map +1 -0
  116. package/dist/src/core/main-session.js +64 -21
  117. package/dist/src/core/main-session.js.map +1 -1
  118. package/dist/src/core/message-summary.js +12 -2
  119. package/dist/src/core/message-summary.js.map +1 -1
  120. package/dist/src/core/platform-kind.js +139 -0
  121. package/dist/src/core/platform-kind.js.map +1 -0
  122. package/dist/src/core/rate-limit.js +156 -0
  123. package/dist/src/core/rate-limit.js.map +1 -0
  124. package/dist/src/core/runtime-settings.js +165 -17
  125. package/dist/src/core/runtime-settings.js.map +1 -1
  126. package/dist/src/core/session-context.js +7 -0
  127. package/dist/src/core/session-context.js.map +1 -0
  128. package/dist/src/core/session-ops.js +53 -9
  129. package/dist/src/core/session-ops.js.map +1 -1
  130. package/dist/src/core/settings-merge.js +105 -3
  131. package/dist/src/core/settings-merge.js.map +1 -1
  132. package/dist/src/core/settings-watch.js +29 -5
  133. package/dist/src/core/settings-watch.js.map +1 -1
  134. package/dist/src/core/widget-watcher.js +15 -2
  135. package/dist/src/core/widget-watcher.js.map +1 -1
  136. package/dist/src/discord/bot.js +5 -2
  137. package/dist/src/discord/bot.js.map +1 -1
  138. package/dist/src/discord/commands.js +4 -4
  139. package/dist/src/discord/commands.js.map +1 -1
  140. package/dist/src/goal/heartbeat.js +1 -1
  141. package/dist/src/goal/heartbeat.js.map +1 -1
  142. package/dist/src/goal/runtime.js +1 -1
  143. package/dist/src/goal/runtime.js.map +1 -1
  144. package/dist/src/goal-run/controller.js +2 -2
  145. package/dist/src/goal-run/controller.js.map +1 -1
  146. package/dist/src/manager/internal-fetch.js +15 -0
  147. package/dist/src/manager/internal-fetch.js.map +1 -0
  148. package/dist/src/manager/logs.js +2 -1
  149. package/dist/src/manager/logs.js.map +1 -1
  150. package/dist/src/manager/memory/chat-federation.js +104 -11
  151. package/dist/src/manager/memory/chat-federation.js.map +1 -1
  152. package/dist/src/manager/memory/federation.js +100 -0
  153. package/dist/src/manager/memory/federation.js.map +1 -1
  154. package/dist/src/manager/metadata.js +4 -1
  155. package/dist/src/manager/metadata.js.map +1 -1
  156. package/dist/src/manager/notes/assets.js +1 -1
  157. package/dist/src/manager/notes/assets.js.map +1 -1
  158. package/dist/src/manager/notes/frontmatter.js +5 -49
  159. package/dist/src/manager/notes/frontmatter.js.map +1 -1
  160. package/dist/src/manager/notes/link-resolver.js +2 -2
  161. package/dist/src/manager/notes/link-resolver.js.map +1 -1
  162. package/dist/src/manager/notes/remote-assets.js +1 -1
  163. package/dist/src/manager/notes/remote-assets.js.map +1 -1
  164. package/dist/src/manager/notes/routes.js +2 -2
  165. package/dist/src/manager/notes/routes.js.map +1 -1
  166. package/dist/src/manager/notes/store.js +2 -2
  167. package/dist/src/manager/notes/store.js.map +1 -1
  168. package/dist/src/manager/notes/trash.js +1 -1
  169. package/dist/src/manager/notes/trash.js.map +1 -1
  170. package/dist/src/manager/notes/vault-index.js +2 -2
  171. package/dist/src/manager/notes/vault-index.js.map +1 -1
  172. package/dist/src/manager/notes/wiki-links.js +1 -1
  173. package/dist/src/manager/notes/wiki-links.js.map +1 -1
  174. package/dist/src/manager/notes/wiki-routes.js +84 -0
  175. package/dist/src/manager/notes/wiki-routes.js.map +1 -0
  176. package/dist/src/manager/proxy.js +1 -0
  177. package/dist/src/manager/proxy.js.map +1 -1
  178. package/dist/src/manager/routes/dashboard-memory.js +24 -1
  179. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  180. package/dist/src/manager/routes/runtime-monitor.js +1 -1
  181. package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
  182. package/dist/src/manager/scan.js +5 -3
  183. package/dist/src/manager/scan.js.map +1 -1
  184. package/dist/src/manager/server.js +20 -6
  185. package/dist/src/manager/server.js.map +1 -1
  186. package/dist/src/manager/telegram-hub/hub-bot.js +4 -3
  187. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
  188. package/dist/src/manager/worker-events.js +2 -1
  189. package/dist/src/manager/worker-events.js.map +1 -1
  190. package/dist/src/memory/heartbeat.js +6 -5
  191. package/dist/src/memory/heartbeat.js.map +1 -1
  192. package/dist/src/memory/indexing.js +162 -45
  193. package/dist/src/memory/indexing.js.map +1 -1
  194. package/dist/src/messaging/channel-validate.js +14 -1
  195. package/dist/src/messaging/channel-validate.js.map +1 -1
  196. package/dist/src/messaging/redact.js +2 -1
  197. package/dist/src/messaging/redact.js.map +1 -1
  198. package/dist/src/messaging/session-key.js +21 -2
  199. package/dist/src/messaging/session-key.js.map +1 -1
  200. package/dist/src/notes/constants.js.map +1 -0
  201. package/dist/src/notes/frontmatter.js +59 -0
  202. package/dist/src/notes/frontmatter.js.map +1 -0
  203. package/dist/src/notes/path-guards.js.map +1 -0
  204. package/dist/src/notes/search.js.map +1 -0
  205. package/dist/src/orchestrator/attestation.js +1 -1
  206. package/dist/src/orchestrator/attestation.js.map +1 -1
  207. package/dist/src/orchestrator/gateway.js +135 -31
  208. package/dist/src/orchestrator/gateway.js.map +1 -1
  209. package/dist/src/orchestrator/pipeline.js +53 -21
  210. package/dist/src/orchestrator/pipeline.js.map +1 -1
  211. package/dist/src/orchestrator/scope.js +36 -2
  212. package/dist/src/orchestrator/scope.js.map +1 -1
  213. package/dist/src/orchestrator/session-lanes.js +87 -0
  214. package/dist/src/orchestrator/session-lanes.js.map +1 -0
  215. package/dist/src/orchestrator/session-work.js +25 -0
  216. package/dist/src/orchestrator/session-work.js.map +1 -0
  217. package/dist/src/orchestrator/state-machine.js +1 -5
  218. package/dist/src/orchestrator/state-machine.js.map +1 -1
  219. package/dist/src/orchestrator/worker-registry.js +20 -10
  220. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  221. package/dist/src/prompt/builder.js +40 -2
  222. package/dist/src/prompt/builder.js.map +1 -1
  223. package/dist/src/prompt/templates/a1-system.md +8 -1
  224. package/dist/src/routes/agent-control.js +44 -8
  225. package/dist/src/routes/agent-control.js.map +1 -1
  226. package/dist/src/routes/chat-sessions.js +34 -6
  227. package/dist/src/routes/chat-sessions.js.map +1 -1
  228. package/dist/src/routes/command.js +63 -8
  229. package/dist/src/routes/command.js.map +1 -1
  230. package/dist/src/routes/events.js +11 -2
  231. package/dist/src/routes/events.js.map +1 -1
  232. package/dist/src/routes/link-preview.js +1 -27
  233. package/dist/src/routes/link-preview.js.map +1 -1
  234. package/dist/src/routes/messages.js +6 -5
  235. package/dist/src/routes/messages.js.map +1 -1
  236. package/dist/src/routes/messaging.js +45 -1
  237. package/dist/src/routes/messaging.js.map +1 -1
  238. package/dist/src/routes/orchestrate.js +53 -33
  239. package/dist/src/routes/orchestrate.js.map +1 -1
  240. package/dist/src/routes/search.js +84 -0
  241. package/dist/src/routes/search.js.map +1 -0
  242. package/dist/src/routes/session-request.js +29 -0
  243. package/dist/src/routes/session-request.js.map +1 -0
  244. package/dist/src/routes/settings.js +110 -3
  245. package/dist/src/routes/settings.js.map +1 -1
  246. package/dist/src/routes/static.js +30 -8
  247. package/dist/src/routes/static.js.map +1 -1
  248. package/dist/src/routes/system.js +1 -1
  249. package/dist/src/routes/system.js.map +1 -1
  250. package/dist/src/routes/wiki.js +122 -0
  251. package/dist/src/routes/wiki.js.map +1 -0
  252. package/dist/src/search/contract.js +2 -0
  253. package/dist/src/search/contract.js.map +1 -0
  254. package/dist/src/search/coordinator.js +153 -0
  255. package/dist/src/search/coordinator.js.map +1 -0
  256. package/dist/src/search/provider.js +40 -0
  257. package/dist/src/search/provider.js.map +1 -0
  258. package/dist/src/search/providers/chat.js +115 -0
  259. package/dist/src/search/providers/chat.js.map +1 -0
  260. package/dist/src/search/providers/memory.js +53 -0
  261. package/dist/src/search/providers/memory.js.map +1 -0
  262. package/dist/src/search/providers/wiki.js +80 -0
  263. package/dist/src/search/providers/wiki.js.map +1 -0
  264. package/dist/src/slack/api.js +10 -1
  265. package/dist/src/slack/api.js.map +1 -1
  266. package/dist/src/slack/attachment-recovery.js +42 -0
  267. package/dist/src/slack/attachment-recovery.js.map +1 -0
  268. package/dist/src/slack/bot.js +120 -41
  269. package/dist/src/slack/bot.js.map +1 -1
  270. package/dist/src/slack/commands.js +24 -8
  271. package/dist/src/slack/commands.js.map +1 -1
  272. package/dist/src/slack/events.js +12 -1
  273. package/dist/src/slack/events.js.map +1 -1
  274. package/dist/src/slack/history.js +108 -0
  275. package/dist/src/slack/history.js.map +1 -0
  276. package/dist/src/slack/inbound-file.js +242 -0
  277. package/dist/src/slack/inbound-file.js.map +1 -0
  278. package/dist/src/slack/inbound-url.js +39 -0
  279. package/dist/src/slack/inbound-url.js.map +1 -0
  280. package/dist/src/slack/ingress.js +140 -0
  281. package/dist/src/slack/ingress.js.map +1 -0
  282. package/dist/src/slack/manifest.js +3 -0
  283. package/dist/src/slack/manifest.js.map +1 -1
  284. package/dist/src/slack/socket.js +1 -1
  285. package/dist/src/slack/socket.js.map +1 -1
  286. package/dist/src/slack/thread-tracker.js +86 -0
  287. package/dist/src/slack/thread-tracker.js.map +1 -0
  288. package/dist/src/telegram/bot.js +21 -11
  289. package/dist/src/telegram/bot.js.map +1 -1
  290. package/dist/src/wiki/config.js +193 -0
  291. package/dist/src/wiki/config.js.map +1 -0
  292. package/dist/src/wiki/entities.js +61 -0
  293. package/dist/src/wiki/entities.js.map +1 -0
  294. package/dist/src/wiki/ontology.js +72 -0
  295. package/dist/src/wiki/ontology.js.map +1 -0
  296. package/dist/src/wiki/prompt.js +172 -0
  297. package/dist/src/wiki/prompt.js.map +1 -0
  298. package/dist/src/wiki/safe-traversal.js +198 -0
  299. package/dist/src/wiki/safe-traversal.js.map +1 -0
  300. package/dist/src/wiki/scaffold.js +77 -0
  301. package/dist/src/wiki/scaffold.js.map +1 -0
  302. package/package.json +1 -1
  303. package/public/css/session-hub.css +266 -0
  304. package/public/dist/assets/AdvancedExport-DYGcCAUq.js +1 -0
  305. package/public/dist/assets/Agent-CNNQ7KkJ.js +1 -0
  306. package/public/dist/assets/{DesignPanel-BGMPhZSx.js → DesignPanel-DcL369nB.js} +1 -1
  307. package/public/dist/assets/{DocPanel-Dz-J_l5M.js → DocPanel-K8A2pm_1.js} +1 -1
  308. package/public/dist/assets/{FolderPanel-DbPhzzvi.js → FolderPanel-CV52EzwG.js} +1 -1
  309. package/public/dist/assets/{MilkdownWysiwygEditor-Em7iC6y9.js → MilkdownWysiwygEditor-BKOCDI4Z.js} +1 -1
  310. package/public/dist/assets/api-B25zNNFJ.js +1 -0
  311. package/public/dist/assets/{app-DX4e6isX.css → app-DjgGeXhJ.css} +1 -1
  312. package/public/dist/assets/app-Dsgp4xpU.js +55 -0
  313. package/public/dist/assets/bgtask-badge-C6h5C-o4.js +1 -0
  314. package/public/dist/assets/{bgtask-badge-qMkKOZx0.js → bgtask-badge-CpavV0Jc.js} +4 -4
  315. package/public/dist/assets/{employees-BnobWM_2.js → employees-BJyEgim7.js} +4 -4
  316. package/public/dist/assets/idb-cache-B5PX63p7.js +1 -0
  317. package/public/dist/assets/{idb-cache-BzzftUET.js → idb-cache-lOntwU3S.js} +1 -1
  318. package/public/dist/assets/{iframe-renderer-C5vRbbl9.js → iframe-renderer-B8k3AvTv.js} +12 -12
  319. package/public/dist/assets/iframe-renderer-BO_GgCTR.js +1 -0
  320. package/public/dist/assets/manager-LkGs6qEJ.css +1 -0
  321. package/public/dist/assets/manager-kXYQyMhR.js +13 -0
  322. package/public/dist/assets/{memory-DF4kPwwC.js → memory-D2RbBVO-.js} +11 -11
  323. package/public/dist/assets/memory-amsvg4Ey.js +1 -0
  324. package/public/dist/assets/message-history-BGHZxvgV.js +1 -0
  325. package/public/dist/assets/message-history-Bw2E_b8L.js +1 -0
  326. package/public/dist/assets/pi-settings-5HVg1sXJ.js +1 -0
  327. package/public/dist/assets/render-BkGcpH7z.js +157 -0
  328. package/public/dist/assets/settings-B1FPORO2.js +56 -0
  329. package/public/dist/assets/settings-CMN-zN4Q.js +1 -0
  330. package/public/dist/assets/settings-core-B_OjGYVN.js +1 -0
  331. package/public/dist/assets/settings-core-CxRwqx86.js +144 -0
  332. package/public/dist/assets/sidebar-DW78DANx.js +49 -0
  333. package/public/dist/assets/skills-Dz-9Yrxr.js +1 -0
  334. package/public/dist/assets/{skills-IGquen_j.js → skills-lWi0ZFiV.js} +6 -6
  335. package/public/dist/assets/{slash-commands-ZRDOL99E.js → slash-commands-DYOI6nKj.js} +1 -1
  336. package/public/dist/assets/slash-commands-xJFCdTTM.js +1 -0
  337. package/public/dist/assets/{trace-drawer-D8To8fYt.js → trace-drawer-DBX9xzmt.js} +1 -1
  338. package/public/dist/assets/{ui-Hx_mNoDf.js → ui-Bx7eqnXt.js} +1 -1
  339. package/public/dist/assets/ui-JOcrYeG-.js +1 -0
  340. package/public/dist/assets/{wiki-link-suggestions-DZQc78gj.js → wiki-link-suggestions-Dp6kBQVu.js} +1 -1
  341. package/public/dist/index.html +4 -4
  342. package/public/dist/manager/index.html +2 -2
  343. package/public/index.html +3 -2
  344. package/public/js/event-channel.ts +25 -0
  345. package/public/js/features/channel-onboarding-flow.ts +16 -1
  346. package/public/js/features/channel-onboarding.ts +20 -2
  347. package/public/js/features/chat-messages.ts +3 -1
  348. package/public/js/features/chat-search.ts +2 -1
  349. package/public/js/features/chat.ts +56 -18
  350. package/public/js/features/elicitation.ts +15 -0
  351. package/public/js/features/idb-cache.ts +34 -0
  352. package/public/js/features/message-history.ts +2 -1
  353. package/public/js/features/session-hub.ts +334 -0
  354. package/public/js/features/settings-cli-status-render.ts +1 -1
  355. package/public/js/features/settings-cli-status.ts +25 -11
  356. package/public/js/features/settings-core.ts +72 -3
  357. package/public/js/features/settings-types.ts +32 -0
  358. package/public/js/features/ui-status.ts +2 -1
  359. package/public/js/main.ts +20 -0
  360. package/public/js/render/compose-block.ts +7 -0
  361. package/public/js/ws.ts +22 -2
  362. package/public/locales/en.json +46 -4
  363. package/public/locales/ja.json +46 -4
  364. package/public/locales/ko.json +46 -4
  365. package/public/locales/zh.json +46 -4
  366. package/public/manager/src/App.tsx +1 -1
  367. package/public/manager/src/InstancePreview.tsx +5 -1
  368. package/public/manager/src/api.ts +2 -1
  369. package/public/manager/src/components/InstanceGroups.tsx +10 -0
  370. package/public/manager/src/components/InstanceListContent.tsx +24 -1
  371. package/public/manager/src/components/InstanceRow.tsx +33 -3
  372. package/public/manager/src/components/InstanceSessionList.tsx +132 -0
  373. package/public/manager/src/hooks/useActiveSessionDisclosure.ts +45 -0
  374. package/public/manager/src/lib/resilient-fetch.ts +93 -0
  375. package/public/manager/src/lib/session-store.ts +216 -0
  376. package/public/manager/src/manager-components.css +97 -0
  377. package/public/manager/src/settings/pages/AdvancedExport.tsx +12 -2
  378. package/public/manager/src/settings/pages/Agent.tsx +113 -1
  379. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +1 -1
  380. package/scripts/burst-scenario.mjs +72 -0
  381. package/scripts/check-redaction-sinks.mjs +1 -0
  382. package/scripts/check-strict-baseline.mjs +1 -1
  383. package/dist/src/manager/notes/constants.js.map +0 -1
  384. package/dist/src/manager/notes/path-guards.js.map +0 -1
  385. package/dist/src/manager/notes/search.js.map +0 -1
  386. package/public/dist/assets/AdvancedExport-DsDpqXoH.js +0 -1
  387. package/public/dist/assets/Agent-BjbZVZ9p.js +0 -1
  388. package/public/dist/assets/api-C9dOxby7.js +0 -1
  389. package/public/dist/assets/app-BzD_ZLvt.js +0 -55
  390. package/public/dist/assets/bgtask-badge-Dqbp-Y4e.js +0 -1
  391. package/public/dist/assets/idb-cache-ZH6lOebk.js +0 -1
  392. package/public/dist/assets/iframe-renderer-Df4KIVyx.js +0 -1
  393. package/public/dist/assets/manager-C4eNDNFt.css +0 -1
  394. package/public/dist/assets/manager-DaN201mN.js +0 -13
  395. package/public/dist/assets/memory-D-bULTHl.js +0 -1
  396. package/public/dist/assets/message-history-C4WOisGx.js +0 -1
  397. package/public/dist/assets/message-history-ZBoza6ew.js +0 -1
  398. package/public/dist/assets/pi-settings-CBUGDAuT.js +0 -1
  399. package/public/dist/assets/render-DYX6GRQ0.js +0 -122
  400. package/public/dist/assets/settings-DbJpGoaX.js +0 -55
  401. package/public/dist/assets/settings-SreihUje.js +0 -1
  402. package/public/dist/assets/settings-core-B1Y5Nb4Z.js +0 -1
  403. package/public/dist/assets/settings-core-DobZWIZ7.js +0 -140
  404. package/public/dist/assets/sidebar-Cp22g0Gv.js +0 -49
  405. package/public/dist/assets/skills-DwPIP08e.js +0 -1
  406. package/public/dist/assets/slash-commands-BBVfwcnW.js +0 -1
  407. package/public/dist/assets/ui-CAicpUZc.js +0 -1
  408. /package/dist/src/{manager/notes → notes}/constants.js +0 -0
  409. /package/dist/src/{manager/notes → notes}/path-guards.js +0 -0
  410. /package/dist/src/{manager/notes → notes}/search.js +0 -0
  411. /package/public/dist/assets/{pi-settings-Dh5lgb87.js → pi-settings-DEuKgvIj.js} +0 -0
@@ -0,0 +1,153 @@
1
+ import { createHash } from 'node:crypto';
2
+ const CORPORA = ['chat', 'memory', 'wiki'];
3
+ const MAX_CURSOR_CHARS = 4096;
4
+ const MAX_CURSOR_PROVIDERS = 32;
5
+ const MAX_PROVIDER_ID_CHARS = 128;
6
+ const MAX_CURSOR_OFFSET = 1_000_000;
7
+ const invalidCursor = () => Object.assign(new Error('invalid_cursor'), { statusCode: 400, code: 'invalid_cursor' });
8
+ // This SHA-256 binds a cursor to its query. It is not an HMAC or a tamper-resistance boundary.
9
+ const hashOf = (query) => createHash('sha256').update(JSON.stringify(query)).digest('hex');
10
+ function decodeCursor(raw) {
11
+ if (!raw)
12
+ return { v: 1, hash: '', providers: {} };
13
+ try {
14
+ if (!/^[A-Za-z0-9_-]+$/.test(raw))
15
+ throw invalidCursor();
16
+ // Bound the work before decoding: the cursor is client-supplied, and an
17
+ // oversized payload otherwise buys unbounded decode/parse/traversal.
18
+ if (raw.length > MAX_CURSOR_CHARS)
19
+ throw invalidCursor();
20
+ const decoded = Buffer.from(raw, 'base64url');
21
+ if (decoded.toString('base64url') !== raw)
22
+ throw invalidCursor();
23
+ const value = JSON.parse(decoded.toString('utf8'));
24
+ if (!value || typeof value !== 'object' || Array.isArray(value))
25
+ throw invalidCursor();
26
+ const row = value;
27
+ if (row['v'] !== 1 || typeof row['hash'] !== 'string' ||
28
+ !row['providers'] || typeof row['providers'] !== 'object' || Array.isArray(row['providers'])) {
29
+ throw invalidCursor();
30
+ }
31
+ const providers = row['providers'];
32
+ const providerIds = Object.keys(providers);
33
+ if (providerIds.length > MAX_CURSOR_PROVIDERS)
34
+ throw invalidCursor();
35
+ for (const id of providerIds) {
36
+ if (id.length > MAX_PROVIDER_ID_CHARS)
37
+ throw invalidCursor();
38
+ const state = providers[id];
39
+ if (!state || typeof state !== 'object' || Array.isArray(state))
40
+ throw invalidCursor();
41
+ const item = state;
42
+ // Number.isInteger(1e100) is true, so an absurd offset would sail
43
+ // through and reach the provider as a SQL OFFSET.
44
+ if (!Number.isSafeInteger(item['offset']) || Number(item['offset']) < 0 ||
45
+ Number(item['offset']) > MAX_CURSOR_OFFSET ||
46
+ typeof item['exhausted'] !== 'boolean')
47
+ throw invalidCursor();
48
+ for (const key of Object.keys(item)) {
49
+ if (key !== 'offset' && key !== 'exhausted')
50
+ throw invalidCursor();
51
+ }
52
+ }
53
+ return row;
54
+ }
55
+ catch (error) {
56
+ if (error.code === 'invalid_cursor')
57
+ throw error;
58
+ throw invalidCursor();
59
+ }
60
+ }
61
+ const encodeCursor = (cursor) => Buffer.from(JSON.stringify(cursor)).toString('base64url');
62
+ const returnedCount = (page) => page.groups.reduce((sum, group) => sum + group.hits.length, 0);
63
+ /**
64
+ * Provider errors can carry SQL, filesystem paths, upstream bodies, or
65
+ * credentials. Log the detail server-side; return a stable message.
66
+ */
67
+ const failureWarning = (provider, reason) => {
68
+ console.error('[search:provider]', provider.id, reason instanceof Error ? reason.message : String(reason));
69
+ return { code: 'provider_failed', provider: provider.id, message: 'search provider failed' };
70
+ };
71
+ export class SearchCoordinator {
72
+ registry;
73
+ constructor(registry) {
74
+ this.registry = registry;
75
+ }
76
+ async search(input) {
77
+ const query = {
78
+ ...input,
79
+ query: input.query.trim(),
80
+ limit: Math.min(input.limit ?? 20, 100),
81
+ };
82
+ if (!query.query)
83
+ throw Object.assign(new Error('q is required'), { statusCode: 400 });
84
+ const { cursor: _cursor, ...base } = query;
85
+ const hash = hashOf(base);
86
+ const cursor = decodeCursor(input.cursor);
87
+ if (input.cursor && cursor.hash !== hash)
88
+ throw invalidCursor();
89
+ const requested = input.corpus === 'all' ? CORPORA : [input.corpus];
90
+ const registered = input.corpus === 'all'
91
+ ? this.registry.list() : this.registry.list(input.corpus);
92
+ const missingWarnings = requested
93
+ .filter(corpus => !registered.some(provider => provider.corpus === corpus))
94
+ .map(corpus => ({
95
+ code: 'provider_failed', provider: corpus,
96
+ message: `${corpus} search provider is not registered`,
97
+ }));
98
+ const states = { ...cursor.providers };
99
+ // Every non-ready provider must be terminalized BEFORE hasMore is computed.
100
+ // hasMore asks "is any registered provider unexhausted?", so a provider that
101
+ // never appears in cursor state reads as unexhausted forever and offers a
102
+ // next page that can never contain anything.
103
+ const offProviders = registered.filter(provider => provider.status() === 'off');
104
+ const erroredProviders = registered.filter(provider => provider.status() === 'error');
105
+ for (const provider of [...offProviders, ...erroredProviders]) {
106
+ states[provider.id] = { offset: 0, exhausted: true };
107
+ }
108
+ const ready = registered.filter(provider => provider.status() === 'ready' && !cursor.providers[provider.id]?.exhausted);
109
+ const perProvider = Math.max(1, Math.ceil((query.limit ?? 20) / Math.max(1, ready.length)));
110
+ const settled = await Promise.allSettled(ready.map(provider => provider.search(query, {
111
+ limit: perProvider,
112
+ offset: cursor.providers[provider.id]?.offset ?? 0,
113
+ ...(query.instances !== undefined ? { instanceIds: query.instances } : {}),
114
+ })));
115
+ const pages = settled.flatMap((result, index) => result.status === 'fulfilled'
116
+ ? [{ provider: ready[index], page: result.value }] : []);
117
+ const rejected = settled.flatMap((result, index) => result.status === 'rejected'
118
+ ? [{ provider: ready[index], reason: result.reason }] : []);
119
+ settled.forEach((result, index) => {
120
+ const provider = ready[index];
121
+ const previous = states[provider.id] ?? { offset: 0, exhausted: false };
122
+ states[provider.id] = result.status === 'rejected'
123
+ ? { ...previous, exhausted: true }
124
+ : { offset: previous.offset + returnedCount(result.value), exhausted: !result.value.page.hasMore };
125
+ });
126
+ const hasMore = registered.some(provider => !states[provider.id]?.exhausted);
127
+ return {
128
+ query: base,
129
+ groups: pages.flatMap(({ page }) => page.groups),
130
+ warnings: [
131
+ ...missingWarnings,
132
+ ...rejected.map(({ provider, reason }) => failureWarning(provider, reason)),
133
+ ...offProviders.map(provider => ({
134
+ code: 'provider_off', provider: provider.id,
135
+ message: `${provider.corpus} search provider is disabled`,
136
+ })),
137
+ ...erroredProviders.map(provider => ({
138
+ code: 'provider_failed', provider: provider.id,
139
+ message: 'search provider failed',
140
+ })),
141
+ ...pages.flatMap(({ page }) => page.warnings),
142
+ ],
143
+ page: { hasMore, nextCursor: hasMore ? encodeCursor({ v: 1, hash, providers: states }) : null },
144
+ providers: [
145
+ ...pages.flatMap(({ page }) => page.providers),
146
+ ...rejected.map(({ provider }) => ({ id: provider.id, corpus: provider.corpus, status: 'error' })),
147
+ ...offProviders.map(provider => ({ id: provider.id, corpus: provider.corpus, status: 'off' })),
148
+ ...erroredProviders.map(provider => ({ id: provider.id, corpus: provider.corpus, status: 'error' })),
149
+ ],
150
+ };
151
+ }
152
+ }
153
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/search/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export function providerEnvelope(provider, query, hits, warnings = [], hasMore = false) {
2
+ const { cursor: _cursor, ...base } = query;
3
+ return {
4
+ query: base,
5
+ groups: [{ corpus: provider.corpus, ranking: hits[0]?.ranking.mode ?? 'like', hits }],
6
+ warnings,
7
+ page: { nextCursor: null, hasMore },
8
+ providers: [{ id: provider.id, corpus: provider.corpus, status: provider.status() }],
9
+ };
10
+ }
11
+ export function createOffProvider(id, corpus) {
12
+ const provider = {
13
+ id,
14
+ corpus,
15
+ status: () => 'off',
16
+ async search(query) {
17
+ return providerEnvelope(provider, query, [], [{
18
+ code: 'provider_off', provider: id, message: `${corpus} search provider is disabled`,
19
+ }]);
20
+ },
21
+ };
22
+ return provider;
23
+ }
24
+ export class SearchProviderRegistry {
25
+ providers = new Map();
26
+ register(provider) {
27
+ if (this.providers.has(provider.id)) {
28
+ throw new Error(`duplicate search provider: ${provider.id}`);
29
+ }
30
+ this.providers.set(provider.id, provider);
31
+ return () => {
32
+ if (this.providers.get(provider.id) === provider)
33
+ this.providers.delete(provider.id);
34
+ };
35
+ }
36
+ list(corpus) {
37
+ return [...this.providers.values()].filter(provider => !corpus || provider.corpus === corpus);
38
+ }
39
+ }
40
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/search/provider.ts"],"names":[],"mappings":"AAkBA,MAAM,UAAU,gBAAgB,CAC5B,QAAwB,EACxB,KAAkB,EAClB,IAAiB,EACjB,WAA4B,EAAE,EAC9B,OAAO,GAAG,KAAK;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC3C,OAAO;QACH,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;QACrF,QAAQ;QACR,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;QACnC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;KACvF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,MAAsB;IAChE,MAAM,QAAQ,GAAmB;QAC7B,EAAE;QACF,MAAM;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK;QACnB,KAAK,CAAC,MAAM,CAAC,KAAK;YACd,OAAO,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBAC1C,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,8BAA8B;iBACvF,CAAC,CAAC,CAAC;QACR,CAAC;KACJ,CAAC;IACF,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,OAAO,sBAAsB;IACd,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE/D,QAAQ,CAAC,QAAwB;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACR,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAuB;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAClG,CAAC;CACJ"}
@@ -0,0 +1,115 @@
1
+ import { searchChatCandidates, } from '../../core/db.js';
2
+ import { providerEnvelope } from '../provider.js';
3
+ const CJK_PATTERN = /[\p{Script=Han}\p{Script=Hangul}\p{Script=Hiragana}\p{Script=Katakana}]/u;
4
+ const WHITESPACE_PATTERN = /\s/u;
5
+ function escapeLike(value) {
6
+ return value.replaceAll('\\', '\\\\').replaceAll('%', '\\%').replaceAll('_', '\\_');
7
+ }
8
+ function ftsPhrase(value) {
9
+ return `"${value.replaceAll('"', '""')}"`;
10
+ }
11
+ function toHits(rows, ranking, offset) {
12
+ return rows.map((row, index) => ({
13
+ corpus: 'chat',
14
+ provider: 'local-chat',
15
+ key: String(row.id),
16
+ session: row.session_id,
17
+ timestamp: row.created_at,
18
+ snippet: row.content,
19
+ ranking: {
20
+ mode: ranking,
21
+ sourceRank: offset + index + 1,
22
+ ...(typeof row.source_score === 'number' ? { sourceScore: row.source_score } : {}),
23
+ },
24
+ metadata: {
25
+ role: row.role,
26
+ cli: row.cli,
27
+ match_field: row.match_field,
28
+ tool_log: row.tool_log,
29
+ },
30
+ }));
31
+ }
32
+ export class ChatSearchProvider {
33
+ engine;
34
+ enabled;
35
+ id = 'local-chat';
36
+ corpus = 'chat';
37
+ constructor(engine = 'like', enabled = true) {
38
+ this.engine = engine;
39
+ this.enabled = enabled;
40
+ }
41
+ status() {
42
+ return this.enabled ? 'ready' : 'off';
43
+ }
44
+ async search(query, opts) {
45
+ if (!this.enabled) {
46
+ return providerEnvelope(this, query, [], [{
47
+ code: 'provider_off', provider: this.id, message: 'chat search provider is disabled',
48
+ }]);
49
+ }
50
+ const text = query.query.trim();
51
+ const params = {
52
+ match: ftsPhrase(text),
53
+ like: escapeLike(text),
54
+ session_id: query.sessionFilter ?? null,
55
+ days: query.days ?? null,
56
+ recent: query.recent ?? null,
57
+ limit: opts.limit + 1,
58
+ offset: opts.offset,
59
+ };
60
+ let candidateEngine = 'like';
61
+ let ranking = 'like';
62
+ let warnings = [];
63
+ let rows;
64
+ if (this.engine === 'like' || Array.from(text).length < 3) {
65
+ rows = searchChatCandidates('like', params);
66
+ }
67
+ else if (CJK_PATTERN.test(text)) {
68
+ if (WHITESPACE_PATTERN.test(text)) {
69
+ rows = searchChatCandidates('like', params);
70
+ }
71
+ else {
72
+ candidateEngine = 'trigram';
73
+ ranking = 'trigram';
74
+ try {
75
+ rows = searchChatCandidates(candidateEngine, params);
76
+ if (rows.length === 0) {
77
+ candidateEngine = 'like';
78
+ ranking = 'like';
79
+ rows = searchChatCandidates(candidateEngine, params);
80
+ }
81
+ }
82
+ catch (error) {
83
+ candidateEngine = 'like';
84
+ ranking = 'like';
85
+ rows = searchChatCandidates(candidateEngine, params);
86
+ warnings = [{
87
+ code: 'engine_fallback',
88
+ provider: this.id,
89
+ message: `chat FTS unavailable; LIKE fallback used: ${error instanceof Error ? error.message : String(error)}`,
90
+ }];
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ candidateEngine = 'unicode61';
96
+ ranking = 'bm25';
97
+ try {
98
+ rows = searchChatCandidates(candidateEngine, params);
99
+ }
100
+ catch (error) {
101
+ candidateEngine = 'like';
102
+ ranking = 'like';
103
+ rows = searchChatCandidates(candidateEngine, params);
104
+ warnings = [{
105
+ code: 'engine_fallback',
106
+ provider: this.id,
107
+ message: `chat FTS unavailable; LIKE fallback used: ${error instanceof Error ? error.message : String(error)}`,
108
+ }];
109
+ }
110
+ }
111
+ const selected = rows.slice(0, opts.limit);
112
+ return providerEnvelope(this, query, toHits(selected, ranking, opts.offset), warnings, rows.length > selected.length);
113
+ }
114
+ }
115
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/search/providers/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,GAGvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAmD,MAAM,gBAAgB,CAAC;AAEnG,MAAM,WAAW,GAAG,0EAA0E,CAAC;AAC/F,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,SAAS,UAAU,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC5B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,IAA8B,EAAE,OAAoB,EAAE,MAAc;IAChF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,YAAY;QACtB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,GAAG,CAAC,UAAU;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE;YACL,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC;YAC9B,GAAG,CAAC,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrF;QACD,QAAQ,EAAE;YACN,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACzB;KACJ,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,OAAO,kBAAkB;IAKN;IACA;IALZ,EAAE,GAAG,YAAY,CAAC;IAClB,MAAM,GAAG,MAAe,CAAC;IAElC,YACqB,SAA0B,MAAM,EAChC,UAAU,IAAI;QADd,WAAM,GAAN,MAAM,CAA0B;QAChC,YAAO,GAAP,OAAO,CAAO;IAChC,CAAC;IAEJ,MAAM;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,IAA2B;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBACtC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,kCAAkC;iBACvF,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG;YACX,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;YACtB,UAAU,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;YACvC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;QACF,IAAI,eAAe,GAA8B,MAAM,CAAC;QACxD,IAAI,OAAO,GAAgB,MAAM,CAAC;QAClC,IAAI,QAAQ,GAAoB,EAAE,CAAC;QACnC,IAAI,IAA8B,CAAC;QAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACJ,eAAe,GAAG,SAAS,CAAC;gBAC5B,OAAO,GAAG,SAAS,CAAC;gBACpB,IAAI,CAAC;oBACD,IAAI,GAAG,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACrD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACpB,eAAe,GAAG,MAAM,CAAC;wBACzB,OAAO,GAAG,MAAM,CAAC;wBACjB,IAAI,GAAG,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACzD,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,eAAe,GAAG,MAAM,CAAC;oBACzB,OAAO,GAAG,MAAM,CAAC;oBACjB,IAAI,GAAG,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACrD,QAAQ,GAAG,CAAC;4BACR,IAAI,EAAE,iBAAiB;4BACvB,QAAQ,EAAE,IAAI,CAAC,EAAE;4BACjB,OAAO,EAAE,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;yBACjH,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,eAAe,GAAG,WAAW,CAAC;YAC9B,OAAO,GAAG,MAAM,CAAC;YACjB,IAAI,CAAC;gBACD,IAAI,GAAG,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,eAAe,GAAG,MAAM,CAAC;gBACzB,OAAO,GAAG,MAAM,CAAC;gBACjB,IAAI,GAAG,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;gBACrD,QAAQ,GAAG,CAAC;wBACR,IAAI,EAAE,iBAAiB;wBACvB,QAAQ,EAAE,IAAI,CAAC,EAAE;wBACjB,OAAO,EAAE,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjH,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EACjF,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;CACJ"}
@@ -0,0 +1,53 @@
1
+ import { searchIndexForProvider } from '../../memory/indexing.js';
2
+ import { providerEnvelope } from '../provider.js';
3
+ export class MemorySearchProvider {
4
+ enabled;
5
+ id = 'local-memory';
6
+ corpus = 'memory';
7
+ constructor(enabled = true) {
8
+ this.enabled = enabled;
9
+ }
10
+ status() {
11
+ return this.enabled ? 'ready' : 'off';
12
+ }
13
+ async search(query, opts) {
14
+ if (!this.enabled) {
15
+ return providerEnvelope(this, query, [], [{
16
+ code: 'provider_off', provider: this.id, message: 'memory search provider is disabled',
17
+ }]);
18
+ }
19
+ const result = searchIndexForProvider(query.query, opts);
20
+ const warnings = [
21
+ ...result.degraded.map(name => ({
22
+ code: 'engine_fallback',
23
+ provider: this.id,
24
+ message: `memory index degraded: ${name}`,
25
+ })),
26
+ ...(query.sessionFilter !== undefined ? [{
27
+ code: 'session_filter_ignored',
28
+ provider: this.id,
29
+ message: 'memory is shared; sessionFilter does not restrict memory results',
30
+ }] : []),
31
+ ];
32
+ const hits = result.hits.map((hit, index) => ({
33
+ corpus: 'memory',
34
+ provider: this.id,
35
+ key: `${hit.relpath}:${hit.source_start_line}`,
36
+ ...(hit.sessionId ? { session: hit.sessionId } : {}),
37
+ location: {
38
+ path: hit.relpath || hit.path,
39
+ startLine: hit.source_start_line,
40
+ endLine: hit.source_end_line,
41
+ },
42
+ snippet: hit.snippet,
43
+ ranking: {
44
+ mode: 'rrf',
45
+ sourceRank: opts.offset + index + 1,
46
+ sourceScore: hit.score,
47
+ },
48
+ metadata: { kind: hit.kind, relpath: hit.relpath },
49
+ }));
50
+ return providerEnvelope(this, query, hits, warnings, result.hasMore);
51
+ }
52
+ }
53
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../src/search/providers/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAmD,MAAM,gBAAgB,CAAC;AAEnG,MAAM,OAAO,oBAAoB;IAIA;IAHpB,EAAE,GAAG,cAAc,CAAC;IACpB,MAAM,GAAG,QAAiB,CAAC;IAEpC,YAA6B,UAAU,IAAI;QAAd,YAAO,GAAP,OAAO,CAAO;IAAG,CAAC;IAE/C,MAAM;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAkB,EAAE,IAA2B;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBACtC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,oCAAoC;iBACzF,CAAC,CAAC,CAAC;QACR,CAAC;QAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAoB;YAC9B,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,iBAA0B;gBAChC,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,OAAO,EAAE,0BAA0B,IAAI,EAAE;aAC5C,CAAC,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;oBACrC,IAAI,EAAE,wBAAiC;oBACvC,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,OAAO,EAAE,kEAAkE;iBAC9E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACX,CAAC;QACF,MAAM,IAAI,GAAgB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,iBAAiB,EAAE;YAC9C,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,QAAQ,EAAE;gBACN,IAAI,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI;gBAC7B,SAAS,EAAE,GAAG,CAAC,iBAAiB;gBAChC,OAAO,EAAE,GAAG,CAAC,eAAe;aAC/B;YACD,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE;gBACL,IAAI,EAAE,KAAK;gBACX,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC;gBACnC,WAAW,EAAE,GAAG,CAAC,KAAK;aACzB;YACD,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;SACrD,CAAC,CAAC,CAAC;QACJ,OAAO,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;CACJ"}
@@ -0,0 +1,80 @@
1
+ // ─── Wiki search provider (devlog 040 §9) ─────────────
2
+ // Reads the opt-in vault through the shared note search. Only search is reused: the
3
+ // link graph and vault index stay with the manager, because this provider needs neither.
4
+ import { searchNotes } from '../../notes/search.js';
5
+ import { providerEnvelope } from '../provider.js';
6
+ import { forbiddenWikiRoots, readUsableWikiConfig, wikiProviderStatus } from '../../wiki/config.js';
7
+ // The shared note search refuses a request for more than this many results, so a page
8
+ // deep enough to ask for more would throw rather than return an empty tail. Wiki search
9
+ // therefore stops at that boundary and says so, instead of pretending a next page exists
10
+ // that it can never fetch (040 §0c R3).
11
+ export const WIKI_SEARCH_RESULT_CAP = 100;
12
+ export class WikiSearchProvider {
13
+ readConfig;
14
+ id = 'local-wiki';
15
+ corpus = 'wiki';
16
+ // The config is read per call rather than captured, because enabling the vault must
17
+ // take effect without restarting the process that registered this provider.
18
+ // Reads the validated view rather than the raw one: the generic settings API can
19
+ // write this block without going through the enable route, so a root that route
20
+ // would have refused must not become readable by that back door.
21
+ constructor(readConfig = () => readUsableWikiConfig(forbiddenWikiRoots())) {
22
+ this.readConfig = readConfig;
23
+ }
24
+ config() {
25
+ try {
26
+ return this.readConfig();
27
+ }
28
+ catch {
29
+ // An unusable root is a configuration error, not a crash: status() reports it.
30
+ return { enabled: false, root: '', promptDigest: false };
31
+ }
32
+ }
33
+ status() {
34
+ return wikiProviderStatus(this.config());
35
+ }
36
+ async search(query, opts) {
37
+ const config = this.config();
38
+ const status = wikiProviderStatus(config);
39
+ if (status !== 'ready') {
40
+ // A disabled vault performs no filesystem read at all, which is what makes
41
+ // "off by default" mean something on disk and not just in the UI.
42
+ return providerEnvelope(this, query, [], [{
43
+ code: status === 'off' ? 'provider_off' : 'provider_failed',
44
+ provider: this.id,
45
+ message: status === 'off'
46
+ ? 'wiki search provider is disabled'
47
+ : 'wiki vault is unavailable',
48
+ }]);
49
+ }
50
+ const warnings = query.sessionFilter === undefined ? [] : [{
51
+ code: 'session_filter_ignored',
52
+ provider: this.id,
53
+ message: 'the wiki is shared; sessionFilter does not restrict wiki results',
54
+ }];
55
+ // Ask for one more than this page needs so hasMore is observed rather than
56
+ // guessed, but never ask the shared search for more than it accepts.
57
+ const want = Math.min(opts.offset + opts.limit + 1, WIKI_SEARCH_RESULT_CAP);
58
+ const rows = await searchNotes(config.root, query.query, { limit: want });
59
+ const page = rows.slice(opts.offset, opts.offset + opts.limit);
60
+ const hasMore = rows.length > opts.offset + opts.limit;
61
+ if (!hasMore && rows.length >= WIKI_SEARCH_RESULT_CAP) {
62
+ warnings.push({
63
+ code: 'engine_fallback',
64
+ provider: this.id,
65
+ message: `wiki search stops at ${WIKI_SEARCH_RESULT_CAP} results`,
66
+ });
67
+ }
68
+ const hits = page.map((row, index) => ({
69
+ corpus: 'wiki',
70
+ provider: this.id,
71
+ key: `${row.path}:${row.line}`,
72
+ location: { path: row.path, startLine: row.line, endLine: row.line },
73
+ snippet: row.context || row.content,
74
+ ranking: { mode: 'like', sourceRank: opts.offset + index },
75
+ metadata: { kind: row.kind },
76
+ }));
77
+ return providerEnvelope(this, query, hits, warnings, hasMore);
78
+ }
79
+ }
80
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../../../src/search/providers/wiki.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // ─── Slack Web API Client ────────────────────────────
2
2
  // Thin fetch wrapper. No SDK: Slack's HTTP surface is small and cli-jaw's
3
3
  // Discord transport already establishes the house pattern (REST via fetch,
4
- // lazily imported). See devlog/_plan/260802_slack_channel/000_plan.md D-1.
4
+ // lazily imported). See devlog/_fin/260802_slack_channel/000_plan.md D-1.
5
5
  //
6
6
  // The critical Slack-specific rule: Slack returns HTTP 200 with
7
7
  // {"ok": false, "error": "..."} for application errors. Checking response.ok
@@ -103,6 +103,15 @@ export async function slackApi(token, method, body, options = {}) {
103
103
  const url = `${SLACK_API_BASE}/${method}`;
104
104
  const headers = { Authorization: `Bearer ${token}` };
105
105
  const init = { method: 'POST', headers };
106
+ if (options.signal && options.timeoutMs !== undefined) {
107
+ init.signal = AbortSignal.any([options.signal, AbortSignal.timeout(options.timeoutMs)]);
108
+ }
109
+ else if (options.signal) {
110
+ init.signal = options.signal;
111
+ }
112
+ else if (options.timeoutMs !== undefined) {
113
+ init.signal = AbortSignal.timeout(options.timeoutMs);
114
+ }
106
115
  if (options.form && body) {
107
116
  const params = new URLSearchParams();
108
117
  for (const [k, v] of Object.entries(body)) {
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/slack/api.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,EAAE;AACF,gEAAgE;AAChE,6EAA6E;AAC7E,mEAAmE;AAEnE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAS/C,qEAAqE;AACrE,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACnC,aAAa;IACb,qBAAqB;IACrB,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;CAChB,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC3D,OAAO,CAAC,CAAC,KAAK,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,gEAAgE;AAChE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IACzC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAI,IAAgC,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7E,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACnD,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAyB,EAAE,IAAc;IACxE,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY;YACb,OAAO,mEAAmE,CAAC;QAC/E,KAAK,kBAAkB;YACnB,OAAO,2DAA2D,CAAC;QACvE,KAAK,eAAe,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,MAAM;gBACT,CAAC,CAAC,6BAA6B,MAAM,0EAA0E;gBAC/G,CAAC,CAAC,wGAAwG,CAAC;QACnH,CAAC;QACD,KAAK,mBAAmB;YACpB,OAAO,gEAAgE,CAAC;QAC5E,KAAK,gBAAgB;YACjB,OAAO,mEAAmE,CAAC;QAC/E,KAAK,aAAa;YACd,OAAO,gCAAgC,CAAC;QAC5C,KAAK,cAAc;YACf,OAAO,wDAAwD,CAAC;QACpE,KAAK,aAAa;YACd,OAAO,sCAAsC,CAAC;QAClD;YACI,OAAO,KAAK,CAAC,CAAC,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAC/E,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAItD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAe;IACvD,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACtF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,KAAa,EACb,MAAc,EACd,IAA8B,EAC9B,UAAgG,EAAE;IAElG,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,cAAc,IAAI,MAAM,EAAE,CAAC;IAC1C,MAAM,OAAO,GAA2B,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC;IAC7E,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACjC,CAAC;SAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,GAAG,kDAAkD,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,GAA4B,EAAE,CAAC;QACzC,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClF,CAAC;QACD,6DAA6D;QAC7D,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YACpF,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAAG,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAW,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,MAAW,EAAE,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO;YACH,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,iBAAiB,CAAE,KAAe,CAAC,OAAO,CAAC;YAClD,MAAM,EAAE,GAAG;SACd,CAAC;IACN,CAAC;AACL,CAAC"}
@@ -0,0 +1,42 @@
1
+ // ─── Slack Attachment Recovery ───────────────────────
2
+ // app_mention 봉투에는 files 가 없다 — 문서화된 스키마에 부재하며, Slack은
3
+ // 첨부가 필요하면 channel+ts 로 대화를 다시 조회하라고 안내한다.
4
+ // https://docs.slack.dev/reference/events/app_mention/
5
+ //
6
+ // 같은 업로드의 message 사본은 events.ts 의 mention_via_app_mention 가
7
+ // 드롭한다(한 멘션이 두 에이전트 실행이 되는 것을 막는 의도적 동작). 그래서
8
+ // 멘션과 함께 올린 첨부는 어느 봉투로도 도달하지 못한다. 드롭을 되돌리는 대신
9
+ // 첨부만 되찾는다. 설계 근거: devlog/_plan/260806_slack_multifile_ingest/020.
10
+ import { fetchSlackHistory, fetchSlackReplies } from './history.js';
11
+ /** 스레드 조회 상한. 한 스레드에서 대상 ts 를 찾기에 충분하다. */
12
+ const THREAD_LOOKUP_LIMIT = 50;
13
+ /**
14
+ * (channel, ts) 메시지의 첨부를 되찾는다. 스레드 안이면 replies, 아니면
15
+ * history 를 쓴다.
16
+ *
17
+ * 실패는 예외가 아니라 빈 배열이다: 첨부 복구는 보조 경로이고, 여기서 던지면
18
+ * 텍스트만 있는 평범한 멘션까지 처리가 중단된다.
19
+ */
20
+ export async function recoverSlackAttachments(token, channel, ts, options = {}) {
21
+ if (!token || !channel || !ts)
22
+ return [];
23
+ const fetchOpts = options.fetchImpl ? { fetchImpl: options.fetchImpl } : {};
24
+ try {
25
+ const result = options.threadTs
26
+ ? await fetchSlackReplies(token, channel, options.threadTs, {
27
+ limit: THREAD_LOOKUP_LIMIT, ...fetchOpts,
28
+ })
29
+ // oldest 는 배타적이므로 inclusive 없이는 대상 메시지가 빠진다.
30
+ : await fetchSlackHistory(token, channel, {
31
+ oldest: ts, inclusive: true, limit: 1, ...fetchOpts,
32
+ });
33
+ if (!result.ok)
34
+ return [];
35
+ const match = result.messages.find(message => message.ts === ts);
36
+ return match?.files ?? [];
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ }
42
+ //# sourceMappingURL=attachment-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-recovery.js","sourceRoot":"","sources":["../../../src/slack/attachment-recovery.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,uDAAuD;AACvD,2CAA2C;AAC3C,uDAAuD;AACvD,EAAE;AACF,4DAA4D;AAC5D,8CAA8C;AAC9C,8CAA8C;AAC9C,mEAAmE;AAEnE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AASpE,2CAA2C;AAC3C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CACzC,KAAa,EACb,OAAe,EACf,EAAU,EACV,UAAoC,EAAE;IAEtC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ;YAC3B,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;gBACxD,KAAK,EAAE,mBAAmB,EAAE,GAAG,SAAS;aAC3C,CAAC;YACF,6CAA6C;YAC7C,CAAC,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE;gBACtC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS;aACtD,CAAC,CAAC;QACP,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC"}