@runcore-sh/runcore 0.4.0 → 0.5.0

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 (351) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/activity/log.js +2 -2
  3. package/dist/activity/log.js.map +1 -1
  4. package/dist/agents/governed-spawn.d.ts.map +1 -1
  5. package/dist/cli.js +101 -11
  6. package/dist/cli.js.map +1 -1
  7. package/dist/extensions/cache.d.ts +57 -0
  8. package/dist/extensions/cache.d.ts.map +1 -0
  9. package/dist/extensions/cache.js +173 -0
  10. package/dist/extensions/cache.js.map +1 -0
  11. package/dist/extensions/client.d.ts +55 -0
  12. package/dist/extensions/client.d.ts.map +1 -0
  13. package/dist/extensions/client.js +120 -0
  14. package/dist/extensions/client.js.map +1 -0
  15. package/dist/extensions/index.d.ts +13 -0
  16. package/dist/extensions/index.d.ts.map +1 -0
  17. package/dist/extensions/index.js +12 -0
  18. package/dist/extensions/index.js.map +1 -0
  19. package/dist/extensions/loader.d.ts +50 -0
  20. package/dist/extensions/loader.d.ts.map +1 -0
  21. package/dist/extensions/loader.js +166 -0
  22. package/dist/extensions/loader.js.map +1 -0
  23. package/dist/extensions/manifest.d.ts +38 -0
  24. package/dist/extensions/manifest.d.ts.map +1 -0
  25. package/dist/extensions/manifest.js +17 -0
  26. package/dist/extensions/manifest.js.map +1 -0
  27. package/dist/extensions/stubs.d.ts +27 -0
  28. package/dist/extensions/stubs.d.ts.map +1 -0
  29. package/dist/extensions/stubs.js +45 -0
  30. package/dist/extensions/stubs.js.map +1 -0
  31. package/dist/lib/audit.js +2 -2
  32. package/dist/lib/audit.js.map +1 -1
  33. package/dist/lib/brain-migrate.d.ts +21 -0
  34. package/dist/lib/brain-migrate.d.ts.map +1 -0
  35. package/dist/lib/brain-migrate.js +137 -0
  36. package/dist/lib/brain-migrate.js.map +1 -0
  37. package/dist/lib/paths.d.ts +27 -0
  38. package/dist/lib/paths.d.ts.map +1 -1
  39. package/dist/lib/paths.js +65 -0
  40. package/dist/lib/paths.js.map +1 -1
  41. package/dist/llm/call-log.d.ts +40 -0
  42. package/dist/llm/call-log.d.ts.map +1 -0
  43. package/dist/llm/call-log.js +35 -0
  44. package/dist/llm/call-log.js.map +1 -0
  45. package/dist/llm/complete.d.ts +6 -0
  46. package/dist/llm/complete.d.ts.map +1 -1
  47. package/dist/llm/complete.js +27 -0
  48. package/dist/llm/complete.js.map +1 -1
  49. package/dist/mcp-server.js +118 -2
  50. package/dist/mcp-server.js.map +1 -1
  51. package/dist/memory/file-backed.d.ts +4 -0
  52. package/dist/memory/file-backed.d.ts.map +1 -1
  53. package/dist/memory/file-backed.js +4 -0
  54. package/dist/memory/file-backed.js.map +1 -1
  55. package/dist/memory/vector-index.d.ts +4 -12
  56. package/dist/memory/vector-index.d.ts.map +1 -1
  57. package/dist/memory/vector-index.js +11 -93
  58. package/dist/memory/vector-index.js.map +1 -1
  59. package/dist/search/brain-docs.d.ts +17 -7
  60. package/dist/search/brain-docs.d.ts.map +1 -1
  61. package/dist/search/brain-docs.js +170 -52
  62. package/dist/search/brain-docs.js.map +1 -1
  63. package/dist/search/brain-rag.d.ts +45 -0
  64. package/dist/search/brain-rag.d.ts.map +1 -0
  65. package/dist/search/brain-rag.js +275 -0
  66. package/dist/search/brain-rag.js.map +1 -0
  67. package/dist/search/chunker.d.ts +24 -0
  68. package/dist/search/chunker.d.ts.map +1 -0
  69. package/dist/search/chunker.js +95 -0
  70. package/dist/search/chunker.js.map +1 -0
  71. package/dist/search/embedder.d.ts +16 -0
  72. package/dist/search/embedder.d.ts.map +1 -0
  73. package/dist/search/embedder.js +108 -0
  74. package/dist/search/embedder.js.map +1 -0
  75. package/dist/search/file-watcher.d.ts +11 -0
  76. package/dist/search/file-watcher.d.ts.map +1 -0
  77. package/dist/search/file-watcher.js +86 -0
  78. package/dist/search/file-watcher.js.map +1 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +168 -20
  81. package/dist/server.js.map +1 -1
  82. package/dist/sessions/store.d.ts +9 -0
  83. package/dist/sessions/store.d.ts.map +1 -1
  84. package/dist/sessions/store.js.map +1 -1
  85. package/dist/settings.d.ts +26 -0
  86. package/dist/settings.d.ts.map +1 -1
  87. package/dist/settings.js +78 -2
  88. package/dist/settings.js.map +1 -1
  89. package/dist/tracing/init.d.ts +1 -1
  90. package/dist/tracing/init.d.ts.map +1 -1
  91. package/dist/utils/logger.js +2 -2
  92. package/dist/utils/logger.js.map +1 -1
  93. package/module-tiers.json +164 -0
  94. package/package.json +9 -13
  95. package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
  96. package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
  97. package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
  98. package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
  99. package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
  100. package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
  101. package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
  102. package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
  103. package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
  104. package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
  105. package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
  106. package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
  107. package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
  108. package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
  109. package/public/index.html +379 -59
  110. package/dist/agents/autonomous.js +0 -749
  111. package/dist/agents/autonomous.js.map +0 -1
  112. package/dist/agents/commit.js +0 -113
  113. package/dist/agents/commit.js.map +0 -1
  114. package/dist/agents/continue.js +0 -158
  115. package/dist/agents/continue.js.map +0 -1
  116. package/dist/agents/cooldown.js +0 -397
  117. package/dist/agents/cooldown.js.map +0 -1
  118. package/dist/agents/dedup-guard.js +0 -131
  119. package/dist/agents/dedup-guard.js.map +0 -1
  120. package/dist/agents/feed.js +0 -176
  121. package/dist/agents/feed.js.map +0 -1
  122. package/dist/agents/governance.js +0 -292
  123. package/dist/agents/governance.js.map +0 -1
  124. package/dist/agents/governed-spawn.js +0 -192
  125. package/dist/agents/governed-spawn.js.map +0 -1
  126. package/dist/agents/heartbeat.js +0 -324
  127. package/dist/agents/heartbeat.js.map +0 -1
  128. package/dist/agents/instance-manager.js +0 -850
  129. package/dist/agents/instance-manager.js.map +0 -1
  130. package/dist/agents/issue-reporter.js +0 -123
  131. package/dist/agents/issue-reporter.js.map +0 -1
  132. package/dist/agents/issues.js +0 -141
  133. package/dist/agents/issues.js.map +0 -1
  134. package/dist/agents/locks.js +0 -234
  135. package/dist/agents/locks.js.map +0 -1
  136. package/dist/agents/memory.js +0 -93
  137. package/dist/agents/memory.js.map +0 -1
  138. package/dist/agents/monitor.js +0 -235
  139. package/dist/agents/monitor.js.map +0 -1
  140. package/dist/agents/orchestration.js +0 -715
  141. package/dist/agents/orchestration.js.map +0 -1
  142. package/dist/agents/recover.js +0 -166
  143. package/dist/agents/recover.js.map +0 -1
  144. package/dist/agents/reflection.js +0 -199
  145. package/dist/agents/reflection.js.map +0 -1
  146. package/dist/agents/runtime/bus.js +0 -174
  147. package/dist/agents/runtime/bus.js.map +0 -1
  148. package/dist/agents/runtime/config.js +0 -101
  149. package/dist/agents/runtime/config.js.map +0 -1
  150. package/dist/agents/runtime/driver.js +0 -214
  151. package/dist/agents/runtime/driver.js.map +0 -1
  152. package/dist/agents/runtime/errors.js +0 -40
  153. package/dist/agents/runtime/errors.js.map +0 -1
  154. package/dist/agents/runtime/index.js +0 -54
  155. package/dist/agents/runtime/index.js.map +0 -1
  156. package/dist/agents/runtime/lifecycle.js +0 -116
  157. package/dist/agents/runtime/lifecycle.js.map +0 -1
  158. package/dist/agents/runtime/manager.js +0 -948
  159. package/dist/agents/runtime/manager.js.map +0 -1
  160. package/dist/agents/runtime/registry.js +0 -195
  161. package/dist/agents/runtime/registry.js.map +0 -1
  162. package/dist/agents/runtime/resources.js +0 -146
  163. package/dist/agents/runtime/resources.js.map +0 -1
  164. package/dist/agents/runtime/types.js +0 -24
  165. package/dist/agents/runtime/types.js.map +0 -1
  166. package/dist/agents/spawn-policy.js +0 -202
  167. package/dist/agents/spawn-policy.js.map +0 -1
  168. package/dist/agents/spawn.js +0 -970
  169. package/dist/agents/spawn.js.map +0 -1
  170. package/dist/agents/triage.js +0 -81
  171. package/dist/agents/triage.js.map +0 -1
  172. package/dist/agents/workflow.js +0 -543
  173. package/dist/agents/workflow.js.map +0 -1
  174. package/dist/avatar/client.js +0 -172
  175. package/dist/avatar/client.js.map +0 -1
  176. package/dist/avatar/sidecar.js +0 -125
  177. package/dist/avatar/sidecar.js.map +0 -1
  178. package/dist/browser/sessions.js +0 -122
  179. package/dist/browser/sessions.js.map +0 -1
  180. package/dist/capabilities/definitions/browser.js +0 -242
  181. package/dist/capabilities/definitions/browser.js.map +0 -1
  182. package/dist/channels/whatsapp.js +0 -200
  183. package/dist/channels/whatsapp.js.map +0 -1
  184. package/dist/credentials/store.js +0 -189
  185. package/dist/credentials/store.js.map +0 -1
  186. package/dist/files/deep-index.js +0 -337
  187. package/dist/files/deep-index.js.map +0 -1
  188. package/dist/files/extract.js +0 -33
  189. package/dist/files/extract.js.map +0 -1
  190. package/dist/files/gdrive.js +0 -246
  191. package/dist/files/gdrive.js.map +0 -1
  192. package/dist/github/client.js +0 -408
  193. package/dist/github/client.js.map +0 -1
  194. package/dist/github/commit-analysis.js +0 -276
  195. package/dist/github/commit-analysis.js.map +0 -1
  196. package/dist/github/contributor-stats.js +0 -119
  197. package/dist/github/contributor-stats.js.map +0 -1
  198. package/dist/github/issue-sla.js +0 -220
  199. package/dist/github/issue-sla.js.map +0 -1
  200. package/dist/github/issue-triage.js +0 -286
  201. package/dist/github/issue-triage.js.map +0 -1
  202. package/dist/github/pr-readiness.js +0 -197
  203. package/dist/github/pr-readiness.js.map +0 -1
  204. package/dist/github/pr-review.js +0 -410
  205. package/dist/github/pr-review.js.map +0 -1
  206. package/dist/github/release-notes.js +0 -227
  207. package/dist/github/release-notes.js.map +0 -1
  208. package/dist/github/repo-health.js +0 -303
  209. package/dist/github/repo-health.js.map +0 -1
  210. package/dist/github/retry.js +0 -117
  211. package/dist/github/retry.js.map +0 -1
  212. package/dist/github/types.js +0 -8
  213. package/dist/github/types.js.map +0 -1
  214. package/dist/github/webhooks.js +0 -153
  215. package/dist/github/webhooks.js.map +0 -1
  216. package/dist/google/auth.js +0 -325
  217. package/dist/google/auth.js.map +0 -1
  218. package/dist/google/calendar-timer.js +0 -91
  219. package/dist/google/calendar-timer.js.map +0 -1
  220. package/dist/google/calendar.js +0 -270
  221. package/dist/google/calendar.js.map +0 -1
  222. package/dist/google/docs.js +0 -309
  223. package/dist/google/docs.js.map +0 -1
  224. package/dist/google/gmail-send.js +0 -219
  225. package/dist/google/gmail-send.js.map +0 -1
  226. package/dist/google/gmail-timer.js +0 -223
  227. package/dist/google/gmail-timer.js.map +0 -1
  228. package/dist/google/gmail.js +0 -470
  229. package/dist/google/gmail.js.map +0 -1
  230. package/dist/google/plugin.js +0 -169
  231. package/dist/google/plugin.js.map +0 -1
  232. package/dist/google/tasks-timer.js +0 -107
  233. package/dist/google/tasks-timer.js.map +0 -1
  234. package/dist/google/tasks.js +0 -331
  235. package/dist/google/tasks.js.map +0 -1
  236. package/dist/google/temporal.js +0 -176
  237. package/dist/google/temporal.js.map +0 -1
  238. package/dist/integrations/gate.js +0 -100
  239. package/dist/integrations/gate.js.map +0 -1
  240. package/dist/integrations/github.js +0 -331
  241. package/dist/integrations/github.js.map +0 -1
  242. package/dist/integrations/google-tasks.js +0 -432
  243. package/dist/integrations/google-tasks.js.map +0 -1
  244. package/dist/mdns.js +0 -110
  245. package/dist/mdns.js.map +0 -1
  246. package/dist/notifications/channel.js +0 -83
  247. package/dist/notifications/channel.js.map +0 -1
  248. package/dist/notifications/channels/adapter.js +0 -55
  249. package/dist/notifications/channels/adapter.js.map +0 -1
  250. package/dist/notifications/channels/index.js +0 -6
  251. package/dist/notifications/channels/index.js.map +0 -1
  252. package/dist/notifications/channels/log.js +0 -29
  253. package/dist/notifications/channels/log.js.map +0 -1
  254. package/dist/notifications/email.js +0 -72
  255. package/dist/notifications/email.js.map +0 -1
  256. package/dist/notifications/engine.js +0 -198
  257. package/dist/notifications/engine.js.map +0 -1
  258. package/dist/notifications/index.js +0 -24
  259. package/dist/notifications/index.js.map +0 -1
  260. package/dist/notifications/phone.js +0 -48
  261. package/dist/notifications/phone.js.map +0 -1
  262. package/dist/notifications/sms.js +0 -65
  263. package/dist/notifications/sms.js.map +0 -1
  264. package/dist/notifications/types.js +0 -14
  265. package/dist/notifications/types.js.map +0 -1
  266. package/dist/notifications/webhook.js +0 -65
  267. package/dist/notifications/webhook.js.map +0 -1
  268. package/dist/resend/inbox.js +0 -199
  269. package/dist/resend/inbox.js.map +0 -1
  270. package/dist/resend/webhooks.js +0 -244
  271. package/dist/resend/webhooks.js.map +0 -1
  272. package/dist/search/browse.js +0 -225
  273. package/dist/search/browse.js.map +0 -1
  274. package/dist/search/perplexity.js +0 -41
  275. package/dist/search/perplexity.js.map +0 -1
  276. package/dist/slack/channels.js +0 -277
  277. package/dist/slack/channels.js.map +0 -1
  278. package/dist/slack/client.js +0 -468
  279. package/dist/slack/client.js.map +0 -1
  280. package/dist/slack/retry.js +0 -100
  281. package/dist/slack/retry.js.map +0 -1
  282. package/dist/slack/types.js +0 -52
  283. package/dist/slack/types.js.map +0 -1
  284. package/dist/slack/webhooks.js +0 -285
  285. package/dist/slack/webhooks.js.map +0 -1
  286. package/dist/stt/client.js +0 -66
  287. package/dist/stt/client.js.map +0 -1
  288. package/dist/stt/sidecar.js +0 -115
  289. package/dist/stt/sidecar.js.map +0 -1
  290. package/dist/tracing/bridge.js +0 -70
  291. package/dist/tracing/bridge.js.map +0 -1
  292. package/dist/tracing/correlation.js +0 -49
  293. package/dist/tracing/correlation.js.map +0 -1
  294. package/dist/tracing/index.js +0 -18
  295. package/dist/tracing/index.js.map +0 -1
  296. package/dist/tracing/init.js +0 -81
  297. package/dist/tracing/init.js.map +0 -1
  298. package/dist/tracing/instrument.js +0 -145
  299. package/dist/tracing/instrument.js.map +0 -1
  300. package/dist/tracing/middleware.js +0 -69
  301. package/dist/tracing/middleware.js.map +0 -1
  302. package/dist/tracing/tracer.js +0 -327
  303. package/dist/tracing/tracer.js.map +0 -1
  304. package/dist/tts/client.js +0 -48
  305. package/dist/tts/client.js.map +0 -1
  306. package/dist/tts/sidecar.js +0 -148
  307. package/dist/tts/sidecar.js.map +0 -1
  308. package/dist/twilio/call.js +0 -79
  309. package/dist/twilio/call.js.map +0 -1
  310. package/dist/vault/matcher.js +0 -197
  311. package/dist/vault/matcher.js.map +0 -1
  312. package/dist/vault/personal.js +0 -163
  313. package/dist/vault/personal.js.map +0 -1
  314. package/dist/vault/policy.js +0 -159
  315. package/dist/vault/policy.js.map +0 -1
  316. package/dist/vault/store.js +0 -122
  317. package/dist/vault/store.js.map +0 -1
  318. package/dist/vault/transfer.js +0 -188
  319. package/dist/vault/transfer.js.map +0 -1
  320. package/dist/volumes/index.js +0 -2
  321. package/dist/volumes/index.js.map +0 -1
  322. package/dist/volumes/manager.js +0 -462
  323. package/dist/volumes/manager.js.map +0 -1
  324. package/dist/volumes/types.js +0 -8
  325. package/dist/volumes/types.js.map +0 -1
  326. package/dist/webhooks/config.js +0 -214
  327. package/dist/webhooks/config.js.map +0 -1
  328. package/dist/webhooks/event-log.js +0 -132
  329. package/dist/webhooks/event-log.js.map +0 -1
  330. package/dist/webhooks/handler.js +0 -103
  331. package/dist/webhooks/handler.js.map +0 -1
  332. package/dist/webhooks/handlers.js +0 -231
  333. package/dist/webhooks/handlers.js.map +0 -1
  334. package/dist/webhooks/index.js +0 -33
  335. package/dist/webhooks/index.js.map +0 -1
  336. package/dist/webhooks/mount.js +0 -400
  337. package/dist/webhooks/mount.js.map +0 -1
  338. package/dist/webhooks/registry.js +0 -143
  339. package/dist/webhooks/registry.js.map +0 -1
  340. package/dist/webhooks/relay.js +0 -53
  341. package/dist/webhooks/relay.js.map +0 -1
  342. package/dist/webhooks/retry.js +0 -270
  343. package/dist/webhooks/retry.js.map +0 -1
  344. package/dist/webhooks/router.js +0 -290
  345. package/dist/webhooks/router.js.map +0 -1
  346. package/dist/webhooks/twilio.js +0 -129
  347. package/dist/webhooks/twilio.js.map +0 -1
  348. package/dist/webhooks/types.js +0 -8
  349. package/dist/webhooks/types.js.map +0 -1
  350. package/dist/webhooks/verify.js +0 -154
  351. package/dist/webhooks/verify.js.map +0 -1
