@andre.li/memoark 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +388 -69
- package/README.md +674 -309
- package/README.zh-CN.md +816 -0
- package/bin/memoark.mjs +7 -2
- package/dist/adapters/store.d.ts.map +1 -1
- package/dist/adapters/store.js +6 -5
- package/dist/adapters/store.js.map +1 -1
- package/dist/cli-helpers.d.ts +12 -0
- package/dist/cli-helpers.d.ts.map +1 -0
- package/dist/cli-helpers.js +11 -0
- package/dist/cli-helpers.js.map +1 -0
- package/dist/cli.js +682 -126
- package/dist/cli.js.map +1 -1
- package/dist/collectors/feishu/chat-name-resolver.d.ts +33 -0
- package/dist/collectors/feishu/chat-name-resolver.d.ts.map +1 -0
- package/dist/collectors/feishu/chat-name-resolver.js +63 -0
- package/dist/collectors/feishu/chat-name-resolver.js.map +1 -0
- package/dist/collectors/feishu/collector.d.ts +4 -0
- package/dist/collectors/feishu/collector.d.ts.map +1 -1
- package/dist/collectors/feishu/collector.js +27 -4
- package/dist/collectors/feishu/collector.js.map +1 -1
- package/dist/collectors/feishu/docs/blocks.d.ts +25 -0
- package/dist/collectors/feishu/docs/blocks.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/blocks.js +34 -0
- package/dist/collectors/feishu/docs/blocks.js.map +1 -0
- package/dist/collectors/feishu/docs/candidate.d.ts +17 -0
- package/dist/collectors/feishu/docs/candidate.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/candidate.js +36 -0
- package/dist/collectors/feishu/docs/candidate.js.map +1 -0
- package/dist/collectors/feishu/docs/config.d.ts +41 -0
- package/dist/collectors/feishu/docs/config.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/config.js +30 -0
- package/dist/collectors/feishu/docs/config.js.map +1 -0
- package/dist/collectors/feishu/docs/decision.d.ts +14 -0
- package/dist/collectors/feishu/docs/decision.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/decision.js +43 -0
- package/dist/collectors/feishu/docs/decision.js.map +1 -0
- package/dist/collectors/feishu/docs/full-builder.d.ts +17 -0
- package/dist/collectors/feishu/docs/full-builder.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/full-builder.js +136 -0
- package/dist/collectors/feishu/docs/full-builder.js.map +1 -0
- package/dist/collectors/feishu/docs/hash.d.ts +8 -0
- package/dist/collectors/feishu/docs/hash.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/hash.js +15 -0
- package/dist/collectors/feishu/docs/hash.js.map +1 -0
- package/dist/collectors/feishu/docs/ingest.d.ts +54 -0
- package/dist/collectors/feishu/docs/ingest.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/ingest.js +120 -0
- package/dist/collectors/feishu/docs/ingest.js.map +1 -0
- package/dist/collectors/feishu/docs/llm-json.d.ts +13 -0
- package/dist/collectors/feishu/docs/llm-json.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/llm-json.js +40 -0
- package/dist/collectors/feishu/docs/llm-json.js.map +1 -0
- package/dist/collectors/feishu/docs/pointer-builder.d.ts +7 -0
- package/dist/collectors/feishu/docs/pointer-builder.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/pointer-builder.js +11 -0
- package/dist/collectors/feishu/docs/pointer-builder.js.map +1 -0
- package/dist/collectors/feishu/docs/render.d.ts +8 -0
- package/dist/collectors/feishu/docs/render.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/render.js +105 -0
- package/dist/collectors/feishu/docs/render.js.map +1 -0
- package/dist/collectors/feishu/docs/run.d.ts +37 -0
- package/dist/collectors/feishu/docs/run.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/run.js +143 -0
- package/dist/collectors/feishu/docs/run.js.map +1 -0
- package/dist/collectors/feishu/docs/status.d.ts +16 -0
- package/dist/collectors/feishu/docs/status.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/status.js +24 -0
- package/dist/collectors/feishu/docs/status.js.map +1 -0
- package/dist/collectors/feishu/docs/store-writer.d.ts +32 -0
- package/dist/collectors/feishu/docs/store-writer.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/store-writer.js +71 -0
- package/dist/collectors/feishu/docs/store-writer.js.map +1 -0
- package/dist/collectors/feishu/docs/toc.d.ts +3 -0
- package/dist/collectors/feishu/docs/toc.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/toc.js +19 -0
- package/dist/collectors/feishu/docs/toc.js.map +1 -0
- package/dist/collectors/feishu/docs/triggers.d.ts +7 -0
- package/dist/collectors/feishu/docs/triggers.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/triggers.js +31 -0
- package/dist/collectors/feishu/docs/triggers.js.map +1 -0
- package/dist/collectors/feishu/docs/types.d.ts +109 -0
- package/dist/collectors/feishu/docs/types.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/types.js +2 -0
- package/dist/collectors/feishu/docs/types.js.map +1 -0
- package/dist/collectors/feishu/docs/upgrade-queue.d.ts +19 -0
- package/dist/collectors/feishu/docs/upgrade-queue.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/upgrade-queue.js +36 -0
- package/dist/collectors/feishu/docs/upgrade-queue.js.map +1 -0
- package/dist/collectors/feishu/docs/url-parser.d.ts +3 -0
- package/dist/collectors/feishu/docs/url-parser.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/url-parser.js +39 -0
- package/dist/collectors/feishu/docs/url-parser.js.map +1 -0
- package/dist/collectors/feishu/docs/walkers.d.ts +24 -0
- package/dist/collectors/feishu/docs/walkers.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/walkers.js +90 -0
- package/dist/collectors/feishu/docs/walkers.js.map +1 -0
- package/dist/collectors/feishu/docs/wiki-resolver.d.ts +15 -0
- package/dist/collectors/feishu/docs/wiki-resolver.d.ts.map +1 -0
- package/dist/collectors/feishu/docs/wiki-resolver.js +24 -0
- package/dist/collectors/feishu/docs/wiki-resolver.js.map +1 -0
- package/dist/collectors/feishu/lark-cli-client.d.ts +12 -0
- package/dist/collectors/feishu/lark-cli-client.d.ts.map +1 -1
- package/dist/collectors/feishu/lark-cli-client.js +37 -2
- package/dist/collectors/feishu/lark-cli-client.js.map +1 -1
- package/dist/collectors/feishu/lark-cli-identity-backend.d.ts +28 -0
- package/dist/collectors/feishu/lark-cli-identity-backend.d.ts.map +1 -0
- package/dist/collectors/feishu/lark-cli-identity-backend.js +110 -0
- package/dist/collectors/feishu/lark-cli-identity-backend.js.map +1 -0
- package/dist/collectors/feishu/self-open-id.d.ts +20 -0
- package/dist/collectors/feishu/self-open-id.d.ts.map +1 -0
- package/dist/collectors/feishu/self-open-id.js +31 -0
- package/dist/collectors/feishu/self-open-id.js.map +1 -0
- package/dist/collectors/feishu/sources/dm.d.ts.map +1 -1
- package/dist/collectors/feishu/sources/dm.js +4 -0
- package/dist/collectors/feishu/sources/dm.js.map +1 -1
- package/dist/collectors/feishu/sources/mail.d.ts.map +1 -1
- package/dist/collectors/feishu/sources/mail.js +18 -20
- package/dist/collectors/feishu/sources/mail.js.map +1 -1
- package/dist/collectors/feishu/sources/messages.d.ts +2 -0
- package/dist/collectors/feishu/sources/messages.d.ts.map +1 -1
- package/dist/collectors/feishu/sources/messages.js +28 -1
- package/dist/collectors/feishu/sources/messages.js.map +1 -1
- package/dist/collectors/feishu/types.d.ts +37 -3
- package/dist/collectors/feishu/types.d.ts.map +1 -1
- package/dist/collectors/feishu/types.js.map +1 -1
- package/dist/config-center/connection-checks.d.ts.map +1 -1
- package/dist/config-center/connection-checks.js +1 -1
- package/dist/config-center/connection-checks.js.map +1 -1
- package/dist/config-center/schema.d.ts.map +1 -1
- package/dist/config-center/schema.js +77 -0
- package/dist/config-center/schema.js.map +1 -1
- package/dist/consolidator/consolidator.d.ts +13 -1
- package/dist/consolidator/consolidator.d.ts.map +1 -1
- package/dist/consolidator/consolidator.js +12 -2
- package/dist/consolidator/consolidator.js.map +1 -1
- package/dist/core/canonicalize.js +5 -1
- package/dist/core/canonicalize.js.map +1 -1
- package/dist/core/config.d.ts +52 -9
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +86 -24
- package/dist/core/config.js.map +1 -1
- package/dist/core/env-validation.d.ts +9 -0
- package/dist/core/env-validation.d.ts.map +1 -0
- package/dist/core/env-validation.js +94 -0
- package/dist/core/env-validation.js.map +1 -0
- package/dist/core/identity-resolver.d.ts +24 -3
- package/dist/core/identity-resolver.d.ts.map +1 -1
- package/dist/core/identity-resolver.js +147 -2
- package/dist/core/identity-resolver.js.map +1 -1
- package/dist/core/person-identity.d.ts +124 -0
- package/dist/core/person-identity.d.ts.map +1 -0
- package/dist/core/person-identity.js +342 -0
- package/dist/core/person-identity.js.map +1 -0
- package/dist/core/person-slug.d.ts +21 -0
- package/dist/core/person-slug.d.ts.map +1 -0
- package/dist/core/person-slug.js +93 -0
- package/dist/core/person-slug.js.map +1 -0
- package/dist/core/pipeline-factory.d.ts +1 -1
- package/dist/core/pipeline-factory.d.ts.map +1 -1
- package/dist/core/pipeline-factory.js +8 -3
- package/dist/core/pipeline-factory.js.map +1 -1
- package/dist/core/pipeline.d.ts +16 -0
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +49 -1
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/resource-loader.d.ts +2 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +12 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/schemas.d.ts +2981 -309
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +27 -0
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/signal-scoring.d.ts.map +1 -1
- package/dist/core/signal-scoring.js +5 -1
- package/dist/core/signal-scoring.js.map +1 -1
- package/dist/core/source-ref.d.ts +4 -0
- package/dist/core/source-ref.d.ts.map +1 -0
- package/dist/core/source-ref.js +24 -0
- package/dist/core/source-ref.js.map +1 -0
- package/dist/core/state.d.ts +1 -1
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +3 -2
- package/dist/core/state.js.map +1 -1
- package/dist/core/types.d.ts +34 -6
- package/dist/core/types.d.ts.map +1 -1
- package/dist/daemon/reload-manager.d.ts +27 -0
- package/dist/daemon/reload-manager.d.ts.map +1 -0
- package/dist/daemon/reload-manager.js +67 -0
- package/dist/daemon/reload-manager.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +9 -1
- package/dist/daemon/scheduler.d.ts.map +1 -1
- package/dist/daemon/scheduler.js +113 -38
- package/dist/daemon/scheduler.js.map +1 -1
- package/dist/daemon/serve-runtime.d.ts +31 -0
- package/dist/daemon/serve-runtime.d.ts.map +1 -0
- package/dist/daemon/serve-runtime.js +230 -0
- package/dist/daemon/serve-runtime.js.map +1 -0
- package/dist/embedded-assets.generated.d.ts.map +1 -1
- package/dist/embedded-assets.generated.js +3 -3
- package/dist/embedded-assets.generated.js.map +1 -1
- package/dist/extractors/playbook-extractor.d.ts +35 -0
- package/dist/extractors/playbook-extractor.d.ts.map +1 -0
- package/dist/extractors/playbook-extractor.js +98 -0
- package/dist/extractors/playbook-extractor.js.map +1 -0
- package/dist/extractors/prompts/examples/agent-session.md +257 -0
- package/dist/extractors/prompts/signal-extract.md +199 -0
- package/dist/extractors/prompts/system.md +45 -0
- package/dist/extractors/signal-extractor.d.ts +2 -1
- package/dist/extractors/signal-extractor.d.ts.map +1 -1
- package/dist/extractors/signal-extractor.js +99 -7
- package/dist/extractors/signal-extractor.js.map +1 -1
- package/dist/hooks/handlers.d.ts +21 -0
- package/dist/hooks/handlers.d.ts.map +1 -0
- package/dist/hooks/handlers.js +22 -0
- package/dist/hooks/handlers.js.map +1 -0
- package/dist/hooks/inject.d.ts +7 -0
- package/dist/hooks/inject.d.ts.map +1 -0
- package/dist/hooks/inject.js +18 -0
- package/dist/hooks/inject.js.map +1 -0
- package/dist/hooks/install.d.ts +14 -0
- package/dist/hooks/install.d.ts.map +1 -0
- package/dist/hooks/install.js +34 -0
- package/dist/hooks/install.js.map +1 -0
- package/dist/hooks/output.d.ts +19 -0
- package/dist/hooks/output.d.ts.map +1 -0
- package/dist/hooks/output.js +13 -0
- package/dist/hooks/output.js.map +1 -0
- package/dist/hooks/recall-client.d.ts +25 -0
- package/dist/hooks/recall-client.d.ts.map +1 -0
- package/dist/hooks/recall-client.js +56 -0
- package/dist/hooks/recall-client.js.map +1 -0
- package/dist/hooks/run-event.d.ts +13 -0
- package/dist/hooks/run-event.d.ts.map +1 -0
- package/dist/hooks/run-event.js +20 -0
- package/dist/hooks/run-event.js.map +1 -0
- package/dist/hooks/settings-edit.d.ts +10 -0
- package/dist/hooks/settings-edit.d.ts.map +1 -0
- package/dist/hooks/settings-edit.js +44 -0
- package/dist/hooks/settings-edit.js.map +1 -0
- package/dist/hooks/writeback.d.ts +12 -0
- package/dist/hooks/writeback.d.ts.map +1 -0
- package/dist/hooks/writeback.js +48 -0
- package/dist/hooks/writeback.js.map +1 -0
- package/dist/install/clients/claude-code.d.ts +3 -0
- package/dist/install/clients/claude-code.d.ts.map +1 -0
- package/dist/install/clients/claude-code.js +30 -0
- package/dist/install/clients/claude-code.js.map +1 -0
- package/dist/install/clients/claude-desktop.d.ts +3 -0
- package/dist/install/clients/claude-desktop.d.ts.map +1 -0
- package/dist/install/clients/claude-desktop.js +31 -0
- package/dist/install/clients/claude-desktop.js.map +1 -0
- package/dist/install/clients/codex.d.ts +3 -0
- package/dist/install/clients/codex.d.ts.map +1 -0
- package/dist/install/clients/codex.js +32 -0
- package/dist/install/clients/codex.js.map +1 -0
- package/dist/install/clients/cursor.d.ts +3 -0
- package/dist/install/clients/cursor.d.ts.map +1 -0
- package/dist/install/clients/cursor.js +35 -0
- package/dist/install/clients/cursor.js.map +1 -0
- package/dist/install/clients/hermes.d.ts +3 -0
- package/dist/install/clients/hermes.d.ts.map +1 -0
- package/dist/install/clients/hermes.js +35 -0
- package/dist/install/clients/hermes.js.map +1 -0
- package/dist/install/clients/index.d.ts +4 -0
- package/dist/install/clients/index.d.ts.map +1 -0
- package/dist/install/clients/index.js +18 -0
- package/dist/install/clients/index.js.map +1 -0
- package/dist/install/clients/windsurf.d.ts +3 -0
- package/dist/install/clients/windsurf.d.ts.map +1 -0
- package/dist/install/clients/windsurf.js +32 -0
- package/dist/install/clients/windsurf.js.map +1 -0
- package/dist/install/command.d.ts +14 -0
- package/dist/install/command.d.ts.map +1 -0
- package/dist/install/command.js +34 -0
- package/dist/install/command.js.map +1 -0
- package/dist/install/directive.d.ts +7 -0
- package/dist/install/directive.d.ts.map +1 -0
- package/dist/install/directive.js +31 -0
- package/dist/install/directive.js.map +1 -0
- package/dist/install/index.d.ts +26 -0
- package/dist/install/index.d.ts.map +1 -0
- package/dist/install/index.js +117 -0
- package/dist/install/index.js.map +1 -0
- package/dist/install/json-config.d.ts +11 -0
- package/dist/install/json-config.d.ts.map +1 -0
- package/dist/install/json-config.js +39 -0
- package/dist/install/json-config.js.map +1 -0
- package/dist/install/marked-block.d.ts +11 -0
- package/dist/install/marked-block.d.ts.map +1 -0
- package/dist/install/marked-block.js +34 -0
- package/dist/install/marked-block.js.map +1 -0
- package/dist/install/skill.d.ts +4 -0
- package/dist/install/skill.d.ts.map +1 -0
- package/dist/install/skill.js +61 -0
- package/dist/install/skill.js.map +1 -0
- package/dist/install/toml-config.d.ts +4 -0
- package/dist/install/toml-config.d.ts.map +1 -0
- package/dist/install/toml-config.js +51 -0
- package/dist/install/toml-config.js.map +1 -0
- package/dist/install/types.d.ts +37 -0
- package/dist/install/types.d.ts.map +1 -0
- package/dist/install/types.js +4 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/yaml-config.d.ts +4 -0
- package/dist/install/yaml-config.d.ts.map +1 -0
- package/dist/install/yaml-config.js +18 -0
- package/dist/install/yaml-config.js.map +1 -0
- package/dist/processors/privacy.d.ts +4 -1
- package/dist/processors/privacy.d.ts.map +1 -1
- package/dist/processors/privacy.js +5 -3
- package/dist/processors/privacy.js.map +1 -1
- package/dist/profile/accumulate.d.ts +28 -0
- package/dist/profile/accumulate.d.ts.map +1 -0
- package/dist/profile/accumulate.js +48 -0
- package/dist/profile/accumulate.js.map +1 -0
- package/dist/profile/behavior.d.ts +32 -0
- package/dist/profile/behavior.d.ts.map +1 -0
- package/dist/profile/behavior.js +122 -0
- package/dist/profile/behavior.js.map +1 -0
- package/dist/profile/four-color.d.ts +12 -0
- package/dist/profile/four-color.d.ts.map +1 -0
- package/dist/profile/four-color.js +39 -0
- package/dist/profile/four-color.js.map +1 -0
- package/dist/profile/profile-synth.d.ts +27 -0
- package/dist/profile/profile-synth.d.ts.map +1 -0
- package/dist/profile/profile-synth.js +174 -0
- package/dist/profile/profile-synth.js.map +1 -0
- package/dist/profile/types.d.ts +84 -0
- package/dist/profile/types.d.ts.map +1 -0
- package/dist/profile/types.js +11 -0
- package/dist/profile/types.js.map +1 -0
- package/dist/server/api.d.ts +8 -2
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +69 -34
- package/dist/server/api.js.map +1 -1
- package/dist/server/backfill-routes.d.ts.map +1 -1
- package/dist/server/backfill-routes.js +14 -1
- package/dist/server/backfill-routes.js.map +1 -1
- package/dist/server/chat-name-refresh-job.d.ts +33 -0
- package/dist/server/chat-name-refresh-job.d.ts.map +1 -0
- package/dist/server/chat-name-refresh-job.js +120 -0
- package/dist/server/chat-name-refresh-job.js.map +1 -0
- package/dist/server/chat-name-routes.d.ts +13 -0
- package/dist/server/chat-name-routes.d.ts.map +1 -0
- package/dist/server/chat-name-routes.js +81 -0
- package/dist/server/chat-name-routes.js.map +1 -0
- package/dist/server/config-routes.d.ts +2 -0
- package/dist/server/config-routes.d.ts.map +1 -1
- package/dist/server/config-routes.js +2 -1
- package/dist/server/config-routes.js.map +1 -1
- package/dist/server/mcp-http.d.ts +26 -0
- package/dist/server/mcp-http.d.ts.map +1 -0
- package/dist/server/mcp-http.js +102 -0
- package/dist/server/mcp-http.js.map +1 -0
- package/dist/server/mcp.d.ts +191 -25
- package/dist/server/mcp.d.ts.map +1 -1
- package/dist/server/mcp.js +1111 -68
- package/dist/server/mcp.js.map +1 -1
- package/dist/server/open-browser.d.ts +3 -0
- package/dist/server/open-browser.d.ts.map +1 -0
- package/dist/server/open-browser.js +12 -0
- package/dist/server/open-browser.js.map +1 -0
- package/dist/server/runtime.d.ts +13 -0
- package/dist/server/runtime.d.ts.map +1 -0
- package/dist/server/runtime.js +27 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/setup-server.d.ts.map +1 -1
- package/dist/server/setup-server.js +8 -11
- package/dist/server/setup-server.js.map +1 -1
- package/dist/setup/connection-tests.d.ts +1 -1
- package/dist/setup/connection-tests.d.ts.map +1 -1
- package/dist/setup/connection-tests.js +4 -2
- package/dist/setup/connection-tests.js.map +1 -1
- package/dist/setup/generate-config.d.ts.map +1 -1
- package/dist/setup/generate-config.js +31 -1
- package/dist/setup/generate-config.js.map +1 -1
- package/dist/setup/init-wizard.d.ts +1 -0
- package/dist/setup/init-wizard.d.ts.map +1 -1
- package/dist/setup/init-wizard.js +38 -21
- package/dist/setup/init-wizard.js.map +1 -1
- package/dist/setup/validate-config.d.ts +5 -1
- package/dist/setup/validate-config.d.ts.map +1 -1
- package/dist/setup/validate-config.js +18 -0
- package/dist/setup/validate-config.js.map +1 -1
- package/dist/store/data-dir-lock.d.ts +15 -0
- package/dist/store/data-dir-lock.d.ts.map +1 -0
- package/dist/store/data-dir-lock.js +96 -0
- package/dist/store/data-dir-lock.js.map +1 -0
- package/dist/store/database.d.ts +2 -0
- package/dist/store/database.d.ts.map +1 -1
- package/dist/store/database.js +23 -10
- package/dist/store/database.js.map +1 -1
- package/dist/store/graph.d.ts +22 -0
- package/dist/store/graph.d.ts.map +1 -1
- package/dist/store/graph.js +97 -7
- package/dist/store/graph.js.map +1 -1
- package/dist/store/migrations/index.d.ts.map +1 -1
- package/dist/store/migrations/index.js +52 -0
- package/dist/store/migrations/index.js.map +1 -1
- package/dist/store/pages.d.ts +7 -0
- package/dist/store/pages.d.ts.map +1 -1
- package/dist/store/pages.js +56 -1
- package/dist/store/pages.js.map +1 -1
- package/dist/store/person-behavior.d.ts +28 -0
- package/dist/store/person-behavior.d.ts.map +1 -0
- package/dist/store/person-behavior.js +127 -0
- package/dist/store/person-behavior.js.map +1 -0
- package/dist/store/pglite-assets.d.ts +15 -0
- package/dist/store/pglite-assets.d.ts.map +1 -0
- package/dist/store/pglite-assets.js +47 -0
- package/dist/store/pglite-assets.js.map +1 -0
- package/dist/store/query-rewrite.d.ts +28 -0
- package/dist/store/query-rewrite.d.ts.map +1 -0
- package/dist/store/query-rewrite.js +97 -0
- package/dist/store/query-rewrite.js.map +1 -0
- package/dist/store/schema.sql +107 -0
- package/dist/store/search.d.ts +36 -8
- package/dist/store/search.d.ts.map +1 -1
- package/dist/store/search.js +188 -76
- package/dist/store/search.js.map +1 -1
- package/dist/store/tags.d.ts.map +1 -1
- package/dist/store/tags.js +6 -2
- package/dist/store/tags.js.map +1 -1
- package/dist/store/timeline.d.ts +13 -1
- package/dist/store/timeline.d.ts.map +1 -1
- package/dist/store/timeline.js +134 -4
- package/dist/store/timeline.js.map +1 -1
- package/dist/store/trgm-search.d.ts +13 -0
- package/dist/store/trgm-search.d.ts.map +1 -0
- package/dist/store/trgm-search.js +53 -0
- package/dist/store/trgm-search.js.map +1 -0
- package/dist/store/wikilink.d.ts +17 -0
- package/dist/store/wikilink.d.ts.map +1 -0
- package/dist/store/wikilink.js +58 -0
- package/dist/store/wikilink.js.map +1 -0
- package/dist/sync/obsidian.d.ts.map +1 -1
- package/dist/sync/obsidian.js +5 -1
- package/dist/sync/obsidian.js.map +1 -1
- package/dist/synth/cache.d.ts +17 -0
- package/dist/synth/cache.d.ts.map +1 -0
- package/dist/synth/cache.js +67 -0
- package/dist/synth/cache.js.map +1 -0
- package/dist/synth/citations.d.ts +12 -0
- package/dist/synth/citations.d.ts.map +1 -0
- package/dist/synth/citations.js +28 -0
- package/dist/synth/citations.js.map +1 -0
- package/dist/synth/context.d.ts +10 -0
- package/dist/synth/context.d.ts.map +1 -0
- package/dist/synth/context.js +67 -0
- package/dist/synth/context.js.map +1 -0
- package/dist/synth/engine.d.ts +16 -0
- package/dist/synth/engine.d.ts.map +1 -0
- package/dist/synth/engine.js +111 -0
- package/dist/synth/engine.js.map +1 -0
- package/dist/synth/gaps.d.ts +17 -0
- package/dist/synth/gaps.d.ts.map +1 -0
- package/dist/synth/gaps.js +57 -0
- package/dist/synth/gaps.js.map +1 -0
- package/dist/synth/index.d.ts +6 -0
- package/dist/synth/index.d.ts.map +1 -0
- package/dist/synth/index.js +6 -0
- package/dist/synth/index.js.map +1 -0
- package/dist/synth/intent.d.ts +6 -0
- package/dist/synth/intent.d.ts.map +1 -0
- package/dist/synth/intent.js +13 -0
- package/dist/synth/intent.js.map +1 -0
- package/dist/synth/intents/daily-report.d.ts +7 -0
- package/dist/synth/intents/daily-report.d.ts.map +1 -0
- package/dist/synth/intents/daily-report.js +37 -0
- package/dist/synth/intents/daily-report.js.map +1 -0
- package/dist/synth/intents/index.d.ts +2 -0
- package/dist/synth/intents/index.d.ts.map +1 -0
- package/dist/synth/intents/index.js +12 -0
- package/dist/synth/intents/index.js.map +1 -0
- package/dist/synth/intents/person-strategy.d.ts +40 -0
- package/dist/synth/intents/person-strategy.d.ts.map +1 -0
- package/dist/synth/intents/person-strategy.js +66 -0
- package/dist/synth/intents/person-strategy.js.map +1 -0
- package/dist/synth/intents/recall.d.ts +8 -0
- package/dist/synth/intents/recall.d.ts.map +1 -0
- package/dist/synth/intents/recall.js +26 -0
- package/dist/synth/intents/recall.js.map +1 -0
- package/dist/synth/intents/troubleshoot.d.ts +11 -0
- package/dist/synth/intents/troubleshoot.d.ts.map +1 -0
- package/dist/synth/intents/troubleshoot.js +66 -0
- package/dist/synth/intents/troubleshoot.js.map +1 -0
- package/dist/synth/scope.d.ts +13 -0
- package/dist/synth/scope.d.ts.map +1 -0
- package/dist/synth/scope.js +139 -0
- package/dist/synth/scope.js.map +1 -0
- package/dist/synth/types.d.ts +117 -0
- package/dist/synth/types.d.ts.map +1 -0
- package/dist/synth/types.js +2 -0
- package/dist/synth/types.js.map +1 -0
- package/package.json +18 -6
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const ENV_REF_PATTERN = /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
|
|
2
|
+
function placeholdersIn(value) {
|
|
3
|
+
const result = new Set();
|
|
4
|
+
function walk(item) {
|
|
5
|
+
if (typeof item === "string") {
|
|
6
|
+
for (const match of item.matchAll(ENV_REF_PATTERN)) {
|
|
7
|
+
result.add(match[1]);
|
|
8
|
+
}
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(item)) {
|
|
12
|
+
for (const child of item)
|
|
13
|
+
walk(child);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (item !== null && typeof item === "object") {
|
|
17
|
+
for (const child of Object.values(item))
|
|
18
|
+
walk(child);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
walk(value);
|
|
22
|
+
return Array.from(result).sort();
|
|
23
|
+
}
|
|
24
|
+
function hasUsableSecret(value) {
|
|
25
|
+
return Boolean(value && !value.match(ENV_REF_PATTERN));
|
|
26
|
+
}
|
|
27
|
+
function llmEnvVar(provider) {
|
|
28
|
+
return provider === "anthropic" ? "ANTHROPIC_API_KEY" : "OPENAI_API_KEY";
|
|
29
|
+
}
|
|
30
|
+
function missingLlmVars(config) {
|
|
31
|
+
const missing = new Set();
|
|
32
|
+
const providerEnv = llmEnvVar(config.llm.provider);
|
|
33
|
+
for (const name of placeholdersIn(config.llm)) {
|
|
34
|
+
if (config.__context.missingEnvVars.includes(name))
|
|
35
|
+
missing.add(name);
|
|
36
|
+
}
|
|
37
|
+
if (!hasUsableSecret(config.llm.api_key) && !process.env[providerEnv]) {
|
|
38
|
+
missing.add(providerEnv);
|
|
39
|
+
}
|
|
40
|
+
return Array.from(missing).sort();
|
|
41
|
+
}
|
|
42
|
+
function missingEmbeddingVars(config) {
|
|
43
|
+
if (config.embedding.provider !== "openai")
|
|
44
|
+
return [];
|
|
45
|
+
const missing = new Set();
|
|
46
|
+
for (const name of placeholdersIn(config.embedding)) {
|
|
47
|
+
if (config.__context.missingEnvVars.includes(name))
|
|
48
|
+
missing.add(name);
|
|
49
|
+
}
|
|
50
|
+
if (!hasUsableSecret(config.embedding.api_key) && !process.env.OPENAI_API_KEY) {
|
|
51
|
+
missing.add("OPENAI_API_KEY");
|
|
52
|
+
}
|
|
53
|
+
return Array.from(missing).sort();
|
|
54
|
+
}
|
|
55
|
+
export function getMissingEnvVarsForCommand(config, command, opts = {}) {
|
|
56
|
+
const missing = new Set();
|
|
57
|
+
if (command === "extract") {
|
|
58
|
+
for (const name of missingLlmVars(config))
|
|
59
|
+
missing.add(name);
|
|
60
|
+
}
|
|
61
|
+
else if (command === "embed") {
|
|
62
|
+
for (const name of missingEmbeddingVars(config))
|
|
63
|
+
missing.add(name);
|
|
64
|
+
}
|
|
65
|
+
else if (command === "search") {
|
|
66
|
+
if (opts.searchMode !== "fts") {
|
|
67
|
+
for (const name of missingEmbeddingVars(config))
|
|
68
|
+
missing.add(name);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (command === "doctor") {
|
|
72
|
+
for (const name of config.__context.missingEnvVars)
|
|
73
|
+
missing.add(name);
|
|
74
|
+
for (const name of missingLlmVars(config))
|
|
75
|
+
missing.add(name);
|
|
76
|
+
for (const name of missingEmbeddingVars(config))
|
|
77
|
+
missing.add(name);
|
|
78
|
+
}
|
|
79
|
+
else if (command === "serve") {
|
|
80
|
+
for (const name of config.__context.missingEnvVars)
|
|
81
|
+
missing.add(name);
|
|
82
|
+
}
|
|
83
|
+
return Array.from(missing).sort();
|
|
84
|
+
}
|
|
85
|
+
export function validateEnvForCommand(config, command, opts = {}) {
|
|
86
|
+
const missing = getMissingEnvVarsForCommand(config, command, opts);
|
|
87
|
+
if (missing.length === 0)
|
|
88
|
+
return;
|
|
89
|
+
throw new Error(`Missing required environment variables: ${missing.join(", ")}\n` +
|
|
90
|
+
`Referenced by: ${config.__context.configPath}\n` +
|
|
91
|
+
"Set them in your shell or replace the $" +
|
|
92
|
+
"{VAR} placeholders in memoark.yaml.");
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=env-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-validation.js","sourceRoot":"","sources":["../../src/core/env-validation.ts"],"names":[],"mappings":"AAIA,MAAM,eAAe,GAAG,iCAAiC,CAAC;AAE1D,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,SAAS,IAAI,CAAC,IAAa;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB;IACjC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC3E,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB;IAChD,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAAoB,EACpB,OAA6B,EAC7B,OAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;SAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;SAAM,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAoB,EACpB,OAA0D,EAC1D,OAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,MAAM,IAAI,KAAK,CACb,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC/D,kBAAkB,MAAM,CAAC,SAAS,CAAC,UAAU,IAAI;QACjD,yCAAyC;QACzC,qCAAqC,CACxC,CAAC;AACJ,CAAC"}
|
|
@@ -1,20 +1,41 @@
|
|
|
1
1
|
import type { PGlite } from "@electric-sql/pglite";
|
|
2
|
-
import type { RawMessage } from "./types.js";
|
|
2
|
+
import type { ExtractionResult, RawMessage } from "./types.js";
|
|
3
3
|
export interface IdentityBackend {
|
|
4
4
|
resolveFeishuOpenId(openId: string): Promise<{
|
|
5
5
|
name: string;
|
|
6
6
|
slugHint?: string;
|
|
7
7
|
} | null>;
|
|
8
|
+
resolveFeishuChatId(channel: string): Promise<{
|
|
9
|
+
name: string;
|
|
10
|
+
} | null>;
|
|
8
11
|
}
|
|
9
12
|
export declare class IdentityResolver {
|
|
10
13
|
private db;
|
|
11
14
|
private backend?;
|
|
15
|
+
private readonly identity;
|
|
12
16
|
constructor(db: PGlite, backend?: IdentityBackend | undefined);
|
|
13
17
|
enrichBatch(messages: RawMessage[]): Promise<RawMessage[]>;
|
|
14
18
|
private resolve;
|
|
15
19
|
private isUnresolvedId;
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Canonicalize a person slug using pinyin rules and cache the result.
|
|
22
|
+
*
|
|
23
|
+
* @param name - The person's display name (e.g., "王建都")
|
|
24
|
+
* @param modelSlug - The model-produced slug (e.g., "person/wang-jian-du")
|
|
25
|
+
* @returns Canonical slug and whether the input was an alias
|
|
26
|
+
*/
|
|
27
|
+
canonicalizePersonSlug(name: string, modelSlug: string): Promise<{
|
|
28
|
+
slug: string;
|
|
29
|
+
isAlias: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Canonicalize all person slugs in an ExtractionResult and rewrite references.
|
|
33
|
+
*
|
|
34
|
+
* @param result - The extraction result to canonicalize
|
|
35
|
+
* @returns Canonicalized result and alias map (canonical -> list of old slugs)
|
|
36
|
+
*/
|
|
37
|
+
canonicalizeExtractionResult(result: ExtractionResult): Promise<{
|
|
38
|
+
result: ExtractionResult;
|
|
18
39
|
aliases: Map<string, string[]>;
|
|
19
40
|
}>;
|
|
20
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-resolver.d.ts","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity-resolver.d.ts","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAKzF,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACxE;AAOD,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO,CAAC;IAJlB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAGrC,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,eAAe,YAAA;IAK7B,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YAwBlD,OAAO;IAqCrB,OAAO,CAAC,cAAc;IAItB;;;;;;OAMG;IACG,sBAAsB,CAC1B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAyF9C;;;;;OAKG;IACG,4BAA4B,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QACpE,MAAM,EAAE,gBAAgB,CAAC;QACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KAChC,CAAC;CAmFH"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { PersonIdentityStore } from "./person-identity.js";
|
|
2
|
+
import { toPersonCanonicalSlug } from "./person-slug.js";
|
|
1
3
|
export class IdentityResolver {
|
|
2
4
|
db;
|
|
3
5
|
backend;
|
|
6
|
+
identity;
|
|
4
7
|
constructor(db, backend) {
|
|
5
8
|
this.db = db;
|
|
6
9
|
this.backend = backend;
|
|
10
|
+
this.identity = new PersonIdentityStore(db);
|
|
7
11
|
}
|
|
8
12
|
async enrichBatch(messages) {
|
|
9
13
|
const unresolvedIds = new Set();
|
|
@@ -31,7 +35,10 @@ export class IdentityResolver {
|
|
|
31
35
|
const cached = await this.db.query("SELECT display_name, slug_hint FROM identity_cache WHERE platform = $1 AND external_id = $2", [platform, externalId]);
|
|
32
36
|
if (cached.rows.length > 0) {
|
|
33
37
|
const row = cached.rows[0];
|
|
34
|
-
|
|
38
|
+
if (row.display_name) {
|
|
39
|
+
return row.slug_hint ? `${row.display_name} (${row.slug_hint})` : row.display_name;
|
|
40
|
+
}
|
|
41
|
+
// display_name is NULL — cache row exists but is incomplete; fall through to backend
|
|
35
42
|
}
|
|
36
43
|
if (!this.backend)
|
|
37
44
|
return null;
|
|
@@ -55,8 +62,146 @@ export class IdentityResolver {
|
|
|
55
62
|
isUnresolvedId(contact) {
|
|
56
63
|
return contact.startsWith("ou_");
|
|
57
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Canonicalize a person slug using pinyin rules and cache the result.
|
|
67
|
+
*
|
|
68
|
+
* @param name - The person's display name (e.g., "王建都")
|
|
69
|
+
* @param modelSlug - The model-produced slug (e.g., "person/wang-jian-du")
|
|
70
|
+
* @returns Canonical slug and whether the input was an alias
|
|
71
|
+
*/
|
|
72
|
+
async canonicalizePersonSlug(name, modelSlug) {
|
|
73
|
+
// 0. Explicit handle table wins (Layer 1): a previously-linked alias —
|
|
74
|
+
// open id / email / exact name / nickname — pins the canonical slug.
|
|
75
|
+
const byHandle = await this.identity.resolveForExtraction(name, modelSlug);
|
|
76
|
+
if (byHandle) {
|
|
77
|
+
return { slug: byHandle, isAlias: modelSlug !== byHandle };
|
|
78
|
+
}
|
|
79
|
+
// 1. Check cache by modelSlug
|
|
80
|
+
const cacheBySlug = await this.db.query("SELECT display_name FROM identity_cache WHERE platform = $1 AND external_id = $2", ["canonical", modelSlug]);
|
|
81
|
+
if (cacheBySlug.rows.length > 0) {
|
|
82
|
+
const canonicalSlug = cacheBySlug.rows[0].display_name;
|
|
83
|
+
if (canonicalSlug)
|
|
84
|
+
return { slug: canonicalSlug, isAlias: modelSlug !== canonicalSlug };
|
|
85
|
+
// display_name is NULL: deliberate fallthrough — cacheByName (Step 2) may still have a valid canonical
|
|
86
|
+
}
|
|
87
|
+
// 2. Check cache by name
|
|
88
|
+
const cacheByName = await this.db.query("SELECT display_name FROM identity_cache WHERE platform = $1 AND external_id = $2", ["canonical", name]);
|
|
89
|
+
if (cacheByName.rows.length > 0) {
|
|
90
|
+
const canonicalSlug = cacheByName.rows[0].display_name;
|
|
91
|
+
if (canonicalSlug) {
|
|
92
|
+
// Insert modelSlug -> canonical mapping (if not already there)
|
|
93
|
+
await this.db.query(`INSERT INTO identity_cache (platform, external_id, display_name, slug_hint)
|
|
94
|
+
VALUES ($1, $2, $3, $4)
|
|
95
|
+
ON CONFLICT (platform, external_id) DO NOTHING`, ["canonical", modelSlug, canonicalSlug, name]);
|
|
96
|
+
return { slug: canonicalSlug, isAlias: modelSlug !== canonicalSlug };
|
|
97
|
+
}
|
|
98
|
+
// display_name is NULL: treat as cache miss, fall through to pinyin step
|
|
99
|
+
}
|
|
100
|
+
// 3. Generate canonical slug
|
|
101
|
+
const canonicalSlug = toPersonCanonicalSlug(name);
|
|
102
|
+
// 4. If null (unsupported script), return original
|
|
103
|
+
if (canonicalSlug === null) {
|
|
104
|
+
return { slug: modelSlug, isAlias: false };
|
|
105
|
+
}
|
|
106
|
+
// 5. Collision guard: check if canonical slug already exists with different name
|
|
107
|
+
const collision = await this.db.query("SELECT slug_hint FROM identity_cache WHERE platform = $1 AND display_name = $2 AND slug_hint != $3", ["canonical", canonicalSlug, name]);
|
|
108
|
+
if (collision.rows.length > 0) {
|
|
109
|
+
const canonicalOpenId = canonicalSlug.match(/^person\/(ou_[a-z0-9]+)$/)?.[1];
|
|
110
|
+
const nameOpenId = name.match(/\bou_[a-zA-Z0-9]+\b/)?.[0].toLowerCase();
|
|
111
|
+
if (!canonicalOpenId || canonicalOpenId !== nameOpenId) {
|
|
112
|
+
console.warn(`[IdentityResolver] Slug collision detected: canonical slug '${canonicalSlug}' already exists for '${collision.rows[0].slug_hint}', keeping original slug '${modelSlug}' for '${name}'`);
|
|
113
|
+
return { slug: modelSlug, isAlias: false };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 6. Insert both mappings: modelSlug -> canonical and name -> canonical
|
|
117
|
+
await this.db.query(`INSERT INTO identity_cache (platform, external_id, display_name, slug_hint)
|
|
118
|
+
VALUES ($1, $2, $3, $4)
|
|
119
|
+
ON CONFLICT (platform, external_id) DO NOTHING`, ["canonical", modelSlug, canonicalSlug, name]);
|
|
120
|
+
await this.db.query(`INSERT INTO identity_cache (platform, external_id, display_name, slug_hint)
|
|
121
|
+
VALUES ($1, $2, $3, $4)
|
|
122
|
+
ON CONFLICT (platform, external_id) DO NOTHING`, ["canonical", name, canonicalSlug, name]);
|
|
123
|
+
// Record the strong handles (name/slug/open id) so future explicit aliases
|
|
124
|
+
// and merges can build on a populated handle table.
|
|
125
|
+
await this.identity.recordCanonical(name, canonicalSlug);
|
|
126
|
+
return { slug: canonicalSlug, isAlias: modelSlug !== canonicalSlug };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Canonicalize all person slugs in an ExtractionResult and rewrite references.
|
|
130
|
+
*
|
|
131
|
+
* @param result - The extraction result to canonicalize
|
|
132
|
+
* @returns Canonicalized result and alias map (canonical -> list of old slugs)
|
|
133
|
+
*/
|
|
58
134
|
async canonicalizeExtractionResult(result) {
|
|
59
|
-
|
|
135
|
+
// 1. Build rewrite map for person entities
|
|
136
|
+
const rewriteMap = new Map();
|
|
137
|
+
const aliasesMap = new Map();
|
|
138
|
+
for (const entity of result.entities) {
|
|
139
|
+
if (entity.type !== "person")
|
|
140
|
+
continue;
|
|
141
|
+
const { slug: canonicalSlug, isAlias } = await this.canonicalizePersonSlug(entity.name, entity.slug);
|
|
142
|
+
rewriteMap.set(entity.slug, canonicalSlug);
|
|
143
|
+
if (isAlias && entity.slug !== canonicalSlug) {
|
|
144
|
+
if (!aliasesMap.has(canonicalSlug)) {
|
|
145
|
+
aliasesMap.set(canonicalSlug, []);
|
|
146
|
+
}
|
|
147
|
+
const aliases = aliasesMap.get(canonicalSlug);
|
|
148
|
+
if (aliases) {
|
|
149
|
+
aliases.push(entity.slug);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// 2. Helper to rewrite a slug if it's in the map
|
|
154
|
+
const rewriteSlug = (slug) => {
|
|
155
|
+
return rewriteMap.get(slug) ?? slug;
|
|
156
|
+
};
|
|
157
|
+
// 3. Rewrite entities and deduplicate
|
|
158
|
+
const entityMap = new Map();
|
|
159
|
+
for (const entity of result.entities) {
|
|
160
|
+
const slug = entity.type === "person" ? rewriteSlug(entity.slug) : entity.slug;
|
|
161
|
+
// Keep first entity for each canonical slug
|
|
162
|
+
if (!entityMap.has(slug)) {
|
|
163
|
+
entityMap.set(slug, { ...entity, slug });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// 4. Rewrite all slug references
|
|
167
|
+
const canonicalized = {
|
|
168
|
+
source: result.source,
|
|
169
|
+
entities: Array.from(entityMap.values()),
|
|
170
|
+
timeline: result.timeline.map((t) => ({
|
|
171
|
+
...t,
|
|
172
|
+
entities: t.entities.map(rewriteSlug),
|
|
173
|
+
})),
|
|
174
|
+
links: result.links.map((link) => ({
|
|
175
|
+
...link,
|
|
176
|
+
from: rewriteSlug(link.from),
|
|
177
|
+
to: rewriteSlug(link.to),
|
|
178
|
+
})),
|
|
179
|
+
decisions: result.decisions.map((d) => ({
|
|
180
|
+
...d,
|
|
181
|
+
entities: d.entities.map(rewriteSlug),
|
|
182
|
+
})),
|
|
183
|
+
tasks: result.tasks.map((task) => ({
|
|
184
|
+
...task,
|
|
185
|
+
owner: task.owner?.startsWith("person/") ? rewriteSlug(task.owner) : task.owner,
|
|
186
|
+
})),
|
|
187
|
+
discoveries: result.discoveries.map((d) => ({
|
|
188
|
+
...d,
|
|
189
|
+
entities: d.entities.map(rewriteSlug),
|
|
190
|
+
})),
|
|
191
|
+
knowledge: result.knowledge.map((k) => ({
|
|
192
|
+
...k,
|
|
193
|
+
related_entities: k.related_entities.map(rewriteSlug),
|
|
194
|
+
})),
|
|
195
|
+
preferences: (result.preferences ?? []).map((p) => ({
|
|
196
|
+
...p,
|
|
197
|
+
entities: p.entities.map(rewriteSlug),
|
|
198
|
+
})),
|
|
199
|
+
references: (result.references ?? []).map((r) => ({
|
|
200
|
+
...r,
|
|
201
|
+
entities: r.entities.map(rewriteSlug),
|
|
202
|
+
})),
|
|
203
|
+
};
|
|
204
|
+
return { result: canonicalized, aliases: aliasesMap };
|
|
60
205
|
}
|
|
61
206
|
}
|
|
62
207
|
//# sourceMappingURL=identity-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-resolver.js","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identity-resolver.js","sourceRoot":"","sources":["../../src/core/identity-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Person identity — Layer 1: typed handle/alias resolution.
|
|
3
|
+
*
|
|
4
|
+
* A person is anchored by a human-readable canonical page slug (e.g.
|
|
5
|
+
* `person/li-yinglong`). Every other way the person is referred to — a Feishu
|
|
6
|
+
* open id, an email, an exact display name, a nickname / 花名 — is a *handle*
|
|
7
|
+
* stored in `person_handles` and pointing at that canonical slug.
|
|
8
|
+
*
|
|
9
|
+
* Resolution rules (mirrors openhuman's `people` resolver contract):
|
|
10
|
+
* - Strong handles (feishu_open_id / email / name / slug) auto-resolve and
|
|
11
|
+
* are recorded automatically during canonicalization.
|
|
12
|
+
* - Weak handles (nickname / 花名) are NEVER created automatically — they
|
|
13
|
+
* only enter the table via an explicit `addAlias` / `link`, so an
|
|
14
|
+
* ambiguous nickname like "龙哥" can never silently merge two people.
|
|
15
|
+
* - Merging two existing person pages is always an explicit operation.
|
|
16
|
+
*/
|
|
17
|
+
import type { PGlite } from "@electric-sql/pglite";
|
|
18
|
+
import type { PageStore } from "../store/pages.js";
|
|
19
|
+
import type { PersonBehaviorStore } from "../store/person-behavior.js";
|
|
20
|
+
export type HandleKind = "feishu_open_id" | "email" | "name" | "nickname" | "slug";
|
|
21
|
+
export type HandleStrength = "strong" | "weak";
|
|
22
|
+
export interface PersonHandle {
|
|
23
|
+
kind: HandleKind;
|
|
24
|
+
value: string;
|
|
25
|
+
canonical_slug: string;
|
|
26
|
+
strength: HandleStrength;
|
|
27
|
+
}
|
|
28
|
+
/** Default strength for a handle kind. Nicknames are weak; everything else strong. */
|
|
29
|
+
export declare function defaultStrength(kind: HandleKind): HandleStrength;
|
|
30
|
+
/**
|
|
31
|
+
* Canonicalize a handle value for storage and lookup. Emails and open ids are
|
|
32
|
+
* lowercased; names and nicknames are whitespace-collapsed; slugs are passed
|
|
33
|
+
* through (already normalized lowercase).
|
|
34
|
+
*/
|
|
35
|
+
export declare function canonicalizeHandleValue(kind: HandleKind, value: string): string;
|
|
36
|
+
/** Canonical slug of the special "me" identity page (Spec 9 §4.1). */
|
|
37
|
+
export declare const ME_SLUG = "entities/me";
|
|
38
|
+
export interface PersonIdentityStores {
|
|
39
|
+
pages: PageStore;
|
|
40
|
+
}
|
|
41
|
+
/** Optional extra stores kept consistent across identity operations (Spec 8). */
|
|
42
|
+
export interface PersonIdentityExtraStores {
|
|
43
|
+
/** Spec 8 behavior layer — counters are merged when two persons merge. */
|
|
44
|
+
behavior?: PersonBehaviorStore;
|
|
45
|
+
}
|
|
46
|
+
export declare class PersonIdentityStore {
|
|
47
|
+
private db;
|
|
48
|
+
private stores?;
|
|
49
|
+
private extra?;
|
|
50
|
+
constructor(db: PGlite, stores?: PersonIdentityStores | undefined, extra?: PersonIdentityExtraStores | undefined);
|
|
51
|
+
/** Resolve a single handle to its canonical person slug, or null. */
|
|
52
|
+
resolveHandle(kind: HandleKind, value: string): Promise<string | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve an extraction's (name, modelSlug) to a canonical slug via known
|
|
55
|
+
* handles. Tries strong handles first (slug, embedded open id / email, exact
|
|
56
|
+
* name), then any explicitly-linked nickname. Returns null if nothing known.
|
|
57
|
+
*/
|
|
58
|
+
resolveForExtraction(name: string, modelSlug: string): Promise<string | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Record the strong handles implied by a freshly-canonicalized person
|
|
61
|
+
* (name → slug, slug → slug, and any embedded open id). Idempotent and
|
|
62
|
+
* non-destructive: existing rows are left untouched.
|
|
63
|
+
*/
|
|
64
|
+
recordCanonical(name: string, canonicalSlug: string): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Ensure the special `entities/me` self-identity page exists (Spec 9 §4.1).
|
|
67
|
+
* Idempotent — returns the canonical slug; creates a minimal person page the
|
|
68
|
+
* user can hand-edit (role / company / team / handles) when absent.
|
|
69
|
+
*/
|
|
70
|
+
ensureEntitiesMe(): Promise<string>;
|
|
71
|
+
/**
|
|
72
|
+
* Register one of the current user's own handles (open_id / email / name),
|
|
73
|
+
* pointing it at `entities/me` as a strong handle (Spec 9 §4.2 manual path).
|
|
74
|
+
* Ensures the me page exists first.
|
|
75
|
+
*
|
|
76
|
+
* Spike (Spec 9 §4.2): auto-resolving the self open_id via
|
|
77
|
+
* `resolveSelfOpenId()` (src/collectors/feishu/self-open-id.ts) is wired as a
|
|
78
|
+
* best-effort enhancement only — it depends on a live lark-cli user-level
|
|
79
|
+
* OAuth session (user_access_token, separate from the bot token). That session
|
|
80
|
+
* is not available in CI/test, so only this manual path is exercised by tests
|
|
81
|
+
* and is the reliable default. Callers may best-effort call resolveSelfOpenId
|
|
82
|
+
* and feed the result here when a real session exists.
|
|
83
|
+
*/
|
|
84
|
+
registerSelfHandle(kind: HandleKind, value: string): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Whether `slugOrHandle` is the current user (Spec 9 §4.3). Accepts either a
|
|
87
|
+
* canonical slug (e.g. `entities/me`, `people/alice`) or a raw handle value
|
|
88
|
+
* (open_id / email / name / nickname); resolves to a canonical slug and
|
|
89
|
+
* compares against `entities/me`.
|
|
90
|
+
*/
|
|
91
|
+
isMe(slugOrHandle: string): Promise<boolean>;
|
|
92
|
+
/**
|
|
93
|
+
* Explicitly attach a handle (alias) to a canonical person. Defaults to the
|
|
94
|
+
* kind's natural strength. Throws if the handle already points at a
|
|
95
|
+
* different person (use `merge` / `removeHandle` to reassign).
|
|
96
|
+
*/
|
|
97
|
+
addAlias(canonicalSlug: string, kind: HandleKind, value: string, strength?: HandleStrength): Promise<void>;
|
|
98
|
+
/** List all handles attached to a canonical person. */
|
|
99
|
+
listHandles(canonicalSlug: string): Promise<PersonHandle[]>;
|
|
100
|
+
/** Remove a handle by (kind, value). */
|
|
101
|
+
removeHandle(kind: HandleKind, value: string): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Rename a person's canonical slug (correct a wrong canonicalization).
|
|
104
|
+
* Renames the page, re-points handles + identity_cache, leaves the old slug
|
|
105
|
+
* behind as a resolvable alias.
|
|
106
|
+
*/
|
|
107
|
+
recanonicalize(oldSlug: string, newSlug: string): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Merge person page `fromSlug` into `intoSlug`. Re-points links, timeline
|
|
110
|
+
* entries, and tags; folds the body and aliases into the target; records the
|
|
111
|
+
* old slug + handles as aliases of the target; deletes the old page.
|
|
112
|
+
*
|
|
113
|
+
* Note: the old page's embeddings (chunks) are dropped with it — run
|
|
114
|
+
* `memoark embed` afterwards to re-embed the folded content.
|
|
115
|
+
*/
|
|
116
|
+
merge(fromSlug: string, intoSlug: string): Promise<void>;
|
|
117
|
+
private requirePages;
|
|
118
|
+
private insertHandle;
|
|
119
|
+
private repointIdentityCache;
|
|
120
|
+
private frontmatterAliases;
|
|
121
|
+
private appendAliasesToPage;
|
|
122
|
+
private writePage;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=person-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-identity.d.ts","sourceRoot":"","sources":["../../src/core/person-identity.ts"],"names":[],"mappings":"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"}
|