@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.
- package/dictionary.json +2 -2
- package/dist/activity/log.js +2 -2
- package/dist/activity/log.js.map +1 -1
- package/dist/agents/governed-spawn.d.ts.map +1 -1
- package/dist/cli.js +101 -11
- package/dist/cli.js.map +1 -1
- package/dist/extensions/cache.d.ts +57 -0
- package/dist/extensions/cache.d.ts.map +1 -0
- package/dist/extensions/cache.js +173 -0
- package/dist/extensions/cache.js.map +1 -0
- package/dist/extensions/client.d.ts +55 -0
- package/dist/extensions/client.d.ts.map +1 -0
- package/dist/extensions/client.js +120 -0
- package/dist/extensions/client.js.map +1 -0
- package/dist/extensions/index.d.ts +13 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +12 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +50 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +166 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/manifest.d.ts +38 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +17 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/stubs.d.ts +27 -0
- package/dist/extensions/stubs.d.ts.map +1 -0
- package/dist/extensions/stubs.js +45 -0
- package/dist/extensions/stubs.js.map +1 -0
- package/dist/lib/audit.js +2 -2
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/brain-migrate.d.ts +21 -0
- package/dist/lib/brain-migrate.d.ts.map +1 -0
- package/dist/lib/brain-migrate.js +137 -0
- package/dist/lib/brain-migrate.js.map +1 -0
- package/dist/lib/paths.d.ts +27 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +65 -0
- package/dist/lib/paths.js.map +1 -1
- package/dist/llm/call-log.d.ts +40 -0
- package/dist/llm/call-log.d.ts.map +1 -0
- package/dist/llm/call-log.js +35 -0
- package/dist/llm/call-log.js.map +1 -0
- package/dist/llm/complete.d.ts +6 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +27 -0
- package/dist/llm/complete.js.map +1 -1
- package/dist/mcp-server.js +118 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/file-backed.d.ts +4 -0
- package/dist/memory/file-backed.d.ts.map +1 -1
- package/dist/memory/file-backed.js +4 -0
- package/dist/memory/file-backed.js.map +1 -1
- package/dist/memory/vector-index.d.ts +4 -12
- package/dist/memory/vector-index.d.ts.map +1 -1
- package/dist/memory/vector-index.js +11 -93
- package/dist/memory/vector-index.js.map +1 -1
- package/dist/search/brain-docs.d.ts +17 -7
- package/dist/search/brain-docs.d.ts.map +1 -1
- package/dist/search/brain-docs.js +170 -52
- package/dist/search/brain-docs.js.map +1 -1
- package/dist/search/brain-rag.d.ts +45 -0
- package/dist/search/brain-rag.d.ts.map +1 -0
- package/dist/search/brain-rag.js +275 -0
- package/dist/search/brain-rag.js.map +1 -0
- package/dist/search/chunker.d.ts +24 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +95 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/embedder.d.ts +16 -0
- package/dist/search/embedder.d.ts.map +1 -0
- package/dist/search/embedder.js +108 -0
- package/dist/search/embedder.js.map +1 -0
- package/dist/search/file-watcher.d.ts +11 -0
- package/dist/search/file-watcher.d.ts.map +1 -0
- package/dist/search/file-watcher.js +86 -0
- package/dist/search/file-watcher.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +168 -20
- package/dist/server.js.map +1 -1
- package/dist/sessions/store.d.ts +9 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js.map +1 -1
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +78 -2
- package/dist/settings.js.map +1 -1
- package/dist/tracing/init.d.ts +1 -1
- package/dist/tracing/init.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/module-tiers.json +164 -0
- package/package.json +9 -13
- package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
- package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
- package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
- package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
- package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
- package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
- package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
- package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
- package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
- package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
- package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
- package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
- package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
- package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
- package/public/index.html +379 -59
- package/dist/agents/autonomous.js +0 -749
- package/dist/agents/autonomous.js.map +0 -1
- package/dist/agents/commit.js +0 -113
- package/dist/agents/commit.js.map +0 -1
- package/dist/agents/continue.js +0 -158
- package/dist/agents/continue.js.map +0 -1
- package/dist/agents/cooldown.js +0 -397
- package/dist/agents/cooldown.js.map +0 -1
- package/dist/agents/dedup-guard.js +0 -131
- package/dist/agents/dedup-guard.js.map +0 -1
- package/dist/agents/feed.js +0 -176
- package/dist/agents/feed.js.map +0 -1
- package/dist/agents/governance.js +0 -292
- package/dist/agents/governance.js.map +0 -1
- package/dist/agents/governed-spawn.js +0 -192
- package/dist/agents/governed-spawn.js.map +0 -1
- package/dist/agents/heartbeat.js +0 -324
- package/dist/agents/heartbeat.js.map +0 -1
- package/dist/agents/instance-manager.js +0 -850
- package/dist/agents/instance-manager.js.map +0 -1
- package/dist/agents/issue-reporter.js +0 -123
- package/dist/agents/issue-reporter.js.map +0 -1
- package/dist/agents/issues.js +0 -141
- package/dist/agents/issues.js.map +0 -1
- package/dist/agents/locks.js +0 -234
- package/dist/agents/locks.js.map +0 -1
- package/dist/agents/memory.js +0 -93
- package/dist/agents/memory.js.map +0 -1
- package/dist/agents/monitor.js +0 -235
- package/dist/agents/monitor.js.map +0 -1
- package/dist/agents/orchestration.js +0 -715
- package/dist/agents/orchestration.js.map +0 -1
- package/dist/agents/recover.js +0 -166
- package/dist/agents/recover.js.map +0 -1
- package/dist/agents/reflection.js +0 -199
- package/dist/agents/reflection.js.map +0 -1
- package/dist/agents/runtime/bus.js +0 -174
- package/dist/agents/runtime/bus.js.map +0 -1
- package/dist/agents/runtime/config.js +0 -101
- package/dist/agents/runtime/config.js.map +0 -1
- package/dist/agents/runtime/driver.js +0 -214
- package/dist/agents/runtime/driver.js.map +0 -1
- package/dist/agents/runtime/errors.js +0 -40
- package/dist/agents/runtime/errors.js.map +0 -1
- package/dist/agents/runtime/index.js +0 -54
- package/dist/agents/runtime/index.js.map +0 -1
- package/dist/agents/runtime/lifecycle.js +0 -116
- package/dist/agents/runtime/lifecycle.js.map +0 -1
- package/dist/agents/runtime/manager.js +0 -948
- package/dist/agents/runtime/manager.js.map +0 -1
- package/dist/agents/runtime/registry.js +0 -195
- package/dist/agents/runtime/registry.js.map +0 -1
- package/dist/agents/runtime/resources.js +0 -146
- package/dist/agents/runtime/resources.js.map +0 -1
- package/dist/agents/runtime/types.js +0 -24
- package/dist/agents/runtime/types.js.map +0 -1
- package/dist/agents/spawn-policy.js +0 -202
- package/dist/agents/spawn-policy.js.map +0 -1
- package/dist/agents/spawn.js +0 -970
- package/dist/agents/spawn.js.map +0 -1
- package/dist/agents/triage.js +0 -81
- package/dist/agents/triage.js.map +0 -1
- package/dist/agents/workflow.js +0 -543
- package/dist/agents/workflow.js.map +0 -1
- package/dist/avatar/client.js +0 -172
- package/dist/avatar/client.js.map +0 -1
- package/dist/avatar/sidecar.js +0 -125
- package/dist/avatar/sidecar.js.map +0 -1
- package/dist/browser/sessions.js +0 -122
- package/dist/browser/sessions.js.map +0 -1
- package/dist/capabilities/definitions/browser.js +0 -242
- package/dist/capabilities/definitions/browser.js.map +0 -1
- package/dist/channels/whatsapp.js +0 -200
- package/dist/channels/whatsapp.js.map +0 -1
- package/dist/credentials/store.js +0 -189
- package/dist/credentials/store.js.map +0 -1
- package/dist/files/deep-index.js +0 -337
- package/dist/files/deep-index.js.map +0 -1
- package/dist/files/extract.js +0 -33
- package/dist/files/extract.js.map +0 -1
- package/dist/files/gdrive.js +0 -246
- package/dist/files/gdrive.js.map +0 -1
- package/dist/github/client.js +0 -408
- package/dist/github/client.js.map +0 -1
- package/dist/github/commit-analysis.js +0 -276
- package/dist/github/commit-analysis.js.map +0 -1
- package/dist/github/contributor-stats.js +0 -119
- package/dist/github/contributor-stats.js.map +0 -1
- package/dist/github/issue-sla.js +0 -220
- package/dist/github/issue-sla.js.map +0 -1
- package/dist/github/issue-triage.js +0 -286
- package/dist/github/issue-triage.js.map +0 -1
- package/dist/github/pr-readiness.js +0 -197
- package/dist/github/pr-readiness.js.map +0 -1
- package/dist/github/pr-review.js +0 -410
- package/dist/github/pr-review.js.map +0 -1
- package/dist/github/release-notes.js +0 -227
- package/dist/github/release-notes.js.map +0 -1
- package/dist/github/repo-health.js +0 -303
- package/dist/github/repo-health.js.map +0 -1
- package/dist/github/retry.js +0 -117
- package/dist/github/retry.js.map +0 -1
- package/dist/github/types.js +0 -8
- package/dist/github/types.js.map +0 -1
- package/dist/github/webhooks.js +0 -153
- package/dist/github/webhooks.js.map +0 -1
- package/dist/google/auth.js +0 -325
- package/dist/google/auth.js.map +0 -1
- package/dist/google/calendar-timer.js +0 -91
- package/dist/google/calendar-timer.js.map +0 -1
- package/dist/google/calendar.js +0 -270
- package/dist/google/calendar.js.map +0 -1
- package/dist/google/docs.js +0 -309
- package/dist/google/docs.js.map +0 -1
- package/dist/google/gmail-send.js +0 -219
- package/dist/google/gmail-send.js.map +0 -1
- package/dist/google/gmail-timer.js +0 -223
- package/dist/google/gmail-timer.js.map +0 -1
- package/dist/google/gmail.js +0 -470
- package/dist/google/gmail.js.map +0 -1
- package/dist/google/plugin.js +0 -169
- package/dist/google/plugin.js.map +0 -1
- package/dist/google/tasks-timer.js +0 -107
- package/dist/google/tasks-timer.js.map +0 -1
- package/dist/google/tasks.js +0 -331
- package/dist/google/tasks.js.map +0 -1
- package/dist/google/temporal.js +0 -176
- package/dist/google/temporal.js.map +0 -1
- package/dist/integrations/gate.js +0 -100
- package/dist/integrations/gate.js.map +0 -1
- package/dist/integrations/github.js +0 -331
- package/dist/integrations/github.js.map +0 -1
- package/dist/integrations/google-tasks.js +0 -432
- package/dist/integrations/google-tasks.js.map +0 -1
- package/dist/mdns.js +0 -110
- package/dist/mdns.js.map +0 -1
- package/dist/notifications/channel.js +0 -83
- package/dist/notifications/channel.js.map +0 -1
- package/dist/notifications/channels/adapter.js +0 -55
- package/dist/notifications/channels/adapter.js.map +0 -1
- package/dist/notifications/channels/index.js +0 -6
- package/dist/notifications/channels/index.js.map +0 -1
- package/dist/notifications/channels/log.js +0 -29
- package/dist/notifications/channels/log.js.map +0 -1
- package/dist/notifications/email.js +0 -72
- package/dist/notifications/email.js.map +0 -1
- package/dist/notifications/engine.js +0 -198
- package/dist/notifications/engine.js.map +0 -1
- package/dist/notifications/index.js +0 -24
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/phone.js +0 -48
- package/dist/notifications/phone.js.map +0 -1
- package/dist/notifications/sms.js +0 -65
- package/dist/notifications/sms.js.map +0 -1
- package/dist/notifications/types.js +0 -14
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/webhook.js +0 -65
- package/dist/notifications/webhook.js.map +0 -1
- package/dist/resend/inbox.js +0 -199
- package/dist/resend/inbox.js.map +0 -1
- package/dist/resend/webhooks.js +0 -244
- package/dist/resend/webhooks.js.map +0 -1
- package/dist/search/browse.js +0 -225
- package/dist/search/browse.js.map +0 -1
- package/dist/search/perplexity.js +0 -41
- package/dist/search/perplexity.js.map +0 -1
- package/dist/slack/channels.js +0 -277
- package/dist/slack/channels.js.map +0 -1
- package/dist/slack/client.js +0 -468
- package/dist/slack/client.js.map +0 -1
- package/dist/slack/retry.js +0 -100
- package/dist/slack/retry.js.map +0 -1
- package/dist/slack/types.js +0 -52
- package/dist/slack/types.js.map +0 -1
- package/dist/slack/webhooks.js +0 -285
- package/dist/slack/webhooks.js.map +0 -1
- package/dist/stt/client.js +0 -66
- package/dist/stt/client.js.map +0 -1
- package/dist/stt/sidecar.js +0 -115
- package/dist/stt/sidecar.js.map +0 -1
- package/dist/tracing/bridge.js +0 -70
- package/dist/tracing/bridge.js.map +0 -1
- package/dist/tracing/correlation.js +0 -49
- package/dist/tracing/correlation.js.map +0 -1
- package/dist/tracing/index.js +0 -18
- package/dist/tracing/index.js.map +0 -1
- package/dist/tracing/init.js +0 -81
- package/dist/tracing/init.js.map +0 -1
- package/dist/tracing/instrument.js +0 -145
- package/dist/tracing/instrument.js.map +0 -1
- package/dist/tracing/middleware.js +0 -69
- package/dist/tracing/middleware.js.map +0 -1
- package/dist/tracing/tracer.js +0 -327
- package/dist/tracing/tracer.js.map +0 -1
- package/dist/tts/client.js +0 -48
- package/dist/tts/client.js.map +0 -1
- package/dist/tts/sidecar.js +0 -148
- package/dist/tts/sidecar.js.map +0 -1
- package/dist/twilio/call.js +0 -79
- package/dist/twilio/call.js.map +0 -1
- package/dist/vault/matcher.js +0 -197
- package/dist/vault/matcher.js.map +0 -1
- package/dist/vault/personal.js +0 -163
- package/dist/vault/personal.js.map +0 -1
- package/dist/vault/policy.js +0 -159
- package/dist/vault/policy.js.map +0 -1
- package/dist/vault/store.js +0 -122
- package/dist/vault/store.js.map +0 -1
- package/dist/vault/transfer.js +0 -188
- package/dist/vault/transfer.js.map +0 -1
- package/dist/volumes/index.js +0 -2
- package/dist/volumes/index.js.map +0 -1
- package/dist/volumes/manager.js +0 -462
- package/dist/volumes/manager.js.map +0 -1
- package/dist/volumes/types.js +0 -8
- package/dist/volumes/types.js.map +0 -1
- package/dist/webhooks/config.js +0 -214
- package/dist/webhooks/config.js.map +0 -1
- package/dist/webhooks/event-log.js +0 -132
- package/dist/webhooks/event-log.js.map +0 -1
- package/dist/webhooks/handler.js +0 -103
- package/dist/webhooks/handler.js.map +0 -1
- package/dist/webhooks/handlers.js +0 -231
- package/dist/webhooks/handlers.js.map +0 -1
- package/dist/webhooks/index.js +0 -33
- package/dist/webhooks/index.js.map +0 -1
- package/dist/webhooks/mount.js +0 -400
- package/dist/webhooks/mount.js.map +0 -1
- package/dist/webhooks/registry.js +0 -143
- package/dist/webhooks/registry.js.map +0 -1
- package/dist/webhooks/relay.js +0 -53
- package/dist/webhooks/relay.js.map +0 -1
- package/dist/webhooks/retry.js +0 -270
- package/dist/webhooks/retry.js.map +0 -1
- package/dist/webhooks/router.js +0 -290
- package/dist/webhooks/router.js.map +0 -1
- package/dist/webhooks/twilio.js +0 -129
- package/dist/webhooks/twilio.js.map +0 -1
- package/dist/webhooks/types.js +0 -8
- package/dist/webhooks/types.js.map +0 -1
- package/dist/webhooks/verify.js +0 -154
- package/dist/webhooks/verify.js.map +0 -1
package/dist/search/browse.js
DELETED
|
@@ -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
|
-
"&": "&",
|
|
61
|
-
"<": "<",
|
|
62
|
-
">": ">",
|
|
63
|
-
""": '"',
|
|
64
|
-
"'": "'",
|
|
65
|
-
"'": "'",
|
|
66
|
-
" ": " ",
|
|
67
|
-
"—": "—",
|
|
68
|
-
"–": "–",
|
|
69
|
-
"…": "…",
|
|
70
|
-
"«": "«",
|
|
71
|
-
"»": "»",
|
|
72
|
-
"©": "©",
|
|
73
|
-
"®": "®",
|
|
74
|
-
"™": "™",
|
|
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 ({ and )
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUjD,4DAA4D;AAC5D,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,wCAAwC;AACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,4CAA4C;AAC5C,MAAM,qBAAqB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,IAAI,GAAG,IAAI,CAAC;IAEhB,0CAA0C;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IACvD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;IAE3D,uBAAuB;IACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAE5C,yDAAyD;IACzD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wEAAwE,EAAE,IAAI,CAAC,CAAC;IACpG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0EAA0E,EAAE,IAAI,CAAC,CAAC;IAEtG,4BAA4B;IAC5B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAEpC,uBAAuB;IACvB,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAE5B,+EAA+E;IAC/E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACtC,+CAA+C;IAC/C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACvC,iBAAiB;IACjB,IAAI,GAAG,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,eAAe;IACf,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAA2B;QACvC,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,GAAG;QACZ,SAAS,EAAE,GAAG;KACf,CAAC;IAEF,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,8CAA8C;IAC9C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAC9C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CACvC,CAAC;IACF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CACvC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE,0BAA0B,EAAE;YACzE,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,mDAAmD;QACnD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,OAAe;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAChC,+CAA+C;IAC/C,MAAM,WAAW,GAAG,uDAAuD,CAAC;IAC5E,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAAa;IAEb,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC;IAE9D,mDAAmD;IACnD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,2DAA2D;IAC3D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,uCAAuC;YACvC,IAAI,IAAI,KAAK,OAAO;gBAAE,SAAS;YAC/B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,GAAG,eAAe,EAAE,0BAA0B;gBAC5D,MAAM,EAAE,wCAAwC;aACjD;YACD,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iDAAiD;QACjD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACjD,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAEjC,sCAAsC;QACtC,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEvD,6BAA6B;QAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAClC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACtC,2CAA2C;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CACvB,CAAC;YACF,IAAI,SAAS,GAAG,eAAe,GAAG,GAAG,EAAE,CAAC;gBACtC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,yBAAyB,CAAC;YAClC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,2EAA2E;QAC3E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE9C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC"}
|
|
@@ -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"}
|
package/dist/slack/channels.js
DELETED
|
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAE3C,iFAAiF;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAKlC;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAiBzB,oBAAoB,EAAE;YACvB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,gCAAgC;YACtD,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG;YACzB,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,IAAI;SACjD,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,yBAAyB,EAAE,CAAC;QACzE,CAAC;QAED,MAAM,QAAQ,GAAmB,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;YACjC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK;YACxB,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK;YAC5B,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,KAAK;YAClC,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,KAAK;YACpC,SAAS,EAAE,EAAE,CAAC,SAAS,IAAI,KAAK;YAChC,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK;YACtB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK;SAC3B,CAAC,CAAC,CAAC;QAEJ,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC;QACxG,OAAO;YACL,EAAE,EAAE,IAAI;YACR,QAAQ;YACR,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,IAAI,SAAS;YAC5D,OAAO,EAAE,SAAS,QAAQ,CAAC,MAAM,WAAW;SAC7C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,4BAA4B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IACpD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAgBzB,oBAAoB,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,mBAAmB,EAAE,CAAC;QACnE,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE;gBACP,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI;gBACjC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK;gBACxB,OAAO,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK;gBAC5B,UAAU,EAAE,EAAE,CAAC,UAAU,IAAI,KAAK;gBAClC,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,KAAK;gBACpC,SAAS,EAAE,EAAE,CAAC,SAAS,IAAI,KAAK;gBAChC,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK;gBACtB,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK;aAC3B;YACD,OAAO,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,+BAA+B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB;IACjD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,oBAAoB,EACpB,EAAE,OAAO,EAAE,SAAS,EAAE,CACvB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,wBAAwB,EAAE,CAAC;QACxE,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,EAAE,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,KAAa;IAEb,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,wBAAwB,EACxB,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAC9B,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,qBAAqB,EAAE,CAAC;QACrE,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,OAAe;IAEf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,0BAA0B,EAC1B,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAChC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,uBAAuB,EAAE,CAAC;QACvE,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,IAAY,EACZ,IAAoD;IAEpD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAEpE,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,QAAgB,EAChB,IAAY,EACZ,IAAgC;IAEhC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAEpE,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACjF,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,OAAO,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5E,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,IAA2D;IAE3D,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAIzB,uBAAuB,EAAE;YAC1B,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;YACxB,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,uBAAuB,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;YAClB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QAEJ,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,QAAQ,CAAC,MAAM,WAAW,EAAE,CAAC;IAChF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,QAAgB,EAChB,IAAyB;IAEzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAIzB,uBAAuB,EAAE;YAC1B,OAAO,EAAE,SAAS;YAClB,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,uBAAuB,EAAE,CAAC;QAEnF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;YAClB,EAAE,EAAE,CAAC,CAAC,EAAE;SACT,CAAC,CAAC,CAAC;QAEJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,QAAQ,CAAC,MAAM,UAAU,EAAE,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,0EAA0E;AAC1E,KAAK,UAAU,SAAS,CAAU,QAAgB,EAAE,IAAyB;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,yBAAyB,QAAQ,EAAE,EAAE;QAC3D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,iCAAiC;SAClD;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;KACpC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;AACjC,CAAC"}
|