pi-obsidian-memory 0.0.1 → 0.1.0
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 +173 -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,13 @@
|
|
|
1
|
+
export const MEMORY_ADD_TOOL_NAME = "memory_add"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_ADD_TOOL_LABEL = "Memory add"
|
|
4
|
+
|
|
5
|
+
export const MEMORY_ADD_TOOL_DESCRIPTION = "Use only when the user explicitly asks to remember something."
|
|
6
|
+
|
|
7
|
+
export const SAME_POINT_GUIDANCE =
|
|
8
|
+
"If it is the same point, leave the existing note unchanged or, only if the user asked to change it, read it with memory_get and change it with memory_update; otherwise choose a statement that says what is new."
|
|
9
|
+
|
|
10
|
+
export const NO_PROJECT_GUIDANCE =
|
|
11
|
+
"Ask the user whether to run /memory-init in this folder to register the project or to save it with global scope."
|
|
12
|
+
|
|
13
|
+
export const SETUP_GUIDANCE = "Memory is off: ask the user to run /memory-setup."
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MemoryPaths } from "#src/pi/context"
|
|
2
|
+
import { type MemorySessionKeeper, noSessionResponse } from "#src/pi/memory-session"
|
|
3
|
+
import { addMemory, type MemoryOperationContext } from "#src/usecases"
|
|
4
|
+
import { MEMORY_ADD_TOOL_DESCRIPTION, MEMORY_ADD_TOOL_LABEL, MEMORY_ADD_TOOL_NAME } from "./constants.ts"
|
|
5
|
+
import { respondTo } from "./respond.ts"
|
|
6
|
+
import { MemoryAddParamsSchema } from "./schemas.ts"
|
|
7
|
+
import type { MemoryAddParams, MemoryAddResponse, MemoryAddTool } from "./types.ts"
|
|
8
|
+
|
|
9
|
+
export function memoryAddTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryAddTool {
|
|
10
|
+
return {
|
|
11
|
+
name: MEMORY_ADD_TOOL_NAME,
|
|
12
|
+
label: MEMORY_ADD_TOOL_LABEL,
|
|
13
|
+
description: MEMORY_ADD_TOOL_DESCRIPTION,
|
|
14
|
+
parameters: MemoryAddParamsSchema,
|
|
15
|
+
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
16
|
+
const context = sessions.currentOperation(ctx.cwd, paths, signal)
|
|
17
|
+
if (!context) return noSessionResponse()
|
|
18
|
+
return runMemoryAdd(params, context)
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function runMemoryAdd(
|
|
24
|
+
params: MemoryAddParams,
|
|
25
|
+
context: MemoryOperationContext,
|
|
26
|
+
): Promise<MemoryAddResponse> {
|
|
27
|
+
const { scope, folder, statement, type, body, dontForget } = params
|
|
28
|
+
const result = await addMemory({ scope, folder, draft: { statement, type, body, dontForget } }, context)
|
|
29
|
+
|
|
30
|
+
return respondTo(result)
|
|
31
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { AddedMemory, AddMemoryResult, ExistingMemoryRefusal } from "#src/usecases"
|
|
2
|
+
import { NO_PROJECT_GUIDANCE, SAME_POINT_GUIDANCE, SETUP_GUIDANCE } from "./constants.ts"
|
|
3
|
+
import type { AddedDetails, MemoryAddResponse } from "./types.ts"
|
|
4
|
+
|
|
5
|
+
export function respondTo(result: AddMemoryResult): MemoryAddResponse {
|
|
6
|
+
if (result.succeeded) {
|
|
7
|
+
return reply(describeSaved(result.output), false, { vault: result.output.scope, path: result.output.notePath })
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
switch (result.reason) {
|
|
11
|
+
case "exists":
|
|
12
|
+
if ("existing" in result) {
|
|
13
|
+
return reply(describeExisting(result), true)
|
|
14
|
+
}
|
|
15
|
+
return reply(result.problems.join("\n"), true)
|
|
16
|
+
case "invalid":
|
|
17
|
+
return reply(
|
|
18
|
+
["Not saved. Fix and call again:", ...result.problems.map((problem) => `- ${problem}`)].join("\n"),
|
|
19
|
+
true,
|
|
20
|
+
)
|
|
21
|
+
case "no-project":
|
|
22
|
+
return reply([...result.problems, `Config: ${result.configPath}`, NO_PROJECT_GUIDANCE].join("\n"), true)
|
|
23
|
+
case "not-configured":
|
|
24
|
+
case "invalid-config":
|
|
25
|
+
return reply([...result.problems, SETUP_GUIDANCE].join("\n"), true)
|
|
26
|
+
case "unreadable":
|
|
27
|
+
return reply([...result.problems, `Config: ${result.configPath}`].join("\n"), true)
|
|
28
|
+
case "not-directory":
|
|
29
|
+
case "not-readable":
|
|
30
|
+
case "not-writable":
|
|
31
|
+
case "outside-vault":
|
|
32
|
+
case "vault-missing":
|
|
33
|
+
case "not-found":
|
|
34
|
+
case "cancelled":
|
|
35
|
+
case "stale-session":
|
|
36
|
+
case "admission-refused":
|
|
37
|
+
return reply(result.problems.join("\n"), true)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function describeSaved(memory: AddedMemory): string {
|
|
42
|
+
const warnings = memory.maintenanceProblems.map((problem) => `Maintenance warning: ${problem}`)
|
|
43
|
+
return [`Saved in ${memory.vaultName}: ${memory.notePath}`, ...warnings].join("\n")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function describeExisting(refusal: ExistingMemoryRefusal): string {
|
|
47
|
+
const { note } = refusal.existing
|
|
48
|
+
const problems = refusal.problems.map((problem) => `Not saved: ${problem}.`)
|
|
49
|
+
|
|
50
|
+
return [...problems, "", `Current note (${note.frontmatter.type}):`, note.body, "", SAME_POINT_GUIDANCE].join("\n")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function reply(text: string, isError: boolean, details?: AddedDetails): MemoryAddResponse {
|
|
54
|
+
return { content: [{ type: "text", text }], details, isError }
|
|
55
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Type from "typebox"
|
|
2
|
+
|
|
3
|
+
import { AddMemoryRequestSchema } from "#src/usecases"
|
|
4
|
+
|
|
5
|
+
export const MemoryAddParamsSchema = Type.Object(
|
|
6
|
+
{
|
|
7
|
+
scope: Type.With(AddMemoryRequestSchema.properties.scope, {
|
|
8
|
+
description: "global: about the user. project: about this project. If unsure, ask the user before calling.",
|
|
9
|
+
}),
|
|
10
|
+
folder: Type.With(AddMemoryRequestSchema.properties.folder, {
|
|
11
|
+
description:
|
|
12
|
+
"Subject folder in English, from general to specific (typescript/testing). Reuse a folder that already exists.",
|
|
13
|
+
}),
|
|
14
|
+
statement: Type.With(AddMemoryRequestSchema.properties.draft.properties.statement, {
|
|
15
|
+
description:
|
|
16
|
+
"The note name, in English: one short statement saying exactly what the note says (Use pnpm, never npm).",
|
|
17
|
+
}),
|
|
18
|
+
type: Type.With(AddMemoryRequestSchema.properties.draft.properties.type, {
|
|
19
|
+
description: "The kind of memory.",
|
|
20
|
+
}),
|
|
21
|
+
body: Type.With(AddMemoryRequestSchema.properties.draft.properties.body, {
|
|
22
|
+
description: "The full detail, in English. Never empty.",
|
|
23
|
+
}),
|
|
24
|
+
dontForget: Type.With(AddMemoryRequestSchema.properties.draft.properties.dontForget, {
|
|
25
|
+
description: "true only when it must be loaded in every session.",
|
|
26
|
+
}),
|
|
27
|
+
},
|
|
28
|
+
{ additionalProperties: false },
|
|
29
|
+
)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentToolResult, ToolDefinition } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
import type { Static } from "typebox"
|
|
3
|
+
|
|
4
|
+
import type { MemoryAddParamsSchema } from "./schemas.ts"
|
|
5
|
+
|
|
6
|
+
export type MemoryAddParams = Static<typeof MemoryAddParamsSchema>
|
|
7
|
+
|
|
8
|
+
export interface AddedDetails {
|
|
9
|
+
vault: "global" | "project"
|
|
10
|
+
path: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type MemoryAddTool = ToolDefinition<typeof MemoryAddParamsSchema, AddedDetails | undefined>
|
|
14
|
+
|
|
15
|
+
export type MemoryAddResponse = AgentToolResult<AddedDetails | undefined>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const MEMORY_ARCHIVE_TOOL_NAME = "memory_archive"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_ARCHIVE_TOOL_LABEL = "Memory archive"
|
|
4
|
+
|
|
5
|
+
export const MEMORY_ARCHIVE_TOOL_DESCRIPTION =
|
|
6
|
+
"Use only when the user explicitly asks to retire a memory with no successor. Read it with memory_get first."
|
|
7
|
+
|
|
8
|
+
export const ARCHIVED_PREFIX = "Archived in"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ChangeResponse, reportFailure, reportSuccess } from "#src/pi/change-report"
|
|
2
|
+
import type { MemoryPaths } from "#src/pi/context"
|
|
3
|
+
import { type MemorySessionKeeper, noSessionResponse } from "#src/pi/memory-session"
|
|
4
|
+
import { archiveMemory } from "#src/usecases"
|
|
5
|
+
import {
|
|
6
|
+
ARCHIVED_PREFIX,
|
|
7
|
+
MEMORY_ARCHIVE_TOOL_DESCRIPTION,
|
|
8
|
+
MEMORY_ARCHIVE_TOOL_LABEL,
|
|
9
|
+
MEMORY_ARCHIVE_TOOL_NAME,
|
|
10
|
+
} from "./constants.ts"
|
|
11
|
+
import { MemoryArchiveParamsSchema } from "./schemas.ts"
|
|
12
|
+
import type { MemoryArchiveTool } from "./types.ts"
|
|
13
|
+
|
|
14
|
+
export function memoryArchiveTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryArchiveTool {
|
|
15
|
+
return {
|
|
16
|
+
name: MEMORY_ARCHIVE_TOOL_NAME,
|
|
17
|
+
label: MEMORY_ARCHIVE_TOOL_LABEL,
|
|
18
|
+
description: MEMORY_ARCHIVE_TOOL_DESCRIPTION,
|
|
19
|
+
parameters: MemoryArchiveParamsSchema,
|
|
20
|
+
async execute(_toolCallId, params, signal, _onUpdate, ctx): Promise<ChangeResponse> {
|
|
21
|
+
const context = sessions.currentOperation(ctx.cwd, paths, signal)
|
|
22
|
+
if (!context) return noSessionResponse()
|
|
23
|
+
const result = await archiveMemory(params, context)
|
|
24
|
+
if (!result.succeeded) return reportFailure(result, params.path)
|
|
25
|
+
const { vault, archivedPath, maintenanceProblems } = result.output
|
|
26
|
+
return reportSuccess(`${ARCHIVED_PREFIX} ${vault}: ${archivedPath}`, maintenanceProblems)
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Type from "typebox"
|
|
2
|
+
|
|
3
|
+
import { ArchiveMemoryRequestSchema } from "#src/usecases"
|
|
4
|
+
|
|
5
|
+
export const MemoryArchiveParamsSchema = Type.Object(
|
|
6
|
+
{
|
|
7
|
+
vault: Type.With(ArchiveMemoryRequestSchema.properties.vault, {
|
|
8
|
+
description: "global: about the user. project: about this project. The vault the note was read from.",
|
|
9
|
+
}),
|
|
10
|
+
path: Type.With(ArchiveMemoryRequestSchema.properties.path, {
|
|
11
|
+
description: "The note's path, exactly as read with memory_get.",
|
|
12
|
+
}),
|
|
13
|
+
},
|
|
14
|
+
{ additionalProperties: false },
|
|
15
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
import type { Static } from "typebox"
|
|
3
|
+
|
|
4
|
+
import type { MemoryArchiveParamsSchema } from "./schemas.ts"
|
|
5
|
+
|
|
6
|
+
export type MemoryArchiveParams = Static<typeof MemoryArchiveParamsSchema>
|
|
7
|
+
|
|
8
|
+
export type MemoryArchiveTool = ToolDefinition<typeof MemoryArchiveParamsSchema, undefined>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { STATUS_LOADING, withMemoryStatus } from "#src/pi/context"
|
|
2
|
+
import { trackDontForget } from "#src/usecases"
|
|
3
|
+
import { BLOCK_SEPARATOR, MEMORY_BLOCK_SECTION, RELEVANT_LOAD_ERROR_PREFIX } from "./constants.ts"
|
|
4
|
+
import { loadNotices, renderLoadFailure, renderLoadNotice, renderMemoryBlock } from "./render.ts"
|
|
5
|
+
import type { BeforeAgentStartHandler, BlockStart, DontForgetLoader } from "./types.ts"
|
|
6
|
+
|
|
7
|
+
export class MemoryBlock {
|
|
8
|
+
#text: Promise<string | null> = Promise.resolve(null)
|
|
9
|
+
#load: DontForgetLoader
|
|
10
|
+
|
|
11
|
+
constructor(load: DontForgetLoader) {
|
|
12
|
+
this.#load = load
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
begin(start: BlockStart): void {
|
|
16
|
+
if (!start.configured) {
|
|
17
|
+
this.clear()
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
this.#text = withMemoryStatus(start.ctx, STATUS_LOADING, () => this.#loadBlock(start))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async #loadBlock(start: BlockStart): Promise<string | null> {
|
|
24
|
+
const dontForget = this.#load(start.context).then(
|
|
25
|
+
(result) => {
|
|
26
|
+
trackDontForget(start.loaded, result)
|
|
27
|
+
start.notify(loadNotices(result))
|
|
28
|
+
return renderMemoryBlock(result)
|
|
29
|
+
},
|
|
30
|
+
(error) => {
|
|
31
|
+
start.notify([renderLoadNotice(errorMessage(error))])
|
|
32
|
+
return renderLoadFailure(errorMessage(error))
|
|
33
|
+
},
|
|
34
|
+
)
|
|
35
|
+
const [block, extra] = await Promise.all([
|
|
36
|
+
dontForget,
|
|
37
|
+
start.relevant().catch((error) => this.#relevantFailed(start, error)),
|
|
38
|
+
])
|
|
39
|
+
return joined(block, extra)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#relevantFailed(start: BlockStart, error: Error | string): null {
|
|
43
|
+
start.notify([`${RELEVANT_LOAD_ERROR_PREFIX} ${errorMessage(error)}`])
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async settled(): Promise<void> {
|
|
48
|
+
await this.#text.then(noop, noop)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
clear(): void {
|
|
52
|
+
this.#text = Promise.resolve(null)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
beforeAgentStart(): BeforeAgentStartHandler {
|
|
56
|
+
return async (event) => {
|
|
57
|
+
const text = await this.#text
|
|
58
|
+
if (typeof text === "string") event.systemPromptOptions.sections[MEMORY_BLOCK_SECTION] = text
|
|
59
|
+
return undefined
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function noop(): void {}
|
|
65
|
+
|
|
66
|
+
function joined(block: string | null, extra: string | null): string | null {
|
|
67
|
+
if (typeof block !== "string") return null
|
|
68
|
+
if (typeof extra !== "string") return block
|
|
69
|
+
return [block, extra].join(BLOCK_SEPARATOR)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function errorMessage(error: Error | string): string {
|
|
73
|
+
if (error instanceof Error) return error.message
|
|
74
|
+
return String(error)
|
|
75
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const MEMORY_BLOCK_SECTION = "obsidian_memory"
|
|
2
|
+
|
|
3
|
+
export const BLOCK_INTRO =
|
|
4
|
+
"This is only part of your long-term memory, kept in Obsidian vaults. Use memory_search to find more, and memory_get to read a note in full or a folder's index."
|
|
5
|
+
|
|
6
|
+
export const DONT_FORGET_HEADING = "Don't forget notes:"
|
|
7
|
+
|
|
8
|
+
export const NO_DONT_FORGET = "No note is marked Don't forget."
|
|
9
|
+
|
|
10
|
+
export const BLOCK_NEEDS_FIXING_HEADING = "Needs fixing:"
|
|
11
|
+
|
|
12
|
+
export const NOTE_HEADING_PREFIX = "### "
|
|
13
|
+
|
|
14
|
+
export const BLOCK_FIELD_SEPARATOR = " · "
|
|
15
|
+
|
|
16
|
+
export const LOAD_FAILURE_PREFIX = "Could not load the"
|
|
17
|
+
|
|
18
|
+
export const LOAD_FAILURE_SUFFIX = "vault:"
|
|
19
|
+
|
|
20
|
+
export const LOAD_ERROR_PREFIX = "Could not load Don't forget notes:"
|
|
21
|
+
|
|
22
|
+
export const RELEVANT_LOAD_ERROR_PREFIX = "Could not load relevant notes:"
|
|
23
|
+
|
|
24
|
+
export const BLOCK_SEPARATOR = "\n\n"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { DontForgetVault, LoadDontForgetResult, LoadedDontForgetNote } from "#src/usecases"
|
|
2
|
+
import {
|
|
3
|
+
BLOCK_FIELD_SEPARATOR,
|
|
4
|
+
BLOCK_INTRO,
|
|
5
|
+
BLOCK_NEEDS_FIXING_HEADING,
|
|
6
|
+
BLOCK_SEPARATOR,
|
|
7
|
+
DONT_FORGET_HEADING,
|
|
8
|
+
LOAD_ERROR_PREFIX,
|
|
9
|
+
LOAD_FAILURE_PREFIX,
|
|
10
|
+
LOAD_FAILURE_SUFFIX,
|
|
11
|
+
NO_DONT_FORGET,
|
|
12
|
+
NOTE_HEADING_PREFIX,
|
|
13
|
+
} from "./constants.ts"
|
|
14
|
+
|
|
15
|
+
export function renderMemoryBlock(result: LoadDontForgetResult): string | null {
|
|
16
|
+
if (!result.succeeded) {
|
|
17
|
+
if (result.reason === "not-configured") return null
|
|
18
|
+
return renderLoadFailure(result.problems.join("; "))
|
|
19
|
+
}
|
|
20
|
+
const notes = result.output.vaults.flatMap((vault) => vault.notes)
|
|
21
|
+
const parts = [BLOCK_INTRO]
|
|
22
|
+
if (notes.length === 0) parts.push(NO_DONT_FORGET)
|
|
23
|
+
else parts.push(DONT_FORGET_HEADING, ...notes.map(renderNote))
|
|
24
|
+
for (const vault of result.output.vaults) parts.push(...renderFailure(vault))
|
|
25
|
+
return parts.join(BLOCK_SEPARATOR)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function renderNote(note: LoadedDontForgetNote): string {
|
|
29
|
+
const heading = `${NOTE_HEADING_PREFIX}${[note.vault, note.path, note.type].join(BLOCK_FIELD_SEPARATOR)}`
|
|
30
|
+
const lines = [heading, note.body]
|
|
31
|
+
if (note.problems.length > 0)
|
|
32
|
+
lines.push(BLOCK_NEEDS_FIXING_HEADING, ...note.problems.map((problem) => `- ${problem}`))
|
|
33
|
+
return lines.join("\n")
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function renderFailure(vault: DontForgetVault): string[] {
|
|
37
|
+
return vault.problems.map((problem) => `${LOAD_FAILURE_PREFIX} ${vault.vault} ${LOAD_FAILURE_SUFFIX} ${problem}`)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function loadNotices(result: LoadDontForgetResult): string[] {
|
|
41
|
+
if (!result.succeeded) {
|
|
42
|
+
if (result.reason === "not-configured") return []
|
|
43
|
+
return [renderLoadNotice(result.problems.join("; "))]
|
|
44
|
+
}
|
|
45
|
+
return result.output.vaults.flatMap(renderFailure)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function renderLoadNotice(message: string): string {
|
|
49
|
+
return `${LOAD_ERROR_PREFIX} ${message}`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function renderLoadFailure(message: string): string {
|
|
53
|
+
return [BLOCK_INTRO, renderLoadNotice(message)].join(BLOCK_SEPARATOR)
|
|
54
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BeforeAgentStartEvent, BeforeAgentStartEventResult } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
|
|
3
|
+
import type { MemoryPiContext } from "#src/pi/context"
|
|
4
|
+
import type { LoadDontForgetResult, LoadedMemory, MemoryOperationContext } from "#src/usecases"
|
|
5
|
+
|
|
6
|
+
export type BeforeAgentStartHandler = (
|
|
7
|
+
event: BeforeAgentStartEvent,
|
|
8
|
+
ctx: MemoryPiContext,
|
|
9
|
+
) => Promise<BeforeAgentStartEventResult | undefined>
|
|
10
|
+
|
|
11
|
+
export type RelevantLoader = () => Promise<string | null>
|
|
12
|
+
|
|
13
|
+
export type BlockNotifier = (messages: string[]) => void
|
|
14
|
+
|
|
15
|
+
export interface BlockStart {
|
|
16
|
+
ctx: MemoryPiContext
|
|
17
|
+
context: MemoryOperationContext
|
|
18
|
+
configured: boolean
|
|
19
|
+
loaded: LoadedMemory
|
|
20
|
+
relevant: RelevantLoader
|
|
21
|
+
notify: BlockNotifier
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type DontForgetLoader = (context: MemoryOperationContext) => Promise<LoadDontForgetResult>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const MEMORY_DOCTOR_COMMAND = "memory-doctor"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_DOCTOR_DESCRIPTION = "Check the memory for problems and offer to complete blank notes"
|
|
4
|
+
|
|
5
|
+
export const DOCTOR_TITLE = "Memory doctor"
|
|
6
|
+
|
|
7
|
+
export const DOCTOR_SETUP_HINT = "Run /memory-setup to create or repair the config."
|
|
8
|
+
|
|
9
|
+
export const NO_PROBLEMS = "no problems found."
|
|
10
|
+
|
|
11
|
+
export const COULD_NOT_CHECK = "could not be checked."
|
|
12
|
+
|
|
13
|
+
export const DOCTOR_NO_PROJECT_VAULT = "No project vault is registered for this folder."
|
|
14
|
+
|
|
15
|
+
export const DOCTOR_INVALID_HEADING = "Invalid notes:"
|
|
16
|
+
|
|
17
|
+
export const DUPLICATES_HEADING = "Copied ids:"
|
|
18
|
+
|
|
19
|
+
export const BLANK_HEADING = "Blank notes (no frontmatter):"
|
|
20
|
+
|
|
21
|
+
export const TEMPORARIES_HEADING = "Leftover temporary files:"
|
|
22
|
+
|
|
23
|
+
export const UNREADABLE_HEADING = "Files that could not be read:"
|
|
24
|
+
|
|
25
|
+
export const CUTOFF_SOURCES = new Map<string, string>([
|
|
26
|
+
["config", "config"],
|
|
27
|
+
["typesafe", "TypeSafe starting value"],
|
|
28
|
+
["missing", "missing"],
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
export const CUTOFFS_HINT = "set both cutoffs in /memory-setup, see docs/decision-thresholds.md"
|
|
32
|
+
|
|
33
|
+
export const MODELS_HEADING = "Models:"
|
|
34
|
+
|
|
35
|
+
export const COMPLETE_TYPE_TITLE = "Complete this blank note: which type is it?"
|
|
36
|
+
|
|
37
|
+
export const COMPLETE_BODY_TITLE = "Body of the new note (written in English)"
|
|
38
|
+
|
|
39
|
+
export const COMPLETE_CONFIRM_MESSAGE = "A new id and dates are added and the file is rewritten as a note."
|
|
40
|
+
|
|
41
|
+
export const COMPLETED = "Completed"
|
|
42
|
+
|
|
43
|
+
export const COMPLETE_SKIPPED = "Left unchanged:"
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { MemoryCommand, MemoryPaths, MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import type { MemorySessionKeeper } from "#src/pi/memory-session"
|
|
3
|
+
import {
|
|
4
|
+
BLANK_NOTE_TYPES,
|
|
5
|
+
type BlankFile,
|
|
6
|
+
completeBlankMemory,
|
|
7
|
+
type DecisionProbe,
|
|
8
|
+
type DiagnosedMemory,
|
|
9
|
+
diagnoseMemory,
|
|
10
|
+
type EmbeddingProbe,
|
|
11
|
+
type MemoryOperationContext,
|
|
12
|
+
type VaultReport,
|
|
13
|
+
} from "#src/usecases"
|
|
14
|
+
import {
|
|
15
|
+
COMPLETE_BODY_TITLE,
|
|
16
|
+
COMPLETE_CONFIRM_MESSAGE,
|
|
17
|
+
COMPLETE_SKIPPED,
|
|
18
|
+
COMPLETE_TYPE_TITLE,
|
|
19
|
+
COMPLETED,
|
|
20
|
+
DOCTOR_SETUP_HINT,
|
|
21
|
+
MEMORY_DOCTOR_DESCRIPTION,
|
|
22
|
+
} from "./constants.ts"
|
|
23
|
+
import { renderDoctorReport } from "./report.ts"
|
|
24
|
+
import type { BlankTarget, DoctorModelPort } from "./types.ts"
|
|
25
|
+
|
|
26
|
+
export function memoryDoctorCommand(
|
|
27
|
+
paths: MemoryPaths,
|
|
28
|
+
sessions: MemorySessionKeeper,
|
|
29
|
+
modelCachePath: string,
|
|
30
|
+
): MemoryCommand {
|
|
31
|
+
return {
|
|
32
|
+
description: MEMORY_DOCTOR_DESCRIPTION,
|
|
33
|
+
async handler(_args, ctx) {
|
|
34
|
+
if (!ctx.hasUI) return
|
|
35
|
+
const { registration } = sessions.registrationFlow(ctx, paths)
|
|
36
|
+
await runMemoryDoctor(ctx, registration, modelCachePath)
|
|
37
|
+
},
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function runMemoryDoctor(
|
|
42
|
+
ctx: MemoryPiContext,
|
|
43
|
+
context: MemoryOperationContext,
|
|
44
|
+
modelCachePath: string,
|
|
45
|
+
): Promise<void> {
|
|
46
|
+
const port: DoctorModelPort = {
|
|
47
|
+
find: (provider, id) => ctx.modelRegistry.find(provider, id),
|
|
48
|
+
configured: (model) => ctx.modelRegistry.hasConfiguredAuth(model),
|
|
49
|
+
auth: (model) => ctx.modelRegistry.getApiKeyAndHeaders(model),
|
|
50
|
+
}
|
|
51
|
+
const diagnosed = await diagnoseMemory(
|
|
52
|
+
{ port, embeddings: embeddingProbeOf(ctx, modelCachePath), decision: decisionProbeOf(ctx) },
|
|
53
|
+
context,
|
|
54
|
+
)
|
|
55
|
+
if (!diagnosed.succeeded) {
|
|
56
|
+
return ctx.ui.notify([...diagnosed.problems, DOCTOR_SETUP_HINT].join("\n"), "error")
|
|
57
|
+
}
|
|
58
|
+
ctx.ui.notify(renderDoctorReport(diagnosed.output), levelOf(diagnosed.output))
|
|
59
|
+
for (const target of blankTargets(diagnosed.output)) await offerCompletion(ctx, context, target)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function levelOf(diagnosed: DiagnosedMemory): "info" | "warning" {
|
|
63
|
+
for (const report of diagnosed.vaults) {
|
|
64
|
+
if ("problems" in report) return "warning"
|
|
65
|
+
const { diagnosis } = report
|
|
66
|
+
const found = [
|
|
67
|
+
diagnosis.invalid,
|
|
68
|
+
diagnosis.duplicateIds,
|
|
69
|
+
diagnosis.blank,
|
|
70
|
+
diagnosis.temporaries,
|
|
71
|
+
diagnosis.crowdedFolders,
|
|
72
|
+
]
|
|
73
|
+
if (found.some((items) => items.length > 0) || report.unreadable.length > 0) return "warning"
|
|
74
|
+
}
|
|
75
|
+
if (diagnosed.models.some((report) => report.check.status !== "ok")) return "warning"
|
|
76
|
+
if (diagnosed.embeddings.status !== "ready") return "warning"
|
|
77
|
+
if ("problem" in diagnosed.decision) return "warning"
|
|
78
|
+
if (diagnosed.cutoffs.gate.source === "missing" || diagnosed.cutoffs.relevance.source === "missing") return "warning"
|
|
79
|
+
return "info"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function blankTargets(diagnosed: DiagnosedMemory): BlankTarget[] {
|
|
83
|
+
const reports = diagnosed.vaults.filter((report): report is VaultReport => "blanks" in report)
|
|
84
|
+
return reports.flatMap((report) => report.blanks.map((blank: BlankFile) => ({ vault: report.vault, blank })))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function offerCompletion(
|
|
88
|
+
ctx: MemoryPiContext,
|
|
89
|
+
context: MemoryOperationContext,
|
|
90
|
+
target: BlankTarget,
|
|
91
|
+
): Promise<void> {
|
|
92
|
+
const { vault, blank } = target
|
|
93
|
+
const label = `${vault}/${blank.path}`
|
|
94
|
+
const type = await ctx.ui.select(`${COMPLETE_TYPE_TITLE} (${label})`, [...BLANK_NOTE_TYPES])
|
|
95
|
+
if (!isNoteType(type)) return ctx.ui.notify(`${COMPLETE_SKIPPED} ${label}`, "info")
|
|
96
|
+
let body = ""
|
|
97
|
+
if (blank.empty) {
|
|
98
|
+
const typed = await ctx.ui.input(`${COMPLETE_BODY_TITLE} (${label})`)
|
|
99
|
+
if (typeof typed !== "string" || typed.trim() === "") return ctx.ui.notify(`${COMPLETE_SKIPPED} ${label}`, "info")
|
|
100
|
+
body = typed
|
|
101
|
+
}
|
|
102
|
+
const confirmed = await ctx.ui.confirm(`Complete ${label} as a ${type} note?`, COMPLETE_CONFIRM_MESSAGE)
|
|
103
|
+
if (!confirmed) return ctx.ui.notify(`${COMPLETE_SKIPPED} ${label}`, "info")
|
|
104
|
+
const result = await completeBlankMemory(
|
|
105
|
+
{ vault, path: blank.path, expectedHash: blank.rawHash, type, body },
|
|
106
|
+
context,
|
|
107
|
+
)
|
|
108
|
+
if (!result.succeeded) return ctx.ui.notify(result.problems.join("\n"), "error")
|
|
109
|
+
const warnings = result.output.maintenanceProblems.map((problem) => `\nMaintenance warning: ${problem}`)
|
|
110
|
+
ctx.ui.notify(`${COMPLETED} ${label} as a ${type} note.${warnings.join("")}`, "info")
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function isNoteType(value: string | undefined): value is (typeof BLANK_NOTE_TYPES)[number] {
|
|
114
|
+
return typeof value === "string" && BLANK_NOTE_TYPES.some((type) => type === value)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function embeddingProbeOf(ctx: MemoryPiContext, modelCachePath: string): EmbeddingProbe {
|
|
118
|
+
return {
|
|
119
|
+
modelCachePath,
|
|
120
|
+
async hasCredentials(provider) {
|
|
121
|
+
const key = await ctx.modelRegistry.getApiKeyForProvider(provider)
|
|
122
|
+
return typeof key === "string" && key !== ""
|
|
123
|
+
},
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function decisionProbeOf(ctx: MemoryPiContext): DecisionProbe {
|
|
128
|
+
return {
|
|
129
|
+
hasClassifier: (provider, model) => typeof ctx.modelRegistry.findOfType("classifier", provider, model) === "object",
|
|
130
|
+
async hasCredentials(provider) {
|
|
131
|
+
const key = await ctx.modelRegistry.getApiKeyForProvider(provider)
|
|
132
|
+
return typeof key === "string" && key !== ""
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
}
|