@@ -1,225 +0,0 @@
1
- /**
2
- * URL browse module for Core.
3
- * Fetches a URL, strips HTML to readable text, and returns it for context injection.
4
- * Zero external dependencies — uses native fetch and regex extraction.
5
- *
6
- * Never throws — returns null on any error.
7
- */
8
- import { getInstanceName } from "../instance.js";
9
- /** Max chars of extracted text to keep (context budget). */
10
- const MAX_TEXT_LENGTH = 8000;
11
- /** Timeout for fetch requests in ms. */
12
- const FETCH_TIMEOUT_MS = 15_000;
13
- /** Content types we'll attempt to parse. */
14
- const ALLOWED_CONTENT_TYPES = ["text/html", "text/plain", "application/xhtml"];
15
- /**
16
- * Extract the <title> content from raw HTML.
17
- */
18
- export function extractTitle(html) {
19
- const match = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
20
- return match ? decodeEntities(match[1].trim()) : "";
21
- }
22
- /**
23
- * Strip HTML to readable plain text.
24
- * Removes scripts, styles, tags, decodes entities, and collapses whitespace.
25
- */
26
- export function stripHtml(html) {
27
- let text = html;
28
- // Remove script and style blocks entirely
29
- text = text.replace(/<script[\s\S]*?<\/script>/gi, "");
30
- text = text.replace(/<style[\s\S]*?<\/style>/gi, "");
31
- text = text.replace(/<noscript[\s\S]*?<\/noscript>/gi, "");
32
- // Remove HTML comments
33
- text = text.replace(/<!--[\s\S]*?-->/g, "");
34
- // Replace block-level tags with newlines for readability
35
- text = text.replace(/<\/(p|div|h[1-6]|li|tr|br|blockquote|section|article|header|footer)>/gi, "\n");
36
- text = text.replace(/<br\s*\/?>/gi, "\n");
37
- text = text.replace(/<(p|div|h[1-6]|li|tr|blockquote|section|article|header|footer)\b[^>]*>/gi, "\n");
38
- // Remove all remaining tags
39
- text = text.replace(/<[^>]+>/g, "");
40
- // Decode HTML entities
41
- text = decodeEntities(text);
42
- // Collapse whitespace: multiple spaces/tabs to single space, preserve newlines
43
- text = text.replace(/[^\S\n]+/g, " ");
44
- // Collapse multiple blank lines to at most two
45
- text = text.replace(/\n{3,}/g, "\n\n");
46
- // Trim each line
47
- text = text
48
- .split("\n")
49
- .map((line) => line.trim())
50
- .join("\n");
51
- // Trim overall
52
- text = text.trim();
53
- return text;
54
- }
55
- /**
56
- * Decode common HTML entities.
57
- */
58
- function decodeEntities(text) {
59
- const entities = {
60
- "&amp;": "&",
61
- "&lt;": "<",
62
- "&gt;": ">",
63
- "&quot;": '"',
64
- "&#39;": "'",
65
- "&apos;": "'",
66
- "&nbsp;": " ",
67
- "&mdash;": "—",
68
- "&ndash;": "–",
69
- "&hellip;": "…",
70
- "&laquo;": "«",
71
- "&raquo;": "»",
72
- "&copy;": "©",
73
- "&reg;": "®",
74
- "&trade;": "™",
75
- };
76
- let result = text;
77
- for (const [entity, char] of Object.entries(entities)) {
78
- result = result.replaceAll(entity, char);
79
- }
80
- // Decode numeric entities (&#123; and &#x1a;)
81
- result = result.replace(/&#(\d+);/g, (_, num) => String.fromCharCode(parseInt(num, 10)));
82
- result = result.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
83
- return result;
84
- }
85
- /**
86
- * Fetch a plain-text URL and return its content (or null on failure).
87
- * Rejects HTML responses to avoid returning 404 pages.
88
- */
89
- async function fetchPlainText(textUrl) {
90
- try {
91
- const controller = new AbortController();
92
- const timer = setTimeout(() => controller.abort(), 5000);
93
- const response = await fetch(textUrl, {
94
- signal: controller.signal,
95
- headers: { "User-Agent": `${getInstanceName()}/1.0 (personal AI agent)` },
96
- redirect: "follow",
97
- });
98
- clearTimeout(timer);
99
- if (!response.ok)
100
- return null;
101
- const contentType = response.headers.get("content-type") ?? "";
102
- if (!contentType.includes("text/"))
103
- return null;
104
- const text = (await response.text()).trim();
105
- // Sanity check: if it's HTML (404 page), reject it
106
- if (text.startsWith("<!") || text.startsWith("<html"))
107
- return null;
108
- if (text.length < 5)
109
- return null;
110
- return text;
111
- }
112
- catch {
113
- return null;
114
- }
115
- }
116
- /**
117
- * Extract llms.txt link hrefs from raw HTML.
118
- * Looks for <a> tags whose href ends in /llms.txt or whose text mentions llms.txt.
119
- */
120
- export function extractLlmsTxtLinks(html, baseUrl) {
121
- const links = [];
122
- const parsed = new URL(baseUrl);
123
- // Match <a> tags with href containing llms.txt
124
- const hrefPattern = /<a\s[^>]*href=["']([^"']*llms\.txt[^"']*)["'][^>]*>/gi;
125
- let match;
126
- while ((match = hrefPattern.exec(html)) !== null) {
127
- const href = match[1];
128
- try {
129
- // Resolve relative URLs
130
- const resolved = new URL(href, `${parsed.protocol}//${parsed.host}`).href;
131
- if (!links.includes(resolved))
132
- links.push(resolved);
133
- }
134
- catch {
135
- // skip malformed URLs
136
- }
137
- }
138
- return links;
139
- }
140
- /**
141
- * Fetch llms.txt from a site — tries root /llms.txt first, then follows
142
- * any llms.txt links found in the page HTML as fallback.
143
- * Convention: sites publish /llms.txt with AI-friendly content about the site.
144
- * Returns the text content or null if not found.
145
- */
146
- export async function fetchLlmsTxt(url, html) {
147
- const parsed = new URL(url);
148
- const rootUrl = `${parsed.protocol}//${parsed.host}/llms.txt`;
149
- // Try the root /llms.txt first (standard location)
150
- const rootResult = await fetchPlainText(rootUrl);
151
- if (rootResult)
152
- return rootResult;
153
- // Fallback: scan page HTML for llms.txt links and try each
154
- if (html) {
155
- const links = extractLlmsTxtLinks(html, url);
156
- for (const link of links) {
157
- // Skip if same as root (already tried)
158
- if (link === rootUrl)
159
- continue;
160
- const result = await fetchPlainText(link);
161
- if (result)
162
- return result;
163
- }
164
- }
165
- return null;
166
- }
167
- /**
168
- * Fetch a URL and extract readable text.
169
- * Returns null on any error (timeout, network, non-HTML content, etc.).
170
- */
171
- export async function browseUrl(url) {
172
- try {
173
- const controller = new AbortController();
174
- const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
175
- const response = await fetch(url, {
176
- signal: controller.signal,
177
- headers: {
178
- "User-Agent": `${getInstanceName()}/1.0 (personal AI agent)`,
179
- Accept: "text/html, text/plain;q=0.9, */*;q=0.1",
180
- },
181
- redirect: "follow",
182
- });
183
- clearTimeout(timer);
184
- if (!response.ok) {
185
- return null;
186
- }
187
- // Check content type — reject non-text responses
188
- const contentType = response.headers.get("content-type") ?? "";
189
- const isAllowed = ALLOWED_CONTENT_TYPES.some((t) => contentType.toLowerCase().includes(t));
190
- if (!isAllowed) {
191
- return null;
192
- }
193
- const html = await response.text();
194
- const title = extractTitle(html);
195
- // For plain text, skip HTML stripping
196
- const isPlainText = contentType.toLowerCase().includes("text/plain");
197
- let text = isPlainText ? html.trim() : stripHtml(html);
198
- // Truncate to context budget
199
- let truncated = false;
200
- if (text.length > MAX_TEXT_LENGTH) {
201
- text = text.slice(0, MAX_TEXT_LENGTH);
202
- // Try to break at a word/sentence boundary
203
- const lastBreak = Math.max(text.lastIndexOf("\n"), text.lastIndexOf(". "), text.lastIndexOf("? "), text.lastIndexOf("! "));
204
- if (lastBreak > MAX_TEXT_LENGTH * 0.8) {
205
- text = text.slice(0, lastBreak + 1);
206
- }
207
- text += "\n\n[Content truncated]";
208
- truncated = true;
209
- }
210
- // Fetch llms.txt — tries root /llms.txt, then any links found in page HTML
211
- const llmsTxt = await fetchLlmsTxt(url, html);
212
- return { url, title, text, truncated, llmsTxt };
213
- }
214
- catch {
215
- return null;
216
- }
217
- }
218
- /**
219
- * Detect the first URL in a message string.
220
- */
221
- export function detectUrl(message) {
222
- const match = message.match(/https?:\/\/\S+/);
223
- return match ? match[0].replace(/[.,;:!?)]+$/, "") : null;
224
- }
225
- //# sourceMappingURL=browse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/search/browse.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Perplexity Sonar API client.
3
- * Uses the chat completions endpoint with model "sonar" for web search.
4
- * Safe: never throws, returns null on any error.
5
- */
6
- const PERPLEXITY_URL = "https://api.perplexity.ai/chat/completions";
7
- /**
8
- * Search the web via Perplexity Sonar.
9
- * Requires PERPLEXITY_API_KEY in process.env (hydrated by vault).
10
- * 15-second timeout. Returns null on any failure.
11
- */
12
- export async function perplexitySearch(query) {
13
- const apiKey = process.env.PERPLEXITY_API_KEY;
14
- if (!apiKey)
15
- return null;
16
- try {
17
- const res = await fetch(PERPLEXITY_URL, {
18
- method: "POST",
19
- headers: {
20
- "Content-Type": "application/json",
21
- Authorization: `Bearer ${apiKey}`,
22
- },
23
- body: JSON.stringify({
24
- model: "sonar",
25
- messages: [{ role: "user", content: query }],
26
- }),
27
- signal: AbortSignal.timeout(15_000),
28
- });
29
- if (!res.ok)
30
- return null;
31
- const data = (await res.json());
32
- const content = data.choices?.[0]?.message?.content;
33
- if (!content)
34
- return null;
35
- return { results: content, query };
36
- }
37
- catch {
38
- return null;
39
- }
40
- }
41
- //# sourceMappingURL=perplexity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"perplexity.js","sourceRoot":"","sources":["../../src/search/perplexity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,cAAc,GAAG,4CAA4C,CAAC;AAEpE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;aAC7C,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QACpD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,277 +0,0 @@
1
- /**
2
- * Slack channel management — list, join, info, post, and thread operations.
3
- * Wraps SlackClient methods with activity logging.
4
- * Follows src/linear/projects.ts pattern: standalone functions, never throw.
5
- */
6
- import { getClient } from "./client.js";
7
- import { logActivity } from "../activity/log.js";
8
- import { createLogger } from "../utils/logger.js";
9
- const log = createLogger("slack.channels");
10
- // ── Channel listing ───────────────────────────────────────────────────────────
11
- /**
12
- * List channels the bot can see. Supports pagination via cursor.
13
- */
14
- export async function listChannels(opts) {
15
- const client = getClient();
16
- if (!client)
17
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
18
- log.debug("Listing channels", { types: opts?.types, limit: opts?.limit, cursor: opts?.cursor });
19
- try {
20
- const data = await slackPost("conversations.list", {
21
- types: opts?.types ?? "public_channel,private_channel",
22
- limit: opts?.limit ?? 100,
23
- cursor: opts?.cursor,
24
- exclude_archived: opts?.exclude_archived ?? true,
25
- });
26
- if (!data.ok) {
27
- log.error("Failed to list channels", { error: data.error });
28
- return { ok: false, message: data.error ?? "Failed to list channels" };
29
- }
30
- const channels = (data.channels ?? []).map((ch) => ({
31
- id: ch.id,
32
- name: ch.name,
33
- is_channel: ch.is_channel ?? true,
34
- is_im: ch.is_im ?? false,
35
- is_mpim: ch.is_mpim ?? false,
36
- is_private: ch.is_private ?? false,
37
- is_archived: ch.is_archived ?? false,
38
- is_member: ch.is_member ?? false,
39
- num_members: ch.num_members,
40
- topic: ch.topic?.value,
41
- purpose: ch.purpose?.value,
42
- }));
43
- log.info("Channels listed", { count: channels.length, hasMore: !!data.response_metadata?.next_cursor });
44
- return {
45
- ok: true,
46
- channels,
47
- nextCursor: data.response_metadata?.next_cursor || undefined,
48
- message: `Found ${channels.length} channels`,
49
- };
50
- }
51
- catch (err) {
52
- log.error("Channel listing failed", { error: err.message });
53
- return { ok: false, message: `Failed to list channels: ${err.message}` };
54
- }
55
- }
56
- /**
57
- * Get info about a specific channel.
58
- */
59
- export async function getChannelInfo(channelId) {
60
- const client = getClient();
61
- if (!client)
62
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
63
- log.debug("Fetching channel info", { channelId });
64
- try {
65
- const data = await slackPost("conversations.info", { channel: channelId });
66
- if (!data.ok || !data.channel) {
67
- log.warn("Channel not found", { channelId, error: data.error });
68
- return { ok: false, message: data.error ?? "Channel not found" };
69
- }
70
- const ch = data.channel;
71
- log.debug("Channel info retrieved", { channelId, channelName: ch.name });
72
- return {
73
- ok: true,
74
- channel: {
75
- id: ch.id,
76
- name: ch.name,
77
- is_channel: ch.is_channel ?? true,
78
- is_im: ch.is_im ?? false,
79
- is_mpim: ch.is_mpim ?? false,
80
- is_private: ch.is_private ?? false,
81
- is_archived: ch.is_archived ?? false,
82
- is_member: ch.is_member ?? false,
83
- num_members: ch.num_members,
84
- topic: ch.topic?.value,
85
- purpose: ch.purpose?.value,
86
- },
87
- message: `Channel: ${ch.name}`,
88
- };
89
- }
90
- catch (err) {
91
- log.error("Failed to get channel info", { channelId, error: err.message });
92
- return { ok: false, message: `Failed to get channel info: ${err.message}` };
93
- }
94
- }
95
- // ── Channel operations ────────────────────────────────────────────────────────
96
- /**
97
- * Join a public channel.
98
- */
99
- export async function joinChannel(channelId) {
100
- const client = getClient();
101
- if (!client)
102
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
103
- log.debug("Joining channel", { channelId });
104
- try {
105
- const data = await slackPost("conversations.join", { channel: channelId });
106
- if (!data.ok) {
107
- log.error("Failed to join channel", { channelId, error: data.error });
108
- return { ok: false, message: data.error ?? "Failed to join channel" };
109
- }
110
- log.info("Joined channel", { channelId, channelName: data.channel?.name });
111
- logActivity({ source: "slack", summary: `Joined channel ${data.channel?.name ?? channelId}` });
112
- return { ok: true, message: `Joined ${data.channel?.name ?? channelId}` };
113
- }
114
- catch (err) {
115
- log.error("Channel join failed", { channelId, error: err.message });
116
- return { ok: false, message: `Failed to join channel: ${err.message}` };
117
- }
118
- }
119
- /**
120
- * Set the channel topic.
121
- */
122
- export async function setChannelTopic(channelId, topic) {
123
- const client = getClient();
124
- if (!client)
125
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
126
- log.debug("Setting channel topic", { channelId });
127
- try {
128
- const data = await slackPost("conversations.setTopic", { channel: channelId, topic });
129
- if (!data.ok) {
130
- log.error("Failed to set channel topic", { channelId, error: data.error });
131
- return { ok: false, message: data.error ?? "Failed to set topic" };
132
- }
133
- log.info("Channel topic updated", { channelId });
134
- return { ok: true, message: "Topic updated" };
135
- }
136
- catch (err) {
137
- log.error("Channel topic update failed", { channelId, error: err.message });
138
- return { ok: false, message: `Failed to set topic: ${err.message}` };
139
- }
140
- }
141
- /**
142
- * Set the channel purpose.
143
- */
144
- export async function setChannelPurpose(channelId, purpose) {
145
- const client = getClient();
146
- if (!client)
147
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
148
- log.debug("Setting channel purpose", { channelId });
149
- try {
150
- const data = await slackPost("conversations.setPurpose", { channel: channelId, purpose });
151
- if (!data.ok) {
152
- log.error("Failed to set channel purpose", { channelId, error: data.error });
153
- return { ok: false, message: data.error ?? "Failed to set purpose" };
154
- }
155
- log.info("Channel purpose updated", { channelId });
156
- return { ok: true, message: "Purpose updated" };
157
- }
158
- catch (err) {
159
- log.error("Channel purpose update failed", { channelId, error: err.message });
160
- return { ok: false, message: `Failed to set purpose: ${err.message}` };
161
- }
162
- }
163
- // ── Posting ───────────────────────────────────────────────────────────────────
164
- /**
165
- * Post a message to a channel with activity logging.
166
- */
167
- export async function postMessage(channel, text, opts) {
168
- const client = getClient();
169
- if (!client)
170
- return { ok: false, error: "SLACK_BOT_TOKEN not set" };
171
- log.debug("Posting message to channel", { channelId: channel, threadTs: opts?.thread_ts });
172
- const result = await client.sendMessage(channel, text, opts);
173
- if (result.ok) {
174
- log.info("Message posted to channel", { channelId: channel, ts: result.ts });
175
- logActivity({ source: "slack", summary: `Message posted to ${channel}` });
176
- }
177
- else {
178
- log.error("Failed to post message", { channelId: channel, error: result.error });
179
- }
180
- return { ok: result.ok, ts: result.ts || undefined, error: result.error };
181
- }
182
- /**
183
- * Post a threaded reply.
184
- */
185
- export async function postThreadReply(channel, threadTs, text, opts) {
186
- const client = getClient();
187
- if (!client)
188
- return { ok: false, error: "SLACK_BOT_TOKEN not set" };
189
- log.debug("Posting thread reply", { channelId: channel, threadTs });
190
- const result = await client.replyInThread(channel, threadTs, text, opts);
191
- if (result.ok) {
192
- log.info("Thread reply posted", { channelId: channel, threadTs, ts: result.ts });
193
- logActivity({ source: "slack", summary: `Thread reply posted in ${channel}` });
194
- }
195
- else {
196
- log.error("Failed to post thread reply", { channelId: channel, threadTs, error: result.error });
197
- }
198
- return { ok: result.ok, ts: result.ts || undefined, error: result.error };
199
- }
200
- // ── History ───────────────────────────────────────────────────────────────────
201
- /**
202
- * Fetch recent messages from a channel.
203
- */
204
- export async function getChannelHistory(channelId, opts) {
205
- const client = getClient();
206
- if (!client)
207
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
208
- log.debug("Fetching channel history", { channelId, limit: opts?.limit });
209
- try {
210
- const data = await slackPost("conversations.history", {
211
- channel: channelId,
212
- limit: opts?.limit ?? 20,
213
- oldest: opts?.oldest,
214
- latest: opts?.latest,
215
- });
216
- if (!data.ok) {
217
- log.error("Failed to fetch channel history", { channelId, error: data.error });
218
- return { ok: false, message: data.error ?? "Failed to get history" };
219
- }
220
- const messages = (data.messages ?? []).map((m) => ({
221
- user: m.user,
222
- text: m.text ?? "",
223
- ts: m.ts,
224
- thread_ts: m.thread_ts,
225
- }));
226
- log.debug("Channel history fetched", { channelId, messageCount: messages.length });
227
- return { ok: true, messages, message: `Fetched ${messages.length} messages` };
228
- }
229
- catch (err) {
230
- log.error("Channel history fetch failed", { channelId, error: err.message });
231
- return { ok: false, message: `Failed to get history: ${err.message}` };
232
- }
233
- }
234
- /**
235
- * Fetch thread replies.
236
- */
237
- export async function getThreadReplies(channelId, threadTs, opts) {
238
- const client = getClient();
239
- if (!client)
240
- return { ok: false, message: "SLACK_BOT_TOKEN not set" };
241
- try {
242
- const data = await slackPost("conversations.replies", {
243
- channel: channelId,
244
- ts: threadTs,
245
- limit: opts?.limit ?? 50,
246
- });
247
- if (!data.ok)
248
- return { ok: false, message: data.error ?? "Failed to get replies" };
249
- const messages = (data.messages ?? []).map((m) => ({
250
- user: m.user,
251
- text: m.text ?? "",
252
- ts: m.ts,
253
- }));
254
- return { ok: true, messages, message: `Fetched ${messages.length} replies` };
255
- }
256
- catch (err) {
257
- return { ok: false, message: `Failed to get replies: ${err.message}` };
258
- }
259
- }
260
- // ── Internal helper ───────────────────────────────────────────────────────────
261
- /** Make a raw authenticated Slack API POST. Used by channel functions. */
262
- async function slackPost(endpoint, body) {
263
- const token = process.env.SLACK_BOT_TOKEN;
264
- if (!token)
265
- throw new Error("SLACK_BOT_TOKEN not set");
266
- const res = await fetch(`https://slack.com/api/${endpoint}`, {
267
- method: "POST",
268
- headers: {
269
- Authorization: `Bearer ${token}`,
270
- "Content-Type": "application/json; charset=utf-8",
271
- },
272
- body: JSON.stringify(body),
273
- signal: AbortSignal.timeout(15_000),
274
- });
275
- return (await res.json());
276
- }
277
- //# sourceMappingURL=channels.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/slack/channels.ts"],"names":[],"mappings":"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"}