hippo-memory 1.68.0 → 1.70.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 +6 -3
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +1 -1
- package/dist/capture/command.js +54 -41
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +4 -1
- package/dist/capture/compact.js +59 -22
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -1
- package/dist/search/boosts.js +34 -13
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +28 -0
- package/dist/store/sqlite/executor.js +286 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +26 -0
- package/dist/store/sqlite/store.js +295 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session handoff types and helpers.
|
|
3
|
+
*
|
|
4
|
+
* A handoff captures the state of a session so that a successor
|
|
5
|
+
* session (or a different agent) can pick up where the previous
|
|
6
|
+
* one left off.
|
|
7
|
+
*/
|
|
8
|
+
import { isJsonString } from '../util/json.js';
|
|
9
|
+
import { warnDamagedColumn } from '../util/stored-json.js';
|
|
10
|
+
/** Narrows an unvalidated value (e.g. CLI input or event content) to a HandoffOutcome. */
|
|
11
|
+
export function isHandoffOutcome(v) {
|
|
12
|
+
return v === 'success' || v === 'failure' || v === 'partial';
|
|
13
|
+
}
|
|
14
|
+
/** Renders evidence as one line shared by every renderer (CLI, MCP, token accounting). */
|
|
15
|
+
export function formatHandoffEvidenceLine(evidence) {
|
|
16
|
+
const gitRef = evidence.gitRef ?? 'unknown';
|
|
17
|
+
const tree = evidence.dirtyTree === true ? 'dirty' : evidence.dirtyTree === false ? 'clean' : 'unknown';
|
|
18
|
+
const tests = evidence.testStatus ?? 'unknown';
|
|
19
|
+
return `git ${gitRef}, tree ${tree}, tests ${tests}`;
|
|
20
|
+
}
|
|
21
|
+
const TEST_STATUSES = new Set(['pass', 'fail', 'unknown']);
|
|
22
|
+
const absent = (v) => v === undefined || v === null;
|
|
23
|
+
function isHandoffEvidence(v) {
|
|
24
|
+
if (!(v instanceof Object) || Array.isArray(v))
|
|
25
|
+
return false;
|
|
26
|
+
const { gitRef, dirtyTree, testStatus, derivedFrom } = v;
|
|
27
|
+
return (absent(gitRef) || isJsonString(gitRef))
|
|
28
|
+
&& (absent(dirtyTree) || dirtyTree === true || dirtyTree === false)
|
|
29
|
+
&& (absent(testStatus) || TEST_STATUSES.has(testStatus))
|
|
30
|
+
&& (derivedFrom === undefined || derivedFrom === 'transcript');
|
|
31
|
+
}
|
|
32
|
+
/** A stored list column as strings; a damaged one logs and reads as empty instead of hiding the whole handoff. */
|
|
33
|
+
function storedList(row, column) {
|
|
34
|
+
const raw = row[column];
|
|
35
|
+
if (!raw)
|
|
36
|
+
return [];
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
return Array.isArray(parsed) ? parsed.map((item) => String(item)) : [];
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
warnDamagedColumn({ table: 'session_handoffs', id: row.id, column }, 'not valid JSON');
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Stored evidence, or null (after a log line) when the column is damaged or holds another shape. */
|
|
47
|
+
function storedEvidence(row) {
|
|
48
|
+
if (!row.evidence_json)
|
|
49
|
+
return null;
|
|
50
|
+
const site = { table: 'session_handoffs', id: row.id, column: 'evidence_json' };
|
|
51
|
+
let parsed;
|
|
52
|
+
try {
|
|
53
|
+
parsed = JSON.parse(row.evidence_json);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
warnDamagedColumn(site, 'not valid JSON');
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
if (parsed === null)
|
|
60
|
+
return null;
|
|
61
|
+
if (isHandoffEvidence(parsed))
|
|
62
|
+
return parsed;
|
|
63
|
+
warnDamagedColumn(site, 'wrong shape');
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
export function rowToSessionHandoff(row) {
|
|
67
|
+
const artifacts = storedList(row, 'artifacts_json');
|
|
68
|
+
const constraints = storedList(row, 'constraints_json');
|
|
69
|
+
const evidence = storedEvidence(row);
|
|
70
|
+
return {
|
|
71
|
+
version: 1,
|
|
72
|
+
sessionId: row.session_id,
|
|
73
|
+
repoRoot: row.repo_root ?? undefined,
|
|
74
|
+
taskId: row.task_id ?? undefined,
|
|
75
|
+
summary: row.summary,
|
|
76
|
+
nextAction: row.next_action ?? undefined,
|
|
77
|
+
artifacts,
|
|
78
|
+
scope: row.scope ?? null,
|
|
79
|
+
updatedAt: row.created_at,
|
|
80
|
+
constraints,
|
|
81
|
+
evidence,
|
|
82
|
+
outcome: isHandoffOutcome(row.outcome) ? row.outcome : null,
|
|
83
|
+
targetRuntime: row.target_runtime ?? null,
|
|
84
|
+
cardId: row.card_id ?? null,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX } from './memory.js';
|
|
2
|
-
import { heldTexts } from '
|
|
2
|
+
import { heldTexts } from '../util/same-text.js';
|
|
3
3
|
export const STOP_WORDS = new Set([
|
|
4
4
|
'the', 'a', 'an', 'is', 'was', 'are', 'were', 'be', 'been', 'being',
|
|
5
5
|
'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'it',
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Core data model for Hippo memory entries.
|
|
3
3
|
* Based on the strength formula from PLAN.md.
|
|
4
4
|
*/
|
|
5
|
+
export declare const DEFAULT_SCHEMA_FIT = 0.5;
|
|
6
|
+
export declare const FALLBACK_HALF_LIFE_DAYS = 7;
|
|
5
7
|
export declare enum Layer {
|
|
6
8
|
Buffer = "buffer",
|
|
7
9
|
Episodic = "episodic",
|
|
@@ -122,7 +124,7 @@ export declare const CHURN_STALE_TAG = "churn-stale";
|
|
|
122
124
|
* the env var for this test.
|
|
123
125
|
* - afterEach: clear the cache so the next test (which may not set the env
|
|
124
126
|
* var) reads the clean default instead of this test's value.
|
|
125
|
-
* See `tests/emotional-multipliers
|
|
127
|
+
* See `tests/emotional-multipliers.test.ts` for the pattern.
|
|
126
128
|
*/
|
|
127
129
|
export declare function _resetLossAversionRatioCacheForTests(): void;
|
|
128
130
|
/**
|
|
@@ -172,9 +174,6 @@ export declare function calculateStrength(entry: StrengthInputs, now?: Date, opt
|
|
|
172
174
|
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
|
|
173
175
|
* An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
174
176
|
export declare function strengthSql(now: Date): string;
|
|
175
|
-
/**
|
|
176
|
-
* Derive half-life based on signals, as per PLAN.md table.
|
|
177
|
-
*/
|
|
178
177
|
export declare function deriveHalfLife(base: number, entry: Partial<MemoryEntry>): number;
|
|
179
178
|
/**
|
|
180
179
|
* Apply outcome feedback to a memory entry.
|
|
@@ -190,15 +189,20 @@ export declare function deriveHalfLife(base: number, entry: Partial<MemoryEntry>
|
|
|
190
189
|
* cumulative reward signal, inspired by R-STDP in spiking networks.
|
|
191
190
|
*/
|
|
192
191
|
export declare function applyOutcome(entry: MemoryEntry, good: boolean): MemoryEntry;
|
|
192
|
+
/** applyOutcome as a served outcome applies it: a good outcome reconfirms the entry, so its churn-stale tag goes. */
|
|
193
|
+
export declare function entryAfterOutcome(entry: MemoryEntry, good: boolean): MemoryEntry;
|
|
193
194
|
/**
|
|
194
195
|
* Generate a random memory ID using crypto.randomUUID().
|
|
195
196
|
*/
|
|
196
197
|
export declare function generateId(prefix?: string): string;
|
|
198
|
+
/** What the confidence facets read, so a caller can derive them from a row it loaded only in part. */
|
|
199
|
+
export type ConfidenceInputs = Pick<MemoryEntry, 'pinned' | 'confidence' | 'last_retrieved'>;
|
|
197
200
|
export interface ConfidenceFacets {
|
|
198
201
|
tier: ConfidenceLevel;
|
|
199
202
|
agedOut: boolean;
|
|
200
203
|
}
|
|
201
204
|
export declare function confidenceFacets(entry: MemoryEntry, now?: Date): ConfidenceFacets;
|
|
205
|
+
export declare function facetsOf(entry: ConfidenceInputs, now: Date): ConfidenceFacets;
|
|
202
206
|
export declare function confidenceLabel(entry: MemoryEntry, now?: Date): {
|
|
203
207
|
text: string;
|
|
204
208
|
warn: boolean;
|
|
@@ -213,7 +217,7 @@ export declare function resolveConfidence(entry: MemoryEntry, now?: Date): Confi
|
|
|
213
217
|
* Base half-life for a new memory, in days, before `deriveHalfLife`'s
|
|
214
218
|
* write-time multipliers. 365 because 7 days lost the current fact far more
|
|
215
219
|
* often, and 730 days or no decay did no better. `hippo sleep` moves memories still
|
|
216
|
-
* on an older base (src/half-life-migration.ts).
|
|
220
|
+
* on an older base (src/consolidate/half-life-migration.ts).
|
|
217
221
|
*/
|
|
218
222
|
export declare const DEFAULT_HALF_LIFE_DAYS = 365;
|
|
219
223
|
export declare const COMPACTION_MEMORY_TAG = "compaction-memory";
|
|
@@ -270,6 +274,16 @@ export declare function createSuccessor(old: MemoryEntry, content: string, opts:
|
|
|
270
274
|
* Rare shared tags signal stronger schema fit than common ones.
|
|
271
275
|
*/
|
|
272
276
|
export declare function computeSchemaFit(content: string, tags: string[], existingEntries: MemoryEntry[]): number;
|
|
277
|
+
/** What schema fit reads from a set of memories, so a store can answer without loading its rows. */
|
|
278
|
+
export interface SchemaFitSource {
|
|
279
|
+
readonly rows: number;
|
|
280
|
+
/** How many times each tag appears across the set. */
|
|
281
|
+
readonly tagCounts: ReadonlyMap<string, number>;
|
|
282
|
+
/** Each memory's text; the walk stops once more matches cannot move the score. */
|
|
283
|
+
readonly contents: Iterable<string>;
|
|
284
|
+
}
|
|
285
|
+
/** computeSchemaFit against `source`, for a caller that holds counts and texts but no rows. */
|
|
286
|
+
export declare function schemaFitFrom(content: string, tags: readonly string[], source: SchemaFitSource): number;
|
|
273
287
|
/**
|
|
274
288
|
* Update retrieval metadata on entries that were returned by a search.
|
|
275
289
|
* Returns the mutated copies (caller must persist to disk).
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Core data model for Hippo memory entries.
|
|
3
3
|
* Based on the strength formula from PLAN.md.
|
|
4
4
|
*/
|
|
5
|
-
import { envLossAversionRatio } from '
|
|
5
|
+
import { envLossAversionRatio } from '../util/env.js';
|
|
6
6
|
import { BadRequestError } from './api-errors.js';
|
|
7
7
|
import { randomUUID } from 'crypto';
|
|
8
8
|
import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated, evalNow, } from './ablation.js';
|
|
9
|
-
import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-
|
|
9
|
+
import { AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memory-tools.js';
|
|
10
|
+
import { DAY_MS } from '../util/time.js';
|
|
11
|
+
import { ID_SUFFIX_CHARS } from '../util/token-text.js';
|
|
12
|
+
export const DEFAULT_SCHEMA_FIT = 0.5;
|
|
13
|
+
export const FALLBACK_HALF_LIFE_DAYS = 7;
|
|
10
14
|
export var Layer;
|
|
11
15
|
(function (Layer) {
|
|
12
16
|
Layer["Buffer"] = "buffer";
|
|
@@ -92,7 +96,7 @@ function getLossAversionRatio() {
|
|
|
92
96
|
* the env var for this test.
|
|
93
97
|
* - afterEach: clear the cache so the next test (which may not set the env
|
|
94
98
|
* var) reads the clean default instead of this test's value.
|
|
95
|
-
* See `tests/emotional-multipliers
|
|
99
|
+
* See `tests/emotional-multipliers.test.ts` for the pattern.
|
|
96
100
|
*/
|
|
97
101
|
export function _resetLossAversionRatioCacheForTests() {
|
|
98
102
|
_lossAversionRatioCache = undefined;
|
|
@@ -127,10 +131,16 @@ export function calculateRewardFactor(entry) {
|
|
|
127
131
|
if (pos === 0 && neg === 0)
|
|
128
132
|
return 1.0;
|
|
129
133
|
const ratio = (pos - neg) / (pos + neg + 1);
|
|
130
|
-
return 1 +
|
|
134
|
+
return 1 + REWARD_SLOPE * ratio;
|
|
131
135
|
}
|
|
132
136
|
/** Bad marks alone never push a memory under sleep's 0.05 retire line; supersede is the hard correction. */
|
|
133
137
|
const MAX_WRONG_HALVINGS = 3;
|
|
138
|
+
// Shared by calculateStrength and strengthSql so the two cannot drift.
|
|
139
|
+
const DECAY_BASE = 0.5;
|
|
140
|
+
const REWARD_SLOPE = 0.5;
|
|
141
|
+
const RETRIEVAL_BOOST_SLOPE = 0.1;
|
|
142
|
+
const SQL_DEFAULT_HALF_LIFE_DAYS = 7;
|
|
143
|
+
const UNIX_EPOCH_JULIAN_DAY = 2440587.5;
|
|
134
144
|
/**
|
|
135
145
|
* Net wrongness: bad outcome marks past good ones, never below zero.
|
|
136
146
|
* Strength halves per unit (capped at 3) and recall stops strengthening
|
|
@@ -157,58 +167,62 @@ export function calculateStrength(entry,
|
|
|
157
167
|
// simulated-time protocols; see ablation.ts). Explicit `now` always wins.
|
|
158
168
|
now = evalNow(), options = {}) {
|
|
159
169
|
// Being marked wrong outranks every shield: pinning, error tags, heavy recall.
|
|
160
|
-
const wrongPenalty = Math.pow(
|
|
170
|
+
const wrongPenalty = Math.pow(DECAY_BASE, Math.min(netWrong(entry), MAX_WRONG_HALVINGS));
|
|
161
171
|
if (entry.pinned)
|
|
162
172
|
return wrongPenalty;
|
|
163
173
|
// EVAL-ONLY ablation (see ablation.ts): anchor decay at CREATION, so clock resets persisted by PRIOR
|
|
164
174
|
// unflagged runs cannot leak strengthening into an ablated arm. Prior-run half_life increments are
|
|
165
175
|
// NOT reconstructed - see the ablation.ts caveat (fresh stores per arm).
|
|
166
176
|
const lastRetrieved = new Date(isRecallBoostAblated() ? entry.created : entry.last_retrieved);
|
|
167
|
-
const daysSince = (now.getTime() - lastRetrieved.getTime()) /
|
|
177
|
+
const daysSince = (now.getTime() - lastRetrieved.getTime()) / DAY_MS;
|
|
168
178
|
// Reward-proportional half-life modulation
|
|
169
179
|
const rewardFactor = calculateRewardFactor(entry);
|
|
170
|
-
|
|
180
|
+
const effectiveHalfLife = entry.half_life_days * rewardFactor;
|
|
171
181
|
// Guard: zero half-life causes 0/0 = NaN in the exponent
|
|
172
182
|
if (effectiveHalfLife <= 0)
|
|
173
183
|
return 0.0;
|
|
184
|
+
const decayExponent = decayExponentFor(options, daysSince, effectiveHalfLife);
|
|
185
|
+
// EVAL-ONLY ablation (see ablation.ts): decay term := 1. NOTE the [0,1]
|
|
186
|
+
// clamp below then caps retrievalBoost at baseline - see ablation.ts
|
|
187
|
+
// formula note.
|
|
188
|
+
const decay = isDecayAblated() ? 1.0 : Math.pow(DECAY_BASE, decayExponent);
|
|
189
|
+
const retrievalBoost = retrievalBoostFor(entry);
|
|
190
|
+
// Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
|
|
191
|
+
// module cache makes this one lookup + one multiply, not a per-call process.env read.
|
|
192
|
+
const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
|
|
193
|
+
const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
|
|
194
|
+
const raw = decay * retrievalBoost * emotionalMultiplier;
|
|
195
|
+
// Clamp to [0, 1] with NaN guard
|
|
196
|
+
const clamped = Math.min(1.0, Math.max(0.0, raw));
|
|
197
|
+
return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
|
|
198
|
+
}
|
|
199
|
+
function decayExponentFor(options, daysSince, halfLifeDays) {
|
|
200
|
+
let effectiveHalfLife = halfLifeDays;
|
|
174
201
|
const basis = options.decayBasis ?? 'clock';
|
|
175
|
-
let decayExponent;
|
|
176
202
|
if (basis === 'session') {
|
|
177
203
|
// Decay by session count: each sleep cycle = 1 "day" in the decay formula.
|
|
178
204
|
// Estimate sessions since last retrieval from wall-clock time and avg interval.
|
|
179
205
|
const avgInterval = options.avgSessionIntervalDays ?? 1;
|
|
180
206
|
const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
|
|
181
|
-
|
|
207
|
+
return sessionsSince / effectiveHalfLife;
|
|
182
208
|
}
|
|
183
|
-
|
|
209
|
+
if (basis === 'adaptive') {
|
|
184
210
|
// Scale half-life by session frequency: infrequent agents get longer half-lives
|
|
185
211
|
const avgInterval = options.avgSessionIntervalDays ?? 0;
|
|
186
212
|
if (avgInterval > 1) {
|
|
187
213
|
effectiveHalfLife *= avgInterval;
|
|
188
214
|
}
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
// clock: classic wall-clock decay
|
|
193
|
-
decayExponent = daysSince / effectiveHalfLife;
|
|
215
|
+
return daysSince / effectiveHalfLife;
|
|
194
216
|
}
|
|
195
|
-
//
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
217
|
+
// clock: classic wall-clock decay
|
|
218
|
+
return daysSince / effectiveHalfLife;
|
|
219
|
+
}
|
|
220
|
+
// Retrieval boost: 1 + 0.1 * log2(retrieval_count + 1). EVAL-ONLY ablation (see ablation.ts) neutralizes
|
|
221
|
+
// the READ side too, so counts written before the flag cannot leak strengthening into an ablated arm.
|
|
222
|
+
function retrievalBoostFor(entry) {
|
|
223
|
+
return isRecallBoostAblated() || netWrong(entry) > 0
|
|
202
224
|
? 1.0
|
|
203
|
-
: 1 +
|
|
204
|
-
// Emotional multiplier. HIPPO_LOSS_AVERSION_RATIO scales the negative one ONLY; the lazy
|
|
205
|
-
// module cache makes this one lookup + one multiply, not a per-call process.env read.
|
|
206
|
-
const baseMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
|
|
207
|
-
const emotionalMultiplier = applyLossAversionRatio(entry.emotional_valence, baseMultiplier);
|
|
208
|
-
const raw = decay * retrievalBoost * emotionalMultiplier;
|
|
209
|
-
// Clamp to [0, 1] with NaN guard
|
|
210
|
-
const clamped = Math.min(1.0, Math.max(0.0, raw));
|
|
211
|
-
return Number.isFinite(clamped) ? clamped * wrongPenalty : 0.0;
|
|
225
|
+
: 1 + RETRIEVAL_BOOST_SLOPE * Math.log2(entry.retrieval_count + 1);
|
|
212
226
|
}
|
|
213
227
|
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in step.
|
|
214
228
|
* An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
@@ -219,25 +233,34 @@ export function strengthSql(now) {
|
|
|
219
233
|
const wrong = isOutcomeSlowAblated() || isDecayAblated() ? '0' : `MAX(0, ${neg} - ${pos})`;
|
|
220
234
|
const reward = isOutcomeSlowAblated()
|
|
221
235
|
? '1.0'
|
|
222
|
-
: `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 +
|
|
223
|
-
const halfLife = `(COALESCE(half_life_days,
|
|
236
|
+
: `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ${neg} + 1.0) END)`;
|
|
237
|
+
const halfLife = `(COALESCE(half_life_days, ${SQL_DEFAULT_HALF_LIFE_DAYS}) * ${reward})`;
|
|
224
238
|
const anchor = isRecallBoostAblated() ? 'created' : 'last_retrieved';
|
|
225
|
-
const nowJulian = num(now.getTime() /
|
|
226
|
-
const decay = isDecayAblated() ? '1.0' : `pow(
|
|
239
|
+
const nowJulian = num(now.getTime() / DAY_MS + UNIX_EPOCH_JULIAN_DAY);
|
|
240
|
+
const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
|
|
227
241
|
const boost = isRecallBoostAblated()
|
|
228
242
|
? '1.0'
|
|
229
|
-
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 +
|
|
243
|
+
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) END)`;
|
|
230
244
|
const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
|
|
231
245
|
const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
|
|
232
246
|
.map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
|
|
233
247
|
.join(' ')} ELSE 1.0 END)`;
|
|
234
|
-
const penalty = `pow(
|
|
248
|
+
const penalty = `pow(${DECAY_BASE}, MIN(${wrong}, ${MAX_WRONG_HALVINGS}))`;
|
|
235
249
|
return `(CASE WHEN pinned THEN ${penalty} WHEN ${halfLife} <= 0 THEN 0.0
|
|
236
250
|
ELSE MIN(1.0, MAX(0.0, ${decay} * ${boost} * ${emotion})) * ${penalty} END)`;
|
|
237
251
|
}
|
|
238
252
|
/**
|
|
239
253
|
* Derive half-life based on signals, as per PLAN.md table.
|
|
240
254
|
*/
|
|
255
|
+
const HIGH_SCHEMA_FIT = 0.7;
|
|
256
|
+
const HIGH_FIT_HALF_LIFE_FACTOR = 1.5;
|
|
257
|
+
const LOW_SCHEMA_FIT = 0.3;
|
|
258
|
+
const LOW_FIT_HALF_LIFE_FACTOR = 0.5;
|
|
259
|
+
// Schema fit blends tag coverage and content similarity; a content match needs this share of shared tokens.
|
|
260
|
+
const TAG_FIT_WEIGHT = 0.6;
|
|
261
|
+
const CONTENT_FIT_WEIGHT = 0.4;
|
|
262
|
+
const CONTENT_TOKEN_SHARE_MIN = 0.2;
|
|
263
|
+
const CONTENT_ENOUGH_FRACTION = 0.1;
|
|
241
264
|
export function deriveHalfLife(base, entry) {
|
|
242
265
|
let hl = base;
|
|
243
266
|
// Error-tagged: 2x half-life
|
|
@@ -245,12 +268,12 @@ export function deriveHalfLife(base, entry) {
|
|
|
245
268
|
hl *= 2;
|
|
246
269
|
}
|
|
247
270
|
// High schema fit: consolidates faster (1.5x)
|
|
248
|
-
if (entry.schema_fit !== undefined && entry.schema_fit >
|
|
249
|
-
hl *=
|
|
271
|
+
if (entry.schema_fit !== undefined && entry.schema_fit > HIGH_SCHEMA_FIT) {
|
|
272
|
+
hl *= HIGH_FIT_HALF_LIFE_FACTOR;
|
|
250
273
|
}
|
|
251
274
|
// Low schema fit: decay faster (0.5x)
|
|
252
|
-
if (entry.schema_fit !== undefined && entry.schema_fit <
|
|
253
|
-
hl *=
|
|
275
|
+
if (entry.schema_fit !== undefined && entry.schema_fit < LOW_SCHEMA_FIT) {
|
|
276
|
+
hl *= LOW_FIT_HALF_LIFE_FACTOR;
|
|
254
277
|
}
|
|
255
278
|
return hl;
|
|
256
279
|
}
|
|
@@ -277,21 +300,29 @@ export function applyOutcome(entry, good) {
|
|
|
277
300
|
updated.strength = calculateStrength(updated);
|
|
278
301
|
return updated;
|
|
279
302
|
}
|
|
303
|
+
/** applyOutcome as a served outcome applies it: a good outcome reconfirms the entry, so its churn-stale tag goes. */
|
|
304
|
+
export function entryAfterOutcome(entry, good) {
|
|
305
|
+
const updated = applyOutcome(entry, good);
|
|
306
|
+
if (!good || !updated.tags.includes(CHURN_STALE_TAG))
|
|
307
|
+
return updated;
|
|
308
|
+
return { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
|
|
309
|
+
}
|
|
280
310
|
/**
|
|
281
311
|
* Generate a random memory ID using crypto.randomUUID().
|
|
282
312
|
*/
|
|
283
313
|
export function generateId(prefix = 'mem') {
|
|
284
|
-
return `${prefix}_${randomUUID().replace(/-/g, '').slice(0,
|
|
314
|
+
return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, ID_SUFFIX_CHARS)}`;
|
|
285
315
|
}
|
|
286
|
-
// Pinned and verified are exempt from ageing by policy, so this reads "aged out
|
|
287
|
-
// for trust purposes", not "old". The 30-day threshold lives here and nowhere else.
|
|
288
316
|
function isAgedOut(entry, now) {
|
|
289
317
|
if (entry.pinned || entry.confidence === 'verified')
|
|
290
318
|
return false;
|
|
291
319
|
const lastRetrieved = new Date(entry.last_retrieved);
|
|
292
|
-
return (now.getTime() - lastRetrieved.getTime()) /
|
|
320
|
+
return (now.getTime() - lastRetrieved.getTime()) / DAY_MS > 30;
|
|
293
321
|
}
|
|
294
322
|
export function confidenceFacets(entry, now = evalNow()) {
|
|
323
|
+
return facetsOf(entry, now);
|
|
324
|
+
}
|
|
325
|
+
export function facetsOf(entry, now) {
|
|
295
326
|
return { tier: entry.confidence, agedOut: isAgedOut(entry, now) };
|
|
296
327
|
}
|
|
297
328
|
// `warn` covers exactly the rows the old collapsed-value rule did: an aged-out row
|
|
@@ -315,7 +346,7 @@ export function resolveConfidence(entry, now = evalNow()) {
|
|
|
315
346
|
* Base half-life for a new memory, in days, before `deriveHalfLife`'s
|
|
316
347
|
* write-time multipliers. 365 because 7 days lost the current fact far more
|
|
317
348
|
* often, and 730 days or no decay did no better. `hippo sleep` moves memories still
|
|
318
|
-
* on an older base (src/half-life-migration.ts).
|
|
349
|
+
* on an older base (src/consolidate/half-life-migration.ts).
|
|
319
350
|
*/
|
|
320
351
|
export const DEFAULT_HALF_LIFE_DAYS = 365;
|
|
321
352
|
export const COMPACTION_MEMORY_TAG = 'compaction-memory';
|
|
@@ -333,21 +364,13 @@ export function canAutoDelete(entry) {
|
|
|
333
364
|
return !entry.pinned && entry.kind !== 'raw' && !isKeptForGood(entry);
|
|
334
365
|
}
|
|
335
366
|
export function createMemory(content, options = {}) {
|
|
336
|
-
|
|
337
|
-
if (trimmed.length < 3) {
|
|
338
|
-
throw new BadRequestError(`Memory content too short (${trimmed.length} chars, minimum 3): "${trimmed}"`);
|
|
339
|
-
}
|
|
340
|
-
const validOutcomes = ['success', 'failure', 'partial', null];
|
|
341
|
-
if (options.trace_outcome !== undefined && !validOutcomes.includes(options.trace_outcome)) {
|
|
342
|
-
throw new BadRequestError(`Invalid trace_outcome: ${options.trace_outcome}. Must be 'success', 'failure', 'partial', or null.`);
|
|
343
|
-
}
|
|
367
|
+
assertValidMemoryInput(content, options);
|
|
344
368
|
const now = evalNow().toISOString(); // honors HIPPO_FAKE_NOW (eval-only)
|
|
345
369
|
const layer = options.layer ?? Layer.Episodic;
|
|
346
370
|
const tags = options.tags ?? [];
|
|
347
371
|
const emotional_valence = options.emotional_valence ?? inferValence(tags);
|
|
348
|
-
const schema_fit = options.schema_fit ??
|
|
349
|
-
const
|
|
350
|
-
const half_life_days = deriveHalfLife(options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS, partial);
|
|
372
|
+
const schema_fit = options.schema_fit ?? DEFAULT_SCHEMA_FIT;
|
|
373
|
+
const half_life_days = deriveHalfLife(options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS, { tags, schema_fit });
|
|
351
374
|
const entry = {
|
|
352
375
|
id: generateId(layer === Layer.Semantic ? 'sem' : 'mem'),
|
|
353
376
|
created: now,
|
|
@@ -386,6 +409,16 @@ export function createMemory(content, options = {}) {
|
|
|
386
409
|
entry.strength = calculateStrength(entry);
|
|
387
410
|
return entry;
|
|
388
411
|
}
|
|
412
|
+
function assertValidMemoryInput(content, options) {
|
|
413
|
+
const trimmed = content.trim();
|
|
414
|
+
if (trimmed.length < 3) {
|
|
415
|
+
throw new BadRequestError(`Memory content too short (${trimmed.length} chars, minimum 3): "${trimmed}"`);
|
|
416
|
+
}
|
|
417
|
+
const validOutcomes = ['success', 'failure', 'partial', null];
|
|
418
|
+
if (options.trace_outcome !== undefined && !validOutcomes.includes(options.trace_outcome)) {
|
|
419
|
+
throw new BadRequestError(`Invalid trace_outcome: ${options.trace_outcome}. Must be 'success', 'failure', 'partial', or null.`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
389
422
|
/** The row that replaces `old`: a supersede never changes where a memory belongs, so source, scope, session and a stamped origin carry over. */
|
|
390
423
|
export function createSuccessor(old, content, opts) {
|
|
391
424
|
const next = createMemory(content, {
|
|
@@ -416,53 +449,55 @@ export function createSuccessor(old, content, opts) {
|
|
|
416
449
|
* Rare shared tags signal stronger schema fit than common ones.
|
|
417
450
|
*/
|
|
418
451
|
export function computeSchemaFit(content, tags, existingEntries) {
|
|
419
|
-
|
|
420
|
-
return 0.5; // no schema yet, neutral
|
|
421
|
-
// Build tag frequency map across all existing entries
|
|
422
|
-
const tagFreq = new Map();
|
|
452
|
+
const tagCounts = new Map();
|
|
423
453
|
for (const entry of existingEntries) {
|
|
424
454
|
for (const tag of entry.tags) {
|
|
425
|
-
|
|
455
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
426
456
|
}
|
|
427
457
|
}
|
|
458
|
+
return schemaFitFrom(content, tags, { rows: existingEntries.length, tagCounts, contents: existingEntries.map((e) => e.content) });
|
|
459
|
+
}
|
|
460
|
+
function significantTokens(text) {
|
|
461
|
+
return new Set(text.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
|
|
462
|
+
}
|
|
463
|
+
/** computeSchemaFit against `source`, for a caller that holds counts and texts but no rows. */
|
|
464
|
+
export function schemaFitFrom(content, tags, source) {
|
|
465
|
+
const N = source.rows;
|
|
466
|
+
if (N === 0)
|
|
467
|
+
return 0.5; // no schema yet, neutral
|
|
468
|
+
const tagFreq = source.tagCounts;
|
|
428
469
|
if (tags.length === 0 && tagFreq.size === 0)
|
|
429
470
|
return 0.5;
|
|
430
|
-
// Tag overlap
|
|
431
|
-
// Shared rare tags matter more than shared common tags
|
|
471
|
+
// Tag overlap, weighted so a shared rare tag counts for more than a shared common one.
|
|
432
472
|
let weightedOverlap = 0;
|
|
433
473
|
let totalWeight = 0;
|
|
434
|
-
const
|
|
474
|
+
const maxIdf = Math.log(N + 1) + 1;
|
|
435
475
|
for (const tag of tags) {
|
|
436
476
|
const freq = tagFreq.get(tag) ?? 0;
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
if (freq > 0) {
|
|
440
|
-
const idf = Math.log(N / freq) + 1;
|
|
441
|
-
weightedOverlap += idf;
|
|
442
|
-
}
|
|
477
|
+
if (freq > 0)
|
|
478
|
+
weightedOverlap += Math.log(N / freq) + 1;
|
|
443
479
|
totalWeight += maxIdf;
|
|
444
480
|
}
|
|
445
|
-
//
|
|
481
|
+
// Scaled so that matching half the tags at average weight gives about 0.5.
|
|
446
482
|
const tagScore = totalWeight > 0 ? Math.min(1, (weightedOverlap / totalWeight) * 2) : 0;
|
|
447
|
-
|
|
448
|
-
const newTokens = new Set(content.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
|
|
483
|
+
const newTokens = significantTokens(content);
|
|
449
484
|
if (newTokens.size === 0)
|
|
450
485
|
return Math.min(1, Math.max(0, tagScore));
|
|
486
|
+
// The content score is capped at 1, which this many matching memories reach.
|
|
487
|
+
const enough = Math.max(5, N * CONTENT_ENOUGH_FRACTION);
|
|
451
488
|
let contentMatches = 0;
|
|
452
|
-
for (const
|
|
453
|
-
const entryTokens =
|
|
489
|
+
for (const text of source.contents) {
|
|
490
|
+
const entryTokens = significantTokens(text);
|
|
454
491
|
let shared = 0;
|
|
455
492
|
for (const token of newTokens) {
|
|
456
493
|
if (entryTokens.has(token))
|
|
457
494
|
shared++;
|
|
458
495
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
contentMatches++;
|
|
496
|
+
if (shared / newTokens.size > CONTENT_TOKEN_SHARE_MIN && ++contentMatches >= enough)
|
|
497
|
+
break;
|
|
462
498
|
}
|
|
463
|
-
const contentScore = Math.min(1, contentMatches /
|
|
464
|
-
|
|
465
|
-
const fit = 0.6 * tagScore + 0.4 * contentScore;
|
|
499
|
+
const contentScore = Math.min(1, contentMatches / enough);
|
|
500
|
+
const fit = TAG_FIT_WEIGHT * tagScore + CONTENT_FIT_WEIGHT * contentScore;
|
|
466
501
|
return Math.min(1, Math.max(0, fit));
|
|
467
502
|
}
|
|
468
503
|
function inferValence(tags) {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* conflict repulsion, and drag (consolidation). Nearby high-scoring memories
|
|
10
10
|
* amplify each other via constructive interference.
|
|
11
11
|
*/
|
|
12
|
-
import type
|
|
12
|
+
import { type EmotionalValence } from './memory.js';
|
|
13
13
|
import type { PhysicsConfig } from './physics-config.js';
|
|
14
14
|
export interface PhysicsParticle {
|
|
15
15
|
memoryId: string;
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* amplify each other via constructive interference.
|
|
11
11
|
*/
|
|
12
12
|
import { isRecallBoostAblated } from './ablation.js';
|
|
13
|
+
import { FALLBACK_HALF_LIFE_DAYS } from './memory.js';
|
|
13
14
|
import { comparePhysicsResultsBy } from './compare.js';
|
|
14
15
|
// ---------------------------------------------------------------------------
|
|
15
16
|
// Vector math (hot path — kept inline for performance)
|
|
@@ -183,7 +184,7 @@ function computeNetForce(i, particles, ctx) {
|
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
186
|
// Drag
|
|
186
|
-
const fd = dragForce(pi, ctx.config.drag, ctx.halfLives.get(pi.memoryId) ??
|
|
187
|
+
const fd = dragForce(pi, ctx.config.drag, ctx.halfLives.get(pi.memoryId) ?? FALLBACK_HALF_LIFE_DAYS);
|
|
187
188
|
net = vecAdd(net, fd);
|
|
188
189
|
return net;
|
|
189
190
|
}
|
|
@@ -41,11 +41,6 @@ export interface ResolveProjectIdentityOpts {
|
|
|
41
41
|
}
|
|
42
42
|
/** Clear the per-process identity cache and the remote switch it read (test seam). */
|
|
43
43
|
export declare function clearProjectIdentityCache(): void;
|
|
44
|
-
/**
|
|
45
|
-
* Canonicalize a path via realpath, falling back to path.resolve when the
|
|
46
|
-
* path does not exist or realpath fails (mirrors importers.ts).
|
|
47
|
-
*/
|
|
48
|
-
export declare function realpathOrResolve(p: string): string;
|
|
49
44
|
/**
|
|
50
45
|
* Resolve the project identity for a working directory.
|
|
51
46
|
* Defaults to process.cwd(). Results are cached per resolved input path.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { envHippoHome, envXdgDataHome } from '
|
|
1
|
+
import { envHippoHome, envXdgDataHome } from '../util/env.js';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
import { BadRequestError } from './api-errors.js';
|
|
6
6
|
import { isSharedStore, loadConfig } from './config.js';
|
|
7
|
-
import { MAX_ID_LEN } from '
|
|
8
|
-
import { log } from '
|
|
7
|
+
import { MAX_ID_LEN } from '../util/http-util.js';
|
|
8
|
+
import { errorMessage, log } from '../util/log.js';
|
|
9
9
|
import { originRemoteId, projectFileId } from './project-remote.js';
|
|
10
|
+
import { realpathOrResolve } from '../util/real-path.js';
|
|
10
11
|
const MAX_WALK_DEPTH = 64;
|
|
11
12
|
const identityCache = new Map();
|
|
12
13
|
let remoteSwitch = null;
|
|
@@ -30,19 +31,6 @@ function namesAt(root, legacyName) {
|
|
|
30
31
|
const aliases = [...new Set([fileId, remoteId, legacyName])].filter((n) => n !== null && n !== name);
|
|
31
32
|
return aliases.length > 0 ? { name, aliases } : { name };
|
|
32
33
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Canonicalize a path via realpath, falling back to path.resolve when the
|
|
35
|
-
* path does not exist or realpath fails (mirrors importers.ts).
|
|
36
|
-
*/
|
|
37
|
-
export function realpathOrResolve(p) {
|
|
38
|
-
try {
|
|
39
|
-
return fs.realpathSync.native(p);
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
log.debug(`project identity: realpath fell back to resolve for ${p}: ${err instanceof Error ? err.message : String(err)}`);
|
|
43
|
-
return path.resolve(p);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
34
|
/** Compare two canonical paths, case-insensitively on Windows. */
|
|
47
35
|
function samePath(a, b) {
|
|
48
36
|
if (process.platform === 'win32')
|
|
@@ -68,7 +56,7 @@ function isDirectoryAt(p) {
|
|
|
68
56
|
return fs.statSync(p).isDirectory();
|
|
69
57
|
}
|
|
70
58
|
catch (err) {
|
|
71
|
-
log.debug(`project identity: no marker at ${p}: ${
|
|
59
|
+
log.debug(`project identity: no marker at ${p}: ${errorMessage(err)}`);
|
|
72
60
|
return false;
|
|
73
61
|
}
|
|
74
62
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { isObjectLike, isStringValue } from './capture-contract.js';
|
|
5
|
-
import { log } from '
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
6
6
|
/** The config file git reads for a checkout: `.git/config`, a linked worktree's `<commondir>/config`, a submodule's `<gitdir>/config`. */
|
|
7
7
|
export function gitConfigPath(gitRoot) {
|
|
8
8
|
const marker = path.join(gitRoot, '.git');
|
|
@@ -19,7 +19,7 @@ export function gitConfigPath(gitRoot) {
|
|
|
19
19
|
return path.join(path.resolve(linkDir, fs.readFileSync(commondir, 'utf8').trim()), 'config');
|
|
20
20
|
}
|
|
21
21
|
catch (err) {
|
|
22
|
-
log.debug(`project remote: no git config for ${gitRoot}: ${
|
|
22
|
+
log.debug(`project remote: no git config for ${gitRoot}: ${errorMessage(err)}`);
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -111,7 +111,7 @@ export function originRemoteId(gitRoot) {
|
|
|
111
111
|
return url === null ? null : normaliseRemote(url);
|
|
112
112
|
}
|
|
113
113
|
catch (err) {
|
|
114
|
-
log.debug(`project remote: ${file} not read: ${
|
|
114
|
+
log.debug(`project remote: ${file} not read: ${errorMessage(err)}`);
|
|
115
115
|
return null;
|
|
116
116
|
}
|
|
117
117
|
}
|
|
@@ -131,7 +131,7 @@ export function projectFileId(root) {
|
|
|
131
131
|
log.warn(`${file}: "id" must be a non-empty string with no colon, slash or spaces; using the remote or folder name instead`);
|
|
132
132
|
}
|
|
133
133
|
catch (err) {
|
|
134
|
-
log.warn(`${file} not read: ${
|
|
134
|
+
log.warn(`${file} not read: ${errorMessage(err)}; using the remote or folder name instead`);
|
|
135
135
|
}
|
|
136
136
|
return null;
|
|
137
137
|
}
|