@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,53 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
import type { SourceRef } from "../core/types.js";
|
|
3
|
+
export interface LinkRow {
|
|
4
|
+
from_slug: string;
|
|
5
|
+
to_slug: string;
|
|
6
|
+
link_type: string;
|
|
7
|
+
context: string;
|
|
8
|
+
provenance?: SourceRef;
|
|
9
|
+
}
|
|
10
|
+
export interface EnrichedLinkRow extends LinkRow {
|
|
11
|
+
page: {
|
|
12
|
+
title: string;
|
|
13
|
+
type: string;
|
|
14
|
+
frontmatter: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface GraphNode {
|
|
18
|
+
slug: string;
|
|
19
|
+
title: string;
|
|
20
|
+
type: string;
|
|
21
|
+
depth: number;
|
|
22
|
+
}
|
|
23
|
+
export interface GraphEdge {
|
|
24
|
+
from_slug: string;
|
|
25
|
+
to_slug: string;
|
|
26
|
+
link_type: string;
|
|
27
|
+
}
|
|
28
|
+
export interface TraverseResult {
|
|
29
|
+
focus: {
|
|
30
|
+
slug: string;
|
|
31
|
+
title: string;
|
|
32
|
+
type: string;
|
|
33
|
+
};
|
|
34
|
+
nodes: GraphNode[];
|
|
35
|
+
edges: GraphEdge[];
|
|
36
|
+
}
|
|
37
|
+
export declare class GraphStore {
|
|
38
|
+
private pg;
|
|
39
|
+
constructor(pg: PGlite);
|
|
40
|
+
addLink(fromSlug: string, toSlug: string, type: string, context?: string, provenance?: SourceRef, sourceHash?: string): Promise<void>;
|
|
41
|
+
removeLink(fromSlug: string, toSlug: string): Promise<void>;
|
|
42
|
+
getLinks(slug: string): Promise<LinkRow[]>;
|
|
43
|
+
getAllLinksGrouped(): Promise<Map<string, LinkRow[]>>;
|
|
44
|
+
getBacklinks(slug: string): Promise<LinkRow[]>;
|
|
45
|
+
getLinksEnriched(slug: string): Promise<EnrichedLinkRow[]>;
|
|
46
|
+
getLinksForSlugs(slugs: string[]): Promise<Map<string, LinkRow[]>>;
|
|
47
|
+
getBacklinksEnriched(slug: string): Promise<EnrichedLinkRow[]>;
|
|
48
|
+
traverse(slug: string, opts?: {
|
|
49
|
+
depth?: number;
|
|
50
|
+
direction?: "in" | "out" | "both";
|
|
51
|
+
}): Promise<TraverseResult>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/store/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO;IAC9C,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC7E;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAwBD,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,SAAS,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAkBV,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY1C,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAiBrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAY9C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B1D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAmBlE,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+B9D,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,MAAM,CAAA;KAAE,GAC3D,OAAO,CAAC,cAAc,CAAC;CAsF3B"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
export class GraphStore {
|
|
2
|
+
pg;
|
|
3
|
+
constructor(pg) {
|
|
4
|
+
this.pg = pg;
|
|
5
|
+
}
|
|
6
|
+
async addLink(fromSlug, toSlug, type, context, provenance, sourceHash) {
|
|
7
|
+
await this.pg.query(`INSERT INTO links (from_page_id, to_page_id, link_type, context, provenance, source_hash)
|
|
8
|
+
SELECT f.id, t.id, $3, $4, $5, $6
|
|
9
|
+
FROM pages f, pages t
|
|
10
|
+
WHERE f.slug = $1 AND t.slug = $2
|
|
11
|
+
ON CONFLICT (from_page_id, to_page_id, link_type) DO UPDATE SET context = EXCLUDED.context`, [
|
|
12
|
+
fromSlug,
|
|
13
|
+
toSlug,
|
|
14
|
+
type,
|
|
15
|
+
context ?? "",
|
|
16
|
+
provenance ? JSON.stringify(provenance) : null,
|
|
17
|
+
sourceHash ?? null,
|
|
18
|
+
]);
|
|
19
|
+
}
|
|
20
|
+
async removeLink(fromSlug, toSlug) {
|
|
21
|
+
await this.pg.query(`DELETE FROM links
|
|
22
|
+
WHERE from_page_id = (SELECT id FROM pages WHERE slug = $1)
|
|
23
|
+
AND to_page_id = (SELECT id FROM pages WHERE slug = $2)`, [fromSlug, toSlug]);
|
|
24
|
+
}
|
|
25
|
+
async getLinks(slug) {
|
|
26
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
|
|
27
|
+
FROM links l
|
|
28
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
29
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
30
|
+
WHERE pf.slug = $1`, [slug]);
|
|
31
|
+
return result.rows;
|
|
32
|
+
}
|
|
33
|
+
async getAllLinksGrouped() {
|
|
34
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
|
|
35
|
+
FROM links l
|
|
36
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
37
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
38
|
+
ORDER BY pf.slug, pt.slug`);
|
|
39
|
+
const grouped = new Map();
|
|
40
|
+
for (const row of result.rows) {
|
|
41
|
+
const list = grouped.get(row.from_slug);
|
|
42
|
+
if (list)
|
|
43
|
+
list.push(row);
|
|
44
|
+
else
|
|
45
|
+
grouped.set(row.from_slug, [row]);
|
|
46
|
+
}
|
|
47
|
+
return grouped;
|
|
48
|
+
}
|
|
49
|
+
async getBacklinks(slug) {
|
|
50
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
|
|
51
|
+
FROM links l
|
|
52
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
53
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
54
|
+
WHERE pt.slug = $1`, [slug]);
|
|
55
|
+
return result.rows;
|
|
56
|
+
}
|
|
57
|
+
async getLinksEnriched(slug) {
|
|
58
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance,
|
|
59
|
+
pt.title AS page_title, pt.type AS page_type, pt.frontmatter AS page_frontmatter
|
|
60
|
+
FROM links l
|
|
61
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
62
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
63
|
+
WHERE pf.slug = $1`, [slug]);
|
|
64
|
+
return result.rows.map((r) => {
|
|
65
|
+
const frontmatter = typeof r.page_frontmatter === "string"
|
|
66
|
+
? JSON.parse(r.page_frontmatter)
|
|
67
|
+
: r.page_frontmatter;
|
|
68
|
+
return {
|
|
69
|
+
from_slug: r.from_slug,
|
|
70
|
+
to_slug: r.to_slug,
|
|
71
|
+
link_type: r.link_type,
|
|
72
|
+
context: r.context,
|
|
73
|
+
provenance: r.provenance ? JSON.parse(r.provenance) : undefined,
|
|
74
|
+
page: {
|
|
75
|
+
title: r.page_title,
|
|
76
|
+
type: r.page_type,
|
|
77
|
+
frontmatter: frontmatter ?? {},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async getLinksForSlugs(slugs) {
|
|
83
|
+
if (slugs.length === 0)
|
|
84
|
+
return new Map();
|
|
85
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance
|
|
86
|
+
FROM links l
|
|
87
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
88
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
89
|
+
WHERE pf.slug = ANY($1::text[])`, [slugs]);
|
|
90
|
+
const map = new Map();
|
|
91
|
+
for (const row of result.rows) {
|
|
92
|
+
const existing = map.get(row.from_slug) ?? [];
|
|
93
|
+
existing.push(row);
|
|
94
|
+
map.set(row.from_slug, existing);
|
|
95
|
+
}
|
|
96
|
+
return map;
|
|
97
|
+
}
|
|
98
|
+
async getBacklinksEnriched(slug) {
|
|
99
|
+
const result = await this.pg.query(`SELECT pf.slug AS from_slug, pt.slug AS to_slug, l.link_type, l.context, l.provenance,
|
|
100
|
+
pf.title AS page_title, pf.type AS page_type, pf.frontmatter AS page_frontmatter
|
|
101
|
+
FROM links l
|
|
102
|
+
JOIN pages pf ON pf.id = l.from_page_id
|
|
103
|
+
JOIN pages pt ON pt.id = l.to_page_id
|
|
104
|
+
WHERE pt.slug = $1`, [slug]);
|
|
105
|
+
return result.rows.map((r) => {
|
|
106
|
+
const frontmatter = typeof r.page_frontmatter === "string"
|
|
107
|
+
? JSON.parse(r.page_frontmatter)
|
|
108
|
+
: r.page_frontmatter;
|
|
109
|
+
return {
|
|
110
|
+
from_slug: r.from_slug,
|
|
111
|
+
to_slug: r.to_slug,
|
|
112
|
+
link_type: r.link_type,
|
|
113
|
+
context: r.context,
|
|
114
|
+
provenance: r.provenance ? JSON.parse(r.provenance) : undefined,
|
|
115
|
+
page: {
|
|
116
|
+
title: r.page_title,
|
|
117
|
+
type: r.page_type,
|
|
118
|
+
frontmatter: frontmatter ?? {},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async traverse(slug, opts) {
|
|
124
|
+
const maxDepth = Math.min(opts?.depth ?? 5, 10);
|
|
125
|
+
const direction = opts?.direction ?? "out";
|
|
126
|
+
// Query focus node
|
|
127
|
+
const focusQuery = await this.pg.query("SELECT slug, title, type FROM pages WHERE slug = $1", [slug]);
|
|
128
|
+
if (focusQuery.rows.length === 0) {
|
|
129
|
+
return {
|
|
130
|
+
focus: { slug, title: slug, type: "unknown" },
|
|
131
|
+
nodes: [],
|
|
132
|
+
edges: [],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const focus = focusQuery.rows[0];
|
|
136
|
+
const visited = new Set();
|
|
137
|
+
const nodes = [];
|
|
138
|
+
const edges = [];
|
|
139
|
+
let frontier = [slug];
|
|
140
|
+
visited.add(slug);
|
|
141
|
+
for (let d = 1; d <= maxDepth && frontier.length > 0; d++) {
|
|
142
|
+
const nextFrontier = [];
|
|
143
|
+
for (const current of frontier) {
|
|
144
|
+
const neighbors = [];
|
|
145
|
+
if (direction === "out" || direction === "both") {
|
|
146
|
+
const out = await this.pg.query(`SELECT pt.slug, l.link_type FROM links l JOIN pages pt ON pt.id = l.to_page_id
|
|
147
|
+
WHERE l.from_page_id = (SELECT id FROM pages WHERE slug = $1)`, [current]);
|
|
148
|
+
neighbors.push(...out.rows.map((r) => ({ slug: r.slug, link_type: r.link_type })));
|
|
149
|
+
edges.push(...out.rows.map((r) => ({
|
|
150
|
+
from_slug: current,
|
|
151
|
+
to_slug: r.slug,
|
|
152
|
+
link_type: r.link_type,
|
|
153
|
+
})));
|
|
154
|
+
}
|
|
155
|
+
if (direction === "in" || direction === "both") {
|
|
156
|
+
const inc = await this.pg.query(`SELECT pf.slug, l.link_type FROM links l JOIN pages pf ON pf.id = l.from_page_id
|
|
157
|
+
WHERE l.to_page_id = (SELECT id FROM pages WHERE slug = $1)`, [current]);
|
|
158
|
+
neighbors.push(...inc.rows.map((r) => ({ slug: r.slug, link_type: r.link_type })));
|
|
159
|
+
edges.push(...inc.rows.map((r) => ({
|
|
160
|
+
from_slug: r.slug,
|
|
161
|
+
to_slug: current,
|
|
162
|
+
link_type: r.link_type,
|
|
163
|
+
})));
|
|
164
|
+
}
|
|
165
|
+
for (const n of neighbors) {
|
|
166
|
+
if (!visited.has(n.slug)) {
|
|
167
|
+
visited.add(n.slug);
|
|
168
|
+
nextFrontier.push(n.slug);
|
|
169
|
+
const page = await this.pg.query("SELECT slug, title, type FROM pages WHERE slug = $1", [n.slug]);
|
|
170
|
+
if (page.rows.length > 0) {
|
|
171
|
+
const p = page.rows[0];
|
|
172
|
+
nodes.push({ slug: p.slug, title: p.title, type: p.type, depth: d });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
frontier = nextFrontier;
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
focus: { slug: focus.slug, title: focus.title, type: focus.type },
|
|
181
|
+
nodes,
|
|
182
|
+
edges,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/store/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
export interface Migration {
|
|
3
|
+
version: number;
|
|
4
|
+
name: string;
|
|
5
|
+
sql: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const MIGRATIONS: Migration[];
|
|
8
|
+
export declare function runMigrations(pg: PGlite): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/store/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAoDD,eAAO,MAAM,UAAU,EAAE,SAAS,EAIjC,CAAC;AAEF,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Migrations are inlined as string constants (not read from .sql files at runtime) so
|
|
2
|
+
// they survive bundling: the tsc-built dist/, the `bun build --compile` single-file binary,
|
|
3
|
+
// and `bun src/cli.ts` all behave identically with no filesystem asset to ship. Applied
|
|
4
|
+
// migrations are immutable by definition, so there is no source-of-truth drift risk.
|
|
5
|
+
//
|
|
6
|
+
// Add new migrations here, in ascending version order. Never edit an already-released one.
|
|
7
|
+
// Migration 001: lifecycle metadata + preference type promotion.
|
|
8
|
+
// Adds halflife_days to pages (drives hot/warm/cold rotation), promotes the legacy
|
|
9
|
+
// discovery-preference subtype to a first-class `preference` type, then backfills
|
|
10
|
+
// halflife_days for existing signal pages by type.
|
|
11
|
+
const M001_LIFECYCLE_COLUMNS = `
|
|
12
|
+
ALTER TABLE pages ADD COLUMN IF NOT EXISTS halflife_days INTEGER;
|
|
13
|
+
|
|
14
|
+
UPDATE pages SET type = 'preference' WHERE type = 'discovery-preference';
|
|
15
|
+
|
|
16
|
+
UPDATE pages SET halflife_days = 90
|
|
17
|
+
WHERE type IN ('decision', 'task', 'preference') OR type LIKE 'discovery-%';
|
|
18
|
+
UPDATE pages SET halflife_days = 365
|
|
19
|
+
WHERE type = 'knowledge';
|
|
20
|
+
`;
|
|
21
|
+
// Migration 002: backfill provenance/source_hash columns (signal fidelity) for databases
|
|
22
|
+
// that ran migration 001 before schema.sql included them.
|
|
23
|
+
const M002_PROVENANCE_COLUMNS = `
|
|
24
|
+
ALTER TABLE links ADD COLUMN IF NOT EXISTS provenance JSONB;
|
|
25
|
+
ALTER TABLE links ADD COLUMN IF NOT EXISTS source_hash TEXT;
|
|
26
|
+
ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS provenance JSONB;
|
|
27
|
+
`;
|
|
28
|
+
// Migration 003: lifecycle tier columns + indexes for pages and timeline_entries, and a
|
|
29
|
+
// backfill of expires_at for existing hot pages that have a halflife.
|
|
30
|
+
const M003_LIFECYCLE_TIER = `
|
|
31
|
+
ALTER TABLE pages ADD COLUMN IF NOT EXISTS tier TEXT NOT NULL DEFAULT 'hot';
|
|
32
|
+
ALTER TABLE pages ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ;
|
|
33
|
+
ALTER TABLE pages ADD COLUMN IF NOT EXISTS consolidated_into INTEGER REFERENCES pages(id);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_pages_tier ON pages (tier);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_pages_expires_at ON pages (expires_at) WHERE expires_at IS NOT NULL;
|
|
37
|
+
|
|
38
|
+
ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS tier TEXT NOT NULL DEFAULT 'hot';
|
|
39
|
+
ALTER TABLE timeline_entries ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ;
|
|
40
|
+
|
|
41
|
+
UPDATE pages
|
|
42
|
+
SET expires_at = created_at + (halflife_days * INTERVAL '1 day')
|
|
43
|
+
WHERE tier = 'hot'
|
|
44
|
+
AND halflife_days IS NOT NULL
|
|
45
|
+
AND expires_at IS NULL;
|
|
46
|
+
`;
|
|
47
|
+
export const MIGRATIONS = [
|
|
48
|
+
{ version: 1, name: "lifecycle_columns", sql: M001_LIFECYCLE_COLUMNS },
|
|
49
|
+
{ version: 2, name: "provenance_columns", sql: M002_PROVENANCE_COLUMNS },
|
|
50
|
+
{ version: 3, name: "lifecycle_tier", sql: M003_LIFECYCLE_TIER },
|
|
51
|
+
];
|
|
52
|
+
export async function runMigrations(pg) {
|
|
53
|
+
await pg.exec(`
|
|
54
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
55
|
+
version INTEGER PRIMARY KEY,
|
|
56
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
57
|
+
)
|
|
58
|
+
`);
|
|
59
|
+
const applied = await pg.query("SELECT version FROM schema_migrations");
|
|
60
|
+
const appliedVersions = new Set(applied.rows.map((r) => r.version));
|
|
61
|
+
for (const migration of MIGRATIONS) {
|
|
62
|
+
if (appliedVersions.has(migration.version))
|
|
63
|
+
continue;
|
|
64
|
+
await pg.exec(migration.sql);
|
|
65
|
+
await pg.query("INSERT INTO schema_migrations (version) VALUES ($1)", [migration.version]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/store/migrations/index.ts"],"names":[],"mappings":"AAQA,sFAAsF;AACtF,4FAA4F;AAC5F,wFAAwF;AACxF,qFAAqF;AACrF,EAAE;AACF,2FAA2F;AAE3F,iEAAiE;AACjE,mFAAmF;AACnF,kFAAkF;AAClF,mDAAmD;AACnD,MAAM,sBAAsB,GAAG;;;;;;;;;CAS9B,CAAC;AAEF,yFAAyF;AACzF,0DAA0D;AAC1D,MAAM,uBAAuB,GAAG;;;;CAI/B,CAAC;AAEF,wFAAwF;AACxF,sEAAsE;AACtE,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;CAgB3B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAgB;IACrC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,sBAAsB,EAAE;IACtE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,uBAAuB,EAAE;IACxE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,EAAE;CACjE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,EAAE,CAAC,IAAI,CAAC;;;;;GAKb,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAsB,uCAAuC,CAAC,CAAC;IAC7F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;YAAE,SAAS;QACrD,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,EAAE,CAAC,KAAK,CAAC,qDAAqD,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
export interface Page {
|
|
3
|
+
id: number;
|
|
4
|
+
slug: string;
|
|
5
|
+
type: string;
|
|
6
|
+
title: string;
|
|
7
|
+
compiled_truth: string;
|
|
8
|
+
frontmatter: Record<string, unknown>;
|
|
9
|
+
content_hash: string;
|
|
10
|
+
halflife_days: number | null;
|
|
11
|
+
tier: string;
|
|
12
|
+
expires_at: string | null;
|
|
13
|
+
consolidated_into: number | null;
|
|
14
|
+
created_at: string;
|
|
15
|
+
updated_at: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PutPageOptions {
|
|
18
|
+
halflife_days?: number | null;
|
|
19
|
+
expires_at?: Date | null;
|
|
20
|
+
}
|
|
21
|
+
export declare class PageStore {
|
|
22
|
+
private pg;
|
|
23
|
+
constructor(pg: PGlite);
|
|
24
|
+
putPage(slug: string, content: string, opts?: PutPageOptions): Promise<Page>;
|
|
25
|
+
getPage(slug: string): Promise<Page | null>;
|
|
26
|
+
deletePage(slug: string): Promise<void>;
|
|
27
|
+
listPages(opts?: {
|
|
28
|
+
type?: string;
|
|
29
|
+
exclude_types?: string[];
|
|
30
|
+
limit?: number;
|
|
31
|
+
sort?: string;
|
|
32
|
+
order?: string;
|
|
33
|
+
}): Promise<Page[]>;
|
|
34
|
+
listExpiredHot(): Promise<Page[]>;
|
|
35
|
+
updatePageTier(id: number, tier: string, consolidatedInto?: number | null): Promise<void>;
|
|
36
|
+
listPagesByTier(tier: string): Promise<Page[]>;
|
|
37
|
+
private rowToPage;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=pages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAwCD,qBAAa,SAAS;IACR,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM;IAExB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C5E,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK3C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,SAAS,CAAC,IAAI,CAAC,EAAE;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IA8Cb,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAWjC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAczF,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQpD,OAAO,CAAC,SAAS;CAkBlB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { parse as parseYaml } from "yaml";
|
|
3
|
+
function parseMarkdownWithFrontmatter(content) {
|
|
4
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
5
|
+
if (!fmMatch) {
|
|
6
|
+
return { title: "", type: "unknown", compiled_truth: content.trim(), frontmatter: {} };
|
|
7
|
+
}
|
|
8
|
+
const fm = parseYaml(fmMatch[1]);
|
|
9
|
+
const body = fmMatch[2].trim();
|
|
10
|
+
const title = String(fm.title ?? "");
|
|
11
|
+
const type = String(fm.type ?? "unknown");
|
|
12
|
+
const { title: _t, type: _ty, ...rest } = fm;
|
|
13
|
+
return { title, type, compiled_truth: body, frontmatter: rest };
|
|
14
|
+
}
|
|
15
|
+
export class PageStore {
|
|
16
|
+
pg;
|
|
17
|
+
constructor(pg) {
|
|
18
|
+
this.pg = pg;
|
|
19
|
+
}
|
|
20
|
+
async putPage(slug, content, opts) {
|
|
21
|
+
const { title, type, compiled_truth, frontmatter } = parseMarkdownWithFrontmatter(content);
|
|
22
|
+
const contentHash = createHash("sha256").update(content).digest("hex");
|
|
23
|
+
const halflifeDays = opts?.halflife_days ?? null;
|
|
24
|
+
// Compute expires_at in TS to correctly handle the three-way distinction:
|
|
25
|
+
// - explicit Date: use that value
|
|
26
|
+
// - explicit null: store NULL (clear it)
|
|
27
|
+
// - undefined: auto-compute from halflife_days, or NULL if halflife_days is null
|
|
28
|
+
let expiresAt;
|
|
29
|
+
if (opts?.expires_at !== undefined) {
|
|
30
|
+
expiresAt = opts.expires_at; // Date or null, both stored as-is
|
|
31
|
+
}
|
|
32
|
+
else if (halflifeDays !== null) {
|
|
33
|
+
expiresAt = new Date(Date.now() + halflifeDays * 86_400_000);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
expiresAt = null;
|
|
37
|
+
}
|
|
38
|
+
const result = await this.pg.query(`INSERT INTO pages (slug, type, title, compiled_truth, frontmatter, content_hash, halflife_days, expires_at)
|
|
39
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8::timestamptz)
|
|
40
|
+
ON CONFLICT (slug) DO UPDATE SET
|
|
41
|
+
type = EXCLUDED.type,
|
|
42
|
+
title = EXCLUDED.title,
|
|
43
|
+
compiled_truth = EXCLUDED.compiled_truth,
|
|
44
|
+
frontmatter = EXCLUDED.frontmatter,
|
|
45
|
+
content_hash = EXCLUDED.content_hash,
|
|
46
|
+
halflife_days = EXCLUDED.halflife_days,
|
|
47
|
+
updated_at = NOW()
|
|
48
|
+
RETURNING *`, [
|
|
49
|
+
slug,
|
|
50
|
+
type,
|
|
51
|
+
title,
|
|
52
|
+
compiled_truth,
|
|
53
|
+
JSON.stringify(frontmatter),
|
|
54
|
+
contentHash,
|
|
55
|
+
halflifeDays,
|
|
56
|
+
expiresAt,
|
|
57
|
+
]);
|
|
58
|
+
return this.rowToPage(result.rows[0]);
|
|
59
|
+
}
|
|
60
|
+
async getPage(slug) {
|
|
61
|
+
const result = await this.pg.query("SELECT * FROM pages WHERE slug = $1", [slug]);
|
|
62
|
+
return result.rows.length > 0 ? this.rowToPage(result.rows[0]) : null;
|
|
63
|
+
}
|
|
64
|
+
async deletePage(slug) {
|
|
65
|
+
await this.pg.query("DELETE FROM pages WHERE slug = $1", [slug]);
|
|
66
|
+
}
|
|
67
|
+
async listPages(opts) {
|
|
68
|
+
const params = [];
|
|
69
|
+
const conditions = [];
|
|
70
|
+
if (opts?.type) {
|
|
71
|
+
conditions.push(`type = $${params.length + 1}`);
|
|
72
|
+
params.push(opts.type);
|
|
73
|
+
}
|
|
74
|
+
if (opts?.exclude_types && opts.exclude_types.length > 0) {
|
|
75
|
+
conditions.push(`type != ALL($${params.length + 1}::text[])`);
|
|
76
|
+
params.push(opts.exclude_types);
|
|
77
|
+
}
|
|
78
|
+
const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(" AND ")}` : "";
|
|
79
|
+
const sortDir = opts?.order === "asc" ? "ASC" : "DESC";
|
|
80
|
+
let sql;
|
|
81
|
+
if (opts?.sort === "backlinks") {
|
|
82
|
+
sql = `SELECT p.* FROM pages p
|
|
83
|
+
LEFT JOIN (
|
|
84
|
+
SELECT to_page_id, COUNT(*) AS cnt FROM links GROUP BY to_page_id
|
|
85
|
+
) lc ON lc.to_page_id = p.id${whereClause}
|
|
86
|
+
ORDER BY COALESCE(lc.cnt, 0) ${sortDir}`;
|
|
87
|
+
}
|
|
88
|
+
else if (opts?.sort === "signal_time") {
|
|
89
|
+
sql = `SELECT * FROM pages${whereClause}
|
|
90
|
+
ORDER BY COALESCE(
|
|
91
|
+
frontmatter->'source'->>'timestamp',
|
|
92
|
+
frontmatter->'first_seen'->>'timestamp',
|
|
93
|
+
created_at::text
|
|
94
|
+
) ${sortDir}`;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const sortCol = ["updated_at", "created_at", "title"].includes(opts?.sort ?? "")
|
|
98
|
+
? (opts?.sort ?? "updated_at")
|
|
99
|
+
: "updated_at";
|
|
100
|
+
sql = `SELECT * FROM pages${whereClause} ORDER BY ${sortCol} ${sortDir}`;
|
|
101
|
+
}
|
|
102
|
+
if (opts?.limit) {
|
|
103
|
+
sql += ` LIMIT $${params.length + 1}`;
|
|
104
|
+
params.push(opts.limit);
|
|
105
|
+
}
|
|
106
|
+
const result = await this.pg.query(sql, params);
|
|
107
|
+
return result.rows.map((r) => this.rowToPage(r));
|
|
108
|
+
}
|
|
109
|
+
async listExpiredHot() {
|
|
110
|
+
const result = await this.pg.query(`SELECT * FROM pages
|
|
111
|
+
WHERE tier = 'hot'
|
|
112
|
+
AND expires_at IS NOT NULL
|
|
113
|
+
AND expires_at < NOW()
|
|
114
|
+
ORDER BY expires_at`);
|
|
115
|
+
return result.rows.map((r) => this.rowToPage(r));
|
|
116
|
+
}
|
|
117
|
+
async updatePageTier(id, tier, consolidatedInto) {
|
|
118
|
+
if (consolidatedInto !== undefined) {
|
|
119
|
+
await this.pg.query(`UPDATE pages SET tier = $1, consolidated_into = $2, updated_at = NOW() WHERE id = $3`, [tier, consolidatedInto, id]);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
await this.pg.query(`UPDATE pages SET tier = $1, updated_at = NOW() WHERE id = $2`, [
|
|
123
|
+
tier,
|
|
124
|
+
id,
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async listPagesByTier(tier) {
|
|
129
|
+
const result = await this.pg.query(`SELECT * FROM pages WHERE tier = $1 ORDER BY created_at`, [tier]);
|
|
130
|
+
return result.rows.map((r) => this.rowToPage(r));
|
|
131
|
+
}
|
|
132
|
+
rowToPage(row) {
|
|
133
|
+
return {
|
|
134
|
+
id: row.id,
|
|
135
|
+
slug: row.slug,
|
|
136
|
+
type: row.type,
|
|
137
|
+
title: row.title,
|
|
138
|
+
compiled_truth: row.compiled_truth,
|
|
139
|
+
frontmatter: typeof row.frontmatter === "string" ? JSON.parse(row.frontmatter) : row.frontmatter,
|
|
140
|
+
content_hash: row.content_hash,
|
|
141
|
+
halflife_days: row.halflife_days,
|
|
142
|
+
tier: row.tier ?? "hot",
|
|
143
|
+
expires_at: row.expires_at ?? null,
|
|
144
|
+
consolidated_into: row.consolidated_into ?? null,
|
|
145
|
+
created_at: row.created_at,
|
|
146
|
+
updated_at: row.updated_at,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/store/pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AA8C1C,SAAS,4BAA4B,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAA4B,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAE1C,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;IAE7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE,IAAqB;QAChE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC3F,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;QAEjD,0EAA0E;QAC1E,kCAAkC;QAClC,yCAAyC;QACzC,iFAAiF;QACjF,IAAI,SAAsB,CAAC;QAC3B,IAAI,IAAI,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;YACnC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,kCAAkC;QACjE,CAAC;aAAM,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;;;;;;;;mBAUa,EACb;YACE,IAAI;YACJ,IAAI;YACJ,KAAK;YACL,cAAc;YACd,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC3B,WAAW;YACX,YAAY;YACZ,SAAS;SACV,CACF,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAU,qCAAqC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAMf;QACC,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,GAAG,GAAG;;;sCAG0B,WAAW;uCACV,OAAO,EAAE,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,GAAG,GAAG,sBAAsB,WAAW;;;;;YAKjC,OAAO,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC9E,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC;gBAC9B,CAAC,CAAC,YAAY,CAAC;YACjB,GAAG,GAAG,sBAAsB,WAAW,aAAa,OAAO,IAAI,OAAO,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,GAAG,IAAI,WAAW,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAU,GAAG,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;;2BAIqB,CACtB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,IAAY,EAAE,gBAAgC;QAC7E,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjB,sFAAsF,EACtF,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAC7B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,8DAA8D,EAAE;gBAClF,IAAI;gBACJ,EAAE;aACH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,yDAAyD,EACzD,CAAC,IAAI,CAAC,CACP,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,GAAY;QAC5B,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,WAAW,EACT,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW;YACrF,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK;YACvB,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;YAClC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI;YAChD,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;SAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
+
export interface SearchResult {
|
|
3
|
+
slug: string;
|
|
4
|
+
title: string;
|
|
5
|
+
type: string;
|
|
6
|
+
snippet: string;
|
|
7
|
+
score: number;
|
|
8
|
+
highlights: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SearchFilterOpts {
|
|
11
|
+
limit?: number;
|
|
12
|
+
type?: string[];
|
|
13
|
+
from?: string;
|
|
14
|
+
to?: string;
|
|
15
|
+
platform?: string;
|
|
16
|
+
exclude_types?: string[];
|
|
17
|
+
}
|
|
18
|
+
interface SearchEngineOpts {
|
|
19
|
+
embedText?: (text: string) => Promise<number[]>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compute freshness multiplier using exponential decay.
|
|
23
|
+
* Returns 1.0 for missing timestamps (no effect).
|
|
24
|
+
* Exported for unit testing.
|
|
25
|
+
*/
|
|
26
|
+
export declare function freshnessMultiplier(updatedAt: string | null): number;
|
|
27
|
+
export declare class SearchEngine {
|
|
28
|
+
private pg;
|
|
29
|
+
private embedText?;
|
|
30
|
+
constructor(pg: PGlite, opts?: SearchEngineOpts);
|
|
31
|
+
search(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
|
|
32
|
+
query(query: string, opts?: SearchFilterOpts): Promise<SearchResult[]>;
|
|
33
|
+
private ftsChunkSearch;
|
|
34
|
+
private vectorSearch;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/store/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACjD;AA8BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMpE;AAED,qBAAa,YAAY;IAIrB,OAAO,CAAC,EAAE;IAHZ,OAAO,CAAC,SAAS,CAAC,CAAsC;gBAG9C,EAAE,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB;IAKnB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmFvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAkH9D,cAAc;YAiCd,YAAY;CAuB3B"}
|