@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,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token budget for assembled candidates (Spec 9 §6). `limit` only caps how many
|
|
3
|
+
* candidates are retrieved; here we truncate the retrieved set to a total token
|
|
4
|
+
* budget so a busy day never dumps hundreds of signals into the LLM. We use a
|
|
5
|
+
* cheap chars≈tokens heuristic (CJK-heavy text → ~1 token/char is a safe upper
|
|
6
|
+
* bound) and accumulate in order, stopping once the budget is exceeded.
|
|
7
|
+
*/
|
|
8
|
+
const TOKEN_BUDGET = 12_000;
|
|
9
|
+
const CHARS_PER_TOKEN = 1;
|
|
10
|
+
function estimateTokens(c) {
|
|
11
|
+
return Math.ceil((c.title.length + c.text.length) / CHARS_PER_TOKEN);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Drop exact-duplicate candidates, keeping the first occurrence (Spec 9 §6
|
|
15
|
+
* primary-key dedupe). Keyed on `slug::text` (not slug alone) so that
|
|
16
|
+
* entity-scope retrieval, which emits every timeline entry under the same
|
|
17
|
+
* `slug = scope.entity`, is not collapsed to a single entry. Matches the
|
|
18
|
+
* composite key used by scope.ts's own dedupe.
|
|
19
|
+
*/
|
|
20
|
+
function dedupeBySlug(candidates) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const c of candidates) {
|
|
24
|
+
const key = `${c.slug}::${c.text}`;
|
|
25
|
+
if (seen.has(key))
|
|
26
|
+
continue;
|
|
27
|
+
seen.add(key);
|
|
28
|
+
out.push(c);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/** Accumulate candidates in order until the token budget is reached. Always keeps ≥1. */
|
|
33
|
+
function truncateToBudget(candidates) {
|
|
34
|
+
const out = [];
|
|
35
|
+
let used = 0;
|
|
36
|
+
for (const c of candidates) {
|
|
37
|
+
const cost = estimateTokens(c);
|
|
38
|
+
if (out.length > 0 && used + cost > TOKEN_BUDGET)
|
|
39
|
+
break;
|
|
40
|
+
out.push(c);
|
|
41
|
+
used += cost;
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Assemble retrieved candidates into a numbered AssembledContext (Spec 7 §3.3 step 5).
|
|
47
|
+
* Dedupes by slug, truncates to a token budget (Spec 9 §6), assigns ref=1..N (in
|
|
48
|
+
* order), and derives latestDate=max(date). pinnedContext is left undefined;
|
|
49
|
+
* intents may set it via the buildPinnedContext hook.
|
|
50
|
+
*/
|
|
51
|
+
export function assemble(scope, candidates) {
|
|
52
|
+
const deduped = dedupeBySlug(candidates);
|
|
53
|
+
const budgeted = truncateToBudget(deduped);
|
|
54
|
+
const numbered = budgeted.map((c, i) => ({ ...c, ref: i + 1 }));
|
|
55
|
+
let latestDate;
|
|
56
|
+
for (const c of numbered) {
|
|
57
|
+
if (c.date && (!latestDate || c.date > latestDate)) {
|
|
58
|
+
latestDate = c.date;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
scope,
|
|
63
|
+
candidates: numbered,
|
|
64
|
+
latestDate,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/synth/context.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,SAAS,cAAc,CAAC,CAAe;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,YAAY,CAAC,UAA0B;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yFAAyF;AACzF,SAAS,gBAAgB,CAAC,UAA0B;IAClD,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,YAAY;YAAE,MAAM;QACxD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAiB,EAAE,UAA0B;IACpE,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,IAAI,UAA8B,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,UAAU,EAAE,QAAQ;QACpB,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { LLMProvider } from "../extractors/providers/types.js";
|
|
2
|
+
import type { StoreContext } from "../server/api.js";
|
|
3
|
+
import "./intents/index.js";
|
|
4
|
+
import type { SynthesisResult, SynthOpts, SynthScope } from "./types.js";
|
|
5
|
+
export interface SynthDeps {
|
|
6
|
+
stores: StoreContext;
|
|
7
|
+
provider: LLMProvider;
|
|
8
|
+
/** Model id to record in meta (the provider itself is already configured). */
|
|
9
|
+
model?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Synthesis engine entry point (Spec 7 §3.3 eight-step flow).
|
|
13
|
+
* The engine calls optional intent hooks generically; it never imports a concrete intent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function synthesize(intentId: string, scope: SynthScope, deps: SynthDeps, opts?: SynthOpts): Promise<SynthesisResult>;
|
|
16
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/synth/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrD,OAAO,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAKV,eAAe,EACf,SAAS,EACT,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2CD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,SAAS,EACf,IAAI,CAAC,EAAE,SAAS,GACf,OAAO,CAAC,eAAe,CAAC,CAiF1B"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as cache from "./cache.js";
|
|
2
|
+
import { finalize } from "./citations.js";
|
|
3
|
+
import { assemble } from "./context.js";
|
|
4
|
+
import { getIntent } from "./intent.js";
|
|
5
|
+
import { retrieve } from "./scope.js";
|
|
6
|
+
// Trigger explicit intent registration before any synthesize() call.
|
|
7
|
+
import "./intents/index.js";
|
|
8
|
+
function renderCandidates(ctx) {
|
|
9
|
+
return ctx.candidates
|
|
10
|
+
.map((c) => `[${c.ref}] ${c.title}${c.date ? ` (${c.date})` : ""}\n${c.text}`)
|
|
11
|
+
.join("\n\n");
|
|
12
|
+
}
|
|
13
|
+
function buildMessages(intent, ctx, extra) {
|
|
14
|
+
const parts = [];
|
|
15
|
+
if (ctx.pinnedContext)
|
|
16
|
+
parts.push(ctx.pinnedContext);
|
|
17
|
+
parts.push(renderCandidates(ctx));
|
|
18
|
+
if (extra && Object.keys(extra).length > 0) {
|
|
19
|
+
parts.push(`补充参数:${JSON.stringify(extra)}`);
|
|
20
|
+
}
|
|
21
|
+
return [
|
|
22
|
+
{ role: "system", content: intent.systemPrompt },
|
|
23
|
+
{ role: "user", content: parts.join("\n\n") },
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
async function compose(intent, ctx, provider, extra) {
|
|
27
|
+
const answer = await provider.chat(buildMessages(intent, ctx, extra));
|
|
28
|
+
return { answer };
|
|
29
|
+
}
|
|
30
|
+
function runGaps(intent, ctx, raw) {
|
|
31
|
+
const gaps = [];
|
|
32
|
+
for (const rule of intent.gapRules) {
|
|
33
|
+
gaps.push(...rule.evaluate(ctx, raw, intent));
|
|
34
|
+
}
|
|
35
|
+
return gaps;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Synthesis engine entry point (Spec 7 §3.3 eight-step flow).
|
|
39
|
+
* The engine calls optional intent hooks generically; it never imports a concrete intent.
|
|
40
|
+
*/
|
|
41
|
+
export async function synthesize(intentId, scope, deps, opts) {
|
|
42
|
+
// 1. resolve intent
|
|
43
|
+
const intent = getIntent(intentId);
|
|
44
|
+
const { stores, provider } = deps;
|
|
45
|
+
// 3. retrieve candidates (best-chunk pooling enabled inside scope retrieval)
|
|
46
|
+
const rawCandidates = await retrieve(scope, { poolByPage: true }, stores);
|
|
47
|
+
// Short-circuit: no candidates → never call the LLM (avoid hallucination + cost).
|
|
48
|
+
if (rawCandidates.length === 0) {
|
|
49
|
+
return {
|
|
50
|
+
intent: intentId,
|
|
51
|
+
answer: "(未找到相关记忆)",
|
|
52
|
+
sections: undefined,
|
|
53
|
+
citations: [],
|
|
54
|
+
gaps: [],
|
|
55
|
+
meta: {
|
|
56
|
+
model: deps.model ?? "unknown",
|
|
57
|
+
generated_at: new Date().toISOString(),
|
|
58
|
+
scope,
|
|
59
|
+
cached: false,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// 4. optional hook: re-rank candidates
|
|
64
|
+
let raw = rawCandidates;
|
|
65
|
+
if (intent.sortCandidates) {
|
|
66
|
+
const numbered = raw.map((c, i) => ({ ...c, ref: i + 1 }));
|
|
67
|
+
const sorted = await intent.sortCandidates(numbered, stores);
|
|
68
|
+
raw = sorted.map(({ ref: _ref, ...rest }) => rest);
|
|
69
|
+
}
|
|
70
|
+
// 5. assemble numbered context
|
|
71
|
+
const ctx = assemble(scope, raw);
|
|
72
|
+
// compute freshness hash now that candidates are known
|
|
73
|
+
const inputHash = cache.computeInputHash(ctx.candidates);
|
|
74
|
+
// 2. cache read (after retrieval so input_hash freshness can be validated)
|
|
75
|
+
if (!opts?.noCache) {
|
|
76
|
+
const hit = await cache.read(intentId, scope, inputHash, stores);
|
|
77
|
+
if (hit)
|
|
78
|
+
return hit;
|
|
79
|
+
}
|
|
80
|
+
// 6. optional hook: build non-citable pinned context
|
|
81
|
+
if (intent.buildPinnedContext) {
|
|
82
|
+
ctx.pinnedContext = await intent.buildPinnedContext(scope, stores);
|
|
83
|
+
}
|
|
84
|
+
// 7. compose via LLM
|
|
85
|
+
const composed = await compose(intent, ctx, provider, opts?.extra);
|
|
86
|
+
// 8. finalize citations + gaps + cache write
|
|
87
|
+
const { answer, citations } = finalize(composed.answer, ctx.candidates);
|
|
88
|
+
const gaps = runGaps(intent, ctx, composed);
|
|
89
|
+
let sections;
|
|
90
|
+
if (intent.format === "sections" && intent.parseSections) {
|
|
91
|
+
sections = intent.parseSections(answer);
|
|
92
|
+
}
|
|
93
|
+
const result = {
|
|
94
|
+
intent: intentId,
|
|
95
|
+
answer,
|
|
96
|
+
sections,
|
|
97
|
+
citations,
|
|
98
|
+
gaps,
|
|
99
|
+
meta: {
|
|
100
|
+
model: deps.model ?? "unknown",
|
|
101
|
+
generated_at: new Date().toISOString(),
|
|
102
|
+
scope,
|
|
103
|
+
cached: false,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
if (!opts?.noCache) {
|
|
107
|
+
await cache.write(intentId, scope, result, inputHash, stores);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/synth/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GapRule } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* stale gap (Spec 7 §六): the freshest candidate is older than the intent's staleDays threshold.
|
|
4
|
+
* Deterministic; no LLM.
|
|
5
|
+
*/
|
|
6
|
+
export declare const staleRule: GapRule;
|
|
7
|
+
/**
|
|
8
|
+
* missing_field gap (Spec 7 §六): an expected point (intent.expects) is not covered by the answer.
|
|
9
|
+
* Deterministic keyword/heuristic match.
|
|
10
|
+
*/
|
|
11
|
+
export declare const missingFieldRule: GapRule;
|
|
12
|
+
/**
|
|
13
|
+
* contradiction gap (Spec 7 §六): placeholder. Default off — runs as an independent optional
|
|
14
|
+
* pass (not mixed into compose). Implemented in a later spec / consolidator follow-up.
|
|
15
|
+
*/
|
|
16
|
+
export declare const contradictionRule: GapRule;
|
|
17
|
+
//# sourceMappingURL=gaps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaps.d.ts","sourceRoot":"","sources":["../../src/synth/gaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,OAAO,EAAkB,MAAM,YAAY,CAAC;AAIhG;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,OAevB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAgB9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAK/B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const DEFAULT_STALE_DAYS = 14;
|
|
2
|
+
/**
|
|
3
|
+
* stale gap (Spec 7 §六): the freshest candidate is older than the intent's staleDays threshold.
|
|
4
|
+
* Deterministic; no LLM.
|
|
5
|
+
*/
|
|
6
|
+
export const staleRule = {
|
|
7
|
+
id: "stale",
|
|
8
|
+
evaluate(ctx, _raw, intent) {
|
|
9
|
+
if (!ctx.latestDate)
|
|
10
|
+
return [];
|
|
11
|
+
const staleDays = intent.staleDays ?? DEFAULT_STALE_DAYS;
|
|
12
|
+
const ageDays = (Date.now() - new Date(ctx.latestDate).getTime()) / 86_400_000;
|
|
13
|
+
if (ageDays <= staleDays)
|
|
14
|
+
return [];
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
type: "stale",
|
|
18
|
+
message: `最新信息距今约 ${Math.floor(ageDays)} 天(超过 ${staleDays} 天阈值),可能已过期。`,
|
|
19
|
+
meta: { latestDate: ctx.latestDate, staleDays, ageDays: Math.floor(ageDays) },
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* missing_field gap (Spec 7 §六): an expected point (intent.expects) is not covered by the answer.
|
|
26
|
+
* Deterministic keyword/heuristic match.
|
|
27
|
+
*/
|
|
28
|
+
export const missingFieldRule = {
|
|
29
|
+
id: "missing_field",
|
|
30
|
+
evaluate(_ctx, raw, intent) {
|
|
31
|
+
const expects = intent.expects ?? [];
|
|
32
|
+
if (expects.length === 0)
|
|
33
|
+
return [];
|
|
34
|
+
const haystack = raw.answer.toLowerCase();
|
|
35
|
+
const missing = expects.filter((field) => !haystack.includes(field.toLowerCase()));
|
|
36
|
+
if (missing.length === 0)
|
|
37
|
+
return [];
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
type: "missing_field",
|
|
41
|
+
message: `回答未覆盖以下要点:${missing.join("、")}。`,
|
|
42
|
+
meta: { missing },
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* contradiction gap (Spec 7 §六): placeholder. Default off — runs as an independent optional
|
|
49
|
+
* pass (not mixed into compose). Implemented in a later spec / consolidator follow-up.
|
|
50
|
+
*/
|
|
51
|
+
export const contradictionRule = {
|
|
52
|
+
id: "contradiction",
|
|
53
|
+
evaluate() {
|
|
54
|
+
return [];
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaps.js","sourceRoot":"","sources":["../../src/synth/gaps.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAY;IAChC,EAAE,EAAE,OAAO;IACX,QAAQ,CAAC,GAAqB,EAAE,IAAmB,EAAE,MAAsB;QACzE,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;QAC/E,IAAI,OAAO,IAAI,SAAS;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO;YACL;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,SAAS,cAAc;gBACvE,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;aAC9E;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAY;IACvC,EAAE,EAAE,eAAe;IACnB,QAAQ,CAAC,IAAsB,EAAE,GAAkB,EAAE,MAAsB;QACzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO;YACL;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,aAAa,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;gBAC1C,IAAI,EAAE,EAAE,OAAO,EAAE;aAClB;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAY;IACxC,EAAE,EAAE,eAAe;IACnB,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import "./intents/index.js";
|
|
2
|
+
export type { SynthDeps } from "./engine.js";
|
|
3
|
+
export { synthesize } from "./engine.js";
|
|
4
|
+
export { getIntent, registerIntent } from "./intent.js";
|
|
5
|
+
export type { AssembledCandidate, AssembledContext, Citation, ComposeOutput, Gap, GapRule, IntentTemplate, SynthesisResult, SynthOpts, SynthScope, } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/synth/index.ts"],"names":[],"mappings":"AAEA,OAAO,oBAAoB,CAAC;AAE5B,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,GAAG,EACH,OAAO,EACP,cAAc,EACd,eAAe,EACf,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Public entry point for the synthesis engine.
|
|
2
|
+
// Importing this module registers built-in intents (via engine.ts → intents/index.ts).
|
|
3
|
+
import "./intents/index.js";
|
|
4
|
+
export { synthesize } from "./engine.js";
|
|
5
|
+
export { getIntent, registerIntent } from "./intent.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/synth/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,uFAAuF;AACvF,OAAO,oBAAoB,CAAC;AAG5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { IntentTemplate } from "./types.js";
|
|
2
|
+
/** Register an intent template. Called explicitly from intents/index.ts (no import side-effect magic). */
|
|
3
|
+
export declare function registerIntent(t: IntentTemplate): void;
|
|
4
|
+
/** Resolve a registered intent by id; throws if unknown. */
|
|
5
|
+
export declare function getIntent(id: string): IntentTemplate;
|
|
6
|
+
//# sourceMappingURL=intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/synth/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,0GAA0G;AAC1G,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAEtD;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAIpD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const intentRegistry = new Map();
|
|
2
|
+
/** Register an intent template. Called explicitly from intents/index.ts (no import side-effect magic). */
|
|
3
|
+
export function registerIntent(t) {
|
|
4
|
+
intentRegistry.set(t.id, t);
|
|
5
|
+
}
|
|
6
|
+
/** Resolve a registered intent by id; throws if unknown. */
|
|
7
|
+
export function getIntent(id) {
|
|
8
|
+
const t = intentRegistry.get(id);
|
|
9
|
+
if (!t)
|
|
10
|
+
throw new Error(`unknown synth intent: ${id}`);
|
|
11
|
+
return t;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../src/synth/intent.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;AAEzD,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,CAAiB;IAC9C,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-report.d.ts","sourceRoot":"","sources":["../../../src/synth/intents/daily-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAU9D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAQ/E;AAED,eAAO,MAAM,iBAAiB,EAAE,cAmB/B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { missingFieldRule } from "../gaps.js";
|
|
2
|
+
// Spec 9 §5.1 (responds to S9-P1-2): local-timezone YYYY-MM-DD.
|
|
3
|
+
function today() {
|
|
4
|
+
const d = new Date();
|
|
5
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
6
|
+
}
|
|
7
|
+
// Spec 9 §5.1 (responds to S9-P0-1): the LLM emits "## <section title>\n<body>";
|
|
8
|
+
// split on H2 headers.
|
|
9
|
+
export function parseSections(answer) {
|
|
10
|
+
const parts = answer.split(/^##\s+/m).filter((s) => s.trim());
|
|
11
|
+
return parts.map((p) => {
|
|
12
|
+
const nl = p.indexOf("\n");
|
|
13
|
+
return nl === -1
|
|
14
|
+
? { title: p.trim(), body: "" }
|
|
15
|
+
: { title: p.slice(0, nl).trim(), body: p.slice(nl + 1).trim() };
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export const dailyReportIntent = {
|
|
19
|
+
id: "daily_report",
|
|
20
|
+
format: "sections", // Spec 7 §3.4
|
|
21
|
+
staleDays: 0, // a daily report is never "stale"
|
|
22
|
+
buildScope: (args) => {
|
|
23
|
+
const day = args.date ?? today();
|
|
24
|
+
// limit:200 is only a retrieval cap; context.ts truncates to a token budget (§6).
|
|
25
|
+
return { time: { from: `${day}T00:00:00`, to: `${day}T23:59:59` }, limit: 200 };
|
|
26
|
+
},
|
|
27
|
+
// Spec 9 §5.1 (responds to R2-S9-P1-1): must be a real string. The 7 H2 titles
|
|
28
|
+
// are fixed and in fixed order; parseSections depends on them.
|
|
29
|
+
systemPrompt: "你是用户的工作日报助手。基于下列带编号的今日记忆片段,用中文生成日报。\n" +
|
|
30
|
+
"严格用 7 个二级标题分段,标题文字必须与下列完全一致、顺序不变:\n" +
|
|
31
|
+
"## 今日概览\n## 今日完成\n## 推进中\n## 我的待办\n## 待回复与被@\n## 人脉动态\n## 明日提醒\n" +
|
|
32
|
+
"每段下写要点;事实性条目后用 [n] 标注来源编号;无内容的段写「无」。不要编造未提供的信息。",
|
|
33
|
+
expects: ["今日完成", "我的待办", "明日提醒"], // substrings of the fixed titles above
|
|
34
|
+
gapRules: [missingFieldRule],
|
|
35
|
+
parseSections,
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=daily-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-report.js","sourceRoot":"","sources":["../../../src/synth/intents/daily-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,gEAAgE;AAChE,SAAS,KAAK;IACZ,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACnH,CAAC;AAED,iFAAiF;AACjF,uBAAuB;AACvB,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,CAAC;YACd,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC/B,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,EAAE,EAAE,cAAc;IAClB,MAAM,EAAE,UAAU,EAAE,cAAc;IAClC,SAAS,EAAE,CAAC,EAAE,kCAAkC;IAChD,UAAU,EAAE,CAAC,IAAI,EAAc,EAAE;QAC/B,MAAM,GAAG,GAAI,IAAI,CAAC,IAAe,IAAI,KAAK,EAAE,CAAC;QAC7C,kFAAkF;QAClF,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,WAAW,EAAE,EAAE,EAAE,GAAG,GAAG,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAClF,CAAC;IACD,+EAA+E;IAC/E,+DAA+D;IAC/D,YAAY,EACV,uCAAuC;QACvC,qCAAqC;QACrC,kEAAkE;QAClE,iDAAiD;IACnD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,uCAAuC;IAC1E,QAAQ,EAAE,CAAC,gBAAgB,CAAC;IAC5B,aAAa;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/synth/intents/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { registerIntent } from "../intent.js";
|
|
2
|
+
import { dailyReportIntent } from "./daily-report.js";
|
|
3
|
+
import { personStrategyIntent } from "./person-strategy.js";
|
|
4
|
+
import { recallIntent } from "./recall.js";
|
|
5
|
+
import { troubleshootIntent } from "./troubleshoot.js";
|
|
6
|
+
// Explicit registration (no implicit import-order side effects).
|
|
7
|
+
// Spec 8/9/11 append their own registerIntent(...) lines here.
|
|
8
|
+
registerIntent(recallIntent);
|
|
9
|
+
registerIntent(personStrategyIntent);
|
|
10
|
+
registerIntent(dailyReportIntent);
|
|
11
|
+
registerIntent(troubleshootIntent);
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/synth/intents/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,iEAAiE;AACjE,+DAA+D;AAC/D,cAAc,CAAC,YAAY,CAAC,CAAC;AAC7B,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACrC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AAClC,cAAc,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* person_strategy intent (Spec 8 §6) — the Hero feature's strategy synthesis.
|
|
3
|
+
*
|
|
4
|
+
* Produces practical, evidence-cited communication advice for a person, optionally
|
|
5
|
+
* conditioned on a goal (passed via SynthOpts.extra.goal, threaded by the engine).
|
|
6
|
+
*
|
|
7
|
+
* The structured person profile (frontmatter.profile) is injected as non-citable
|
|
8
|
+
* pinnedContext via the buildPinnedContext hook; the [n] citations still point at
|
|
9
|
+
* candidate signals (the profile's evidence_refs surface there as candidates).
|
|
10
|
+
*
|
|
11
|
+
* Ethics guardrail (§6.3) is the literal systemPrompt: suggestions for better
|
|
12
|
+
* communication/collaboration only — never manipulation, PUA, or pressure tactics.
|
|
13
|
+
*/
|
|
14
|
+
import type { IntentTemplate } from "../types.js";
|
|
15
|
+
interface ProfileLike {
|
|
16
|
+
trait?: {
|
|
17
|
+
insufficient?: boolean;
|
|
18
|
+
dimensions?: Array<{
|
|
19
|
+
axis?: string;
|
|
20
|
+
level?: string;
|
|
21
|
+
confidence?: string;
|
|
22
|
+
note?: string;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
four_color?: {
|
|
26
|
+
colors?: string[];
|
|
27
|
+
descriptions?: string[];
|
|
28
|
+
disclaimer?: string;
|
|
29
|
+
};
|
|
30
|
+
relation?: {
|
|
31
|
+
tone?: string;
|
|
32
|
+
concerns?: string[];
|
|
33
|
+
landmines?: string[];
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Render a person's structured profile into a compact, non-citable framework block. */
|
|
37
|
+
export declare function renderProfileBlock(profile: ProfileLike): string;
|
|
38
|
+
export declare const personStrategyIntent: IntentTemplate;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=person-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-strategy.d.ts","sourceRoot":"","sources":["../../../src/synth/intents/person-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAE9D,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ,CAAC;IACF,UAAU,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjF,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACzE;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA6B/D;AAED,eAAO,MAAM,oBAAoB,EAAE,cAiBlC,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* person_strategy intent (Spec 8 §6) — the Hero feature's strategy synthesis.
|
|
3
|
+
*
|
|
4
|
+
* Produces practical, evidence-cited communication advice for a person, optionally
|
|
5
|
+
* conditioned on a goal (passed via SynthOpts.extra.goal, threaded by the engine).
|
|
6
|
+
*
|
|
7
|
+
* The structured person profile (frontmatter.profile) is injected as non-citable
|
|
8
|
+
* pinnedContext via the buildPinnedContext hook; the [n] citations still point at
|
|
9
|
+
* candidate signals (the profile's evidence_refs surface there as candidates).
|
|
10
|
+
*
|
|
11
|
+
* Ethics guardrail (§6.3) is the literal systemPrompt: suggestions for better
|
|
12
|
+
* communication/collaboration only — never manipulation, PUA, or pressure tactics.
|
|
13
|
+
*/
|
|
14
|
+
import { staleRule } from "../gaps.js";
|
|
15
|
+
/** Render a person's structured profile into a compact, non-citable framework block. */
|
|
16
|
+
export function renderProfileBlock(profile) {
|
|
17
|
+
const lines = ["【沟通画像(前置参考,非引用来源)】"];
|
|
18
|
+
const trait = profile.trait;
|
|
19
|
+
if (trait?.insufficient) {
|
|
20
|
+
lines.push("特质层:证据不足,暂不画像。");
|
|
21
|
+
}
|
|
22
|
+
else if (trait?.dimensions && trait.dimensions.length > 0) {
|
|
23
|
+
lines.push("行为四象限:");
|
|
24
|
+
for (const d of trait.dimensions) {
|
|
25
|
+
const parts = [`${d.axis ?? "?"} ${d.level ?? ""}`.trim()];
|
|
26
|
+
if (d.confidence)
|
|
27
|
+
parts.push(`置信度:${d.confidence}`);
|
|
28
|
+
if (d.note)
|
|
29
|
+
parts.push(d.note);
|
|
30
|
+
lines.push(`- ${parts.join(",")}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const fc = profile.four_color;
|
|
34
|
+
if (fc?.colors && fc.colors.length > 0) {
|
|
35
|
+
lines.push(`四色:${fc.colors.join(" / ")}(${fc.disclaimer ?? "通俗映射,非临床诊断"})`);
|
|
36
|
+
}
|
|
37
|
+
const rel = profile.relation;
|
|
38
|
+
if (rel) {
|
|
39
|
+
if (rel.tone)
|
|
40
|
+
lines.push(`关系基调:${rel.tone}`);
|
|
41
|
+
if (rel.concerns && rel.concerns.length > 0)
|
|
42
|
+
lines.push(`对方在意:${rel.concerns.join("、")}`);
|
|
43
|
+
if (rel.landmines && rel.landmines.length > 0)
|
|
44
|
+
lines.push(`雷区:${rel.landmines.join("、")}`);
|
|
45
|
+
}
|
|
46
|
+
return lines.join("\n");
|
|
47
|
+
}
|
|
48
|
+
export const personStrategyIntent = {
|
|
49
|
+
id: "person_strategy",
|
|
50
|
+
format: "single",
|
|
51
|
+
staleDays: 21,
|
|
52
|
+
buildScope: (args) => ({ entity: args.person, limit: 40 }),
|
|
53
|
+
systemPrompt: "你基于用户与某人的真实互动画像(前置 pinnedContext)和下列带编号的信号,给出实用的沟通建议。\n" +
|
|
54
|
+
"要求:① 只给「如何更好沟通/协作」的建议,不得给操纵、PUA、施压话术;② 尊重对方、假设善意;\n" +
|
|
55
|
+
"③ 每条建议后用 [n] 标注证据;④ 若提供了「本次沟通目标」,针对该目标给策略;⑤ 证据不足直说,不编造性格判断。",
|
|
56
|
+
expects: ["沟通建议"],
|
|
57
|
+
gapRules: [staleRule],
|
|
58
|
+
buildPinnedContext: async (scope, stores) => {
|
|
59
|
+
if (!scope.entity)
|
|
60
|
+
return undefined;
|
|
61
|
+
const page = await stores.pages.getPage(scope.entity);
|
|
62
|
+
const profile = page?.frontmatter?.profile;
|
|
63
|
+
return profile ? renderProfileBlock(profile) : undefined;
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=person-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-strategy.js","sourceRoot":"","sources":["../../../src/synth/intents/person-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IntentTemplate } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reference intent shipped by Spec 7 (appendix A).
|
|
4
|
+
* A general "recall" over an entity / free query / time window, producing a single
|
|
5
|
+
* concise synthesized answer with inline [n] citations and a stale gap check.
|
|
6
|
+
*/
|
|
7
|
+
export declare const recallIntent: IntentTemplate;
|
|
8
|
+
//# sourceMappingURL=recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../../src/synth/intents/recall.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,cAkB1B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { staleRule } from "../gaps.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reference intent shipped by Spec 7 (appendix A).
|
|
4
|
+
* A general "recall" over an entity / free query / time window, producing a single
|
|
5
|
+
* concise synthesized answer with inline [n] citations and a stale gap check.
|
|
6
|
+
*/
|
|
7
|
+
export const recallIntent = {
|
|
8
|
+
id: "recall",
|
|
9
|
+
format: "single",
|
|
10
|
+
staleDays: 14,
|
|
11
|
+
buildScope: (args) => ({
|
|
12
|
+
entity: args.entity,
|
|
13
|
+
query: args.query,
|
|
14
|
+
time: args.time,
|
|
15
|
+
limit: 30,
|
|
16
|
+
}),
|
|
17
|
+
systemPrompt: [
|
|
18
|
+
"你是用户的工作记忆助手。下面是带编号的记忆片段。",
|
|
19
|
+
"请用中文写一段简洁、客观的综合回答,概括用户所问范围的情况。",
|
|
20
|
+
"每个事实性断言后用 [n] 标注来源编号(n 对应片段编号)。",
|
|
21
|
+
"只使用提供的片段,不要编造未提供的信息;信息不足时直说。",
|
|
22
|
+
].join("\n"),
|
|
23
|
+
expects: [],
|
|
24
|
+
gapRules: [staleRule],
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../../src/synth/intents/recall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,EAAE,EAAE,QAAQ;IACZ,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrB,MAAM,EAAE,IAAI,CAAC,MAA4B;QACzC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,IAAI,EAAE,IAAI,CAAC,IAAgD;QAC3D,KAAK,EAAE,EAAE;KACV,CAAC;IACF,YAAY,EAAE;QACZ,0BAA0B;QAC1B,gCAAgC;QAChC,iCAAiC;QACjC,8BAA8B;KAC/B,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,CAAC,SAAS,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { IntentTemplate } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Spec 11 §6: one-shot troubleshooting over playbook pages.
|
|
4
|
+
*
|
|
5
|
+
* Retrieval is scoped to `type=playbook`. Graph-edge ordering happens HERE (the
|
|
6
|
+
* LLM cannot see edges): the `sortCandidates` hook walks the `precedes` chain via
|
|
7
|
+
* `graph.getOrderedSequence` and pre-orders candidates before they are numbered.
|
|
8
|
+
* The systemPrompt only asks the model to follow the given numbering.
|
|
9
|
+
*/
|
|
10
|
+
export declare const troubleshootIntent: IntentTemplate;
|
|
11
|
+
//# sourceMappingURL=troubleshoot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"troubleshoot.d.ts","sourceRoot":"","sources":["../../../src/synth/intents/troubleshoot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,aAAa,CAAC;AAqBtE;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,cAiChC,CAAC"}
|