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,153 @@
|
|
|
1
|
+
import type { MemoryCommand, MemoryPaths, MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import type { MemorySessionKeeper } from "#src/pi/memory-session"
|
|
3
|
+
import { type CurrentModel, chooseModel, RELOAD_NOTE, runSettingsScreen } from "#src/pi/memory-settings"
|
|
4
|
+
import { describeRegistered, describeRegistrationFailure } from "#src/pi/registration-report"
|
|
5
|
+
import {
|
|
6
|
+
type ConfigRepairDraft,
|
|
7
|
+
prepareMemorySettings,
|
|
8
|
+
prepareMemorySetup,
|
|
9
|
+
proposeMemorySetup,
|
|
10
|
+
type RegistrationContext,
|
|
11
|
+
type SetupPreparation,
|
|
12
|
+
type SetupVaultMode,
|
|
13
|
+
setupMemory,
|
|
14
|
+
} from "#src/usecases"
|
|
15
|
+
import {
|
|
16
|
+
MEMORY_SETUP_DESCRIPTION,
|
|
17
|
+
REPAIR_CONFIRM_LINE,
|
|
18
|
+
REPAIR_TITLE,
|
|
19
|
+
REPLACE_LINE,
|
|
20
|
+
SETUP_AGENT_MODEL_TITLE,
|
|
21
|
+
SETUP_ATTACH_OPTION,
|
|
22
|
+
SETUP_CANCELLED,
|
|
23
|
+
SETUP_CAPTURE_MODEL_TITLE,
|
|
24
|
+
SETUP_CREATE_OPTION,
|
|
25
|
+
SETUP_DONE,
|
|
26
|
+
SETUP_KEEP_VAULT_TITLE,
|
|
27
|
+
SETUP_MODE_TITLE,
|
|
28
|
+
SETUP_NO_MODEL,
|
|
29
|
+
SETUP_VAULT_PLACEHOLDER,
|
|
30
|
+
SETUP_VAULT_TITLE,
|
|
31
|
+
} from "./constants.ts"
|
|
32
|
+
import { disclosureText } from "./disclosure.ts"
|
|
33
|
+
import type { VaultStep } from "./types.ts"
|
|
34
|
+
|
|
35
|
+
export function memorySetupCommand(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryCommand {
|
|
36
|
+
return {
|
|
37
|
+
description: MEMORY_SETUP_DESCRIPTION,
|
|
38
|
+
async handler(_args, ctx) {
|
|
39
|
+
if (!ctx.hasUI) return
|
|
40
|
+
const { registration } = sessions.registrationFlow(ctx, paths)
|
|
41
|
+
await runMemorySetup(ctx, registration)
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function runMemorySetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
|
|
47
|
+
const settings = await prepareMemorySettings(registration)
|
|
48
|
+
if (settings.succeeded) {
|
|
49
|
+
await runSettingsScreen(ctx, { registration, changeGlobalVault: (context) => changeVault(ctx, context) })
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
await runFirstSetup(ctx, registration)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function runFirstSetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
|
|
56
|
+
const preparation = await prepareSetup(ctx, registration)
|
|
57
|
+
if (!preparation) return
|
|
58
|
+
if (!(await confirmRepair(ctx, preparation.draft))) return cancelled(ctx)
|
|
59
|
+
if (noModelToChoose(ctx, preparation.draft)) return
|
|
60
|
+
const draft = await chooseModels(ctx, preparation.draft)
|
|
61
|
+
if (!draft) return cancelled(ctx)
|
|
62
|
+
await commitVault(ctx, registration, { snapshot: preparation.snapshot, draft })
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function changeVault(ctx: MemoryPiContext, registration: RegistrationContext): Promise<void> {
|
|
66
|
+
const preparation = await prepareSetup(ctx, registration)
|
|
67
|
+
if (!preparation) return
|
|
68
|
+
await commitVault(ctx, registration, preparation)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function commitVault(
|
|
72
|
+
ctx: MemoryPiContext,
|
|
73
|
+
registration: RegistrationContext,
|
|
74
|
+
preparation: VaultStep,
|
|
75
|
+
): Promise<void> {
|
|
76
|
+
const { snapshot, draft } = preparation
|
|
77
|
+
const mode = await askMode(ctx, draft)
|
|
78
|
+
if (!mode) return cancelled(ctx)
|
|
79
|
+
const vault = await askVault(ctx, draft)
|
|
80
|
+
if (typeof vault !== "string") return cancelled(ctx)
|
|
81
|
+
const proposal = await proposeMemorySetup({ draft, vault, mode }, registration)
|
|
82
|
+
if (!proposal.succeeded) return ctx.ui.notify(proposal.problems.join("\n"), "error")
|
|
83
|
+
ctx.ui.notify(disclosureText(proposal.output.disclosures), "warning")
|
|
84
|
+
const result = await setupMemory(
|
|
85
|
+
{
|
|
86
|
+
config: proposal.output.config,
|
|
87
|
+
expectedHash: snapshot.hash,
|
|
88
|
+
replacementConfirmed: draft.replacementRequired,
|
|
89
|
+
},
|
|
90
|
+
registration,
|
|
91
|
+
)
|
|
92
|
+
if (!result.succeeded) return ctx.ui.notify(describeRegistrationFailure(result), "error")
|
|
93
|
+
const saved = describeRegistered(`${SETUP_DONE} ${proposal.output.config.global.vault}`, result.output)
|
|
94
|
+
ctx.ui.notify(`${saved}\n${RELOAD_NOTE}`, "info")
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function cancelled(ctx: MemoryPiContext): void {
|
|
98
|
+
ctx.ui.notify(SETUP_CANCELLED, "info")
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function prepareSetup(ctx: MemoryPiContext, registration: RegistrationContext): Promise<SetupPreparation | null> {
|
|
102
|
+
const preparation = await prepareMemorySetup({ selectedModel: null }, registration)
|
|
103
|
+
if (!preparation.succeeded) {
|
|
104
|
+
ctx.ui.notify(preparation.problems.join("\n"), "error")
|
|
105
|
+
return null
|
|
106
|
+
}
|
|
107
|
+
return preparation.output
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function modelResolved(model: ConfigRepairDraft["capture"]["model"]): boolean {
|
|
111
|
+
return typeof model.provider === "string" && typeof model.id === "string"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function noModelToChoose(ctx: MemoryPiContext, draft: ConfigRepairDraft): boolean {
|
|
115
|
+
if (ctx.modelRegistry.getAvailable().length > 0) return false
|
|
116
|
+
if (modelResolved(draft.capture.model) && modelResolved(draft.memoryAgent.model)) return false
|
|
117
|
+
ctx.ui.notify(SETUP_NO_MODEL, "error")
|
|
118
|
+
return true
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function inUseOf(ctx: MemoryPiContext): CurrentModel {
|
|
122
|
+
if (!ctx.model) return {}
|
|
123
|
+
return { provider: ctx.model.provider, id: ctx.model.id }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function chooseModels(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<ConfigRepairDraft | null> {
|
|
127
|
+
const capture = await chooseModel(ctx, SETUP_CAPTURE_MODEL_TITLE, draft.capture.model, inUseOf(ctx))
|
|
128
|
+
if (!capture) return null
|
|
129
|
+
const agent = await chooseModel(ctx, SETUP_AGENT_MODEL_TITLE, draft.memoryAgent.model, {})
|
|
130
|
+
if (!agent) return null
|
|
131
|
+
return { ...draft, capture: { ...draft.capture, model: capture }, memoryAgent: { model: agent } }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function confirmRepair(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<boolean> {
|
|
135
|
+
if (draft.problems.length === 0 && !draft.replacementRequired) return true
|
|
136
|
+
const lines = draft.problems.map((problem) => `- ${problem}`)
|
|
137
|
+
if (draft.replacementRequired) lines.push(REPLACE_LINE)
|
|
138
|
+
return ctx.ui.confirm(REPAIR_TITLE, [...lines, REPAIR_CONFIRM_LINE].join("\n"))
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function askMode(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<SetupVaultMode | null> {
|
|
142
|
+
let options = [SETUP_CREATE_OPTION, SETUP_ATTACH_OPTION]
|
|
143
|
+
if (draft.global.vault) options = [SETUP_ATTACH_OPTION, SETUP_CREATE_OPTION]
|
|
144
|
+
const answer = await ctx.ui.select(SETUP_MODE_TITLE, options)
|
|
145
|
+
if (answer === SETUP_CREATE_OPTION) return "create"
|
|
146
|
+
if (answer === SETUP_ATTACH_OPTION) return "attach"
|
|
147
|
+
return null
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function askVault(ctx: MemoryPiContext, draft: ConfigRepairDraft): Promise<string | undefined> {
|
|
151
|
+
if (draft.global.vault) return ctx.ui.input(SETUP_KEEP_VAULT_TITLE, draft.global.vault)
|
|
152
|
+
return ctx.ui.input(SETUP_VAULT_TITLE, SETUP_VAULT_PLACEHOLDER)
|
|
153
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const MEMORY_SUCCEED_TOOL_NAME = "memory_succeed"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_SUCCEED_TOOL_LABEL = "Memory succeed"
|
|
4
|
+
|
|
5
|
+
export const MEMORY_SUCCEED_TOOL_DESCRIPTION =
|
|
6
|
+
"Use only when the user explicitly asks to replace a memory that stopped being true or was resolved. Read it with memory_get first."
|
|
7
|
+
|
|
8
|
+
export const REPLACED_PREFIX = "Replaced in"
|
|
9
|
+
|
|
10
|
+
export const NEW_NOTE_LABEL = "new note:"
|
|
@@ -0,0 +1,34 @@
|
|
|
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 { succeedMemory } from "#src/usecases"
|
|
5
|
+
import {
|
|
6
|
+
MEMORY_SUCCEED_TOOL_DESCRIPTION,
|
|
7
|
+
MEMORY_SUCCEED_TOOL_LABEL,
|
|
8
|
+
MEMORY_SUCCEED_TOOL_NAME,
|
|
9
|
+
NEW_NOTE_LABEL,
|
|
10
|
+
REPLACED_PREFIX,
|
|
11
|
+
} from "./constants.ts"
|
|
12
|
+
import { MemorySucceedParamsSchema } from "./schemas.ts"
|
|
13
|
+
import type { MemorySucceedTool } from "./types.ts"
|
|
14
|
+
|
|
15
|
+
export function memorySucceedTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemorySucceedTool {
|
|
16
|
+
return {
|
|
17
|
+
name: MEMORY_SUCCEED_TOOL_NAME,
|
|
18
|
+
label: MEMORY_SUCCEED_TOOL_LABEL,
|
|
19
|
+
description: MEMORY_SUCCEED_TOOL_DESCRIPTION,
|
|
20
|
+
parameters: MemorySucceedParamsSchema,
|
|
21
|
+
async execute(_toolCallId, params, signal, _onUpdate, ctx): Promise<ChangeResponse> {
|
|
22
|
+
const context = sessions.currentOperation(ctx.cwd, paths, signal)
|
|
23
|
+
if (!context) return noSessionResponse()
|
|
24
|
+
const { vault, path, folder, statement, type, body, dontForget } = params
|
|
25
|
+
const result = await succeedMemory({ vault, path, folder, draft: { statement, type, body, dontForget } }, context)
|
|
26
|
+
if (!result.succeeded) return reportFailure(result, path)
|
|
27
|
+
const { archivedPath, successorPath, maintenanceProblems } = result.output
|
|
28
|
+
return reportSuccess(
|
|
29
|
+
`${REPLACED_PREFIX} ${result.output.vault}: ${archivedPath}; ${NEW_NOTE_LABEL} ${successorPath}`,
|
|
30
|
+
maintenanceProblems,
|
|
31
|
+
)
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import Type from "typebox"
|
|
2
|
+
|
|
3
|
+
import { SucceedMemoryRequestSchema } from "#src/usecases"
|
|
4
|
+
|
|
5
|
+
export const MemorySucceedParamsSchema = Type.Object(
|
|
6
|
+
{
|
|
7
|
+
vault: Type.With(SucceedMemoryRequestSchema.properties.vault, {
|
|
8
|
+
description: "global: about the user. project: about this project. The vault the old note was read from.",
|
|
9
|
+
}),
|
|
10
|
+
path: Type.With(SucceedMemoryRequestSchema.properties.path, {
|
|
11
|
+
description: "The old note's path, exactly as read with memory_get.",
|
|
12
|
+
}),
|
|
13
|
+
folder: Type.With(SucceedMemoryRequestSchema.properties.folder, {
|
|
14
|
+
description: "Subject folder of the new note, in English, from general to specific. Reuse a folder that exists.",
|
|
15
|
+
}),
|
|
16
|
+
statement: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.statement, {
|
|
17
|
+
description: "The new note's name, in English: one short statement saying what is true now.",
|
|
18
|
+
}),
|
|
19
|
+
type: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.type, {
|
|
20
|
+
description: "The kind of memory of the new note.",
|
|
21
|
+
}),
|
|
22
|
+
body: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.body, {
|
|
23
|
+
description: "The full detail of the new note, in English. Never empty.",
|
|
24
|
+
}),
|
|
25
|
+
dontForget: Type.With(SucceedMemoryRequestSchema.properties.draft.properties.dontForget, {
|
|
26
|
+
description: "true only when the new note must be loaded in every session.",
|
|
27
|
+
}),
|
|
28
|
+
},
|
|
29
|
+
{ additionalProperties: false },
|
|
30
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
import type { Static } from "typebox"
|
|
3
|
+
|
|
4
|
+
import type { MemorySucceedParamsSchema } from "./schemas.ts"
|
|
5
|
+
|
|
6
|
+
export type MemorySucceedParams = Static<typeof MemorySucceedParamsSchema>
|
|
7
|
+
|
|
8
|
+
export type MemorySucceedTool = ToolDefinition<typeof MemorySucceedParamsSchema, undefined>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const MEMORY_UPDATE_TOOL_NAME = "memory_update"
|
|
2
|
+
|
|
3
|
+
export const MEMORY_UPDATE_TOOL_LABEL = "Memory update"
|
|
4
|
+
|
|
5
|
+
export const MEMORY_UPDATE_TOOL_DESCRIPTION =
|
|
6
|
+
"Use only when the user explicitly asks to change a memory. Read it with memory_get first."
|
|
7
|
+
|
|
8
|
+
export const UPDATED_PREFIX = "Updated 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 { updateMemory } from "#src/usecases"
|
|
5
|
+
import {
|
|
6
|
+
MEMORY_UPDATE_TOOL_DESCRIPTION,
|
|
7
|
+
MEMORY_UPDATE_TOOL_LABEL,
|
|
8
|
+
MEMORY_UPDATE_TOOL_NAME,
|
|
9
|
+
UPDATED_PREFIX,
|
|
10
|
+
} from "./constants.ts"
|
|
11
|
+
import { MemoryUpdateParamsSchema } from "./schemas.ts"
|
|
12
|
+
import type { MemoryUpdateTool } from "./types.ts"
|
|
13
|
+
|
|
14
|
+
export function memoryUpdateTool(paths: MemoryPaths, sessions: MemorySessionKeeper): MemoryUpdateTool {
|
|
15
|
+
return {
|
|
16
|
+
name: MEMORY_UPDATE_TOOL_NAME,
|
|
17
|
+
label: MEMORY_UPDATE_TOOL_LABEL,
|
|
18
|
+
description: MEMORY_UPDATE_TOOL_DESCRIPTION,
|
|
19
|
+
parameters: MemoryUpdateParamsSchema,
|
|
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 updateMemory(params, context)
|
|
24
|
+
if (!result.succeeded) return reportFailure(result, params.path)
|
|
25
|
+
const { vault, path, maintenanceProblems } = result.output
|
|
26
|
+
return reportSuccess(`${UPDATED_PREFIX} ${vault}: ${path}`, maintenanceProblems)
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import Type from "typebox"
|
|
2
|
+
|
|
3
|
+
import { UpdateMemoryRequestSchema } from "#src/usecases"
|
|
4
|
+
|
|
5
|
+
export const MemoryUpdateParamsSchema = Type.Object(
|
|
6
|
+
{
|
|
7
|
+
vault: Type.With(UpdateMemoryRequestSchema.properties.vault, {
|
|
8
|
+
description: "global: about the user. project: about this project. The vault the note was read from.",
|
|
9
|
+
}),
|
|
10
|
+
path: Type.With(UpdateMemoryRequestSchema.properties.path, {
|
|
11
|
+
description: "The note's path, exactly as read with memory_get. A new name needs a new note, not an update.",
|
|
12
|
+
}),
|
|
13
|
+
body: Type.With(UpdateMemoryRequestSchema.properties.body, {
|
|
14
|
+
description: "The full new body, in English. Never empty.",
|
|
15
|
+
}),
|
|
16
|
+
type: Type.With(UpdateMemoryRequestSchema.properties.type, {
|
|
17
|
+
description: "Only when the kind of memory changes; leave out to keep it.",
|
|
18
|
+
}),
|
|
19
|
+
dontForget: Type.With(UpdateMemoryRequestSchema.properties.dontForget, {
|
|
20
|
+
description: "true to load it in every session, false to stop; leave out to keep it.",
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
{ additionalProperties: false },
|
|
24
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
import type { Static } from "typebox"
|
|
3
|
+
|
|
4
|
+
import type { MemoryUpdateParamsSchema } from "./schemas.ts"
|
|
5
|
+
|
|
6
|
+
export type MemoryUpdateParams = Static<typeof MemoryUpdateParamsSchema>
|
|
7
|
+
|
|
8
|
+
export type MemoryUpdateTool = ToolDefinition<typeof MemoryUpdateParamsSchema, undefined>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { join } from "node:path"
|
|
2
|
+
|
|
3
|
+
import { CONFIG_FILE_NAME, INDEX_FOLDER_NAME, MEMORY_FOLDER_NAME, MODEL_FOLDER_NAME } from "./constants.ts"
|
|
4
|
+
|
|
5
|
+
export function memoryConfigPath(agentDir: string): string {
|
|
6
|
+
return join(agentDir, MEMORY_FOLDER_NAME, CONFIG_FILE_NAME)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function memoryModelCachePath(agentDir: string): string {
|
|
10
|
+
return join(agentDir, MEMORY_FOLDER_NAME, MODEL_FOLDER_NAME)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function memoryIndexPath(agentDir: string): string {
|
|
14
|
+
return join(agentDir, MEMORY_FOLDER_NAME, INDEX_FOLDER_NAME)
|
|
15
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"
|
|
2
|
+
|
|
3
|
+
import { CURSOR_TYPE } from "#src/pi/capture"
|
|
4
|
+
import type { ExtensionRegistrar } from "./types.ts"
|
|
5
|
+
|
|
6
|
+
export function registrarFor(pi: ExtensionAPI): ExtensionRegistrar {
|
|
7
|
+
return {
|
|
8
|
+
registerAddTool: (tool) => pi.registerTool(tool),
|
|
9
|
+
registerSearchTool: (tool) => pi.registerTool(tool),
|
|
10
|
+
registerGetTool: (tool) => pi.registerTool(tool),
|
|
11
|
+
registerUpdateTool: (tool) => pi.registerTool(tool),
|
|
12
|
+
registerArchiveTool: (tool) => pi.registerTool(tool),
|
|
13
|
+
registerSucceedTool: (tool) => pi.registerTool(tool),
|
|
14
|
+
registerCommand: (name, command) => pi.registerCommand(name, command),
|
|
15
|
+
onSessionStart: (handler) => pi.on("session_start", handler),
|
|
16
|
+
onBeforeAgentStart: (handler) => pi.on("before_agent_start", handler),
|
|
17
|
+
onToolCall: (handler) => pi.on("tool_call", handler),
|
|
18
|
+
onShellToolCall: (handler) => pi.on("tool_call", handler),
|
|
19
|
+
onMessageEnd: (handler) => pi.on("message_end", handler),
|
|
20
|
+
onTurnEnd: (handler) => pi.on("turn_end", handler),
|
|
21
|
+
onBeforeCompact: (handler) => pi.on("session_before_compact", handler),
|
|
22
|
+
appendCursor: (data) => pi.appendEntry(CURSOR_TYPE, data),
|
|
23
|
+
onSessionShutdown: (handler) => pi.on("session_shutdown", handler),
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const VAULT_CREATED_LINE = "Vault folder created."
|
|
2
|
+
|
|
3
|
+
export const CREATED_HEADING = "Created:"
|
|
4
|
+
|
|
5
|
+
export const PRESERVED_HEADING = "Kept as they were:"
|
|
6
|
+
|
|
7
|
+
export const WARNINGS_HEADING = "Warnings:"
|
|
8
|
+
|
|
9
|
+
export const PROBLEMS_HEADING = "Not changed. Problems:"
|
|
10
|
+
|
|
11
|
+
export const BOOTSTRAP_STAGE_LINE = "Stopped while preparing the vault; the config was not written."
|
|
12
|
+
|
|
13
|
+
export const CONFIG_STAGE_LINE = "The vault is ready but the config was not written."
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RegistrationFailure, RegistrationOutcome } from "#src/usecases"
|
|
2
|
+
import {
|
|
3
|
+
BOOTSTRAP_STAGE_LINE,
|
|
4
|
+
CONFIG_STAGE_LINE,
|
|
5
|
+
CREATED_HEADING,
|
|
6
|
+
PRESERVED_HEADING,
|
|
7
|
+
PROBLEMS_HEADING,
|
|
8
|
+
VAULT_CREATED_LINE,
|
|
9
|
+
WARNINGS_HEADING,
|
|
10
|
+
} from "./constants.ts"
|
|
11
|
+
|
|
12
|
+
export function describeRegistered(headline: string, outcome: RegistrationOutcome): string {
|
|
13
|
+
const lines = [headline]
|
|
14
|
+
if (outcome.assets.createdRoot) lines.push(VAULT_CREATED_LINE)
|
|
15
|
+
if (outcome.assets.created.length > 0) lines.push(`${CREATED_HEADING} ${outcome.assets.created.join(", ")}`)
|
|
16
|
+
if (outcome.assets.preserved.length > 0) lines.push(`${PRESERVED_HEADING} ${outcome.assets.preserved.join(", ")}`)
|
|
17
|
+
if (outcome.warnings.length > 0) lines.push(WARNINGS_HEADING, ...outcome.warnings.map((warning) => `- ${warning}`))
|
|
18
|
+
return lines.join("\n")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function describeRegistrationFailure(failure: RegistrationFailure): string {
|
|
22
|
+
const lines = [PROBLEMS_HEADING, ...failure.problems.map((problem) => `- ${problem}`)]
|
|
23
|
+
if (failure.stage === "bootstrap") lines.push(BOOTSTRAP_STAGE_LINE)
|
|
24
|
+
if (failure.stage === "config") lines.push(CONFIG_STAGE_LINE)
|
|
25
|
+
return lines.join("\n")
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ClassifierPrompt } from "#src/pi/context"
|
|
2
|
+
import type { JevPrompt, JevQuestion } from "./types.ts"
|
|
3
|
+
|
|
4
|
+
function questionOf(question: JevQuestion) {
|
|
5
|
+
return {
|
|
6
|
+
type: question.type,
|
|
7
|
+
instructions: question.instructions,
|
|
8
|
+
criteria: { true: question.criteria.true, false: question.criteria.false },
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function stateOf(state: JevPrompt["state"]) {
|
|
13
|
+
if ("candidate" in state) {
|
|
14
|
+
return { message: state.message, candidate: { statement: state.candidate.statement, body: state.candidate.body } }
|
|
15
|
+
}
|
|
16
|
+
return { message: state.message, project: state.project, folder: state.folder }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function classifierPrompt(prompt: JevPrompt): ClassifierPrompt {
|
|
20
|
+
const { state, questions } = prompt
|
|
21
|
+
if ("needed" in questions) return { state: stateOf(state), questions: { needed: questionOf(questions.needed) } }
|
|
22
|
+
return { state: stateOf(state), questions: { relevant: questionOf(questions.relevant) } }
|
|
23
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Value } from "typebox/value"
|
|
2
|
+
|
|
3
|
+
import { type MemoryPiContext, STATUS_SEARCHING, withMemoryStatus } from "#src/pi/context"
|
|
4
|
+
import type { BeforeAgentStartHandler } from "#src/pi/memory-block"
|
|
5
|
+
import { type JevSource, LoadedChangesSchema, loadSessionMemory, retrieveMemory } from "#src/usecases"
|
|
6
|
+
import { JEV_MISSING, RELEVANT_MESSAGE_TYPE } from "./constants.ts"
|
|
7
|
+
import { classifierPrompt } from "./prompt.ts"
|
|
8
|
+
import type { RelevantMemoryDeps } from "./types.ts"
|
|
9
|
+
|
|
10
|
+
export class RelevantMemoryRuntime {
|
|
11
|
+
#deps: RelevantMemoryDeps
|
|
12
|
+
#told = new Set<string>()
|
|
13
|
+
|
|
14
|
+
constructor(deps: RelevantMemoryDeps) {
|
|
15
|
+
this.#deps = deps
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
reset(): void {
|
|
19
|
+
this.#told = new Set<string>()
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
restore(ctx: MemoryPiContext): void {
|
|
23
|
+
const loaded = this.#deps.sessions.loaded()
|
|
24
|
+
for (const entry of ctx.sessionManager.getBranch()) {
|
|
25
|
+
if (entry.type !== "custom_message" || entry.customType !== RELEVANT_MESSAGE_TYPE) continue
|
|
26
|
+
if (Value.Check(LoadedChangesSchema, entry.details)) loaded.apply(entry.details)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async sessionText(ctx: MemoryPiContext): Promise<string | null> {
|
|
31
|
+
const operation = this.#deps.sessions.retrievalOperation(ctx.cwd, this.#deps.paths)
|
|
32
|
+
if (!operation) return null
|
|
33
|
+
const result = await loadSessionMemory(operation, {
|
|
34
|
+
complete: this.#deps.completionOf(ctx),
|
|
35
|
+
loaded: this.#deps.sessions.loaded(),
|
|
36
|
+
})
|
|
37
|
+
if (!result.succeeded) return null
|
|
38
|
+
this.tell(ctx, result.output.notices)
|
|
39
|
+
return result.output.text
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
beforeAgentStart(): BeforeAgentStartHandler {
|
|
43
|
+
return async (event, ctx) => {
|
|
44
|
+
if (event.messageType !== "user") return undefined
|
|
45
|
+
const operation = this.#deps.sessions.retrievalOperation(ctx.cwd, this.#deps.paths)
|
|
46
|
+
if (!operation) return undefined
|
|
47
|
+
const result = await withMemoryStatus(ctx, STATUS_SEARCHING, () =>
|
|
48
|
+
retrieveMemory({ message: event.prompt }, operation, {
|
|
49
|
+
complete: this.#deps.completionOf(ctx),
|
|
50
|
+
jev: this.#jevFor(ctx),
|
|
51
|
+
loaded: this.#deps.sessions.loaded(),
|
|
52
|
+
}),
|
|
53
|
+
)
|
|
54
|
+
if (!result.succeeded) return undefined
|
|
55
|
+
this.tell(ctx, result.output.notices)
|
|
56
|
+
if (typeof result.output.text !== "string") return undefined
|
|
57
|
+
return {
|
|
58
|
+
message: {
|
|
59
|
+
customType: RELEVANT_MESSAGE_TYPE,
|
|
60
|
+
content: result.output.text,
|
|
61
|
+
display: false,
|
|
62
|
+
details: result.output.changes,
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
tell(ctx: MemoryPiContext, notices: string[]): void {
|
|
69
|
+
for (const notice of notices) {
|
|
70
|
+
if (this.#told.has(notice)) continue
|
|
71
|
+
this.#told.add(notice)
|
|
72
|
+
if (ctx.hasUI) ctx.ui.notify(notice, "warning")
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#jevFor(ctx: MemoryPiContext): JevSource {
|
|
77
|
+
return async (modelId) => {
|
|
78
|
+
const model = ctx.modelRegistry.findOfType("classifier", "typesafe", modelId)
|
|
79
|
+
if (!model) return { available: false, reason: JEV_MISSING }
|
|
80
|
+
return {
|
|
81
|
+
available: true,
|
|
82
|
+
classifier: {
|
|
83
|
+
classify: (request) => ctx.modelRegistry.classify(model, classifierPrompt(request.context), request.options),
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CompletionFactory } from "#src/pi/capture"
|
|
2
|
+
import type { MemoryPaths } from "#src/pi/context"
|
|
3
|
+
import type { MemorySessionKeeper } from "#src/pi/memory-session"
|
|
4
|
+
import type { BoolQuestion, DecisionPrompt } from "#src/usecases"
|
|
5
|
+
|
|
6
|
+
export interface RelevantMemoryDeps {
|
|
7
|
+
paths: MemoryPaths
|
|
8
|
+
sessions: MemorySessionKeeper
|
|
9
|
+
completionOf: CompletionFactory
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type JevPrompt = DecisionPrompt
|
|
13
|
+
|
|
14
|
+
export type JevQuestion = BoolQuestion
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { MemoryPiContext } from "#src/pi/context"
|
|
2
|
+
import {
|
|
3
|
+
createRemoteSemantic,
|
|
4
|
+
type LocalModelAccess,
|
|
5
|
+
type LocalSemantic,
|
|
6
|
+
localModelAccess,
|
|
7
|
+
type SemanticPort,
|
|
8
|
+
type SemanticSource,
|
|
9
|
+
} from "#src/usecases"
|
|
10
|
+
import { MODEL_INVALID, SHUTDOWN_FAILED } from "./constants.ts"
|
|
11
|
+
|
|
12
|
+
export class SemanticRuntime {
|
|
13
|
+
#context: MemoryPiContext | null = null
|
|
14
|
+
#local: LocalSemantic | null = null
|
|
15
|
+
#modelCachePath: string
|
|
16
|
+
#access: LocalModelAccess = localModelAccess
|
|
17
|
+
|
|
18
|
+
constructor(modelCachePath: string, access?: LocalModelAccess) {
|
|
19
|
+
this.#modelCachePath = modelCachePath
|
|
20
|
+
if (access) this.#access = access
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
readonly source: SemanticSource = (configuration) => {
|
|
24
|
+
if (configuration.provider === "local") return this.#localPort()
|
|
25
|
+
return this.#remotePort(configuration.provider)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
attach(context: MemoryPiContext): void {
|
|
29
|
+
this.#context = context
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async shutdown(): Promise<void> {
|
|
33
|
+
const local = this.#local
|
|
34
|
+
const context = this.#context
|
|
35
|
+
this.#local = null
|
|
36
|
+
this.#context = null
|
|
37
|
+
if (!local) return
|
|
38
|
+
try {
|
|
39
|
+
await local.dispose()
|
|
40
|
+
} catch (error) {
|
|
41
|
+
if (!(error instanceof Error)) throw error
|
|
42
|
+
if (context?.hasUI) context.ui.notify(`${SHUTDOWN_FAILED} ${error.message}`, "warning")
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async #localPort(): Promise<SemanticPort> {
|
|
47
|
+
if (this.#local) return this.#local.port
|
|
48
|
+
const status = await this.#access.check(this.#modelCachePath, new AbortController().signal)
|
|
49
|
+
if (status === "invalid") return { available: false, reason: MODEL_INVALID }
|
|
50
|
+
this.#local = this.#access.create({ cachePath: this.#modelCachePath })
|
|
51
|
+
return this.#local.port
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async #remotePort(provider: "openai" | "google"): Promise<SemanticPort> {
|
|
55
|
+
const apiKey = await this.#context?.modelRegistry.getApiKeyForProvider(provider)
|
|
56
|
+
if (typeof apiKey !== "string" || apiKey === "") return { available: false, reason: `no API key for ${provider}` }
|
|
57
|
+
return createRemoteSemantic(provider, apiKey)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const NO_MEMORY_NOTICE = "No memory is configured yet. Run /memory-setup to choose the global vault."
|
|
2
|
+
|
|
3
|
+
export const INVALID_CONFIG_NOTICE = "Memory is off: the config is invalid and nothing from it is used. Problems:"
|
|
4
|
+
|
|
5
|
+
export const REPAIR_HINT = "Run /memory-setup to repair it; it keeps every value that is still valid."
|
|
6
|
+
|
|
7
|
+
export const UNREADABLE_CONFIG_NOTICE = "Memory is off: the config cannot be read. Problems:"
|