@prmichaelsen/remember-mcp 3.15.5 → 3.15.7

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/CHANGELOG.md CHANGED
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.15.7] - 2026-03-07
9
+
10
+ ### Changed
11
+
12
+ - Expand tool descriptions for `remember_search_by`, `remember_search_ghost_memory_by`, and `remember_search_space_by` with full mode explanations and complete property reference for byProperty mode
13
+ - Add inline mode descriptions to `mode` enum field so agents see them in schema-only views
14
+ - Document all sortable properties: 21 emotions, 10 functional signals, 3 composite scores, core fields, ratings, and REM metadata
15
+
8
16
  ## [3.15.5] - 2026-03-07
9
17
 
10
18
  ### Changed
@@ -2866,7 +2866,7 @@ var MemoryService = class {
2866
2866
  if (input.ghost_context) {
2867
2867
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2868
2868
  }
2869
- if (!input.ghost_context?.include_ghost_content) {
2869
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2870
2870
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2871
2871
  }
2872
2872
  if (!input.filters?.types?.includes("rem")) {
@@ -2915,7 +2915,7 @@ var MemoryService = class {
2915
2915
  if (input.ghost_context) {
2916
2916
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2917
2917
  }
2918
- if (!input.ghost_context?.include_ghost_content) {
2918
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2919
2919
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2920
2920
  }
2921
2921
  if (!input.filters?.types?.includes("rem")) {
@@ -2958,7 +2958,7 @@ var MemoryService = class {
2958
2958
  if (input.ghost_context) {
2959
2959
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2960
2960
  }
2961
- if (!input.ghost_context?.include_ghost_content) {
2961
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2962
2962
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2963
2963
  }
2964
2964
  if (!input.filters?.types?.includes("rem")) {
@@ -3006,7 +3006,7 @@ var MemoryService = class {
3006
3006
  if (input.ghost_context) {
3007
3007
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3008
3008
  }
3009
- if (!input.ghost_context?.include_ghost_content) {
3009
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3010
3010
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3011
3011
  }
3012
3012
  if (!input.filters?.types?.includes("rem")) {
@@ -3049,7 +3049,7 @@ var MemoryService = class {
3049
3049
  if (input.ghost_context) {
3050
3050
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3051
3051
  }
3052
- if (!input.ghost_context?.include_ghost_content) {
3052
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3053
3053
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3054
3054
  }
3055
3055
  if (!input.filters?.types?.includes("rem")) {
@@ -3151,7 +3151,7 @@ var MemoryService = class {
3151
3151
  if (input.ghost_context) {
3152
3152
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3153
3153
  }
3154
- if (!input.ghost_context?.include_ghost_content) {
3154
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3155
3155
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3156
3156
  }
3157
3157
  if (!input.filters?.types?.includes("rem")) {
@@ -3213,7 +3213,7 @@ var MemoryService = class {
3213
3213
  if (input.ghost_context) {
3214
3214
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3215
3215
  }
3216
- if (!input.ghost_context?.include_ghost_content) {
3216
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3217
3217
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3218
3218
  }
3219
3219
  if (!input.filters?.types?.includes("rem")) {
@@ -3259,7 +3259,7 @@ var MemoryService = class {
3259
3259
  if (input.ghost_context) {
3260
3260
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3261
3261
  }
3262
- if (!input.ghost_context?.include_ghost_content) {
3262
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3263
3263
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3264
3264
  }
3265
3265
  if (!input.filters?.types?.includes("rem")) {
@@ -3321,7 +3321,7 @@ var MemoryService = class {
3321
3321
  if (input.ghost_context) {
3322
3322
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3323
3323
  }
3324
- if (!input.ghost_context?.include_ghost_content) {
3324
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3325
3325
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3326
3326
  }
3327
3327
  if (!input.filters?.types?.includes("rem")) {
@@ -3424,7 +3424,7 @@ var MemoryService = class {
3424
3424
  if (input.ghost_context) {
3425
3425
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3426
3426
  }
3427
- if (!input.ghost_context?.include_ghost_content) {
3427
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3428
3428
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3429
3429
  }
3430
3430
  if (!input.filters?.types?.includes("rem")) {
@@ -8177,14 +8177,25 @@ var searchByTool = {
8177
8177
  Use remember_find_similar for vector similarity.
8178
8178
  Use this tool for structured browsing, sorting, and discovery.
8179
8179
 
8180
+ byBroad returns truncated content (content_head/mid/tail ~100 chars each) instead of full content.
8181
+ Use it to scan large collections, then drill into specific memories with other search tools.
8182
+
8183
+ Available sort_field values for byProperty:
8184
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
8185
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
8186
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
8187
+ Composite scores: feel_significance, functional_significance, total_significance
8188
+ Core: weight, trust_score, confidence, strength, relationship_count, version, access_count
8189
+ Ratings: rating_sum, rating_count, rating_bayesian
8190
+ REM metadata: rem_visits (times scored by REM)
8191
+
8180
8192
  byProperty examples:
8181
8193
  - { mode: "byProperty", sort_field: "feel_trauma", sort_order: "desc" } \u2014 most traumatic
8182
8194
  - { mode: "byProperty", sort_field: "feel_humor", sort_order: "desc" } \u2014 funniest
8183
- - { mode: "byProperty", sort_field: "feel_retrieval_utility", sort_order: "desc" } \u2014 most useful
8195
+ - { mode: "byProperty", sort_field: "functional_retrieval_utility", sort_order: "desc" } \u2014 most useful
8184
8196
  - { mode: "byProperty", sort_field: "rem_visits", sort_order: "asc" } \u2014 least scored by REM
8185
-
8186
- byBroad returns truncated content (content_head/mid/tail ~100 chars each) instead of full content.
8187
- Use it to scan large collections, then drill into specific memories with other search tools.`,
8197
+ - { mode: "byProperty", sort_field: "total_significance", sort_order: "desc" } \u2014 most significant overall
8198
+ - { mode: "byProperty", sort_field: "functional_novelty", sort_order: "desc" } \u2014 most novel`,
8188
8199
  inputSchema: {
8189
8200
  type: "object",
8190
8201
  properties: {
@@ -8612,15 +8623,35 @@ async function handleQueryGhostMemory(args, userId, authContext) {
8612
8623
  // src/tools/search-ghost-memory-by.ts
8613
8624
  var searchGhostMemoryByTool = {
8614
8625
  name: "remember_search_ghost_memory_by",
8615
- description: `Search ghost memories using specialized modes (byTime, byDensity,
8616
- byProperty, byBroad, etc.). Automatically filters to content_type: ghost.`,
8626
+ description: `Search ghost memories using specialized sort/discovery modes. Automatically filters to content_type: ghost.
8627
+
8628
+ Modes:
8629
+ - byTime: Chronological sort (newest/oldest first)
8630
+ - byDensity: Sort by relationship count (most connected ghost memories)
8631
+ - byRating: Sort by Bayesian rating average (social ratings from spaces)
8632
+ - byDiscovery: Interleaved rated + unrated content for exploration (4:1 ratio)
8633
+ - byProperty: Sort by any memory property (e.g., feel_trauma, weight, feel_salience). Requires sort_field.
8634
+ - bySignificance: Sort by total_significance (combined emotional + functional score from REM)
8635
+ - byBroad: Massive results with truncated content (content_head/mid/tail ~100 chars each) for scan-and-drill-in workflow
8636
+ - byRandom: Random sampling for serendipitous rediscovery
8637
+
8638
+ Use remember_search_ghost_memory for hybrid semantic+keyword search.
8639
+ Use this tool for structured browsing, sorting, and discovery of ghost interaction records.
8640
+
8641
+ Available sort_field values for byProperty:
8642
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
8643
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
8644
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
8645
+ Composite scores: feel_significance, functional_significance, total_significance
8646
+ Core: weight, trust_score, relationship_count, version
8647
+ REM metadata: rem_visits`,
8617
8648
  inputSchema: {
8618
8649
  type: "object",
8619
8650
  properties: {
8620
8651
  mode: {
8621
8652
  type: "string",
8622
8653
  enum: ["byTime", "byDensity", "byRating", "byDiscovery", "byProperty", "bySignificance", "byRandom", "byBroad"],
8623
- description: "Search mode"
8654
+ description: "Search mode: byTime (chronological), byDensity (most connected), byRating (highest rated), byDiscovery (explore mix), byProperty (sort by field), bySignificance (emotional+functional score), byRandom (random sample), byBroad (scan many truncated)"
8624
8655
  },
8625
8656
  query: { type: "string", description: "Optional search query" },
8626
8657
  sort_order: { type: "string", enum: ["asc", "desc"] },
@@ -8746,25 +8777,36 @@ async function handleGetCore(args, userId, _authContext) {
8746
8777
  // src/tools/search-space-by.ts
8747
8778
  var searchSpaceByTool = {
8748
8779
  name: "remember_search_space_by",
8749
- description: `Search shared spaces using specialized modes. Similar to remember_search_by
8750
- but operates on published memories in spaces and groups.
8780
+ description: `Search published memories in shared spaces/groups using specialized sort/discovery modes.
8751
8781
 
8752
8782
  Modes:
8753
- - byTime: Chronological sort of published memories
8754
- - byRating: Sort by Bayesian rating average (social ratings)
8755
- - byDiscovery: Interleaved rated + unrated for exploration
8756
- - byProperty: Sort by any property (e.g., feel_trauma, total_significance)
8757
- - byBroad: Massive results with truncated content
8758
- - byRandom: Random sampling from space
8759
-
8760
- At least one of 'spaces' or 'groups' must be provided.`,
8783
+ - byTime: Chronological sort (newest/oldest first)
8784
+ - byRating: Sort by Bayesian rating average (social ratings from other users)
8785
+ - byDiscovery: Interleaved rated + unrated content for exploration (4:1 ratio). Good for finding hidden gems.
8786
+ - byProperty: Sort by any memory property (e.g., feel_trauma, total_significance, weight). Requires sort_field.
8787
+ - byBroad: Massive results with truncated content (content_head/mid/tail ~100 chars each) for scan-and-drill-in workflow
8788
+ - byRandom: Random sampling for serendipitous discovery
8789
+
8790
+ At least one of 'spaces' or 'groups' must be provided.
8791
+
8792
+ Use remember_search_space for hybrid semantic+keyword search of space memories.
8793
+ Use this tool for structured browsing, sorting, and discovery of published content.
8794
+
8795
+ Available sort_field values for byProperty:
8796
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
8797
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
8798
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
8799
+ Composite scores: feel_significance, functional_significance, total_significance
8800
+ Core: weight, trust_score, relationship_count, version
8801
+ Ratings: rating_sum, rating_count, rating_bayesian
8802
+ Published: discovery_count, revision_count`,
8761
8803
  inputSchema: {
8762
8804
  type: "object",
8763
8805
  properties: {
8764
8806
  mode: {
8765
8807
  type: "string",
8766
8808
  enum: ["byTime", "byRating", "byDiscovery", "byProperty", "byBroad", "byRandom"],
8767
- description: "Search mode"
8809
+ description: "Search mode: byTime (chronological), byRating (highest rated), byDiscovery (explore mix), byProperty (sort by field), byBroad (scan many truncated), byRandom (random sample)"
8768
8810
  },
8769
8811
  spaces: {
8770
8812
  type: "array",
package/dist/server.js CHANGED
@@ -2870,7 +2870,7 @@ var MemoryService = class {
2870
2870
  if (input.ghost_context) {
2871
2871
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2872
2872
  }
2873
- if (!input.ghost_context?.include_ghost_content) {
2873
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2874
2874
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2875
2875
  }
2876
2876
  if (!input.filters?.types?.includes("rem")) {
@@ -2919,7 +2919,7 @@ var MemoryService = class {
2919
2919
  if (input.ghost_context) {
2920
2920
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2921
2921
  }
2922
- if (!input.ghost_context?.include_ghost_content) {
2922
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2923
2923
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2924
2924
  }
2925
2925
  if (!input.filters?.types?.includes("rem")) {
@@ -2962,7 +2962,7 @@ var MemoryService = class {
2962
2962
  if (input.ghost_context) {
2963
2963
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
2964
2964
  }
2965
- if (!input.ghost_context?.include_ghost_content) {
2965
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
2966
2966
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
2967
2967
  }
2968
2968
  if (!input.filters?.types?.includes("rem")) {
@@ -3010,7 +3010,7 @@ var MemoryService = class {
3010
3010
  if (input.ghost_context) {
3011
3011
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3012
3012
  }
3013
- if (!input.ghost_context?.include_ghost_content) {
3013
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3014
3014
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3015
3015
  }
3016
3016
  if (!input.filters?.types?.includes("rem")) {
@@ -3053,7 +3053,7 @@ var MemoryService = class {
3053
3053
  if (input.ghost_context) {
3054
3054
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3055
3055
  }
3056
- if (!input.ghost_context?.include_ghost_content) {
3056
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3057
3057
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3058
3058
  }
3059
3059
  if (!input.filters?.types?.includes("rem")) {
@@ -3155,7 +3155,7 @@ var MemoryService = class {
3155
3155
  if (input.ghost_context) {
3156
3156
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3157
3157
  }
3158
- if (!input.ghost_context?.include_ghost_content) {
3158
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3159
3159
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3160
3160
  }
3161
3161
  if (!input.filters?.types?.includes("rem")) {
@@ -3217,7 +3217,7 @@ var MemoryService = class {
3217
3217
  if (input.ghost_context) {
3218
3218
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3219
3219
  }
3220
- if (!input.ghost_context?.include_ghost_content) {
3220
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3221
3221
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3222
3222
  }
3223
3223
  if (!input.filters?.types?.includes("rem")) {
@@ -3263,7 +3263,7 @@ var MemoryService = class {
3263
3263
  if (input.ghost_context) {
3264
3264
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3265
3265
  }
3266
- if (!input.ghost_context?.include_ghost_content) {
3266
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3267
3267
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3268
3268
  }
3269
3269
  if (!input.filters?.types?.includes("rem")) {
@@ -3325,7 +3325,7 @@ var MemoryService = class {
3325
3325
  if (input.ghost_context) {
3326
3326
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3327
3327
  }
3328
- if (!input.ghost_context?.include_ghost_content) {
3328
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3329
3329
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3330
3330
  }
3331
3331
  if (!input.filters?.types?.includes("rem")) {
@@ -3428,7 +3428,7 @@ var MemoryService = class {
3428
3428
  if (input.ghost_context) {
3429
3429
  ghostFilters.push(buildTrustFilter(this.collection, input.ghost_context.accessor_trust_level));
3430
3430
  }
3431
- if (!input.ghost_context?.include_ghost_content) {
3431
+ if (!input.ghost_context?.include_ghost_content && !input.filters?.types?.includes("ghost")) {
3432
3432
  ghostFilters.push(this.collection.filter.byProperty("content_type").notEqual("ghost"));
3433
3433
  }
3434
3434
  if (!input.filters?.types?.includes("rem")) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prmichaelsen/remember-mcp",
3
- "version": "3.15.5",
3
+ "version": "3.15.7",
4
4
  "description": "Multi-tenant memory system MCP server with vector search and relationships",
5
5
  "main": "dist/server.js",
6
6
  "type": "module",
@@ -52,7 +52,7 @@
52
52
  "@modelcontextprotocol/sdk": "^1.0.4",
53
53
  "@prmichaelsen/firebase-admin-sdk-v8": "^2.2.0",
54
54
  "@prmichaelsen/mcp-auth": "^7.0.4",
55
- "@prmichaelsen/remember-core": "^0.44.1",
55
+ "@prmichaelsen/remember-core": "^0.45.0",
56
56
  "dotenv": "^16.4.5",
57
57
  "uuid": "^13.0.0",
58
58
  "weaviate-client": "^3.2.0"
@@ -34,14 +34,25 @@ export const searchByTool = {
34
34
  Use remember_find_similar for vector similarity.
35
35
  Use this tool for structured browsing, sorting, and discovery.
36
36
 
37
+ byBroad returns truncated content (content_head/mid/tail ~100 chars each) instead of full content.
38
+ Use it to scan large collections, then drill into specific memories with other search tools.
39
+
40
+ Available sort_field values for byProperty:
41
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
42
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
43
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
44
+ Composite scores: feel_significance, functional_significance, total_significance
45
+ Core: weight, trust_score, confidence, strength, relationship_count, version, access_count
46
+ Ratings: rating_sum, rating_count, rating_bayesian
47
+ REM metadata: rem_visits (times scored by REM)
48
+
37
49
  byProperty examples:
38
50
  - { mode: "byProperty", sort_field: "feel_trauma", sort_order: "desc" } — most traumatic
39
51
  - { mode: "byProperty", sort_field: "feel_humor", sort_order: "desc" } — funniest
40
- - { mode: "byProperty", sort_field: "feel_retrieval_utility", sort_order: "desc" } — most useful
52
+ - { mode: "byProperty", sort_field: "functional_retrieval_utility", sort_order: "desc" } — most useful
41
53
  - { mode: "byProperty", sort_field: "rem_visits", sort_order: "asc" } — least scored by REM
42
-
43
- byBroad returns truncated content (content_head/mid/tail ~100 chars each) instead of full content.
44
- Use it to scan large collections, then drill into specific memories with other search tools.`,
54
+ - { mode: "byProperty", sort_field: "total_significance", sort_order: "desc" } — most significant overall
55
+ - { mode: "byProperty", sort_field: "functional_novelty", sort_order: "desc" } most novel`,
45
56
  inputSchema: {
46
57
  type: 'object',
47
58
  properties: {
@@ -11,15 +11,35 @@ import type { SearchByMode } from './search-by.js';
11
11
 
12
12
  export const searchGhostMemoryByTool = {
13
13
  name: 'remember_search_ghost_memory_by',
14
- description: `Search ghost memories using specialized modes (byTime, byDensity,
15
- byProperty, byBroad, etc.). Automatically filters to content_type: ghost.`,
14
+ description: `Search ghost memories using specialized sort/discovery modes. Automatically filters to content_type: ghost.
15
+
16
+ Modes:
17
+ - byTime: Chronological sort (newest/oldest first)
18
+ - byDensity: Sort by relationship count (most connected ghost memories)
19
+ - byRating: Sort by Bayesian rating average (social ratings from spaces)
20
+ - byDiscovery: Interleaved rated + unrated content for exploration (4:1 ratio)
21
+ - byProperty: Sort by any memory property (e.g., feel_trauma, weight, feel_salience). Requires sort_field.
22
+ - bySignificance: Sort by total_significance (combined emotional + functional score from REM)
23
+ - byBroad: Massive results with truncated content (content_head/mid/tail ~100 chars each) for scan-and-drill-in workflow
24
+ - byRandom: Random sampling for serendipitous rediscovery
25
+
26
+ Use remember_search_ghost_memory for hybrid semantic+keyword search.
27
+ Use this tool for structured browsing, sorting, and discovery of ghost interaction records.
28
+
29
+ Available sort_field values for byProperty:
30
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
31
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
32
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
33
+ Composite scores: feel_significance, functional_significance, total_significance
34
+ Core: weight, trust_score, relationship_count, version
35
+ REM metadata: rem_visits`,
16
36
  inputSchema: {
17
37
  type: 'object',
18
38
  properties: {
19
39
  mode: {
20
40
  type: 'string',
21
41
  enum: ['byTime', 'byDensity', 'byRating', 'byDiscovery', 'byProperty', 'bySignificance', 'byRandom', 'byBroad'],
22
- description: 'Search mode',
42
+ description: 'Search mode: byTime (chronological), byDensity (most connected), byRating (highest rated), byDiscovery (explore mix), byProperty (sort by field), bySignificance (emotional+functional score), byRandom (random sample), byBroad (scan many truncated)',
23
43
  },
24
44
  query: { type: 'string', description: 'Optional search query' },
25
45
  sort_order: { type: 'string', enum: ['asc', 'desc'] },
@@ -12,25 +12,36 @@ export type SearchSpaceByMode = 'byTime' | 'byRating' | 'byDiscovery' | 'byPrope
12
12
 
13
13
  export const searchSpaceByTool = {
14
14
  name: 'remember_search_space_by',
15
- description: `Search shared spaces using specialized modes. Similar to remember_search_by
16
- but operates on published memories in spaces and groups.
15
+ description: `Search published memories in shared spaces/groups using specialized sort/discovery modes.
17
16
 
18
17
  Modes:
19
- - byTime: Chronological sort of published memories
20
- - byRating: Sort by Bayesian rating average (social ratings)
21
- - byDiscovery: Interleaved rated + unrated for exploration
22
- - byProperty: Sort by any property (e.g., feel_trauma, total_significance)
23
- - byBroad: Massive results with truncated content
24
- - byRandom: Random sampling from space
25
-
26
- At least one of 'spaces' or 'groups' must be provided.`,
18
+ - byTime: Chronological sort (newest/oldest first)
19
+ - byRating: Sort by Bayesian rating average (social ratings from other users)
20
+ - byDiscovery: Interleaved rated + unrated content for exploration (4:1 ratio). Good for finding hidden gems.
21
+ - byProperty: Sort by any memory property (e.g., feel_trauma, total_significance, weight). Requires sort_field.
22
+ - byBroad: Massive results with truncated content (content_head/mid/tail ~100 chars each) for scan-and-drill-in workflow
23
+ - byRandom: Random sampling for serendipitous discovery
24
+
25
+ At least one of 'spaces' or 'groups' must be provided.
26
+
27
+ Use remember_search_space for hybrid semantic+keyword search of space memories.
28
+ Use this tool for structured browsing, sorting, and discovery of published content.
29
+
30
+ Available sort_field values for byProperty:
31
+ Emotions (0-1): feel_emotional_significance, feel_vulnerability, feel_trauma, feel_humor, feel_happiness, feel_sadness, feel_fear, feel_anger, feel_surprise, feel_disgust, feel_contempt, feel_embarrassment, feel_shame, feel_guilt, feel_excitement, feel_pride, feel_intensity, feel_coherence_tension
32
+ Affect dimensions: feel_valence (-1 to 1), feel_arousal (0-1), feel_dominance (0-1)
33
+ Functional signals (0-1): functional_salience, functional_urgency, functional_social_weight, functional_agency, functional_novelty, functional_retrieval_utility, functional_narrative_importance, functional_aesthetic_quality, functional_valence, functional_coherence_tension
34
+ Composite scores: feel_significance, functional_significance, total_significance
35
+ Core: weight, trust_score, relationship_count, version
36
+ Ratings: rating_sum, rating_count, rating_bayesian
37
+ Published: discovery_count, revision_count`,
27
38
  inputSchema: {
28
39
  type: 'object',
29
40
  properties: {
30
41
  mode: {
31
42
  type: 'string',
32
43
  enum: ['byTime', 'byRating', 'byDiscovery', 'byProperty', 'byBroad', 'byRandom'],
33
- description: 'Search mode',
44
+ description: 'Search mode: byTime (chronological), byRating (highest rated), byDiscovery (explore mix), byProperty (sort by field), byBroad (scan many truncated), byRandom (random sample)',
34
45
  },
35
46
  spaces: {
36
47
  type: 'array',