cognitive-core 0.2.1 → 0.2.2
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/dist/atlas.d.ts +10 -0
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +65 -0
- package/dist/atlas.js.map +1 -1
- package/dist/learning/pipeline.d.ts +4 -31
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +12 -64
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +21 -4
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +53 -16
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/playbook.d.ts +6 -0
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +15 -0
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/source-resolver.d.ts +120 -0
- package/dist/memory/source-resolver.d.ts.map +1 -0
- package/dist/memory/source-resolver.js +300 -0
- package/dist/memory/source-resolver.js.map +1 -0
- package/dist/types/config.d.ts +141 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +40 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/workspace/types.d.ts +12 -54
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +2 -2
- package/playbooks/compound-engineering/adversarial-review.json +51 -0
- package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
- package/playbooks/compound-engineering/agent-native-review.json +54 -0
- package/playbooks/compound-engineering/api-contract-review.json +52 -0
- package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
- package/playbooks/compound-engineering/bug-reproduction.json +62 -0
- package/playbooks/compound-engineering/confidence-calibration.json +49 -0
- package/playbooks/compound-engineering/correctness-review.json +49 -0
- package/playbooks/compound-engineering/data-migration-safety.json +59 -0
- package/playbooks/compound-engineering/deployment-verification.json +63 -0
- package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
- package/playbooks/compound-engineering/implementation-planning.json +64 -0
- package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
- package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
- package/playbooks/compound-engineering/learnings-research.json +54 -0
- package/playbooks/compound-engineering/maintainability-review.json +49 -0
- package/playbooks/compound-engineering/performance-review.json +54 -0
- package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
- package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
- package/playbooks/compound-engineering/project-standards-review.json +52 -0
- package/playbooks/compound-engineering/reliability-review.json +53 -0
- package/playbooks/compound-engineering/review-orchestration.json +64 -0
- package/playbooks/compound-engineering/security-review.json +54 -0
- package/playbooks/compound-engineering/systematic-execution.json +64 -0
- package/playbooks/compound-engineering/testing-review.json +50 -0
- package/src/atlas.ts +96 -0
- package/src/memory/curated-loader.ts +69 -16
- package/src/memory/index.ts +16 -0
- package/src/memory/playbook.ts +19 -0
- package/src/memory/source-resolver.ts +422 -0
- package/src/types/config.ts +46 -0
- package/src/types/index.ts +4 -0
- package/src/workspace/types.ts +22 -78
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -0
- package/.claude/settings.local.json +0 -11
- package/dist/learning/llm-extractor.d.ts +0 -88
- package/dist/learning/llm-extractor.d.ts.map +0 -1
- package/dist/learning/llm-extractor.js +0 -372
- package/dist/learning/llm-extractor.js.map +0 -1
- package/dist/learning/loop-coordinator.d.ts +0 -61
- package/dist/learning/loop-coordinator.d.ts.map +0 -1
- package/dist/learning/loop-coordinator.js +0 -96
- package/dist/learning/loop-coordinator.js.map +0 -1
- package/references/agent-workspace/CLAUDE.md +0 -74
- package/references/agent-workspace/README.md +0 -587
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +0 -2061
- package/references/agent-workspace/package.json +0 -54
- package/references/agent-workspace/src/handle.ts +0 -122
- package/references/agent-workspace/src/index.ts +0 -32
- package/references/agent-workspace/src/manager.ts +0 -102
- package/references/agent-workspace/src/readers/json.ts +0 -71
- package/references/agent-workspace/src/readers/markdown.ts +0 -37
- package/references/agent-workspace/src/readers/raw.ts +0 -27
- package/references/agent-workspace/src/types.ts +0 -68
- package/references/agent-workspace/src/validation.ts +0 -93
- package/references/agent-workspace/src/writers/json.ts +0 -17
- package/references/agent-workspace/src/writers/markdown.ts +0 -27
- package/references/agent-workspace/src/writers/raw.ts +0 -22
- package/references/agent-workspace/tests/errors.test.ts +0 -652
- package/references/agent-workspace/tests/handle.test.ts +0 -144
- package/references/agent-workspace/tests/manager.test.ts +0 -124
- package/references/agent-workspace/tests/readers.test.ts +0 -205
- package/references/agent-workspace/tests/validation.test.ts +0 -196
- package/references/agent-workspace/tests/writers.test.ts +0 -108
- package/references/agent-workspace/tsconfig.json +0 -20
- package/references/agent-workspace/tsup.config.ts +0 -9
- package/references/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -556
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -60
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- package/references/sessionlog/.husky/pre-commit +0 -1
- package/references/sessionlog/.lintstagedrc.json +0 -4
- package/references/sessionlog/.prettierignore +0 -4
- package/references/sessionlog/.prettierrc.json +0 -11
- package/references/sessionlog/LICENSE +0 -21
- package/references/sessionlog/README.md +0 -453
- package/references/sessionlog/eslint.config.js +0 -58
- package/references/sessionlog/package-lock.json +0 -3672
- package/references/sessionlog/package.json +0 -65
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
- package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
- package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
- package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
- package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
- package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
- package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
- package/references/sessionlog/src/__tests__/types.test.ts +0 -166
- package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
- package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
- package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
- package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
- package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
- package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
- package/references/sessionlog/src/agent/registry.ts +0 -143
- package/references/sessionlog/src/agent/session-types.ts +0 -113
- package/references/sessionlog/src/agent/types.ts +0 -220
- package/references/sessionlog/src/cli.ts +0 -597
- package/references/sessionlog/src/commands/clean.ts +0 -133
- package/references/sessionlog/src/commands/disable.ts +0 -84
- package/references/sessionlog/src/commands/doctor.ts +0 -145
- package/references/sessionlog/src/commands/enable.ts +0 -202
- package/references/sessionlog/src/commands/explain.ts +0 -261
- package/references/sessionlog/src/commands/reset.ts +0 -105
- package/references/sessionlog/src/commands/resume.ts +0 -180
- package/references/sessionlog/src/commands/rewind.ts +0 -195
- package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
- package/references/sessionlog/src/commands/status.ts +0 -172
- package/references/sessionlog/src/config.ts +0 -165
- package/references/sessionlog/src/events/event-log.ts +0 -126
- package/references/sessionlog/src/git-operations.ts +0 -558
- package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
- package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
- package/references/sessionlog/src/index.ts +0 -650
- package/references/sessionlog/src/security/redaction.ts +0 -283
- package/references/sessionlog/src/session/state-machine.ts +0 -452
- package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
- package/references/sessionlog/src/store/native-store.ts +0 -173
- package/references/sessionlog/src/store/provider-types.ts +0 -99
- package/references/sessionlog/src/store/session-store.ts +0 -266
- package/references/sessionlog/src/strategy/attribution.ts +0 -296
- package/references/sessionlog/src/strategy/common.ts +0 -207
- package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
- package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
- package/references/sessionlog/src/strategy/types.ts +0 -279
- package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
- package/references/sessionlog/src/summarize/summarize.ts +0 -432
- package/references/sessionlog/src/types.ts +0 -508
- package/references/sessionlog/src/utils/chunk-files.ts +0 -49
- package/references/sessionlog/src/utils/commit-message.ts +0 -65
- package/references/sessionlog/src/utils/detect-agent.ts +0 -36
- package/references/sessionlog/src/utils/hook-managers.ts +0 -125
- package/references/sessionlog/src/utils/ide-tags.ts +0 -32
- package/references/sessionlog/src/utils/paths.ts +0 -79
- package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
- package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
- package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
- package/references/sessionlog/src/utils/string-utils.ts +0 -46
- package/references/sessionlog/src/utils/todo-extract.ts +0 -188
- package/references/sessionlog/src/utils/trailers.ts +0 -187
- package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
- package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
- package/references/sessionlog/src/utils/tree-ops.ts +0 -219
- package/references/sessionlog/src/utils/tty.ts +0 -72
- package/references/sessionlog/src/utils/validation.ts +0 -65
- package/references/sessionlog/src/utils/worktree.ts +0 -58
- package/references/sessionlog/src/wire-types.ts +0 -59
- package/references/sessionlog/templates/setup-env.sh +0 -153
- package/references/sessionlog/tsconfig.json +0 -18
- package/references/sessionlog/vitest.config.ts +0 -12
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -19
- package/references/skill-tree/.sudocode/specs.jsonl +0 -3
- package/references/skill-tree/CLAUDE.md +0 -126
- package/references/skill-tree/README.md +0 -372
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -164
- package/references/skill-tree/package-lock.json +0 -1852
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
|
-
import fsSync from "node:fs";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Debug function type for optional logging
|
|
8
|
-
*/
|
|
9
|
-
export type DebugFn = (message: string, data?: Record<string, unknown>) => void;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Log an error with context (for debugging).
|
|
13
|
-
* Only logs if a debug function is provided.
|
|
14
|
-
*
|
|
15
|
-
* @param context - A short identifier for where the error occurred
|
|
16
|
-
* @param error - The error object or message
|
|
17
|
-
* @param debug - Optional debug function to log to
|
|
18
|
-
*/
|
|
19
|
-
export function logError(
|
|
20
|
-
context: string,
|
|
21
|
-
error: unknown,
|
|
22
|
-
debug?: DebugFn
|
|
23
|
-
): void {
|
|
24
|
-
if (!debug) return;
|
|
25
|
-
|
|
26
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
27
|
-
debug(`[${context}] Error: ${message}`);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export type MemoryFileEntry = {
|
|
31
|
-
path: string;
|
|
32
|
-
absPath: string;
|
|
33
|
-
mtimeMs: number;
|
|
34
|
-
size: number;
|
|
35
|
-
hash: string;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
export type MemoryChunk = {
|
|
39
|
-
startLine: number;
|
|
40
|
-
endLine: number;
|
|
41
|
-
text: string;
|
|
42
|
-
hash: string;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Ensure a directory exists, creating it if necessary.
|
|
47
|
-
*
|
|
48
|
-
* @param dir - The directory path to ensure exists
|
|
49
|
-
* @param debug - Optional debug function for logging errors
|
|
50
|
-
* @returns The directory path
|
|
51
|
-
*/
|
|
52
|
-
export function ensureDir(dir: string, debug?: DebugFn): string {
|
|
53
|
-
try {
|
|
54
|
-
fsSync.mkdirSync(dir, { recursive: true });
|
|
55
|
-
} catch (error) {
|
|
56
|
-
// Only swallow EEXIST errors (directory already exists)
|
|
57
|
-
// Log other errors for debugging
|
|
58
|
-
const nodeError = error as NodeJS.ErrnoException;
|
|
59
|
-
if (nodeError.code !== "EEXIST") {
|
|
60
|
-
logError("ensureDir", error, debug);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return dir;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function normalizeRelPath(value: string): string {
|
|
67
|
-
const trimmed = value.trim().replace(/^[./]+/, "");
|
|
68
|
-
return trimmed.replace(/\\/g, "/");
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function isMemoryPath(relPath: string): boolean {
|
|
72
|
-
const normalized = normalizeRelPath(relPath);
|
|
73
|
-
if (!normalized) return false;
|
|
74
|
-
if (normalized === "MEMORY.md" || normalized === "memory.md") return true;
|
|
75
|
-
return normalized.startsWith("memory/");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
async function exists(filePath: string): Promise<boolean> {
|
|
79
|
-
try {
|
|
80
|
-
await fs.access(filePath);
|
|
81
|
-
return true;
|
|
82
|
-
} catch {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
async function walkDir(dir: string, files: string[]) {
|
|
88
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
89
|
-
for (const entry of entries) {
|
|
90
|
-
const full = path.join(dir, entry.name);
|
|
91
|
-
if (entry.isDirectory()) {
|
|
92
|
-
await walkDir(full, files);
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
if (!entry.isFile()) continue;
|
|
96
|
-
if (!entry.name.endsWith(".md")) continue;
|
|
97
|
-
files.push(full);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export async function listMemoryFiles(memoryDir: string): Promise<string[]> {
|
|
102
|
-
const result: string[] = [];
|
|
103
|
-
const memoryFile = path.join(memoryDir, "MEMORY.md");
|
|
104
|
-
const altMemoryFile = path.join(memoryDir, "memory.md");
|
|
105
|
-
const hasUpper = await exists(memoryFile);
|
|
106
|
-
const hasLower = await exists(altMemoryFile);
|
|
107
|
-
|
|
108
|
-
// Prevent ambiguity: both MEMORY.md and memory.md cannot coexist
|
|
109
|
-
// (unless they resolve to the same file on case-insensitive filesystems)
|
|
110
|
-
if (hasUpper && hasLower) {
|
|
111
|
-
let upperReal = memoryFile;
|
|
112
|
-
let lowerReal = altMemoryFile;
|
|
113
|
-
try { upperReal = await fs.realpath(memoryFile); } catch {}
|
|
114
|
-
try { lowerReal = await fs.realpath(altMemoryFile); } catch {}
|
|
115
|
-
if (upperReal !== lowerReal) {
|
|
116
|
-
throw new Error(
|
|
117
|
-
`Both MEMORY.md and memory.md exist in ${memoryDir}. ` +
|
|
118
|
-
`Please remove one to avoid ambiguity.`
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
// Same file (case-insensitive FS) — only include once
|
|
122
|
-
result.push(memoryFile);
|
|
123
|
-
} else if (hasUpper) {
|
|
124
|
-
result.push(memoryFile);
|
|
125
|
-
} else if (hasLower) {
|
|
126
|
-
result.push(altMemoryFile);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const memorySubDir = path.join(memoryDir, "memory");
|
|
130
|
-
if (await exists(memorySubDir)) {
|
|
131
|
-
await walkDir(memorySubDir, result);
|
|
132
|
-
}
|
|
133
|
-
if (result.length <= 1) return result;
|
|
134
|
-
const seen = new Set<string>();
|
|
135
|
-
const deduped: string[] = [];
|
|
136
|
-
for (const entry of result) {
|
|
137
|
-
let key = entry;
|
|
138
|
-
try {
|
|
139
|
-
key = await fs.realpath(entry);
|
|
140
|
-
} catch {}
|
|
141
|
-
if (seen.has(key)) continue;
|
|
142
|
-
seen.add(key);
|
|
143
|
-
deduped.push(entry);
|
|
144
|
-
}
|
|
145
|
-
return deduped;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function hashText(value: string): string {
|
|
149
|
-
return crypto.createHash("sha256").update(value).digest("hex");
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export async function buildFileEntry(
|
|
153
|
-
absPath: string,
|
|
154
|
-
memoryDir: string,
|
|
155
|
-
): Promise<MemoryFileEntry> {
|
|
156
|
-
const stat = await fs.stat(absPath);
|
|
157
|
-
const content = await fs.readFile(absPath, "utf-8");
|
|
158
|
-
const hash = hashText(content);
|
|
159
|
-
return {
|
|
160
|
-
path: path.relative(memoryDir, absPath).replace(/\\/g, "/"),
|
|
161
|
-
absPath,
|
|
162
|
-
mtimeMs: stat.mtimeMs,
|
|
163
|
-
size: stat.size,
|
|
164
|
-
hash,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Strip content between <private>...</private> tags.
|
|
170
|
-
* Replaces private blocks with the same number of empty lines to preserve line numbering.
|
|
171
|
-
*/
|
|
172
|
-
export function stripPrivateContent(content: string): string {
|
|
173
|
-
return content.replace(/<private>[\s\S]*?<\/private>/gi, (match) => {
|
|
174
|
-
const lineCount = match.split("\n").length;
|
|
175
|
-
return "\n".repeat(lineCount - 1);
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export function chunkMarkdown(
|
|
180
|
-
content: string,
|
|
181
|
-
chunking: { tokens: number; overlap: number },
|
|
182
|
-
): MemoryChunk[] {
|
|
183
|
-
const stripped = stripPrivateContent(content);
|
|
184
|
-
const lines = stripped.split("\n");
|
|
185
|
-
if (lines.length === 0) return [];
|
|
186
|
-
const maxChars = Math.max(32, chunking.tokens * 4);
|
|
187
|
-
const overlapChars = Math.max(0, chunking.overlap * 4);
|
|
188
|
-
const chunks: MemoryChunk[] = [];
|
|
189
|
-
|
|
190
|
-
let current: Array<{ line: string; lineNo: number }> = [];
|
|
191
|
-
let currentChars = 0;
|
|
192
|
-
|
|
193
|
-
const flush = () => {
|
|
194
|
-
if (current.length === 0) return;
|
|
195
|
-
const firstEntry = current[0];
|
|
196
|
-
const lastEntry = current[current.length - 1];
|
|
197
|
-
if (!firstEntry || !lastEntry) return;
|
|
198
|
-
const text = current.map((entry) => entry.line).join("\n");
|
|
199
|
-
const startLine = firstEntry.lineNo;
|
|
200
|
-
const endLine = lastEntry.lineNo;
|
|
201
|
-
chunks.push({
|
|
202
|
-
startLine,
|
|
203
|
-
endLine,
|
|
204
|
-
text,
|
|
205
|
-
hash: hashText(text),
|
|
206
|
-
});
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
const carryOverlap = () => {
|
|
210
|
-
if (overlapChars <= 0 || current.length === 0) {
|
|
211
|
-
current = [];
|
|
212
|
-
currentChars = 0;
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
let acc = 0;
|
|
216
|
-
const kept: Array<{ line: string; lineNo: number }> = [];
|
|
217
|
-
for (let i = current.length - 1; i >= 0; i -= 1) {
|
|
218
|
-
const entry = current[i];
|
|
219
|
-
if (!entry) continue;
|
|
220
|
-
acc += entry.line.length + 1;
|
|
221
|
-
kept.unshift(entry);
|
|
222
|
-
if (acc >= overlapChars) break;
|
|
223
|
-
}
|
|
224
|
-
current = kept;
|
|
225
|
-
currentChars = kept.reduce((sum, entry) => sum + entry.line.length + 1, 0);
|
|
226
|
-
};
|
|
227
|
-
|
|
228
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
229
|
-
const line = lines[i] ?? "";
|
|
230
|
-
const lineNo = i + 1;
|
|
231
|
-
const segments: string[] = [];
|
|
232
|
-
if (line.length === 0) {
|
|
233
|
-
segments.push("");
|
|
234
|
-
} else {
|
|
235
|
-
for (let start = 0; start < line.length; start += maxChars) {
|
|
236
|
-
segments.push(line.slice(start, start + maxChars));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
for (const segment of segments) {
|
|
240
|
-
const lineSize = segment.length + 1;
|
|
241
|
-
if (currentChars + lineSize > maxChars && current.length > 0) {
|
|
242
|
-
flush();
|
|
243
|
-
carryOverlap();
|
|
244
|
-
}
|
|
245
|
-
current.push({ line: segment, lineNo });
|
|
246
|
-
currentChars += lineSize;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
flush();
|
|
250
|
-
return chunks;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Extract metadata from a chunk's text content.
|
|
255
|
-
* Looks for HTML comments like <!-- type: decision --> in the chunk.
|
|
256
|
-
*/
|
|
257
|
-
export function extractChunkMetadata(text: string): { type?: string } {
|
|
258
|
-
const typeMatch = text.match(/<!--\s*type:\s*([\w-]+)\s*-->/i);
|
|
259
|
-
return typeMatch ? { type: typeMatch[1].toLowerCase() } : {};
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
export function parseEmbedding(raw: string): number[] {
|
|
263
|
-
try {
|
|
264
|
-
const parsed = JSON.parse(raw) as number[];
|
|
265
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
266
|
-
} catch {
|
|
267
|
-
return [];
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
export function cosineSimilarity(a: number[], b: number[]): number {
|
|
272
|
-
if (a.length === 0 || b.length === 0) return 0;
|
|
273
|
-
const len = Math.min(a.length, b.length);
|
|
274
|
-
let dot = 0;
|
|
275
|
-
let normA = 0;
|
|
276
|
-
let normB = 0;
|
|
277
|
-
for (let i = 0; i < len; i += 1) {
|
|
278
|
-
const av = a[i] ?? 0;
|
|
279
|
-
const bv = b[i] ?? 0;
|
|
280
|
-
dot += av * bv;
|
|
281
|
-
normA += av * av;
|
|
282
|
-
normB += bv * bv;
|
|
283
|
-
}
|
|
284
|
-
if (normA === 0 || normB === 0) return 0;
|
|
285
|
-
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
export function truncateUtf16Safe(text: string, maxChars: number): string {
|
|
289
|
-
if (text.length <= maxChars) return text;
|
|
290
|
-
return text.slice(0, maxChars);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Convert a numeric embedding vector to a Buffer suitable for sqlite-vec storage.
|
|
295
|
-
* Uses Float32 encoding, which is the format expected by sqlite-vec's vector functions.
|
|
296
|
-
*/
|
|
297
|
-
export function vectorToBlob(embedding: number[]): Buffer {
|
|
298
|
-
return Buffer.from(new Float32Array(embedding).buffer);
|
|
299
|
-
}
|