@andre.li/memoark 0.3.1
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/LICENSE +191 -0
- package/README.en.md +606 -0
- package/README.md +560 -0
- package/bin/memoark.mjs +36 -0
- package/dist/adapters/file.d.ts +19 -0
- package/dist/adapters/file.d.ts.map +1 -0
- package/dist/adapters/file.js +61 -0
- package/dist/adapters/file.js.map +1 -0
- package/dist/adapters/gbrain.d.ts +29 -0
- package/dist/adapters/gbrain.d.ts.map +1 -0
- package/dist/adapters/gbrain.js +622 -0
- package/dist/adapters/gbrain.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +5 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/registry.d.ts +18 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +18 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/stdout.d.ts +12 -0
- package/dist/adapters/stdout.d.ts.map +1 -0
- package/dist/adapters/stdout.js +29 -0
- package/dist/adapters/stdout.js.map +1 -0
- package/dist/adapters/store.d.ts +47 -0
- package/dist/adapters/store.d.ts.map +1 -0
- package/dist/adapters/store.js +641 -0
- package/dist/adapters/store.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +694 -0
- package/dist/cli.js.map +1 -0
- package/dist/collectors/agent/claude-code.d.ts +12 -0
- package/dist/collectors/agent/claude-code.d.ts.map +1 -0
- package/dist/collectors/agent/claude-code.js +94 -0
- package/dist/collectors/agent/claude-code.js.map +1 -0
- package/dist/collectors/agent/codex.d.ts +16 -0
- package/dist/collectors/agent/codex.d.ts.map +1 -0
- package/dist/collectors/agent/codex.js +149 -0
- package/dist/collectors/agent/codex.js.map +1 -0
- package/dist/collectors/agent/collector.d.ts +20 -0
- package/dist/collectors/agent/collector.d.ts.map +1 -0
- package/dist/collectors/agent/collector.js +108 -0
- package/dist/collectors/agent/collector.js.map +1 -0
- package/dist/collectors/agent/hermes.d.ts +13 -0
- package/dist/collectors/agent/hermes.d.ts.map +1 -0
- package/dist/collectors/agent/hermes.js +90 -0
- package/dist/collectors/agent/hermes.js.map +1 -0
- package/dist/collectors/agent/index.d.ts +6 -0
- package/dist/collectors/agent/index.d.ts.map +1 -0
- package/dist/collectors/agent/index.js +5 -0
- package/dist/collectors/agent/index.js.map +1 -0
- package/dist/collectors/agent/types.d.ts +61 -0
- package/dist/collectors/agent/types.d.ts.map +1 -0
- package/dist/collectors/agent/types.js +6 -0
- package/dist/collectors/agent/types.js.map +1 -0
- package/dist/collectors/feishu/auth.d.ts +13 -0
- package/dist/collectors/feishu/auth.d.ts.map +1 -0
- package/dist/collectors/feishu/auth.js +72 -0
- package/dist/collectors/feishu/auth.js.map +1 -0
- package/dist/collectors/feishu/collector.d.ts +23 -0
- package/dist/collectors/feishu/collector.d.ts.map +1 -0
- package/dist/collectors/feishu/collector.js +113 -0
- package/dist/collectors/feishu/collector.js.map +1 -0
- package/dist/collectors/feishu/cursor-staging.d.ts +11 -0
- package/dist/collectors/feishu/cursor-staging.d.ts.map +1 -0
- package/dist/collectors/feishu/cursor-staging.js +37 -0
- package/dist/collectors/feishu/cursor-staging.js.map +1 -0
- package/dist/collectors/feishu/http-client.d.ts +26 -0
- package/dist/collectors/feishu/http-client.d.ts.map +1 -0
- package/dist/collectors/feishu/http-client.js +94 -0
- package/dist/collectors/feishu/http-client.js.map +1 -0
- package/dist/collectors/feishu/index.d.ts +3 -0
- package/dist/collectors/feishu/index.d.ts.map +1 -0
- package/dist/collectors/feishu/index.js +2 -0
- package/dist/collectors/feishu/index.js.map +1 -0
- package/dist/collectors/feishu/lark-cli-client.d.ts +16 -0
- package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -0
- package/dist/collectors/feishu/lark-cli-client.js +69 -0
- package/dist/collectors/feishu/lark-cli-client.js.map +1 -0
- package/dist/collectors/feishu/rate-limiter.d.ts +10 -0
- package/dist/collectors/feishu/rate-limiter.d.ts.map +1 -0
- package/dist/collectors/feishu/rate-limiter.js +33 -0
- package/dist/collectors/feishu/rate-limiter.js.map +1 -0
- package/dist/collectors/feishu/sources/base.d.ts +9 -0
- package/dist/collectors/feishu/sources/base.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/base.js +2 -0
- package/dist/collectors/feishu/sources/base.js.map +1 -0
- package/dist/collectors/feishu/sources/calendar.d.ts +16 -0
- package/dist/collectors/feishu/sources/calendar.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/calendar.js +93 -0
- package/dist/collectors/feishu/sources/calendar.js.map +1 -0
- package/dist/collectors/feishu/sources/dm.d.ts +28 -0
- package/dist/collectors/feishu/sources/dm.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/dm.js +152 -0
- package/dist/collectors/feishu/sources/dm.js.map +1 -0
- package/dist/collectors/feishu/sources/docs.d.ts +23 -0
- package/dist/collectors/feishu/sources/docs.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/docs.js +154 -0
- package/dist/collectors/feishu/sources/docs.js.map +1 -0
- package/dist/collectors/feishu/sources/mail.d.ts +27 -0
- package/dist/collectors/feishu/sources/mail.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/mail.js +136 -0
- package/dist/collectors/feishu/sources/mail.js.map +1 -0
- package/dist/collectors/feishu/sources/message-search.d.ts +37 -0
- package/dist/collectors/feishu/sources/message-search.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/message-search.js +140 -0
- package/dist/collectors/feishu/sources/message-search.js.map +1 -0
- package/dist/collectors/feishu/sources/messages.d.ts +26 -0
- package/dist/collectors/feishu/sources/messages.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/messages.js +148 -0
- package/dist/collectors/feishu/sources/messages.js.map +1 -0
- package/dist/collectors/feishu/sources/tasks.d.ts +15 -0
- package/dist/collectors/feishu/sources/tasks.d.ts.map +1 -0
- package/dist/collectors/feishu/sources/tasks.js +74 -0
- package/dist/collectors/feishu/sources/tasks.js.map +1 -0
- package/dist/collectors/feishu/types.d.ts +224 -0
- package/dist/collectors/feishu/types.d.ts.map +1 -0
- package/dist/collectors/feishu/types.js +17 -0
- package/dist/collectors/feishu/types.js.map +1 -0
- package/dist/collectors/index.d.ts +10 -0
- package/dist/collectors/index.d.ts.map +1 -0
- package/dist/collectors/index.js +18 -0
- package/dist/collectors/index.js.map +1 -0
- package/dist/config-center/connection-checks.d.ts +28 -0
- package/dist/config-center/connection-checks.d.ts.map +1 -0
- package/dist/config-center/connection-checks.js +114 -0
- package/dist/config-center/connection-checks.js.map +1 -0
- package/dist/config-center/document.d.ts +21 -0
- package/dist/config-center/document.d.ts.map +1 -0
- package/dist/config-center/document.js +93 -0
- package/dist/config-center/document.js.map +1 -0
- package/dist/config-center/index.d.ts +9 -0
- package/dist/config-center/index.d.ts.map +1 -0
- package/dist/config-center/index.js +29 -0
- package/dist/config-center/index.js.map +1 -0
- package/dist/config-center/recommendations.d.ts +16 -0
- package/dist/config-center/recommendations.d.ts.map +1 -0
- package/dist/config-center/recommendations.js +50 -0
- package/dist/config-center/recommendations.js.map +1 -0
- package/dist/config-center/reducer.d.ts +57 -0
- package/dist/config-center/reducer.d.ts.map +1 -0
- package/dist/config-center/reducer.js +192 -0
- package/dist/config-center/reducer.js.map +1 -0
- package/dist/config-center/schema.d.ts +31 -0
- package/dist/config-center/schema.d.ts.map +1 -0
- package/dist/config-center/schema.js +365 -0
- package/dist/config-center/schema.js.map +1 -0
- package/dist/config-center/secrets.d.ts +4 -0
- package/dist/config-center/secrets.d.ts.map +1 -0
- package/dist/config-center/secrets.js +27 -0
- package/dist/config-center/secrets.js.map +1 -0
- package/dist/config-center/source-dirs.d.ts +16 -0
- package/dist/config-center/source-dirs.d.ts.map +1 -0
- package/dist/config-center/source-dirs.js +81 -0
- package/dist/config-center/source-dirs.js.map +1 -0
- package/dist/config-center/tui/app.d.ts +22 -0
- package/dist/config-center/tui/app.d.ts.map +1 -0
- package/dist/config-center/tui/app.js +142 -0
- package/dist/config-center/tui/app.js.map +1 -0
- package/dist/config-center/tui/render.d.ts +20 -0
- package/dist/config-center/tui/render.d.ts.map +1 -0
- package/dist/config-center/tui/render.js +166 -0
- package/dist/config-center/tui/render.js.map +1 -0
- package/dist/config-center/validation.d.ts +9 -0
- package/dist/config-center/validation.d.ts.map +1 -0
- package/dist/config-center/validation.js +59 -0
- package/dist/config-center/validation.js.map +1 -0
- package/dist/consolidator/consolidator.d.ts +31 -0
- package/dist/consolidator/consolidator.d.ts.map +1 -0
- package/dist/consolidator/consolidator.js +57 -0
- package/dist/consolidator/consolidator.js.map +1 -0
- package/dist/consolidator/dead-link.d.ts +7 -0
- package/dist/consolidator/dead-link.d.ts.map +1 -0
- package/dist/consolidator/dead-link.js +57 -0
- package/dist/consolidator/dead-link.js.map +1 -0
- package/dist/consolidator/hot-warm.d.ts +9 -0
- package/dist/consolidator/hot-warm.d.ts.map +1 -0
- package/dist/consolidator/hot-warm.js +88 -0
- package/dist/consolidator/hot-warm.js.map +1 -0
- package/dist/consolidator/infer-preferences.d.ts +14 -0
- package/dist/consolidator/infer-preferences.d.ts.map +1 -0
- package/dist/consolidator/infer-preferences.js +73 -0
- package/dist/consolidator/infer-preferences.js.map +1 -0
- package/dist/consolidator/rules.d.ts +5 -0
- package/dist/consolidator/rules.d.ts.map +1 -0
- package/dist/consolidator/rules.js +53 -0
- package/dist/consolidator/rules.js.map +1 -0
- package/dist/consolidator/warm-cold.d.ts +13 -0
- package/dist/consolidator/warm-cold.d.ts.map +1 -0
- package/dist/consolidator/warm-cold.js +91 -0
- package/dist/consolidator/warm-cold.js.map +1 -0
- package/dist/core/block-builder.d.ts +15 -0
- package/dist/core/block-builder.d.ts.map +1 -0
- package/dist/core/block-builder.js +185 -0
- package/dist/core/block-builder.js.map +1 -0
- package/dist/core/canonicalize.d.ts +3 -0
- package/dist/core/canonicalize.d.ts.map +1 -0
- package/dist/core/canonicalize.js +137 -0
- package/dist/core/canonicalize.js.map +1 -0
- package/dist/core/concurrency.d.ts +2 -0
- package/dist/core/concurrency.d.ts.map +1 -0
- package/dist/core/concurrency.js +14 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/config.d.ts +184 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +136 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/cursors.d.ts +36 -0
- package/dist/core/cursors.d.ts.map +1 -0
- package/dist/core/cursors.js +90 -0
- package/dist/core/cursors.js.map +1 -0
- package/dist/core/dedup.d.ts +45 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +111 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/entity-extract.d.ts +3 -0
- package/dist/core/entity-extract.d.ts.map +1 -0
- package/dist/core/entity-extract.js +54 -0
- package/dist/core/entity-extract.js.map +1 -0
- package/dist/core/helpers.d.ts +3 -0
- package/dist/core/helpers.d.ts.map +1 -0
- package/dist/core/helpers.js +10 -0
- package/dist/core/helpers.js.map +1 -0
- package/dist/core/identity-resolver.d.ts +21 -0
- package/dist/core/identity-resolver.d.ts.map +1 -0
- package/dist/core/identity-resolver.js +62 -0
- package/dist/core/identity-resolver.js.map +1 -0
- package/dist/core/pipeline-factory.d.ts +13 -0
- package/dist/core/pipeline-factory.d.ts.map +1 -0
- package/dist/core/pipeline-factory.js +32 -0
- package/dist/core/pipeline-factory.js.map +1 -0
- package/dist/core/pipeline.d.ts +61 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +261 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/schemas.d.ts +2470 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +229 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/signal-scoring.d.ts +3 -0
- package/dist/core/signal-scoring.d.ts.map +1 -0
- package/dist/core/signal-scoring.js +124 -0
- package/dist/core/signal-scoring.js.map +1 -0
- package/dist/core/state.d.ts +22 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +32 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/types.d.ts +231 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/daemon/alerts.d.ts +12 -0
- package/dist/daemon/alerts.d.ts.map +1 -0
- package/dist/daemon/alerts.js +34 -0
- package/dist/daemon/alerts.js.map +1 -0
- package/dist/daemon/index.d.ts +6 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +6 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/logger.d.ts +8 -0
- package/dist/daemon/logger.d.ts.map +1 -0
- package/dist/daemon/logger.js +35 -0
- package/dist/daemon/logger.js.map +1 -0
- package/dist/daemon/run-history.d.ts +29 -0
- package/dist/daemon/run-history.d.ts.map +1 -0
- package/dist/daemon/run-history.js +54 -0
- package/dist/daemon/run-history.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +37 -0
- package/dist/daemon/scheduler.d.ts.map +1 -0
- package/dist/daemon/scheduler.js +142 -0
- package/dist/daemon/scheduler.js.map +1 -0
- package/dist/daemon/source-schedule.d.ts +25 -0
- package/dist/daemon/source-schedule.d.ts.map +1 -0
- package/dist/daemon/source-schedule.js +87 -0
- package/dist/daemon/source-schedule.js.map +1 -0
- package/dist/embedded-assets.generated.d.ts +4 -0
- package/dist/embedded-assets.generated.d.ts.map +1 -0
- package/dist/embedded-assets.generated.js +12 -0
- package/dist/embedded-assets.generated.js.map +1 -0
- package/dist/extractors/noise-filter.d.ts +30 -0
- package/dist/extractors/noise-filter.d.ts.map +1 -0
- package/dist/extractors/noise-filter.js +185 -0
- package/dist/extractors/noise-filter.js.map +1 -0
- package/dist/extractors/providers/anthropic.d.ts +13 -0
- package/dist/extractors/providers/anthropic.d.ts.map +1 -0
- package/dist/extractors/providers/anthropic.js +67 -0
- package/dist/extractors/providers/anthropic.js.map +1 -0
- package/dist/extractors/providers/index.d.ts +12 -0
- package/dist/extractors/providers/index.d.ts.map +1 -0
- package/dist/extractors/providers/index.js +41 -0
- package/dist/extractors/providers/index.js.map +1 -0
- package/dist/extractors/providers/mock.d.ts +14 -0
- package/dist/extractors/providers/mock.d.ts.map +1 -0
- package/dist/extractors/providers/mock.js +37 -0
- package/dist/extractors/providers/mock.js.map +1 -0
- package/dist/extractors/providers/openai.d.ts +15 -0
- package/dist/extractors/providers/openai.d.ts.map +1 -0
- package/dist/extractors/providers/openai.js +109 -0
- package/dist/extractors/providers/openai.js.map +1 -0
- package/dist/extractors/providers/types.d.ts +27 -0
- package/dist/extractors/providers/types.d.ts.map +1 -0
- package/dist/extractors/providers/types.js +6 -0
- package/dist/extractors/providers/types.js.map +1 -0
- package/dist/extractors/signal-extractor.d.ts +29 -0
- package/dist/extractors/signal-extractor.d.ts.map +1 -0
- package/dist/extractors/signal-extractor.js +279 -0
- package/dist/extractors/signal-extractor.js.map +1 -0
- package/dist/formatters/index.d.ts +3 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +3 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/json.d.ts +6 -0
- package/dist/formatters/json.d.ts.map +1 -0
- package/dist/formatters/json.js +16 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/markdown.d.ts +6 -0
- package/dist/formatters/markdown.d.ts.map +1 -0
- package/dist/formatters/markdown.js +198 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/processors/privacy.d.ts +98 -0
- package/dist/processors/privacy.d.ts.map +1 -0
- package/dist/processors/privacy.js +271 -0
- package/dist/processors/privacy.js.map +1 -0
- package/dist/server/api.d.ts +35 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +453 -0
- package/dist/server/api.js.map +1 -0
- package/dist/server/backfill-job.d.ts +36 -0
- package/dist/server/backfill-job.d.ts.map +1 -0
- package/dist/server/backfill-job.js +88 -0
- package/dist/server/backfill-job.js.map +1 -0
- package/dist/server/backfill-routes.d.ts +7 -0
- package/dist/server/backfill-routes.d.ts.map +1 -0
- package/dist/server/backfill-routes.js +123 -0
- package/dist/server/backfill-routes.js.map +1 -0
- package/dist/server/config-routes.d.ts +8 -0
- package/dist/server/config-routes.d.ts.map +1 -0
- package/dist/server/config-routes.js +114 -0
- package/dist/server/config-routes.js.map +1 -0
- package/dist/server/context.d.ts +13 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +47 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/entity.d.ts +25 -0
- package/dist/server/entity.d.ts.map +1 -0
- package/dist/server/entity.js +34 -0
- package/dist/server/entity.js.map +1 -0
- package/dist/server/event-bus.d.ts +35 -0
- package/dist/server/event-bus.d.ts.map +1 -0
- package/dist/server/event-bus.js +4 -0
- package/dist/server/event-bus.js.map +1 -0
- package/dist/server/mcp.d.ts +126 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +103 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/server/setup-server.d.ts +7 -0
- package/dist/server/setup-server.d.ts.map +1 -0
- package/dist/server/setup-server.js +52 -0
- package/dist/server/setup-server.js.map +1 -0
- package/dist/setup/assess-hardware.d.ts +34 -0
- package/dist/setup/assess-hardware.d.ts.map +1 -0
- package/dist/setup/assess-hardware.js +179 -0
- package/dist/setup/assess-hardware.js.map +1 -0
- package/dist/setup/connection-tests.d.ts +17 -0
- package/dist/setup/connection-tests.d.ts.map +1 -0
- package/dist/setup/connection-tests.js +67 -0
- package/dist/setup/connection-tests.js.map +1 -0
- package/dist/setup/detect-api-keys.d.ts +13 -0
- package/dist/setup/detect-api-keys.d.ts.map +1 -0
- package/dist/setup/detect-api-keys.js +41 -0
- package/dist/setup/detect-api-keys.js.map +1 -0
- package/dist/setup/detect-runtime.d.ts +14 -0
- package/dist/setup/detect-runtime.d.ts.map +1 -0
- package/dist/setup/detect-runtime.js +43 -0
- package/dist/setup/detect-runtime.js.map +1 -0
- package/dist/setup/detect-sources.d.ts +14 -0
- package/dist/setup/detect-sources.d.ts.map +1 -0
- package/dist/setup/detect-sources.js +75 -0
- package/dist/setup/detect-sources.js.map +1 -0
- package/dist/setup/generate-config.d.ts +5 -0
- package/dist/setup/generate-config.d.ts.map +1 -0
- package/dist/setup/generate-config.js +103 -0
- package/dist/setup/generate-config.js.map +1 -0
- package/dist/setup/index.d.ts +9 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +9 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/init-wizard.d.ts +19 -0
- package/dist/setup/init-wizard.d.ts.map +1 -0
- package/dist/setup/init-wizard.js +501 -0
- package/dist/setup/init-wizard.js.map +1 -0
- package/dist/setup/terminal.d.ts +28 -0
- package/dist/setup/terminal.d.ts.map +1 -0
- package/dist/setup/terminal.js +258 -0
- package/dist/setup/terminal.js.map +1 -0
- package/dist/setup/validate-config.d.ts +26 -0
- package/dist/setup/validate-config.d.ts.map +1 -0
- package/dist/setup/validate-config.js +27 -0
- package/dist/setup/validate-config.js.map +1 -0
- package/dist/store/chunks.d.ts +19 -0
- package/dist/store/chunks.d.ts.map +1 -0
- package/dist/store/chunks.js +70 -0
- package/dist/store/chunks.js.map +1 -0
- package/dist/store/database.d.ts +24 -0
- package/dist/store/database.d.ts.map +1 -0
- package/dist/store/database.js +62 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/embedding.d.ts +23 -0
- package/dist/store/embedding.d.ts.map +1 -0
- package/dist/store/embedding.js +62 -0
- package/dist/store/embedding.js.map +1 -0
- package/dist/store/graph.d.ts +53 -0
- package/dist/store/graph.d.ts.map +1 -0
- package/dist/store/graph.js +186 -0
- package/dist/store/graph.js.map +1 -0
- package/dist/store/migrations/index.d.ts +9 -0
- package/dist/store/migrations/index.d.ts.map +1 -0
- package/dist/store/migrations/index.js +68 -0
- package/dist/store/migrations/index.js.map +1 -0
- package/dist/store/pages.d.ts +39 -0
- package/dist/store/pages.d.ts.map +1 -0
- package/dist/store/pages.js +150 -0
- package/dist/store/pages.js.map +1 -0
- package/dist/store/search.d.ts +37 -0
- package/dist/store/search.d.ts.map +1 -0
- package/dist/store/search.js +200 -0
- package/dist/store/search.js.map +1 -0
- package/dist/store/tags.d.ts +10 -0
- package/dist/store/tags.d.ts.map +1 -0
- package/dist/store/tags.js +31 -0
- package/dist/store/tags.js.map +1 -0
- package/dist/store/timeline.d.ts +26 -0
- package/dist/store/timeline.d.ts.map +1 -0
- package/dist/store/timeline.js +43 -0
- package/dist/store/timeline.js.map +1 -0
- package/dist/sync/obsidian.d.ts +136 -0
- package/dist/sync/obsidian.d.ts.map +1 -0
- package/dist/sync/obsidian.js +539 -0
- package/dist/sync/obsidian.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { stringify as yamlStringify } from "yaml";
|
|
3
|
+
// Per-type lifecycle defaults (Spec 1 §4.3). NULL = never auto-expires.
|
|
4
|
+
// Spec 2's Consolidator reads halflife_days to decide hot→warm timing.
|
|
5
|
+
const HALFLIFE_DAYS = {
|
|
6
|
+
decision: 90,
|
|
7
|
+
task: 90,
|
|
8
|
+
discovery: 90,
|
|
9
|
+
knowledge: 365,
|
|
10
|
+
preference: 90,
|
|
11
|
+
reference: null,
|
|
12
|
+
entity: null,
|
|
13
|
+
};
|
|
14
|
+
export class StoreAdapter {
|
|
15
|
+
id = "store";
|
|
16
|
+
name = "Memoark Store Adapter";
|
|
17
|
+
description = "Writes extraction results directly to PGLite stores";
|
|
18
|
+
stores;
|
|
19
|
+
onPageWritten;
|
|
20
|
+
constructor(stores, opts) {
|
|
21
|
+
this.stores = stores;
|
|
22
|
+
this.onPageWritten = opts?.onPageWritten;
|
|
23
|
+
}
|
|
24
|
+
notifyPageWritten(page) {
|
|
25
|
+
if (!this.onPageWritten)
|
|
26
|
+
return;
|
|
27
|
+
this.onPageWritten({
|
|
28
|
+
slug: page.slug,
|
|
29
|
+
type: page.type,
|
|
30
|
+
title: page.title,
|
|
31
|
+
summary: page.compiled_truth.slice(0, 100),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async healthCheck() {
|
|
35
|
+
try {
|
|
36
|
+
// Simple check - try to list pages
|
|
37
|
+
await this.stores.pages.listPages({ limit: 1 });
|
|
38
|
+
return { ok: true, message: "Store adapter is ready" };
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return {
|
|
42
|
+
ok: false,
|
|
43
|
+
message: `Store adapter health check failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async push(results) {
|
|
48
|
+
const pushResult = {
|
|
49
|
+
written: 0,
|
|
50
|
+
skipped: 0,
|
|
51
|
+
errors: [],
|
|
52
|
+
};
|
|
53
|
+
for (const result of results) {
|
|
54
|
+
// Process Entities
|
|
55
|
+
for (const entity of result.entities) {
|
|
56
|
+
const writeResult = await this.writeEntity(entity, result.source.raw_hash, result.source, result.personAliases);
|
|
57
|
+
pushResult.written += writeResult.written;
|
|
58
|
+
pushResult.skipped += writeResult.skipped;
|
|
59
|
+
pushResult.errors.push(...writeResult.errors);
|
|
60
|
+
}
|
|
61
|
+
// Process Decisions
|
|
62
|
+
for (const decision of result.decisions) {
|
|
63
|
+
const writeResult = await this.writeDecision(decision);
|
|
64
|
+
pushResult.written += writeResult.written;
|
|
65
|
+
pushResult.skipped += writeResult.skipped;
|
|
66
|
+
pushResult.errors.push(...writeResult.errors);
|
|
67
|
+
}
|
|
68
|
+
// Process Tasks
|
|
69
|
+
for (const task of result.tasks) {
|
|
70
|
+
const writeResult = await this.writeTask(task);
|
|
71
|
+
pushResult.written += writeResult.written;
|
|
72
|
+
pushResult.skipped += writeResult.skipped;
|
|
73
|
+
pushResult.errors.push(...writeResult.errors);
|
|
74
|
+
}
|
|
75
|
+
// Process Discoveries
|
|
76
|
+
for (const discovery of result.discoveries) {
|
|
77
|
+
const writeResult = await this.writeDiscovery(discovery);
|
|
78
|
+
pushResult.written += writeResult.written;
|
|
79
|
+
pushResult.skipped += writeResult.skipped;
|
|
80
|
+
pushResult.errors.push(...writeResult.errors);
|
|
81
|
+
}
|
|
82
|
+
// Process Knowledge
|
|
83
|
+
for (const knowledge of result.knowledge) {
|
|
84
|
+
const writeResult = await this.writeKnowledge(knowledge);
|
|
85
|
+
pushResult.written += writeResult.written;
|
|
86
|
+
pushResult.skipped += writeResult.skipped;
|
|
87
|
+
pushResult.errors.push(...writeResult.errors);
|
|
88
|
+
}
|
|
89
|
+
// Process Preferences
|
|
90
|
+
for (const preference of result.preferences) {
|
|
91
|
+
const writeResult = await this.writePreference(preference);
|
|
92
|
+
pushResult.written += writeResult.written;
|
|
93
|
+
pushResult.skipped += writeResult.skipped;
|
|
94
|
+
pushResult.errors.push(...writeResult.errors);
|
|
95
|
+
}
|
|
96
|
+
// Process References
|
|
97
|
+
for (const reference of result.references) {
|
|
98
|
+
const writeResult = await this.writeReference(reference);
|
|
99
|
+
pushResult.written += writeResult.written;
|
|
100
|
+
pushResult.skipped += writeResult.skipped;
|
|
101
|
+
pushResult.errors.push(...writeResult.errors);
|
|
102
|
+
}
|
|
103
|
+
// Process Timeline Entries
|
|
104
|
+
for (const entry of result.timeline) {
|
|
105
|
+
const writeResult = await this.appendTimelineEntry(entry);
|
|
106
|
+
pushResult.written += writeResult.written;
|
|
107
|
+
pushResult.skipped += writeResult.skipped;
|
|
108
|
+
pushResult.errors.push(...writeResult.errors);
|
|
109
|
+
}
|
|
110
|
+
// Process Links
|
|
111
|
+
for (const link of result.links) {
|
|
112
|
+
const writeResult = await this.appendLink(link);
|
|
113
|
+
pushResult.written += writeResult.written;
|
|
114
|
+
pushResult.skipped += writeResult.skipped;
|
|
115
|
+
pushResult.errors.push(...writeResult.errors);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return pushResult;
|
|
119
|
+
}
|
|
120
|
+
async writeEntity(entity, sourceHash, source, personAliases) {
|
|
121
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
122
|
+
try {
|
|
123
|
+
const existingPage = await this.stores.pages.getPage(entity.slug);
|
|
124
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
125
|
+
result.skipped += 1;
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
// H4: respect user edits made via Obsidian sync
|
|
129
|
+
if (existingPage?.frontmatter.user_edited === true) {
|
|
130
|
+
result.skipped += 1;
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
const frontmatter = {
|
|
134
|
+
title: entity.name,
|
|
135
|
+
type: entity.type,
|
|
136
|
+
confidence: entity.confidence,
|
|
137
|
+
source_hash: sourceHash,
|
|
138
|
+
created_at: existingPage?.frontmatter.created_at ?? new Date().toISOString(),
|
|
139
|
+
updated_at: new Date().toISOString(),
|
|
140
|
+
};
|
|
141
|
+
if (source) {
|
|
142
|
+
if (!existingPage?.frontmatter.first_seen) {
|
|
143
|
+
frontmatter.first_seen = source;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
frontmatter.first_seen = existingPage.frontmatter.first_seen;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Handle person aliases
|
|
150
|
+
if (entity.type === "person" && personAliases?.[entity.slug]) {
|
|
151
|
+
const newAliases = personAliases[entity.slug];
|
|
152
|
+
const existingAliases = existingPage?.frontmatter.aliases ?? [];
|
|
153
|
+
// Merge and deduplicate aliases
|
|
154
|
+
const mergedAliases = Array.from(new Set([...existingAliases, ...newAliases]));
|
|
155
|
+
frontmatter.aliases = mergedAliases;
|
|
156
|
+
}
|
|
157
|
+
const bodyParts = [`## Context\n\n${entity.context}`];
|
|
158
|
+
// Add aliases section to body for person entities
|
|
159
|
+
if (entity.type === "person" && frontmatter.aliases) {
|
|
160
|
+
const aliasesList = frontmatter.aliases
|
|
161
|
+
.map((alias) => `- ${alias}`)
|
|
162
|
+
.join("\n");
|
|
163
|
+
bodyParts.unshift(`## Aliases\n\n${aliasesList}`);
|
|
164
|
+
}
|
|
165
|
+
const content = `---
|
|
166
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
${bodyParts.join("\n\n")}
|
|
170
|
+
`;
|
|
171
|
+
// Write page
|
|
172
|
+
const page = await this.stores.pages.putPage(entity.slug, content, {
|
|
173
|
+
halflife_days: HALFLIFE_DAYS.entity,
|
|
174
|
+
});
|
|
175
|
+
// Notify callback
|
|
176
|
+
this.notifyPageWritten(page);
|
|
177
|
+
// Rechunk
|
|
178
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
179
|
+
// Add entity tag
|
|
180
|
+
await this.stores.tags.addTag(entity.slug, "entity");
|
|
181
|
+
result.written += 1;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
result.errors.push({
|
|
185
|
+
signal: `entity:${entity.slug}`,
|
|
186
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
async writeDecision(decision) {
|
|
192
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
193
|
+
try {
|
|
194
|
+
const slug = `decisions/${this.kebabCase(decision.summary)}`;
|
|
195
|
+
const sourceHash = decision.source.raw_hash;
|
|
196
|
+
// Check for duplicate
|
|
197
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
198
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
199
|
+
result.skipped += 1;
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
// H4: respect user edits made via Obsidian sync
|
|
203
|
+
if (existingPage?.frontmatter.user_edited === true) {
|
|
204
|
+
result.skipped += 1;
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
// Build markdown with frontmatter
|
|
208
|
+
const frontmatter = {
|
|
209
|
+
title: decision.summary,
|
|
210
|
+
type: "decision",
|
|
211
|
+
date: decision.date,
|
|
212
|
+
entities: decision.entities,
|
|
213
|
+
confidence: decision.confidence,
|
|
214
|
+
source_hash: sourceHash,
|
|
215
|
+
source: decision.source,
|
|
216
|
+
created_at: new Date().toISOString(),
|
|
217
|
+
};
|
|
218
|
+
const parts = [];
|
|
219
|
+
parts.push(`# ${decision.summary}`);
|
|
220
|
+
parts.push("");
|
|
221
|
+
if (decision.reasoning) {
|
|
222
|
+
parts.push("## Reasoning");
|
|
223
|
+
parts.push("");
|
|
224
|
+
parts.push(decision.reasoning);
|
|
225
|
+
parts.push("");
|
|
226
|
+
}
|
|
227
|
+
if (decision.alternatives && decision.alternatives.length > 0) {
|
|
228
|
+
parts.push("## Alternatives");
|
|
229
|
+
parts.push("");
|
|
230
|
+
for (const alt of decision.alternatives) {
|
|
231
|
+
parts.push(`- ${alt}`);
|
|
232
|
+
}
|
|
233
|
+
parts.push("");
|
|
234
|
+
}
|
|
235
|
+
const content = `---
|
|
236
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
${parts.join("\n")}`;
|
|
240
|
+
// Write page
|
|
241
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
242
|
+
halflife_days: HALFLIFE_DAYS.decision,
|
|
243
|
+
});
|
|
244
|
+
// Notify callback
|
|
245
|
+
this.notifyPageWritten(page);
|
|
246
|
+
// Rechunk
|
|
247
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
248
|
+
// Add tags
|
|
249
|
+
await this.stores.tags.addTag(slug, "decision");
|
|
250
|
+
// Create links to entities
|
|
251
|
+
for (const entitySlug of decision.entities) {
|
|
252
|
+
await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in decision", decision.source, sourceHash);
|
|
253
|
+
}
|
|
254
|
+
for (const entitySlug of decision.entities) {
|
|
255
|
+
try {
|
|
256
|
+
await this.stores.timeline.addEntry(entitySlug, {
|
|
257
|
+
date: decision.date,
|
|
258
|
+
summary: `Decision: ${decision.summary}`,
|
|
259
|
+
detail: decision.reasoning ?? "",
|
|
260
|
+
source: decision.source.platform,
|
|
261
|
+
provenance: decision.source,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
// Entity page might not exist yet, skip
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
result.written += 1;
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
result.errors.push({
|
|
272
|
+
signal: `decision:${decision.summary}`,
|
|
273
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
async writeTask(task) {
|
|
279
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
280
|
+
try {
|
|
281
|
+
const slug = `tasks/${this.kebabCase(task.title)}`;
|
|
282
|
+
const sourceHash = task.source.raw_hash;
|
|
283
|
+
// Check for duplicate
|
|
284
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
285
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
286
|
+
result.skipped += 1;
|
|
287
|
+
return result;
|
|
288
|
+
}
|
|
289
|
+
// H4: respect user edits made via Obsidian sync
|
|
290
|
+
if (existingPage?.frontmatter.user_edited === true) {
|
|
291
|
+
result.skipped += 1;
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
// Build markdown with frontmatter
|
|
295
|
+
const frontmatter = {
|
|
296
|
+
title: task.title,
|
|
297
|
+
type: "task",
|
|
298
|
+
status: task.status,
|
|
299
|
+
confidence: task.confidence,
|
|
300
|
+
source_hash: sourceHash,
|
|
301
|
+
source: task.source,
|
|
302
|
+
created_at: new Date().toISOString(),
|
|
303
|
+
};
|
|
304
|
+
if (task.owner)
|
|
305
|
+
frontmatter.owner = task.owner;
|
|
306
|
+
if (task.project)
|
|
307
|
+
frontmatter.project = task.project;
|
|
308
|
+
if (task.due_date)
|
|
309
|
+
frontmatter.due_date = task.due_date;
|
|
310
|
+
const content = `---
|
|
311
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
# ${task.title}
|
|
315
|
+
`;
|
|
316
|
+
// Write page
|
|
317
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
318
|
+
halflife_days: HALFLIFE_DAYS.task,
|
|
319
|
+
expires_at: task.status === "done" ? new Date() : undefined,
|
|
320
|
+
});
|
|
321
|
+
// Notify callback
|
|
322
|
+
this.notifyPageWritten(page);
|
|
323
|
+
// Rechunk
|
|
324
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
325
|
+
// Add tags
|
|
326
|
+
await this.stores.tags.addTag(slug, "task");
|
|
327
|
+
result.written += 1;
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
result.errors.push({
|
|
331
|
+
signal: `task:${task.title}`,
|
|
332
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
async writeDiscovery(discovery) {
|
|
338
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
339
|
+
try {
|
|
340
|
+
const slug = `discoveries/${this.kebabCase(discovery.summary)}`;
|
|
341
|
+
const sourceHash = discovery.source.raw_hash;
|
|
342
|
+
// Check for duplicate
|
|
343
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
344
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
345
|
+
result.skipped += 1;
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
// H4: respect user edits made via Obsidian sync
|
|
349
|
+
if (existingPage?.frontmatter.user_edited === true) {
|
|
350
|
+
result.skipped += 1;
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
// Build markdown with frontmatter
|
|
354
|
+
const frontmatter = {
|
|
355
|
+
title: discovery.summary,
|
|
356
|
+
type: `discovery-${discovery.type}`,
|
|
357
|
+
entities: discovery.entities,
|
|
358
|
+
confidence: discovery.confidence,
|
|
359
|
+
source_hash: sourceHash,
|
|
360
|
+
source: discovery.source,
|
|
361
|
+
created_at: new Date().toISOString(),
|
|
362
|
+
};
|
|
363
|
+
const parts = [];
|
|
364
|
+
parts.push(`# ${discovery.summary}`);
|
|
365
|
+
parts.push("");
|
|
366
|
+
if (discovery.detail) {
|
|
367
|
+
parts.push("## Detail");
|
|
368
|
+
parts.push("");
|
|
369
|
+
parts.push(discovery.detail);
|
|
370
|
+
parts.push("");
|
|
371
|
+
}
|
|
372
|
+
const content = `---
|
|
373
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
${parts.join("\n")}`;
|
|
377
|
+
// Write page
|
|
378
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
379
|
+
halflife_days: HALFLIFE_DAYS.discovery,
|
|
380
|
+
});
|
|
381
|
+
// Notify callback
|
|
382
|
+
this.notifyPageWritten(page);
|
|
383
|
+
// Rechunk
|
|
384
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
385
|
+
// Add tags
|
|
386
|
+
await this.stores.tags.addTag(slug, "discovery");
|
|
387
|
+
await this.stores.tags.addTag(slug, discovery.type);
|
|
388
|
+
// Create links to entities
|
|
389
|
+
for (const entitySlug of discovery.entities) {
|
|
390
|
+
await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in discovery", discovery.source, sourceHash);
|
|
391
|
+
}
|
|
392
|
+
result.written += 1;
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
result.errors.push({
|
|
396
|
+
signal: `discovery:${discovery.summary}`,
|
|
397
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
return result;
|
|
401
|
+
}
|
|
402
|
+
async writePreference(preference) {
|
|
403
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
404
|
+
try {
|
|
405
|
+
const slug = `preferences/${this.kebabCase(preference.summary)}`;
|
|
406
|
+
const sourceHash = preference.source.raw_hash;
|
|
407
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
408
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
409
|
+
result.skipped += 1;
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
const frontmatter = {
|
|
413
|
+
title: preference.summary,
|
|
414
|
+
type: "preference",
|
|
415
|
+
category: preference.category,
|
|
416
|
+
entities: preference.entities,
|
|
417
|
+
confidence: preference.confidence,
|
|
418
|
+
source_hash: sourceHash,
|
|
419
|
+
source: preference.source,
|
|
420
|
+
created_at: new Date().toISOString(),
|
|
421
|
+
};
|
|
422
|
+
const parts = [`# ${preference.summary}`, ""];
|
|
423
|
+
if (preference.detail) {
|
|
424
|
+
parts.push("## Detail", "", preference.detail, "");
|
|
425
|
+
}
|
|
426
|
+
const content = `---
|
|
427
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
${parts.join("\n")}`;
|
|
431
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
432
|
+
halflife_days: HALFLIFE_DAYS.preference,
|
|
433
|
+
});
|
|
434
|
+
this.notifyPageWritten(page);
|
|
435
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
436
|
+
await this.stores.tags.addTag(slug, "preference");
|
|
437
|
+
await this.stores.tags.addTag(slug, preference.category);
|
|
438
|
+
for (const entitySlug of preference.entities) {
|
|
439
|
+
await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in preference", preference.source, sourceHash);
|
|
440
|
+
}
|
|
441
|
+
result.written += 1;
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
result.errors.push({
|
|
445
|
+
signal: `preference:${preference.summary}`,
|
|
446
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
return result;
|
|
450
|
+
}
|
|
451
|
+
async writeReference(reference) {
|
|
452
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
453
|
+
try {
|
|
454
|
+
const slug = `references/${this.kebabCase(reference.title)}`;
|
|
455
|
+
const sourceHash = reference.source.raw_hash;
|
|
456
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
457
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
458
|
+
result.skipped += 1;
|
|
459
|
+
return result;
|
|
460
|
+
}
|
|
461
|
+
const frontmatter = {
|
|
462
|
+
title: reference.title,
|
|
463
|
+
type: "reference",
|
|
464
|
+
url: reference.url,
|
|
465
|
+
entities: reference.entities,
|
|
466
|
+
confidence: reference.confidence,
|
|
467
|
+
source_hash: sourceHash,
|
|
468
|
+
source: reference.source,
|
|
469
|
+
created_at: new Date().toISOString(),
|
|
470
|
+
};
|
|
471
|
+
if (reference.trigger)
|
|
472
|
+
frontmatter.trigger = reference.trigger;
|
|
473
|
+
const parts = [
|
|
474
|
+
`# ${reference.title}`,
|
|
475
|
+
"",
|
|
476
|
+
`URL: ${reference.url}`,
|
|
477
|
+
"",
|
|
478
|
+
"## Summary",
|
|
479
|
+
"",
|
|
480
|
+
reference.summary,
|
|
481
|
+
"",
|
|
482
|
+
];
|
|
483
|
+
const content = `---
|
|
484
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
${parts.join("\n")}`;
|
|
488
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
489
|
+
halflife_days: HALFLIFE_DAYS.reference,
|
|
490
|
+
});
|
|
491
|
+
this.notifyPageWritten(page);
|
|
492
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
493
|
+
await this.stores.tags.addTag(slug, "reference");
|
|
494
|
+
for (const entitySlug of reference.entities) {
|
|
495
|
+
await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in reference", reference.source, sourceHash);
|
|
496
|
+
}
|
|
497
|
+
result.written += 1;
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
result.errors.push({
|
|
501
|
+
signal: `reference:${reference.title}`,
|
|
502
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
return result;
|
|
506
|
+
}
|
|
507
|
+
async writeKnowledge(knowledge) {
|
|
508
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
509
|
+
try {
|
|
510
|
+
// Skip speculative knowledge
|
|
511
|
+
if (knowledge.confidence === "speculative") {
|
|
512
|
+
result.skipped += 1;
|
|
513
|
+
return result;
|
|
514
|
+
}
|
|
515
|
+
// Build slug: knowledge/{topic}/{content-hash-12}
|
|
516
|
+
const contentHash = this.contentHash(knowledge.content);
|
|
517
|
+
const contentHash12 = contentHash.slice(0, 12);
|
|
518
|
+
const slug = `knowledge/${knowledge.topic}/${contentHash12}`;
|
|
519
|
+
const sourceHash = knowledge.source.raw_hash;
|
|
520
|
+
// Check for duplicate
|
|
521
|
+
const existingPage = await this.stores.pages.getPage(slug);
|
|
522
|
+
if (existingPage && existingPage.frontmatter.source_hash === sourceHash) {
|
|
523
|
+
result.skipped += 1;
|
|
524
|
+
return result;
|
|
525
|
+
}
|
|
526
|
+
// H4: respect user edits made via Obsidian sync
|
|
527
|
+
if (existingPage?.frontmatter.user_edited === true) {
|
|
528
|
+
result.skipped += 1;
|
|
529
|
+
return result;
|
|
530
|
+
}
|
|
531
|
+
// Build markdown with frontmatter
|
|
532
|
+
const frontmatter = {
|
|
533
|
+
title: knowledge.content.slice(0, 80),
|
|
534
|
+
type: "knowledge",
|
|
535
|
+
topic: knowledge.topic,
|
|
536
|
+
source_type: knowledge.source_type,
|
|
537
|
+
confidence: knowledge.confidence,
|
|
538
|
+
source_hash: sourceHash,
|
|
539
|
+
source: knowledge.source,
|
|
540
|
+
created_at: new Date().toISOString(),
|
|
541
|
+
};
|
|
542
|
+
if (knowledge.valid_at)
|
|
543
|
+
frontmatter.valid_at = knowledge.valid_at;
|
|
544
|
+
if (knowledge.invalid_at)
|
|
545
|
+
frontmatter.invalid_at = knowledge.invalid_at;
|
|
546
|
+
const parts = [];
|
|
547
|
+
parts.push(`# ${knowledge.content}`);
|
|
548
|
+
parts.push("");
|
|
549
|
+
parts.push("## Related Entities");
|
|
550
|
+
parts.push("");
|
|
551
|
+
if (knowledge.related_entities.length > 0) {
|
|
552
|
+
for (const entity of knowledge.related_entities) {
|
|
553
|
+
parts.push(`- ${entity}`);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
parts.push("- (none)");
|
|
558
|
+
}
|
|
559
|
+
parts.push("");
|
|
560
|
+
const content = `---
|
|
561
|
+
${yamlStringify(frontmatter).trimEnd()}
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
${parts.join("\n")}`;
|
|
565
|
+
// Write page
|
|
566
|
+
const page = await this.stores.pages.putPage(slug, content, {
|
|
567
|
+
halflife_days: HALFLIFE_DAYS.knowledge,
|
|
568
|
+
});
|
|
569
|
+
// Notify callback
|
|
570
|
+
this.notifyPageWritten(page);
|
|
571
|
+
// Rechunk
|
|
572
|
+
await this.stores.chunks.rechunk(page.id, page.compiled_truth);
|
|
573
|
+
// Add tags
|
|
574
|
+
await this.stores.tags.addTag(slug, "knowledge");
|
|
575
|
+
await this.stores.tags.addTag(slug, knowledge.topic);
|
|
576
|
+
// Create links to related entities
|
|
577
|
+
for (const entitySlug of knowledge.related_entities) {
|
|
578
|
+
await this.stores.graph.addLink(slug, entitySlug, "mentions", "Referenced in knowledge", knowledge.source, sourceHash);
|
|
579
|
+
}
|
|
580
|
+
result.written += 1;
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
result.errors.push({
|
|
584
|
+
signal: `knowledge:${knowledge.topic}/${knowledge.content.slice(0, 30)}`,
|
|
585
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
return result;
|
|
589
|
+
}
|
|
590
|
+
async appendTimelineEntry(entry) {
|
|
591
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
592
|
+
// Add timeline entry to all related entity pages
|
|
593
|
+
for (const entitySlug of entry.entities) {
|
|
594
|
+
try {
|
|
595
|
+
await this.stores.timeline.addEntry(entitySlug, {
|
|
596
|
+
date: entry.date,
|
|
597
|
+
summary: entry.summary,
|
|
598
|
+
source: entry.source.platform,
|
|
599
|
+
provenance: entry.source,
|
|
600
|
+
});
|
|
601
|
+
result.written += 1;
|
|
602
|
+
}
|
|
603
|
+
catch (error) {
|
|
604
|
+
// Entity page might not exist yet, skip
|
|
605
|
+
result.errors.push({
|
|
606
|
+
signal: `timeline:${entitySlug}`,
|
|
607
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return result;
|
|
612
|
+
}
|
|
613
|
+
async appendLink(link) {
|
|
614
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
615
|
+
try {
|
|
616
|
+
await this.stores.graph.addLink(link.from, link.to, link.type, link.context, link.source, link.source.raw_hash);
|
|
617
|
+
result.written += 1;
|
|
618
|
+
}
|
|
619
|
+
catch (error) {
|
|
620
|
+
result.errors.push({
|
|
621
|
+
signal: `link:${link.from}-${link.to}`,
|
|
622
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
return result;
|
|
626
|
+
}
|
|
627
|
+
kebabCase(str) {
|
|
628
|
+
const ascii = str
|
|
629
|
+
.toLowerCase()
|
|
630
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
631
|
+
.replace(/^-+|-+$/g, "");
|
|
632
|
+
if (ascii.length >= 3)
|
|
633
|
+
return ascii;
|
|
634
|
+
const hash = createHash("sha256").update(str).digest("hex").slice(0, 12);
|
|
635
|
+
return ascii ? `${ascii}-${hash}` : hash;
|
|
636
|
+
}
|
|
637
|
+
contentHash(content) {
|
|
638
|
+
return createHash("sha256").update(content).digest("hex");
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
//# sourceMappingURL=store.js.map
|