claude-memory-layer 1.0.30 → 1.0.32
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/README.md +12 -5
- package/dist/cli/index.js +4 -3
- package/dist/cli/index.js.map +2 -2
- package/dist/core/index.js +3 -2
- package/dist/core/index.js.map +2 -2
- package/dist/hooks/post-tool-use.js +3 -2
- package/dist/hooks/post-tool-use.js.map +2 -2
- package/dist/hooks/semantic-daemon.js +3 -2
- package/dist/hooks/semantic-daemon.js.map +2 -2
- package/dist/hooks/session-end.js +3 -2
- package/dist/hooks/session-end.js.map +2 -2
- package/dist/hooks/session-start.js +3 -2
- package/dist/hooks/session-start.js.map +2 -2
- package/dist/hooks/stop.js +3 -2
- package/dist/hooks/stop.js.map +2 -2
- package/dist/hooks/user-prompt-submit.js +3 -2
- package/dist/hooks/user-prompt-submit.js.map +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +2 -2
- package/dist/mcp/index.js +3 -2
- package/dist/mcp/index.js.map +2 -2
- package/dist/server/api/index.js +3 -2
- package/dist/server/api/index.js.map +2 -2
- package/dist/server/index.js +3 -2
- package/dist/server/index.js.map +2 -2
- package/dist/services/memory-service.js +3 -2
- package/dist/services/memory-service.js.map +2 -2
- package/package.json +10 -3
- package/scripts/postinstall-embedding-backend.cjs +18 -16
- package/AGENTS.md +0 -71
- package/CLAUDE.md +0 -30
- package/HANDOFF.md +0 -92
- package/Memo.txt +0 -558
- package/benchmarks/replay/anonymized-real-sessions.json +0 -48
- package/config/kpi-thresholds.json +0 -7
- package/context.md +0 -636
- package/docs/ARCHITECTURE_COMPARISON_AND_RECOMMENDATIONS.md +0 -627
- package/docs/HERMES_MEMORY_INGESTION_ANALYSIS.md +0 -440
- package/docs/MCP_MEMORY_SERVICE_COMPARATIVE_REVIEW.md +0 -271
- package/docs/MEMORY_USEFULNESS_AUDIT.md +0 -371
- package/docs/MEMORY_USEFULNESS_AUDIT_RAW.json +0 -80
- package/docs/MEMSEARCH_PROJECT_STRUCTURE_ANALYSIS.md +0 -333
- package/docs/MEMU_ADOPTION.md +0 -40
- package/docs/OPERATIONS.md +0 -18
- package/docs/PRODUCT_VALIDATION_MATRIX.md +0 -82
- package/docs/PROJECT_STRUCTURE_ANALYSIS.md +0 -421
- package/docs/REFACTORING_MILESTONES_AND_ISSUES.md +0 -501
- package/docs/REFACTORING_PLAN_THIN_CORE.md +0 -414
- package/docs/REFERENCE_PROJECT_ANALYSES.md +0 -25
- package/docs/SUPERLOCALMEMORY_PROJECT_STRUCTURE_ANALYSIS.md +0 -452
- package/docs/TARGET_ARCHITECTURE_AND_FOLDER_STRUCTURE.md +0 -446
- package/docs/architecture/comparison-index.md +0 -47
- package/docs/reports/codex-real-data-validation-20260505T040447Z.md +0 -46
- package/plan.md +0 -1642
- package/scripts/build.ts +0 -159
- package/scripts/bump-patch-version.sh +0 -18
- package/scripts/delete-unknown-projects.js +0 -154
- package/scripts/fix-sync-gap.js +0 -32
- package/scripts/generate-session-qrels.ts +0 -126
- package/scripts/heartbeat-memory-orchestrator.sh +0 -28
- package/scripts/replay-retrieval-benchmark.ts +0 -69
- package/scripts/report-sync-gap.js +0 -26
- package/scripts/review-queue-auto-resolve.js +0 -21
- package/scripts/sync-gap-auto-heal.sh +0 -17
- package/spec.md +0 -624
- package/specs/20260207-dashboard-upgrade/context.md +0 -38
- package/specs/20260207-dashboard-upgrade/spec.md +0 -96
- package/specs/citations-system/context.md +0 -243
- package/specs/citations-system/plan.md +0 -495
- package/specs/citations-system/spec.md +0 -371
- package/specs/endless-mode/context.md +0 -305
- package/specs/endless-mode/plan.md +0 -620
- package/specs/endless-mode/spec.md +0 -455
- package/specs/entity-edge-model/context.md +0 -401
- package/specs/entity-edge-model/plan.md +0 -459
- package/specs/entity-edge-model/spec.md +0 -391
- package/specs/evidence-aligner-v2/context.md +0 -401
- package/specs/evidence-aligner-v2/plan.md +0 -303
- package/specs/evidence-aligner-v2/spec.md +0 -312
- package/specs/mcp-desktop-integration/context.md +0 -278
- package/specs/mcp-desktop-integration/plan.md +0 -550
- package/specs/mcp-desktop-integration/spec.md +0 -494
- package/specs/memory-utilization-improvements/context.md +0 -145
- package/specs/memory-utilization-improvements/plan.md +0 -361
- package/specs/memory-utilization-improvements/spec.md +0 -361
- package/specs/post-tool-use-hook/context.md +0 -319
- package/specs/post-tool-use-hook/plan.md +0 -469
- package/specs/post-tool-use-hook/spec.md +0 -364
- package/specs/private-tags/context.md +0 -288
- package/specs/private-tags/plan.md +0 -412
- package/specs/private-tags/spec.md +0 -345
- package/specs/progressive-disclosure/context.md +0 -346
- package/specs/progressive-disclosure/plan.md +0 -663
- package/specs/progressive-disclosure/spec.md +0 -415
- package/specs/selective-tool-observation/context.md +0 -100
- package/specs/selective-tool-observation/plan.md +0 -158
- package/specs/selective-tool-observation/spec.md +0 -127
- package/specs/task-entity-system/context.md +0 -297
- package/specs/task-entity-system/plan.md +0 -301
- package/specs/task-entity-system/spec.md +0 -314
- package/specs/thin-core-refactor/context.md +0 -275
- package/specs/thin-core-refactor/plan.md +0 -536
- package/specs/thin-core-refactor/spec.md +0 -465
- package/specs/vector-outbox-v2/context.md +0 -470
- package/specs/vector-outbox-v2/plan.md +0 -562
- package/specs/vector-outbox-v2/spec.md +0 -466
- package/specs/web-viewer-ui/context.md +0 -384
- package/specs/web-viewer-ui/plan.md +0 -797
- package/specs/web-viewer-ui/spec.md +0 -516
- package/src/adapters/claude/capture/index.ts +0 -3
- package/src/adapters/claude/context/index.ts +0 -3
- package/src/adapters/claude/hooks/index.ts +0 -21
- package/src/adapters/claude/hooks/post-tool-use.ts +0 -239
- package/src/adapters/claude/hooks/prompt-injection-policy.ts +0 -104
- package/src/adapters/claude/hooks/semantic-daemon-client.ts +0 -209
- package/src/adapters/claude/hooks/semantic-daemon.ts +0 -283
- package/src/adapters/claude/hooks/session-end.ts +0 -59
- package/src/adapters/claude/hooks/session-start.ts +0 -73
- package/src/adapters/claude/hooks/stop.ts +0 -128
- package/src/adapters/claude/hooks/user-prompt-submit.ts +0 -361
- package/src/adapters/claude/index.ts +0 -4
- package/src/adapters/claude/transcript/index.ts +0 -4
- package/src/adapters/claude/transcript/transcript-reader.ts +0 -57
- package/src/adapters/claude/transcript/turn-reconstructor.ts +0 -65
- package/src/apps/cli/claude-settings-hooks.ts +0 -138
- package/src/apps/cli/codex-import-runner.ts +0 -125
- package/src/apps/cli/codex-validation-output.ts +0 -95
- package/src/apps/cli/hermes-import-runner.ts +0 -130
- package/src/apps/cli/hermes-validation-output.ts +0 -91
- package/src/apps/cli/index.ts +0 -1735
- package/src/apps/cli/mcp-install.ts +0 -106
- package/src/apps/cli/retrieval-disclosure-output.ts +0 -196
- package/src/apps/dashboard/assets/js/bootstrap.js +0 -244
- package/src/apps/dashboard/assets/js/chat.js +0 -373
- package/src/apps/dashboard/assets/js/disclosure.js +0 -232
- package/src/apps/dashboard/assets/js/modals.js +0 -298
- package/src/apps/dashboard/assets/js/overview.js +0 -655
- package/src/apps/dashboard/assets/js/state.js +0 -72
- package/src/apps/dashboard/assets/js/views.js +0 -468
- package/src/apps/dashboard/index.html +0 -543
- package/src/apps/dashboard/index.ts +0 -3
- package/src/apps/dashboard/style.css +0 -1750
- package/src/apps/index.ts +0 -5
- package/src/apps/server/api/chat.ts +0 -244
- package/src/apps/server/api/citations.ts +0 -105
- package/src/apps/server/api/events.ts +0 -137
- package/src/apps/server/api/health.ts +0 -53
- package/src/apps/server/api/index.ts +0 -26
- package/src/apps/server/api/projects.ts +0 -74
- package/src/apps/server/api/search.ts +0 -184
- package/src/apps/server/api/sessions.ts +0 -115
- package/src/apps/server/api/stats.ts +0 -723
- package/src/apps/server/api/turns.ts +0 -143
- package/src/apps/server/api/utils.ts +0 -65
- package/src/apps/server/index.ts +0 -111
- package/src/cli/index.ts +0 -3
- package/src/cli/retrieval-disclosure-output.ts +0 -2
- package/src/compat/index.ts +0 -5
- package/src/core/canonical-key.ts +0 -186
- package/src/core/citation-generator.ts +0 -63
- package/src/core/consolidated-store.ts +0 -356
- package/src/core/consolidation-worker.ts +0 -493
- package/src/core/context-formatter.ts +0 -276
- package/src/core/continuity-manager.ts +0 -341
- package/src/core/db-wrapper.ts +0 -64
- package/src/core/derive/fact-deriver.ts +0 -170
- package/src/core/derive/index.ts +0 -2
- package/src/core/derive/summary-deriver.ts +0 -76
- package/src/core/edge-repo.ts +0 -333
- package/src/core/embedder.ts +0 -4
- package/src/core/engine/embedding-maintenance-service.ts +0 -187
- package/src/core/engine/endless-memory-services.ts +0 -4
- package/src/core/engine/index.ts +0 -19
- package/src/core/engine/memory-engine-services.ts +0 -170
- package/src/core/engine/memory-ingest-service.ts +0 -317
- package/src/core/engine/memory-query-service.ts +0 -173
- package/src/core/engine/memory-runtime-service.ts +0 -162
- package/src/core/engine/memory-service-composition.ts +0 -231
- package/src/core/engine/retrieval-analytics-service.ts +0 -181
- package/src/core/engine/retrieval-disclosure-service.ts +0 -420
- package/src/core/engine/retrieval-orchestrator.ts +0 -377
- package/src/core/engine/retrieval-services.ts +0 -176
- package/src/core/engine/shared-memory-services.ts +0 -4
- package/src/core/entity-repo.ts +0 -349
- package/src/core/event-store.ts +0 -779
- package/src/core/evidence-aligner.ts +0 -635
- package/src/core/external-market-context.ts +0 -582
- package/src/core/graduation-worker.ts +0 -171
- package/src/core/graduation.ts +0 -377
- package/src/core/index.ts +0 -64
- package/src/core/ingest-interceptor.ts +0 -80
- package/src/core/markdown-mirror.ts +0 -70
- package/src/core/matcher.ts +0 -208
- package/src/core/md-mirror.ts +0 -92
- package/src/core/metadata-extractor.ts +0 -203
- package/src/core/model/memory-fact.ts +0 -30
- package/src/core/model/memory-rule.ts +0 -14
- package/src/core/model/memory-summary.ts +0 -21
- package/src/core/model/raw-event.ts +0 -28
- package/src/core/model/retrieval-result.ts +0 -35
- package/src/core/mongo-sync-config.ts +0 -165
- package/src/core/mongo-sync-worker.ts +0 -381
- package/src/core/privacy/filter.ts +0 -190
- package/src/core/privacy/index.ts +0 -20
- package/src/core/privacy/tag-parser.ts +0 -145
- package/src/core/product-validation-matrix.ts +0 -314
- package/src/core/progressive-retriever.ts +0 -414
- package/src/core/registry/project-path.ts +0 -54
- package/src/core/registry/session-registry.ts +0 -69
- package/src/core/replay-evaluator.ts +0 -625
- package/src/core/retrieval-benchmark.ts +0 -117
- package/src/core/retrieval-quality.ts +0 -109
- package/src/core/retriever.ts +0 -800
- package/src/core/session-qrels.ts +0 -360
- package/src/core/shared-event-store.ts +0 -114
- package/src/core/shared-promoter.ts +0 -249
- package/src/core/shared-store.ts +0 -289
- package/src/core/shared-vector-store.ts +0 -203
- package/src/core/sqlite-event-store.ts +0 -1846
- package/src/core/sqlite-wrapper.ts +0 -116
- package/src/core/sync-worker.ts +0 -228
- package/src/core/tag-taxonomy.ts +0 -51
- package/src/core/task/blocker-resolver.ts +0 -333
- package/src/core/task/index.ts +0 -9
- package/src/core/task/task-matcher.ts +0 -240
- package/src/core/task/task-projector.ts +0 -358
- package/src/core/task/task-resolver.ts +0 -421
- package/src/core/turn-state.ts +0 -207
- package/src/core/types.ts +0 -952
- package/src/core/vector-outbox.ts +0 -299
- package/src/core/vector-store.ts +0 -231
- package/src/core/vector-worker.ts +0 -521
- package/src/core/working-set-store.ts +0 -257
- package/src/extensions/endless-memory/endless-memory-services.ts +0 -350
- package/src/extensions/endless-memory/index.ts +0 -1
- package/src/extensions/index.ts +0 -5
- package/src/extensions/mcp/handlers.ts +0 -960
- package/src/extensions/mcp/index.ts +0 -48
- package/src/extensions/mcp/tools.ts +0 -252
- package/src/extensions/shared-memory/index.ts +0 -1
- package/src/extensions/shared-memory/shared-memory-services.ts +0 -211
- package/src/extensions/vector/embedder.ts +0 -233
- package/src/extensions/vector/index.ts +0 -1
- package/src/hooks/post-tool-use.ts +0 -9
- package/src/hooks/semantic-daemon-client.ts +0 -1
- package/src/hooks/semantic-daemon.ts +0 -11
- package/src/hooks/session-end.ts +0 -9
- package/src/hooks/session-start.ts +0 -9
- package/src/hooks/stop.ts +0 -9
- package/src/hooks/user-prompt-submit.ts +0 -9
- package/src/index.ts +0 -13
- package/src/mcp/handlers.ts +0 -2
- package/src/mcp/index.ts +0 -4
- package/src/mcp/tools.ts +0 -2
- package/src/server/api/chat.ts +0 -2
- package/src/server/api/citations.ts +0 -2
- package/src/server/api/events.ts +0 -2
- package/src/server/api/health.ts +0 -2
- package/src/server/api/index.ts +0 -2
- package/src/server/api/projects.ts +0 -2
- package/src/server/api/search.ts +0 -2
- package/src/server/api/sessions.ts +0 -2
- package/src/server/api/stats.ts +0 -2
- package/src/server/api/turns.ts +0 -2
- package/src/server/api/utils.ts +0 -2
- package/src/server/index.ts +0 -2
- package/src/services/bootstrap-organizer.ts +0 -463
- package/src/services/codex-session-history-importer.ts +0 -966
- package/src/services/hermes-session-history-importer.ts +0 -733
- package/src/services/memory-service-config.ts +0 -36
- package/src/services/memory-service-registry.ts +0 -150
- package/src/services/memory-service.ts +0 -688
- package/src/services/session-history-importer.ts +0 -629
- package/tests/README.md +0 -23
- package/tests/adapters/claude/claude-semantic-daemon-adapter.test.ts +0 -54
- package/tests/adapters/claude/claude-transcript-reconstructor.test.ts +0 -98
- package/tests/adapters/claude-hook-prompt-injection-policy.test.ts +0 -99
- package/tests/apps/app-layer-boundary.test.ts +0 -48
- package/tests/apps/claude-settings-hooks.test.ts +0 -107
- package/tests/apps/cli-disclosure-output.test.ts +0 -212
- package/tests/apps/codex-import-runner.test.ts +0 -99
- package/tests/apps/codex-validation-output.test.ts +0 -100
- package/tests/apps/hermes-import-runner.test.ts +0 -99
- package/tests/apps/mcp-install-command.test.ts +0 -59
- package/tests/apps/package-build-entrypoints.test.ts +0 -30
- package/tests/apps/postinstall-embedding-backend.test.ts +0 -175
- package/tests/apps/search-api-disclosure.test.ts +0 -162
- package/tests/apps/stats-api-lightweight.test.ts +0 -67
- package/tests/apps/ui-disclosure-output.test.ts +0 -140
- package/tests/core/bootstrap-organizer.test.ts +0 -111
- package/tests/core/canonical-key.test.ts +0 -101
- package/tests/core/codex-session-history-importer-validation.test.ts +0 -185
- package/tests/core/consolidation-worker.test.ts +0 -75
- package/tests/core/embedding-maintenance-service.test.ts +0 -282
- package/tests/core/evidence-aligner.test.ts +0 -152
- package/tests/core/external-market-context.test.ts +0 -209
- package/tests/core/fact-deriver.test.ts +0 -79
- package/tests/core/hermes-session-history-importer-validation.test.ts +0 -609
- package/tests/core/ingest-interceptor.test.ts +0 -38
- package/tests/core/markdown-mirror.test.ts +0 -85
- package/tests/core/matcher.test.ts +0 -112
- package/tests/core/md-mirror.test.ts +0 -50
- package/tests/core/memory-engine-services.test.ts +0 -240
- package/tests/core/memory-ingest-service.test.ts +0 -296
- package/tests/core/memory-query-service.test.ts +0 -129
- package/tests/core/memory-runtime-service.test.ts +0 -201
- package/tests/core/memory-service-composition.test.ts +0 -192
- package/tests/core/memory-service-config.test.ts +0 -41
- package/tests/core/memory-service-facade.test.ts +0 -30
- package/tests/core/memory-service-registry.test.ts +0 -206
- package/tests/core/product-validation-matrix.test.ts +0 -61
- package/tests/core/project-registry.test.ts +0 -78
- package/tests/core/replay-evaluator.test.ts +0 -181
- package/tests/core/retrieval-analytics-service.test.ts +0 -210
- package/tests/core/retrieval-benchmark.test.ts +0 -93
- package/tests/core/retrieval-disclosure-service.test.ts +0 -264
- package/tests/core/retrieval-orchestrator.test.ts +0 -403
- package/tests/core/retrieval-quality.test.ts +0 -31
- package/tests/core/retrieval-services.test.ts +0 -185
- package/tests/core/retriever-fallback-chain.test.ts +0 -223
- package/tests/core/retriever-strategy-scope.test.ts +0 -164
- package/tests/core/retriever.memu-adoption.test.ts +0 -122
- package/tests/core/session-history-importer-filter.test.ts +0 -78
- package/tests/core/session-qrels.test.ts +0 -250
- package/tests/core/sqlite-event-store-replication.test.ts +0 -127
- package/tests/core/summary-deriver.test.ts +0 -66
- package/tests/extensions/embedder-warning-suppression.test.ts +0 -83
- package/tests/extensions/endless-memory-extension-boundary.test.ts +0 -17
- package/tests/extensions/endless-memory-services.test.ts +0 -325
- package/tests/extensions/mcp-context-tools.test.ts +0 -905
- package/tests/extensions/mcp-extension-boundary.test.ts +0 -21
- package/tests/extensions/mcp-package-build.test.ts +0 -22
- package/tests/extensions/mcp-project-aware-tools.test.ts +0 -102
- package/tests/extensions/shared-memory-extension-boundary.test.ts +0 -24
- package/tests/extensions/shared-memory-services.test.ts +0 -309
- package/tests/extensions/vector-extension-boundary.test.ts +0 -21
- package/tsconfig.json +0 -24
- package/vitest.config.ts +0 -15
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
|
|
3
|
-
import type { MemoryEvent } from '../types.js';
|
|
4
|
-
import type { MemoryFact, MemoryFactType } from '../model/memory-fact.js';
|
|
5
|
-
|
|
6
|
-
export interface FactDerivationOptions {
|
|
7
|
-
/** Fallback project hash when the source event metadata does not carry scope.project.hash. */
|
|
8
|
-
projectHash?: string;
|
|
9
|
-
/** Optional current time hook for deterministic tests. */
|
|
10
|
-
now?: Date;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const DEFAULT_PROJECT_HASH = 'default';
|
|
14
|
-
const MAX_FACT_TEXT_LENGTH = 600;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Create a stable, rebuild-safe fact id for an event-derived fact.
|
|
18
|
-
*
|
|
19
|
-
* Format intentionally avoids UUID randomness so derived fact stores can be
|
|
20
|
-
* dropped and rebuilt without producing duplicate logical facts.
|
|
21
|
-
*/
|
|
22
|
-
export function makeEventDerivedFactId(
|
|
23
|
-
eventId: string,
|
|
24
|
-
factType: MemoryFactType,
|
|
25
|
-
ordinal = 0
|
|
26
|
-
): string {
|
|
27
|
-
const digest = createHash('sha1')
|
|
28
|
-
.update(`${eventId}:${factType}:${ordinal}`)
|
|
29
|
-
.digest('hex')
|
|
30
|
-
.slice(0, 16);
|
|
31
|
-
|
|
32
|
-
return `fact:event:${eventId}:${factType}:${ordinal}:${digest}`;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export class FactDeriver {
|
|
36
|
-
deriveFromEvent(event: MemoryEvent, options: FactDerivationOptions = {}): MemoryFact[] {
|
|
37
|
-
const text = this.toFactText(event);
|
|
38
|
-
if (!text) return [];
|
|
39
|
-
|
|
40
|
-
const factType = this.inferFactType(event);
|
|
41
|
-
const now = (options.now ?? new Date()).toISOString();
|
|
42
|
-
const metadata = this.asRecord(event.metadata);
|
|
43
|
-
const projectHash = this.getProjectHash(metadata) ?? options.projectHash ?? DEFAULT_PROJECT_HASH;
|
|
44
|
-
const tags = this.getTags(metadata);
|
|
45
|
-
|
|
46
|
-
return [{
|
|
47
|
-
factId: makeEventDerivedFactId(event.id, factType),
|
|
48
|
-
projectHash,
|
|
49
|
-
factType,
|
|
50
|
-
text,
|
|
51
|
-
derivedFromEventIds: [event.id],
|
|
52
|
-
sourceKind: this.getSourceKind(event),
|
|
53
|
-
confidence: this.getConfidence(event),
|
|
54
|
-
importance: this.getImportance(event),
|
|
55
|
-
tags,
|
|
56
|
-
...(this.getFileRefs(metadata).length > 0 ? { fileRefs: this.getFileRefs(metadata) } : {}),
|
|
57
|
-
createdAt: now,
|
|
58
|
-
updatedAt: now
|
|
59
|
-
}];
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private toFactText(event: MemoryEvent): string | null {
|
|
63
|
-
const content = event.content.trim().replace(/\s+/g, ' ');
|
|
64
|
-
if (!content) return null;
|
|
65
|
-
|
|
66
|
-
const clipped = content.length > MAX_FACT_TEXT_LENGTH
|
|
67
|
-
? `${content.slice(0, MAX_FACT_TEXT_LENGTH - 1)}…`
|
|
68
|
-
: content;
|
|
69
|
-
|
|
70
|
-
switch (event.eventType) {
|
|
71
|
-
case 'user_prompt':
|
|
72
|
-
return `User asked: ${clipped}`;
|
|
73
|
-
case 'agent_response':
|
|
74
|
-
return `Assistant responded: ${clipped}`;
|
|
75
|
-
case 'session_summary':
|
|
76
|
-
return `Session summary: ${clipped}`;
|
|
77
|
-
case 'tool_observation': {
|
|
78
|
-
const metadata = this.asRecord(event.metadata);
|
|
79
|
-
const toolName = typeof metadata.toolName === 'string' ? metadata.toolName : 'unknown_tool';
|
|
80
|
-
const success = typeof metadata.success === 'boolean'
|
|
81
|
-
? metadata.success
|
|
82
|
-
: undefined;
|
|
83
|
-
const status = success === undefined ? '' : success ? ' succeeded' : ' failed';
|
|
84
|
-
return `Tool ${toolName}${status}: ${clipped}`;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private inferFactType(event: MemoryEvent): MemoryFactType {
|
|
90
|
-
if (event.eventType === 'tool_observation') return 'tool_observation';
|
|
91
|
-
if (event.eventType === 'session_summary') return 'summary_fact';
|
|
92
|
-
|
|
93
|
-
const content = event.content.toLowerCase();
|
|
94
|
-
if (/\b(decided|decision|선택|결정)\b/.test(content)) return 'decision';
|
|
95
|
-
if (/\b(must|should not|constraint|requirement|제약|필수|금지)\b/.test(content)) return 'constraint';
|
|
96
|
-
if (/\b(todo|task|next|pending|해야|작업|진행)\b/.test(content)) return 'task_state';
|
|
97
|
-
if (/\b(prefer|preference|선호)\b/.test(content)) return 'preference';
|
|
98
|
-
if (/\b(src\/|tests\/|\.ts|\.tsx|\.js|\.py|function|class)\b/.test(content)) return 'code_context';
|
|
99
|
-
|
|
100
|
-
return 'task_state';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
private getSourceKind(event: MemoryEvent): MemoryFact['sourceKind'] {
|
|
104
|
-
switch (event.eventType) {
|
|
105
|
-
case 'user_prompt':
|
|
106
|
-
return 'prompt';
|
|
107
|
-
case 'agent_response':
|
|
108
|
-
case 'session_summary':
|
|
109
|
-
return 'assistant';
|
|
110
|
-
case 'tool_observation':
|
|
111
|
-
return 'tool';
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
private getConfidence(event: MemoryEvent): number {
|
|
116
|
-
switch (event.eventType) {
|
|
117
|
-
case 'session_summary':
|
|
118
|
-
return 0.8;
|
|
119
|
-
case 'tool_observation':
|
|
120
|
-
return 0.75;
|
|
121
|
-
case 'agent_response':
|
|
122
|
-
return 0.7;
|
|
123
|
-
case 'user_prompt':
|
|
124
|
-
return 0.65;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
private getImportance(event: MemoryEvent): number {
|
|
129
|
-
const metadata = this.asRecord(event.metadata);
|
|
130
|
-
const importance = metadata.importance;
|
|
131
|
-
if (typeof importance === 'number' && Number.isFinite(importance)) {
|
|
132
|
-
return Math.max(0, Math.min(1, importance));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (event.eventType === 'session_summary') return 0.8;
|
|
136
|
-
if (event.eventType === 'tool_observation') return 0.6;
|
|
137
|
-
return 0.5;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private getProjectHash(metadata: Record<string, unknown>): string | undefined {
|
|
141
|
-
const scope = this.asRecord(metadata.scope);
|
|
142
|
-
const project = this.asRecord(scope.project);
|
|
143
|
-
return typeof project.hash === 'string' && project.hash.length > 0
|
|
144
|
-
? project.hash
|
|
145
|
-
: undefined;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
private getTags(metadata: Record<string, unknown>): string[] {
|
|
149
|
-
return Array.isArray(metadata.tags)
|
|
150
|
-
? metadata.tags.filter((tag): tag is string => typeof tag === 'string' && tag.length > 0)
|
|
151
|
-
: [];
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
private getFileRefs(metadata: Record<string, unknown>): string[] {
|
|
155
|
-
const refs = metadata.fileRefs ?? metadata.files;
|
|
156
|
-
return Array.isArray(refs)
|
|
157
|
-
? refs.filter((ref): ref is string => typeof ref === 'string' && ref.length > 0)
|
|
158
|
-
: [];
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
private asRecord(value: unknown): Record<string, unknown> {
|
|
162
|
-
return value && typeof value === 'object' && !Array.isArray(value)
|
|
163
|
-
? value as Record<string, unknown>
|
|
164
|
-
: {};
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export function createFactDeriver(): FactDeriver {
|
|
169
|
-
return new FactDeriver();
|
|
170
|
-
}
|
package/src/core/derive/index.ts
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type { MemoryEvent } from '../types.js';
|
|
2
|
-
|
|
3
|
-
export interface SessionSummaryDerivation {
|
|
4
|
-
text: string;
|
|
5
|
-
metadata: {
|
|
6
|
-
generated: 'rule-based';
|
|
7
|
-
eventCount: number;
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const MAX_FIRST_PROMPT_LENGTH = 120;
|
|
12
|
-
const MAX_TOOL_NAMES = 6;
|
|
13
|
-
|
|
14
|
-
export class SummaryDeriver {
|
|
15
|
-
/**
|
|
16
|
-
* Derive the current lightweight rule-based session summary from raw events.
|
|
17
|
-
*
|
|
18
|
-
* The deriver is intentionally pure: callers own persistence and lifecycle
|
|
19
|
-
* orchestration, while this class owns summary text and metadata decisions.
|
|
20
|
-
*/
|
|
21
|
-
deriveSessionSummary(events: MemoryEvent[]): SessionSummaryDerivation | null {
|
|
22
|
-
if (events.length < 3) return null;
|
|
23
|
-
if (events.some((event) => event.eventType === 'session_summary')) return null;
|
|
24
|
-
|
|
25
|
-
const prompts = events.filter((event) => event.eventType === 'user_prompt');
|
|
26
|
-
const toolObservations = events.filter((event) => event.eventType === 'tool_observation');
|
|
27
|
-
const toolNames = Array.from(new Set(
|
|
28
|
-
toolObservations
|
|
29
|
-
.map((event) => this.asRecord(event.metadata).toolName)
|
|
30
|
-
.filter((toolName): toolName is string => typeof toolName === 'string' && toolName.length > 0)
|
|
31
|
-
));
|
|
32
|
-
const errorObservations = toolObservations.filter((event) => this.isErrorObservation(event));
|
|
33
|
-
|
|
34
|
-
const datePart = events[0].timestamp.toISOString().split('T')[0];
|
|
35
|
-
const parts: string[] = [`[${datePart}] ${prompts.length}턴 세션`];
|
|
36
|
-
|
|
37
|
-
if (prompts.length > 0) {
|
|
38
|
-
parts.push(`주요 작업: ${this.firstPromptPreview(prompts[0].content)}`);
|
|
39
|
-
}
|
|
40
|
-
if (toolNames.length > 0) {
|
|
41
|
-
parts.push(`사용 툴: ${toolNames.slice(0, MAX_TOOL_NAMES).join(', ')}`);
|
|
42
|
-
}
|
|
43
|
-
if (errorObservations.length > 0) {
|
|
44
|
-
parts.push(`오류 ${errorObservations.length}건 발생`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
text: parts.join('. '),
|
|
49
|
-
metadata: { generated: 'rule-based', eventCount: events.length }
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private firstPromptPreview(content: string): string {
|
|
54
|
-
return content.slice(0, MAX_FIRST_PROMPT_LENGTH).replace(/\r?\n/g, ' ');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private isErrorObservation(event: MemoryEvent): boolean {
|
|
58
|
-
const metadata = this.asRecord(event.metadata);
|
|
59
|
-
|
|
60
|
-
if (metadata.exitCode !== undefined) {
|
|
61
|
-
return metadata.exitCode !== 0;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return metadata.success === false;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private asRecord(value: unknown): Record<string, unknown> {
|
|
68
|
-
return value && typeof value === 'object' && !Array.isArray(value)
|
|
69
|
-
? value as Record<string, unknown>
|
|
70
|
-
: {};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function createSummaryDeriver(): SummaryDeriver {
|
|
75
|
-
return new SummaryDeriver();
|
|
76
|
-
}
|
package/src/core/edge-repo.ts
DELETED
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Edge Repository - CRUD operations for entity/entry relationships
|
|
3
|
-
* AXIOMMIND Entity-Edge Model
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';
|
|
7
|
-
import { randomUUID } from 'crypto';
|
|
8
|
-
import type { Edge, NodeType, RelationType } from './types.js';
|
|
9
|
-
|
|
10
|
-
export interface CreateEdgeInput {
|
|
11
|
-
srcType: NodeType;
|
|
12
|
-
srcId: string;
|
|
13
|
-
relType: RelationType;
|
|
14
|
-
dstType: NodeType;
|
|
15
|
-
dstId: string;
|
|
16
|
-
metaJson?: Record<string, unknown>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class EdgeRepo {
|
|
20
|
-
constructor(private db: Database) {}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Create a new edge (idempotent - ignores duplicates)
|
|
24
|
-
*/
|
|
25
|
-
async create(input: CreateEdgeInput): Promise<Edge> {
|
|
26
|
-
const edgeId = randomUUID();
|
|
27
|
-
const now = new Date();
|
|
28
|
-
|
|
29
|
-
await dbRun(
|
|
30
|
-
this.db,
|
|
31
|
-
`INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json, created_at)
|
|
32
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
33
|
-
ON CONFLICT DO NOTHING`,
|
|
34
|
-
[
|
|
35
|
-
edgeId,
|
|
36
|
-
input.srcType,
|
|
37
|
-
input.srcId,
|
|
38
|
-
input.relType,
|
|
39
|
-
input.dstType,
|
|
40
|
-
input.dstId,
|
|
41
|
-
JSON.stringify(input.metaJson ?? {}),
|
|
42
|
-
now.toISOString()
|
|
43
|
-
]
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
return {
|
|
47
|
-
edgeId,
|
|
48
|
-
srcType: input.srcType,
|
|
49
|
-
srcId: input.srcId,
|
|
50
|
-
relType: input.relType,
|
|
51
|
-
dstType: input.dstType,
|
|
52
|
-
dstId: input.dstId,
|
|
53
|
-
metaJson: input.metaJson,
|
|
54
|
-
createdAt: now
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Create or update edge
|
|
60
|
-
*/
|
|
61
|
-
async upsert(input: CreateEdgeInput): Promise<Edge> {
|
|
62
|
-
// Check for existing edge
|
|
63
|
-
const existing = await this.findByEndpoints(
|
|
64
|
-
input.srcType,
|
|
65
|
-
input.srcId,
|
|
66
|
-
input.relType,
|
|
67
|
-
input.dstType,
|
|
68
|
-
input.dstId
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
if (existing) {
|
|
72
|
-
// Update meta_json
|
|
73
|
-
await dbRun(
|
|
74
|
-
this.db,
|
|
75
|
-
`UPDATE edges SET meta_json = ? WHERE edge_id = ?`,
|
|
76
|
-
[JSON.stringify(input.metaJson ?? {}), existing.edgeId]
|
|
77
|
-
);
|
|
78
|
-
return { ...existing, metaJson: input.metaJson };
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return this.create(input);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Find edge by endpoints
|
|
86
|
-
*/
|
|
87
|
-
async findByEndpoints(
|
|
88
|
-
srcType: NodeType,
|
|
89
|
-
srcId: string,
|
|
90
|
-
relType: RelationType,
|
|
91
|
-
dstType: NodeType,
|
|
92
|
-
dstId: string
|
|
93
|
-
): Promise<Edge | null> {
|
|
94
|
-
const rows = await dbAll<Record<string, unknown>>(
|
|
95
|
-
this.db,
|
|
96
|
-
`SELECT * FROM edges
|
|
97
|
-
WHERE src_type = ? AND src_id = ? AND rel_type = ?
|
|
98
|
-
AND dst_type = ? AND dst_id = ?`,
|
|
99
|
-
[srcType, srcId, relType, dstType, dstId]
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
if (rows.length === 0) return null;
|
|
103
|
-
return this.rowToEdge(rows[0]);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Find edges by source
|
|
108
|
-
*/
|
|
109
|
-
async findBySrc(
|
|
110
|
-
srcId: string,
|
|
111
|
-
relType?: RelationType
|
|
112
|
-
): Promise<Edge[]> {
|
|
113
|
-
let query = `SELECT * FROM edges WHERE src_id = ?`;
|
|
114
|
-
const params: unknown[] = [srcId];
|
|
115
|
-
|
|
116
|
-
if (relType) {
|
|
117
|
-
query += ` AND rel_type = ?`;
|
|
118
|
-
params.push(relType);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
query += ` ORDER BY created_at DESC`;
|
|
122
|
-
|
|
123
|
-
const rows = await dbAll<Record<string, unknown>>(this.db, query, params);
|
|
124
|
-
return rows.map(row => this.rowToEdge(row));
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Find edges by destination
|
|
129
|
-
*/
|
|
130
|
-
async findByDst(
|
|
131
|
-
dstId: string,
|
|
132
|
-
relType?: RelationType
|
|
133
|
-
): Promise<Edge[]> {
|
|
134
|
-
let query = `SELECT * FROM edges WHERE dst_id = ?`;
|
|
135
|
-
const params: unknown[] = [dstId];
|
|
136
|
-
|
|
137
|
-
if (relType) {
|
|
138
|
-
query += ` AND rel_type = ?`;
|
|
139
|
-
params.push(relType);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
query += ` ORDER BY created_at DESC`;
|
|
143
|
-
|
|
144
|
-
const rows = await dbAll<Record<string, unknown>>(this.db, query, params);
|
|
145
|
-
return rows.map(row => this.rowToEdge(row));
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Find all edges for a node (both directions)
|
|
150
|
-
*/
|
|
151
|
-
async findByNode(nodeId: string): Promise<{ outgoing: Edge[]; incoming: Edge[] }> {
|
|
152
|
-
const outgoing = await this.findBySrc(nodeId);
|
|
153
|
-
const incoming = await this.findByDst(nodeId);
|
|
154
|
-
return { outgoing, incoming };
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Delete edge by ID
|
|
159
|
-
*/
|
|
160
|
-
async delete(edgeId: string): Promise<boolean> {
|
|
161
|
-
await dbRun(
|
|
162
|
-
this.db,
|
|
163
|
-
`DELETE FROM edges WHERE edge_id = ?`,
|
|
164
|
-
[edgeId]
|
|
165
|
-
);
|
|
166
|
-
return true; // DuckDB doesn't return affected rows easily
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Delete edges by source and relation type
|
|
171
|
-
*/
|
|
172
|
-
async deleteBySrcAndRel(srcId: string, relType: RelationType): Promise<number> {
|
|
173
|
-
await dbRun(
|
|
174
|
-
this.db,
|
|
175
|
-
`DELETE FROM edges WHERE src_id = ? AND rel_type = ?`,
|
|
176
|
-
[srcId, relType]
|
|
177
|
-
);
|
|
178
|
-
return 0; // DuckDB doesn't return affected rows easily
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Delete edges by destination and relation type
|
|
183
|
-
*/
|
|
184
|
-
async deleteByDstAndRel(dstId: string, relType: RelationType): Promise<number> {
|
|
185
|
-
await dbRun(
|
|
186
|
-
this.db,
|
|
187
|
-
`DELETE FROM edges WHERE dst_id = ? AND rel_type = ?`,
|
|
188
|
-
[dstId, relType]
|
|
189
|
-
);
|
|
190
|
-
return 0;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Replace edges for a source and relation type
|
|
195
|
-
* Used for mode=replace in task_blockers_set
|
|
196
|
-
*/
|
|
197
|
-
async replaceEdges(
|
|
198
|
-
srcId: string,
|
|
199
|
-
relType: RelationType,
|
|
200
|
-
newEdges: Omit<CreateEdgeInput, 'srcId' | 'relType'>[]
|
|
201
|
-
): Promise<Edge[]> {
|
|
202
|
-
// Delete existing edges
|
|
203
|
-
await this.deleteBySrcAndRel(srcId, relType);
|
|
204
|
-
|
|
205
|
-
// Create new edges
|
|
206
|
-
const created: Edge[] = [];
|
|
207
|
-
for (const edge of newEdges) {
|
|
208
|
-
const newEdge = await this.create({
|
|
209
|
-
srcType: edge.srcType,
|
|
210
|
-
srcId,
|
|
211
|
-
relType,
|
|
212
|
-
dstType: edge.dstType,
|
|
213
|
-
dstId: edge.dstId,
|
|
214
|
-
metaJson: edge.metaJson
|
|
215
|
-
});
|
|
216
|
-
created.push(newEdge);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return created;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Get effective blockers (resolving condition → task)
|
|
224
|
-
* Returns resolved blocker if condition has resolves_to edge
|
|
225
|
-
*/
|
|
226
|
-
async getEffectiveBlockers(taskId: string): Promise<Array<{
|
|
227
|
-
originalId: string;
|
|
228
|
-
effectiveId: string;
|
|
229
|
-
isResolved: boolean;
|
|
230
|
-
}>> {
|
|
231
|
-
const blockerEdges = await this.findBySrc(taskId, 'blocked_by');
|
|
232
|
-
const results: Array<{
|
|
233
|
-
originalId: string;
|
|
234
|
-
effectiveId: string;
|
|
235
|
-
isResolved: boolean;
|
|
236
|
-
}> = [];
|
|
237
|
-
|
|
238
|
-
for (const edge of blockerEdges) {
|
|
239
|
-
// Check if blocker has resolves_to edge
|
|
240
|
-
const resolvesTo = await dbAll<Record<string, unknown>>(
|
|
241
|
-
this.db,
|
|
242
|
-
`SELECT dst_id FROM edges
|
|
243
|
-
WHERE src_id = ? AND rel_type = 'resolves_to'
|
|
244
|
-
LIMIT 1`,
|
|
245
|
-
[edge.dstId]
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
if (resolvesTo.length > 0) {
|
|
249
|
-
results.push({
|
|
250
|
-
originalId: edge.dstId,
|
|
251
|
-
effectiveId: resolvesTo[0].dst_id as string,
|
|
252
|
-
isResolved: true
|
|
253
|
-
});
|
|
254
|
-
} else {
|
|
255
|
-
results.push({
|
|
256
|
-
originalId: edge.dstId,
|
|
257
|
-
effectiveId: edge.dstId,
|
|
258
|
-
isResolved: false
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
return results;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Find 2-hop related entries (Entry → Entity → Entry)
|
|
268
|
-
*/
|
|
269
|
-
async findRelatedEntries(entryId: string): Promise<Array<{
|
|
270
|
-
entryId: string;
|
|
271
|
-
viaEntityId: string;
|
|
272
|
-
relationPath: string;
|
|
273
|
-
}>> {
|
|
274
|
-
const rows = await dbAll<Record<string, unknown>>(
|
|
275
|
-
this.db,
|
|
276
|
-
`WITH first_hop AS (
|
|
277
|
-
SELECT e1.dst_id AS entity_id
|
|
278
|
-
FROM edges e1
|
|
279
|
-
WHERE e1.src_type = 'entry'
|
|
280
|
-
AND e1.rel_type = 'evidence_of'
|
|
281
|
-
AND e1.src_id = ?
|
|
282
|
-
)
|
|
283
|
-
SELECT
|
|
284
|
-
e2.src_id AS entry_id,
|
|
285
|
-
f.entity_id AS via_entity_id,
|
|
286
|
-
'evidence_of→evidence_of' AS relation_path
|
|
287
|
-
FROM first_hop f
|
|
288
|
-
JOIN edges e2 ON e2.dst_id = f.entity_id
|
|
289
|
-
AND e2.rel_type = 'evidence_of'
|
|
290
|
-
AND e2.src_type = 'entry'
|
|
291
|
-
WHERE e2.src_id != ?`,
|
|
292
|
-
[entryId, entryId]
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
return rows.map(row => ({
|
|
296
|
-
entryId: row.entry_id as string,
|
|
297
|
-
viaEntityId: row.via_entity_id as string,
|
|
298
|
-
relationPath: row.relation_path as string
|
|
299
|
-
}));
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Count edges by relation type
|
|
304
|
-
*/
|
|
305
|
-
async countByRelType(): Promise<Array<{ relType: string; count: number }>> {
|
|
306
|
-
const rows = await dbAll<{ rel_type: string; count: number }>(
|
|
307
|
-
this.db,
|
|
308
|
-
`SELECT rel_type, COUNT(*) as count FROM edges GROUP BY rel_type`
|
|
309
|
-
);
|
|
310
|
-
return rows.map(row => ({
|
|
311
|
-
relType: row.rel_type,
|
|
312
|
-
count: Number(row.count)
|
|
313
|
-
}));
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Convert database row to Edge
|
|
318
|
-
*/
|
|
319
|
-
private rowToEdge(row: Record<string, unknown>): Edge {
|
|
320
|
-
return {
|
|
321
|
-
edgeId: row.edge_id as string,
|
|
322
|
-
srcType: row.src_type as NodeType,
|
|
323
|
-
srcId: row.src_id as string,
|
|
324
|
-
relType: row.rel_type as RelationType,
|
|
325
|
-
dstType: row.dst_type as NodeType,
|
|
326
|
-
dstId: row.dst_id as string,
|
|
327
|
-
metaJson: typeof row.meta_json === 'string'
|
|
328
|
-
? JSON.parse(row.meta_json)
|
|
329
|
-
: row.meta_json as Record<string, unknown> | undefined,
|
|
330
|
-
createdAt: toDate(row.created_at)
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
}
|
package/src/core/embedder.ts
DELETED