@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,539 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Obsidian vault bidirectional sync.
|
|
3
|
+
*
|
|
4
|
+
* Implements `memoark export --vault <path>` and `memoark import --vault <path>`.
|
|
5
|
+
* See spec: docs/specs/memoark-2026-06-04-obsidian-sync.md (v7).
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { access, lstat, mkdir, open, readdir, readFile, rename, unlink, writeFile, } from "node:fs/promises";
|
|
9
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
10
|
+
import { parse as yamlParse, stringify as yamlStringify } from "yaml";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const RELATED_MARKER = "<!-- memoark:related -->";
|
|
15
|
+
const TIMELINE_MARKER = "<!-- memoark:timeline -->";
|
|
16
|
+
/** Unicode-safe slug regex (H3). */
|
|
17
|
+
const SLUG_REGEX = /^[\p{L}\p{N}_-]+(\/[\p{L}\p{N}_-]+)*$/u;
|
|
18
|
+
/** Windows reserved names (L6) — rejected on all platforms for portability. */
|
|
19
|
+
const WINDOWS_RESERVED = new Set([
|
|
20
|
+
"con",
|
|
21
|
+
"prn",
|
|
22
|
+
"aux",
|
|
23
|
+
"nul",
|
|
24
|
+
"com1",
|
|
25
|
+
"com2",
|
|
26
|
+
"com3",
|
|
27
|
+
"com4",
|
|
28
|
+
"com5",
|
|
29
|
+
"com6",
|
|
30
|
+
"com7",
|
|
31
|
+
"com8",
|
|
32
|
+
"com9",
|
|
33
|
+
"lpt1",
|
|
34
|
+
"lpt2",
|
|
35
|
+
"lpt3",
|
|
36
|
+
"lpt4",
|
|
37
|
+
"lpt5",
|
|
38
|
+
"lpt6",
|
|
39
|
+
"lpt7",
|
|
40
|
+
"lpt8",
|
|
41
|
+
"lpt9",
|
|
42
|
+
]);
|
|
43
|
+
const MAX_SLUG_LENGTH = 200;
|
|
44
|
+
/** Wikilink pattern: matches [[slug]] or [[slug|display]] with Unicode support. */
|
|
45
|
+
const WIKILINK_REGEX = /\[\[([^\]|]+?)(?:\|[^\]]+?)?\]\]/gu;
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Section 1: serializePage (Spec §4.4)
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Serialize a Page into Obsidian-compatible markdown.
|
|
51
|
+
*
|
|
52
|
+
* Fixes applied:
|
|
53
|
+
* H1: explicit fields written AFTER `...page.frontmatter` so they cannot be
|
|
54
|
+
* clobbered by user-supplied frontmatter that happens to share a key.
|
|
55
|
+
* M1: `updated_at` is NOT written to frontmatter — it would change every export
|
|
56
|
+
* even when content is identical, defeating incremental sync.
|
|
57
|
+
* N3: rebuild `## Aliases` body section from `frontmatter.aliases` each time
|
|
58
|
+
* (frontmatter is the single source of truth; the body section is derived).
|
|
59
|
+
*/
|
|
60
|
+
export function serializePage(page, tags, links, timeline, userEdited) {
|
|
61
|
+
const fm = {
|
|
62
|
+
// 1. spread page.frontmatter FIRST (low precedence — H1)
|
|
63
|
+
...page.frontmatter,
|
|
64
|
+
// 2. explicit fields LAST (high precedence — H1)
|
|
65
|
+
title: page.title,
|
|
66
|
+
type: page.type,
|
|
67
|
+
slug: page.slug,
|
|
68
|
+
tags,
|
|
69
|
+
links: links.map((l) => ({ target: l.to_slug, type: l.link_type })),
|
|
70
|
+
content_hash: page.content_hash,
|
|
71
|
+
user_edited: userEdited,
|
|
72
|
+
// NOTE: updated_at intentionally omitted (M1)
|
|
73
|
+
};
|
|
74
|
+
// N3: rebuild Aliases section from frontmatter, not from body
|
|
75
|
+
const aliases = page.frontmatter.aliases ?? [];
|
|
76
|
+
const compiledWithoutAliases = stripAliasesSection(page.compiled_truth);
|
|
77
|
+
const bodyParts = [];
|
|
78
|
+
if (aliases.length > 0) {
|
|
79
|
+
bodyParts.push("## Aliases", "");
|
|
80
|
+
for (const alias of aliases) {
|
|
81
|
+
bodyParts.push(`- ${alias}`);
|
|
82
|
+
}
|
|
83
|
+
bodyParts.push("");
|
|
84
|
+
}
|
|
85
|
+
bodyParts.push(compiledWithoutAliases.trim());
|
|
86
|
+
if (links.length > 0) {
|
|
87
|
+
bodyParts.push("", "<!-- memoark:related -->", "");
|
|
88
|
+
for (const link of links) {
|
|
89
|
+
bodyParts.push(`- [[${link.to_slug}]]`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (timeline.length > 0) {
|
|
93
|
+
bodyParts.push("", "<!-- memoark:timeline -->", "");
|
|
94
|
+
bodyParts.push("> ⚠️ Timeline 为只读派生数据,编辑此处不会同步回 DB", "");
|
|
95
|
+
for (const entry of timeline) {
|
|
96
|
+
bodyParts.push(`- **${entry.date}**: ${entry.summary}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const body = bodyParts.join("\n");
|
|
100
|
+
const fmYaml = yamlStringify(fm).trimEnd();
|
|
101
|
+
return `---\n${fmYaml}\n---\n\n${body}\n`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Strip `## Aliases\n\n- ...` section if it appears at the start of body.
|
|
105
|
+
*
|
|
106
|
+
* Only matches at body start so that mid-body Aliases-like headings stay intact.
|
|
107
|
+
*/
|
|
108
|
+
export function stripAliasesSection(body) {
|
|
109
|
+
const pattern = /^##\s+Aliases\s*\n+(?:- .+\n?)+\n*/;
|
|
110
|
+
return body.replace(pattern, "").trimStart();
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Split body into three sections by HTML comment markers.
|
|
114
|
+
*
|
|
115
|
+
* Fixes:
|
|
116
|
+
* M3: detect marker order reversal (timeline before related) and signal error.
|
|
117
|
+
*/
|
|
118
|
+
export function splitBody(body) {
|
|
119
|
+
const rIdx = body.indexOf(RELATED_MARKER);
|
|
120
|
+
const tIdx = body.indexOf(TIMELINE_MARKER);
|
|
121
|
+
// M3: timeline marker must come after related marker if both exist
|
|
122
|
+
if (rIdx >= 0 && tIdx >= 0 && tIdx < rIdx) {
|
|
123
|
+
return { mainBody: "", related: "", timeline: "", orderError: true };
|
|
124
|
+
}
|
|
125
|
+
let main = body;
|
|
126
|
+
let related = "";
|
|
127
|
+
let timeline = "";
|
|
128
|
+
// Split timeline first (later marker), then related
|
|
129
|
+
if (tIdx >= 0) {
|
|
130
|
+
timeline = main.slice(tIdx + TIMELINE_MARKER.length).trim();
|
|
131
|
+
main = main.slice(0, tIdx);
|
|
132
|
+
}
|
|
133
|
+
if (rIdx >= 0) {
|
|
134
|
+
related = main.slice(rIdx + RELATED_MARKER.length).trim();
|
|
135
|
+
main = main.slice(0, rIdx);
|
|
136
|
+
}
|
|
137
|
+
return { mainBody: main.trim(), related, timeline, orderError: false };
|
|
138
|
+
}
|
|
139
|
+
/** Validate slug: Unicode-safe + Windows reserved + length (H3 + L6). */
|
|
140
|
+
export function isValidSlug(slug) {
|
|
141
|
+
if (!slug || slug.length === 0)
|
|
142
|
+
return false;
|
|
143
|
+
if (slug.length > MAX_SLUG_LENGTH)
|
|
144
|
+
return false;
|
|
145
|
+
if (!SLUG_REGEX.test(slug))
|
|
146
|
+
return false;
|
|
147
|
+
for (const segment of slug.split("/")) {
|
|
148
|
+
if (WINDOWS_RESERVED.has(segment.toLowerCase()))
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
/** Convert a file path (relative to vault root) to slug. */
|
|
154
|
+
export function slugifyPath(relativePath) {
|
|
155
|
+
return relativePath.replace(/^\.\//, "").replace(/^\//, "").replace(/\.md$/i, "");
|
|
156
|
+
}
|
|
157
|
+
/** Extract all wikilink targets from text, stripping display suffix. */
|
|
158
|
+
export function extractWikilinks(text) {
|
|
159
|
+
const results = [];
|
|
160
|
+
const re = new RegExp(WIKILINK_REGEX.source, WIKILINK_REGEX.flags);
|
|
161
|
+
for (const match of text.matchAll(re)) {
|
|
162
|
+
results.push(match[1].trim());
|
|
163
|
+
}
|
|
164
|
+
return results;
|
|
165
|
+
}
|
|
166
|
+
function parseFrontmatterAndBody(content) {
|
|
167
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
168
|
+
if (!match) {
|
|
169
|
+
return { fm: {}, body: content };
|
|
170
|
+
}
|
|
171
|
+
const fm = (yamlParse(match[1]) ?? {});
|
|
172
|
+
return { fm, body: match[2] };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Parse a vault markdown file into the pieces needed for putPage / addTag / addLink.
|
|
176
|
+
*
|
|
177
|
+
* Fixes:
|
|
178
|
+
* H2-incomplete: filter links by type — only obsidian and bare strings are
|
|
179
|
+
* taken as user-editable; pipeline-managed types (works_on,
|
|
180
|
+
* collaborates, etc.) are ignored here so they cannot be
|
|
181
|
+
* duplicated as obsidian-type edges on round-trip.
|
|
182
|
+
* H4: inject user_edited=true into cleanMarkdown so putPage persists the lock.
|
|
183
|
+
* M3: throw if body marker order is reversed.
|
|
184
|
+
* M7: timeline section is NOT parsed (export-only).
|
|
185
|
+
* L4: body `## Aliases` section is not interpreted — only frontmatter is.
|
|
186
|
+
*/
|
|
187
|
+
export function parseVaultFile(content, relativePath) {
|
|
188
|
+
const { fm, body } = parseFrontmatterAndBody(content);
|
|
189
|
+
const slugRaw = fm.slug ?? slugifyPath(relativePath);
|
|
190
|
+
if (!isValidSlug(slugRaw)) {
|
|
191
|
+
throw new Error(`invalid slug: ${slugRaw}`);
|
|
192
|
+
}
|
|
193
|
+
const slug = slugRaw;
|
|
194
|
+
const split = splitBody(body);
|
|
195
|
+
if (split.orderError) {
|
|
196
|
+
throw new Error("marker order incorrect: timeline appears before related");
|
|
197
|
+
}
|
|
198
|
+
// H2-incomplete: filter frontmatter links to obsidian-type only
|
|
199
|
+
const rawFmLinks = Array.isArray(fm.links) ? fm.links : [];
|
|
200
|
+
const fmLinks = [];
|
|
201
|
+
for (const item of rawFmLinks) {
|
|
202
|
+
if (typeof item === "string") {
|
|
203
|
+
fmLinks.push(item);
|
|
204
|
+
}
|
|
205
|
+
else if (item && typeof item === "object") {
|
|
206
|
+
const obj = item;
|
|
207
|
+
if (typeof obj.target === "string") {
|
|
208
|
+
const type = obj.type;
|
|
209
|
+
if (type === undefined || type === null || type === "obsidian") {
|
|
210
|
+
fmLinks.push(obj.target);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Wikilinks from main body (always treated as obsidian)
|
|
216
|
+
const bodyLinks = extractWikilinks(split.mainBody);
|
|
217
|
+
const links = Array.from(new Set([...fmLinks, ...bodyLinks]));
|
|
218
|
+
const tags = Array.isArray(fm.tags) ? fm.tags : [];
|
|
219
|
+
// Build clean frontmatter for putPage (strip sync-layer metadata)
|
|
220
|
+
const cleanFm = { ...fm };
|
|
221
|
+
delete cleanFm.slug;
|
|
222
|
+
delete cleanFm.tags;
|
|
223
|
+
delete cleanFm.links;
|
|
224
|
+
delete cleanFm.content_hash;
|
|
225
|
+
delete cleanFm.user_edited;
|
|
226
|
+
// H4: stamp user_edited=true
|
|
227
|
+
cleanFm.user_edited = true;
|
|
228
|
+
const cleanFmYaml = yamlStringify(cleanFm).trimEnd();
|
|
229
|
+
// M7: drop timeline section from main body; keep mainBody only
|
|
230
|
+
const cleanMarkdown = `---\n${cleanFmYaml}\n---\n\n${split.mainBody}\n`;
|
|
231
|
+
return { slug, cleanMarkdown, tags, links };
|
|
232
|
+
}
|
|
233
|
+
// ============================================================================
|
|
234
|
+
// Section 3: Manifest I/O (Spec §4.7 + §7.8)
|
|
235
|
+
// ============================================================================
|
|
236
|
+
const MANIFEST_FILENAME = ".memoark-sync.json";
|
|
237
|
+
const MANIFEST_VERSION = 2;
|
|
238
|
+
/** Load the sync manifest from a vault. Returns null if missing or invalid. */
|
|
239
|
+
export async function loadManifest(vaultPath) {
|
|
240
|
+
const path = join(vaultPath, MANIFEST_FILENAME);
|
|
241
|
+
try {
|
|
242
|
+
const raw = await readFile(path, "utf-8");
|
|
243
|
+
const parsed = JSON.parse(raw);
|
|
244
|
+
if (parsed.version !== MANIFEST_VERSION)
|
|
245
|
+
return null;
|
|
246
|
+
if (!parsed.pages || typeof parsed.pages !== "object")
|
|
247
|
+
return null;
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// Missing, unreadable, or malformed — treat as no manifest
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Atomically write the sync manifest (M8 + N2).
|
|
257
|
+
*
|
|
258
|
+
* Procedure:
|
|
259
|
+
* 1. open(tmpPath, "w") → write JSON → handle.sync() → handle.close()
|
|
260
|
+
* 2. rename(tmpPath, targetPath) — POSIX atomic
|
|
261
|
+
* 3. On error: close handle if open, unlink tmp
|
|
262
|
+
*
|
|
263
|
+
* Note: Node `fs.fsync()` takes a file descriptor, not a path. We use
|
|
264
|
+
* `FileHandle.sync()` which is the FileHandle API's wrapper around fsync(fd).
|
|
265
|
+
*/
|
|
266
|
+
export async function saveManifest(vaultPath, manifest) {
|
|
267
|
+
const targetPath = join(vaultPath, MANIFEST_FILENAME);
|
|
268
|
+
const tmpPath = `${targetPath}.tmp`;
|
|
269
|
+
let handle = null;
|
|
270
|
+
try {
|
|
271
|
+
handle = await open(tmpPath, "w");
|
|
272
|
+
await handle.writeFile(JSON.stringify(manifest, null, 2), "utf-8");
|
|
273
|
+
await handle.sync();
|
|
274
|
+
await handle.close();
|
|
275
|
+
handle = null;
|
|
276
|
+
await rename(tmpPath, targetPath);
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
279
|
+
if (handle)
|
|
280
|
+
await handle.close().catch(() => { });
|
|
281
|
+
await unlink(tmpPath).catch(() => { });
|
|
282
|
+
throw e;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
function sha256(content) {
|
|
286
|
+
return createHash("sha256").update(content).digest("hex");
|
|
287
|
+
}
|
|
288
|
+
function nowIso() {
|
|
289
|
+
return new Date().toISOString();
|
|
290
|
+
}
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Section 5: exportToVault (Spec §5)
|
|
293
|
+
// ============================================================================
|
|
294
|
+
export async function exportToVault(stores, vaultPath, opts = {}) {
|
|
295
|
+
const result = { written: 0, skipped: 0, errors: [] };
|
|
296
|
+
// 1. Ensure vault directory exists
|
|
297
|
+
await mkdir(vaultPath, { recursive: true });
|
|
298
|
+
// 2. Load old manifest
|
|
299
|
+
const oldManifest = await loadManifest(vaultPath);
|
|
300
|
+
// 3. List all pages
|
|
301
|
+
const pages = await stores.pages.listPages({ limit: 100000 });
|
|
302
|
+
// 4. M6: batch pre-query tags / links / timeline
|
|
303
|
+
const [tagsBySlug, linksBySlug, timelineBySlug] = await Promise.all([
|
|
304
|
+
stores.tags.getAllTagsGrouped(),
|
|
305
|
+
stores.graph.getAllLinksGrouped(),
|
|
306
|
+
stores.timeline.getAllTimelineGrouped(),
|
|
307
|
+
]);
|
|
308
|
+
// 5. Build new manifest as we go
|
|
309
|
+
const newManifest = {
|
|
310
|
+
version: 2,
|
|
311
|
+
last_sync_at: nowIso(),
|
|
312
|
+
last_sync_op: "export",
|
|
313
|
+
pages: {},
|
|
314
|
+
};
|
|
315
|
+
// 6. Per-page serialization
|
|
316
|
+
for (const page of pages) {
|
|
317
|
+
try {
|
|
318
|
+
const tags = tagsBySlug.get(page.slug) ?? [];
|
|
319
|
+
const links = linksBySlug.get(page.slug) ?? [];
|
|
320
|
+
const timeline = timelineBySlug.get(page.slug) ?? [];
|
|
321
|
+
const userEdited = oldManifest?.pages[page.slug]?.user_edited ?? false;
|
|
322
|
+
const content = serializePage(page, tags, links, timeline, userEdited);
|
|
323
|
+
const fileHash = sha256(content);
|
|
324
|
+
const previousFileHash = oldManifest?.pages[page.slug]?.file_hash;
|
|
325
|
+
const unchanged = !opts.force && previousFileHash === fileHash;
|
|
326
|
+
if (!unchanged && !opts.dryRun) {
|
|
327
|
+
const filePath = join(vaultPath, `${page.slug}.md`);
|
|
328
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
329
|
+
await writeFile(filePath, content, "utf-8");
|
|
330
|
+
}
|
|
331
|
+
newManifest.pages[page.slug] = {
|
|
332
|
+
file_hash: fileHash,
|
|
333
|
+
db_content_hash_at_last_sync: page.content_hash,
|
|
334
|
+
last_synced_at: newManifest.last_sync_at,
|
|
335
|
+
last_synced_op: "export",
|
|
336
|
+
user_edited: userEdited,
|
|
337
|
+
};
|
|
338
|
+
if (unchanged) {
|
|
339
|
+
result.skipped += 1;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
result.written += 1;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
result.errors.push({
|
|
347
|
+
slug: page.slug,
|
|
348
|
+
reason: e instanceof Error ? e.message : String(e),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// 7. Persist manifest
|
|
353
|
+
if (!opts.dryRun) {
|
|
354
|
+
await saveManifest(vaultPath, newManifest);
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
// ============================================================================
|
|
359
|
+
// Section 6: importFromVault (Spec §6)
|
|
360
|
+
// ============================================================================
|
|
361
|
+
/**
|
|
362
|
+
* Recursively scan markdown files in vault. Defensive against symlinks (L8).
|
|
363
|
+
*/
|
|
364
|
+
async function scanMarkdownFiles(dir, vaultRoot, results = []) {
|
|
365
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
366
|
+
for (const entry of entries) {
|
|
367
|
+
const fullPath = join(dir, entry.name);
|
|
368
|
+
// L8: refuse to follow symlinks
|
|
369
|
+
const stat = await lstat(fullPath);
|
|
370
|
+
if (stat.isSymbolicLink())
|
|
371
|
+
continue;
|
|
372
|
+
// Defensive: stay within vault boundary
|
|
373
|
+
const resolved = resolve(fullPath);
|
|
374
|
+
if (!resolved.startsWith(resolve(vaultRoot) + sep) && resolved !== resolve(vaultRoot)) {
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
if (entry.isDirectory()) {
|
|
378
|
+
if (entry.name.startsWith("."))
|
|
379
|
+
continue;
|
|
380
|
+
if (entry.name === "node_modules")
|
|
381
|
+
continue;
|
|
382
|
+
await scanMarkdownFiles(fullPath, vaultRoot, results);
|
|
383
|
+
}
|
|
384
|
+
else if (entry.isFile()) {
|
|
385
|
+
if (!entry.name.endsWith(".md"))
|
|
386
|
+
continue;
|
|
387
|
+
results.push(fullPath);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return results;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Read vault file content, returning null when the file is an iCloud
|
|
394
|
+
* placeholder or empty (L7 + N1).
|
|
395
|
+
*/
|
|
396
|
+
async function readVaultFile(filePath) {
|
|
397
|
+
// L7: check for iCloud placeholder sibling .filename.icloud
|
|
398
|
+
const dir = dirname(filePath);
|
|
399
|
+
const base = filePath.slice(dir.length + 1);
|
|
400
|
+
const placeholderPath = join(dir, `.${base}.icloud`);
|
|
401
|
+
try {
|
|
402
|
+
await access(placeholderPath);
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
// No placeholder — proceed
|
|
407
|
+
}
|
|
408
|
+
const content = await readFile(filePath, "utf-8");
|
|
409
|
+
// N1: only flag genuinely empty content (the v4 regex /^[ -]+/ was nonsense)
|
|
410
|
+
if (content.length === 0 || content.trim().length === 0) {
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
return content;
|
|
414
|
+
}
|
|
415
|
+
export async function importFromVault(stores, vaultPath, opts = {}) {
|
|
416
|
+
const result = {
|
|
417
|
+
imported: 0,
|
|
418
|
+
skipped: 0,
|
|
419
|
+
errors: [],
|
|
420
|
+
warnings: [],
|
|
421
|
+
};
|
|
422
|
+
// 1. Verify vault exists
|
|
423
|
+
await access(vaultPath);
|
|
424
|
+
// 2. Load existing manifest (may be null on first import)
|
|
425
|
+
const manifest = (await loadManifest(vaultPath)) ??
|
|
426
|
+
{
|
|
427
|
+
version: 2,
|
|
428
|
+
last_sync_at: nowIso(),
|
|
429
|
+
last_sync_op: "import",
|
|
430
|
+
pages: {},
|
|
431
|
+
};
|
|
432
|
+
// 3. Scan vault for markdown files
|
|
433
|
+
const files = await scanMarkdownFiles(vaultPath, vaultPath);
|
|
434
|
+
for (const filePath of files) {
|
|
435
|
+
const relPath = relative(vaultPath, filePath);
|
|
436
|
+
try {
|
|
437
|
+
const content = await readVaultFile(filePath);
|
|
438
|
+
if (content === null) {
|
|
439
|
+
result.warnings.push({
|
|
440
|
+
slug: relPath,
|
|
441
|
+
reason: "iCloud placeholder or empty file — skipping",
|
|
442
|
+
});
|
|
443
|
+
result.skipped += 1;
|
|
444
|
+
continue;
|
|
445
|
+
}
|
|
446
|
+
const fileHash = sha256(content);
|
|
447
|
+
// 4. Parse to extract slug (needed for hash comparison)
|
|
448
|
+
const parsed = parseVaultFile(content, relPath);
|
|
449
|
+
const slug = parsed.slug;
|
|
450
|
+
const previousFileHash = manifest.pages[slug]?.file_hash;
|
|
451
|
+
if (!opts.force && previousFileHash === fileHash) {
|
|
452
|
+
result.skipped += 1;
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
// 5. H5: detect DB-side changes between syncs
|
|
456
|
+
const existingPage = await stores.pages.getPage(slug);
|
|
457
|
+
const recordedDbHash = manifest.pages[slug]?.db_content_hash_at_last_sync;
|
|
458
|
+
if (!opts.force &&
|
|
459
|
+
existingPage &&
|
|
460
|
+
recordedDbHash &&
|
|
461
|
+
existingPage.content_hash !== recordedDbHash) {
|
|
462
|
+
result.warnings.push({
|
|
463
|
+
slug,
|
|
464
|
+
reason: "DB content changed since last sync — your vault edits will overwrite DB changes",
|
|
465
|
+
});
|
|
466
|
+
if (opts.strictConflict) {
|
|
467
|
+
result.skipped += 1;
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (opts.dryRun) {
|
|
472
|
+
result.imported += 1;
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
// 6. Per-file write sequence (M2 deferred — see Spec §7.9 note)
|
|
476
|
+
//
|
|
477
|
+
// NOTE: We do NOT wrap in pg.transaction() — PGlite's transaction uses
|
|
478
|
+
// a mutex on the single connection, and store methods using `this.pg.query`
|
|
479
|
+
// (instead of tx.query) would deadlock waiting for the mutex to release.
|
|
480
|
+
// Refactoring all store methods to accept tx is out of scope.
|
|
481
|
+
//
|
|
482
|
+
// Atomicity guarantee: NONE. We rely on idempotent upserts:
|
|
483
|
+
// - putPage: INSERT ... ON CONFLICT UPDATE (idempotent)
|
|
484
|
+
// - addTag: INSERT ... ON CONFLICT DO NOTHING (idempotent)
|
|
485
|
+
// - addLink: INSERT ... ON CONFLICT UPDATE (idempotent)
|
|
486
|
+
// - rechunk: DELETE + INSERT (eventual consistency; retry-safe)
|
|
487
|
+
//
|
|
488
|
+
// If the process crashes mid-write, the next `memoark import` run will
|
|
489
|
+
// re-process the file (file_hash will still differ) and reach a
|
|
490
|
+
// consistent state. Worst case: chunks briefly out of date.
|
|
491
|
+
const newPage = await stores.pages.putPage(slug, parsed.cleanMarkdown);
|
|
492
|
+
for (const tag of parsed.tags) {
|
|
493
|
+
await stores.tags.addTag(slug, tag);
|
|
494
|
+
}
|
|
495
|
+
// H2-incomplete: only add obsidian-typed links; do not touch
|
|
496
|
+
// pipeline-typed links (works_on, collaborates, mentions, etc.)
|
|
497
|
+
const existingLinks = await stores.graph.getLinks(slug);
|
|
498
|
+
const existingObsidian = new Set(existingLinks.filter((l) => l.link_type === "obsidian").map((l) => l.to_slug));
|
|
499
|
+
for (const target of parsed.links) {
|
|
500
|
+
if (existingObsidian.has(target))
|
|
501
|
+
continue;
|
|
502
|
+
try {
|
|
503
|
+
await stores.graph.addLink(slug, target, "obsidian", "from obsidian vault");
|
|
504
|
+
}
|
|
505
|
+
catch (linkErr) {
|
|
506
|
+
// Target may not exist — warn, do not fail
|
|
507
|
+
result.warnings.push({
|
|
508
|
+
slug,
|
|
509
|
+
reason: `addLink ${slug} → ${target}: ${linkErr instanceof Error ? linkErr.message : String(linkErr)}`,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
// M7: NOT processing timeline (export-only)
|
|
514
|
+
await stores.chunks.rechunk(newPage.id, newPage.compiled_truth);
|
|
515
|
+
manifest.pages[slug] = {
|
|
516
|
+
file_hash: fileHash,
|
|
517
|
+
db_content_hash_at_last_sync: newPage.content_hash,
|
|
518
|
+
last_synced_at: nowIso(),
|
|
519
|
+
last_synced_op: "import",
|
|
520
|
+
user_edited: true,
|
|
521
|
+
};
|
|
522
|
+
result.imported += 1;
|
|
523
|
+
}
|
|
524
|
+
catch (e) {
|
|
525
|
+
result.errors.push({
|
|
526
|
+
file: relPath,
|
|
527
|
+
reason: e instanceof Error ? e.message : String(e),
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
// 7. Persist manifest
|
|
532
|
+
if (!opts.dryRun) {
|
|
533
|
+
manifest.last_sync_at = nowIso();
|
|
534
|
+
manifest.last_sync_op = "import";
|
|
535
|
+
await saveManifest(vaultPath, manifest);
|
|
536
|
+
}
|
|
537
|
+
return result;
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=obsidian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/sync/obsidian.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@andre.li/memoark",
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "Local-first personal memory extraction and storage",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"memoark": "./bin/memoark.mjs"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/cli.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/",
|
|
15
|
+
"bin/",
|
|
16
|
+
"README.md",
|
|
17
|
+
"README.en.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"homepage": "https://github.com/AndreLYL/memoark#readme",
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/AndreLYL/memoark/issues"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"dev": "bun src/cli.ts",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest --watch",
|
|
31
|
+
"gen:assets": "node scripts/gen-embedded-assets.mjs",
|
|
32
|
+
"build": "node scripts/gen-embedded-assets.mjs && tsc && node scripts/post-build.mjs",
|
|
33
|
+
"compile": "node scripts/gen-embedded-assets.mjs && bun build --compile src/cli.ts --outfile dist-bin/memoark",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"prepublishOnly": "npm run build",
|
|
36
|
+
"lint": "biome check src/ tests/",
|
|
37
|
+
"lint:fix": "biome check --fix src/ tests/",
|
|
38
|
+
"format": "biome format --write src/ tests/",
|
|
39
|
+
"serve": "bun src/cli.ts serve",
|
|
40
|
+
"web:dev": "cd web && bun run dev",
|
|
41
|
+
"web:build": "cd web && bun run build",
|
|
42
|
+
"web:preview": "cd web && bun run preview"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@electric-sql/pglite": "^0.4.6",
|
|
46
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
47
|
+
"commander": "^11.1.0",
|
|
48
|
+
"hono": "^4.12.23",
|
|
49
|
+
"ink": "^7.0.5",
|
|
50
|
+
"openai": "^6.39.0",
|
|
51
|
+
"react": "^19.2.7",
|
|
52
|
+
"react-devtools-core": "^6.1.5",
|
|
53
|
+
"yaml": "^2.3.4",
|
|
54
|
+
"zod": "^3.22.4"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@biomejs/biome": "^2.4.15",
|
|
58
|
+
"@types/bun": "latest",
|
|
59
|
+
"@types/node": "^25.9.1",
|
|
60
|
+
"@types/react": "^19.2.16",
|
|
61
|
+
"fast-glob": "^3.3.3",
|
|
62
|
+
"typescript": "^6.0.3",
|
|
63
|
+
"vitest": "^1.0.4"
|
|
64
|
+
},
|
|
65
|
+
"keywords": [
|
|
66
|
+
"knowledge-graph",
|
|
67
|
+
"signal-extraction",
|
|
68
|
+
"claude-code",
|
|
69
|
+
"codex",
|
|
70
|
+
"ai-agent",
|
|
71
|
+
"conversation-mining",
|
|
72
|
+
"cli"
|
|
73
|
+
],
|
|
74
|
+
"author": "AndreLYL",
|
|
75
|
+
"license": "Apache-2.0",
|
|
76
|
+
"repository": {
|
|
77
|
+
"type": "git",
|
|
78
|
+
"url": "https://github.com/AndreLYL/memoark.git"
|
|
79
|
+
},
|
|
80
|
+
"engines": {
|
|
81
|
+
"node": ">=18.0.0",
|
|
82
|
+
"bun": ">=1.0.0"
|
|
83
|
+
}
|
|
84
|
+
}
|