pi-obsidian-memory 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +237 -7
- package/package.json +41 -11
- package/skills/obsidian-memory/SKILL.md +101 -0
- package/src/domain/capture/constants.ts +5 -0
- package/src/domain/capture/index.ts +6 -0
- package/src/domain/capture/input-problems.ts +9 -0
- package/src/domain/capture/schemas.ts +92 -0
- package/src/domain/capture/tally.ts +26 -0
- package/src/domain/capture/types.ts +49 -0
- package/src/domain/capture/validate.ts +75 -0
- package/src/domain/command-flags/constants.ts +141 -0
- package/src/domain/command-flags/index.ts +1 -0
- package/src/domain/config/change.ts +105 -0
- package/src/domain/config/constants.ts +25 -0
- package/src/domain/config/diagnostics.ts +35 -0
- package/src/domain/config/disclosures.ts +8 -0
- package/src/domain/config/fields.ts +7 -0
- package/src/domain/config/index.ts +11 -0
- package/src/domain/config/inspection.ts +43 -0
- package/src/domain/config/invariants.ts +68 -0
- package/src/domain/config/legacy-capture.ts +17 -0
- package/src/domain/config/observations.ts +109 -0
- package/src/domain/config/parse.ts +25 -0
- package/src/domain/config/paths.ts +61 -0
- package/src/domain/config/registration.ts +34 -0
- package/src/domain/config/repair.ts +36 -0
- package/src/domain/config/resources.ts +65 -0
- package/src/domain/config/rules.ts +49 -0
- package/src/domain/config/schemas.ts +155 -0
- package/src/domain/config/settings.ts +23 -0
- package/src/domain/config/types.ts +239 -0
- package/src/domain/decision-model/constants.ts +7 -0
- package/src/domain/decision-model/cutoffs.ts +8 -0
- package/src/domain/decision-model/endpoint.ts +11 -0
- package/src/domain/decision-model/failure-detail.ts +8 -0
- package/src/domain/decision-model/index.ts +6 -0
- package/src/domain/decision-model/rank.ts +36 -0
- package/src/domain/decision-model/types.ts +77 -0
- package/src/domain/embeddings/constants.ts +55 -0
- package/src/domain/embeddings/identity.ts +30 -0
- package/src/domain/embeddings/index.ts +5 -0
- package/src/domain/embeddings/schemas.ts +25 -0
- package/src/domain/embeddings/types.ts +52 -0
- package/src/domain/embeddings/vectors.ts +53 -0
- package/src/domain/folder-index/constants.ts +9 -0
- package/src/domain/folder-index/display.ts +22 -0
- package/src/domain/folder-index/index.ts +5 -0
- package/src/domain/folder-index/listing.ts +58 -0
- package/src/domain/folder-index/render.ts +114 -0
- package/src/domain/folder-index/types.ts +41 -0
- package/src/domain/index.ts +22 -0
- package/src/domain/lifecycle/index.ts +2 -0
- package/src/domain/lifecycle/lifecycle.ts +39 -0
- package/src/domain/lifecycle/types.ts +17 -0
- package/src/domain/loaded-memory/budget.ts +14 -0
- package/src/domain/loaded-memory/constants.ts +9 -0
- package/src/domain/loaded-memory/index.ts +4 -0
- package/src/domain/loaded-memory/render.ts +30 -0
- package/src/domain/loaded-memory/types.ts +19 -0
- package/src/domain/memory/draft.ts +12 -0
- package/src/domain/memory/index.ts +4 -0
- package/src/domain/memory/schemas.ts +15 -0
- package/src/domain/memory/target.ts +27 -0
- package/src/domain/memory/types.ts +20 -0
- package/src/domain/memory-agent/index.ts +5 -0
- package/src/domain/memory-agent/input-problems.ts +9 -0
- package/src/domain/memory-agent/refusal.ts +6 -0
- package/src/domain/memory-agent/schemas.ts +112 -0
- package/src/domain/memory-agent/types.ts +25 -0
- package/src/domain/memory-agent/validate.ts +67 -0
- package/src/domain/names/constants.ts +32 -0
- package/src/domain/names/index.ts +2 -0
- package/src/domain/names/names.ts +83 -0
- package/src/domain/note/check.ts +68 -0
- package/src/domain/note/constants.ts +15 -0
- package/src/domain/note/frontmatter-fields.ts +175 -0
- package/src/domain/note/frontmatter.ts +138 -0
- package/src/domain/note/index.ts +9 -0
- package/src/domain/note/parse.ts +41 -0
- package/src/domain/note/render.ts +27 -0
- package/src/domain/note/schema-errors.ts +41 -0
- package/src/domain/note/schemas.ts +38 -0
- package/src/domain/note/types.ts +53 -0
- package/src/domain/note/validate.ts +19 -0
- package/src/domain/path-platform/index.ts +2 -0
- package/src/domain/path-platform/path-module.ts +11 -0
- package/src/domain/path-platform/types.ts +1 -0
- package/src/domain/search-catalog/constants.ts +1 -0
- package/src/domain/search-catalog/coverage.ts +35 -0
- package/src/domain/search-catalog/dont-forget.ts +10 -0
- package/src/domain/search-catalog/fingerprint.ts +9 -0
- package/src/domain/search-catalog/index.ts +10 -0
- package/src/domain/search-catalog/inspection.ts +47 -0
- package/src/domain/search-catalog/plan.ts +68 -0
- package/src/domain/search-catalog/ranking.ts +27 -0
- package/src/domain/search-catalog/schemas.ts +49 -0
- package/src/domain/search-catalog/types.ts +103 -0
- package/src/domain/search-catalog/vector-refresh.ts +22 -0
- package/src/domain/shell-edit/command-segments.ts +28 -0
- package/src/domain/shell-edit/command-words.ts +22 -0
- package/src/domain/shell-edit/constants.ts +125 -0
- package/src/domain/shell-edit/executed-files.ts +154 -0
- package/src/domain/shell-edit/index.ts +6 -0
- package/src/domain/shell-edit/powershell-files.ts +38 -0
- package/src/domain/shell-edit/rules.ts +19 -0
- package/src/domain/shell-edit/types.ts +75 -0
- package/src/domain/tool-flags/constants.ts +178 -0
- package/src/domain/tool-flags/index.ts +2 -0
- package/src/domain/tool-flags/types.ts +7 -0
- package/src/domain/validation/constants.ts +1 -0
- package/src/domain/validation/describe.ts +137 -0
- package/src/domain/validation/index.ts +3 -0
- package/src/domain/validation/types.ts +3 -0
- package/src/domain/vault-access/absolute-candidate.ts +81 -0
- package/src/domain/vault-access/argument-tokens.ts +22 -0
- package/src/domain/vault-access/command-mentions-vault.ts +115 -0
- package/src/domain/vault-access/constants.ts +54 -0
- package/src/domain/vault-access/index.ts +7 -0
- package/src/domain/vault-access/types.ts +18 -0
- package/src/domain/vault-access/vault-access-refusal.ts +36 -0
- package/src/domain/vault-access/vault-location.ts +22 -0
- package/src/domain/vault-assets/index.ts +2 -0
- package/src/domain/vault-assets/render.ts +51 -0
- package/src/domain/vault-assets/types.ts +36 -0
- package/src/domain/vault-catalog/analyze.ts +37 -0
- package/src/domain/vault-catalog/classify.ts +37 -0
- package/src/domain/vault-catalog/dont-forget.ts +6 -0
- package/src/domain/vault-catalog/export-entries.ts +10 -0
- package/src/domain/vault-catalog/index.ts +5 -0
- package/src/domain/vault-catalog/types.ts +114 -0
- package/src/domain/vault-diagnosis/diagnose.ts +79 -0
- package/src/domain/vault-diagnosis/index.ts +2 -0
- package/src/domain/vault-diagnosis/types.ts +31 -0
- package/src/domain/vault-path/constants.ts +13 -0
- package/src/domain/vault-path/index.ts +2 -0
- package/src/domain/vault-path/vault-path.ts +65 -0
- package/src/pi/capture/cadence.ts +49 -0
- package/src/pi/capture/completion.ts +26 -0
- package/src/pi/capture/constants.ts +5 -0
- package/src/pi/capture/handlers.ts +30 -0
- package/src/pi/capture/index.ts +8 -0
- package/src/pi/capture/runtime.ts +83 -0
- package/src/pi/capture/schemas.ts +8 -0
- package/src/pi/capture/tool-calls.ts +6 -0
- package/src/pi/capture/transcript.ts +55 -0
- package/src/pi/capture/types.ts +46 -0
- package/src/pi/change-report/constants.ts +15 -0
- package/src/pi/change-report/index.ts +3 -0
- package/src/pi/change-report/report.ts +54 -0
- package/src/pi/change-report/types.ts +8 -0
- package/src/pi/context/constants.ts +5 -0
- package/src/pi/context/index.ts +3 -0
- package/src/pi/context/status.ts +15 -0
- package/src/pi/context/types.ts +98 -0
- package/src/pi/extension.ts +100 -0
- package/src/pi/index.ts +26 -0
- package/src/pi/memory-add/constants.ts +13 -0
- package/src/pi/memory-add/index.ts +5 -0
- package/src/pi/memory-add/memory-add.ts +31 -0
- package/src/pi/memory-add/respond.ts +55 -0
- package/src/pi/memory-add/schemas.ts +29 -0
- package/src/pi/memory-add/types.ts +15 -0
- package/src/pi/memory-archive/constants.ts +8 -0
- package/src/pi/memory-archive/index.ts +4 -0
- package/src/pi/memory-archive/memory-archive.ts +29 -0
- package/src/pi/memory-archive/schemas.ts +15 -0
- package/src/pi/memory-archive/types.ts +8 -0
- package/src/pi/memory-block/block.ts +75 -0
- package/src/pi/memory-block/constants.ts +24 -0
- package/src/pi/memory-block/index.ts +4 -0
- package/src/pi/memory-block/render.ts +54 -0
- package/src/pi/memory-block/types.ts +24 -0
- package/src/pi/memory-doctor/constants.ts +43 -0
- package/src/pi/memory-doctor/index.ts +4 -0
- package/src/pi/memory-doctor/memory-doctor.ts +135 -0
- package/src/pi/memory-doctor/report.ts +101 -0
- package/src/pi/memory-doctor/types.ts +13 -0
- package/src/pi/memory-export/constants.ts +15 -0
- package/src/pi/memory-export/index.ts +4 -0
- package/src/pi/memory-export/memory-export.ts +57 -0
- package/src/pi/memory-export/name.ts +9 -0
- package/src/pi/memory-export/types.ts +4 -0
- package/src/pi/memory-get/constants.ts +12 -0
- package/src/pi/memory-get/index.ts +5 -0
- package/src/pi/memory-get/memory-get.ts +23 -0
- package/src/pi/memory-get/respond.ts +38 -0
- package/src/pi/memory-get/schemas.ts +13 -0
- package/src/pi/memory-get/types.ts +10 -0
- package/src/pi/memory-init/constants.ts +17 -0
- package/src/pi/memory-init/index.ts +2 -0
- package/src/pi/memory-init/memory-init.ts +63 -0
- package/src/pi/memory-search/constants.ts +16 -0
- package/src/pi/memory-search/index.ts +5 -0
- package/src/pi/memory-search/memory-search.ts +22 -0
- package/src/pi/memory-search/respond.ts +62 -0
- package/src/pi/memory-search/schemas.ts +11 -0
- package/src/pi/memory-search/types.ts +10 -0
- package/src/pi/memory-session/constants.ts +7 -0
- package/src/pi/memory-session/index.ts +4 -0
- package/src/pi/memory-session/keeper.ts +101 -0
- package/src/pi/memory-session/respond.ts +6 -0
- package/src/pi/memory-session/types.ts +23 -0
- package/src/pi/memory-settings/constants.ts +69 -0
- package/src/pi/memory-settings/edits.ts +46 -0
- package/src/pi/memory-settings/index.ts +9 -0
- package/src/pi/memory-settings/lines.ts +119 -0
- package/src/pi/memory-settings/models.ts +81 -0
- package/src/pi/memory-settings/projects.ts +46 -0
- package/src/pi/memory-settings/providers.ts +77 -0
- package/src/pi/memory-settings/save.ts +16 -0
- package/src/pi/memory-settings/screen.ts +27 -0
- package/src/pi/memory-settings/types.ts +87 -0
- package/src/pi/memory-setup/constants.ts +33 -0
- package/src/pi/memory-setup/disclosure.ts +22 -0
- package/src/pi/memory-setup/index.ts +4 -0
- package/src/pi/memory-setup/memory-setup.ts +153 -0
- package/src/pi/memory-setup/types.ts +6 -0
- package/src/pi/memory-succeed/constants.ts +10 -0
- package/src/pi/memory-succeed/index.ts +4 -0
- package/src/pi/memory-succeed/memory-succeed.ts +34 -0
- package/src/pi/memory-succeed/schemas.ts +30 -0
- package/src/pi/memory-succeed/types.ts +8 -0
- package/src/pi/memory-update/constants.ts +8 -0
- package/src/pi/memory-update/index.ts +4 -0
- package/src/pi/memory-update/memory-update.ts +29 -0
- package/src/pi/memory-update/schemas.ts +24 -0
- package/src/pi/memory-update/types.ts +8 -0
- package/src/pi/paths/constants.ts +7 -0
- package/src/pi/paths/index.ts +2 -0
- package/src/pi/paths/paths.ts +15 -0
- package/src/pi/paths/platform.ts +7 -0
- package/src/pi/registrar.ts +25 -0
- package/src/pi/registration-report/constants.ts +13 -0
- package/src/pi/registration-report/index.ts +2 -0
- package/src/pi/registration-report/report.ts +26 -0
- package/src/pi/relevant-memory/constants.ts +3 -0
- package/src/pi/relevant-memory/index.ts +4 -0
- package/src/pi/relevant-memory/prompt.ts +23 -0
- package/src/pi/relevant-memory/runtime.ts +88 -0
- package/src/pi/relevant-memory/types.ts +14 -0
- package/src/pi/semantic/constants.ts +3 -0
- package/src/pi/semantic/index.ts +2 -0
- package/src/pi/semantic/runtime.ts +59 -0
- package/src/pi/session-start/constants.ts +7 -0
- package/src/pi/session-start/index.ts +3 -0
- package/src/pi/session-start/session-start.ts +48 -0
- package/src/pi/session-start/types.ts +5 -0
- package/src/pi/shell-edit-guard/guard.ts +41 -0
- package/src/pi/shell-edit-guard/index.ts +3 -0
- package/src/pi/shell-edit-guard/prompt.ts +30 -0
- package/src/pi/shell-edit-guard/types.ts +13 -0
- package/src/pi/types.ts +44 -0
- package/src/pi/vault-guard/constants.ts +1 -0
- package/src/pi/vault-guard/index.ts +4 -0
- package/src/pi/vault-guard/request.ts +39 -0
- package/src/pi/vault-guard/types.ts +5 -0
- package/src/pi/vault-guard/vault-guard.ts +21 -0
- package/src/services/capture-cadence/domain-rules.ts +8 -0
- package/src/services/capture-cadence/index.ts +1 -0
- package/src/services/clock/clock.ts +7 -0
- package/src/services/clock/index.ts +1 -0
- package/src/services/config/canonicalize.ts +163 -0
- package/src/services/config/constants.ts +1 -0
- package/src/services/config/fully-qualified-path.ts +14 -0
- package/src/services/config/index.ts +12 -0
- package/src/services/config/path-identity.ts +65 -0
- package/src/services/config/publication.ts +75 -0
- package/src/services/config/read.ts +47 -0
- package/src/services/config/registration.ts +26 -0
- package/src/services/config/resolve-input.ts +27 -0
- package/src/services/config/snapshot.ts +26 -0
- package/src/services/config/target.ts +2 -0
- package/src/services/config/types.ts +97 -0
- package/src/services/config/vault-access.ts +2 -0
- package/src/services/config/volume-namespace.ts +5 -0
- package/src/services/config/write.ts +63 -0
- package/src/services/decision-model/constants.ts +16 -0
- package/src/services/decision-model/decide.ts +42 -0
- package/src/services/decision-model/diagnostics.ts +6 -0
- package/src/services/decision-model/endpoint.ts +1 -0
- package/src/services/decision-model/failure-detail.ts +1 -0
- package/src/services/decision-model/index.ts +7 -0
- package/src/services/decision-model/interruption.ts +29 -0
- package/src/services/decision-model/jev.ts +61 -0
- package/src/services/decision-model/laya-batch.ts +64 -0
- package/src/services/decision-model/laya-http-failure.ts +41 -0
- package/src/services/decision-model/laya-response.ts +95 -0
- package/src/services/decision-model/laya.ts +35 -0
- package/src/services/decision-model/preflight.ts +24 -0
- package/src/services/decision-model/prompts.ts +36 -0
- package/src/services/decision-model/schemas.ts +43 -0
- package/src/services/decision-model/score-candidates.ts +41 -0
- package/src/services/decision-model/types.ts +182 -0
- package/src/services/embeddings/asset-download.ts +45 -0
- package/src/services/embeddings/asset-fetch.ts +39 -0
- package/src/services/embeddings/asset-inspection.ts +36 -0
- package/src/services/embeddings/batch.ts +32 -0
- package/src/services/embeddings/chunks.ts +80 -0
- package/src/services/embeddings/configuration.ts +8 -0
- package/src/services/embeddings/constants.ts +24 -0
- package/src/services/embeddings/errors.ts +11 -0
- package/src/services/embeddings/google.ts +90 -0
- package/src/services/embeddings/http.ts +64 -0
- package/src/services/embeddings/index.ts +17 -0
- package/src/services/embeddings/inference.ts +35 -0
- package/src/services/embeddings/local.ts +138 -0
- package/src/services/embeddings/model-asset.ts +68 -0
- package/src/services/embeddings/model-cache.ts +30 -0
- package/src/services/embeddings/openai.ts +64 -0
- package/src/services/embeddings/operation.ts +31 -0
- package/src/services/embeddings/responses.ts +41 -0
- package/src/services/embeddings/runtime.ts +13 -0
- package/src/services/embeddings/schemas.ts +53 -0
- package/src/services/embeddings/types.ts +116 -0
- package/src/services/id/id.ts +5 -0
- package/src/services/id/index.ts +1 -0
- package/src/services/index.ts +11 -0
- package/src/services/llm/capture.ts +19 -0
- package/src/services/llm/check-chat-models.ts +38 -0
- package/src/services/llm/complete.ts +57 -0
- package/src/services/llm/constants.ts +32 -0
- package/src/services/llm/domain-rules.ts +2 -0
- package/src/services/llm/index.ts +6 -0
- package/src/services/llm/lifetime.ts +16 -0
- package/src/services/llm/retrieve.ts +19 -0
- package/src/services/llm/schemas.ts +9 -0
- package/src/services/llm/types.ts +94 -0
- package/src/services/search-index/catalog-query.ts +34 -0
- package/src/services/search-index/catalog-statements.ts +33 -0
- package/src/services/search-index/catalog.ts +19 -0
- package/src/services/search-index/cleanup.ts +13 -0
- package/src/services/search-index/close.ts +5 -0
- package/src/services/search-index/constants.ts +102 -0
- package/src/services/search-index/dont-forget.ts +1 -0
- package/src/services/search-index/fingerprint.ts +17 -0
- package/src/services/search-index/folder-index-statements.ts +17 -0
- package/src/services/search-index/folder-index-storage.ts +54 -0
- package/src/services/search-index/folder-indexes.ts +13 -0
- package/src/services/search-index/index.ts +14 -0
- package/src/services/search-index/inspection.ts +1 -0
- package/src/services/search-index/inventory.ts +67 -0
- package/src/services/search-index/legacy.ts +64 -0
- package/src/services/search-index/location.ts +12 -0
- package/src/services/search-index/open.ts +46 -0
- package/src/services/search-index/query.ts +39 -0
- package/src/services/search-index/ranking.ts +12 -0
- package/src/services/search-index/reconcile.ts +93 -0
- package/src/services/search-index/recovery.ts +56 -0
- package/src/services/search-index/refusals.ts +21 -0
- package/src/services/search-index/schema.ts +42 -0
- package/src/services/search-index/schemas.ts +181 -0
- package/src/services/search-index/search.ts +5 -0
- package/src/services/search-index/statements.ts +18 -0
- package/src/services/search-index/storage.ts +207 -0
- package/src/services/search-index/types.ts +113 -0
- package/src/services/search-index/vector-statements.ts +18 -0
- package/src/services/search-index/vector-storage.ts +169 -0
- package/src/services/search-index/vectors.ts +18 -0
- package/src/services/search-index/write.ts +9 -0
- package/src/services/shell-edit/ask.ts +53 -0
- package/src/services/shell-edit/domain-rules.ts +2 -0
- package/src/services/shell-edit/index.ts +4 -0
- package/src/services/shell-edit/schemas.ts +23 -0
- package/src/services/shell-edit/types.ts +61 -0
- package/src/services/shell-scripts/constants.ts +1 -0
- package/src/services/shell-scripts/files.ts +16 -0
- package/src/services/shell-scripts/index.ts +5 -0
- package/src/services/shell-scripts/package-scripts.ts +74 -0
- package/src/services/shell-scripts/schemas.ts +3 -0
- package/src/services/shell-scripts/scripts.ts +27 -0
- package/src/services/shell-scripts/types.ts +11 -0
- package/src/services/vault/archive.ts +31 -0
- package/src/services/vault/bootstrap/ensure.ts +50 -0
- package/src/services/vault/bootstrap/index.ts +2 -0
- package/src/services/vault/bootstrap/paths.ts +57 -0
- package/src/services/vault/bootstrap/types.ts +17 -0
- package/src/services/vault/bootstrap/write.ts +47 -0
- package/src/services/vault/catalog/bytes.ts +51 -0
- package/src/services/vault/catalog/dont-forget.ts +1 -0
- package/src/services/vault/catalog/enumerate.ts +69 -0
- package/src/services/vault/catalog/export.ts +21 -0
- package/src/services/vault/catalog/failures.ts +16 -0
- package/src/services/vault/catalog/index.ts +10 -0
- package/src/services/vault/catalog/inspect.ts +41 -0
- package/src/services/vault/catalog/observe.ts +35 -0
- package/src/services/vault/catalog/resolve.ts +94 -0
- package/src/services/vault/catalog/stat.ts +23 -0
- package/src/services/vault/catalog/types.ts +69 -0
- package/src/services/vault/catalog/visit.ts +58 -0
- package/src/services/vault/complete-blank.ts +66 -0
- package/src/services/vault/constants.ts +3 -0
- package/src/services/vault/context/index.ts +1 -0
- package/src/services/vault/context/types.ts +10 -0
- package/src/services/vault/create.ts +19 -0
- package/src/services/vault/display.ts +6 -0
- package/src/services/vault/domain-rules.ts +10 -0
- package/src/services/vault/draft.ts +2 -0
- package/src/services/vault/filesystem/failures.ts +53 -0
- package/src/services/vault/filesystem/hash.ts +5 -0
- package/src/services/vault/filesystem/index.ts +5 -0
- package/src/services/vault/filesystem/read.ts +61 -0
- package/src/services/vault/filesystem/types.ts +36 -0
- package/src/services/vault/filesystem/write.ts +80 -0
- package/src/services/vault/find.ts +27 -0
- package/src/services/vault/folder-contents.ts +31 -0
- package/src/services/vault/folder-index/index.ts +2 -0
- package/src/services/vault/folder-index/read.ts +87 -0
- package/src/services/vault/folder-index/types.ts +19 -0
- package/src/services/vault/folder-listing.ts +1 -0
- package/src/services/vault/index.ts +21 -0
- package/src/services/vault/inspect-folder.ts +13 -0
- package/src/services/vault/list.ts +121 -0
- package/src/services/vault/memory-folder.ts +24 -0
- package/src/services/vault/paths.ts +11 -0
- package/src/services/vault/publish.ts +52 -0
- package/src/services/vault/read.ts +46 -0
- package/src/services/vault/refresh-folders.ts +197 -0
- package/src/services/vault/refresh-plan.ts +79 -0
- package/src/services/vault/refresh.ts +8 -0
- package/src/services/vault/refusals.ts +23 -0
- package/src/services/vault/relocate.ts +131 -0
- package/src/services/vault/relocation-checks.ts +89 -0
- package/src/services/vault/resolve-stored-file.ts +43 -0
- package/src/services/vault/resolve.ts +109 -0
- package/src/services/vault/succeed.ts +45 -0
- package/src/services/vault/types.ts +199 -0
- package/src/services/vault/update-file.ts +58 -0
- package/src/services/vault/update.ts +22 -0
- package/src/services/vault/write-new-file.ts +37 -0
- package/src/shared/index.ts +1 -0
- package/src/shared/result/index.ts +1 -0
- package/src/shared/result/types.ts +17 -0
- package/src/usecases/add-memory/add-memory.ts +83 -0
- package/src/usecases/add-memory/index.ts +4 -0
- package/src/usecases/add-memory/maintenance.ts +23 -0
- package/src/usecases/add-memory/schemas.ts +12 -0
- package/src/usecases/add-memory/types.ts +47 -0
- package/src/usecases/archive-memory/archive-memory.ts +27 -0
- package/src/usecases/archive-memory/index.ts +3 -0
- package/src/usecases/archive-memory/schemas.ts +11 -0
- package/src/usecases/archive-memory/types.ts +17 -0
- package/src/usecases/capture-memory/apply.ts +73 -0
- package/src/usecases/capture-memory/capture-memory.ts +117 -0
- package/src/usecases/capture-memory/constants.ts +15 -0
- package/src/usecases/capture-memory/index.ts +5 -0
- package/src/usecases/capture-memory/observe.ts +122 -0
- package/src/usecases/capture-memory/settings.ts +20 -0
- package/src/usecases/capture-memory/types.ts +103 -0
- package/src/usecases/check-shell-edit/check-shell-edit.ts +28 -0
- package/src/usecases/check-shell-edit/index.ts +2 -0
- package/src/usecases/check-shell-edit/types.ts +30 -0
- package/src/usecases/check-vault-access/check-vault-access.ts +23 -0
- package/src/usecases/check-vault-access/constants.ts +7 -0
- package/src/usecases/check-vault-access/index.ts +4 -0
- package/src/usecases/check-vault-access/raw-device.ts +10 -0
- package/src/usecases/check-vault-access/targets.ts +49 -0
- package/src/usecases/check-vault-access/types.ts +33 -0
- package/src/usecases/complete-blank-memory/complete-blank-memory.ts +48 -0
- package/src/usecases/complete-blank-memory/constants.ts +3 -0
- package/src/usecases/complete-blank-memory/index.ts +4 -0
- package/src/usecases/complete-blank-memory/schemas.ts +14 -0
- package/src/usecases/complete-blank-memory/types.ts +28 -0
- package/src/usecases/diagnose-memory/constants.ts +3 -0
- package/src/usecases/diagnose-memory/decision.ts +36 -0
- package/src/usecases/diagnose-memory/diagnose-memory.ts +52 -0
- package/src/usecases/diagnose-memory/embeddings.ts +39 -0
- package/src/usecases/diagnose-memory/index.ts +5 -0
- package/src/usecases/diagnose-memory/types.ts +86 -0
- package/src/usecases/diagnose-memory/vault.ts +33 -0
- package/src/usecases/export-memory/collect.ts +20 -0
- package/src/usecases/export-memory/constants.ts +3 -0
- package/src/usecases/export-memory/export-memory.ts +84 -0
- package/src/usecases/export-memory/index.ts +3 -0
- package/src/usecases/export-memory/types.ts +28 -0
- package/src/usecases/get-memory/get-memory.ts +97 -0
- package/src/usecases/get-memory/index.ts +2 -0
- package/src/usecases/get-memory/types.ts +25 -0
- package/src/usecases/index.ts +25 -0
- package/src/usecases/list-memory/index.ts +2 -0
- package/src/usecases/list-memory/leased/index.ts +2 -0
- package/src/usecases/list-memory/leased/read.ts +16 -0
- package/src/usecases/list-memory/leased/types.ts +21 -0
- package/src/usecases/list-memory/list-memory.ts +33 -0
- package/src/usecases/list-memory/types.ts +8 -0
- package/src/usecases/load-dont-forget/index.ts +2 -0
- package/src/usecases/load-dont-forget/load-dont-forget.ts +111 -0
- package/src/usecases/load-dont-forget/types.ts +26 -0
- package/src/usecases/memory-change/change.ts +42 -0
- package/src/usecases/memory-change/index.ts +5 -0
- package/src/usecases/memory-change/maintenance.ts +11 -0
- package/src/usecases/memory-change/partial.ts +18 -0
- package/src/usecases/memory-change/receipt.ts +40 -0
- package/src/usecases/memory-change/types.ts +44 -0
- package/src/usecases/operation-context/context.ts +37 -0
- package/src/usecases/operation-context/index.ts +2 -0
- package/src/usecases/operation-context/types.ts +19 -0
- package/src/usecases/registration/check.ts +6 -0
- package/src/usecases/registration/entry.ts +33 -0
- package/src/usecases/registration/index.ts +8 -0
- package/src/usecases/registration/init.ts +94 -0
- package/src/usecases/registration/prepare-init.ts +43 -0
- package/src/usecases/registration/prepare.ts +35 -0
- package/src/usecases/registration/propose.ts +34 -0
- package/src/usecases/registration/publication.ts +90 -0
- package/src/usecases/registration/setup.ts +41 -0
- package/src/usecases/registration/types.ts +107 -0
- package/src/usecases/relevant-memory/agent.ts +55 -0
- package/src/usecases/relevant-memory/constants.ts +28 -0
- package/src/usecases/relevant-memory/cutoffs.ts +29 -0
- package/src/usecases/relevant-memory/decision.ts +102 -0
- package/src/usecases/relevant-memory/index.ts +11 -0
- package/src/usecases/relevant-memory/loaded.ts +31 -0
- package/src/usecases/relevant-memory/refresh.ts +30 -0
- package/src/usecases/relevant-memory/retrieve-memory.ts +62 -0
- package/src/usecases/relevant-memory/schemas.ts +20 -0
- package/src/usecases/relevant-memory/session-memory.ts +53 -0
- package/src/usecases/relevant-memory/track-dont-forget.ts +13 -0
- package/src/usecases/relevant-memory/types.ts +106 -0
- package/src/usecases/resolve-memory/index.ts +2 -0
- package/src/usecases/resolve-memory/leased/index.ts +2 -0
- package/src/usecases/resolve-memory/leased/resolve.ts +109 -0
- package/src/usecases/resolve-memory/leased/types.ts +35 -0
- package/src/usecases/resolve-memory/resolve-memory.ts +23 -0
- package/src/usecases/resolve-memory/types.ts +7 -0
- package/src/usecases/search-memory/constants.ts +1 -0
- package/src/usecases/search-memory/index.ts +3 -0
- package/src/usecases/search-memory/search-memory.ts +132 -0
- package/src/usecases/search-memory/types.ts +39 -0
- package/src/usecases/semantic/constants.ts +7 -0
- package/src/usecases/semantic/index.ts +5 -0
- package/src/usecases/semantic/prepare.ts +30 -0
- package/src/usecases/semantic/rank.ts +83 -0
- package/src/usecases/semantic/refresh-vectors.ts +95 -0
- package/src/usecases/semantic/types.ts +17 -0
- package/src/usecases/semantic-port/index.ts +1 -0
- package/src/usecases/semantic-port/types.ts +20 -0
- package/src/usecases/semantic-provider/constants.ts +6 -0
- package/src/usecases/semantic-provider/index.ts +5 -0
- package/src/usecases/semantic-provider/local.ts +33 -0
- package/src/usecases/semantic-provider/remote.ts +10 -0
- package/src/usecases/semantic-provider/size.ts +10 -0
- package/src/usecases/semantic-provider/types.ts +19 -0
- package/src/usecases/session/index.ts +2 -0
- package/src/usecases/session/lease.ts +70 -0
- package/src/usecases/session/receipts.ts +46 -0
- package/src/usecases/session/state.ts +106 -0
- package/src/usecases/session/types.ts +45 -0
- package/src/usecases/settings/change.ts +142 -0
- package/src/usecases/settings/index.ts +3 -0
- package/src/usecases/settings/prepare.ts +24 -0
- package/src/usecases/settings/types.ts +32 -0
- package/src/usecases/succeed-memory/index.ts +3 -0
- package/src/usecases/succeed-memory/schemas.ts +13 -0
- package/src/usecases/succeed-memory/succeed-memory.ts +34 -0
- package/src/usecases/succeed-memory/types.ts +18 -0
- package/src/usecases/synchronize-memory/index.ts +2 -0
- package/src/usecases/synchronize-memory/leased/aliases.ts +55 -0
- package/src/usecases/synchronize-memory/leased/folder-states.ts +58 -0
- package/src/usecases/synchronize-memory/leased/index.ts +2 -0
- package/src/usecases/synchronize-memory/leased/inspection.ts +32 -0
- package/src/usecases/synchronize-memory/leased/maintenance.ts +41 -0
- package/src/usecases/synchronize-memory/leased/publication.ts +55 -0
- package/src/usecases/synchronize-memory/leased/scan.ts +37 -0
- package/src/usecases/synchronize-memory/leased/synchronize.ts +102 -0
- package/src/usecases/synchronize-memory/leased/types.ts +60 -0
- package/src/usecases/synchronize-memory/synchronize-memory.ts +26 -0
- package/src/usecases/synchronize-memory/types.ts +5 -0
- package/src/usecases/update-memory/index.ts +3 -0
- package/src/usecases/update-memory/schemas.ts +14 -0
- package/src/usecases/update-memory/types.ts +16 -0
- package/src/usecases/update-memory/update-memory.ts +31 -0
- package/CHANGELOG.md +0 -21
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite"
|
|
2
|
+
|
|
3
|
+
import type { CatalogChanges, VectorReplacement } from "#src/domain"
|
|
4
|
+
import { readCatalogHits } from "./catalog-query.ts"
|
|
5
|
+
import { prepareCatalogStatements } from "./catalog-statements.ts"
|
|
6
|
+
import { closeFailedIndex } from "./cleanup.ts"
|
|
7
|
+
import { prepareFolderIndexStatements } from "./folder-index-statements.ts"
|
|
8
|
+
import { readStoredFolderIndexes, writeFolderIndexStates } from "./folder-index-storage.ts"
|
|
9
|
+
import { readInventory } from "./inventory.ts"
|
|
10
|
+
import { putLegacyEntry, removeLegacyEntry } from "./legacy.ts"
|
|
11
|
+
import { readSearchHits } from "./query.ts"
|
|
12
|
+
import { writeCatalog } from "./reconcile.ts"
|
|
13
|
+
import { closedIndex, indexFailure } from "./refusals.ts"
|
|
14
|
+
import { prepareStatements } from "./statements.ts"
|
|
15
|
+
import type {
|
|
16
|
+
CatalogQuery,
|
|
17
|
+
CatalogSearchResult,
|
|
18
|
+
FolderIndexState,
|
|
19
|
+
FolderIndexStatesResult,
|
|
20
|
+
IndexEntry,
|
|
21
|
+
IndexWork,
|
|
22
|
+
IndexWriteResult,
|
|
23
|
+
InventoryResult,
|
|
24
|
+
SearchIndex,
|
|
25
|
+
SearchIndexRefusal,
|
|
26
|
+
SearchOptions,
|
|
27
|
+
SearchResult,
|
|
28
|
+
VectorCacheResult,
|
|
29
|
+
VectorCoverageResult,
|
|
30
|
+
VectorUpdate,
|
|
31
|
+
} from "./types.ts"
|
|
32
|
+
import { prepareVectorStatements } from "./vector-statements.ts"
|
|
33
|
+
import { readVectorCoverage, readVectors, updateVectors, writeVectors } from "./vector-storage.ts"
|
|
34
|
+
|
|
35
|
+
export class SqliteSearchIndex implements SearchIndex {
|
|
36
|
+
readonly #database: DatabaseSync
|
|
37
|
+
readonly #statements: ReturnType<typeof prepareStatements>
|
|
38
|
+
readonly #catalog: ReturnType<typeof prepareCatalogStatements>
|
|
39
|
+
readonly #vectors: ReturnType<typeof prepareVectorStatements>
|
|
40
|
+
readonly #folderIndexes: ReturnType<typeof prepareFolderIndexStatements>
|
|
41
|
+
#usable = true
|
|
42
|
+
|
|
43
|
+
constructor(database: DatabaseSync) {
|
|
44
|
+
this.#database = database
|
|
45
|
+
this.#statements = prepareStatements(database)
|
|
46
|
+
this.#catalog = prepareCatalogStatements(database)
|
|
47
|
+
this.#vectors = prepareVectorStatements(database)
|
|
48
|
+
this.#folderIndexes = prepareFolderIndexStatements(database)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
put(entry: IndexEntry): IndexWriteResult {
|
|
52
|
+
return this.#write(() => putLegacyEntry(this.#statements, this.#catalog, entry))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
remove(id: string): IndexWriteResult {
|
|
56
|
+
return this.#write(() => removeLegacyEntry(this.#statements, this.#catalog, id))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
apply(changes: CatalogChanges): IndexWriteResult {
|
|
60
|
+
return this.#write(() => writeCatalog(this.#catalog, changes))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
replaceVectors(request: VectorReplacement): IndexWriteResult {
|
|
64
|
+
return this.#write(() => writeVectors(this.#vectors, this.#catalog, request))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
updateVectors(request: VectorUpdate): IndexWriteResult {
|
|
68
|
+
return this.#write(() => updateVectors(this.#vectors, this.#catalog, request))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
vectorCoverage(): VectorCoverageResult {
|
|
72
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
this.#database.exec("BEGIN")
|
|
76
|
+
const result = readVectorCoverage(this.#vectors)
|
|
77
|
+
this.#database.exec("COMMIT")
|
|
78
|
+
return result
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (!(error instanceof Error)) throw error
|
|
81
|
+
return this.#rollBack(indexFailure(error))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
recordFolderIndexes(states: FolderIndexState[], keepFolders: string[]): IndexWriteResult {
|
|
86
|
+
return this.#write(() => writeFolderIndexStates(this.#folderIndexes, states, keepFolders))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
folderIndexes(): FolderIndexStatesResult {
|
|
90
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
this.#database.exec("BEGIN")
|
|
94
|
+
const result = readStoredFolderIndexes(this.#folderIndexes)
|
|
95
|
+
this.#database.exec("COMMIT")
|
|
96
|
+
return result
|
|
97
|
+
} catch (error) {
|
|
98
|
+
if (!(error instanceof Error)) throw error
|
|
99
|
+
return this.#rollBack(indexFailure(error))
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
inventory(): InventoryResult {
|
|
104
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
this.#database.exec("BEGIN")
|
|
108
|
+
const result = readInventory(this.#catalog)
|
|
109
|
+
this.#database.exec("COMMIT")
|
|
110
|
+
return result
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (!(error instanceof Error)) throw error
|
|
113
|
+
return this.#rollBack(indexFailure(error))
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
vectors(): VectorCacheResult {
|
|
118
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
this.#database.exec("BEGIN")
|
|
122
|
+
const result = readVectors(this.#vectors)
|
|
123
|
+
this.#database.exec("COMMIT")
|
|
124
|
+
return result
|
|
125
|
+
} catch (error) {
|
|
126
|
+
if (!(error instanceof Error)) throw error
|
|
127
|
+
if (error instanceof SyntaxError) {
|
|
128
|
+
return this.#rollBack({ succeeded: false, reason: "corrupted", problems: ["invalid cached vector JSON"] })
|
|
129
|
+
}
|
|
130
|
+
return this.#rollBack(indexFailure(error))
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
searchCatalog(request: CatalogQuery): CatalogSearchResult {
|
|
135
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
136
|
+
|
|
137
|
+
try {
|
|
138
|
+
return readCatalogHits(this.#catalog.search, request)
|
|
139
|
+
} catch (error) {
|
|
140
|
+
if (!(error instanceof Error)) throw error
|
|
141
|
+
return indexFailure(error)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
search(query: string, options: SearchOptions): SearchResult {
|
|
146
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
return readSearchHits(this.#statements.search, query, options)
|
|
150
|
+
} catch (error) {
|
|
151
|
+
if (!(error instanceof Error)) throw error
|
|
152
|
+
return indexFailure(error)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
close(): IndexWriteResult {
|
|
157
|
+
if (!this.#database.isOpen) return { succeeded: true }
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
this.#database.close()
|
|
161
|
+
return { succeeded: true }
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if (!(error instanceof Error)) throw error
|
|
164
|
+
return indexFailure(error)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
#write(work: IndexWork): IndexWriteResult {
|
|
169
|
+
if (!this.#usable || !this.#database.isOpen) return closedIndex()
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
this.#database.exec("BEGIN IMMEDIATE")
|
|
173
|
+
} catch (error) {
|
|
174
|
+
if (!(error instanceof Error)) throw error
|
|
175
|
+
return indexFailure(error)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return this.#commit(work)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#commit(work: IndexWork): IndexWriteResult {
|
|
182
|
+
try {
|
|
183
|
+
const result = work()
|
|
184
|
+
if (!result.succeeded) return this.#rollBack(result)
|
|
185
|
+
|
|
186
|
+
this.#database.exec("COMMIT")
|
|
187
|
+
return result
|
|
188
|
+
} catch (error) {
|
|
189
|
+
if (!(error instanceof Error)) throw error
|
|
190
|
+
return this.#rollBack(indexFailure(error))
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#rollBack(failure: SearchIndexRefusal): SearchIndexRefusal {
|
|
195
|
+
if (!this.#database.isTransaction) return failure
|
|
196
|
+
|
|
197
|
+
try {
|
|
198
|
+
this.#database.exec("ROLLBACK")
|
|
199
|
+
} catch (error) {
|
|
200
|
+
if (!(error instanceof Error)) throw error
|
|
201
|
+
this.#usable = false
|
|
202
|
+
failure.problems.push(`write rollback failed: ${error.message}`)
|
|
203
|
+
return closeFailedIndex(this.#database, failure)
|
|
204
|
+
}
|
|
205
|
+
return failure
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { Static } from "typebox"
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
CatalogChanges,
|
|
5
|
+
CatalogSnapshot,
|
|
6
|
+
VectorCache,
|
|
7
|
+
VectorChunk,
|
|
8
|
+
VectorGeneration,
|
|
9
|
+
VectorReplacement,
|
|
10
|
+
} from "#src/domain"
|
|
11
|
+
import type { Done, Failed, Succeeded } from "#src/shared"
|
|
12
|
+
import type {
|
|
13
|
+
CatalogHitSchema,
|
|
14
|
+
CatalogRowSchema,
|
|
15
|
+
FolderIndexRowSchema,
|
|
16
|
+
FolderIndexStateSchema,
|
|
17
|
+
IndexEntrySchema,
|
|
18
|
+
SearchHitSchema,
|
|
19
|
+
SearchOptionsSchema,
|
|
20
|
+
} from "./schemas.ts"
|
|
21
|
+
|
|
22
|
+
export type {
|
|
23
|
+
AliasFailureClassification,
|
|
24
|
+
CatalogChanges,
|
|
25
|
+
CatalogEntry,
|
|
26
|
+
CatalogPlan,
|
|
27
|
+
CatalogScan,
|
|
28
|
+
CatalogSnapshot,
|
|
29
|
+
SemanticContent,
|
|
30
|
+
VectorCache,
|
|
31
|
+
VectorChunk,
|
|
32
|
+
VectorGeneration,
|
|
33
|
+
VectorReplacement,
|
|
34
|
+
} from "#src/domain"
|
|
35
|
+
export type CatalogHit = Static<typeof CatalogHitSchema>
|
|
36
|
+
export type CatalogRow = Static<typeof CatalogRowSchema>
|
|
37
|
+
export type FolderIndexState = Static<typeof FolderIndexStateSchema>
|
|
38
|
+
export type FolderIndexRow = Static<typeof FolderIndexRowSchema>
|
|
39
|
+
export type FolderIndexStatesResult = Succeeded<FolderIndexState[]> | SearchIndexRefusal
|
|
40
|
+
export type InventoryResult = Succeeded<CatalogSnapshot> | SearchIndexRefusal
|
|
41
|
+
export type CatalogSearchResult = Succeeded<CatalogHit[]> | SearchIndexRefusal
|
|
42
|
+
export type VectorCacheResult = Succeeded<VectorCache> | SearchIndexRefusal
|
|
43
|
+
export type VectorCoverageResult = Succeeded<VectorCoverage> | SearchIndexRefusal
|
|
44
|
+
|
|
45
|
+
export interface VectorUpdate {
|
|
46
|
+
expectedRevision: number
|
|
47
|
+
generation: VectorGeneration
|
|
48
|
+
add: VectorChunk[]
|
|
49
|
+
remove: string[]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface VectorCoverage {
|
|
53
|
+
generation: VectorGeneration | null
|
|
54
|
+
embedded: number
|
|
55
|
+
current: number
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface IndexLocation {
|
|
59
|
+
path: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface IndexReplacement {
|
|
63
|
+
path: string
|
|
64
|
+
temporaryPath: string
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface CatalogQuery {
|
|
68
|
+
query: string
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface CatalogWriteRow extends CatalogRow {
|
|
72
|
+
folder: string
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface SearchIndex {
|
|
76
|
+
put(entry: IndexEntry): IndexWriteResult
|
|
77
|
+
remove(id: string): IndexWriteResult
|
|
78
|
+
search(query: string, options: SearchOptions): SearchResult
|
|
79
|
+
inventory(): InventoryResult
|
|
80
|
+
apply(changes: CatalogChanges): IndexWriteResult
|
|
81
|
+
searchCatalog(request: CatalogQuery): CatalogSearchResult
|
|
82
|
+
vectors(): VectorCacheResult
|
|
83
|
+
replaceVectors(request: VectorReplacement): IndexWriteResult
|
|
84
|
+
updateVectors(request: VectorUpdate): IndexWriteResult
|
|
85
|
+
vectorCoverage(): VectorCoverageResult
|
|
86
|
+
folderIndexes(): FolderIndexStatesResult
|
|
87
|
+
recordFolderIndexes(states: FolderIndexState[], keepFolders: string[]): IndexWriteResult
|
|
88
|
+
close(): IndexWriteResult
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export type SearchHit = Static<typeof SearchHitSchema>
|
|
92
|
+
|
|
93
|
+
export type IndexEntry = Static<typeof IndexEntrySchema>
|
|
94
|
+
|
|
95
|
+
export type SearchOptions = Static<typeof SearchOptionsSchema>
|
|
96
|
+
|
|
97
|
+
export interface SearchIndexRefusal extends Failed {
|
|
98
|
+
reason: "corrupted" | "unavailable" | "closed" | "invalid" | "conflict"
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface OpenedIndex extends Succeeded<SearchIndex> {
|
|
102
|
+
rebuilt: boolean
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type OpenIndexResult = OpenedIndex | SearchIndexRefusal
|
|
106
|
+
|
|
107
|
+
export type SearchResult = Succeeded<SearchHit[]> | SearchIndexRefusal
|
|
108
|
+
|
|
109
|
+
export type IndexWriteResult = Done | SearchIndexRefusal
|
|
110
|
+
|
|
111
|
+
export type SchemaResult = Succeeded<boolean> | SearchIndexRefusal
|
|
112
|
+
|
|
113
|
+
export type IndexWork = () => IndexWriteResult
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DatabaseSync } from "node:sqlite"
|
|
2
|
+
|
|
3
|
+
export function prepareVectorStatements(database: DatabaseSync) {
|
|
4
|
+
return {
|
|
5
|
+
generation: database.prepare("SELECT fingerprint, dimensions FROM vector_generation WHERE singleton = 1"),
|
|
6
|
+
chunks: database.prepare(
|
|
7
|
+
"SELECT content_fingerprint, chunk, vector FROM vector_chunks ORDER BY content_fingerprint, chunk",
|
|
8
|
+
),
|
|
9
|
+
clearChunks: database.prepare("DELETE FROM vector_chunks"),
|
|
10
|
+
clearGeneration: database.prepare("DELETE FROM vector_generation"),
|
|
11
|
+
putGeneration: database.prepare("INSERT INTO vector_generation VALUES (1, ?, ?)"),
|
|
12
|
+
putChunk: database.prepare("INSERT INTO vector_chunks VALUES (?, ?, ?)"),
|
|
13
|
+
removeChunks: database.prepare("DELETE FROM vector_chunks WHERE content_fingerprint = ?"),
|
|
14
|
+
currentContent: database.prepare(`SELECT DISTINCT content_fingerprint FROM notes
|
|
15
|
+
WHERE id IS NOT NULL AND archived = 0 AND content_fingerprint IS NOT NULL`),
|
|
16
|
+
embeddedContent: database.prepare("SELECT COUNT(DISTINCT content_fingerprint) AS embedded FROM vector_chunks"),
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { Value } from "typebox/value"
|
|
2
|
+
|
|
3
|
+
import { type VectorChunk, type VectorGeneration, VectorGenerationSchema, type VectorReplacement } from "#src/domain"
|
|
4
|
+
import type { Succeeded } from "#src/shared"
|
|
5
|
+
import type { prepareCatalogStatements } from "./catalog-statements.ts"
|
|
6
|
+
import { corruptCatalog } from "./inventory.ts"
|
|
7
|
+
import { invalidCatalog, staleCatalog } from "./reconcile.ts"
|
|
8
|
+
import {
|
|
9
|
+
CatalogStateSchema,
|
|
10
|
+
VectorChunkSchema,
|
|
11
|
+
VectorReplacementSchema,
|
|
12
|
+
VectorRowSchema,
|
|
13
|
+
VectorUpdateSchema,
|
|
14
|
+
VectorValuesSchema,
|
|
15
|
+
} from "./schemas.ts"
|
|
16
|
+
import type {
|
|
17
|
+
IndexWriteResult,
|
|
18
|
+
SearchIndexRefusal,
|
|
19
|
+
VectorCacheResult,
|
|
20
|
+
VectorCoverageResult,
|
|
21
|
+
VectorUpdate,
|
|
22
|
+
} from "./types.ts"
|
|
23
|
+
import type { prepareVectorStatements } from "./vector-statements.ts"
|
|
24
|
+
|
|
25
|
+
export function readVectors(statements: ReturnType<typeof prepareVectorStatements>): VectorCacheResult {
|
|
26
|
+
const generation = statements.generation.get()
|
|
27
|
+
const rows = statements.chunks.all()
|
|
28
|
+
if (!generation) {
|
|
29
|
+
if (rows.length > 0) return corruptCatalog()
|
|
30
|
+
return { succeeded: true, output: { generation: null, chunks: [] } }
|
|
31
|
+
}
|
|
32
|
+
if (!Value.Check(VectorGenerationSchema, generation)) return corruptCatalog()
|
|
33
|
+
const chunks: VectorChunk[] = []
|
|
34
|
+
for (const row of rows) {
|
|
35
|
+
if (!Value.Check(VectorRowSchema, row)) return corruptCatalog()
|
|
36
|
+
const vector = JSON.parse(row.vector)
|
|
37
|
+
if (!Value.Check(VectorValuesSchema, vector)) return corruptCatalog()
|
|
38
|
+
const chunk = { contentFingerprint: row.content_fingerprint, chunk: row.chunk, vector }
|
|
39
|
+
if (!Value.Check(VectorChunkSchema, chunk) || !validVector(chunk.vector, generation.dimensions)) {
|
|
40
|
+
return corruptCatalog()
|
|
41
|
+
}
|
|
42
|
+
chunks.push(chunk)
|
|
43
|
+
}
|
|
44
|
+
if (!contiguousChunks(chunks)) return corruptCatalog()
|
|
45
|
+
return { succeeded: true, output: { generation, chunks } }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function writeVectors(
|
|
49
|
+
statements: ReturnType<typeof prepareVectorStatements>,
|
|
50
|
+
catalog: ReturnType<typeof prepareCatalogStatements>,
|
|
51
|
+
request: VectorReplacement,
|
|
52
|
+
): IndexWriteResult {
|
|
53
|
+
if (!Value.Check(VectorReplacementSchema, request)) return invalidCatalog("invalid vector generation")
|
|
54
|
+
const current = readCurrentContent(statements, catalog, request.expectedRevision)
|
|
55
|
+
if (!current.succeeded) return current
|
|
56
|
+
if (!usableChunks(request.chunks, request.generation, current.output)) {
|
|
57
|
+
return invalidCatalog("vectors must belong to current content with finite nonzero vectors of one dimension")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
statements.clearChunks.run()
|
|
61
|
+
statements.clearGeneration.run()
|
|
62
|
+
statements.putGeneration.run(request.generation.fingerprint, request.generation.dimensions)
|
|
63
|
+
for (const chunk of request.chunks) putChunk(statements, chunk)
|
|
64
|
+
return { succeeded: true }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function updateVectors(
|
|
68
|
+
statements: ReturnType<typeof prepareVectorStatements>,
|
|
69
|
+
catalog: ReturnType<typeof prepareCatalogStatements>,
|
|
70
|
+
request: VectorUpdate,
|
|
71
|
+
): IndexWriteResult {
|
|
72
|
+
if (!Value.Check(VectorUpdateSchema, request)) return invalidCatalog("invalid vector update")
|
|
73
|
+
const current = readCurrentContent(statements, catalog, request.expectedRevision)
|
|
74
|
+
if (!current.succeeded) return current
|
|
75
|
+
const added = new Set(request.add.map((chunk) => chunk.contentFingerprint))
|
|
76
|
+
if (
|
|
77
|
+
!usableChunks(request.add, request.generation, current.output) ||
|
|
78
|
+
request.remove.some((entry) => added.has(entry))
|
|
79
|
+
) {
|
|
80
|
+
return invalidCatalog("added vectors must belong to current content, be finite, nonzero and not also removed")
|
|
81
|
+
}
|
|
82
|
+
const stored = readGeneration(statements)
|
|
83
|
+
if (!stored.succeeded) return stored
|
|
84
|
+
if (!sameGeneration(stored.output, request.generation)) {
|
|
85
|
+
statements.clearChunks.run()
|
|
86
|
+
statements.clearGeneration.run()
|
|
87
|
+
statements.putGeneration.run(request.generation.fingerprint, request.generation.dimensions)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
for (const fingerprint of [...request.remove, ...added]) statements.removeChunks.run(fingerprint)
|
|
91
|
+
for (const chunk of request.add) putChunk(statements, chunk)
|
|
92
|
+
return { succeeded: true }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function readVectorCoverage(statements: ReturnType<typeof prepareVectorStatements>): VectorCoverageResult {
|
|
96
|
+
const generation = readGeneration(statements)
|
|
97
|
+
if (!generation.succeeded) return generation
|
|
98
|
+
const embedded = statements.embeddedContent.get()
|
|
99
|
+
if (!embedded || typeof embedded.embedded !== "number") return corruptCatalog()
|
|
100
|
+
const current = readFingerprints(statements)
|
|
101
|
+
if (!current.succeeded) return current
|
|
102
|
+
return {
|
|
103
|
+
succeeded: true,
|
|
104
|
+
output: { generation: generation.output, embedded: embedded.embedded, current: current.output.size },
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function readGeneration(
|
|
109
|
+
statements: ReturnType<typeof prepareVectorStatements>,
|
|
110
|
+
): Succeeded<VectorGeneration | null> | SearchIndexRefusal {
|
|
111
|
+
const row = statements.generation.get()
|
|
112
|
+
if (!row) return { succeeded: true, output: null }
|
|
113
|
+
if (!Value.Check(VectorGenerationSchema, row)) return corruptCatalog()
|
|
114
|
+
return { succeeded: true, output: row }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function readCurrentContent(
|
|
118
|
+
statements: ReturnType<typeof prepareVectorStatements>,
|
|
119
|
+
catalog: ReturnType<typeof prepareCatalogStatements>,
|
|
120
|
+
expectedRevision: number,
|
|
121
|
+
): Succeeded<Set<string>> | SearchIndexRefusal {
|
|
122
|
+
const state = catalog.state.get()
|
|
123
|
+
if (!Value.Check(CatalogStateSchema, state)) return corruptCatalog()
|
|
124
|
+
if (state.revision !== expectedRevision) return staleCatalog()
|
|
125
|
+
return readFingerprints(statements)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function readFingerprints(
|
|
129
|
+
statements: ReturnType<typeof prepareVectorStatements>,
|
|
130
|
+
): Succeeded<Set<string>> | SearchIndexRefusal {
|
|
131
|
+
const fingerprints = new Set<string>()
|
|
132
|
+
for (const row of statements.currentContent.all()) {
|
|
133
|
+
if (typeof row.content_fingerprint !== "string") return corruptCatalog()
|
|
134
|
+
fingerprints.add(row.content_fingerprint)
|
|
135
|
+
}
|
|
136
|
+
return { succeeded: true, output: fingerprints }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function sameGeneration(stored: VectorGeneration | null, requested: VectorGeneration): boolean {
|
|
140
|
+
return stored?.fingerprint === requested.fingerprint && stored.dimensions === requested.dimensions
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function putChunk(statements: ReturnType<typeof prepareVectorStatements>, chunk: VectorChunk): void {
|
|
144
|
+
statements.putChunk.run(chunk.contentFingerprint, chunk.chunk, JSON.stringify(chunk.vector))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function usableChunks(chunks: VectorChunk[], generation: VectorGeneration, current: Set<string>): boolean {
|
|
148
|
+
return (
|
|
149
|
+
chunks.every(
|
|
150
|
+
(chunk) => current.has(chunk.contentFingerprint) && validVector(chunk.vector, generation.dimensions),
|
|
151
|
+
) && contiguousChunks(chunks)
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function contiguousChunks(chunks: VectorChunk[]): boolean {
|
|
156
|
+
const groups = new Map<string, number[]>()
|
|
157
|
+
for (const chunk of chunks) {
|
|
158
|
+
const group = groups.get(chunk.contentFingerprint)
|
|
159
|
+
if (group) group.push(chunk.chunk)
|
|
160
|
+
else groups.set(chunk.contentFingerprint, [chunk.chunk])
|
|
161
|
+
}
|
|
162
|
+
return [...groups.values()].every((group) =>
|
|
163
|
+
group.sort((left, right) => left - right).every((chunk, index) => chunk === index),
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function validVector(vector: number[], dimensions: number): boolean {
|
|
168
|
+
return vector.length === dimensions && vector.every(Number.isFinite) && vector.some((value) => value !== 0)
|
|
169
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { VectorReplacement } from "#src/domain"
|
|
2
|
+
import type { IndexWriteResult, SearchIndex, VectorCacheResult, VectorCoverageResult, VectorUpdate } from "./types.ts"
|
|
3
|
+
|
|
4
|
+
export function readVectorCache(index: SearchIndex): VectorCacheResult {
|
|
5
|
+
return index.vectors()
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function replaceVectorCache(index: SearchIndex, request: VectorReplacement): IndexWriteResult {
|
|
9
|
+
return index.replaceVectors(request)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function updateVectorCache(index: SearchIndex, request: VectorUpdate): IndexWriteResult {
|
|
13
|
+
return index.updateVectors(request)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function readVectorCoverage(index: SearchIndex): VectorCoverageResult {
|
|
17
|
+
return index.vectorCoverage()
|
|
18
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IndexEntry, IndexWriteResult, SearchIndex } from "./types.ts"
|
|
2
|
+
|
|
3
|
+
export function putNote(index: SearchIndex, entry: IndexEntry): IndexWriteResult {
|
|
4
|
+
return index.put(entry)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function removeNote(index: SearchIndex, id: string): IndexWriteResult {
|
|
8
|
+
return index.remove(id)
|
|
9
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Value } from "typebox/value"
|
|
2
|
+
|
|
3
|
+
import { SHELL_EDIT_QUESTIONS } from "#src/domain"
|
|
4
|
+
import { answeredByRequestedModel, defaultJevModel } from "#src/services/decision-model"
|
|
5
|
+
import { JevOutcomeSchema, ShellEditAnswersSchema } from "./schemas.ts"
|
|
6
|
+
import type { ShellEditAskCall, ShellEditAskResult, ShellEditClassifierResult } from "./types.ts"
|
|
7
|
+
|
|
8
|
+
export async function askShellEdit(call: ShellEditAskCall): Promise<ShellEditAskResult> {
|
|
9
|
+
if (call.signal.aborted) return failed("cancelled")
|
|
10
|
+
const outcome = await classified(call)
|
|
11
|
+
if (typeof outcome === "string") return failed(outcome)
|
|
12
|
+
if (call.signal.aborted) return failed("cancelled")
|
|
13
|
+
if (!Value.Check(JevOutcomeSchema, outcome)) return failed("Jev returned an answer of another shape")
|
|
14
|
+
if (outcome.stopReason === "aborted") return failed("cancelled")
|
|
15
|
+
if (outcome.stopReason === "error") return failed(errorText(outcome.errorMessage))
|
|
16
|
+
if (!answeredByRequestedModel(defaultJevModel, outcome.model)) {
|
|
17
|
+
return failed(`answered by ${outcome.model}, not ${defaultJevModel}`)
|
|
18
|
+
}
|
|
19
|
+
if (!Value.Check(ShellEditAnswersSchema, outcome)) {
|
|
20
|
+
return failed("Jev did not answer every question with a yes/no probability")
|
|
21
|
+
}
|
|
22
|
+
const { answers } = outcome
|
|
23
|
+
const scores = {
|
|
24
|
+
redirection: answers.redirection.probability,
|
|
25
|
+
in_place: answers.in_place.probability,
|
|
26
|
+
inline_code: answers.inline_code.probability,
|
|
27
|
+
script_writes: answers.script_writes.probability,
|
|
28
|
+
copy_download: answers.copy_download.probability,
|
|
29
|
+
hardlink: answers.hardlink.probability,
|
|
30
|
+
}
|
|
31
|
+
return { succeeded: true, output: { scores, reportedModel: outcome.model } }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function classified(call: ShellEditAskCall): Promise<ShellEditClassifierResult | string> {
|
|
35
|
+
try {
|
|
36
|
+
return await call.classifier.classify({
|
|
37
|
+
model: { provider: "typesafe", id: defaultJevModel },
|
|
38
|
+
context: { state: call.state, questions: SHELL_EDIT_QUESTIONS },
|
|
39
|
+
options: { signal: call.signal, maxRetries: 0 },
|
|
40
|
+
})
|
|
41
|
+
} catch (error) {
|
|
42
|
+
return `the call to Jev failed: ${String(error)}`
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function errorText(message: string | undefined): string {
|
|
47
|
+
if (typeof message === "string") return `Jev reported an error: ${message}`
|
|
48
|
+
return "Jev reported an error"
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function failed(cause: string): ShellEditAskResult {
|
|
52
|
+
return { succeeded: false, problems: [cause] }
|
|
53
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Type from "typebox"
|
|
2
|
+
|
|
3
|
+
const BoolAnswerSchema = Type.Object({
|
|
4
|
+
type: Type.Literal("bool"),
|
|
5
|
+
probability: Type.Number({ minimum: 0, maximum: 1 }),
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
export const JevOutcomeSchema = Type.Object({
|
|
9
|
+
stopReason: Type.Union([Type.Literal("stop"), Type.Literal("error"), Type.Literal("aborted")]),
|
|
10
|
+
model: Type.String(),
|
|
11
|
+
errorMessage: Type.Optional(Type.String()),
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
export const ShellEditAnswersSchema = Type.Object({
|
|
15
|
+
answers: Type.Object({
|
|
16
|
+
redirection: BoolAnswerSchema,
|
|
17
|
+
in_place: BoolAnswerSchema,
|
|
18
|
+
inline_code: BoolAnswerSchema,
|
|
19
|
+
script_writes: BoolAnswerSchema,
|
|
20
|
+
copy_download: BoolAnswerSchema,
|
|
21
|
+
hardlink: BoolAnswerSchema,
|
|
22
|
+
}),
|
|
23
|
+
})
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ShellEditQuestions, ShellEditScores, ShellEditState } from "#src/domain"
|
|
2
|
+
import type { Failed, Succeeded } from "#src/shared"
|
|
3
|
+
|
|
4
|
+
export interface ShellEditPrompt {
|
|
5
|
+
state: ShellEditState
|
|
6
|
+
questions: ShellEditQuestions
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ShellEditModelReference {
|
|
10
|
+
provider: "typesafe"
|
|
11
|
+
id: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface ShellEditClassifyOptions {
|
|
15
|
+
signal: AbortSignal
|
|
16
|
+
maxRetries: 0
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ShellEditClassifyRequest {
|
|
20
|
+
model: ShellEditModelReference
|
|
21
|
+
context: ShellEditPrompt
|
|
22
|
+
options: ShellEditClassifyOptions
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface ShellEditJevAnswer {
|
|
26
|
+
type: string
|
|
27
|
+
probability?: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ShellEditJevAnswers {
|
|
31
|
+
redirection?: ShellEditJevAnswer
|
|
32
|
+
in_place?: ShellEditJevAnswer
|
|
33
|
+
inline_code?: ShellEditJevAnswer
|
|
34
|
+
script_writes?: ShellEditJevAnswer
|
|
35
|
+
copy_download?: ShellEditJevAnswer
|
|
36
|
+
hardlink?: ShellEditJevAnswer
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ShellEditClassifierResult {
|
|
40
|
+
model: string
|
|
41
|
+
answers: ShellEditJevAnswers
|
|
42
|
+
stopReason: "stop" | "error" | "aborted"
|
|
43
|
+
errorMessage?: string
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ShellEditClassifierPort {
|
|
47
|
+
classify(request: ShellEditClassifyRequest): Promise<ShellEditClassifierResult>
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ShellEditAskCall {
|
|
51
|
+
classifier: ShellEditClassifierPort
|
|
52
|
+
state: ShellEditState
|
|
53
|
+
signal: AbortSignal
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ShellEditClassification {
|
|
57
|
+
scores: ShellEditScores
|
|
58
|
+
reportedModel: string
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type ShellEditAskResult = Succeeded<ShellEditClassification> | Failed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PACKAGE_SCRIPT_PREFIX = "package.json#scripts."
|