pi-obsidian-memory 0.0.0 → 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 +45 -7
- 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 -6
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { NO_SESSION_NOTICE } from "./constants.ts"
|
|
2
|
+
import type { NoSessionResponse } from "./types.ts"
|
|
3
|
+
|
|
4
|
+
export function noSessionResponse(): NoSessionResponse {
|
|
5
|
+
return { content: [{ type: "text", text: NO_SESSION_NOTICE }], details: undefined, isError: true }
|
|
6
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentToolResult, SessionShutdownEvent } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
|
|
3
|
+
import type { MemoryPiContext } from "#src/pi/context"
|
|
4
|
+
import type { Done } from "#src/shared"
|
|
5
|
+
import type { MemoryOperationContext, MemorySession, RegistrationContext } from "#src/usecases"
|
|
6
|
+
|
|
7
|
+
export interface RegistrationFlow {
|
|
8
|
+
session: MemorySession
|
|
9
|
+
registration: RegistrationContext
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type SessionShutdownHandler = (event: SessionShutdownEvent, ctx: MemoryPiContext) => Promise<void>
|
|
13
|
+
|
|
14
|
+
export type NoSessionResponse = AgentToolResult<undefined>
|
|
15
|
+
|
|
16
|
+
export interface ReadRefusal {
|
|
17
|
+
succeeded: false
|
|
18
|
+
reason: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type ReadOutcome = Done | ReadRefusal
|
|
22
|
+
|
|
23
|
+
export type ReadRun<Outcome extends ReadOutcome> = (context: MemoryOperationContext) => Promise<Outcome>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { EmbeddingChoice } from "./types.ts"
|
|
2
|
+
|
|
3
|
+
export const CURRENT_MARK = "(current)"
|
|
4
|
+
|
|
5
|
+
export const IN_USE_MARK = "(in use)"
|
|
6
|
+
|
|
7
|
+
export const PRICE_SEPARATOR = " · "
|
|
8
|
+
|
|
9
|
+
export const PRICE_DECIMALS = 4
|
|
10
|
+
|
|
11
|
+
export const DISCLOSURE_TITLE = "Before setup: what leaves this machine"
|
|
12
|
+
|
|
13
|
+
export const CHAT_MODELS_DISCLOSURE =
|
|
14
|
+
"Capture and the memory agent send conversation and note content to the chat model you chose."
|
|
15
|
+
|
|
16
|
+
export const JEV_DISCLOSURE = "TypeSafe (Jev) receives your messages and candidate notes."
|
|
17
|
+
|
|
18
|
+
export const REMOTE_EMBEDDINGS_DISCLOSURE =
|
|
19
|
+
"The remote embeddings provider receives note content, secrets included, and search queries."
|
|
20
|
+
|
|
21
|
+
export const SETTINGS_TITLE = "Memory settings (Done or Escape leaves)"
|
|
22
|
+
|
|
23
|
+
export const DONE_LABEL = "Done"
|
|
24
|
+
|
|
25
|
+
export const SAVED = "Saved:"
|
|
26
|
+
|
|
27
|
+
export const RELOAD_NOTE =
|
|
28
|
+
"The Don't forget notes already loaded into this conversation's memory block update at the next session or /reload."
|
|
29
|
+
|
|
30
|
+
export const CAPTURE_MODEL_TITLE =
|
|
31
|
+
"Chat model for automatic capture (a cheap model is usually enough; Escape keeps the current one)"
|
|
32
|
+
|
|
33
|
+
export const AGENT_MODEL_TITLE =
|
|
34
|
+
"Chat model for the memory agent (it searches memory for each message; Escape keeps the current one)"
|
|
35
|
+
|
|
36
|
+
export const DECISION_TITLE = "Decision model (Escape keeps the current one)"
|
|
37
|
+
|
|
38
|
+
export const JEV_OPTION = "Jev (TypeSafe, by API)"
|
|
39
|
+
|
|
40
|
+
export const LAYA_OPTION = "Laya (local)"
|
|
41
|
+
|
|
42
|
+
export const LAYA_ENDPOINT_TITLE = "Laya endpoint (empty keeps the current one)"
|
|
43
|
+
|
|
44
|
+
export const LAYA_DEFAULT_ENDPOINT = "http://127.0.0.1:8000/v1/systemone"
|
|
45
|
+
|
|
46
|
+
export const EMBEDDINGS_TITLE = "Embeddings provider (Escape keeps the current one)"
|
|
47
|
+
|
|
48
|
+
export const NONE_WORD = "none"
|
|
49
|
+
|
|
50
|
+
export const NO_PROJECTS_NOTICE = "No project is registered. Run /memory-init in a project folder to register one."
|
|
51
|
+
|
|
52
|
+
export const PROJECT_TITLE = "Project (Escape goes back)"
|
|
53
|
+
|
|
54
|
+
export const PROJECT_ACTION_TITLE = "What to do with this project? (Escape goes back)"
|
|
55
|
+
|
|
56
|
+
export const PROJECT_CHANGE_VAULT = "Change its vault"
|
|
57
|
+
|
|
58
|
+
export const PROJECT_REMOVE = "Remove it from the memory"
|
|
59
|
+
|
|
60
|
+
export const PROJECT_VAULT_TITLE = "Project vault (an existing folder; empty keeps the current one)"
|
|
61
|
+
|
|
62
|
+
export const EMBEDDING_CHOICES: EmbeddingChoice[] = [
|
|
63
|
+
{
|
|
64
|
+
value: { provider: "local", model: "Xenova/multilingual-e5-small" },
|
|
65
|
+
label: "local (Xenova/multilingual-e5-small)",
|
|
66
|
+
},
|
|
67
|
+
{ value: { provider: "openai", model: "text-embedding-3-small" }, label: "openai (text-embedding-3-small)" },
|
|
68
|
+
{ value: { provider: "google", model: "gemini-embedding-001" }, label: "google (gemini-embedding-001)" },
|
|
69
|
+
]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { parseSettingNumber } from "#src/usecases"
|
|
2
|
+
import { NONE_WORD } from "./constants.ts"
|
|
3
|
+
import { chooseModel } from "./models.ts"
|
|
4
|
+
import { saveChange } from "./save.ts"
|
|
5
|
+
import type { LineEdit, ModelEditSpec, NumberEditSpec, SwitchEditSpec } from "./types.ts"
|
|
6
|
+
|
|
7
|
+
export function modelEdit(spec: ModelEditSpec): LineEdit {
|
|
8
|
+
return async (env) => {
|
|
9
|
+
const chosen = await chooseModel(env.ctx, spec.title, spec.current, {})
|
|
10
|
+
if (!chosen) return
|
|
11
|
+
if (chosen.provider === spec.current.provider && chosen.id === spec.current.id) return
|
|
12
|
+
await saveChange(env, {
|
|
13
|
+
change: { kind: spec.kind, model: chosen },
|
|
14
|
+
what: `${spec.what} is now ${chosen.provider}/${chosen.id}`,
|
|
15
|
+
reload: false,
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function switchEdit(spec: SwitchEditSpec): LineEdit {
|
|
21
|
+
return async (env) => {
|
|
22
|
+
const value = !spec.current
|
|
23
|
+
let state = "off"
|
|
24
|
+
if (value) state = "on"
|
|
25
|
+
await saveChange(env, {
|
|
26
|
+
change: { kind: "captureSwitch", name: spec.name, value },
|
|
27
|
+
what: `${spec.what} is now ${state}`,
|
|
28
|
+
reload: false,
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function numberEdit(spec: NumberEditSpec): LineEdit {
|
|
34
|
+
return async (env) => {
|
|
35
|
+
const answer = await env.ctx.ui.input(spec.title, spec.current)
|
|
36
|
+
if (typeof answer !== "string" || answer.trim() === "") return
|
|
37
|
+
const typed = answer.trim()
|
|
38
|
+
if (spec.clear && typed.toLowerCase() === NONE_WORD) {
|
|
39
|
+
await saveChange(env, { change: spec.clear, what: `${spec.what} is now not set`, reload: false })
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
const parsed = parseSettingNumber(typed, spec.kind)
|
|
43
|
+
if (!parsed.succeeded) return env.ctx.ui.notify(`${spec.what}: ${parsed.problems.join("; ")}`, "error")
|
|
44
|
+
await saveChange(env, { change: spec.change(parsed.output), what: `${spec.what} is now ${typed}`, reload: false })
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./constants.ts"
|
|
2
|
+
export * from "./edits.ts"
|
|
3
|
+
export * from "./lines.ts"
|
|
4
|
+
export * from "./models.ts"
|
|
5
|
+
export * from "./projects.ts"
|
|
6
|
+
export * from "./providers.ts"
|
|
7
|
+
export * from "./save.ts"
|
|
8
|
+
export * from "./screen.ts"
|
|
9
|
+
export * from "./types.ts"
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { CutoffValue, MemoryConfig } from "#src/usecases"
|
|
2
|
+
import { resolveCutoffs } from "#src/usecases"
|
|
3
|
+
import { AGENT_MODEL_TITLE, CAPTURE_MODEL_TITLE } from "./constants.ts"
|
|
4
|
+
import { modelEdit, numberEdit, switchEdit } from "./edits.ts"
|
|
5
|
+
import { projectsEdit } from "./projects.ts"
|
|
6
|
+
import { decisionEdit, embeddingsEdit } from "./providers.ts"
|
|
7
|
+
import type { CaptureCountName, CaptureSwitchName, NumberChange, SettingLine } from "./types.ts"
|
|
8
|
+
|
|
9
|
+
function cutoffText(cutoff: CutoffValue): string {
|
|
10
|
+
if (typeof cutoff.value !== "number") return "not set"
|
|
11
|
+
if (cutoff.source === "config") return `${cutoff.value} (set)`
|
|
12
|
+
return `${cutoff.value} (TypeSafe starting value)`
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function decisionText(config: MemoryConfig): string {
|
|
16
|
+
const { decisionModel } = config
|
|
17
|
+
if (decisionModel.provider === "laya") return `Laya (${decisionModel.endpoint})`
|
|
18
|
+
return "Jev (TypeSafe)"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function captureSwitchLine(label: string, name: CaptureSwitchName, config: MemoryConfig): SettingLine {
|
|
22
|
+
const current = config.capture[name]
|
|
23
|
+
let state = "off"
|
|
24
|
+
if (current) state = "on"
|
|
25
|
+
return { label: `${label}: ${state}`, edit: switchEdit({ name, what: label.toLowerCase(), current }) }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function cutoffLine(label: string, which: "gate" | "relevance", config: MemoryConfig): SettingLine {
|
|
29
|
+
const cutoff = resolveCutoffs(config.decisionModel)[which]
|
|
30
|
+
const title = `${label}, 0 to 1 (currently ${cutoffText(cutoff)}; type none to clear it; empty keeps it)`
|
|
31
|
+
const kind = `${which}Threshold` as const
|
|
32
|
+
return {
|
|
33
|
+
label: `${label}: ${cutoffText(cutoff)}`,
|
|
34
|
+
edit: numberEdit({
|
|
35
|
+
title,
|
|
36
|
+
what: label.toLowerCase(),
|
|
37
|
+
kind: "threshold",
|
|
38
|
+
current: cutoffText(cutoff),
|
|
39
|
+
change: (value) => ({ kind, value }),
|
|
40
|
+
clear: { kind, value: null },
|
|
41
|
+
}),
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function countLine(label: string, unit: string, current: number, change: NumberChange): SettingLine {
|
|
46
|
+
return {
|
|
47
|
+
label: `${label}: ${current}${unit}`,
|
|
48
|
+
edit: numberEdit({
|
|
49
|
+
title: `${label} (a whole number of 1 or more; currently ${current}; empty keeps it)`,
|
|
50
|
+
what: label.toLowerCase(),
|
|
51
|
+
kind: "count",
|
|
52
|
+
current: String(current),
|
|
53
|
+
change,
|
|
54
|
+
clear: null,
|
|
55
|
+
}),
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function captureCountLine(label: string, unit: string, name: CaptureCountName, config: MemoryConfig): SettingLine {
|
|
60
|
+
return countLine(label, unit, config.capture[name], (value) => ({ kind: "captureCount", name, value }))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function captureLines(config: MemoryConfig): SettingLine[] {
|
|
64
|
+
return [
|
|
65
|
+
{
|
|
66
|
+
label: `Capture model: ${config.capture.model.provider}/${config.capture.model.id}`,
|
|
67
|
+
edit: modelEdit({
|
|
68
|
+
title: CAPTURE_MODEL_TITLE,
|
|
69
|
+
what: "capture model",
|
|
70
|
+
kind: "captureModel",
|
|
71
|
+
current: config.capture.model,
|
|
72
|
+
}),
|
|
73
|
+
},
|
|
74
|
+
captureSwitchLine("Review during the session", "reviewEnabled", config),
|
|
75
|
+
captureCountLine("Review every", " turns", "nudgeInterval", config),
|
|
76
|
+
captureCountLine("Review after tool calls", "", "nudgeToolCalls", config),
|
|
77
|
+
captureSwitchLine("Flush at compaction", "flushOnCompact", config),
|
|
78
|
+
captureSwitchLine("Flush at session end", "flushOnShutdown", config),
|
|
79
|
+
captureCountLine("Flush minimum user messages", "", "flushMinTurns", config),
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function settingLines(config: MemoryConfig): SettingLine[] {
|
|
84
|
+
const { limits } = config
|
|
85
|
+
return [
|
|
86
|
+
...captureLines(config),
|
|
87
|
+
{
|
|
88
|
+
label: `Memory agent model: ${config.memoryAgent.model.provider}/${config.memoryAgent.model.id}`,
|
|
89
|
+
edit: modelEdit({
|
|
90
|
+
title: AGENT_MODEL_TITLE,
|
|
91
|
+
what: "memory agent model",
|
|
92
|
+
kind: "agentModel",
|
|
93
|
+
current: config.memoryAgent.model,
|
|
94
|
+
}),
|
|
95
|
+
},
|
|
96
|
+
{ label: `Decision model: ${decisionText(config)}`, edit: decisionEdit },
|
|
97
|
+
cutoffLine("Gate cutoff", "gate", config),
|
|
98
|
+
cutoffLine("Relevance cutoff", "relevance", config),
|
|
99
|
+
{ label: `Embeddings: ${config.embeddings.provider} (${config.embeddings.model})`, edit: embeddingsEdit },
|
|
100
|
+
countLine("Context budget", " characters", config.context.budgetChars, (value) => ({ kind: "budgetChars", value })),
|
|
101
|
+
countLine("Max note body", " characters", limits.maxBodyChars, (value) => ({
|
|
102
|
+
kind: "limit",
|
|
103
|
+
name: "maxBodyChars",
|
|
104
|
+
value,
|
|
105
|
+
})),
|
|
106
|
+
countLine("Max statement", " characters", limits.maxStatementChars, (value) => ({
|
|
107
|
+
kind: "limit",
|
|
108
|
+
name: "maxStatementChars",
|
|
109
|
+
value,
|
|
110
|
+
})),
|
|
111
|
+
countLine("Max notes per folder", "", limits.maxNotesPerFolder, (value) => ({
|
|
112
|
+
kind: "limit",
|
|
113
|
+
name: "maxNotesPerFolder",
|
|
114
|
+
value,
|
|
115
|
+
})),
|
|
116
|
+
{ label: `Global vault: ${config.global.vault}`, edit: (env) => env.deps.changeGlobalVault(env.context) },
|
|
117
|
+
{ label: `Projects: ${config.projects.length}`, edit: projectsEdit },
|
|
118
|
+
]
|
|
119
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ChatModelSource, MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import type { ChatModelReference } from "#src/usecases"
|
|
3
|
+
import { CURRENT_MARK, IN_USE_MARK, PRICE_DECIMALS, PRICE_SEPARATOR } from "./constants.ts"
|
|
4
|
+
import type { CurrentModel, ModelChoice } from "./types.ts"
|
|
5
|
+
|
|
6
|
+
function priceText(value: number): string {
|
|
7
|
+
return `$${Number(value.toFixed(PRICE_DECIMALS))}`
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function modelLabel(model: ChatModelSource, mark: string | null): string {
|
|
11
|
+
let label = `${model.provider}/${model.id}`
|
|
12
|
+
if (mark) label = `${label} ${mark}`
|
|
13
|
+
if (!model.cost) return label
|
|
14
|
+
const prices = `${priceText(model.cost.input)} in / ${priceText(model.cost.output)} out per 1M tokens`
|
|
15
|
+
return `${label}${PRICE_SEPARATOR}${prices}`
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function sameModel(model: ChatModelSource, current: CurrentModel): boolean {
|
|
19
|
+
return model.provider === current.provider && model.id === current.id
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function inputPrice(model: ChatModelSource): number {
|
|
23
|
+
if (model.cost) return model.cost.input
|
|
24
|
+
return Number.POSITIVE_INFINITY
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function byPrice(left: ChatModelSource, right: ChatModelSource): number {
|
|
28
|
+
const leftPrice = inputPrice(left)
|
|
29
|
+
const rightPrice = inputPrice(right)
|
|
30
|
+
if (leftPrice === rightPrice) return 0
|
|
31
|
+
if (leftPrice < rightPrice) return -1
|
|
32
|
+
return 1
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function firstChoice(available: ChatModelSource[], current: CurrentModel, inUse: CurrentModel): ModelChoice | null {
|
|
36
|
+
let first = current
|
|
37
|
+
let mark = CURRENT_MARK
|
|
38
|
+
if (typeof current.provider !== "string" || typeof current.id !== "string") {
|
|
39
|
+
first = inUse
|
|
40
|
+
mark = IN_USE_MARK
|
|
41
|
+
}
|
|
42
|
+
if (typeof first.provider !== "string" || typeof first.id !== "string") return null
|
|
43
|
+
const reference = { provider: first.provider, id: first.id }
|
|
44
|
+
let shown: ChatModelSource = reference
|
|
45
|
+
const known = available.find((model) => sameModel(model, first))
|
|
46
|
+
if (known) shown = known
|
|
47
|
+
return { label: modelLabel(shown, mark), reference, current: true }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function modelChoices(available: ChatModelSource[], current: CurrentModel, inUse: CurrentModel): ModelChoice[] {
|
|
51
|
+
const first = firstChoice(available, current, inUse)
|
|
52
|
+
const others = available
|
|
53
|
+
.filter((model) => !first || !sameModel(model, first.reference))
|
|
54
|
+
.sort(byPrice)
|
|
55
|
+
.map((model) => ({
|
|
56
|
+
label: modelLabel(model, null),
|
|
57
|
+
reference: { provider: model.provider, id: model.id },
|
|
58
|
+
current: false,
|
|
59
|
+
}))
|
|
60
|
+
if (!first) return others
|
|
61
|
+
return [first, ...others]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function chooseModel(
|
|
65
|
+
ctx: MemoryPiContext,
|
|
66
|
+
title: string,
|
|
67
|
+
current: CurrentModel,
|
|
68
|
+
inUse: CurrentModel,
|
|
69
|
+
): Promise<ChatModelReference | null> {
|
|
70
|
+
const choices = modelChoices(ctx.modelRegistry.getAvailable(), current, inUse)
|
|
71
|
+
const answer = await ctx.ui.select(
|
|
72
|
+
title,
|
|
73
|
+
choices.map((choice) => choice.label),
|
|
74
|
+
)
|
|
75
|
+
const chosen = choices.find((choice) => choice.label === answer)
|
|
76
|
+
if (chosen) return chosen.reference
|
|
77
|
+
if (typeof answer === "string" && answer !== "") return null
|
|
78
|
+
const kept = choices.find((choice) => choice.current)
|
|
79
|
+
if (kept) return kept.reference
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ProjectEntry } from "#src/usecases"
|
|
2
|
+
import {
|
|
3
|
+
NO_PROJECTS_NOTICE,
|
|
4
|
+
PROJECT_ACTION_TITLE,
|
|
5
|
+
PROJECT_CHANGE_VAULT,
|
|
6
|
+
PROJECT_REMOVE,
|
|
7
|
+
PROJECT_TITLE,
|
|
8
|
+
PROJECT_VAULT_TITLE,
|
|
9
|
+
} from "./constants.ts"
|
|
10
|
+
import { saveChange } from "./save.ts"
|
|
11
|
+
import type { SettingsEnv } from "./types.ts"
|
|
12
|
+
|
|
13
|
+
export function projectLabel(project: ProjectEntry): string {
|
|
14
|
+
return `${project.name} — ${project.folder} → ${project.vault}`
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function repoint(env: SettingsEnv, project: ProjectEntry): Promise<void> {
|
|
18
|
+
const answer = await env.ctx.ui.input(PROJECT_VAULT_TITLE, project.vault)
|
|
19
|
+
if (typeof answer !== "string" || answer.trim() === "") return
|
|
20
|
+
await saveChange(env, {
|
|
21
|
+
change: { kind: "projectVault", name: project.name, vault: answer.trim() },
|
|
22
|
+
what: `project ${project.name} now uses ${answer.trim()}`,
|
|
23
|
+
reload: true,
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function remove(env: SettingsEnv, project: ProjectEntry): Promise<void> {
|
|
28
|
+
await saveChange(env, {
|
|
29
|
+
change: { kind: "removeProject", name: project.name },
|
|
30
|
+
what: `project ${project.name} was removed from the memory`,
|
|
31
|
+
reload: true,
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function projectsEdit(env: SettingsEnv): Promise<void> {
|
|
36
|
+
const { projects } = env.state.config
|
|
37
|
+
if (projects.length === 0) return env.ctx.ui.notify(NO_PROJECTS_NOTICE, "info")
|
|
38
|
+
const labels = projects.map(projectLabel)
|
|
39
|
+
const answer = await env.ctx.ui.select(PROJECT_TITLE, labels)
|
|
40
|
+
const project = projects.find((_entry, index) => labels[index] === answer)
|
|
41
|
+
if (!project) return
|
|
42
|
+
const actions = [PROJECT_CHANGE_VAULT, PROJECT_REMOVE]
|
|
43
|
+
const action = await env.ctx.ui.select(PROJECT_ACTION_TITLE, actions)
|
|
44
|
+
if (action === PROJECT_CHANGE_VAULT) return repoint(env, project)
|
|
45
|
+
if (action === PROJECT_REMOVE) return remove(env, project)
|
|
46
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CURRENT_MARK,
|
|
3
|
+
DECISION_TITLE,
|
|
4
|
+
EMBEDDING_CHOICES,
|
|
5
|
+
EMBEDDINGS_TITLE,
|
|
6
|
+
JEV_DISCLOSURE,
|
|
7
|
+
JEV_OPTION,
|
|
8
|
+
LAYA_DEFAULT_ENDPOINT,
|
|
9
|
+
LAYA_ENDPOINT_TITLE,
|
|
10
|
+
LAYA_OPTION,
|
|
11
|
+
REMOTE_EMBEDDINGS_DISCLOSURE,
|
|
12
|
+
} from "./constants.ts"
|
|
13
|
+
import { saveChange } from "./save.ts"
|
|
14
|
+
import type { SettingsEnv } from "./types.ts"
|
|
15
|
+
|
|
16
|
+
async function askEndpoint(env: SettingsEnv): Promise<string | null> {
|
|
17
|
+
let placeholder = LAYA_DEFAULT_ENDPOINT
|
|
18
|
+
const { decisionModel } = env.state.config
|
|
19
|
+
if (decisionModel.provider === "laya") placeholder = decisionModel.endpoint
|
|
20
|
+
const answer = await env.ctx.ui.input(LAYA_ENDPOINT_TITLE, placeholder)
|
|
21
|
+
if (typeof answer !== "string") return null
|
|
22
|
+
const typed = answer.trim()
|
|
23
|
+
if (typed !== "") return typed
|
|
24
|
+
if (decisionModel.provider === "laya") return decisionModel.endpoint
|
|
25
|
+
return null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function useLaya(env: SettingsEnv): Promise<void> {
|
|
29
|
+
const endpoint = await askEndpoint(env)
|
|
30
|
+
if (typeof endpoint !== "string") return
|
|
31
|
+
await saveChange(env, {
|
|
32
|
+
change: { kind: "decision", provider: "laya", endpoint },
|
|
33
|
+
what: "decision model is now Laya (local). It ships no cutoffs: set the gate and relevance cutoffs here, or per-message memory stays off",
|
|
34
|
+
reload: false,
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function useJev(env: SettingsEnv): Promise<void> {
|
|
39
|
+
env.ctx.ui.notify(JEV_DISCLOSURE, "warning")
|
|
40
|
+
await saveChange(env, {
|
|
41
|
+
change: { kind: "decision", provider: "typesafe" },
|
|
42
|
+
what: "decision model is now Jev. The cutoffs start from TypeSafe's values (0.5 and 0.5)",
|
|
43
|
+
reload: false,
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function decisionEdit(env: SettingsEnv): Promise<void> {
|
|
48
|
+
const jevCurrent = env.state.config.decisionModel.provider === "typesafe"
|
|
49
|
+
let options = [`${JEV_OPTION} ${CURRENT_MARK}`, LAYA_OPTION]
|
|
50
|
+
if (!jevCurrent) options = [`${LAYA_OPTION} ${CURRENT_MARK}`, JEV_OPTION]
|
|
51
|
+
const answer = await env.ctx.ui.select(DECISION_TITLE, options)
|
|
52
|
+
if (typeof answer !== "string" || !options.includes(answer)) return
|
|
53
|
+
if (answer.startsWith(JEV_OPTION)) {
|
|
54
|
+
if (!jevCurrent) await useJev(env)
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
await useLaya(env)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function embeddingsEdit(env: SettingsEnv): Promise<void> {
|
|
61
|
+
const current = env.state.config.embeddings
|
|
62
|
+
const same = (provider: string) => provider === current.provider
|
|
63
|
+
const labels = EMBEDDING_CHOICES.filter((choice) => same(choice.value.provider)).map(
|
|
64
|
+
(choice) => `${choice.label} ${CURRENT_MARK}`,
|
|
65
|
+
)
|
|
66
|
+
const others = EMBEDDING_CHOICES.filter((choice) => !same(choice.value.provider))
|
|
67
|
+
const options = [...labels, ...others.map((choice) => choice.label)]
|
|
68
|
+
const answer = await env.ctx.ui.select(EMBEDDINGS_TITLE, options)
|
|
69
|
+
const picked = others.find((choice) => choice.label === answer)
|
|
70
|
+
if (!picked) return
|
|
71
|
+
if (picked.value.provider !== "local") env.ctx.ui.notify(REMOTE_EMBEDDINGS_DISCLOSURE, "warning")
|
|
72
|
+
await saveChange(env, {
|
|
73
|
+
change: { kind: "embeddings", embeddings: picked.value },
|
|
74
|
+
what: `embeddings are now ${picked.label}`,
|
|
75
|
+
reload: false,
|
|
76
|
+
})
|
|
77
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { changeMemorySettings } from "#src/usecases"
|
|
2
|
+
import { RELOAD_NOTE, SAVED } from "./constants.ts"
|
|
3
|
+
import type { Saving, SettingsEnv } from "./types.ts"
|
|
4
|
+
|
|
5
|
+
export async function saveChange(env: SettingsEnv, saving: Saving): Promise<boolean> {
|
|
6
|
+
const result = await changeMemorySettings({ change: saving.change, expectedHash: env.state.hash }, env.context)
|
|
7
|
+
if (!result.succeeded) {
|
|
8
|
+
if (result.reason !== "cancelled") env.ctx.ui.notify(result.problems.join("\n"), "error")
|
|
9
|
+
return false
|
|
10
|
+
}
|
|
11
|
+
const lines = [`${SAVED} ${saving.what}.`]
|
|
12
|
+
if (saving.reload) lines.push(RELOAD_NOTE)
|
|
13
|
+
lines.push(...result.output.warnings.map((warning) => `- ${warning}`))
|
|
14
|
+
env.ctx.ui.notify(lines.join("\n"), "info")
|
|
15
|
+
return true
|
|
16
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import { prepareMemorySettings, type RegistrationContext } from "#src/usecases"
|
|
3
|
+
import { DONE_LABEL, SETTINGS_TITLE } from "./constants.ts"
|
|
4
|
+
import { settingLines } from "./lines.ts"
|
|
5
|
+
import type { SettingsDeps } from "./types.ts"
|
|
6
|
+
|
|
7
|
+
function freshContext(base: RegistrationContext): RegistrationContext {
|
|
8
|
+
const stamp = base.session.stamp()
|
|
9
|
+
return { ...base, stamp, signal: base.session.signal(stamp) }
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export async function runSettingsScreen(ctx: MemoryPiContext, deps: SettingsDeps): Promise<void> {
|
|
13
|
+
while (true) {
|
|
14
|
+
const context = freshContext(deps.registration)
|
|
15
|
+
const prepared = await prepareMemorySettings(context)
|
|
16
|
+
if (!prepared.succeeded) {
|
|
17
|
+
if (!context.signal.aborted) ctx.ui.notify(prepared.problems.join("\n"), "error")
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
const lines = settingLines(prepared.output.config)
|
|
21
|
+
const labels = [...lines.map((line) => line.label), DONE_LABEL]
|
|
22
|
+
const answer = await ctx.ui.select(SETTINGS_TITLE, labels)
|
|
23
|
+
const line = lines.find((_entry, index) => labels[index] === answer)
|
|
24
|
+
if (!line) return
|
|
25
|
+
await line.edit({ ctx, deps, context, state: prepared.output })
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import type {
|
|
3
|
+
ChatModelReference,
|
|
4
|
+
MemoryConfig,
|
|
5
|
+
RegistrationContext,
|
|
6
|
+
SettingChange,
|
|
7
|
+
SettingsPreparation,
|
|
8
|
+
} from "#src/usecases"
|
|
9
|
+
|
|
10
|
+
export interface CurrentModel {
|
|
11
|
+
provider?: string
|
|
12
|
+
id?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ModelChoice {
|
|
16
|
+
label: string
|
|
17
|
+
reference: ChatModelReference
|
|
18
|
+
current: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type VaultChanger = (context: RegistrationContext) => Promise<void>
|
|
22
|
+
|
|
23
|
+
export interface SettingsDeps {
|
|
24
|
+
registration: RegistrationContext
|
|
25
|
+
changeGlobalVault: VaultChanger
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface SettingsEnv {
|
|
29
|
+
ctx: MemoryPiContext
|
|
30
|
+
deps: SettingsDeps
|
|
31
|
+
context: RegistrationContext
|
|
32
|
+
state: SettingsPreparation
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type LineEdit = (env: SettingsEnv) => Promise<void>
|
|
36
|
+
|
|
37
|
+
export interface SettingLine {
|
|
38
|
+
label: string
|
|
39
|
+
edit: LineEdit
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface Saving {
|
|
43
|
+
change: SettingChange
|
|
44
|
+
what: string
|
|
45
|
+
reload: boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface SwitchDiscriminant {
|
|
49
|
+
kind: "captureSwitch"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface CountDiscriminant {
|
|
53
|
+
kind: "captureCount"
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type CaptureCountName = Extract<SettingChange, CountDiscriminant>["name"]
|
|
57
|
+
|
|
58
|
+
export type CaptureSwitchName = Extract<SettingChange, SwitchDiscriminant>["name"]
|
|
59
|
+
|
|
60
|
+
export interface SwitchEditSpec {
|
|
61
|
+
name: CaptureSwitchName
|
|
62
|
+
what: string
|
|
63
|
+
current: boolean
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface EmbeddingChoice {
|
|
67
|
+
value: MemoryConfig["embeddings"]
|
|
68
|
+
label: string
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface ModelEditSpec {
|
|
72
|
+
title: string
|
|
73
|
+
what: string
|
|
74
|
+
kind: "captureModel" | "agentModel"
|
|
75
|
+
current: CurrentModel
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export type NumberChange = (value: number) => SettingChange
|
|
79
|
+
|
|
80
|
+
export interface NumberEditSpec {
|
|
81
|
+
title: string
|
|
82
|
+
what: string
|
|
83
|
+
kind: "threshold" | "count"
|
|
84
|
+
current: string
|
|
85
|
+
change: NumberChange
|
|
86
|
+
clear: SettingChange | null
|
|
87
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const MEMORY_SETUP_COMMAND = "memory-setup"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_SETUP_DESCRIPTION = "Choose or attach the global memory vault and write the memory config"
|
|
4
|
+
|
|
5
|
+
export const SETUP_CREATE_OPTION = "Create a new vault"
|
|
6
|
+
|
|
7
|
+
export const SETUP_ATTACH_OPTION = "Attach an existing folder"
|
|
8
|
+
|
|
9
|
+
export const SETUP_MODE_TITLE = "Global memory vault"
|
|
10
|
+
|
|
11
|
+
export const SETUP_VAULT_TITLE = "Vault folder (absolute path)"
|
|
12
|
+
|
|
13
|
+
export const SETUP_KEEP_VAULT_TITLE = "Vault folder (leave empty to keep the current one)"
|
|
14
|
+
|
|
15
|
+
export const SETUP_VAULT_PLACEHOLDER = "Absolute folder path"
|
|
16
|
+
|
|
17
|
+
export const SETUP_CAPTURE_MODEL_TITLE =
|
|
18
|
+
"Chat model for automatic capture (the model in use is the default and Escape keeps the one marked)"
|
|
19
|
+
|
|
20
|
+
export const SETUP_AGENT_MODEL_TITLE =
|
|
21
|
+
"Chat model for the memory agent (a small model, it searches memory for each message; sorted by price; Escape keeps the current one)"
|
|
22
|
+
|
|
23
|
+
export const SETUP_NO_MODEL = "No chat model is available. Connect a model in pi, then run /memory-setup again."
|
|
24
|
+
|
|
25
|
+
export const SETUP_CANCELLED = "Setup cancelled: nothing changed."
|
|
26
|
+
|
|
27
|
+
export const SETUP_DONE = "Memory is set up. Global vault:"
|
|
28
|
+
|
|
29
|
+
export const REPAIR_TITLE = "The memory config needs changes"
|
|
30
|
+
|
|
31
|
+
export const REPAIR_CONFIRM_LINE = "Continue and rewrite it with every key?"
|
|
32
|
+
|
|
33
|
+
export const REPLACE_LINE = "The file is not valid JSON and will be replaced."
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CHAT_MODELS_DISCLOSURE,
|
|
3
|
+
DISCLOSURE_TITLE,
|
|
4
|
+
JEV_DISCLOSURE,
|
|
5
|
+
REMOTE_EMBEDDINGS_DISCLOSURE,
|
|
6
|
+
} from "#src/pi/memory-settings"
|
|
7
|
+
import type { SetupDisclosure } from "#src/usecases"
|
|
8
|
+
|
|
9
|
+
export function disclosureText(disclosures: SetupDisclosure[]): string {
|
|
10
|
+
return [DISCLOSURE_TITLE, ...disclosures.map(disclosureLine)].join("\n")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function disclosureLine(disclosure: SetupDisclosure): string {
|
|
14
|
+
switch (disclosure) {
|
|
15
|
+
case "chat-models":
|
|
16
|
+
return CHAT_MODELS_DISCLOSURE
|
|
17
|
+
case "jev":
|
|
18
|
+
return JEV_DISCLOSURE
|
|
19
|
+
case "remote-embeddings":
|
|
20
|
+
return REMOTE_EMBEDDINGS_DISCLOSURE
|
|
21
|
+
}
|
|
22
|
+
}
|