@saihm/shm 0.0.0-stage → 0.38.1
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/LICENSE +97 -0
- package/NOTICE +12 -0
- package/README.md +159 -2
- package/dist/adapter/epoch.d.ts +4 -0
- package/dist/adapter/epoch.d.ts.map +1 -0
- package/dist/adapter/epoch.js +16 -0
- package/dist/adapter/epoch.js.map +1 -0
- package/dist/adapter/frontmatter.d.ts +19 -0
- package/dist/adapter/frontmatter.d.ts.map +1 -0
- package/dist/adapter/frontmatter.js +95 -0
- package/dist/adapter/frontmatter.js.map +1 -0
- package/dist/adapter/index.d.ts +4 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +4 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/markdown_dir_port.d.ts +48 -0
- package/dist/adapter/markdown_dir_port.d.ts.map +1 -0
- package/dist/adapter/markdown_dir_port.js +175 -0
- package/dist/adapter/markdown_dir_port.js.map +1 -0
- package/dist/aggregate/document_aggregation.d.ts +40 -0
- package/dist/aggregate/document_aggregation.d.ts.map +1 -0
- package/dist/aggregate/document_aggregation.js +101 -0
- package/dist/aggregate/document_aggregation.js.map +1 -0
- package/dist/aggregate/index.d.ts +2 -0
- package/dist/aggregate/index.d.ts.map +1 -0
- package/dist/aggregate/index.js +2 -0
- package/dist/aggregate/index.js.map +1 -0
- package/dist/answer/answer_layer.d.ts +33 -0
- package/dist/answer/answer_layer.d.ts.map +1 -0
- package/dist/answer/answer_layer.js +75 -0
- package/dist/answer/answer_layer.js.map +1 -0
- package/dist/answer/caching_body_source.d.ts +42 -0
- package/dist/answer/caching_body_source.d.ts.map +1 -0
- package/dist/answer/caching_body_source.js +120 -0
- package/dist/answer/caching_body_source.js.map +1 -0
- package/dist/answer/claude_cli_backend.d.ts +10 -0
- package/dist/answer/claude_cli_backend.d.ts.map +1 -0
- package/dist/answer/claude_cli_backend.js +60 -0
- package/dist/answer/claude_cli_backend.js.map +1 -0
- package/dist/answer/context.d.ts +6 -0
- package/dist/answer/context.d.ts.map +1 -0
- package/dist/answer/context.js +83 -0
- package/dist/answer/context.js.map +1 -0
- package/dist/answer/corpus_warmer.d.ts +44 -0
- package/dist/answer/corpus_warmer.d.ts.map +1 -0
- package/dist/answer/corpus_warmer.js +80 -0
- package/dist/answer/corpus_warmer.js.map +1 -0
- package/dist/answer/gate.d.ts +3 -0
- package/dist/answer/gate.d.ts.map +1 -0
- package/dist/answer/gate.js +35 -0
- package/dist/answer/gate.js.map +1 -0
- package/dist/answer/index.d.ts +20 -0
- package/dist/answer/index.d.ts.map +1 -0
- package/dist/answer/index.js +11 -0
- package/dist/answer/index.js.map +1 -0
- package/dist/answer/own_cell_body_source.d.ts +34 -0
- package/dist/answer/own_cell_body_source.d.ts.map +1 -0
- package/dist/answer/own_cell_body_source.js +66 -0
- package/dist/answer/own_cell_body_source.js.map +1 -0
- package/dist/answer/persistent_body_source.d.ts +50 -0
- package/dist/answer/persistent_body_source.d.ts.map +1 -0
- package/dist/answer/persistent_body_source.js +173 -0
- package/dist/answer/persistent_body_source.js.map +1 -0
- package/dist/answer/saihm_body_source.d.ts +27 -0
- package/dist/answer/saihm_body_source.d.ts.map +1 -0
- package/dist/answer/saihm_body_source.js +88 -0
- package/dist/answer/saihm_body_source.js.map +1 -0
- package/dist/answer/structured_answerer.d.ts +23 -0
- package/dist/answer/structured_answerer.d.ts.map +1 -0
- package/dist/answer/structured_answerer.js +103 -0
- package/dist/answer/structured_answerer.js.map +1 -0
- package/dist/answer/supersede.d.ts +12 -0
- package/dist/answer/supersede.d.ts.map +1 -0
- package/dist/answer/supersede.js +27 -0
- package/dist/answer/supersede.js.map +1 -0
- package/dist/answer/types.d.ts +53 -0
- package/dist/answer/types.d.ts.map +1 -0
- package/dist/answer/types.js +2 -0
- package/dist/answer/types.js.map +1 -0
- package/dist/assemble/brief.d.ts +83 -0
- package/dist/assemble/brief.d.ts.map +1 -0
- package/dist/assemble/brief.js +312 -0
- package/dist/assemble/brief.js.map +1 -0
- package/dist/assemble/index.d.ts +4 -0
- package/dist/assemble/index.d.ts.map +1 -0
- package/dist/assemble/index.js +4 -0
- package/dist/assemble/index.js.map +1 -0
- package/dist/assemble/posture.d.ts +23 -0
- package/dist/assemble/posture.d.ts.map +1 -0
- package/dist/assemble/posture.js +68 -0
- package/dist/assemble/posture.js.map +1 -0
- package/dist/assemble/thread.d.ts +53 -0
- package/dist/assemble/thread.d.ts.map +1 -0
- package/dist/assemble/thread.js +122 -0
- package/dist/assemble/thread.js.map +1 -0
- package/dist/attention/index.d.ts +5 -0
- package/dist/attention/index.d.ts.map +1 -0
- package/dist/attention/index.js +3 -0
- package/dist/attention/index.js.map +1 -0
- package/dist/attention/obligations.d.ts +23 -0
- package/dist/attention/obligations.d.ts.map +1 -0
- package/dist/attention/obligations.js +110 -0
- package/dist/attention/obligations.js.map +1 -0
- package/dist/attention/queue.d.ts +38 -0
- package/dist/attention/queue.d.ts.map +1 -0
- package/dist/attention/queue.js +102 -0
- package/dist/attention/queue.js.map +1 -0
- package/dist/claim/index.d.ts +23 -0
- package/dist/claim/index.d.ts.map +1 -0
- package/dist/claim/index.js +57 -0
- package/dist/claim/index.js.map +1 -0
- package/dist/claim/withdrawn.d.ts +17 -0
- package/dist/claim/withdrawn.d.ts.map +1 -0
- package/dist/claim/withdrawn.js +41 -0
- package/dist/claim/withdrawn.js.map +1 -0
- package/dist/compliance/index.d.ts +3 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +3 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/report.d.ts +123 -0
- package/dist/compliance/report.d.ts.map +1 -0
- package/dist/compliance/report.js +295 -0
- package/dist/compliance/report.js.map +1 -0
- package/dist/compliance/trail.d.ts +180 -0
- package/dist/compliance/trail.d.ts.map +1 -0
- package/dist/compliance/trail.js +130 -0
- package/dist/compliance/trail.js.map +1 -0
- package/dist/consolidate/body_redundancy.d.ts +54 -0
- package/dist/consolidate/body_redundancy.d.ts.map +1 -0
- package/dist/consolidate/body_redundancy.js +150 -0
- package/dist/consolidate/body_redundancy.js.map +1 -0
- package/dist/consolidate/consolidator.d.ts +62 -0
- package/dist/consolidate/consolidator.d.ts.map +1 -0
- package/dist/consolidate/consolidator.js +260 -0
- package/dist/consolidate/consolidator.js.map +1 -0
- package/dist/consolidate/index.d.ts +4 -0
- package/dist/consolidate/index.d.ts.map +1 -0
- package/dist/consolidate/index.js +4 -0
- package/dist/consolidate/index.js.map +1 -0
- package/dist/consolidate/index_guard.d.ts +63 -0
- package/dist/consolidate/index_guard.d.ts.map +1 -0
- package/dist/consolidate/index_guard.js +212 -0
- package/dist/consolidate/index_guard.js.map +1 -0
- package/dist/coordination/identity.d.ts +39 -0
- package/dist/coordination/identity.d.ts.map +1 -0
- package/dist/coordination/identity.js +97 -0
- package/dist/coordination/identity.js.map +1 -0
- package/dist/coordination/inbound.d.ts +41 -0
- package/dist/coordination/inbound.d.ts.map +1 -0
- package/dist/coordination/inbound.js +119 -0
- package/dist/coordination/inbound.js.map +1 -0
- package/dist/coordination/index.d.ts +12 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +7 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/note_lineage.d.ts +50 -0
- package/dist/coordination/note_lineage.d.ts.map +1 -0
- package/dist/coordination/note_lineage.js +132 -0
- package/dist/coordination/note_lineage.js.map +1 -0
- package/dist/coordination/outbound.d.ts +33 -0
- package/dist/coordination/outbound.d.ts.map +1 -0
- package/dist/coordination/outbound.js +69 -0
- package/dist/coordination/outbound.js.map +1 -0
- package/dist/coordination/share_states.d.ts +178 -0
- package/dist/coordination/share_states.d.ts.map +1 -0
- package/dist/coordination/share_states.js +864 -0
- package/dist/coordination/share_states.js.map +1 -0
- package/dist/coordination/untrusted_text.d.ts +3 -0
- package/dist/coordination/untrusted_text.d.ts.map +1 -0
- package/dist/coordination/untrusted_text.js +21 -0
- package/dist/coordination/untrusted_text.js.map +1 -0
- package/dist/deref/dereference.d.ts +68 -0
- package/dist/deref/dereference.d.ts.map +1 -0
- package/dist/deref/dereference.js +199 -0
- package/dist/deref/dereference.js.map +1 -0
- package/dist/deref/index.d.ts +3 -0
- package/dist/deref/index.d.ts.map +1 -0
- package/dist/deref/index.js +3 -0
- package/dist/deref/index.js.map +1 -0
- package/dist/deref/policy.d.ts +76 -0
- package/dist/deref/policy.d.ts.map +1 -0
- package/dist/deref/policy.js +281 -0
- package/dist/deref/policy.js.map +1 -0
- package/dist/derived/checkpoint.d.ts +22 -0
- package/dist/derived/checkpoint.d.ts.map +1 -0
- package/dist/derived/checkpoint.js +92 -0
- package/dist/derived/checkpoint.js.map +1 -0
- package/dist/derived/codec.d.ts +26 -0
- package/dist/derived/codec.d.ts.map +1 -0
- package/dist/derived/codec.js +116 -0
- package/dist/derived/codec.js.map +1 -0
- package/dist/derived/cycle.d.ts +96 -0
- package/dist/derived/cycle.d.ts.map +1 -0
- package/dist/derived/cycle.js +199 -0
- package/dist/derived/cycle.js.map +1 -0
- package/dist/derived/index.d.ts +7 -0
- package/dist/derived/index.d.ts.map +1 -0
- package/dist/derived/index.js +7 -0
- package/dist/derived/index.js.map +1 -0
- package/dist/derived/ledger.d.ts +54 -0
- package/dist/derived/ledger.d.ts.map +1 -0
- package/dist/derived/ledger.js +123 -0
- package/dist/derived/ledger.js.map +1 -0
- package/dist/derived/lineage_index.d.ts +17 -0
- package/dist/derived/lineage_index.d.ts.map +1 -0
- package/dist/derived/lineage_index.js +51 -0
- package/dist/derived/lineage_index.js.map +1 -0
- package/dist/derived/store.d.ts +92 -0
- package/dist/derived/store.d.ts.map +1 -0
- package/dist/derived/store.js +230 -0
- package/dist/derived/store.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +4 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/local_minilm.d.ts +9 -0
- package/dist/embed/local_minilm.d.ts.map +1 -0
- package/dist/embed/local_minilm.js +31 -0
- package/dist/embed/local_minilm.js.map +1 -0
- package/dist/embed/remote_http.d.ts +26 -0
- package/dist/embed/remote_http.d.ts.map +1 -0
- package/dist/embed/remote_http.js +40 -0
- package/dist/embed/remote_http.js.map +1 -0
- package/dist/embed/router.d.ts +16 -0
- package/dist/embed/router.d.ts.map +1 -0
- package/dist/embed/router.js +47 -0
- package/dist/embed/router.js.map +1 -0
- package/dist/embed/types.d.ts +23 -0
- package/dist/embed/types.d.ts.map +1 -0
- package/dist/embed/types.js +2 -0
- package/dist/embed/types.js.map +1 -0
- package/dist/entitlement/entitlement.d.ts +24 -0
- package/dist/entitlement/entitlement.d.ts.map +1 -0
- package/dist/entitlement/entitlement.js +78 -0
- package/dist/entitlement/entitlement.js.map +1 -0
- package/dist/entitlement/index.d.ts +2 -0
- package/dist/entitlement/index.d.ts.map +1 -0
- package/dist/entitlement/index.js +2 -0
- package/dist/entitlement/index.js.map +1 -0
- package/dist/erasure/bus.d.ts +18 -0
- package/dist/erasure/bus.d.ts.map +1 -0
- package/dist/erasure/bus.js +56 -0
- package/dist/erasure/bus.js.map +1 -0
- package/dist/erasure/changes_feed.d.ts +125 -0
- package/dist/erasure/changes_feed.d.ts.map +1 -0
- package/dist/erasure/changes_feed.js +252 -0
- package/dist/erasure/changes_feed.js.map +1 -0
- package/dist/erasure/changes_reader.d.ts +44 -0
- package/dist/erasure/changes_reader.d.ts.map +1 -0
- package/dist/erasure/changes_reader.js +184 -0
- package/dist/erasure/changes_reader.js.map +1 -0
- package/dist/erasure/feed_watcher.d.ts +140 -0
- package/dist/erasure/feed_watcher.d.ts.map +1 -0
- package/dist/erasure/feed_watcher.js +418 -0
- package/dist/erasure/feed_watcher.js.map +1 -0
- package/dist/erasure/index.d.ts +15 -0
- package/dist/erasure/index.d.ts.map +1 -0
- package/dist/erasure/index.js +8 -0
- package/dist/erasure/index.js.map +1 -0
- package/dist/erasure/index_watcher.d.ts +28 -0
- package/dist/erasure/index_watcher.d.ts.map +1 -0
- package/dist/erasure/index_watcher.js +87 -0
- package/dist/erasure/index_watcher.js.map +1 -0
- package/dist/erasure/reconcile.d.ts +72 -0
- package/dist/erasure/reconcile.d.ts.map +1 -0
- package/dist/erasure/reconcile.js +125 -0
- package/dist/erasure/reconcile.js.map +1 -0
- package/dist/erasure/withheld_store.d.ts +30 -0
- package/dist/erasure/withheld_store.d.ts.map +1 -0
- package/dist/erasure/withheld_store.js +91 -0
- package/dist/erasure/withheld_store.js.map +1 -0
- package/dist/fleet/index.d.ts +2 -0
- package/dist/fleet/index.d.ts.map +1 -0
- package/dist/fleet/index.js +2 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/knowledge.d.ts +74 -0
- package/dist/fleet/knowledge.d.ts.map +1 -0
- package/dist/fleet/knowledge.js +178 -0
- package/dist/fleet/knowledge.js.map +1 -0
- package/dist/gate/index.d.ts +5 -0
- package/dist/gate/index.d.ts.map +1 -0
- package/dist/gate/index.js +3 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/gate/scope.d.ts +21 -0
- package/dist/gate/scope.d.ts.map +1 -0
- package/dist/gate/scope.js +40 -0
- package/dist/gate/scope.js.map +1 -0
- package/dist/gate/symmetry.d.ts +55 -0
- package/dist/gate/symmetry.d.ts.map +1 -0
- package/dist/gate/symmetry.js +162 -0
- package/dist/gate/symmetry.js.map +1 -0
- package/dist/history/answerable.d.ts +51 -0
- package/dist/history/answerable.d.ts.map +1 -0
- package/dist/history/answerable.js +112 -0
- package/dist/history/answerable.js.map +1 -0
- package/dist/history/index.d.ts +2 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +2 -0
- package/dist/history/index.js.map +1 -0
- package/dist/host/adapter.d.ts +69 -0
- package/dist/host/adapter.d.ts.map +1 -0
- package/dist/host/adapter.js +159 -0
- package/dist/host/adapter.js.map +1 -0
- package/dist/host/cli.d.ts +3 -0
- package/dist/host/cli.d.ts.map +1 -0
- package/dist/host/cli.js +44 -0
- package/dist/host/cli.js.map +1 -0
- package/dist/host/client.d.ts +22 -0
- package/dist/host/client.d.ts.map +1 -0
- package/dist/host/client.js +135 -0
- package/dist/host/client.js.map +1 -0
- package/dist/host/compaction.d.ts +16 -0
- package/dist/host/compaction.d.ts.map +1 -0
- package/dist/host/compaction.js +89 -0
- package/dist/host/compaction.js.map +1 -0
- package/dist/host/event.d.ts +22 -0
- package/dist/host/event.d.ts.map +1 -0
- package/dist/host/event.js +47 -0
- package/dist/host/event.js.map +1 -0
- package/dist/host/index.d.ts +10 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +10 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/reply.d.ts +11 -0
- package/dist/host/reply.d.ts.map +1 -0
- package/dist/host/reply.js +24 -0
- package/dist/host/reply.js.map +1 -0
- package/dist/host/session_brief.d.ts +80 -0
- package/dist/host/session_brief.d.ts.map +1 -0
- package/dist/host/session_brief.js +294 -0
- package/dist/host/session_brief.js.map +1 -0
- package/dist/host/session_start_event.d.ts +12 -0
- package/dist/host/session_start_event.d.ts.map +1 -0
- package/dist/host/session_start_event.js +35 -0
- package/dist/host/session_start_event.js.map +1 -0
- package/dist/host/sessions.d.ts +8 -0
- package/dist/host/sessions.d.ts.map +1 -0
- package/dist/host/sessions.js +32 -0
- package/dist/host/sessions.js.map +1 -0
- package/dist/host/socket_path.d.ts +3 -0
- package/dist/host/socket_path.d.ts.map +1 -0
- package/dist/host/socket_path.js +14 -0
- package/dist/host/socket_path.js.map +1 -0
- package/dist/inbound/index.d.ts +8 -0
- package/dist/inbound/index.d.ts.map +1 -0
- package/dist/inbound/index.js +5 -0
- package/dist/inbound/index.js.map +1 -0
- package/dist/index.d.ts +108 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/index.d.ts +13 -0
- package/dist/ingest/index.d.ts.map +1 -0
- package/dist/ingest/index.js +146 -0
- package/dist/ingest/index.js.map +1 -0
- package/dist/ingest/parse.d.ts +20 -0
- package/dist/ingest/parse.d.ts.map +1 -0
- package/dist/ingest/parse.js +141 -0
- package/dist/ingest/parse.js.map +1 -0
- package/dist/ingest/resolve_prefix.d.ts +19 -0
- package/dist/ingest/resolve_prefix.d.ts.map +1 -0
- package/dist/ingest/resolve_prefix.js +63 -0
- package/dist/ingest/resolve_prefix.js.map +1 -0
- package/dist/ingest/types.d.ts +47 -0
- package/dist/ingest/types.d.ts.map +1 -0
- package/dist/ingest/types.js +2 -0
- package/dist/ingest/types.js.map +1 -0
- package/dist/inject/action_cue.d.ts +11 -0
- package/dist/inject/action_cue.d.ts.map +1 -0
- package/dist/inject/action_cue.js +49 -0
- package/dist/inject/action_cue.js.map +1 -0
- package/dist/inject/index.d.ts +11 -0
- package/dist/inject/index.d.ts.map +1 -0
- package/dist/inject/index.js +6 -0
- package/dist/inject/index.js.map +1 -0
- package/dist/inject/novelty.d.ts +19 -0
- package/dist/inject/novelty.d.ts.map +1 -0
- package/dist/inject/novelty.js +34 -0
- package/dist/inject/novelty.js.map +1 -0
- package/dist/inject/outcome.d.ts +20 -0
- package/dist/inject/outcome.d.ts.map +1 -0
- package/dist/inject/outcome.js +26 -0
- package/dist/inject/outcome.js.map +1 -0
- package/dist/inject/population.d.ts +6 -0
- package/dist/inject/population.d.ts.map +1 -0
- package/dist/inject/population.js +23 -0
- package/dist/inject/population.js.map +1 -0
- package/dist/inject/proactive_injector.d.ts +56 -0
- package/dist/inject/proactive_injector.d.ts.map +1 -0
- package/dist/inject/proactive_injector.js +153 -0
- package/dist/inject/proactive_injector.js.map +1 -0
- package/dist/inject/token_estimate.d.ts +3 -0
- package/dist/inject/token_estimate.d.ts.map +1 -0
- package/dist/inject/token_estimate.js +2 -0
- package/dist/inject/token_estimate.js.map +1 -0
- package/dist/inject/window.d.ts +6 -0
- package/dist/inject/window.d.ts.map +1 -0
- package/dist/inject/window.js +10 -0
- package/dist/inject/window.js.map +1 -0
- package/dist/modes/behaviour_modes.d.ts +21 -0
- package/dist/modes/behaviour_modes.d.ts.map +1 -0
- package/dist/modes/behaviour_modes.js +137 -0
- package/dist/modes/behaviour_modes.js.map +1 -0
- package/dist/policy/index.d.ts +2 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/store_policy.d.ts +47 -0
- package/dist/policy/store_policy.d.ts.map +1 -0
- package/dist/policy/store_policy.js +125 -0
- package/dist/policy/store_policy.js.map +1 -0
- package/dist/profile/index.d.ts +5 -0
- package/dist/profile/index.d.ts.map +1 -0
- package/dist/profile/index.js +3 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/lever_profile.d.ts +27 -0
- package/dist/profile/lever_profile.d.ts.map +1 -0
- package/dist/profile/lever_profile.js +55 -0
- package/dist/profile/lever_profile.js.map +1 -0
- package/dist/profile/production.d.ts +12 -0
- package/dist/profile/production.d.ts.map +1 -0
- package/dist/profile/production.js +13 -0
- package/dist/profile/production.js.map +1 -0
- package/dist/provenance/build_fingerprint.d.ts +9 -0
- package/dist/provenance/build_fingerprint.d.ts.map +1 -0
- package/dist/provenance/build_fingerprint.js +47 -0
- package/dist/provenance/build_fingerprint.js.map +1 -0
- package/dist/provenance/derived_number.d.ts +33 -0
- package/dist/provenance/derived_number.d.ts.map +1 -0
- package/dist/provenance/derived_number.js +52 -0
- package/dist/provenance/derived_number.js.map +1 -0
- package/dist/provenance/index.d.ts +7 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +4 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/live_state.d.ts +49 -0
- package/dist/provenance/live_state.d.ts.map +1 -0
- package/dist/provenance/live_state.js +141 -0
- package/dist/provenance/live_state.js.map +1 -0
- package/dist/rerank/cross_encoder.d.ts +14 -0
- package/dist/rerank/cross_encoder.d.ts.map +1 -0
- package/dist/rerank/cross_encoder.js +40 -0
- package/dist/rerank/cross_encoder.js.map +1 -0
- package/dist/rerank/identity.d.ts +6 -0
- package/dist/rerank/identity.d.ts.map +1 -0
- package/dist/rerank/identity.js +7 -0
- package/dist/rerank/identity.js.map +1 -0
- package/dist/rerank/index.d.ts +8 -0
- package/dist/rerank/index.d.ts.map +1 -0
- package/dist/rerank/index.js +5 -0
- package/dist/rerank/index.js.map +1 -0
- package/dist/rerank/reranking_retriever.d.ts +20 -0
- package/dist/rerank/reranking_retriever.d.ts.map +1 -0
- package/dist/rerank/reranking_retriever.js +38 -0
- package/dist/rerank/reranking_retriever.js.map +1 -0
- package/dist/rerank/reranking_select.d.ts +33 -0
- package/dist/rerank/reranking_select.d.ts.map +1 -0
- package/dist/rerank/reranking_select.js +116 -0
- package/dist/rerank/reranking_select.js.map +1 -0
- package/dist/rerank/types.d.ts +9 -0
- package/dist/rerank/types.d.ts.map +1 -0
- package/dist/rerank/types.js +2 -0
- package/dist/rerank/types.js.map +1 -0
- package/dist/resume/index.d.ts +3 -0
- package/dist/resume/index.d.ts.map +1 -0
- package/dist/resume/index.js +2 -0
- package/dist/resume/index.js.map +1 -0
- package/dist/resume/resume.d.ts +33 -0
- package/dist/resume/resume.d.ts.map +1 -0
- package/dist/resume/resume.js +86 -0
- package/dist/resume/resume.js.map +1 -0
- package/dist/retrieval/hnsw_store.d.ts +37 -0
- package/dist/retrieval/hnsw_store.d.ts.map +1 -0
- package/dist/retrieval/hnsw_store.js +284 -0
- package/dist/retrieval/hnsw_store.js.map +1 -0
- package/dist/retrieval/label_text.d.ts +2 -0
- package/dist/retrieval/label_text.d.ts.map +1 -0
- package/dist/retrieval/label_text.js +7 -0
- package/dist/retrieval/label_text.js.map +1 -0
- package/dist/retrieval/link_graph.d.ts +38 -0
- package/dist/retrieval/link_graph.d.ts.map +1 -0
- package/dist/retrieval/link_graph.js +118 -0
- package/dist/retrieval/link_graph.js.map +1 -0
- package/dist/retrieval/query_expansion.d.ts +18 -0
- package/dist/retrieval/query_expansion.d.ts.map +1 -0
- package/dist/retrieval/query_expansion.js +55 -0
- package/dist/retrieval/query_expansion.js.map +1 -0
- package/dist/retrieval/scope.d.ts +36 -0
- package/dist/retrieval/scope.d.ts.map +1 -0
- package/dist/retrieval/scope.js +120 -0
- package/dist/retrieval/scope.js.map +1 -0
- package/dist/retrieval/semantic.d.ts +136 -0
- package/dist/retrieval/semantic.d.ts.map +1 -0
- package/dist/retrieval/semantic.js +490 -0
- package/dist/retrieval/semantic.js.map +1 -0
- package/dist/retrieval/session_closed.d.ts +5 -0
- package/dist/retrieval/session_closed.d.ts.map +1 -0
- package/dist/retrieval/session_closed.js +8 -0
- package/dist/retrieval/session_closed.js.map +1 -0
- package/dist/retrieval/thread_lifecycle.d.ts +68 -0
- package/dist/retrieval/thread_lifecycle.d.ts.map +1 -0
- package/dist/retrieval/thread_lifecycle.js +201 -0
- package/dist/retrieval/thread_lifecycle.js.map +1 -0
- package/dist/retrieval/vector_store.d.ts +22 -0
- package/dist/retrieval/vector_store.d.ts.map +1 -0
- package/dist/retrieval/vector_store.js +41 -0
- package/dist/retrieval/vector_store.js.map +1 -0
- package/dist/retrieval/version_supersession.d.ts +13 -0
- package/dist/retrieval/version_supersession.d.ts.map +1 -0
- package/dist/retrieval/version_supersession.js +97 -0
- package/dist/retrieval/version_supersession.js.map +1 -0
- package/dist/saihm_client/federated_port.d.ts +30 -0
- package/dist/saihm_client/federated_port.d.ts.map +1 -0
- package/dist/saihm_client/federated_port.js +99 -0
- package/dist/saihm_client/federated_port.js.map +1 -0
- package/dist/saihm_client/in_memory_port.d.ts +35 -0
- package/dist/saihm_client/in_memory_port.d.ts.map +1 -0
- package/dist/saihm_client/in_memory_port.js +100 -0
- package/dist/saihm_client/in_memory_port.js.map +1 -0
- package/dist/saihm_client/index.d.ts +12 -0
- package/dist/saihm_client/index.d.ts.map +1 -0
- package/dist/saihm_client/index.js +8 -0
- package/dist/saihm_client/index.js.map +1 -0
- package/dist/saihm_client/mcp_client.d.ts +38 -0
- package/dist/saihm_client/mcp_client.d.ts.map +1 -0
- package/dist/saihm_client/mcp_client.js +266 -0
- package/dist/saihm_client/mcp_client.js.map +1 -0
- package/dist/saihm_client/server_features.d.ts +112 -0
- package/dist/saihm_client/server_features.d.ts.map +1 -0
- package/dist/saihm_client/server_features.js +415 -0
- package/dist/saihm_client/server_features.js.map +1 -0
- package/dist/saihm_client/share_guard.d.ts +9 -0
- package/dist/saihm_client/share_guard.d.ts.map +1 -0
- package/dist/saihm_client/share_guard.js +53 -0
- package/dist/saihm_client/share_guard.js.map +1 -0
- package/dist/saihm_client/timing.d.ts +100 -0
- package/dist/saihm_client/timing.d.ts.map +1 -0
- package/dist/saihm_client/timing.js +250 -0
- package/dist/saihm_client/timing.js.map +1 -0
- package/dist/saihm_client/types.d.ts +108 -0
- package/dist/saihm_client/types.d.ts.map +1 -0
- package/dist/saihm_client/types.js +19 -0
- package/dist/saihm_client/types.js.map +1 -0
- package/dist/service/handlers.d.ts +91 -0
- package/dist/service/handlers.d.ts.map +1 -0
- package/dist/service/handlers.js +173 -0
- package/dist/service/handlers.js.map +1 -0
- package/dist/service/http.d.ts +27 -0
- package/dist/service/http.d.ts.map +1 -0
- package/dist/service/http.js +261 -0
- package/dist/service/http.js.map +1 -0
- package/dist/service/index.d.ts +5 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +5 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/resident.d.ts +50 -0
- package/dist/service/resident.d.ts.map +1 -0
- package/dist/service/resident.js +162 -0
- package/dist/service/resident.js.map +1 -0
- package/dist/service/service_level.d.ts +36 -0
- package/dist/service/service_level.d.ts.map +1 -0
- package/dist/service/service_level.js +65 -0
- package/dist/service/service_level.js.map +1 -0
- package/dist/session/change_feed.d.ts +82 -0
- package/dist/session/change_feed.d.ts.map +1 -0
- package/dist/session/change_feed.js +203 -0
- package/dist/session/change_feed.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +4 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/memory_session.d.ts +426 -0
- package/dist/session/memory_session.d.ts.map +1 -0
- package/dist/session/memory_session.js +1183 -0
- package/dist/session/memory_session.js.map +1 -0
- package/dist/standing/content_fingerprint.d.ts +28 -0
- package/dist/standing/content_fingerprint.d.ts.map +1 -0
- package/dist/standing/content_fingerprint.js +95 -0
- package/dist/standing/content_fingerprint.js.map +1 -0
- package/dist/standing/standing_answers.d.ts +44 -0
- package/dist/standing/standing_answers.d.ts.map +1 -0
- package/dist/standing/standing_answers.js +72 -0
- package/dist/standing/standing_answers.js.map +1 -0
- package/dist/standing/standing_store.d.ts +44 -0
- package/dist/standing/standing_store.d.ts.map +1 -0
- package/dist/standing/standing_store.js +238 -0
- package/dist/standing/standing_store.js.map +1 -0
- package/dist/standing/surface.d.ts +20 -0
- package/dist/standing/surface.d.ts.map +1 -0
- package/dist/standing/surface.js +74 -0
- package/dist/standing/surface.js.map +1 -0
- package/dist/store/atomic_write.d.ts +7 -0
- package/dist/store/atomic_write.d.ts.map +1 -0
- package/dist/store/atomic_write.js +23 -0
- package/dist/store/atomic_write.js.map +1 -0
- package/dist/store/body_store.d.ts +42 -0
- package/dist/store/body_store.d.ts.map +1 -0
- package/dist/store/body_store.js +252 -0
- package/dist/store/body_store.js.map +1 -0
- package/dist/store/encrypted_store.d.ts +21 -0
- package/dist/store/encrypted_store.d.ts.map +1 -0
- package/dist/store/encrypted_store.js +266 -0
- package/dist/store/encrypted_store.js.map +1 -0
- package/dist/store/index.d.ts +21 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +11 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/index_snapshot.d.ts +15 -0
- package/dist/store/index_snapshot.d.ts.map +1 -0
- package/dist/store/index_snapshot.js +126 -0
- package/dist/store/index_snapshot.js.map +1 -0
- package/dist/store/mcp_warm_start.d.ts +93 -0
- package/dist/store/mcp_warm_start.d.ts.map +1 -0
- package/dist/store/mcp_warm_start.js +406 -0
- package/dist/store/mcp_warm_start.js.map +1 -0
- package/dist/store/require_dir.d.ts +2 -0
- package/dist/store/require_dir.d.ts.map +1 -0
- package/dist/store/require_dir.js +9 -0
- package/dist/store/require_dir.js.map +1 -0
- package/dist/store/snapshot_format.d.ts +43 -0
- package/dist/store/snapshot_format.d.ts.map +1 -0
- package/dist/store/snapshot_format.js +119 -0
- package/dist/store/snapshot_format.js.map +1 -0
- package/dist/store/state_dir.d.ts +19 -0
- package/dist/store/state_dir.d.ts.map +1 -0
- package/dist/store/state_dir.js +42 -0
- package/dist/store/state_dir.js.map +1 -0
- package/dist/store/types.d.ts +37 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +11 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/warm_index.d.ts +68 -0
- package/dist/store/warm_index.d.ts.map +1 -0
- package/dist/store/warm_index.js +279 -0
- package/dist/store/warm_index.js.map +1 -0
- package/dist/store/warm_start.d.ts +57 -0
- package/dist/store/warm_start.d.ts.map +1 -0
- package/dist/store/warm_start.js +68 -0
- package/dist/store/warm_start.js.map +1 -0
- package/dist/store/writer_lock.d.ts +34 -0
- package/dist/store/writer_lock.d.ts.map +1 -0
- package/dist/store/writer_lock.js +169 -0
- package/dist/store/writer_lock.js.map +1 -0
- package/dist/tiers/index.d.ts +2 -0
- package/dist/tiers/index.d.ts.map +1 -0
- package/dist/tiers/index.js +2 -0
- package/dist/tiers/index.js.map +1 -0
- package/dist/tiers/membership.d.ts +48 -0
- package/dist/tiers/membership.d.ts.map +1 -0
- package/dist/tiers/membership.js +85 -0
- package/dist/tiers/membership.js.map +1 -0
- package/dist/tuning/holdout.d.ts +54 -0
- package/dist/tuning/holdout.d.ts.map +1 -0
- package/dist/tuning/holdout.js +231 -0
- package/dist/tuning/holdout.js.map +1 -0
- package/dist/tuning/index.d.ts +7 -0
- package/dist/tuning/index.d.ts.map +1 -0
- package/dist/tuning/index.js +4 -0
- package/dist/tuning/index.js.map +1 -0
- package/dist/tuning/lever_stack.d.ts +27 -0
- package/dist/tuning/lever_stack.d.ts.map +1 -0
- package/dist/tuning/lever_stack.js +76 -0
- package/dist/tuning/lever_stack.js.map +1 -0
- package/dist/tuning/paired.d.ts +22 -0
- package/dist/tuning/paired.d.ts.map +1 -0
- package/dist/tuning/paired.js +74 -0
- package/dist/tuning/paired.js.map +1 -0
- package/dist/util/concurrency.d.ts +2 -0
- package/dist/util/concurrency.d.ts.map +1 -0
- package/dist/util/concurrency.js +19 -0
- package/dist/util/concurrency.js.map +1 -0
- package/package.json +161 -4
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export const INDEX_PART_NAME = "index.rows";
|
|
2
|
+
const MAGIC = Buffer.from("SHMIDX1\n", "ascii");
|
|
3
|
+
const MAX_HEADER_BYTES = 4096;
|
|
4
|
+
const HASH_BYTES = 32;
|
|
5
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
6
|
+
export class IndexPartError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "IndexPartError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function encodeIndexPart(rows, space) {
|
|
13
|
+
if (typeof space.modelId !== "string" || space.modelId === "")
|
|
14
|
+
throw new IndexPartError("the space has no model id");
|
|
15
|
+
if (!Number.isSafeInteger(space.dim) || space.dim < 1 || space.dim > 65_536)
|
|
16
|
+
throw new IndexPartError("the space's dimension is not a whole number from 1 to 65536");
|
|
17
|
+
const header = Buffer.from(JSON.stringify({ v: 1, modelId: space.modelId, dim: space.dim, count: rows.length }), "utf8");
|
|
18
|
+
if (header.length > MAX_HEADER_BYTES)
|
|
19
|
+
throw new IndexPartError(`the header is longer than ${MAX_HEADER_BYTES} bytes`);
|
|
20
|
+
const chunks = [MAGIC, u32(header.length), header];
|
|
21
|
+
for (const [i, r] of rows.entries()) {
|
|
22
|
+
const id = Buffer.from(r.cellId, "utf8");
|
|
23
|
+
const ns = Buffer.from(r.namespace, "utf8");
|
|
24
|
+
if (id.length === 0 || id.length > 0xffff)
|
|
25
|
+
throw new IndexPartError(`row ${i}: the cell id is empty or longer than 65535 bytes`);
|
|
26
|
+
if (ns.length > 0xffff)
|
|
27
|
+
throw new IndexPartError(`row ${i}: the namespace is longer than 65535 bytes`);
|
|
28
|
+
if (!HEX64.test(r.sourceHashHex))
|
|
29
|
+
throw new IndexPartError(`row ${i}: the source hash is not 64 lowercase hex`);
|
|
30
|
+
if (!Number.isFinite(r.epoch))
|
|
31
|
+
throw new IndexPartError(`row ${i}: the epoch is not a finite number`);
|
|
32
|
+
if (!Number.isInteger(r.flags) || r.flags < 0 || r.flags > 0xff)
|
|
33
|
+
throw new IndexPartError(`row ${i}: the flags are not one byte`);
|
|
34
|
+
if (r.vec.length !== space.dim)
|
|
35
|
+
throw new IndexPartError(`row ${i}: the vector has ${r.vec.length} components, the space ${space.dim}`);
|
|
36
|
+
const head = Buffer.alloc(2);
|
|
37
|
+
head.writeUInt16LE(id.length);
|
|
38
|
+
const mid = Buffer.alloc(HASH_BYTES + 8 + 2);
|
|
39
|
+
Buffer.from(r.sourceHashHex, "hex").copy(mid, 0);
|
|
40
|
+
mid.writeDoubleLE(r.epoch, HASH_BYTES);
|
|
41
|
+
mid.writeUInt16LE(ns.length, HASH_BYTES + 8);
|
|
42
|
+
const vec = Buffer.alloc(4 * space.dim);
|
|
43
|
+
for (let j = 0; j < space.dim; j++) {
|
|
44
|
+
const x = r.vec[j];
|
|
45
|
+
if (!Number.isFinite(x))
|
|
46
|
+
throw new IndexPartError(`row ${i}: the vector has a component that is not finite`);
|
|
47
|
+
vec.writeFloatLE(x, 4 * j);
|
|
48
|
+
}
|
|
49
|
+
chunks.push(head, id, mid, ns, Buffer.from([r.flags]), vec);
|
|
50
|
+
}
|
|
51
|
+
return new Uint8Array(Buffer.concat(chunks));
|
|
52
|
+
}
|
|
53
|
+
export function decodeIndexPart(bytes, expect) {
|
|
54
|
+
const no = (reason) => ({ ok: false, reason });
|
|
55
|
+
const b = Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
56
|
+
if (b.length < MAGIC.length + 4 || !b.subarray(0, MAGIC.length).equals(MAGIC))
|
|
57
|
+
return no("not an index part (magic)");
|
|
58
|
+
const headerLen = b.readUInt32LE(MAGIC.length);
|
|
59
|
+
if (headerLen > MAX_HEADER_BYTES)
|
|
60
|
+
return no("the header is too long");
|
|
61
|
+
let at = MAGIC.length + 4;
|
|
62
|
+
if (at + headerLen > b.length)
|
|
63
|
+
return no("the header runs past the end");
|
|
64
|
+
let header;
|
|
65
|
+
try {
|
|
66
|
+
header = JSON.parse(b.subarray(at, at + headerLen).toString("utf8"));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return no("the header is not JSON");
|
|
70
|
+
}
|
|
71
|
+
at += headerLen;
|
|
72
|
+
if (typeof header !== "object" || header === null || Array.isArray(header))
|
|
73
|
+
return no("the header is not an object");
|
|
74
|
+
const h = header;
|
|
75
|
+
if (h["v"] !== 1)
|
|
76
|
+
return no("the header's version is not 1");
|
|
77
|
+
const modelId = h["modelId"], dim = h["dim"], count = h["count"];
|
|
78
|
+
if (typeof modelId !== "string" || !Number.isSafeInteger(dim) || !Number.isSafeInteger(count) || count < 0)
|
|
79
|
+
return no("the header's fields are malformed");
|
|
80
|
+
if (modelId !== expect.modelId || dim !== expect.dim)
|
|
81
|
+
return no(`made with another embedding space (${modelId}, ${String(dim)}) than this session's (${expect.modelId}, ${expect.dim})`);
|
|
82
|
+
const d = dim;
|
|
83
|
+
const rows = [];
|
|
84
|
+
for (let i = 0; i < count; i++) {
|
|
85
|
+
if (at + 2 > b.length)
|
|
86
|
+
return no(`row ${i} runs past the end`);
|
|
87
|
+
const idLen = b.readUInt16LE(at);
|
|
88
|
+
at += 2;
|
|
89
|
+
if (idLen === 0 || at + idLen + HASH_BYTES + 8 + 2 > b.length)
|
|
90
|
+
return no(`row ${i} runs past the end`);
|
|
91
|
+
const cellId = b.subarray(at, at + idLen).toString("utf8");
|
|
92
|
+
at += idLen;
|
|
93
|
+
const sourceHashHex = b.subarray(at, at + HASH_BYTES).toString("hex");
|
|
94
|
+
at += HASH_BYTES;
|
|
95
|
+
const epoch = b.readDoubleLE(at);
|
|
96
|
+
at += 8;
|
|
97
|
+
const nsLen = b.readUInt16LE(at);
|
|
98
|
+
at += 2;
|
|
99
|
+
if (at + nsLen + 1 + 4 * d > b.length)
|
|
100
|
+
return no(`row ${i} runs past the end`);
|
|
101
|
+
const namespace = b.subarray(at, at + nsLen).toString("utf8");
|
|
102
|
+
at += nsLen;
|
|
103
|
+
const flags = b.readUInt8(at);
|
|
104
|
+
at += 1;
|
|
105
|
+
const vec = new Float32Array(d);
|
|
106
|
+
for (let j = 0; j < d; j++) {
|
|
107
|
+
const x = b.readFloatLE(at + 4 * j);
|
|
108
|
+
if (!Number.isFinite(x))
|
|
109
|
+
return no(`row ${i}: a vector component is not finite`);
|
|
110
|
+
vec[j] = x;
|
|
111
|
+
}
|
|
112
|
+
at += 4 * d;
|
|
113
|
+
if (!Number.isFinite(epoch))
|
|
114
|
+
return no(`row ${i}: the epoch is not finite`);
|
|
115
|
+
rows.push({ cellId, sourceHashHex, epoch, namespace, flags, vec });
|
|
116
|
+
}
|
|
117
|
+
if (at !== b.length)
|
|
118
|
+
return no("bytes follow the last row");
|
|
119
|
+
return { ok: true, rows };
|
|
120
|
+
}
|
|
121
|
+
function u32(n) {
|
|
122
|
+
const out = Buffer.alloc(4);
|
|
123
|
+
out.writeUInt32LE(n);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=index_snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index_snapshot.js","sourceRoot":"","sources":["../../src/store/index_snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { McpToolCaller } from "../saihm_client/mcp_client.js";
|
|
2
|
+
import type { WarmStart } from "./warm_start.js";
|
|
3
|
+
export declare const WARM_START_DIRNAME = "warm-start";
|
|
4
|
+
export declare const CALL_TOKEN: RegExp;
|
|
5
|
+
export declare const putFileName: (token: string) => string;
|
|
6
|
+
export declare const latestFileName: (token: string) => string;
|
|
7
|
+
export declare function newCallToken(): string;
|
|
8
|
+
export declare const DEFAULT_MAX_LATEST_BYTES: number;
|
|
9
|
+
export type LocalCode = "shm_bad_argument" | "shm_dir_unsafe" | "shm_file_unsafe" | "shm_file_too_large" | "shm_file_missing" | "shm_answer_malformed" | "shm_residue" | "shm_io_error" | "shm_not_offered";
|
|
10
|
+
export declare const LOCAL_CODES: readonly LocalCode[];
|
|
11
|
+
export declare class McpWarmStartError extends Error {
|
|
12
|
+
readonly origin: "tool" | "local";
|
|
13
|
+
readonly code?: string;
|
|
14
|
+
constructor(message: string, origin: "tool" | "local", code: string | undefined, cause?: unknown);
|
|
15
|
+
}
|
|
16
|
+
export declare function codeFromToolText(text: string): string | undefined;
|
|
17
|
+
export declare function codeFromErrorField(structured: unknown): string | undefined;
|
|
18
|
+
export type ToolAnswer = {
|
|
19
|
+
readonly kind: "error";
|
|
20
|
+
readonly code: string | undefined;
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: "object";
|
|
23
|
+
readonly value: Readonly<Record<string, unknown>>;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "null";
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "other";
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: "malformed";
|
|
30
|
+
};
|
|
31
|
+
export declare function readToolAnswer(raw: unknown): ToolAnswer;
|
|
32
|
+
export interface EntryStat {
|
|
33
|
+
isDirectory(): boolean;
|
|
34
|
+
isFile(): boolean;
|
|
35
|
+
isSymbolicLink(): boolean;
|
|
36
|
+
readonly mode: number;
|
|
37
|
+
readonly uid: number;
|
|
38
|
+
readonly nlink: number;
|
|
39
|
+
readonly size: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function warmDirProblem(st: Pick<EntryStat, "isDirectory" | "isSymbolicLink" | "mode" | "uid">, uid: number): string | null;
|
|
42
|
+
export declare function latestFileProblem(st: EntryStat, uid: number, maxBytes: number): {
|
|
43
|
+
readonly code: "shm_file_unsafe" | "shm_file_too_large";
|
|
44
|
+
readonly what: string;
|
|
45
|
+
} | null;
|
|
46
|
+
export interface McpWarmStartConfig {
|
|
47
|
+
readonly callTool: McpToolCaller;
|
|
48
|
+
readonly agentIdHash: string;
|
|
49
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
50
|
+
readonly homeDir: string;
|
|
51
|
+
readonly status: unknown;
|
|
52
|
+
readonly maxLatestBytes?: number;
|
|
53
|
+
readonly newToken?: () => string;
|
|
54
|
+
}
|
|
55
|
+
export declare class McpWarmStart implements WarmStart {
|
|
56
|
+
readonly dir: string;
|
|
57
|
+
private readonly callTool;
|
|
58
|
+
private readonly uid;
|
|
59
|
+
private readonly maxLatestBytes;
|
|
60
|
+
private readonly newToken;
|
|
61
|
+
readonly notOffered: string | null;
|
|
62
|
+
constructor(cfg: McpWarmStartConfig);
|
|
63
|
+
private token;
|
|
64
|
+
put(payload: Uint8Array, opts: {
|
|
65
|
+
readonly coversThrough: string;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
readonly snapshotId: string;
|
|
68
|
+
readonly createdAt: string;
|
|
69
|
+
readonly bytes: number;
|
|
70
|
+
}>;
|
|
71
|
+
latest(): Promise<{
|
|
72
|
+
readonly snapshotId: string;
|
|
73
|
+
readonly createdAt: string;
|
|
74
|
+
readonly coversThrough: string;
|
|
75
|
+
readonly payload: Uint8Array;
|
|
76
|
+
} | null>;
|
|
77
|
+
list(): Promise<ReadonlyArray<{
|
|
78
|
+
readonly snapshotId: string;
|
|
79
|
+
readonly createdAt: string;
|
|
80
|
+
readonly bytes: number;
|
|
81
|
+
readonly coversThrough: string;
|
|
82
|
+
}>>;
|
|
83
|
+
delete(snapshotId: string): Promise<void>;
|
|
84
|
+
private offered;
|
|
85
|
+
private call;
|
|
86
|
+
private thenRemove;
|
|
87
|
+
private prepareDir;
|
|
88
|
+
private writePut;
|
|
89
|
+
private removePutFiles;
|
|
90
|
+
private removeLatest;
|
|
91
|
+
private readLatest;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=mcp_warm_start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp_warm_start.d.ts","sourceRoot":"","sources":["../../src/store/mcp_warm_start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
import { constants as bufferConstants } from "node:buffer";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { constants as fsConstants } from "node:fs";
|
|
4
|
+
import { lstat, open, readdir, unlink } from "node:fs/promises";
|
|
5
|
+
import { dirname, isAbsolute, join } from "node:path";
|
|
6
|
+
import { HEX64, resolveFeedPath } from "../erasure/feed_watcher.js";
|
|
7
|
+
import { parseServerFeatures } from "../saihm_client/server_features.js";
|
|
8
|
+
import { writeFileAtomic } from "./atomic_write.js";
|
|
9
|
+
import { ensureStateDir } from "./state_dir.js";
|
|
10
|
+
export const WARM_START_DIRNAME = "warm-start";
|
|
11
|
+
export const CALL_TOKEN = /^[a-z0-9]{16,32}$/;
|
|
12
|
+
export const putFileName = (token) => `put-${token}.bin`;
|
|
13
|
+
export const latestFileName = (token) => `latest-${token}.bin`;
|
|
14
|
+
const TOKEN_ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
15
|
+
const TOKEN_LENGTH = 24;
|
|
16
|
+
export function newCallToken() {
|
|
17
|
+
let out = "";
|
|
18
|
+
while (out.length < TOKEN_LENGTH) {
|
|
19
|
+
for (const b of randomBytes(TOKEN_LENGTH)) {
|
|
20
|
+
if (b < 252 && out.length < TOKEN_LENGTH)
|
|
21
|
+
out += TOKEN_ALPHABET[b % 36];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
export const DEFAULT_MAX_LATEST_BYTES = 256 * 1024 * 1024;
|
|
27
|
+
export const LOCAL_CODES = Object.freeze([
|
|
28
|
+
"shm_bad_argument",
|
|
29
|
+
"shm_dir_unsafe",
|
|
30
|
+
"shm_file_unsafe",
|
|
31
|
+
"shm_file_too_large",
|
|
32
|
+
"shm_file_missing",
|
|
33
|
+
"shm_answer_malformed",
|
|
34
|
+
"shm_residue",
|
|
35
|
+
"shm_io_error",
|
|
36
|
+
"shm_not_offered",
|
|
37
|
+
]);
|
|
38
|
+
export class McpWarmStartError extends Error {
|
|
39
|
+
origin;
|
|
40
|
+
code;
|
|
41
|
+
constructor(message, origin, code, cause) {
|
|
42
|
+
super(message, cause === undefined ? undefined : { cause });
|
|
43
|
+
this.name = "McpWarmStartError";
|
|
44
|
+
this.origin = origin;
|
|
45
|
+
if (code !== undefined)
|
|
46
|
+
this.code = code;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const local = (code, message, cause) => new McpWarmStartError(message, "local", code, cause);
|
|
50
|
+
const errno = (e) => {
|
|
51
|
+
const c = typeof e === "object" && e !== null ? e.code : undefined;
|
|
52
|
+
return typeof c === "string" ? c : undefined;
|
|
53
|
+
};
|
|
54
|
+
const SAIHM_ERROR_TEXT = /^SAIHM error \[([^\]]{0,64})\]/;
|
|
55
|
+
const WIRE_CODE = /^[a-z][a-z_]{0,63}$/;
|
|
56
|
+
export function codeFromToolText(text) {
|
|
57
|
+
const c = SAIHM_ERROR_TEXT.exec(text)?.[1];
|
|
58
|
+
return c !== undefined && WIRE_CODE.test(c) ? c : undefined;
|
|
59
|
+
}
|
|
60
|
+
const isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
61
|
+
export function codeFromErrorField(structured) {
|
|
62
|
+
if (!isPlainObject(structured))
|
|
63
|
+
return undefined;
|
|
64
|
+
const err = structured["error"];
|
|
65
|
+
if (!isPlainObject(err))
|
|
66
|
+
return undefined;
|
|
67
|
+
const c = err["code"];
|
|
68
|
+
return typeof c === "string" && WIRE_CODE.test(c) ? c : undefined;
|
|
69
|
+
}
|
|
70
|
+
export function readToolAnswer(raw) {
|
|
71
|
+
if (raw === null)
|
|
72
|
+
return { kind: "null" };
|
|
73
|
+
if (!isPlainObject(raw))
|
|
74
|
+
return { kind: "other" };
|
|
75
|
+
const content = raw["content"];
|
|
76
|
+
if (!Array.isArray(content))
|
|
77
|
+
return { kind: "object", value: raw };
|
|
78
|
+
const isError = raw["isError"];
|
|
79
|
+
if (isError !== undefined && typeof isError !== "boolean")
|
|
80
|
+
return { kind: "malformed" };
|
|
81
|
+
const first = content.filter(isPlainObject).find((c) => c["type"] === "text" && typeof c["text"] === "string")?.["text"];
|
|
82
|
+
if (isError === true)
|
|
83
|
+
return { kind: "error", code: codeFromErrorField(raw["structuredContent"]) ?? (first === undefined ? undefined : codeFromToolText(first)) };
|
|
84
|
+
const structured = raw["structuredContent"];
|
|
85
|
+
if (structured !== undefined)
|
|
86
|
+
return isPlainObject(structured) ? { kind: "object", value: structured } : { kind: "malformed" };
|
|
87
|
+
if (first === undefined)
|
|
88
|
+
return { kind: "other" };
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = JSON.parse(first);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return { kind: "other" };
|
|
95
|
+
}
|
|
96
|
+
if (parsed === null)
|
|
97
|
+
return { kind: "null" };
|
|
98
|
+
return isPlainObject(parsed) ? { kind: "object", value: parsed } : { kind: "other" };
|
|
99
|
+
}
|
|
100
|
+
export function warmDirProblem(st, uid) {
|
|
101
|
+
if (!st.isDirectory())
|
|
102
|
+
return st.isSymbolicLink() ? "is a symbolic link" : "is not a directory";
|
|
103
|
+
if (st.uid !== uid)
|
|
104
|
+
return "belongs to another account";
|
|
105
|
+
if ((st.mode & 0o077) !== 0)
|
|
106
|
+
return "is open to its group or to others";
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
export function latestFileProblem(st, uid, maxBytes) {
|
|
110
|
+
if (!st.isFile())
|
|
111
|
+
return { code: "shm_file_unsafe", what: st.isSymbolicLink() ? "is a symbolic link" : "is not a regular file" };
|
|
112
|
+
if (st.nlink > 1)
|
|
113
|
+
return { code: "shm_file_unsafe", what: "has another name (a hard link)" };
|
|
114
|
+
if (st.uid !== uid)
|
|
115
|
+
return { code: "shm_file_unsafe", what: "belongs to another account" };
|
|
116
|
+
if ((st.mode & 0o077) !== 0)
|
|
117
|
+
return { code: "shm_file_unsafe", what: "is open to its group or to others" };
|
|
118
|
+
if (st.size > maxBytes)
|
|
119
|
+
return { code: "shm_file_too_large", what: `is larger than ${maxBytes} bytes` };
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const TOOL = { put: "saihm_remember", latest: "saihm_recall", list: "saihm_recall", delete: "saihm_forget" };
|
|
123
|
+
const named = (op) => `${TOOL[op]} (warmStart ${op})`;
|
|
124
|
+
const own = (o, k) => (Object.hasOwn(o, k) ? o[k] : undefined);
|
|
125
|
+
const ISO_MS_UTC = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
126
|
+
function isIsoMsUtc(v) {
|
|
127
|
+
if (typeof v !== "string" || !ISO_MS_UTC.test(v))
|
|
128
|
+
return false;
|
|
129
|
+
const t = Date.parse(v);
|
|
130
|
+
return Number.isFinite(t) && new Date(t).toISOString() === v;
|
|
131
|
+
}
|
|
132
|
+
const isSnapshotId = (v) => typeof v === "string" && HEX64.test(v);
|
|
133
|
+
const isCursor = (v) => typeof v === "string" && v !== "";
|
|
134
|
+
const isWhole = (v) => typeof v === "number" && Number.isSafeInteger(v) && v >= 0;
|
|
135
|
+
function field(o, op, at, key, ok, what) {
|
|
136
|
+
const v = own(o, key);
|
|
137
|
+
if (!ok(v))
|
|
138
|
+
throw local("shm_answer_malformed", `${named(op)}: ${at}${key} ${what}`);
|
|
139
|
+
return v;
|
|
140
|
+
}
|
|
141
|
+
const snapshotIdOf = (o, op, at = "") => field(o, op, at, "snapshotId", isSnapshotId, "is not 64 lowercase hex");
|
|
142
|
+
const createdAtOf = (o, op, at = "") => field(o, op, at, "createdAt", isIsoMsUtc, "is not an ISO-8601 UTC time with milliseconds and Z");
|
|
143
|
+
const bytesOf = (o, op, at = "") => field(o, op, at, "bytes", isWhole, "is not a whole number");
|
|
144
|
+
const coversThroughOf = (o, op, at = "") => field(o, op, at, "coversThrough", isCursor, "is not a non-empty cursor");
|
|
145
|
+
export class McpWarmStart {
|
|
146
|
+
dir;
|
|
147
|
+
callTool;
|
|
148
|
+
uid;
|
|
149
|
+
maxLatestBytes;
|
|
150
|
+
newToken;
|
|
151
|
+
notOffered;
|
|
152
|
+
constructor(cfg) {
|
|
153
|
+
if (typeof cfg.callTool !== "function")
|
|
154
|
+
throw new TypeError("McpWarmStart: callTool must be the host's MCP tool caller");
|
|
155
|
+
if (typeof cfg.agentIdHash !== "string" || !HEX64.test(cfg.agentIdHash))
|
|
156
|
+
throw new TypeError("McpWarmStart: agentIdHash must be 64 lowercase hex");
|
|
157
|
+
const tenant = dirname(resolveFeedPath({ identity: cfg.agentIdHash, env: cfg.env, homeDir: cfg.homeDir }));
|
|
158
|
+
if (!isAbsolute(tenant)) {
|
|
159
|
+
throw new TypeError("McpWarmStart: the tenant directory resolves to a relative path. The tool runs in another process, and a relative " +
|
|
160
|
+
"SAIHM_ERASURE_FEED_DIR, SAIHM_HOME or home directory names a different directory in each process's working directory.");
|
|
161
|
+
}
|
|
162
|
+
if (typeof process.getuid !== "function") {
|
|
163
|
+
throw new Error("McpWarmStart: this platform reports no POSIX owner, so the warm-start files' owner and mode cannot be judged");
|
|
164
|
+
}
|
|
165
|
+
const offer = parseServerFeatures(cfg.status).warmStart;
|
|
166
|
+
this.notOffered = offer.kind === "available" ? null : `features.warmStart is ${offer.kind}: ${offer.reason}`;
|
|
167
|
+
const offeredMax = offer.kind === "available" && offer.value.maxBytes >= 1 ? Math.min(offer.value.maxBytes, bufferConstants.MAX_LENGTH) : undefined;
|
|
168
|
+
const max = cfg.maxLatestBytes ?? offeredMax ?? DEFAULT_MAX_LATEST_BYTES;
|
|
169
|
+
if (!Number.isSafeInteger(max) || max < 1 || max > bufferConstants.MAX_LENGTH) {
|
|
170
|
+
throw new RangeError(`McpWarmStart: maxLatestBytes must be a whole number from 1 to ${bufferConstants.MAX_LENGTH}`);
|
|
171
|
+
}
|
|
172
|
+
this.callTool = cfg.callTool;
|
|
173
|
+
this.uid = process.getuid();
|
|
174
|
+
this.maxLatestBytes = max;
|
|
175
|
+
if (cfg.newToken !== undefined && typeof cfg.newToken !== "function")
|
|
176
|
+
throw new TypeError("McpWarmStart: newToken must be a function");
|
|
177
|
+
this.newToken = cfg.newToken ?? newCallToken;
|
|
178
|
+
this.dir = join(tenant, WARM_START_DIRNAME);
|
|
179
|
+
}
|
|
180
|
+
token() {
|
|
181
|
+
const t = this.newToken();
|
|
182
|
+
if (typeof t !== "string" || !CALL_TOKEN.test(t))
|
|
183
|
+
throw local("shm_bad_argument", "the call token is not 16 to 32 characters from a-z and 0-9");
|
|
184
|
+
return t;
|
|
185
|
+
}
|
|
186
|
+
async put(payload, opts) {
|
|
187
|
+
this.offered("put");
|
|
188
|
+
if (!(payload instanceof Uint8Array))
|
|
189
|
+
throw local("shm_bad_argument", "put: the payload must be bytes");
|
|
190
|
+
const coversThrough = opts?.coversThrough;
|
|
191
|
+
if (!isCursor(coversThrough))
|
|
192
|
+
throw local("shm_bad_argument", "put: coversThrough must be a non-empty cursor");
|
|
193
|
+
const token = this.token();
|
|
194
|
+
const putPath = join(this.dir, putFileName(token));
|
|
195
|
+
await this.prepareDir();
|
|
196
|
+
return this.thenRemove(async () => {
|
|
197
|
+
await this.writePut(putPath, payload);
|
|
198
|
+
const a = await this.call("put", { warmStart: "put", coversThrough, token });
|
|
199
|
+
if (a.kind !== "object")
|
|
200
|
+
throw local("shm_answer_malformed", `${named("put")}: the answer is not an object`);
|
|
201
|
+
return { snapshotId: snapshotIdOf(a.value, "put"), createdAt: createdAtOf(a.value, "put"), bytes: bytesOf(a.value, "put") };
|
|
202
|
+
}, () => this.removePutFiles(putFileName(token)));
|
|
203
|
+
}
|
|
204
|
+
async latest() {
|
|
205
|
+
this.offered("latest");
|
|
206
|
+
const token = this.token();
|
|
207
|
+
const latestPath = join(this.dir, latestFileName(token));
|
|
208
|
+
await this.prepareDir();
|
|
209
|
+
return this.thenRemove(async () => {
|
|
210
|
+
const a = await this.call("latest", { warmStart: "latest", token });
|
|
211
|
+
if (a.kind !== "object")
|
|
212
|
+
throw local("shm_answer_malformed", `${named("latest")}: the answer is not an object`);
|
|
213
|
+
const snap = own(a.value, "snapshot");
|
|
214
|
+
if (snap === null)
|
|
215
|
+
return null;
|
|
216
|
+
if (!isPlainObject(snap))
|
|
217
|
+
throw local("shm_answer_malformed", `${named("latest")}: snapshot is neither null nor an object`);
|
|
218
|
+
const meta = { snapshotId: snapshotIdOf(snap, "latest", "snapshot."), createdAt: createdAtOf(snap, "latest", "snapshot."), coversThrough: coversThroughOf(snap, "latest", "snapshot.") };
|
|
219
|
+
return { ...meta, payload: await this.readLatest(latestPath) };
|
|
220
|
+
}, () => this.removeLatest(latestPath));
|
|
221
|
+
}
|
|
222
|
+
async list() {
|
|
223
|
+
this.offered("list");
|
|
224
|
+
const a = await this.call("list", { warmStart: "list", token: this.token() });
|
|
225
|
+
if (a.kind !== "object")
|
|
226
|
+
throw local("shm_answer_malformed", `${named("list")}: the answer is not an object`);
|
|
227
|
+
const snapshots = own(a.value, "snapshots");
|
|
228
|
+
if (!Array.isArray(snapshots))
|
|
229
|
+
throw local("shm_answer_malformed", `${named("list")}: snapshots is not a list`);
|
|
230
|
+
const seen = new Set();
|
|
231
|
+
return snapshots.map((s, i) => {
|
|
232
|
+
const at = `snapshots[${i}].`;
|
|
233
|
+
if (!isPlainObject(s))
|
|
234
|
+
throw local("shm_answer_malformed", `${named("list")}: snapshots[${i}] is not an object`);
|
|
235
|
+
const entry = { snapshotId: snapshotIdOf(s, "list", at), createdAt: createdAtOf(s, "list", at), bytes: bytesOf(s, "list", at), coversThrough: coversThroughOf(s, "list", at) };
|
|
236
|
+
if (seen.has(entry.snapshotId))
|
|
237
|
+
throw local("shm_answer_malformed", `${named("list")}: ${at}snapshotId repeats`);
|
|
238
|
+
seen.add(entry.snapshotId);
|
|
239
|
+
return entry;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
async delete(snapshotId) {
|
|
243
|
+
this.offered("delete");
|
|
244
|
+
if (!isSnapshotId(snapshotId))
|
|
245
|
+
throw local("shm_bad_argument", "delete: snapshotId must be 64 lowercase hex");
|
|
246
|
+
await this.call("delete", { warmStart: "delete", snapshotId, token: this.token() });
|
|
247
|
+
}
|
|
248
|
+
offered(op) {
|
|
249
|
+
if (this.notOffered !== null)
|
|
250
|
+
throw local("shm_not_offered", `${named(op)}: refused — ${this.notOffered}; warm start runs only where the server offers it`);
|
|
251
|
+
}
|
|
252
|
+
async call(op, args) {
|
|
253
|
+
let raw;
|
|
254
|
+
try {
|
|
255
|
+
raw = await this.callTool(TOOL[op], args);
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
const text = typeof e === "string" ? e : typeof e === "object" && e !== null && typeof e.message === "string" ? e.message : undefined;
|
|
259
|
+
const code = text === undefined ? undefined : codeFromToolText(text);
|
|
260
|
+
throw new McpWarmStartError(`${named(op)}: the call threw${code === undefined ? "" : ` [${code}]`}`, "tool", code, e);
|
|
261
|
+
}
|
|
262
|
+
const a = readToolAnswer(raw);
|
|
263
|
+
if (a.kind === "error")
|
|
264
|
+
throw new McpWarmStartError(`${named(op)}: the tool answered with an error${a.code === undefined ? "" : ` [${a.code}]`}`, "tool", a.code);
|
|
265
|
+
if (a.kind === "malformed")
|
|
266
|
+
throw local("shm_answer_malformed", `${named(op)}: not a tool result (isError or structuredContent has the wrong type)`);
|
|
267
|
+
return a;
|
|
268
|
+
}
|
|
269
|
+
async thenRemove(body, remove) {
|
|
270
|
+
let outcome;
|
|
271
|
+
try {
|
|
272
|
+
outcome = { ok: true, value: await body() };
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
outcome = { ok: false, error };
|
|
276
|
+
}
|
|
277
|
+
await remove();
|
|
278
|
+
if (!outcome.ok)
|
|
279
|
+
throw outcome.error;
|
|
280
|
+
return outcome.value;
|
|
281
|
+
}
|
|
282
|
+
async prepareDir() {
|
|
283
|
+
let failure;
|
|
284
|
+
try {
|
|
285
|
+
await ensureStateDir("McpWarmStart", this.dir);
|
|
286
|
+
}
|
|
287
|
+
catch (e) {
|
|
288
|
+
failure = e;
|
|
289
|
+
}
|
|
290
|
+
let st;
|
|
291
|
+
try {
|
|
292
|
+
st = await lstat(this.dir);
|
|
293
|
+
}
|
|
294
|
+
catch (e) {
|
|
295
|
+
throw local("shm_io_error", `${this.dir} could not be created or examined`, failure ?? e);
|
|
296
|
+
}
|
|
297
|
+
const problem = warmDirProblem(st, this.uid);
|
|
298
|
+
if (problem !== null)
|
|
299
|
+
throw local("shm_dir_unsafe", `${this.dir} ${problem}: refused, and left as it is`);
|
|
300
|
+
if (failure !== undefined)
|
|
301
|
+
throw local("shm_io_error", `${this.dir} could not be prepared`, failure);
|
|
302
|
+
}
|
|
303
|
+
async writePut(putPath, payload) {
|
|
304
|
+
try {
|
|
305
|
+
await writeFileAtomic(putPath, payload);
|
|
306
|
+
const fh = await open(putPath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
307
|
+
try {
|
|
308
|
+
await fh.sync();
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
await fh.close();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
throw local("shm_io_error", `${putPath} could not be written`, e);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async removePutFiles(putName) {
|
|
319
|
+
const tempPrefix = putName + ".tmp.";
|
|
320
|
+
let names;
|
|
321
|
+
try {
|
|
322
|
+
names = await readdir(this.dir);
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
if (errno(e) === "ENOENT")
|
|
326
|
+
return;
|
|
327
|
+
throw local("shm_residue", `${this.dir} could not be listed, so ${putName} may remain there in plaintext`, e);
|
|
328
|
+
}
|
|
329
|
+
let failed = 0;
|
|
330
|
+
let first;
|
|
331
|
+
for (const name of names) {
|
|
332
|
+
if (name !== putName && !name.startsWith(tempPrefix))
|
|
333
|
+
continue;
|
|
334
|
+
try {
|
|
335
|
+
await unlink(join(this.dir, name));
|
|
336
|
+
}
|
|
337
|
+
catch (e) {
|
|
338
|
+
if (errno(e) === "ENOENT")
|
|
339
|
+
continue;
|
|
340
|
+
failed++;
|
|
341
|
+
first ??= e;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (failed > 0)
|
|
345
|
+
throw local("shm_residue", `${failed} put file(s) in ${this.dir} could not be removed and may hold SHM's state in plaintext`, first);
|
|
346
|
+
}
|
|
347
|
+
async removeLatest(latestPath) {
|
|
348
|
+
try {
|
|
349
|
+
await unlink(latestPath);
|
|
350
|
+
}
|
|
351
|
+
catch (e) {
|
|
352
|
+
if (errno(e) !== "ENOENT")
|
|
353
|
+
throw local("shm_residue", `${latestPath} could not be removed and may hold a snapshot in plaintext`, e);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
async readLatest(latestPath) {
|
|
357
|
+
let st;
|
|
358
|
+
try {
|
|
359
|
+
st = await lstat(latestPath);
|
|
360
|
+
}
|
|
361
|
+
catch (e) {
|
|
362
|
+
if (errno(e) === "ENOENT")
|
|
363
|
+
throw local("shm_file_missing", `${named("latest")} named a snapshot, and ${latestPath} is not there`);
|
|
364
|
+
throw local("shm_io_error", `${latestPath} could not be examined`, e);
|
|
365
|
+
}
|
|
366
|
+
const problem = latestFileProblem(st, this.uid, this.maxLatestBytes);
|
|
367
|
+
if (problem !== null)
|
|
368
|
+
throw local(problem.code, `${latestPath} ${problem.what}: refused`);
|
|
369
|
+
let fh;
|
|
370
|
+
try {
|
|
371
|
+
fh = await open(latestPath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK);
|
|
372
|
+
}
|
|
373
|
+
catch (e) {
|
|
374
|
+
if (errno(e) === "ENOENT")
|
|
375
|
+
throw local("shm_file_missing", `${latestPath} went away before it was read`, e);
|
|
376
|
+
if (errno(e) === "ELOOP")
|
|
377
|
+
throw local("shm_file_unsafe", `${latestPath} became a symbolic link before it was read`, e);
|
|
378
|
+
throw local("shm_io_error", `${latestPath} could not be opened`, e);
|
|
379
|
+
}
|
|
380
|
+
try {
|
|
381
|
+
const opened = await fh.stat();
|
|
382
|
+
if (!opened.isFile() || opened.dev !== st.dev || opened.ino !== st.ino || opened.size !== st.size) {
|
|
383
|
+
throw local("shm_file_unsafe", `${latestPath} changed between the check and the read`);
|
|
384
|
+
}
|
|
385
|
+
const buf = Buffer.alloc(st.size);
|
|
386
|
+
let at = 0;
|
|
387
|
+
while (at < buf.byteLength) {
|
|
388
|
+
const { bytesRead } = await fh.read(buf, at, buf.byteLength - at, at);
|
|
389
|
+
if (bytesRead === 0)
|
|
390
|
+
break;
|
|
391
|
+
at += bytesRead;
|
|
392
|
+
}
|
|
393
|
+
if (at !== buf.byteLength || (await fh.read(Buffer.alloc(1), 0, 1, at)).bytesRead !== 0) {
|
|
394
|
+
throw local("shm_file_unsafe", `${latestPath} changed size while it was read`);
|
|
395
|
+
}
|
|
396
|
+
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
397
|
+
}
|
|
398
|
+
catch (e) {
|
|
399
|
+
throw e instanceof McpWarmStartError ? e : local("shm_io_error", `${latestPath} could not be read`, e);
|
|
400
|
+
}
|
|
401
|
+
finally {
|
|
402
|
+
await fh.close();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=mcp_warm_start.js.map
|