hippo-memory 1.69.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 +5 -2
- 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.js +3 -2
- 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 +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- 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 +2 -11
- package/dist/api/forget.js +13 -46
- 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 +5 -42
- package/dist/api/outcome.js +15 -80
- 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 +4 -15
- package/dist/api/promote.js +29 -106
- 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 +10 -12
- package/dist/api/remember.js +29 -45
- 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 +40 -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.js +1 -1
- 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.js +6 -4
- 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 +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- 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 +4 -2
- 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 -83
- 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 -49
- 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 -91
- 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} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -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} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -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.js → core/prompt-recall.js} +1 -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 +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- 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.js +7 -27
- 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 +62 -60
- 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 +12 -14
- 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} +1 -1
- 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 +39 -61
- package/dist/server.js +24 -568
- 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 +11 -5
- package/dist/store/audit-event.js +5 -4
- 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 +1 -1
- package/dist/store/handoffs.js +39 -30
- 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 +6 -4
- package/dist/store/open.js +24 -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} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- 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 +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- 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/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- 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} +15 -2
- package/dist/{env.js → util/env.js} +20 -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/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/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /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/{prompt-recall.d.ts → core/prompt-recall.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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { RouteRequest } from '../types.js';
|
|
2
|
-
export declare function handleCreateProjectBrief(
|
|
3
|
-
export declare function handleListProjectBriefs(
|
|
4
|
-
export declare function handleRefreshProjectBrief(
|
|
5
|
-
export declare function handleSupersedeProjectBrief(
|
|
6
|
-
export declare function handleCloseProjectBrief(
|
|
7
|
-
export declare function handleGetProjectBrief(
|
|
2
|
+
export declare function handleCreateProjectBrief(rr: RouteRequest): Promise<void>;
|
|
3
|
+
export declare function handleListProjectBriefs(rr: RouteRequest): Promise<void>;
|
|
4
|
+
export declare function handleRefreshProjectBrief(rr: RouteRequest): Promise<void>;
|
|
5
|
+
export declare function handleSupersedeProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
6
|
+
export declare function handleCloseProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
7
|
+
export declare function handleGetProjectBrief(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
8
8
|
//# sourceMappingURL=project-briefs.d.ts.map
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
// /v1/project-briefs routes.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { briefFromReceipts, MAX_REPO_LEN, PROJECT_BRIEF, refreshedBrief } from '../../objects/project-briefs.js';
|
|
3
|
+
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
5
|
+
import { parseJsonBody } from '../validation.js';
|
|
6
|
+
import { closeRoute, getRoute, listRoute, objectsOf, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
|
|
7
|
+
const briefRoutes = {
|
|
8
|
+
noun: 'project brief',
|
|
9
|
+
field: 'brief',
|
|
10
|
+
listField: 'briefs',
|
|
11
|
+
object: PROJECT_BRIEF,
|
|
12
|
+
filterParam: 'repo',
|
|
13
|
+
revise: (body) => {
|
|
14
|
+
const summary = requiredString(body, 'summary', { max: 8192 });
|
|
15
|
+
const changeSummary = optionalString(body, 'changeSummary', 4096);
|
|
16
|
+
return (existing, id) => ({ repo: existing.repo, summary, changeSummary, supersedesBriefId: id });
|
|
17
|
+
},
|
|
18
|
+
};
|
|
8
19
|
// ── project_brief routes ──
|
|
9
20
|
//
|
|
10
21
|
// 6 routes: POST /v1/project-briefs (new; body repo + summary), GET
|
|
@@ -15,123 +26,40 @@ import { isJsonString } from '../../json.js';
|
|
|
15
26
|
// POST /v1/project-briefs/:id/close. DoS caps: repo 256, summary 8192,
|
|
16
27
|
// changeSummary 4096. The store validates + throws; the boundary maps validation
|
|
17
28
|
// -> 400, not-found -> 404, not-active -> 409. Mirrors /v1/skills.
|
|
18
|
-
export async function handleCreateProjectBrief(
|
|
19
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
20
|
-
const body = await parseJsonBody(req, ctx);
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
throw new HttpError(400, `repo exceeds ${MAX_REPO_LEN}-character cap`);
|
|
27
|
-
}
|
|
28
|
-
const summary = body['summary'];
|
|
29
|
-
if (!isJsonString(summary) || summary.trim().length === 0) {
|
|
30
|
-
throw new HttpError(400, 'summary is required (non-empty string)');
|
|
31
|
-
}
|
|
32
|
-
if (summary.length > 8192) {
|
|
33
|
-
throw new HttpError(400, 'summary exceeds 8192-character cap');
|
|
34
|
-
}
|
|
35
|
-
const brief = saveProjectBrief(opts.hippoRoot, ctx.tenantId, {
|
|
36
|
-
repo,
|
|
37
|
-
summary,
|
|
38
|
-
}, ctx.actor.subject);
|
|
39
|
-
sendJson(res, 201, { brief });
|
|
40
|
-
return;
|
|
29
|
+
export async function handleCreateProjectBrief(rr) {
|
|
30
|
+
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
31
|
+
const body = await parseJsonBody(rr.req, ctx);
|
|
32
|
+
const brief = await saveFor(rr, PROJECT_BRIEF, ctx.tenantId, ctx.actor.subject, {
|
|
33
|
+
repo: requiredString(body, 'repo', { max: MAX_REPO_LEN }),
|
|
34
|
+
summary: requiredString(body, 'summary', { max: 8192 }),
|
|
35
|
+
});
|
|
36
|
+
sendJson(rr.res, 201, { brief });
|
|
41
37
|
}
|
|
42
|
-
export
|
|
43
|
-
|
|
44
|
-
const repoFilter = query.get('repo');
|
|
45
|
-
const limit = parseListLimit(query.get('limit'));
|
|
46
|
-
const after = parseCursor(query.get('cursor'), 'string', 'integer');
|
|
47
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
48
|
-
const listOpts = { limit: limit + 1, after };
|
|
49
|
-
if (repoFilter !== null && repoFilter.trim().length > 0) {
|
|
50
|
-
listOpts.repo = repoFilter.trim();
|
|
51
|
-
}
|
|
52
|
-
if (status !== 'all') {
|
|
53
|
-
if (!isSetMember(VALID_BRIEF_STATES, status)) {
|
|
54
|
-
throw new HttpError(400, `status must be one of: active | superseded | closed | all (got "${status}")`);
|
|
55
|
-
}
|
|
56
|
-
listOpts.status = status;
|
|
57
|
-
}
|
|
58
|
-
const briefs = loadProjectBriefs(opts.hippoRoot, ctx.tenantId, listOpts);
|
|
59
|
-
const page = pageOf(briefs, limit, byCreatedAt);
|
|
60
|
-
sendJson(res, 200, { briefs: page.items, next_cursor: page.nextCursor });
|
|
61
|
-
return;
|
|
38
|
+
export function handleListProjectBriefs(rr) {
|
|
39
|
+
return listRoute(briefRoutes, rr);
|
|
62
40
|
}
|
|
63
41
|
// The refresh op: must precede the /:id routes (literal 'refresh' is non-numeric
|
|
64
42
|
// so the /(\d+)/ routes would not match it, but order it first).
|
|
65
|
-
export async function handleRefreshProjectBrief(
|
|
43
|
+
export async function handleRefreshProjectBrief(rr) {
|
|
44
|
+
const { req, res, opts } = rr;
|
|
66
45
|
const ctx = await buildContextWithAuth(req, opts);
|
|
67
46
|
const body = await parseJsonBody(req, ctx);
|
|
68
|
-
const repo = body
|
|
69
|
-
if (
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
if (repo.length > MAX_REPO_LEN) {
|
|
73
|
-
throw new HttpError(400, `repo exceeds ${MAX_REPO_LEN}-character cap`);
|
|
74
|
-
}
|
|
75
|
-
const dryRun = body['dryRun'] === true;
|
|
76
|
-
if (dryRun) {
|
|
77
|
-
const { markdown, receiptCount } = assembleBriefFromReceipts(opts.hippoRoot, ctx.tenantId, repo);
|
|
47
|
+
const repo = requiredString(body, 'repo', { max: MAX_REPO_LEN });
|
|
48
|
+
if (body['dryRun'] === true) {
|
|
49
|
+
const { markdown, receiptCount } = await briefFromReceipts(objectsOf(rr), ctx.tenantId, repo);
|
|
78
50
|
sendJson(res, 200, { markdown, receiptCount });
|
|
79
51
|
return;
|
|
80
52
|
}
|
|
81
|
-
const brief =
|
|
53
|
+
const brief = await refreshedBrief(objectsOf(rr), { hippoRoot: opts.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor.subject }, repo);
|
|
82
54
|
sendJson(res, 200, { brief });
|
|
83
|
-
return;
|
|
84
55
|
}
|
|
85
|
-
export
|
|
86
|
-
|
|
87
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
88
|
-
const body = await parseJsonBody(req, ctx);
|
|
89
|
-
const summary = body['summary'];
|
|
90
|
-
if (!isJsonString(summary) || summary.trim().length === 0) {
|
|
91
|
-
throw new HttpError(400, 'summary is required (non-empty string)');
|
|
92
|
-
}
|
|
93
|
-
if (summary.length > 8192) {
|
|
94
|
-
throw new HttpError(400, 'summary exceeds 8192-character cap');
|
|
95
|
-
}
|
|
96
|
-
const changeRaw = body['changeSummary'];
|
|
97
|
-
let changeSummary;
|
|
98
|
-
if (changeRaw !== undefined && changeRaw !== null) {
|
|
99
|
-
if (!isJsonString(changeRaw)) {
|
|
100
|
-
throw new HttpError(400, 'changeSummary must be a string');
|
|
101
|
-
}
|
|
102
|
-
if (changeRaw.length > 4096) {
|
|
103
|
-
throw new HttpError(400, 'changeSummary exceeds 4096-character cap');
|
|
104
|
-
}
|
|
105
|
-
changeSummary = changeRaw;
|
|
106
|
-
}
|
|
107
|
-
const existing = loadProjectBriefById(opts.hippoRoot, ctx.tenantId, id);
|
|
108
|
-
if (!existing) {
|
|
109
|
-
throw new HttpError(404, `project brief ${id} not found`);
|
|
110
|
-
}
|
|
111
|
-
const brief = saveProjectBrief(opts.hippoRoot, ctx.tenantId, {
|
|
112
|
-
repo: existing.repo,
|
|
113
|
-
summary,
|
|
114
|
-
changeSummary,
|
|
115
|
-
supersedesBriefId: id,
|
|
116
|
-
}, ctx.actor.subject);
|
|
117
|
-
sendJson(res, 200, { brief });
|
|
118
|
-
return;
|
|
56
|
+
export function handleSupersedeProjectBrief(rr, match) {
|
|
57
|
+
return supersedeRoute(briefRoutes, rr, match);
|
|
119
58
|
}
|
|
120
|
-
export
|
|
121
|
-
|
|
122
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
123
|
-
const brief = closeProjectBrief(opts.hippoRoot, ctx.tenantId, id, ctx.actor.subject);
|
|
124
|
-
sendJson(res, 200, { brief });
|
|
125
|
-
return;
|
|
59
|
+
export function handleCloseProjectBrief(rr, match) {
|
|
60
|
+
return closeRoute(briefRoutes, rr, match);
|
|
126
61
|
}
|
|
127
|
-
export
|
|
128
|
-
|
|
129
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
130
|
-
const brief = loadProjectBriefById(opts.hippoRoot, ctx.tenantId, id);
|
|
131
|
-
if (!brief) {
|
|
132
|
-
throw new HttpError(404, `project brief ${id} not found`);
|
|
133
|
-
}
|
|
134
|
-
sendJson(res, 200, { brief });
|
|
135
|
-
return;
|
|
62
|
+
export function handleGetProjectBrief(rr, match) {
|
|
63
|
+
return getRoute(briefRoutes, rr, match);
|
|
136
64
|
}
|
|
137
65
|
//# sourceMappingURL=project-briefs.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// Recall routes: /v1/memories search, assemble, drill and /v1/context.
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
|
-
import { assertCallerProject, resolveProjectIdentity } from '../../project-identity.js';
|
|
4
|
-
import { isSharedStore } from '../../config.js';
|
|
5
|
-
import { assembleCost, contextCost, drillCost } from '../../context-render.js';
|
|
6
|
-
import { storeFor } from '../../store
|
|
7
|
-
import { biasHintEnabled } from '../../recall-history.js';
|
|
8
|
-
import { assemble, drillDown, getContext, recordTokens, retrieve } from '../../api.js';
|
|
3
|
+
import { assertCallerProject, resolveProjectIdentity } from '../../core/project-identity.js';
|
|
4
|
+
import { isSharedStore } from '../../core/config.js';
|
|
5
|
+
import { assembleCost, contextCost, drillCost } from '../../api/context-render.js';
|
|
6
|
+
import { storeFor } from '../../store/index.js';
|
|
7
|
+
import { biasHintEnabled } from '../../api/recall-history.js';
|
|
8
|
+
import { assemble, drillDown, getContext, recordTokens, retrieve } from '../../api/index.js';
|
|
9
9
|
import { httpParams, parseContextRequest, parseRecallRequest } from '../../api/recall-request.js';
|
|
10
10
|
import { anchorSkippedRows, noteRecall, peekSessionRing, resetSessionRings, sessionRing } from '../../api/recall-record.js';
|
|
11
|
-
import { HttpError, sendJson } from '../../http-util.js';
|
|
11
|
+
import { HttpError, sendJson } from '../../util/http-util.js';
|
|
12
12
|
import { buildContextWithAuth } from '../auth.js';
|
|
13
|
-
import { validateIdSegment } from '../validation.js';
|
|
13
|
+
import { MAX_LIST_LIMIT, parseListLimit, validateIdSegment } from '../validation.js';
|
|
14
14
|
/** Test-only: reset the HTTP recall rings. Call from beforeEach. */
|
|
15
15
|
export function __resetSessionRecallHistoryHttp() {
|
|
16
16
|
resetSessionRings('http');
|
|
@@ -32,8 +32,7 @@ export async function handleRecallMemories({ req, res, opts, query }) {
|
|
|
32
32
|
const ring = sessionRing('http', ctx.tenantId, sessionId);
|
|
33
33
|
if (ring)
|
|
34
34
|
noteRecall(ring, q, result.results[0]?.id ?? null, result.anchoringHint?.memoryId);
|
|
35
|
-
//
|
|
36
|
-
// since the CLI never calls it and MCP shows the user a different band.
|
|
35
|
+
// HTTP counts the rows it returns here; `retrieve` cannot count for every ranker, since MCP shows a different band and counts none.
|
|
37
36
|
await storeFor(ctx).bumpRecallStats(result.results.length);
|
|
38
37
|
// Continuity payloads should never be cached. The caller is asking for
|
|
39
38
|
// session-state-aware data; intermediaries must not reuse it across users.
|
|
@@ -78,7 +77,7 @@ export async function handleAssembleSession({ req, res, opts, query }, assembleM
|
|
|
78
77
|
assembleExtra.summarizeOlder = summarizeOlder;
|
|
79
78
|
if (scope !== undefined)
|
|
80
79
|
assembleExtra.scope = scope;
|
|
81
|
-
const result = assemble(ctx, assembleMatch.id, { ...assembleExtra, cost: assembleCost(assembleMatch.id) });
|
|
80
|
+
const result = await assemble(ctx, assembleMatch.id, { ...assembleExtra, cost: assembleCost(assembleMatch.id) });
|
|
82
81
|
await recordTokens(ctx, 'http_assemble', { items: result.items.length, tokens: result.tokens, sessionId: assembleMatch.id });
|
|
83
82
|
sendJson(res, 200, result);
|
|
84
83
|
return;
|
|
@@ -96,6 +95,9 @@ export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
|
|
|
96
95
|
if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {
|
|
97
96
|
throw new HttpError(400, 'limit must be a positive number');
|
|
98
97
|
}
|
|
98
|
+
// Past the list ceiling the shared parser refuses, so the reply is the one every other list route gives.
|
|
99
|
+
if (limit !== undefined && limit > MAX_LIST_LIMIT)
|
|
100
|
+
parseListLimit(limitRaw);
|
|
99
101
|
const budgetRaw = query.get('budget');
|
|
100
102
|
const budget = budgetRaw === null ? undefined : Number(budgetRaw);
|
|
101
103
|
if (budget !== undefined && (!Number.isFinite(budget) || budget <= 0)) {
|
|
@@ -120,7 +122,7 @@ export async function handleDrillRecall({ req, res, opts, query }, drillMatch) {
|
|
|
120
122
|
drillExtra.budget = budget;
|
|
121
123
|
if (depth !== undefined)
|
|
122
124
|
drillExtra.depth = depth;
|
|
123
|
-
const result = drillDown(ctx, drillMatch.id, { ...drillExtra, cost: drillCost });
|
|
125
|
+
const result = await drillDown(ctx, drillMatch.id, { ...drillExtra, cost: drillCost });
|
|
124
126
|
if ('failure' in result) {
|
|
125
127
|
// Leaf id maps to 422 (caller-actionable). Other cases stay
|
|
126
128
|
// as 404 to avoid leaking cross-tenant existence or scope grants.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { RouteRequest } from '../types.js';
|
|
2
|
-
export declare function handleCreateSkill(
|
|
3
|
-
export declare function handleListSkills(
|
|
4
|
-
export declare function handleExportSkills(
|
|
5
|
-
export declare function handleSupersedeSkill(
|
|
6
|
-
export declare function handleCloseSkill(
|
|
7
|
-
export declare function handleGetSkill(
|
|
2
|
+
export declare function handleCreateSkill(rr: RouteRequest): Promise<void>;
|
|
3
|
+
export declare function handleListSkills(rr: RouteRequest): Promise<void>;
|
|
4
|
+
export declare function handleExportSkills(rr: RouteRequest): Promise<void>;
|
|
5
|
+
export declare function handleSupersedeSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
6
|
+
export declare function handleCloseSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
7
|
+
export declare function handleGetSkill(rr: RouteRequest, match: RegExpMatchArray): Promise<void>;
|
|
8
8
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
// /v1/skills routes.
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { MAX_SKILL_NAME_LEN, SKILL, skillsMarkdown } from '../../objects/skills.js';
|
|
3
|
+
import { sendJson } from '../../util/http-util.js';
|
|
4
4
|
import { buildContextWithAuth } from '../auth.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
5
|
+
import { parseJsonBody } from '../validation.js';
|
|
6
|
+
import { closeRoute, getRoute, listRoute, objectsOf, optionalString, requiredString, saveFor, supersedeRoute } from './object-routes.js';
|
|
7
|
+
const INSTRUCTIONS = { max: 8192, plural: true };
|
|
8
|
+
const skillRoutes = {
|
|
9
|
+
noun: 'skill',
|
|
10
|
+
field: 'skill',
|
|
11
|
+
listField: 'skills',
|
|
12
|
+
object: SKILL,
|
|
13
|
+
revise: (body) => {
|
|
14
|
+
const instructions = requiredString(body, 'instructions', INSTRUCTIONS);
|
|
15
|
+
const trigger = optionalString(body, 'trigger', 1024);
|
|
16
|
+
const changeSummary = optionalString(body, 'changeSummary', 4096);
|
|
17
|
+
return (existing, id) => ({ skillName: existing.skillName, instructions, trigger, changeSummary, supersedesSkillId: id });
|
|
18
|
+
},
|
|
19
|
+
};
|
|
8
20
|
// ── skills (first-class object, executable/exportable) ──
|
|
9
21
|
//
|
|
10
22
|
// 6 routes: POST /v1/skills (new; body skillName + instructions + trigger?),
|
|
@@ -17,135 +29,35 @@ import { isJsonString } from '../../json.js';
|
|
|
17
29
|
// validates + throws; the boundary maps validation -> 400, not-found -> 404,
|
|
18
30
|
// not-active -> 409. Mirrors /v1/processes; "executable" = exportable
|
|
19
31
|
// instruction (no code exec).
|
|
20
|
-
export async function handleCreateSkill(
|
|
21
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
22
|
-
const body = await parseJsonBody(req, ctx);
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const instructions = body['instructions'];
|
|
31
|
-
if (!isJsonString(instructions) || instructions.trim().length === 0) {
|
|
32
|
-
throw new HttpError(400, 'instructions are required (non-empty string)');
|
|
33
|
-
}
|
|
34
|
-
if (instructions.length > 8192) {
|
|
35
|
-
throw new HttpError(400, 'instructions exceed 8192-character cap');
|
|
36
|
-
}
|
|
37
|
-
const triggerRaw = body['trigger'];
|
|
38
|
-
let trigger;
|
|
39
|
-
if (triggerRaw !== undefined && triggerRaw !== null) {
|
|
40
|
-
if (!isJsonString(triggerRaw)) {
|
|
41
|
-
throw new HttpError(400, 'trigger must be a string');
|
|
42
|
-
}
|
|
43
|
-
if (triggerRaw.length > 1024) {
|
|
44
|
-
throw new HttpError(400, 'trigger exceeds 1024-character cap');
|
|
45
|
-
}
|
|
46
|
-
trigger = triggerRaw;
|
|
47
|
-
}
|
|
48
|
-
const skill = saveSkill(opts.hippoRoot, ctx.tenantId, {
|
|
49
|
-
skillName,
|
|
50
|
-
instructions,
|
|
51
|
-
trigger,
|
|
52
|
-
}, ctx.actor.subject);
|
|
53
|
-
sendJson(res, 201, { skill });
|
|
54
|
-
return;
|
|
32
|
+
export async function handleCreateSkill(rr) {
|
|
33
|
+
const ctx = await buildContextWithAuth(rr.req, rr.opts);
|
|
34
|
+
const body = await parseJsonBody(rr.req, ctx);
|
|
35
|
+
const skill = await saveFor(rr, SKILL, ctx.tenantId, ctx.actor.subject, {
|
|
36
|
+
skillName: requiredString(body, 'skillName', { max: MAX_SKILL_NAME_LEN }),
|
|
37
|
+
instructions: requiredString(body, 'instructions', INSTRUCTIONS),
|
|
38
|
+
trigger: optionalString(body, 'trigger', 1024),
|
|
39
|
+
});
|
|
40
|
+
sendJson(rr.res, 201, { skill });
|
|
55
41
|
}
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
const limit = parseListLimit(query.get('limit'));
|
|
59
|
-
const after = parseCursor(query.get('cursor'), 'string', 'integer');
|
|
60
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
61
|
-
let skills;
|
|
62
|
-
if (status === 'all') {
|
|
63
|
-
skills = loadSkills(opts.hippoRoot, ctx.tenantId, { limit: limit + 1, after });
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
if (!isSetMember(VALID_SKILL_STATES, status)) {
|
|
67
|
-
throw new HttpError(400, `status must be one of: active | superseded | closed | all (got "${status}")`);
|
|
68
|
-
}
|
|
69
|
-
skills = loadSkills(opts.hippoRoot, ctx.tenantId, {
|
|
70
|
-
status,
|
|
71
|
-
limit: limit + 1,
|
|
72
|
-
after,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
const page = pageOf(skills, limit, byCreatedAt);
|
|
76
|
-
sendJson(res, 200, { skills: page.items, next_cursor: page.nextCursor });
|
|
77
|
-
return;
|
|
42
|
+
export function handleListSkills(rr) {
|
|
43
|
+
return listRoute(skillRoutes, rr);
|
|
78
44
|
}
|
|
79
45
|
// The export renderer: must precede the /:id GET (literal 'export' is
|
|
80
46
|
// non-numeric so the /(\d+)/ route would not match it, but order it first).
|
|
81
|
-
export async function handleExportSkills(
|
|
47
|
+
export async function handleExportSkills(rr) {
|
|
48
|
+
const { req, res, opts } = rr;
|
|
82
49
|
const ctx = await buildContextWithAuth(req, opts);
|
|
83
|
-
const markdown =
|
|
50
|
+
const markdown = await skillsMarkdown(objectsOf(rr), ctx.tenantId);
|
|
84
51
|
sendJson(res, 200, { markdown });
|
|
85
52
|
return;
|
|
86
53
|
}
|
|
87
|
-
export
|
|
88
|
-
|
|
89
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
90
|
-
const body = await parseJsonBody(req, ctx);
|
|
91
|
-
const instructions = body['instructions'];
|
|
92
|
-
if (!isJsonString(instructions) || instructions.trim().length === 0) {
|
|
93
|
-
throw new HttpError(400, 'instructions are required (non-empty string)');
|
|
94
|
-
}
|
|
95
|
-
if (instructions.length > 8192) {
|
|
96
|
-
throw new HttpError(400, 'instructions exceed 8192-character cap');
|
|
97
|
-
}
|
|
98
|
-
const triggerRaw = body['trigger'];
|
|
99
|
-
let trigger;
|
|
100
|
-
if (triggerRaw !== undefined && triggerRaw !== null) {
|
|
101
|
-
if (!isJsonString(triggerRaw)) {
|
|
102
|
-
throw new HttpError(400, 'trigger must be a string');
|
|
103
|
-
}
|
|
104
|
-
if (triggerRaw.length > 1024) {
|
|
105
|
-
throw new HttpError(400, 'trigger exceeds 1024-character cap');
|
|
106
|
-
}
|
|
107
|
-
trigger = triggerRaw;
|
|
108
|
-
}
|
|
109
|
-
const changeRaw = body['changeSummary'];
|
|
110
|
-
let changeSummary;
|
|
111
|
-
if (changeRaw !== undefined && changeRaw !== null) {
|
|
112
|
-
if (!isJsonString(changeRaw)) {
|
|
113
|
-
throw new HttpError(400, 'changeSummary must be a string');
|
|
114
|
-
}
|
|
115
|
-
if (changeRaw.length > 4096) {
|
|
116
|
-
throw new HttpError(400, 'changeSummary exceeds 4096-character cap');
|
|
117
|
-
}
|
|
118
|
-
changeSummary = changeRaw;
|
|
119
|
-
}
|
|
120
|
-
const existing = loadSkillById(opts.hippoRoot, ctx.tenantId, id);
|
|
121
|
-
if (!existing) {
|
|
122
|
-
throw new HttpError(404, `skill ${id} not found`);
|
|
123
|
-
}
|
|
124
|
-
const skill = saveSkill(opts.hippoRoot, ctx.tenantId, {
|
|
125
|
-
skillName: existing.skillName,
|
|
126
|
-
instructions,
|
|
127
|
-
trigger,
|
|
128
|
-
changeSummary,
|
|
129
|
-
supersedesSkillId: id,
|
|
130
|
-
}, ctx.actor.subject);
|
|
131
|
-
sendJson(res, 200, { skill });
|
|
132
|
-
return;
|
|
54
|
+
export function handleSupersedeSkill(rr, match) {
|
|
55
|
+
return supersedeRoute(skillRoutes, rr, match);
|
|
133
56
|
}
|
|
134
|
-
export
|
|
135
|
-
|
|
136
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
137
|
-
const skill = closeSkill(opts.hippoRoot, ctx.tenantId, id, ctx.actor.subject);
|
|
138
|
-
sendJson(res, 200, { skill });
|
|
139
|
-
return;
|
|
57
|
+
export function handleCloseSkill(rr, match) {
|
|
58
|
+
return closeRoute(skillRoutes, rr, match);
|
|
140
59
|
}
|
|
141
|
-
export
|
|
142
|
-
|
|
143
|
-
const ctx = await buildContextWithAuth(req, opts);
|
|
144
|
-
const skill = loadSkillById(opts.hippoRoot, ctx.tenantId, id);
|
|
145
|
-
if (!skill) {
|
|
146
|
-
throw new HttpError(404, `skill ${id} not found`);
|
|
147
|
-
}
|
|
148
|
-
sendJson(res, 200, { skill });
|
|
149
|
-
return;
|
|
60
|
+
export function handleGetSkill(rr, match) {
|
|
61
|
+
return getRoute(skillRoutes, rr, match);
|
|
150
62
|
}
|
|
151
63
|
//# sourceMappingURL=skills.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync, unlinkSync, renameSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { envHealthProbeMs } from '
|
|
3
|
+
import { envHealthProbeMs } from '../util/env.js';
|
|
4
4
|
// Pidfile sits directly inside hippoRoot. `hippoRoot` is the `.hippo`
|
|
5
5
|
// directory itself (the same convention used by api.ts / store.ts /
|
|
6
6
|
// openHippoDb), so this resolves to `${hippoRoot}/server.pid`.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Entry of the process that runs one POST /v1/sleep; sleep-offload.ts starts it and nothing imports it.
|
|
2
|
+
// The sleep module alone: the api barrel loads far more than one sleep needs, and every sleep pays for the start.
|
|
3
|
+
import { sleep } from '../api/sleep.js';
|
|
4
|
+
import { isStoreBusy, runWithRequestStores, SERVER_DB_WAIT_MS } from '../db/index.js';
|
|
5
|
+
import { errorMessage } from '../util/log.js';
|
|
6
|
+
function failed(err) {
|
|
7
|
+
return { ok: false, busy: isStoreBusy(err), message: errorMessage(err), stack: err instanceof Error ? err.stack : undefined };
|
|
8
|
+
}
|
|
9
|
+
process.once('message', (message) => {
|
|
10
|
+
// SAFETY: sleep-offload.ts is the only writer on this channel and sends exactly one SleepJob.
|
|
11
|
+
const job = message;
|
|
12
|
+
const ctx = { hippoRoot: job.hippoRoot, tenantId: job.tenantId, actor: job.actor };
|
|
13
|
+
// The server's own request scope and lock wait, so a busy store answers as it did when sleep ran in the server.
|
|
14
|
+
runWithRequestStores(() => sleep(ctx, job.opts), { busyWaitMs: SERVER_DB_WAIT_MS })
|
|
15
|
+
.then((result) => ({ ok: true, result }), failed)
|
|
16
|
+
// Exit only once the reply is written, or the parent could see the process end first.
|
|
17
|
+
.then((reply) => process.send?.(reply, () => process.exit(0)));
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=sleep-child.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Actor, type Context, type SleepOpts, type SleepResult } from '../api/index.js';
|
|
2
|
+
/** What the child needs to rebuild the request's context; the store handle itself cannot cross a process boundary. */
|
|
3
|
+
export interface SleepJob {
|
|
4
|
+
readonly hippoRoot: string;
|
|
5
|
+
readonly tenantId: string;
|
|
6
|
+
readonly actor: Actor;
|
|
7
|
+
readonly opts: SleepOpts;
|
|
8
|
+
}
|
|
9
|
+
export type SleepReply = {
|
|
10
|
+
readonly ok: true;
|
|
11
|
+
readonly result: SleepResult;
|
|
12
|
+
} | {
|
|
13
|
+
readonly ok: false;
|
|
14
|
+
readonly busy: boolean;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
readonly stack?: string;
|
|
17
|
+
};
|
|
18
|
+
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline (10 minutes, or HIPPO_SLEEP_TIMEOUT_MS). */
|
|
19
|
+
export declare function sleepInChild(ctx: Context, opts: SleepOpts): Promise<SleepResult>;
|
|
20
|
+
//# sourceMappingURL=sleep-offload.d.ts.map
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// POST /v1/sleep runs its consolidation in a child process, so the server keeps answering and a stuck run can be stopped.
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { sleep } from '../api/index.js';
|
|
5
|
+
import { StoreBusyError } from '../db/index.js';
|
|
6
|
+
import { envSleepTimeoutMs } from '../util/env.js';
|
|
7
|
+
import { HttpError } from '../util/http-util.js';
|
|
8
|
+
const DEFAULT_SLEEP_DEADLINE_MS = 600_000;
|
|
9
|
+
// Resolved from the package root, so a server run from TypeScript source starts the same built file.
|
|
10
|
+
const CHILD_ENTRY = fileURLToPath(new URL('../../dist/server/sleep-child.js', import.meta.url));
|
|
11
|
+
function failureOf(reply, code, signal) {
|
|
12
|
+
if (!reply || reply.ok)
|
|
13
|
+
return new Error(`sleep process ended without an answer (code ${code}, signal ${signal})`);
|
|
14
|
+
// A lock the child could not get is the same retryable 503 an in-process sleep gave.
|
|
15
|
+
if (reply.busy)
|
|
16
|
+
return new StoreBusyError(reply.message);
|
|
17
|
+
const failure = new Error(reply.message);
|
|
18
|
+
if (reply.stack)
|
|
19
|
+
failure.stack = reply.stack;
|
|
20
|
+
return failure;
|
|
21
|
+
}
|
|
22
|
+
function runInChild(job) {
|
|
23
|
+
const deadlineMs = envSleepTimeoutMs() ?? DEFAULT_SLEEP_DEADLINE_MS;
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
// The child's stderr is the server's log, so Node's SQLite notice would repeat there on every sleep.
|
|
26
|
+
const child = spawn(process.execPath, ['--disable-warning=ExperimentalWarning', CHILD_ENTRY], { stdio: ['ignore', 'inherit', 'inherit', 'ipc'], windowsHide: true });
|
|
27
|
+
let reply;
|
|
28
|
+
let timedOut = false;
|
|
29
|
+
// SIGKILL because the child is inside synchronous SQLite work and cannot run a handler; the OS drops its write lock.
|
|
30
|
+
const timer = setTimeout(() => { timedOut = true; child.kill('SIGKILL'); }, deadlineMs);
|
|
31
|
+
child.once('message', (message) => {
|
|
32
|
+
// SAFETY: sleep-child.ts is the only writer on this channel and sends exactly one SleepReply.
|
|
33
|
+
reply = message;
|
|
34
|
+
});
|
|
35
|
+
child.once('error', (err) => { clearTimeout(timer); reject(err); });
|
|
36
|
+
// 'close' and not 'exit': it waits for the channel to drain, so the reply is in hand and the child's store handles are gone.
|
|
37
|
+
child.once('close', (code, signal) => {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
if (timedOut)
|
|
40
|
+
reject(new HttpError(504, `sleep did not finish within ${deadlineMs} ms and was stopped; the next sleep carries on from there`));
|
|
41
|
+
else if (reply?.ok)
|
|
42
|
+
resolve(reply.result);
|
|
43
|
+
else
|
|
44
|
+
reject(failureOf(reply, code, signal));
|
|
45
|
+
});
|
|
46
|
+
child.send(job);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
let turn = Promise.resolve();
|
|
50
|
+
// One running and one waiting: each further sleep would only hold a request open behind work the waiting one already covers.
|
|
51
|
+
const MAX_SLEEPS_IN_LINE = 2;
|
|
52
|
+
const SLEEP_RETRY_AFTER_SEC = 30;
|
|
53
|
+
let inLine = 0;
|
|
54
|
+
/** `sleep` for the HTTP route: same result and errors, run outside the serving process and stopped at the deadline (10 minutes, or HIPPO_SLEEP_TIMEOUT_MS). */
|
|
55
|
+
export function sleepInChild(ctx, opts) {
|
|
56
|
+
// The child reopens the store by path, which only SQLite has; any other store keeps sleep's own refusal.
|
|
57
|
+
if (ctx.store && ctx.store.kind !== 'sqlite')
|
|
58
|
+
return sleep(ctx, opts);
|
|
59
|
+
if (inLine >= MAX_SLEEPS_IN_LINE) {
|
|
60
|
+
return Promise.reject(new HttpError(503, 'a sleep is already running and another is waiting; retry when one has finished', SLEEP_RETRY_AFTER_SEC));
|
|
61
|
+
}
|
|
62
|
+
inLine += 1;
|
|
63
|
+
const job = { hippoRoot: ctx.hippoRoot, tenantId: ctx.tenantId, actor: ctx.actor, opts };
|
|
64
|
+
// One sleep at a time, as on the server's single thread: a second request waits its turn and does not fight the first for the write lock.
|
|
65
|
+
const run = turn.then(() => runInChild(job));
|
|
66
|
+
// A failed sleep reaches its own request through `run`; the queue only needs to know the turn is over.
|
|
67
|
+
turn = run.then(() => undefined, () => undefined).finally(() => { inLine -= 1; });
|
|
68
|
+
return run;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=sleep-offload.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type RequestListener, type Server } from 'node:http';
|
|
2
|
+
import type { ServeOpts } from './types.js';
|
|
3
|
+
export declare function createListener(tls: ServeOpts['tls'], onRequest: RequestListener): Server;
|
|
4
|
+
/** Said once at boot: a non-loopback bind without TLS sends every key and memory over the network as plain text. */
|
|
5
|
+
export declare function warnIfCleartext(host: string, tls: ServeOpts['tls'], loopbackHosts: ReadonlySet<string>): void;
|
|
6
|
+
//# sourceMappingURL=tls.d.ts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// The serve() listener: node:https when a certificate is given, else node:http and a boot warning off loopback.
|
|
2
|
+
import { createServer as createHttpServer } from 'node:http';
|
|
3
|
+
import { createServer as createHttpsServer } from 'node:https';
|
|
4
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
export function createListener(tls, onRequest) {
|
|
6
|
+
if (!tls)
|
|
7
|
+
return createHttpServer(onRequest);
|
|
8
|
+
try {
|
|
9
|
+
// Explicit so the floor does not move with the runtime's default.
|
|
10
|
+
return createHttpsServer({ cert: tls.cert, key: tls.key, minVersion: 'TLSv1.2' }, onRequest);
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
// OpenSSL's own text names no file, so the operator would not know which input was refused.
|
|
14
|
+
throw new Error(`hippo serve: the TLS certificate or key was refused: ${errorMessage(err)}`, { cause: err });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Said once at boot: a non-loopback bind without TLS sends every key and memory over the network as plain text. */
|
|
18
|
+
export function warnIfCleartext(host, tls, loopbackHosts) {
|
|
19
|
+
if (tls || loopbackHosts.has(host))
|
|
20
|
+
return;
|
|
21
|
+
log.warn(`serve: listening on ${host} without TLS, so API keys and memory text travel in cleartext unless a TLS-terminating proxy sits in front. ` +
|
|
22
|
+
'To serve HTTPS directly, pass --tls-cert and --tls-key (or set HIPPO_TLS_CERT and HIPPO_TLS_KEY).');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tls.js.map
|