@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
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown-aware chunking for brain files.
|
|
3
|
+
* Splits on headers first, then paragraphs, with a 512-token target.
|
|
4
|
+
* Pure function — no I/O, no side effects.
|
|
5
|
+
*/
|
|
6
|
+
export interface Chunk {
|
|
7
|
+
/** Content-addressed ID: sha256(filePath + ":" + index) truncated to 16 hex */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Relative path to the source file (from brain root) */
|
|
10
|
+
filePath: string;
|
|
11
|
+
/** Nearest parent heading, or filename if no heading */
|
|
12
|
+
heading: string;
|
|
13
|
+
/** The chunk text */
|
|
14
|
+
text: string;
|
|
15
|
+
/** Position index within the file */
|
|
16
|
+
index: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Chunk a markdown file into pieces suitable for embedding.
|
|
20
|
+
* @param filePath - relative path from brain root (used in chunk ID)
|
|
21
|
+
* @param content - file content
|
|
22
|
+
*/
|
|
23
|
+
export declare function chunkMarkdown(filePath: string, content: string): Chunk[];
|
|
24
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/search/chunker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,WAAW,KAAK;IACpB,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAuCxE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown-aware chunking for brain files.
|
|
3
|
+
* Splits on headers first, then paragraphs, with a 512-token target.
|
|
4
|
+
* Pure function — no I/O, no side effects.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
/** ~4 chars per token, 512 tokens */
|
|
8
|
+
const MAX_CHUNK_CHARS = 2048;
|
|
9
|
+
/** Overlap between consecutive chunks within a section */
|
|
10
|
+
const OVERLAP_CHARS = 200;
|
|
11
|
+
/**
|
|
12
|
+
* Chunk a markdown file into pieces suitable for embedding.
|
|
13
|
+
* @param filePath - relative path from brain root (used in chunk ID)
|
|
14
|
+
* @param content - file content
|
|
15
|
+
*/
|
|
16
|
+
export function chunkMarkdown(filePath, content) {
|
|
17
|
+
if (!content.trim())
|
|
18
|
+
return [];
|
|
19
|
+
const chunks = [];
|
|
20
|
+
let globalIndex = 0;
|
|
21
|
+
// Split into sections by ## headers (level 1 or 2)
|
|
22
|
+
const sections = splitByHeaders(content, filePath);
|
|
23
|
+
for (const section of sections) {
|
|
24
|
+
if (section.text.length <= MAX_CHUNK_CHARS) {
|
|
25
|
+
// Section fits in one chunk
|
|
26
|
+
chunks.push(makeChunk(filePath, section.heading, section.text, globalIndex++));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Split large sections by paragraphs, then by size
|
|
30
|
+
const paragraphs = section.text.split(/\n\n+/);
|
|
31
|
+
let buffer = "";
|
|
32
|
+
for (const para of paragraphs) {
|
|
33
|
+
if (buffer.length + para.length + 2 > MAX_CHUNK_CHARS && buffer.length > 0) {
|
|
34
|
+
// Flush buffer
|
|
35
|
+
chunks.push(makeChunk(filePath, section.heading, buffer.trim(), globalIndex++));
|
|
36
|
+
// Overlap: keep tail of previous buffer
|
|
37
|
+
buffer = buffer.length > OVERLAP_CHARS
|
|
38
|
+
? buffer.slice(-OVERLAP_CHARS) + "\n\n" + para
|
|
39
|
+
: para;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
buffer += (buffer ? "\n\n" : "") + para;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Flush remaining
|
|
46
|
+
if (buffer.trim()) {
|
|
47
|
+
chunks.push(makeChunk(filePath, section.heading, buffer.trim(), globalIndex++));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return chunks;
|
|
52
|
+
}
|
|
53
|
+
function splitByHeaders(content, filePath) {
|
|
54
|
+
// Extract filename without extension as fallback heading
|
|
55
|
+
const fallbackHeading = filePath.split("/").pop()?.replace(/\.\w+$/, "") ?? filePath;
|
|
56
|
+
const lines = content.split("\n");
|
|
57
|
+
const sections = [];
|
|
58
|
+
let currentHeading = fallbackHeading;
|
|
59
|
+
let currentLines = [];
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
const headerMatch = line.match(/^#{1,3}\s+(.+)/);
|
|
62
|
+
if (headerMatch) {
|
|
63
|
+
// Flush previous section
|
|
64
|
+
if (currentLines.length > 0) {
|
|
65
|
+
const text = currentLines.join("\n").trim();
|
|
66
|
+
if (text)
|
|
67
|
+
sections.push({ heading: currentHeading, text });
|
|
68
|
+
}
|
|
69
|
+
currentHeading = headerMatch[1].trim();
|
|
70
|
+
currentLines = [];
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
currentLines.push(line);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Flush last section
|
|
77
|
+
if (currentLines.length > 0) {
|
|
78
|
+
const text = currentLines.join("\n").trim();
|
|
79
|
+
if (text)
|
|
80
|
+
sections.push({ heading: currentHeading, text });
|
|
81
|
+
}
|
|
82
|
+
// If no sections found (no headers), treat entire content as one section
|
|
83
|
+
if (sections.length === 0 && content.trim()) {
|
|
84
|
+
sections.push({ heading: fallbackHeading, text: content.trim() });
|
|
85
|
+
}
|
|
86
|
+
return sections;
|
|
87
|
+
}
|
|
88
|
+
function makeChunk(filePath, heading, text, index) {
|
|
89
|
+
const hash = createHash("sha256")
|
|
90
|
+
.update(filePath + ":" + index)
|
|
91
|
+
.digest("hex")
|
|
92
|
+
.slice(0, 16);
|
|
93
|
+
return { id: hash, filePath, heading, text, index };
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/search/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Ollama embedding client.
|
|
3
|
+
* Used by both VectorIndex (memory) and BrainRAG (files).
|
|
4
|
+
* Circuit breaker prevents hammering a dead Ollama instance.
|
|
5
|
+
*/
|
|
6
|
+
/** Check whether Ollama is reachable. Cached for 30s with circuit breaker. */
|
|
7
|
+
export declare function isOllamaAvailable(): Promise<boolean>;
|
|
8
|
+
/** Embed a single text. Returns Float32Array. */
|
|
9
|
+
export declare function embed(text: string): Promise<Float32Array>;
|
|
10
|
+
/** Embed a batch of texts. Returns array of Float32Array. */
|
|
11
|
+
export declare function embedBatch(texts: string[]): Promise<Float32Array[]>;
|
|
12
|
+
/** Embed in batches of BATCH_SIZE, calling onBatch after each. */
|
|
13
|
+
export declare function embedInBatches(texts: string[], onBatch?: (startIndex: number, vecs: Float32Array[]) => Promise<void>): Promise<Float32Array[]>;
|
|
14
|
+
/** Cosine similarity between two vectors. */
|
|
15
|
+
export declare function cosine(a: Float32Array, b: Float32Array): number;
|
|
16
|
+
//# sourceMappingURL=embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/search/embedder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA6BH,8EAA8E;AAC9E,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAwB1D;AAID,iDAAiD;AACjD,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAU/D;AAED,6DAA6D;AAC7D,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUzE;AAED,kEAAkE;AAClE,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GACpE,OAAO,CAAC,YAAY,EAAE,CAAC,CASzB;AAED,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAW/D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Ollama embedding client.
|
|
3
|
+
* Used by both VectorIndex (memory) and BrainRAG (files).
|
|
4
|
+
* Circuit breaker prevents hammering a dead Ollama instance.
|
|
5
|
+
*/
|
|
6
|
+
import { createLogger } from "../utils/logger.js";
|
|
7
|
+
const log = createLogger("embedder");
|
|
8
|
+
const OLLAMA_URL = process.env.OLLAMA_URL ?? "http://localhost:11434";
|
|
9
|
+
const MODEL = process.env.EMBED_MODEL ?? "nomic-embed-text";
|
|
10
|
+
const BATCH_SIZE = 10;
|
|
11
|
+
// ── Circuit breaker ──────────────────────────────────────────────────────────
|
|
12
|
+
const AVAIL_CACHE_MS = 30_000;
|
|
13
|
+
const CIRCUIT_BREAKER_FAILURES = 3;
|
|
14
|
+
const CIRCUIT_BREAKER_COOLDOWN_MS = 5 * 60 * 1000;
|
|
15
|
+
let lastAvailCheck = 0;
|
|
16
|
+
let lastAvailResult = false;
|
|
17
|
+
let consecutiveFailures = 0;
|
|
18
|
+
let circuitOpenUntil = 0;
|
|
19
|
+
function recordFailure() {
|
|
20
|
+
consecutiveFailures++;
|
|
21
|
+
if (consecutiveFailures >= CIRCUIT_BREAKER_FAILURES) {
|
|
22
|
+
circuitOpenUntil = Date.now() + CIRCUIT_BREAKER_COOLDOWN_MS;
|
|
23
|
+
log.warn(`Circuit breaker open: ${consecutiveFailures} failures — disabled for ${CIRCUIT_BREAKER_COOLDOWN_MS / 1000}s`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Check whether Ollama is reachable. Cached for 30s with circuit breaker. */
|
|
27
|
+
export async function isOllamaAvailable() {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
if (now < circuitOpenUntil)
|
|
30
|
+
return false;
|
|
31
|
+
if (now - lastAvailCheck < AVAIL_CACHE_MS)
|
|
32
|
+
return lastAvailResult;
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch(`${OLLAMA_URL}/api/tags`, {
|
|
35
|
+
signal: AbortSignal.timeout(1000),
|
|
36
|
+
});
|
|
37
|
+
lastAvailCheck = now;
|
|
38
|
+
lastAvailResult = res.ok;
|
|
39
|
+
if (res.ok) {
|
|
40
|
+
if (consecutiveFailures > 0)
|
|
41
|
+
log.info("Ollama connectivity restored");
|
|
42
|
+
consecutiveFailures = 0;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
recordFailure();
|
|
46
|
+
}
|
|
47
|
+
return res.ok;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
lastAvailCheck = now;
|
|
51
|
+
lastAvailResult = false;
|
|
52
|
+
recordFailure();
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ── Embedding ────────────────────────────────────────────────────────────────
|
|
57
|
+
/** Embed a single text. Returns Float32Array. */
|
|
58
|
+
export async function embed(text) {
|
|
59
|
+
const res = await fetch(`${OLLAMA_URL}/api/embed`, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: { "Content-Type": "application/json" },
|
|
62
|
+
body: JSON.stringify({ model: MODEL, input: text }),
|
|
63
|
+
signal: AbortSignal.timeout(10_000),
|
|
64
|
+
});
|
|
65
|
+
if (!res.ok)
|
|
66
|
+
throw new Error(`Ollama embed failed: ${res.status}`);
|
|
67
|
+
const data = (await res.json());
|
|
68
|
+
return new Float32Array(data.embeddings[0]);
|
|
69
|
+
}
|
|
70
|
+
/** Embed a batch of texts. Returns array of Float32Array. */
|
|
71
|
+
export async function embedBatch(texts) {
|
|
72
|
+
const res = await fetch(`${OLLAMA_URL}/api/embed`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: { "Content-Type": "application/json" },
|
|
75
|
+
body: JSON.stringify({ model: MODEL, input: texts }),
|
|
76
|
+
signal: AbortSignal.timeout(30_000),
|
|
77
|
+
});
|
|
78
|
+
if (!res.ok)
|
|
79
|
+
throw new Error(`Ollama batch embed failed: ${res.status}`);
|
|
80
|
+
const data = (await res.json());
|
|
81
|
+
return data.embeddings.map((v) => new Float32Array(v));
|
|
82
|
+
}
|
|
83
|
+
/** Embed in batches of BATCH_SIZE, calling onBatch after each. */
|
|
84
|
+
export async function embedInBatches(texts, onBatch) {
|
|
85
|
+
const all = [];
|
|
86
|
+
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
|
87
|
+
const batch = texts.slice(i, i + BATCH_SIZE);
|
|
88
|
+
const vecs = await embedBatch(batch);
|
|
89
|
+
all.push(...vecs);
|
|
90
|
+
if (onBatch)
|
|
91
|
+
await onBatch(i, vecs);
|
|
92
|
+
}
|
|
93
|
+
return all;
|
|
94
|
+
}
|
|
95
|
+
/** Cosine similarity between two vectors. */
|
|
96
|
+
export function cosine(a, b) {
|
|
97
|
+
let dot = 0;
|
|
98
|
+
let normA = 0;
|
|
99
|
+
let normB = 0;
|
|
100
|
+
for (let i = 0; i < a.length; i++) {
|
|
101
|
+
dot += a[i] * b[i];
|
|
102
|
+
normA += a[i] * a[i];
|
|
103
|
+
normB += b[i] * b[i];
|
|
104
|
+
}
|
|
105
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
106
|
+
return denom === 0 ? 0 : dot / denom;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/search/embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain file watcher — triggers re-indexing on file changes.
|
|
3
|
+
* Debounces rapid saves. Watches brain/files/ and legacy dirs.
|
|
4
|
+
*/
|
|
5
|
+
import type { BrainRAG } from "./brain-rag.js";
|
|
6
|
+
/**
|
|
7
|
+
* Watch brain directories for changes and trigger re-indexing.
|
|
8
|
+
* Returns a cleanup function that stops all watchers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function watchBrain(rag: BrainRAG): () => void;
|
|
11
|
+
//# sourceMappingURL=file-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/search/file-watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAiB/C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,IAAI,CA0DpD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain file watcher — triggers re-indexing on file changes.
|
|
3
|
+
* Debounces rapid saves. Watches brain/files/ and legacy dirs.
|
|
4
|
+
*/
|
|
5
|
+
import { watch } from "node:fs";
|
|
6
|
+
import { stat } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { createLogger } from "../utils/logger.js";
|
|
9
|
+
import { FILES_DIR, resolveBrainDir } from "../lib/paths.js";
|
|
10
|
+
const log = createLogger("file-watcher");
|
|
11
|
+
const DEBOUNCE_MS = 2000;
|
|
12
|
+
const SEARCHABLE_EXTS = new Set([".md", ".yaml", ".yml", ".txt", ".pdf"]);
|
|
13
|
+
const WATCH_DIRS = [
|
|
14
|
+
FILES_DIR,
|
|
15
|
+
resolveBrainDir("content"),
|
|
16
|
+
resolveBrainDir("knowledge"),
|
|
17
|
+
resolveBrainDir("identity"),
|
|
18
|
+
resolveBrainDir("operations"),
|
|
19
|
+
resolveBrainDir("skills"),
|
|
20
|
+
resolveBrainDir("templates"),
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* Watch brain directories for changes and trigger re-indexing.
|
|
24
|
+
* Returns a cleanup function that stops all watchers.
|
|
25
|
+
*/
|
|
26
|
+
export function watchBrain(rag) {
|
|
27
|
+
const watchers = [];
|
|
28
|
+
const pending = new Map();
|
|
29
|
+
function handleChange(dir, filename) {
|
|
30
|
+
if (!filename)
|
|
31
|
+
return;
|
|
32
|
+
const ext = filename.substring(filename.lastIndexOf(".")).toLowerCase();
|
|
33
|
+
if (!SEARCHABLE_EXTS.has(ext))
|
|
34
|
+
return;
|
|
35
|
+
const fullPath = join(dir, filename);
|
|
36
|
+
const key = fullPath;
|
|
37
|
+
// Debounce: clear previous timer for this file
|
|
38
|
+
const existing = pending.get(key);
|
|
39
|
+
if (existing)
|
|
40
|
+
clearTimeout(existing);
|
|
41
|
+
pending.set(key, setTimeout(async () => {
|
|
42
|
+
pending.delete(key);
|
|
43
|
+
try {
|
|
44
|
+
// Check if file still exists (might have been deleted)
|
|
45
|
+
const s = await stat(fullPath).catch(() => null);
|
|
46
|
+
if (!s || !s.isFile()) {
|
|
47
|
+
log.info(`File removed or not a file: ${filename}`);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
log.info(`Re-indexing changed file: ${filename}`);
|
|
51
|
+
await rag.indexFile(fullPath);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
log.error(`Failed to re-index ${filename}`, {
|
|
55
|
+
error: err instanceof Error ? err.message : String(err),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}, DEBOUNCE_MS));
|
|
59
|
+
}
|
|
60
|
+
// Deduplicate dirs
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
for (const dir of WATCH_DIRS) {
|
|
63
|
+
if (seen.has(dir))
|
|
64
|
+
continue;
|
|
65
|
+
seen.add(dir);
|
|
66
|
+
try {
|
|
67
|
+
const watcher = watch(dir, { recursive: true }, (_event, filename) => {
|
|
68
|
+
handleChange(dir, filename);
|
|
69
|
+
});
|
|
70
|
+
watchers.push(watcher);
|
|
71
|
+
log.info(`Watching: ${dir}`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Directory might not exist — skip
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return () => {
|
|
78
|
+
for (const w of watchers)
|
|
79
|
+
w.close();
|
|
80
|
+
for (const timer of pending.values())
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
pending.clear();
|
|
83
|
+
log.info("File watchers stopped");
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/search/file-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqZH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAkqMD,iBAAe,KAAK,CAAC,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,iBAAiB,EAAE,QAAQ,CAAA;CAAE,iBAqmBxE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
|