@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
package/dist/daemon/scheduler.js
CHANGED
|
@@ -11,6 +11,10 @@ export class Scheduler {
|
|
|
11
11
|
state_path;
|
|
12
12
|
onTick;
|
|
13
13
|
runSource;
|
|
14
|
+
pending = null;
|
|
15
|
+
tickPromise = null;
|
|
16
|
+
draining = false;
|
|
17
|
+
aborter = null;
|
|
14
18
|
constructor(config, stateDir) {
|
|
15
19
|
this.tick_interval_ms = config.tick_interval_secs * 1000;
|
|
16
20
|
this.state_path = join(stateDir, "scheduler-state.json");
|
|
@@ -60,49 +64,82 @@ export class Scheduler {
|
|
|
60
64
|
async tick() {
|
|
61
65
|
if (this.running)
|
|
62
66
|
return;
|
|
67
|
+
if (this.draining)
|
|
68
|
+
return;
|
|
63
69
|
this.running = true;
|
|
64
|
-
this.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const result = await this.runSource(sourceId);
|
|
76
|
-
const duration_ms = Date.now() - start;
|
|
77
|
-
const classified = classifyResult(result);
|
|
78
|
-
schedule.recordResult(classified, Date.now(), result.error);
|
|
79
|
-
this.onTick?.(sourceId, result, duration_ms);
|
|
70
|
+
this.aborter = new AbortController();
|
|
71
|
+
const signal = this.aborter.signal;
|
|
72
|
+
const run = (async () => {
|
|
73
|
+
this.last_heartbeat_at = Date.now();
|
|
74
|
+
try {
|
|
75
|
+
// Snapshot eligible sources before applying pending so that sources
|
|
76
|
+
// newly added by applyConfig are not run in the same tick they appear.
|
|
77
|
+
const eligible = [...this.schedules.keys()];
|
|
78
|
+
if (this.pending) {
|
|
79
|
+
this.applyConfig(this.pending);
|
|
80
|
+
this.pending = null;
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
82
|
+
const now = Date.now();
|
|
83
|
+
for (const sourceId of eligible) {
|
|
84
|
+
if (signal.aborted)
|
|
85
|
+
break;
|
|
86
|
+
const schedule = this.schedules.get(sourceId);
|
|
87
|
+
if (!schedule)
|
|
88
|
+
continue; // removed by applyConfig
|
|
89
|
+
if (!schedule.isDue(now))
|
|
90
|
+
continue;
|
|
91
|
+
if (!this.runSource)
|
|
92
|
+
continue;
|
|
93
|
+
this.last_heartbeat_at = Date.now();
|
|
94
|
+
const start = Date.now();
|
|
95
|
+
try {
|
|
96
|
+
const result = await this.runSource(sourceId);
|
|
97
|
+
const duration_ms = Date.now() - start;
|
|
98
|
+
schedule.recordResult(classifyResult(result), Date.now(), result.error);
|
|
99
|
+
this.onTick?.(sourceId, result, duration_ms);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const duration_ms = Date.now() - start;
|
|
103
|
+
schedule.recordResult("failed", Date.now(), err instanceof Error ? err.message : String(err));
|
|
104
|
+
this.onTick?.(sourceId, this.fatalResult(err), duration_ms);
|
|
105
|
+
}
|
|
98
106
|
}
|
|
99
107
|
}
|
|
108
|
+
finally {
|
|
109
|
+
this.running = false;
|
|
110
|
+
this.last_heartbeat_at = Date.now();
|
|
111
|
+
this.persistState();
|
|
112
|
+
}
|
|
113
|
+
})();
|
|
114
|
+
this.tickPromise = run;
|
|
115
|
+
await run;
|
|
116
|
+
this.tickPromise = null;
|
|
117
|
+
}
|
|
118
|
+
fatalResult(err) {
|
|
119
|
+
return {
|
|
120
|
+
fatal: true,
|
|
121
|
+
error: err instanceof Error ? err.message : String(err),
|
|
122
|
+
totalMessages: 0,
|
|
123
|
+
totalBlocks: 0,
|
|
124
|
+
okBlocks: 0,
|
|
125
|
+
skippedBlocks: 0,
|
|
126
|
+
failedBlocks: 0,
|
|
127
|
+
okMessages: [],
|
|
128
|
+
skippedMessages: [],
|
|
129
|
+
failedMessages: [],
|
|
130
|
+
warnings: [],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
async drain() {
|
|
134
|
+
this.draining = true;
|
|
135
|
+
if (this.timer) {
|
|
136
|
+
clearInterval(this.timer);
|
|
137
|
+
this.timer = null;
|
|
100
138
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
}
|
|
139
|
+
this.aborter?.abort();
|
|
140
|
+
if (this.tickPromise)
|
|
141
|
+
await this.tickPromise;
|
|
142
|
+
this.persistState();
|
|
106
143
|
}
|
|
107
144
|
getHeartbeat() {
|
|
108
145
|
return { daemon_started_at: this.daemon_started_at, last_heartbeat_at: this.last_heartbeat_at };
|
|
@@ -117,6 +154,44 @@ export class Scheduler {
|
|
|
117
154
|
.filter(([_, s]) => s.shouldAlert())
|
|
118
155
|
.map(([id, s]) => ({ source_id: id, state: s.serialize() }));
|
|
119
156
|
}
|
|
157
|
+
reconcile(config) {
|
|
158
|
+
if (this.running) {
|
|
159
|
+
// most-recent wins; earlier pending superseded
|
|
160
|
+
this.pending = config;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this.applyConfig(config);
|
|
164
|
+
}
|
|
165
|
+
applyConfig(config) {
|
|
166
|
+
const nextIds = new Set(Object.entries(config.sources)
|
|
167
|
+
.filter(([, c]) => c.enabled !== false)
|
|
168
|
+
.map(([id]) => id));
|
|
169
|
+
for (const id of [...this.schedules.keys()]) {
|
|
170
|
+
if (!nextIds.has(id))
|
|
171
|
+
this.schedules.delete(id);
|
|
172
|
+
}
|
|
173
|
+
for (const [id, sourceConfig] of Object.entries(config.sources)) {
|
|
174
|
+
if (sourceConfig.enabled === false)
|
|
175
|
+
continue;
|
|
176
|
+
const interval = sourceConfig.interval_secs ?? config.defaults.interval_secs;
|
|
177
|
+
const existing = this.schedules.get(id);
|
|
178
|
+
if (!existing) {
|
|
179
|
+
this.schedules.set(id, new SourceSchedule(id, interval));
|
|
180
|
+
}
|
|
181
|
+
else if (existing.interval_secs !== interval) {
|
|
182
|
+
this.schedules.set(id, SourceSchedule.fromSerialized(id, interval, existing.serialize()));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const newTick = config.tick_interval_secs * 1000;
|
|
186
|
+
if (newTick !== this.tick_interval_ms) {
|
|
187
|
+
this.tick_interval_ms = newTick;
|
|
188
|
+
if (this.timer) {
|
|
189
|
+
clearInterval(this.timer);
|
|
190
|
+
this.timer = setInterval(() => this.tick(), this.tick_interval_ms);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.persistState();
|
|
194
|
+
}
|
|
120
195
|
persistState() {
|
|
121
196
|
const data = {
|
|
122
197
|
daemon_started_at: this.daemon_started_at,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/daemon/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAoB,MAAM,sBAAsB,CAAC;AAUxF,MAAM,OAAO,SAAS;IACZ,SAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;IACnD,KAAK,GAA0C,IAAI,CAAC;IACpD,OAAO,GAAG,KAAK,CAAC;IAChB,iBAAiB,CAAS;IAC1B,iBAAiB,CAAS;
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/daemon/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { LoadedConfig } from "../core/config.js";
|
|
2
|
+
import type { DaemonStatus, StoreContext } from "../server/api.js";
|
|
3
|
+
import { ChatNameRefreshJob } from "../server/chat-name-refresh-job.js";
|
|
4
|
+
import { Scheduler } from "./scheduler.js";
|
|
5
|
+
/** A serve session's config-derived runtime, rebuilt/replaced as a whole on reload. */
|
|
6
|
+
export interface ServeRuntime {
|
|
7
|
+
scheduler: Scheduler | undefined;
|
|
8
|
+
chatNameRefreshJob: ChatNameRefreshJob | undefined;
|
|
9
|
+
getDaemonStatus: () => DaemonStatus | undefined;
|
|
10
|
+
/** Stop timers, release docsClient/docsCursor/chatNameRefreshJob and other resources. */
|
|
11
|
+
dispose: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Mutable holder: route handlers read `.current` (indirection) — never capture the runtime by value. */
|
|
14
|
+
export declare class ServeRuntimeHolder {
|
|
15
|
+
current: ServeRuntime;
|
|
16
|
+
constructor(initial: ServeRuntime);
|
|
17
|
+
swap(next: ServeRuntime): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build the config-derived serve runtime (scheduler, chatNameRefreshJob,
|
|
21
|
+
* getDaemonStatus, dispose). Extracted from the `serve` command action so
|
|
22
|
+
* it can be rebuilt on config change (Task 8).
|
|
23
|
+
*
|
|
24
|
+
* NOTE: The scheduler is constructed even when `config.scheduler.enabled` is
|
|
25
|
+
* false, so the holder always has a Scheduler instance available for cold-start
|
|
26
|
+
* logic. `scheduler.start()` is NOT called here — the caller decides.
|
|
27
|
+
*
|
|
28
|
+
* Assembly is covered by the serve integration test wired in Task 8.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildServeRuntime(config: LoadedConfig, stores: StoreContext, stateDir: string): Promise<ServeRuntime>;
|
|
31
|
+
//# sourceMappingURL=serve-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-runtime.d.ts","sourceRoot":"","sources":["../../src/daemon/serve-runtime.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,mBAAmB,CAAC;AAOrE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,eAAe,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAChD,yFAAyF;IACzF,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,yGAAyG;AACzG,qBAAa,kBAAkB;IAC7B,OAAO,EAAE,YAAY,CAAC;gBACV,OAAO,EAAE,YAAY;IAGjC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;CAG/B;AAiCD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAkLvB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { ChatNameResolver } from "../collectors/feishu/chat-name-resolver.js";
|
|
4
|
+
import { normalizeDocsConfig } from "../collectors/feishu/docs/config.js";
|
|
5
|
+
import { runDocSource } from "../collectors/feishu/docs/run.js";
|
|
6
|
+
import { LarkCliHttpClient } from "../collectors/feishu/lark-cli-client.js";
|
|
7
|
+
import { LarkCliIdentityBackend } from "../collectors/feishu/lark-cli-identity-backend.js";
|
|
8
|
+
import { resolveSelfOpenId } from "../collectors/feishu/self-open-id.js";
|
|
9
|
+
import { createClaudeCodeCollector, createCodexCollector, createFeishuCollector, createHermesCollector, getCollector, registerCollector, resetRegistry, } from "../collectors/index.js";
|
|
10
|
+
import { CursorStore } from "../core/cursors.js";
|
|
11
|
+
import { PersonIdentityStore } from "../core/person-identity.js";
|
|
12
|
+
import { runPipeline } from "../core/pipeline.js";
|
|
13
|
+
import { statePath } from "../core/state.js";
|
|
14
|
+
import { createLLMProvider, createMockProvider } from "../extractors/providers/index.js";
|
|
15
|
+
import { ChatNameRefreshJob } from "../server/chat-name-refresh-job.js";
|
|
16
|
+
import { PersonBehaviorStore } from "../store/person-behavior.js";
|
|
17
|
+
import { Scheduler } from "./scheduler.js";
|
|
18
|
+
/** Mutable holder: route handlers read `.current` (indirection) — never capture the runtime by value. */
|
|
19
|
+
export class ServeRuntimeHolder {
|
|
20
|
+
current;
|
|
21
|
+
constructor(initial) {
|
|
22
|
+
this.current = initial;
|
|
23
|
+
}
|
|
24
|
+
swap(next) {
|
|
25
|
+
this.current = next;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ── Helpers (replicated from cli.ts; factored here for rebuildability) ───────
|
|
29
|
+
function resolveProjectPath(path, projectRoot) {
|
|
30
|
+
if (!path)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (path.startsWith("~/"))
|
|
33
|
+
return resolve(homedir(), path.slice(2));
|
|
34
|
+
if (path === "~")
|
|
35
|
+
return homedir();
|
|
36
|
+
if (isAbsolute(path))
|
|
37
|
+
return path;
|
|
38
|
+
return resolve(projectRoot, path);
|
|
39
|
+
}
|
|
40
|
+
function bootstrapCollectors(sources, projectRoot) {
|
|
41
|
+
resetRegistry();
|
|
42
|
+
const agentConfigs = {
|
|
43
|
+
"claude-code": { factory: createClaudeCodeCollector, config: sources["claude-code"] },
|
|
44
|
+
codex: { factory: createCodexCollector, config: sources.codex },
|
|
45
|
+
hermes: { factory: createHermesCollector, config: sources.hermes },
|
|
46
|
+
};
|
|
47
|
+
for (const { factory, config } of Object.values(agentConfigs)) {
|
|
48
|
+
if (config?.enabled !== false) {
|
|
49
|
+
registerCollector(factory(resolveProjectPath(config?.base_dir, projectRoot)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (sources.feishu?.enabled !== false && sources.feishu?.app_id) {
|
|
53
|
+
registerCollector(createFeishuCollector(sources.feishu));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ── buildServeRuntime ─────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Build the config-derived serve runtime (scheduler, chatNameRefreshJob,
|
|
59
|
+
* getDaemonStatus, dispose). Extracted from the `serve` command action so
|
|
60
|
+
* it can be rebuilt on config change (Task 8).
|
|
61
|
+
*
|
|
62
|
+
* NOTE: The scheduler is constructed even when `config.scheduler.enabled` is
|
|
63
|
+
* false, so the holder always has a Scheduler instance available for cold-start
|
|
64
|
+
* logic. `scheduler.start()` is NOT called here — the caller decides.
|
|
65
|
+
*
|
|
66
|
+
* Assembly is covered by the serve integration test wired in Task 8.
|
|
67
|
+
*/
|
|
68
|
+
export async function buildServeRuntime(config, stores, stateDir) {
|
|
69
|
+
let scheduler;
|
|
70
|
+
// Track resources that need cleanup so dispose() can release them.
|
|
71
|
+
let docsClient;
|
|
72
|
+
let docsCursor;
|
|
73
|
+
let chatNameRefreshJob;
|
|
74
|
+
if (config.scheduler) {
|
|
75
|
+
// Always construct Scheduler when the block is present (even if enabled=false),
|
|
76
|
+
// so ServeRuntimeHolder always holds a Scheduler for future cold-start wiring.
|
|
77
|
+
scheduler = new Scheduler(config.scheduler, stateDir);
|
|
78
|
+
if (config.scheduler.enabled) {
|
|
79
|
+
bootstrapCollectors(config.sources, config.__context.projectRoot);
|
|
80
|
+
const llmConfig = { ...config.llm };
|
|
81
|
+
const envKey = llmConfig.provider === "anthropic"
|
|
82
|
+
? process.env.ANTHROPIC_API_KEY
|
|
83
|
+
: process.env.OPENAI_API_KEY;
|
|
84
|
+
if (!llmConfig.api_key && envKey)
|
|
85
|
+
llmConfig.api_key = envKey;
|
|
86
|
+
const provider = llmConfig.api_key
|
|
87
|
+
? createLLMProvider(llmConfig)
|
|
88
|
+
: createMockProvider(new Map());
|
|
89
|
+
const pipelineConfig = {
|
|
90
|
+
dedup_checkpoint: statePath("dedup.jsonl"),
|
|
91
|
+
cursor_checkpoint: statePath("cursors.yaml"),
|
|
92
|
+
block_gap_minutes: config.block_builder.block_gap_minutes,
|
|
93
|
+
max_block_tokens: config.block_builder.max_block_tokens,
|
|
94
|
+
max_block_messages: config.block_builder.max_block_messages,
|
|
95
|
+
privacy: config.privacy,
|
|
96
|
+
output_dir: process.cwd(),
|
|
97
|
+
block_concurrency: config.pipeline?.block_concurrency,
|
|
98
|
+
};
|
|
99
|
+
// ── Person communication profile (Spec 8): behavior-layer accumulation.
|
|
100
|
+
// No-op unless config.profile.enabled (checked inside accumulateBehavior),
|
|
101
|
+
// so it is wired unconditionally. resolveSender maps a sender open id to its
|
|
102
|
+
// canonical person slug via the identity handle table, falling back to a
|
|
103
|
+
// deterministic slug when unknown.
|
|
104
|
+
const behaviorIdentity = new PersonIdentityStore(stores.db.pg, { pages: stores.pages });
|
|
105
|
+
const behaviorDeps = {
|
|
106
|
+
store: new PersonBehaviorStore(stores.db.pg),
|
|
107
|
+
config: config.profile,
|
|
108
|
+
resolveSender: async (contact) => (await behaviorIdentity.resolveHandle("feishu_open_id", contact)) ?? `people/${contact}`,
|
|
109
|
+
};
|
|
110
|
+
// ── G2: feishu.docs special case ────────────────────────────────────────
|
|
111
|
+
// docs uses runDocSource (not runPipeline) and manages its own cursor state.
|
|
112
|
+
docsCursor = new CursorStore(statePath("cursors.yaml"));
|
|
113
|
+
const feishuCfg = config.sources.feishu;
|
|
114
|
+
docsClient =
|
|
115
|
+
feishuCfg?.enabled && feishuCfg.sources?.docs?.enabled
|
|
116
|
+
? new LarkCliHttpClient(feishuCfg.lark_bin)
|
|
117
|
+
: undefined;
|
|
118
|
+
const docsResolved = feishuCfg?.sources?.docs?.enabled
|
|
119
|
+
? normalizeDocsConfig(feishuCfg.sources.docs)
|
|
120
|
+
: undefined;
|
|
121
|
+
const runDocsAsPipelineResult = async () => {
|
|
122
|
+
if (!docsClient || !docsResolved || !docsCursor)
|
|
123
|
+
throw new Error("feishu.docs scheduled but docs source not enabled");
|
|
124
|
+
docsCursor.load();
|
|
125
|
+
const selfOpenId = docsResolved.self_open_id ??
|
|
126
|
+
(await resolveSelfOpenId(docsClient, feishuCfg?.sources?.dm?.self_open_id)) ??
|
|
127
|
+
"";
|
|
128
|
+
const stats = await runDocSource({
|
|
129
|
+
client: docsClient,
|
|
130
|
+
stores,
|
|
131
|
+
provider,
|
|
132
|
+
config: docsResolved,
|
|
133
|
+
cursor: docsCursor,
|
|
134
|
+
selfOpenId,
|
|
135
|
+
nowMs: Date.now(),
|
|
136
|
+
nowIso: () => new Date().toISOString(),
|
|
137
|
+
});
|
|
138
|
+
console.log(`[scheduler] feishu.docs: scanned=${stats.candidates_scanned} pointer=${stats.pointer_saved} full=${stats.full_card_generated} refreshed=${stats.full_card_refreshed} queue=${stats.upgrade_queue_size}`);
|
|
139
|
+
return {
|
|
140
|
+
fatal: false,
|
|
141
|
+
error: undefined,
|
|
142
|
+
totalMessages: stats.candidates_scanned,
|
|
143
|
+
totalBlocks: stats.full_card_generated + stats.pointer_saved + stats.full_card_refreshed,
|
|
144
|
+
okBlocks: stats.full_card_generated + stats.pointer_saved + stats.full_card_refreshed,
|
|
145
|
+
skippedBlocks: stats.skipped,
|
|
146
|
+
failedBlocks: stats.llm_failed,
|
|
147
|
+
okMessages: [],
|
|
148
|
+
skippedMessages: [],
|
|
149
|
+
failedMessages: [],
|
|
150
|
+
warnings: [],
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
// ── end feishu.docs special case ─────────────────────────────────────────
|
|
154
|
+
scheduler.setRunSource(async (sourceId) => {
|
|
155
|
+
if (sourceId === "feishu.docs") {
|
|
156
|
+
return runDocsAsPipelineResult();
|
|
157
|
+
}
|
|
158
|
+
const collector = getCollector(sourceId);
|
|
159
|
+
if (!collector)
|
|
160
|
+
throw new Error(`Unknown source: ${sourceId}`);
|
|
161
|
+
return runPipeline(pipelineConfig, {
|
|
162
|
+
source: collector,
|
|
163
|
+
provider,
|
|
164
|
+
format: "json",
|
|
165
|
+
adapter: "store",
|
|
166
|
+
stores,
|
|
167
|
+
dryRun: false,
|
|
168
|
+
behavior: behaviorDeps,
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
scheduler.setOnTick((sourceId, result, duration_ms) => {
|
|
172
|
+
const status = result.fatal ? "failed" : "ok";
|
|
173
|
+
console.log(`[scheduler] ${sourceId}: ${status} (${duration_ms}ms)`);
|
|
174
|
+
});
|
|
175
|
+
// NOTE: scheduler.start() is NOT called here — the caller (cli.ts / ReloadManager) starts it.
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// ── G1: getDaemonStatus closure ──────────────────────────────────────────────
|
|
179
|
+
const getDaemonStatus = scheduler
|
|
180
|
+
? () => {
|
|
181
|
+
const hb = scheduler?.getHeartbeat();
|
|
182
|
+
const now = Date.now();
|
|
183
|
+
let lastRunAt = null;
|
|
184
|
+
let nextAt = null;
|
|
185
|
+
for (const id of scheduler?.getSourceIds() ?? []) {
|
|
186
|
+
const s = scheduler?.getSourceState(id);
|
|
187
|
+
if (!s)
|
|
188
|
+
continue;
|
|
189
|
+
if (s.last_run_at !== null && (lastRunAt === null || s.last_run_at > lastRunAt)) {
|
|
190
|
+
lastRunAt = s.last_run_at;
|
|
191
|
+
}
|
|
192
|
+
const next = s.last_run_at !== null ? s.last_run_at + s.interval_secs * 1000 : now;
|
|
193
|
+
if (nextAt === null || next < nextAt)
|
|
194
|
+
nextAt = next;
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
running: true,
|
|
198
|
+
uptime_seconds: Math.floor((now - (hb?.daemon_started_at ?? now)) / 1000),
|
|
199
|
+
last_run: lastRunAt ? new Date(lastRunAt).toISOString() : null,
|
|
200
|
+
next_scheduled: nextAt !== null ? new Date(nextAt).toISOString() : null,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
: () => undefined;
|
|
204
|
+
// ── G1: chatNameRefreshJob (config/credential-derived; rebuilt on Tier 2 reload) ──
|
|
205
|
+
let chatNameRefreshLarkClient;
|
|
206
|
+
if (config.sources.feishu?.enabled) {
|
|
207
|
+
chatNameRefreshLarkClient = new LarkCliHttpClient(config.sources.feishu.lark_bin);
|
|
208
|
+
const selfOpenId = await resolveSelfOpenId(chatNameRefreshLarkClient, config.sources.feishu.sources?.dm?.self_open_id);
|
|
209
|
+
const backend = new LarkCliIdentityBackend(chatNameRefreshLarkClient, selfOpenId ?? undefined);
|
|
210
|
+
const resolver = new ChatNameResolver(stores.db.pg, backend);
|
|
211
|
+
chatNameRefreshJob = new ChatNameRefreshJob(stores.db.pg, resolver);
|
|
212
|
+
}
|
|
213
|
+
// ── dispose ───────────────────────────────────────────────────────────────────
|
|
214
|
+
const dispose = async () => {
|
|
215
|
+
// Stop the scheduler timer (safe to call even if never started).
|
|
216
|
+
scheduler?.stop();
|
|
217
|
+
// ChatNameRefreshJob is on-demand only (no setInterval/timer); no teardown needed.
|
|
218
|
+
// Drop docs resource references to release the lark-cli handles.
|
|
219
|
+
docsClient = undefined;
|
|
220
|
+
docsCursor = undefined;
|
|
221
|
+
chatNameRefreshLarkClient = undefined;
|
|
222
|
+
};
|
|
223
|
+
return {
|
|
224
|
+
scheduler,
|
|
225
|
+
chatNameRefreshJob,
|
|
226
|
+
getDaemonStatus,
|
|
227
|
+
dispose,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=serve-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-runtime.js","sourceRoot":"","sources":["../../src/daemon/serve-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAA4C,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAW3C,yGAAyG;AACzG,MAAM,OAAO,kBAAkB;IAC7B,OAAO,CAAe;IACtB,YAAY,OAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,IAAkB;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF;AAED,gFAAgF;AAEhF,SAAS,kBAAkB,CAAC,IAAwB,EAAE,WAAmB;IACvE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAsB,EAAE,WAAmB;IACtE,aAAa,EAAE,CAAC;IAChB,MAAM,YAAY,GAAG;QACnB,aAAa,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;QACrF,KAAK,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE;QAC/D,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;KACnE,CAAC;IAEF,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAChE,iBAAiB,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,MAAoB,EACpB,QAAgB;IAEhB,IAAI,SAAgC,CAAC;IAErC,mEAAmE;IACnE,IAAI,UAAyC,CAAC;IAC9C,IAAI,UAAmC,CAAC;IACxC,IAAI,kBAAkD,CAAC;IAEvD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,gFAAgF;QAChF,+EAA+E;QAC/E,SAAS,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC7B,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAElE,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;YACpC,MAAM,MAAM,GACV,SAAS,CAAC,QAAQ,KAAK,WAAW;gBAChC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAC/B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM;gBAAE,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;YAC7D,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO;gBAChC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAElC,MAAM,cAAc,GAAmB;gBACrC,gBAAgB,EAAE,SAAS,CAAC,aAAa,CAAC;gBAC1C,iBAAiB,EAAE,SAAS,CAAC,cAAc,CAAC;gBAC5C,iBAAiB,EAAE,MAAM,CAAC,aAAa,CAAC,iBAAiB;gBACzD,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,gBAAgB;gBACvD,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,kBAAkB;gBAC3D,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;gBACzB,iBAAiB,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB;aACtD,CAAC;YAEF,yEAAyE;YACzE,2EAA2E;YAC3E,6EAA6E;YAC7E,yEAAyE;YACzE,mCAAmC;YACnC,MAAM,gBAAgB,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACxF,MAAM,YAAY,GAAmB;gBACnC,KAAK,EAAE,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC5C,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAC/B,CAAC,MAAM,gBAAgB,CAAC,aAAa,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,UAAU,OAAO,EAAE;aAC3F,CAAC;YAEF,2EAA2E;YAC3E,6EAA6E;YAC7E,UAAU,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACxC,UAAU;gBACR,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO;oBACpD,CAAC,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC;oBAC3C,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,YAAY,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO;gBACpD,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,uBAAuB,GAAG,KAAK,IAA6B,EAAE;gBAClE,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU;oBAC7C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACvE,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,UAAU,GACd,YAAY,CAAC,YAAY;oBACzB,CAAC,MAAM,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;oBAC3E,EAAE,CAAC;gBACL,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;oBAC/B,MAAM,EAAE,UAAU;oBAClB,MAAM;oBACN,QAAQ;oBACR,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,UAAU;oBAClB,UAAU;oBACV,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;oBACjB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACvC,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CACT,oCAAoC,KAAK,CAAC,kBAAkB,YAAY,KAAK,CAAC,aAAa,SAAS,KAAK,CAAC,mBAAmB,cAAc,KAAK,CAAC,mBAAmB,UAAU,KAAK,CAAC,kBAAkB,EAAE,CACzM,CAAC;gBACF,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,SAAS;oBAChB,aAAa,EAAE,KAAK,CAAC,kBAAkB;oBACvC,WAAW,EAAE,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,mBAAmB;oBACxF,QAAQ,EAAE,KAAK,CAAC,mBAAmB,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,mBAAmB;oBACrF,aAAa,EAAE,KAAK,CAAC,OAAO;oBAC5B,YAAY,EAAE,KAAK,CAAC,UAAU;oBAC9B,UAAU,EAAE,EAAE;oBACd,eAAe,EAAE,EAAE;oBACnB,cAAc,EAAE,EAAE;oBAClB,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC,CAAC;YACF,4EAA4E;YAE5E,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACxC,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;oBAC/B,OAAO,uBAAuB,EAAE,CAAC;gBACnC,CAAC;gBACD,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;gBAC/D,OAAO,WAAW,CAAC,cAAc,EAAE;oBACjC,MAAM,EAAE,SAAS;oBACjB,QAAQ;oBACR,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,OAAO;oBAChB,MAAM;oBACN,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;gBACpD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,KAAK,MAAM,KAAK,WAAW,KAAK,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;YACH,8FAA8F;QAChG,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,MAAM,eAAe,GAAG,SAAS;QAC/B,CAAC,CAAC,GAAiB,EAAE;YACjB,MAAM,EAAE,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,SAAS,GAAkB,IAAI,CAAC;YACpC,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;gBACjD,MAAM,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;gBACxC,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;oBAChF,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC;gBAC5B,CAAC;gBACD,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;gBACnF,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,GAAG,MAAM;oBAAE,MAAM,GAAG,IAAI,CAAC;YACtD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,iBAAiB,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;gBACzE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;gBAC9D,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;aACxE,CAAC;QACJ,CAAC;QACH,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;IAEpB,qFAAqF;IACrF,IAAI,yBAAwD,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACnC,yBAAyB,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,yBAAyB,EACzB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAChD,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC;QAC/F,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC;IAED,iFAAiF;IACjF,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACxC,iEAAiE;QACjE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClB,mFAAmF;QACnF,iEAAiE;QACjE,UAAU,GAAG,SAAS,CAAC;QACvB,UAAU,GAAG,SAAS,CAAC;QACvB,yBAAyB,GAAG,SAAS,CAAC;IACxC,CAAC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,kBAAkB;QAClB,eAAe;QACf,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedded-assets.generated.d.ts","sourceRoot":"","sources":["../src/embedded-assets.generated.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,EAAE,MAAgB,CAAC;AAEvC,eAAO,MAAM,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"embedded-assets.generated.d.ts","sourceRoot":"","sources":["../src/embedded-assets.generated.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,EAAE,MAAgB,CAAC;AAEvC,eAAO,MAAM,UAAU,EAAE,MAA68J,CAAC;AAEv+J,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK1C,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// AUTO-GENERATED by scripts/gen-embedded-assets.mjs — do not edit by hand.
|
|
2
2
|
// Source: src/store/schema.sql + src/extractors/prompts/**/*.md
|
|
3
3
|
// Regenerate with `bun run gen:assets`.
|
|
4
|
-
export const VERSION = "0.3.
|
|
5
|
-
export const SCHEMA_SQL = "CREATE EXTENSION IF NOT EXISTS vector;\n\nCREATE TABLE IF NOT EXISTS pages (\n id SERIAL PRIMARY KEY,\n slug TEXT UNIQUE NOT NULL,\n type TEXT NOT NULL,\n title TEXT NOT NULL,\n compiled_truth TEXT NOT NULL DEFAULT '',\n frontmatter JSONB NOT NULL DEFAULT '{}',\n content_hash TEXT,\n halflife_days INTEGER,\n tier TEXT NOT NULL DEFAULT 'hot',\n expires_at TIMESTAMPTZ,\n consolidated_into INTEGER REFERENCES pages(id),\n
|
|
4
|
+
export const VERSION = "0.3.2";
|
|
5
|
+
export const SCHEMA_SQL = "CREATE EXTENSION IF NOT EXISTS vector;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\n\nCREATE TABLE IF NOT EXISTS pages (\n id SERIAL PRIMARY KEY,\n slug TEXT UNIQUE NOT NULL,\n type TEXT NOT NULL,\n title TEXT NOT NULL,\n compiled_truth TEXT NOT NULL DEFAULT '',\n frontmatter JSONB NOT NULL DEFAULT '{}',\n content_hash TEXT,\n halflife_days INTEGER,\n tier TEXT NOT NULL DEFAULT 'hot',\n expires_at TIMESTAMPTZ,\n consolidated_into INTEGER REFERENCES pages(id),\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_pages_title_trgm ON pages USING gin (title gin_trgm_ops);\nCREATE INDEX IF NOT EXISTS idx_pages_compiled_truth_trgm ON pages USING gin (compiled_truth gin_trgm_ops);\n-- idx_pages_tier and idx_pages_expires_at are created by M003 lifecycle_tier migration,\n-- which is the only place that guarantees the tier/expires_at columns exist on upgrade.\n\nCREATE TABLE IF NOT EXISTS content_chunks (\n id SERIAL PRIMARY KEY,\n page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n chunk_index INTEGER NOT NULL,\n UNIQUE(page_id, chunk_index),\n chunk_text TEXT NOT NULL,\n chunk_source TEXT NOT NULL DEFAULT 'compiled_truth',\n token_count INTEGER,\n embedding vector(__EMBEDDING_DIM__),\n model TEXT NOT NULL DEFAULT 'text-embedding-3-large',\n embedded_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n);\n\nCREATE INDEX IF NOT EXISTS idx_chunks_embedding ON content_chunks\n USING hnsw (embedding vector_cosine_ops);\nCREATE INDEX IF NOT EXISTS idx_chunks_chunk_text_trgm ON content_chunks USING gin (chunk_text gin_trgm_ops);\n\nCREATE TABLE IF NOT EXISTS links (\n id SERIAL PRIMARY KEY,\n from_page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n to_page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n link_type TEXT NOT NULL DEFAULT '',\n context TEXT NOT NULL DEFAULT '',\n provenance JSONB,\n source_hash TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n UNIQUE(from_page_id, to_page_id, link_type)\n);\n\nCREATE INDEX IF NOT EXISTS idx_links_from ON links (from_page_id);\nCREATE INDEX IF NOT EXISTS idx_links_to ON links (to_page_id);\n\nCREATE TABLE IF NOT EXISTS tags (\n id SERIAL PRIMARY KEY,\n page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n tag TEXT NOT NULL,\n UNIQUE(page_id, tag)\n);\n\nCREATE INDEX IF NOT EXISTS idx_tags_tag ON tags (tag);\n\nCREATE TABLE IF NOT EXISTS timeline_entries (\n id SERIAL PRIMARY KEY,\n page_id INTEGER NOT NULL REFERENCES pages(id) ON DELETE CASCADE,\n date TEXT NOT NULL,\n summary TEXT NOT NULL,\n detail TEXT NOT NULL DEFAULT '',\n source TEXT NOT NULL DEFAULT '',\n provenance JSONB,\n tier TEXT NOT NULL DEFAULT 'hot',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n UNIQUE(page_id, date, summary)\n);\n\n-- Identity cache for person slug canonicalization\n-- identity_cache doubles as the person slug canonicalization store via\n-- platform = 'canonical':\n-- external_id = model-produced slug or display name\n-- display_name = canonical person slug (e.g. 'person/wang-jiandu')\n-- slug_hint = original entity.name (used for collision detection)\nCREATE TABLE IF NOT EXISTS identity_cache (\n platform TEXT NOT NULL,\n external_id TEXT NOT NULL,\n display_name TEXT,\n slug_hint TEXT,\n resolved_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n PRIMARY KEY (platform, external_id)\n);\n\nDO $$ BEGIN\n IF NOT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE table_name = 'identity_cache' AND column_name = 'slug_hint'\n ) THEN\n ALTER TABLE identity_cache ADD COLUMN slug_hint TEXT;\n END IF;\nEND $$;\n\n-- person_handles: the typed alias layer (Layer 1 of person identity).\n-- Maps any \"handle\" by which a person is known to the canonical person page\n-- slug. A handle is (kind, value); the pair is unique, so one handle resolves\n-- to exactly one person. Merging/aliasing is explicit (see core/person-identity).\n-- kind = 'feishu_open_id' | 'email' | 'name' | 'nickname' | 'slug'\n-- value = canonicalized handle value (lowercased / whitespace-collapsed)\n-- strength = 'strong' (auto-resolvable: open_id/email/name/slug)\n-- | 'weak' (nickname/花名 — only created via explicit link)\nCREATE TABLE IF NOT EXISTS person_handles (\n kind TEXT NOT NULL,\n value TEXT NOT NULL,\n canonical_slug TEXT NOT NULL,\n strength TEXT NOT NULL DEFAULT 'strong',\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n PRIMARY KEY (kind, value)\n);\n\nCREATE INDEX IF NOT EXISTS idx_person_handles_slug ON person_handles (canonical_slug);\n";
|
|
6
6
|
export const PROMPTS = {
|
|
7
7
|
"examples/agent-session.md": "# Example: Agent Session Extraction\n\n## Input Conversation\n\n```\n[2024-01-15T10:00:00Z] → Alice: We need to migrate from sessions to JWT for the auth system\n[2024-01-15T10:01:30Z] ← Bob: Makes sense for scaling. I can start this week.\n[2024-01-15T10:02:15Z] → Alice: Perfect. Let's use the HS256 algorithm initially.\n[2024-01-15T10:03:00Z] ← Bob: Got it. Should we add refresh tokens too?\n[2024-01-15T10:03:45Z] → Alice: Yes, 7-day access tokens and 30-day refresh tokens.\n[2024-01-15T10:04:30Z] ← Bob: I'll document the decision in the wiki before implementing.\n```\n\n## Output JSON\n\n```json\n{\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:00:00Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"We need to migrate from sessions to JWT for the auth system\"\n },\n \"entities\": [\n {\n \"slug\": \"person/alice\",\n \"name\": \"Alice\",\n \"type\": \"person\",\n \"context\": \"Engineering lead discussing auth migration\",\n \"confidence\": \"direct\"\n },\n {\n \"slug\": \"person/bob\",\n \"name\": \"Bob\",\n \"type\": \"person\",\n \"context\": \"Developer implementing JWT auth system\",\n \"confidence\": \"direct\"\n },\n {\n \"slug\": \"project/auth-system\",\n \"name\": \"Auth System\",\n \"type\": \"project\",\n \"context\": \"Authentication system being migrated to JWT\",\n \"confidence\": \"direct\"\n },\n {\n \"slug\": \"tool/jwt\",\n \"name\": \"JWT (JSON Web Tokens)\",\n \"type\": \"tool\",\n \"context\": \"Token-based authentication mechanism replacing sessions\",\n \"confidence\": \"direct\"\n },\n {\n \"slug\": \"concept/refresh-tokens\",\n \"name\": \"Refresh Tokens\",\n \"type\": \"concept\",\n \"context\": \"30-day tokens for obtaining new access tokens\",\n \"confidence\": \"direct\"\n }\n ],\n \"timeline\": [\n {\n \"date\": \"2024-01-15\",\n \"summary\": \"Decision to migrate from sessions to JWT authentication\",\n \"entities\": [\"person/alice\", \"person/bob\", \"project/auth-system\", \"tool/jwt\"],\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:00:00Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"We need to migrate from sessions to JWT for the auth system\"\n },\n \"confidence\": \"direct\"\n },\n {\n \"date\": \"2024-01-15\",\n \"summary\": \"Bob commits to starting JWT migration this week\",\n \"entities\": [\"person/bob\", \"project/auth-system\"],\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:01:30Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"Makes sense for scaling. I can start this week.\"\n },\n \"confidence\": \"direct\"\n }\n ],\n \"links\": [\n {\n \"from\": \"person/bob\",\n \"to\": \"project/auth-system\",\n \"type\": \"works_on\",\n \"context\": \"Bob is implementing the JWT migration for auth system\",\n \"confidence\": \"direct\"\n },\n {\n \"from\": \"project/auth-system\",\n \"to\": \"tool/jwt\",\n \"type\": \"depends_on\",\n \"context\": \"Auth system will use JWT for token-based authentication\",\n \"confidence\": \"direct\"\n },\n {\n \"from\": \"person/alice\",\n \"to\": \"project/auth-system\",\n \"type\": \"works_on\",\n \"context\": \"Alice is leading the auth system migration decision\",\n \"confidence\": \"paraphrased\"\n }\n ],\n \"decisions\": [\n {\n \"summary\": \"Migrate authentication from sessions to JWT\",\n \"reasoning\": \"Better for scaling across multiple instances\",\n \"alternatives\": [\"Keep session-based auth\", \"Use OAuth2\"],\n \"entities\": [\"project/auth-system\", \"tool/jwt\"],\n \"date\": \"2024-01-15\",\n \"confidence\": \"direct\",\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:00:00Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"We need to migrate from sessions to JWT for the auth system\"\n }\n },\n {\n \"summary\": \"Use HS256 algorithm for JWT signing\",\n \"entities\": [\"tool/jwt\"],\n \"date\": \"2024-01-15\",\n \"confidence\": \"direct\",\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:02:15Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"Let's use the HS256 algorithm initially.\"\n }\n },\n {\n \"summary\": \"Token expiration: 7-day access tokens, 30-day refresh tokens\",\n \"entities\": [\"tool/jwt\", \"concept/refresh-tokens\"],\n \"date\": \"2024-01-15\",\n \"confidence\": \"direct\",\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:03:45Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"Yes, 7-day access tokens and 30-day refresh tokens.\"\n }\n }\n ],\n \"tasks\": [\n {\n \"title\": \"Implement JWT-based authentication\",\n \"status\": \"open\",\n \"owner\": \"person/bob\",\n \"project\": \"project/auth-system\",\n \"valid_at\": \"2024-01-15T10:01:30Z\",\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:01:30Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"I can start this week.\"\n },\n \"confidence\": \"direct\"\n },\n {\n \"title\": \"Document JWT migration decision in wiki\",\n \"status\": \"open\",\n \"owner\": \"person/bob\",\n \"project\": \"project/auth-system\",\n \"valid_at\": \"2024-01-15T10:04:30Z\",\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:04:30Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"I'll document the decision in the wiki before implementing.\"\n },\n \"confidence\": \"direct\"\n }\n ],\n \"discoveries\": [\n {\n \"summary\": \"Session-based auth doesn't scale well across multiple instances\",\n \"type\": \"insight\",\n \"entities\": [\"project/auth-system\"],\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:01:30Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"Makes sense for scaling.\"\n },\n \"confidence\": \"paraphrased\"\n },\n {\n \"summary\": \"Document architectural decisions before implementation\",\n \"type\": \"procedure\",\n \"entities\": [\"person/bob\"],\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:04:30Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"I'll document the decision in the wiki before implementing.\"\n },\n \"confidence\": \"direct\"\n }\n ],\n \"knowledge\": [\n {\n \"topic\": \"jwt-token-expiration\",\n \"content\": \"Access tokens should be short-lived (minutes to hours) while refresh tokens can be longer-lived (days to weeks) to balance security with user experience\",\n \"source_type\": \"teaching\",\n \"related_entities\": [\"tool/jwt\", \"concept/refresh-tokens\"],\n \"source\": {\n \"platform\": \"slack\",\n \"channel\": \"#engineering\",\n \"timestamp\": \"2024-01-15T10:03:45Z\",\n \"thread_id\": \"thread-auth-migration\",\n \"raw_hash\": \"abc123def456\",\n \"quote\": \"Yes, 7-day access tokens and 30-day refresh tokens.\"\n },\n \"confidence\": \"paraphrased\"\n }\n ],\n \"preferences\": [],\n \"references\": []\n}\n```\n\n## Key Takeaways from This Example\n\n1. **Entity consistency**: Same person/project mentioned multiple times uses the same slug\n2. **Confidence levels**: Most are \"direct\" (explicit), some \"paraphrased\" (clear implication)\n3. **Rich context**: Each signal includes enough context to understand it standalone\n4. **Quotes**: All under 300 chars, capturing the key statement\n5. **Links**: Connect entities with specific relationship types\n6. **Timeline**: Events ordered chronologically with clear summaries\n7. **Decisions**: Capture not just what was decided, but why and what alternatives existed\n8. **Tasks**: Include owner, status, and timing information\n9. **Discoveries**: Extract both insights (learnings) and procedures (how-to)\n10. **Knowledge**: Extract reusable facts that stand alone without the original conversation context\n11. **Preferences and references**: Always include both arrays even when empty — this conversation has no shared links and no explicit standing-preference statements (the wiki-documentation comment is a one-off recommendation, correctly classified as `discovery.type=procedure`, not duplicated as a preference)\n",
|
|
8
8
|
"signal-extract.md": "# Signal Extraction Task\n\nExtract structured signals from the provided conversation block following the schema below.\n\n## Output Schema\n\n```typescript\ninterface ExtractionResult {\n source: SourceRef;\n entities: Entity[];\n timeline: TimelineEntry[];\n links: Link[];\n decisions: Decision[];\n tasks: TaskSignal[];\n discoveries: Discovery[];\n knowledge: Knowledge[];\n preferences: Preference[];\n references: Reference[];\n}\n\ninterface SourceRef {\n platform: string; // e.g., \"slack\", \"claude-code\"\n channel: string; // e.g., \"#general\", \"session-123\"\n timestamp: string; // ISO 8601\n message_id?: string;\n thread_id?: string;\n file_path?: string;\n line_range?: { start: number; end: number };\n attachment_id?: string;\n url?: string;\n raw_hash: string; // generated by system\n quote: string; // ≤ 300 chars, most relevant excerpt\n}\n\ninterface Entity {\n slug: string; // Format: {type}/{kebab-name}\n name: string; // Display name\n type: 'person' | 'project' | 'organization' | 'tool' | 'concept';\n context: string; // Brief description\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n\ninterface TimelineEntry {\n date: string; // ISO 8601 or partial (YYYY-MM, YYYY)\n summary: string; // Event description\n entities: string[]; // Slugs of involved entities\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n\ninterface Link {\n from: string; // Entity slug\n to: string; // Entity slug\n type: 'works_on' | 'works_at' | 'reports_to' | 'collaborates' | 'depends_on' | 'mentions' | 'custom';\n context: string; // Description of relationship\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n source: SourceRef;\n}\n\ninterface Decision {\n summary: string; // What was decided\n reasoning?: string; // Why (if mentioned)\n alternatives?: string[]; // Other options considered\n entities: string[]; // Slugs of entities involved\n date: string; // ISO 8601\n valid_at?: string; // When decision takes effect\n invalid_at?: string; // When decision expires/superseded\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n source: SourceRef;\n}\n\ninterface TaskSignal {\n title: string; // Task description\n status: 'open' | 'in_progress' | 'done' | 'cancelled';\n owner?: string; // Entity slug\n project?: string; // Entity slug\n due_date?: string; // ISO 8601\n valid_at?: string; // When task was created\n invalid_at?: string; // When task was closed\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n\ninterface Discovery {\n summary: string; // Brief insight\n detail?: string; // Extended explanation\n type: 'procedure' | 'pattern' | 'insight' | 'risk';\n entities: string[]; // Slugs of related entities\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\ninterface Knowledge {\n topic: string; // kebab-case topic tag: \"react-hooks\", \"feishu-api\"\n content: string; // Decontextualized knowledge statement\n source_type: 'conversation' | 'document' | 'teaching';\n related_entities: string[]; // Entity slugs (may reference entities not in this block)\n valid_at?: string; // ISO 8601, when knowledge becomes valid\n invalid_at?: string; // ISO 8601, when knowledge expires\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n\ninterface Preference {\n summary: string; // \"Prefers async communication over meetings\"\n detail?: string; // Extended explanation\n category: 'communication' | 'tooling' | 'scheduling' | 'workflow' | 'other';\n entities: string[]; // Slugs, usually a person\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n\ninterface Reference {\n title: string; // Document/resource title\n url: string; // The resource URL — must appear in source text\n summary: string; // ≤100 chars: what the resource is about\n trigger?: string; // When this would be useful to recall later\n entities: string[]; // Slugs of related entities\n source: SourceRef;\n confidence: 'direct' | 'paraphrased' | 'inferred' | 'speculative';\n}\n```\n\n## Extraction Rules\n\n### Entity Slugs\n- Format: `{type}/{kebab-case-name}`\n- Examples: `person/alice-smith`, `project/auth-system`, `tool/github-actions`\n- Be consistent: same entity = same slug across all signals\n- For people: use recognizable name (first name + last initial if ambiguous)\n- For projects/tools: use official name or widely-used abbreviation\n\n### Quotes\n- Maximum 300 characters\n- Select the most informative excerpt\n- Don't fabricate - copy exact text (can trim with \"...\")\n- Should stand alone and convey key context\n\n### Confidence Levels\n- **direct**: Explicitly stated (\"Alice will lead the auth project\")\n- **paraphrased**: Clear implication with different wording (\"Alice is taking charge of authentication\")\n- **inferred**: Reasonable deduction (\"Alice keeps talking about auth, likely leading it\")\n- **speculative**: Uncertain but possible (\"Alice might be involved based on previous mentions\")\n\n### Dates\n- Prefer ISO 8601: `2024-01-15T10:30:00Z`\n- Partial dates OK: `2024-01` (month), `2024` (year)\n- Relative dates: resolve to absolute if possible (\"last Tuesday\" → `2024-01-09`)\n- Uncertain dates: use best estimate with lower confidence\n\n### Empty Results\n- If no signals found, return empty arrays for all categories\n- Still include valid `source` with platform, channel, timestamp, and quote\n\n### Knowledge vs Discovery\n\nKnowledge (知识): Decontextualized, reusable facts or concepts\n ✓ \"React useEffect runs twice in StrictMode during development\"\n ✓ \"Feishu API global rate limit is 50 QPS\"\n ✓ \"TCP three-way handshake prevents stale connection requests\"\n\nDiscovery (发现): Scene-bound, time-bound findings\n ✓ \"Today's integration test found 5s latency on this endpoint\"\n ✓ \"Root cause of this bug is a race condition\"\n ✓ \"Local Docker DNS resolution is broken\"\n\nRules:\n 1. Remove time/scene info — is the statement still valid and valuable? Yes → Knowledge\n 2. Could this be a FAQ or documentation entry as-is? Yes → Knowledge\n 3. If uncertain, prefer Discovery (conservative)\n\n### Knowledge vs Decision\n\nKnowledge: Norms, facts, concepts — objective, verifiable\n ✓ \"Feishu API global rate limit is 50 QPS\"\n ✓ \"Go goroutine initial stack size is 2KB\"\n\nDecision: Team/project choices, commitments — subjective, has an owner\n ✓ \"All services will use OpenTelemetry going forward\"\n ✓ \"We decided to replace MySQL with PostgreSQL\"\n\nRules:\n 1. Has an explicit decision-maker or team commitment? → Decision\n 2. Would this statement hold true for a different team/project? → Knowledge\n 3. If uncertain, look for verbs like \"decided\", \"chose\", \"switched to\" → Decision\n\n### Preference vs Discovery\n\nPreference (偏好): An explicit personal/team statement about how someone likes to work\n ✓ \"I prefer async communication over meetings\"\n ✓ \"We always write tests before implementation\" (framed as standing practice)\n ✓ \"I don't like being pinged after 6pm\"\n\nDiscovery-procedure (发现-流程): A how-to insight observed or recommended in the moment,\nnot framed as someone's standing preference\n ✓ \"Document architectural decisions before implementation\" (a recommendation, not \"I always do X\")\n\nRules:\n 1. Explicitly framed as \"I/we prefer/like/always do X\" with a clear subject? → Preference\n 2. A one-off recommendation or observed practice without standing-preference framing? → Discovery\n 3. If uncertain, prefer Discovery (conservative — Preference requires explicit personal framing)\n\n### Preference category\n\n- `communication`: sync/async style, channels, tone, responsiveness expectations\n- `tooling`: preferred editors, libraries, tools, tool-related workflows\n- `scheduling`: time-of-day habits, meeting patterns, availability\n- `workflow`: process/practice preferences not covered above (review style, docs habits)\n- `other`: doesn't fit the above\n\n### References\n\nA reference is a bookmark **with context** — a shared resource plus enough information\nfor an Agent to know when it would be useful to recall later.\n\nExtract a Reference when:\n ✓ A message shares a URL/doc/named resource AND gives enough context to fill in `summary`\n ✓ \"Check this out: https://example.com/jwt-guide — covers token rotation\" → Reference\n\nDo NOT extract a Reference when:\n ✗ A bare URL with no surrounding context (nothing to put in `summary`/`trigger`)\n ✗ The shared content IS the substance of the conversation — extract that as\n Knowledge/Decision/Discovery instead; References are for bookmarks, not the discussion itself\n\nReference field rules:\n - `url`: must appear verbatim in the source text — never fabricate or guess a URL\n - `summary`: ≤100 chars, what the resource covers\n - `trigger`: when recalling this would help (e.g., \"当排查 JWT 过期问题时\")\n\n### Knowledge source_type\n\n- `conversation`: Extracted from group/private chat messages\n- `document`: Extracted from cloud document content\n- `teaching`: Someone actively explaining/teaching (systematic explanation of principles, steps, processes)\n\n### Knowledge topic\n\n- Output kebab-case ASCII when possible: \"react-hooks\", \"feishu-api\"\n- For Chinese topics, translate to English: \"飞书API\" → \"feishu-api\"\n- The system normalizes non-conforming topics automatically\n\n### Knowledge confidence\n\n- Knowledge should rarely be `speculative`. The system may skip speculative Knowledge entries.\n- Prefer `direct` or `paraphrased` for factual statements.\n\n### Language Policy\n\n- Structural fields (slug, topic, type, status) → English ASCII, kebab-case\n- Natural language fields (name, summary, content, context, detail,\n reasoning, quote) → **SAME LANGUAGE as the source material**\n- If the conversation is in Chinese, write summaries in Chinese\n- If the conversation mixes languages, use the dominant language\n- quote field MUST be verbatim from the original text, never translated\n- slug for Chinese person names: use pinyin\n (e.g., \"李应龙\" → \"person/li-yinglong\")\n\n## Example\n\nSee `examples/agent-session.md` for a complete example with diverse signal types.\n\n## Your Task\n\nProcess the conversation block provided below and output ONLY valid JSON matching ExtractionResult schema.\n",
|
|
9
9
|
"significance.md": "You are evaluating whether a conversation block contains information worth extracting and preserving as personal memory.\n\n## Conversation Block\n\n{CONVERSATION_BLOCK}\n\n## Evaluation Criteria\n\nA conversation is **worth processing** if it contains ANY of:\n- Decisions made (technical, business, personal)\n- Action items or task assignments\n- Important knowledge shared (architecture, processes, domain expertise)\n- Relationship or organizational context\n- Plans, deadlines, or commitments\n- Problems identified and solutions discussed\n- Opinions or preferences that reveal character or values\n\nA conversation is **NOT worth processing** if it is purely:\n- Social pleasantries with no substance (\"好的\", \"收到\", \"谢谢\")\n- Forwarded content with no discussion\n- Automated notifications restated by a person\n- Logistics with no decision component (\"几点开会?\" → \"3点\")\n\n## Response Format\n\nRespond with a JSON object:\n```json\n{\n \"worth_processing\": true/false,\n \"confidence\": 0.0-1.0,\n \"reason\": \"brief explanation\",\n \"topics\": [\"topic1\", \"topic2\"]\n}\n```\n",
|
|
10
|
-
"system.md": "# System Prompt: Signal Extraction\n\nYou are a signal extraction system designed to identify and structure meaningful information from conversations and text. Always respond with valid JSON.\n\n## Your Role\n\nExtract structured signals from conversation blocks, including:\n- **Entities**: People, projects, organizations, tools, concepts\n- **Timeline entries**: Events, milestones, decisions with dates\n- **Links**: Relationships between entities\n- **Decisions**: Choices made with reasoning\n- **Tasks**: Action items and their status\n- **Discoveries**: Insights, patterns, procedures, preferences\n- **Knowledge**: Decontextualized, reusable facts or concepts that stand on their own without needing the original context\n\n## Core Principles\n\n1. **Accuracy over completeness**: Only extract what you can confidently identify\n2. **Context preservation**: Include sufficient context to understand the signal standalone\n3. **Confidence levels**: Mark confidence appropriately (direct/paraphrased/inferred/speculative)\n4. **Quote discipline**: Keep quotes under 300 characters, select the most relevant excerpt\n5. **Slug format**: Use `{type}/{kebab-case-name}` (e.g., `person/alice-smith`, `project/auth-system`)\n\n## Confidence Levels\n\n- **direct**: Explicitly stated in the text (\"Alice will work on the auth system\")\n- **paraphrased**: Clearly implied, just different words (\"Alice is taking the auth project\")\n- **inferred**: Reasonable deduction from context (\"Alice mentioned auth again, likely working on it\")\n- **speculative**: Possible but uncertain (\"Alice might be involved in auth based on previous context\")\n\n## Output Format\n\nAlways output valid JSON matching the ExtractionResultSchema. Include all required fields.\nEmpty arrays are valid (no signals found is acceptable).\n\n## Quality Standards\n\n- Entities must have clear, searchable slugs\n- Timeline entries must have valid ISO 8601 dates or partial dates (YYYY-MM, YYYY)\n- Links must connect existing entity slugs\n- Decisions must capture reasoning, not just conclusions\n- Tasks must have realistic status (open/in_progress/done/cancelled)\n- Discoveries must be actionable insights, not obvious facts\n\nYou will be provided with conversation context and expected to return structured JSON.\n"
|
|
10
|
+
"system.md": "# System Prompt: Signal Extraction\n\nYou are a signal extraction system designed to identify and structure meaningful information from conversations and text. Always respond with valid JSON.\n\n## Your Role\n\nExtract structured signals from conversation blocks, including:\n- **Entities**: People, projects, organizations, tools, concepts\n- **Timeline entries**: Events, milestones, decisions with dates\n- **Links**: Relationships between entities\n- **Decisions**: Choices made with reasoning\n- **Tasks**: Action items and their status\n- **Discoveries**: Insights, patterns, procedures, preferences\n- **Knowledge**: Decontextualized, reusable facts or concepts that stand on their own without needing the original context\n\n## Core Principles\n\n1. **Accuracy over completeness**: Only extract what you can confidently identify\n2. **Context preservation**: Include sufficient context to understand the signal standalone\n3. **Confidence levels**: Mark confidence appropriately (direct/paraphrased/inferred/speculative)\n4. **Quote discipline**: Keep quotes under 300 characters, select the most relevant excerpt\n5. **Slug format**: Use `{type}/{kebab-case-name}` (e.g., `person/alice-smith`, `project/auth-system`)\n6. **Language matching**: Always generate titles, details, reasoning, and context\n in the same language as the source conversation. If the conversation is in Chinese,\n output Chinese. If in English, output English. Never translate the source language\n — preserve it. Slugs remain in English kebab-case regardless of language.\n\n## Confidence Levels\n\n- **direct**: Explicitly stated in the text (\"Alice will work on the auth system\")\n- **paraphrased**: Clearly implied, just different words (\"Alice is taking the auth project\")\n- **inferred**: Reasonable deduction from context (\"Alice mentioned auth again, likely working on it\")\n- **speculative**: Possible but uncertain (\"Alice might be involved in auth based on previous context\")\n\n## Output Format\n\nAlways output valid JSON matching the ExtractionResultSchema. Include all required fields.\nEmpty arrays are valid (no signals found is acceptable).\n\n## Quality Standards\n\n- Entities must have clear, searchable slugs\n- Timeline entries must have valid ISO 8601 dates or partial dates (YYYY-MM, YYYY)\n- Links must connect existing entity slugs\n- Decisions must capture reasoning, not just conclusions\n- Tasks must have realistic status (open/in_progress/done/cancelled)\n- Discoveries must be actionable insights, not obvious facts\n\nYou will be provided with conversation context and expected to return structured JSON.\n"
|
|
11
11
|
};
|
|
12
12
|
//# sourceMappingURL=embedded-assets.generated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedded-assets.generated.js","sourceRoot":"","sources":["../src/embedded-assets.generated.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gEAAgE;AAChE,wCAAwC;AAExC,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAW,
|
|
1
|
+
{"version":3,"file":"embedded-assets.generated.js","sourceRoot":"","sources":["../src/embedded-assets.generated.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gEAAgE;AAChE,wCAAwC;AAExC,MAAM,CAAC,MAAM,OAAO,GAAW,OAAO,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAW,o8JAAo8J,CAAC;AAEv+J,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,2BAA2B,EAAE,ipTAAipT;IAC9qT,mBAAmB,EAAE,2sVAA2sV;IAChuV,iBAAiB,EAAE,8kCAA8kC;IACjmC,WAAW,EAAE,+kFAA+kF;CAC7lF,CAAC"}
|