@remnic/plugin-openclaw 1.0.10 → 1.0.11

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.
Files changed (69) hide show
  1. package/dist/{calibration-674TDQNV.js → calibration-WCHOK6DX.js} +12 -4
  2. package/dist/capsule-cli-TFKLAG3S.js +329 -0
  3. package/dist/capsule-crypto-K3IRTKRH.js +17 -0
  4. package/dist/capsule-export-CVA3CKUQ.js +265 -0
  5. package/dist/capsule-import-CFX7BY5W.js +16 -0
  6. package/dist/capsule-merge-7RVOHJK3.js +189 -0
  7. package/dist/{causal-chain-OKDZSDEB.js → causal-chain-WYN5QOPS.js} +3 -2
  8. package/dist/{causal-consolidation-5BEXLQV5.js → causal-consolidation-JD6KJJH6.js} +16 -12
  9. package/dist/{causal-retrieval-3BKBXVXD.js → causal-retrieval-NZHQOZOE.js} +6 -5
  10. package/dist/{causal-trajectory-graph-RQIT37DN.js → causal-trajectory-graph-VBPE2WPM.js} +1 -1
  11. package/dist/chunk-37NKFWSO.js +233 -0
  12. package/dist/chunk-3G7FAF6S.js +60 -0
  13. package/dist/{chunk-Z7GRLVK3.js → chunk-3GUF7RQI.js} +235 -19
  14. package/dist/chunk-3I7RHWYT.js +214 -0
  15. package/dist/chunk-4G2XCSD2.js +186 -0
  16. package/dist/chunk-6IWEAUN6.js +148 -0
  17. package/dist/{chunk-LN5UZQVG.js → chunk-6UFI73TJ.js} +5 -3
  18. package/dist/chunk-7OQEPGQF.js +529 -0
  19. package/dist/chunk-B52XADV3.js +244 -0
  20. package/dist/chunk-BU5KJVWF.js +78 -0
  21. package/dist/chunk-CXM7EBAO.js +289 -0
  22. package/dist/chunk-ETJZRIAM.js +227 -0
  23. package/dist/chunk-FQRSVYY4.js +110 -0
  24. package/dist/chunk-HRGFO6AW.js +349 -0
  25. package/dist/chunk-I6B2W2IY.js +47 -0
  26. package/dist/chunk-JZBOXOUC.js +259 -0
  27. package/dist/chunk-K7EUBNDD.js +185 -0
  28. package/dist/chunk-L4PRBB2A.js +1860 -0
  29. package/dist/chunk-MBIFE6SA.js +250 -0
  30. package/dist/chunk-N7EOZY6F.js +400 -0
  31. package/dist/chunk-NKVIN6RD.js +118 -0
  32. package/dist/chunk-OEI7GLV2.js +17 -0
  33. package/dist/{chunk-S2ISS4AH.js → chunk-P3DIW2SD.js} +10 -10
  34. package/dist/{chunk-7TENHBV2.js → chunk-RQCTMECT.js} +10 -48
  35. package/dist/chunk-SSFTU6LP.js +182 -0
  36. package/dist/{chunk-BXTMZDRT.js → chunk-SVSQAG6M.js} +7 -5
  37. package/dist/chunk-TLVIQLB4.js +874 -0
  38. package/dist/{chunk-JJSNPSCD.js → chunk-TNH24SF6.js} +352 -50
  39. package/dist/chunk-TVKKIS53.js +720 -0
  40. package/dist/{chunk-YHH3SXKD.js → chunk-WPINX4MF.js} +1 -59
  41. package/dist/{chunk-HCFFXBLV.js → chunk-XMSDA5WA.js} +5 -1861
  42. package/dist/chunk-YGGGUTG3.js +125 -0
  43. package/dist/chunk-YGXXBRV7.js +10 -0
  44. package/dist/cipher-VHAFCG7Z.js +27 -0
  45. package/dist/dreams-ledger-3I52ISYR.js +285 -0
  46. package/dist/{engine-65C2J63X.js → engine-VMTFKFGO.js} +5 -2
  47. package/dist/{fallback-llm-LVK5PDIM.js → fallback-llm-WCWNGIQ3.js} +2 -1
  48. package/dist/first-start-migration-I24M2JEE.js +258 -0
  49. package/dist/forget-NI4RBDPB.js +68 -0
  50. package/dist/fs-utils-PZRI2HDZ.js +29 -0
  51. package/dist/graph-edge-decay-5CVKWBYH.js +203 -0
  52. package/dist/index.js +9775 -2900
  53. package/dist/kdf-H5B23ZM2.js +25 -0
  54. package/dist/memory-governance-DWGFV4FX.js +25 -0
  55. package/dist/metadata-JAGIWHEA.js +20 -0
  56. package/dist/migrate-from-identity-anchor-N3354WMP.js +7 -0
  57. package/dist/path-5LCUBAAZ.js +8 -0
  58. package/dist/peers-JF2I6RCR.js +43 -0
  59. package/dist/purge-XN2VSPZ2.js +204 -0
  60. package/dist/secure-store-FWJ7LBPH.js +149 -0
  61. package/dist/state-PVISYXRH.js +7 -0
  62. package/dist/state-store-LP5BO6SF.js +15 -0
  63. package/dist/{storage-DM4ZGOCN.js → storage-T2OGFUF4.js} +3 -1
  64. package/dist/tier-stats-IZNW66NC.js +147 -0
  65. package/dist/trace-NJESSGH7.js +289 -0
  66. package/dist/tui-MGK2LYJY.js +12 -0
  67. package/dist/types-H5R5D3WF.js +30 -0
  68. package/openclaw.plugin.json +519 -4
  69. package/package.json +1 -1
@@ -310,6 +310,134 @@
310
310
  }
311
311
  }
312
312
  },
313
+ "dreams": {
314
+ "type": "object",
315
+ "additionalProperties": false,
316
+ "default": {},
317
+ "description": "Consolidation pipeline phases config (issue #678 PR 2). Groups existing lifecycle/REM/deep-sleep gates under a unified namespace. Values here WIN over equivalent legacy top-level keys when set. See docs/dreams.md. (Note: distinct from the `dreaming` diary-surface config.)",
318
+ "properties": {
319
+ "phases": {
320
+ "type": "object",
321
+ "additionalProperties": false,
322
+ "default": {},
323
+ "properties": {
324
+ "lightSleep": {
325
+ "type": "object",
326
+ "additionalProperties": false,
327
+ "default": {},
328
+ "description": "Light-sleep phase: recent activity scoring and clustering. Mirrors lifecyclePolicyEnabled and related thresholds when not set explicitly.",
329
+ "properties": {
330
+ "enabled": {
331
+ "type": "boolean",
332
+ "description": "Master switch for the light-sleep phase. Mirrors lifecyclePolicyEnabled when not set."
333
+ },
334
+ "cadenceMs": {
335
+ "type": "integer",
336
+ "minimum": 0,
337
+ "default": 0,
338
+ "description": "Minimum interval between light-sleep passes (ms). 0 = no override; orchestrator uses its internal cadence."
339
+ },
340
+ "promoteHeatThreshold": {
341
+ "type": "number",
342
+ "minimum": 0,
343
+ "maximum": 1,
344
+ "default": 0.55,
345
+ "description": "Value score above which a memory is treated as hot. Mirrors lifecyclePromoteHeatThreshold when not set."
346
+ },
347
+ "staleDecayThreshold": {
348
+ "type": "number",
349
+ "minimum": 0,
350
+ "maximum": 1,
351
+ "default": 0.65,
352
+ "description": "Value score below which a memory starts to decay. Mirrors lifecycleStaleDecayThreshold when not set."
353
+ },
354
+ "archiveDecayThreshold": {
355
+ "type": "number",
356
+ "minimum": 0,
357
+ "maximum": 1,
358
+ "default": 0.85,
359
+ "description": "Value score below which a memory is eligible for archive. Mirrors lifecycleArchiveDecayThreshold when not set."
360
+ },
361
+ "filterStaleEnabled": {
362
+ "type": "boolean",
363
+ "default": false,
364
+ "description": "Whether stale memories are filtered from recall. Mirrors lifecycleFilterStaleEnabled when not set."
365
+ }
366
+ }
367
+ },
368
+ "rem": {
369
+ "type": "object",
370
+ "additionalProperties": false,
371
+ "default": {},
372
+ "description": "REM phase: cross-session synthesis, supersession resolution, semantic consolidation. Mirrors semanticConsolidation* keys when not set explicitly.",
373
+ "properties": {
374
+ "enabled": {
375
+ "type": "boolean",
376
+ "description": "Master switch for the REM phase. Mirrors semanticConsolidationEnabled when not set."
377
+ },
378
+ "cadenceMs": {
379
+ "type": "integer",
380
+ "minimum": 0,
381
+ "description": "How often the REM pass runs (ms). Derived from semanticConsolidationIntervalHours when not set."
382
+ },
383
+ "similarityThreshold": {
384
+ "type": "number",
385
+ "minimum": 0,
386
+ "maximum": 1,
387
+ "default": 0.8,
388
+ "description": "Cosine-similarity threshold for cluster membership. Mirrors semanticConsolidationThreshold when not set."
389
+ },
390
+ "minClusterSize": {
391
+ "type": "integer",
392
+ "minimum": 2,
393
+ "default": 3,
394
+ "description": "Minimum cluster size before consolidation runs. Mirrors semanticConsolidationMinClusterSize when not set."
395
+ },
396
+ "maxPerRun": {
397
+ "type": "integer",
398
+ "minimum": 0,
399
+ "default": 100,
400
+ "description": "Max cluster operations per run. Mirrors semanticConsolidationMaxPerRun when not set."
401
+ },
402
+ "minIntervalMs": {
403
+ "type": "integer",
404
+ "minimum": 0,
405
+ "description": "Minimum gap between consolidation passes (ms). Mirrors consolidationMinIntervalMs when not set."
406
+ }
407
+ }
408
+ },
409
+ "deepSleep": {
410
+ "type": "object",
411
+ "additionalProperties": false,
412
+ "default": {},
413
+ "description": "Deep-sleep phase: promotion to durable memory, hot-to-cold tier migration, page-version snapshots, archive. Mirrors versioningEnabled and related keys when not set explicitly.",
414
+ "properties": {
415
+ "enabled": {
416
+ "type": "boolean",
417
+ "default": false,
418
+ "description": "Master switch for the deep-sleep phase. Defaults false unless legacy deep-sleep surfaces are explicitly enabled; set true to allow nightly governance, tier migration, and versioning surfaces."
419
+ },
420
+ "cadenceMs": {
421
+ "type": "integer",
422
+ "minimum": 0,
423
+ "default": 86400000,
424
+ "description": "Minimum interval between deep-sleep passes (ms). Default 86400000 (24h). Informational in PR 2; PR 4 wires this into the cron scheduler."
425
+ },
426
+ "versioningEnabled": {
427
+ "type": "boolean",
428
+ "description": "Enable page-version snapshots on every overwrite. Mirrors versioningEnabled when not set."
429
+ },
430
+ "versioningMaxPerPage": {
431
+ "type": "integer",
432
+ "minimum": 0,
433
+ "description": "Max snapshots per memory page. Mirrors versioningMaxPerPage when not set."
434
+ }
435
+ }
436
+ }
437
+ }
438
+ }
439
+ }
440
+ },
313
441
  "heartbeat": {
314
442
  "type": "object",
315
443
  "additionalProperties": false,
@@ -363,6 +491,11 @@
363
491
  "type": "boolean",
364
492
  "default": false,
365
493
  "description": "When true, memory also overlays the current branch (project:<id>/branch:<name>). Opt-in — most development wants cross-branch recall. Wired in PR 3 of #569."
494
+ },
495
+ "globalFallback": {
496
+ "type": "boolean",
497
+ "default": true,
498
+ "description": "When true (default), project-scoped sessions include the root/default namespace in read fallbacks so globally useful memories remain visible. Set to false for strict project isolation."
366
499
  }
367
500
  }
368
501
  },
@@ -423,6 +556,16 @@
423
556
  }
424
557
  }
425
558
  },
559
+ "secureStoreEnabled": {
560
+ "type": "boolean",
561
+ "default": false,
562
+ "description": "Enable at-rest AES-256-GCM encryption for memory files (issue #690). When true, the daemon reads and writes memory files through the secure-fs layer. The store must be unlocked via `remnic secure-store unlock` after each daemon start. Default false."
563
+ },
564
+ "secureStoreEncryptOnWrite": {
565
+ "type": "boolean",
566
+ "default": true,
567
+ "description": "When secureStoreEnabled is true, encrypt new memory writes. Set to false to pause new encryptions while still decrypting existing encrypted files (useful during incremental migration). Default true."
568
+ },
426
569
  "slotBehavior": {
427
570
  "type": "object",
428
571
  "additionalProperties": false,
@@ -691,6 +834,178 @@
691
834
  }
692
835
  }
693
836
  },
837
+ "connectors": {
838
+ "type": "object",
839
+ "additionalProperties": false,
840
+ "default": {},
841
+ "description": "Live-connector configuration (issue #683). Each child object maps to one concrete LiveConnector. Defaults are off; operators must opt in.",
842
+ "properties": {
843
+ "googleDrive": {
844
+ "type": "object",
845
+ "additionalProperties": false,
846
+ "default": {},
847
+ "description": "Google Drive live connector (issue #683 PR 2/N). Imports text content from a user's Drive into Remnic on a poll schedule.",
848
+ "properties": {
849
+ "enabled": {
850
+ "type": "boolean",
851
+ "default": false,
852
+ "description": "Master gate. Default off — set to true to enable Drive imports. The connector additionally requires clientId, clientSecret, and refreshToken to be populated before it will run."
853
+ },
854
+ "clientId": {
855
+ "type": "string",
856
+ "default": "",
857
+ "description": "OAuth2 client id. Populate from your secret store (e.g. ${GOOGLE_DRIVE_CLIENT_ID}). Never commit a real value to source."
858
+ },
859
+ "clientSecret": {
860
+ "type": "string",
861
+ "default": "",
862
+ "description": "OAuth2 client secret. Populate from your secret store (e.g. ${GOOGLE_DRIVE_CLIENT_SECRET}). Never commit a real value to source."
863
+ },
864
+ "refreshToken": {
865
+ "type": "string",
866
+ "default": "",
867
+ "description": "OAuth2 refresh token issued for the user's Drive scope. Populate from your secret store (e.g. ${GOOGLE_DRIVE_REFRESH_TOKEN}). Never commit a real value to source."
868
+ },
869
+ "pollIntervalMs": {
870
+ "type": "integer",
871
+ "minimum": 1000,
872
+ "maximum": 86400000,
873
+ "default": 300000,
874
+ "description": "How often the scheduler should call the connector's syncIncremental, in milliseconds. Defaults to 5 minutes; max 24 hours."
875
+ },
876
+ "folderIds": {
877
+ "type": "array",
878
+ "items": {
879
+ "type": "string"
880
+ },
881
+ "default": [],
882
+ "description": "Optional array of Google Drive folder ids to scope the import. Empty = all accessible files. Folder ids are validated for shape; nested folders are NOT auto-included."
883
+ }
884
+ }
885
+ },
886
+ "notion": {
887
+ "type": "object",
888
+ "additionalProperties": false,
889
+ "default": {},
890
+ "description": "Notion live connector (issue #683 PR 3/N). Imports text content from Notion database pages into Remnic on a poll schedule.",
891
+ "properties": {
892
+ "enabled": {
893
+ "type": "boolean",
894
+ "default": false,
895
+ "description": "Master gate. Default off — set to true to enable Notion imports. The connector additionally requires a token and at least one databaseId to be populated before it will run."
896
+ },
897
+ "token": {
898
+ "type": "string",
899
+ "default": "",
900
+ "description": "Notion integration token (starts with secret_). Populate from your secret store (e.g. ${NOTION_TOKEN}). Never commit a real value to source."
901
+ },
902
+ "databaseIds": {
903
+ "type": "array",
904
+ "items": {
905
+ "type": "string"
906
+ },
907
+ "default": [],
908
+ "description": "Array of Notion database ids to import pages from. Accepts compact 32-hex-char ids or standard UUID format. Empty = connector is a no-op."
909
+ },
910
+ "pollIntervalMs": {
911
+ "type": "integer",
912
+ "minimum": 1000,
913
+ "maximum": 86400000,
914
+ "default": 300000,
915
+ "description": "How often the scheduler should call the connector's syncIncremental, in milliseconds. Defaults to 5 minutes; max 24 hours."
916
+ }
917
+ }
918
+ },
919
+ "gmail": {
920
+ "type": "object",
921
+ "additionalProperties": false,
922
+ "default": {},
923
+ "description": "Gmail live connector (issue #683 PR 4/6). Imports new inbox messages from Gmail into Remnic on a poll schedule.",
924
+ "properties": {
925
+ "enabled": {
926
+ "type": "boolean",
927
+ "default": false,
928
+ "description": "Master gate. Default off — set to true to enable Gmail imports. The connector additionally requires clientId, clientSecret, and refreshToken to be populated before it will run."
929
+ },
930
+ "clientId": {
931
+ "type": "string",
932
+ "default": "",
933
+ "description": "OAuth2 client id. Populate from your secret store (e.g. ${GMAIL_CLIENT_ID}). Never commit a real value to source."
934
+ },
935
+ "clientSecret": {
936
+ "type": "string",
937
+ "default": "",
938
+ "description": "OAuth2 client secret. Populate from your secret store (e.g. ${GMAIL_CLIENT_SECRET}). Never commit a real value to source."
939
+ },
940
+ "refreshToken": {
941
+ "type": "string",
942
+ "default": "",
943
+ "description": "OAuth2 refresh token issued for the Gmail scope. Populate from your secret store (e.g. ${GMAIL_REFRESH_TOKEN}). Never commit a real value to source."
944
+ },
945
+ "userId": {
946
+ "type": "string",
947
+ "default": "me",
948
+ "description": "Gmail userId. Defaults to 'me' (the authenticated user). Override only in delegated-access scenarios."
949
+ },
950
+ "query": {
951
+ "type": "string",
952
+ "default": "in:inbox",
953
+ "description": "Gmail search query applied in addition to the watermark after: filter. Default 'in:inbox'. Set to '' to import all mail."
954
+ },
955
+ "pollIntervalMs": {
956
+ "type": "integer",
957
+ "minimum": 1000,
958
+ "maximum": 86400000,
959
+ "default": 300000,
960
+ "description": "How often the scheduler should call the connector's syncIncremental, in milliseconds. Defaults to 5 minutes; max 24 hours."
961
+ }
962
+ }
963
+ },
964
+ "github": {
965
+ "type": "object",
966
+ "additionalProperties": false,
967
+ "default": {},
968
+ "description": "GitHub live connector (issue #683 PR 5/6). Imports issue comments, PR review comments, and optionally discussion posts authored by the configured user from watched repos into Remnic on a poll schedule.",
969
+ "properties": {
970
+ "enabled": {
971
+ "type": "boolean",
972
+ "default": false,
973
+ "description": "Master gate. Default off — set to true to enable GitHub imports. The connector additionally requires token, userLogin, and at least one repo to be populated before it will run."
974
+ },
975
+ "token": {
976
+ "type": "string",
977
+ "default": "",
978
+ "description": "GitHub personal access token. Populate from your secret store (e.g. ${GITHUB_TOKEN}). Never commit a real value to source."
979
+ },
980
+ "userLogin": {
981
+ "type": "string",
982
+ "default": "",
983
+ "description": "GitHub login of the user whose comments will be imported. Only comments authored by this login are ingested. Required when enabled."
984
+ },
985
+ "repos": {
986
+ "type": "array",
987
+ "items": {
988
+ "type": "string"
989
+ },
990
+ "default": [],
991
+ "description": "Array of repos to poll in \"owner/repo\" format. Empty = connector is a no-op."
992
+ },
993
+ "pollIntervalMs": {
994
+ "type": "integer",
995
+ "minimum": 1000,
996
+ "maximum": 86400000,
997
+ "default": 300000,
998
+ "description": "How often the scheduler should call the connector's syncIncremental, in milliseconds. Defaults to 5 minutes; max 24 hours."
999
+ },
1000
+ "includeDiscussions": {
1001
+ "type": "boolean",
1002
+ "default": false,
1003
+ "description": "Whether to import GitHub Discussion comments in addition to issue and PR review comments. Default false."
1004
+ }
1005
+ }
1006
+ }
1007
+ }
1008
+ },
694
1009
  "codexMaterializeMemories": {
695
1010
  "type": "boolean",
696
1011
  "default": true,
@@ -1273,8 +1588,20 @@
1273
1588
  "description": "Bind port for the Engram HTTP access server. Use 0 for an ephemeral port."
1274
1589
  },
1275
1590
  "authToken": {
1276
- "type": "string",
1277
- "description": "Bearer token for the local Remnic HTTP API. Supports ${ENV_VAR} expansion. If omitted, OPENCLAW_ENGRAM_ACCESS_TOKEN is used."
1591
+ "description": "Bearer token for the local Remnic HTTP API. Either a literal string (supports ${ENV_VAR} expansion) or an OpenClaw SecretRef object (e.g. {\"source\":\"exec\",\"provider\":\"kc_openclaw_remnic_token\",\"id\":\"value\"}) resolved at startup via the OpenClaw gateway secret resolver (issue #757). If omitted, OPENCLAW_REMNIC_ACCESS_TOKEN / OPENCLAW_ENGRAM_ACCESS_TOKEN is used.",
1592
+ "anyOf": [
1593
+ { "type": "string" },
1594
+ {
1595
+ "type": "object",
1596
+ "required": ["source"],
1597
+ "properties": {
1598
+ "source": { "type": "string", "minLength": 1 },
1599
+ "provider": { "type": "string" },
1600
+ "id": { "type": "string" },
1601
+ "command": {}
1602
+ }
1603
+ }
1604
+ ]
1278
1605
  },
1279
1606
  "principal": {
1280
1607
  "type": "string",
@@ -1734,6 +2061,19 @@
1734
2061
  "default": 0.7,
1735
2062
  "description": "Per-hop activation decay factor (0-1). Default 0.7."
1736
2063
  },
2064
+ "graphTraversalConfidenceFloor": {
2065
+ "type": "number",
2066
+ "default": 0.2,
2067
+ "minimum": 0,
2068
+ "maximum": 1,
2069
+ "description": "Issue #681 PR 3/3: minimum edge confidence required for traversal during spreading activation. Edges below this floor are pruned and contribute neither activation nor downstream neighbors. Legacy edges without a confidence field are treated as 1.0. Range 0-1. Default 0.2."
2070
+ },
2071
+ "graphTraversalPageRankIterations": {
2072
+ "type": "number",
2073
+ "default": 8,
2074
+ "minimum": 0,
2075
+ "description": "Issue #681 PR 3/3: number of PageRank-style refinement iterations applied on top of the BFS spreading-activation scores. Each iteration redistributes a node's confidence-weighted activation along its outgoing edges. Set to 0 to disable refinement and use raw BFS scores. Default 8."
2076
+ },
1737
2077
  "graphExpansionActivationWeight": {
1738
2078
  "type": "number",
1739
2079
  "default": 0.65,
@@ -1799,6 +2139,44 @@
1799
2139
  "default": 7,
1800
2140
  "description": "Number of top competing nodes considered for lateral inhibition"
1801
2141
  },
2142
+ "graphEdgeDecayEnabled": {
2143
+ "type": "boolean",
2144
+ "default": false,
2145
+ "description": "Enable the periodic graph-edge confidence decay maintenance job (issue #681 PR 2/3). Opt-in."
2146
+ },
2147
+ "graphEdgeDecayCadenceMs": {
2148
+ "type": "number",
2149
+ "default": 604800000,
2150
+ "minimum": 60000,
2151
+ "description": "Cadence in milliseconds for the graph-edge decay cron. Default 7 days. Sub-day cadences map to a daily cron expression."
2152
+ },
2153
+ "graphEdgeDecayWindowMs": {
2154
+ "type": "number",
2155
+ "default": 7776000000,
2156
+ "minimum": 60000,
2157
+ "description": "Decay window in milliseconds passed to decayEdgeConfidence. Default 90 days."
2158
+ },
2159
+ "graphEdgeDecayPerWindow": {
2160
+ "type": "number",
2161
+ "default": 0.1,
2162
+ "minimum": 0,
2163
+ "maximum": 1,
2164
+ "description": "Per-window confidence drop applied during decay. Default 0.1."
2165
+ },
2166
+ "graphEdgeDecayFloor": {
2167
+ "type": "number",
2168
+ "default": 0.1,
2169
+ "minimum": 0,
2170
+ "maximum": 1,
2171
+ "description": "Floor confidence will not decay below. Default 0.1."
2172
+ },
2173
+ "graphEdgeDecayVisibilityThreshold": {
2174
+ "type": "number",
2175
+ "default": 0.2,
2176
+ "minimum": 0,
2177
+ "maximum": 1,
2178
+ "description": "Confidence threshold used by the decay telemetry counter for low-visibility edges. Default 0.2."
2179
+ },
1802
2180
  "temporalMemoryTreeEnabled": {
1803
2181
  "type": "boolean",
1804
2182
  "default": false,
@@ -2012,6 +2390,49 @@
2012
2390
  }
2013
2391
  }
2014
2392
  },
2393
+ "patternReinforcementEnabled": {
2394
+ "type": "boolean",
2395
+ "default": false,
2396
+ "description": "Run the pattern-reinforcement maintenance job (issue #687 PR 2/4): cluster duplicate non-procedural memories by normalized content, promote the most-recent member to canonical, and supersede the older duplicates. Off by default until bench validation lands."
2397
+ },
2398
+ "patternReinforcementCadenceMs": {
2399
+ "type": "integer",
2400
+ "minimum": 0,
2401
+ "default": 604800000,
2402
+ "description": "Minimum interval (ms) between pattern-reinforcement runs. Default 7 days. Set to 0 to disable cadence gating (manual / test invocation)."
2403
+ },
2404
+ "patternReinforcementMinCount": {
2405
+ "type": "integer",
2406
+ "minimum": 2,
2407
+ "maximum": 1000,
2408
+ "default": 3,
2409
+ "description": "Minimum cluster size before pattern reinforcement promotes a canonical and supersedes duplicates. Default 3."
2410
+ },
2411
+ "patternReinforcementCategories": {
2412
+ "type": "array",
2413
+ "items": { "type": "string" },
2414
+ "default": ["preference", "fact", "decision"],
2415
+ "description": "Memory categories the pattern-reinforcement job considers. Skips procedural memories so it stays disjoint from procedural mining. Default: preference, fact, decision."
2416
+ },
2417
+ "reinforcementRecallBoostEnabled": {
2418
+ "type": "boolean",
2419
+ "default": false,
2420
+ "description": "When true, memories with reinforcement_count frontmatter receive an additive recall score boost (issue #687 PR 3/4). Default: false (opt-in)."
2421
+ },
2422
+ "reinforcementRecallBoostWeight": {
2423
+ "type": "number",
2424
+ "minimum": 0,
2425
+ "maximum": 1,
2426
+ "default": 0.05,
2427
+ "description": "Score bonus per unit of reinforcement_count (weight * count, capped at max). Range [0, 1]. Default: 0.05."
2428
+ },
2429
+ "reinforcementRecallBoostMax": {
2430
+ "type": "number",
2431
+ "minimum": 0,
2432
+ "maximum": 1,
2433
+ "default": 0.3,
2434
+ "description": "Maximum additive reinforcement boost per result. Range [0, 1]. Default: 0.3."
2435
+ },
2015
2436
  "temporalSupersessionEnabled": {
2016
2437
  "type": "boolean",
2017
2438
  "default": true,
@@ -2027,6 +2448,22 @@
2027
2448
  "default": true,
2028
2449
  "description": "When true, recall runs the direct-answer tier in observation mode: annotates LastRecallSnapshot.tierExplain with which tier would have served the query (issue #518). Does not short-circuit the QMD path in the current release."
2029
2450
  },
2451
+ "recallDisclosureEscalation": {
2452
+ "type": "string",
2453
+ "enum": [
2454
+ "manual",
2455
+ "auto"
2456
+ ],
2457
+ "default": "manual",
2458
+ "description": "Disclosure auto-escalation policy (issue #677 PR 4/4). When 'auto', recalls without an explicit caller-supplied disclosure escalate from chunk to section if the top-K confidence falls below recallDisclosureEscalationThreshold. 'raw' is never auto-selected. Default 'manual' preserves pre-#677 behavior."
2459
+ },
2460
+ "recallDisclosureEscalationThreshold": {
2461
+ "type": "number",
2462
+ "minimum": 0,
2463
+ "maximum": 1,
2464
+ "default": 0.5,
2465
+ "description": "Top-K confidence threshold (0-1) below which auto-escalation promotes chunk to section. Only consulted when recallDisclosureEscalation is 'auto'. Default 0.5."
2466
+ },
2030
2467
  "recallGraphEnabled": {
2031
2468
  "type": "boolean",
2032
2469
  "default": false,
@@ -2428,6 +2865,11 @@
2428
2865
  "default": "low",
2429
2866
  "description": "Minimum locally-scored importance level required to persist an extracted fact. Facts below this level are dropped before write and counted toward the importance_gated metric. Default \"low\" drops only trivial turn-level chatter (greetings, single-word replies); raise to \"normal\" or higher for a stricter gate."
2430
2867
  },
2868
+ "extractionScopeClassificationEnabled": {
2869
+ "type": "boolean",
2870
+ "default": true,
2871
+ "description": "When enabled, the extraction prompt instructs the LLM to classify each fact as 'project' (codebase-specific) or 'global' (cross-project knowledge). Global-scoped facts are promoted to the shared namespace so they are visible across all projects. Disable to restore pre-scope-classification behavior where all facts go to the session namespace."
2872
+ },
2431
2873
  "extractionJudgeEnabled": {
2432
2874
  "type": "boolean",
2433
2875
  "default": false,
@@ -2889,6 +3331,39 @@
2889
3331
  "default": false,
2890
3332
  "description": "Opt in to operator-aware consolidation prompts so the LLM returns structured {operator, output} JSON and SPLIT/MERGE/UPDATE is recorded on derived_via. When disabled (default), derived_via still populates via the cluster-shape heuristic."
2891
3333
  },
3334
+ "peerProfileReasonerEnabled": {
3335
+ "type": "boolean",
3336
+ "default": false,
3337
+ "description": "Enable the async peer profile reasoner (issue #679). Runs after semantic consolidation in the REM phase and updates per-peer profile.md files with provenance-tagged field updates derived from the peer's interaction log. Default off (opt-in)."
3338
+ },
3339
+ "peerProfileReasonerModel": {
3340
+ "type": "string",
3341
+ "default": "auto",
3342
+ "description": "Model identifier used by the peer profile reasoner. 'auto' inherits the gateway's primary chain (recommended). Logged for telemetry only — actual dispatch routes through the same FallbackLlmClient used by semantic consolidation."
3343
+ },
3344
+ "peerProfileReasonerMinInteractions": {
3345
+ "type": "number",
3346
+ "default": 5,
3347
+ "minimum": 0,
3348
+ "description": "Minimum new interaction-log entries a peer must accumulate since the previous reasoner run before being processed again. Set to 0 to consider every peer on every run."
3349
+ },
3350
+ "peerProfileReasonerMaxFieldsPerRun": {
3351
+ "type": "number",
3352
+ "default": 8,
3353
+ "minimum": 0,
3354
+ "description": "Hard cap on the total number of profile fields the reasoner will apply across all peers in a single run. Set to 0 to disable applying any fields."
3355
+ },
3356
+ "peerProfileRecallEnabled": {
3357
+ "type": "boolean",
3358
+ "default": false,
3359
+ "description": "When true, inject the active peer's profile fields into the recall context as a '## Peer Profile' section (issue #679 PR 3/5). Requires the session's peer ID to be registered before recall. Default off (opt-in)."
3360
+ },
3361
+ "peerProfileRecallMaxFields": {
3362
+ "type": "number",
3363
+ "default": 5,
3364
+ "minimum": 0,
3365
+ "description": "Maximum number of peer profile fields to inject per recall call. Only the most-recently-updated N fields are included. Set to 0 to disable field injection even when peerProfileRecallEnabled is true."
3366
+ },
2892
3367
  "creationMemoryEnabled": {
2893
3368
  "type": "boolean",
2894
3369
  "default": false,
@@ -3295,8 +3770,8 @@
3295
3770
  },
3296
3771
  "lifecyclePolicyEnabled": {
3297
3772
  "type": "boolean",
3298
- "default": false,
3299
- "description": "Enable lifecycle scoring/promotions during consolidation (v8.3)."
3773
+ "default": true,
3774
+ "description": "Enable the lifecycle policy engine (hot↔cold tier migration, value scoring, decay). Default true since #686 PR 3/6 flipping enables the year-2 retention story by default. Set to false to opt out."
3300
3775
  },
3301
3776
  "lifecycleFilterStaleEnabled": {
3302
3777
  "type": "boolean",
@@ -4287,6 +4762,16 @@
4287
4762
  "label": "Direct-Answer Retrieval Tier",
4288
4763
  "help": "Route validated high-trust queries to a fast direct-answer path before QMD (issue #518)."
4289
4764
  },
4765
+ "recallDisclosureEscalation": {
4766
+ "label": "Disclosure Auto-Escalation",
4767
+ "help": "Auto-promote default chunk recalls to section when top-K confidence is low (issue #677 PR 4/4). Set to 'auto' to enable; 'manual' (default) preserves pre-#677 behavior."
4768
+ },
4769
+ "recallDisclosureEscalationThreshold": {
4770
+ "label": "Disclosure Escalation Threshold",
4771
+ "advanced": true,
4772
+ "placeholder": "0.5",
4773
+ "help": "Top-K confidence (0-1) below which auto-escalation triggers. Only consulted when Disclosure Auto-Escalation is set to 'auto'."
4774
+ },
4290
4775
  "recallGraphEnabled": {
4291
4776
  "label": "Graph Retrieval (PPR)",
4292
4777
  "help": "Run Personalized PageRank on the retrieval graph and merge with QMD via MMR (issue #559)."
@@ -4691,6 +5176,36 @@
4691
5176
  "advanced": true,
4692
5177
  "help": "Opt in to operator-aware consolidation prompts (default off). When enabled, the LLM returns structured {operator, output} JSON and we record SPLIT/MERGE/UPDATE on derived_via. When disabled (default), derived_via still populates via the cluster-shape heuristic."
4693
5178
  },
5179
+ "peerProfileReasonerEnabled": {
5180
+ "label": "Peer Profile Reasoner",
5181
+ "advanced": true,
5182
+ "help": "Enable the async peer profile reasoner (issue #679). Runs in the REM phase after semantic consolidation and updates per-peer profile.md files with provenance-tagged field updates derived from each peer's interaction log. Default off (opt-in)."
5183
+ },
5184
+ "peerProfileReasonerModel": {
5185
+ "label": "Peer Profile Reasoner Model",
5186
+ "advanced": true,
5187
+ "help": "Model identifier the peer profile reasoner records on telemetry. Dispatch still routes through the FallbackLlmClient used by semantic consolidation."
5188
+ },
5189
+ "peerProfileReasonerMinInteractions": {
5190
+ "label": "Peer Profile Reasoner Min Interactions",
5191
+ "advanced": true,
5192
+ "help": "Minimum new interaction-log entries a peer must accumulate since the previous reasoner run before being processed again. Set to 0 to consider every peer on every run."
5193
+ },
5194
+ "peerProfileReasonerMaxFieldsPerRun": {
5195
+ "label": "Peer Profile Reasoner Max Fields Per Run",
5196
+ "advanced": true,
5197
+ "help": "Hard cap on the total number of profile fields the reasoner will apply across all peers in a single run. Set to 0 to disable applying any fields."
5198
+ },
5199
+ "peerProfileRecallEnabled": {
5200
+ "label": "Peer Profile Recall Injection",
5201
+ "advanced": true,
5202
+ "help": "When enabled, injects the active peer's profile fields into recall context as a '## Peer Profile' section. Requires the session peer ID to be registered. Default off."
5203
+ },
5204
+ "peerProfileRecallMaxFields": {
5205
+ "label": "Peer Profile Recall Max Fields",
5206
+ "advanced": true,
5207
+ "help": "Maximum number of peer profile fields to inject per recall. Only the most-recently-updated N fields are included. Set to 0 to disable injection."
5208
+ },
4694
5209
  "creationMemoryEnabled": {
4695
5210
  "label": "Creation Memory",
4696
5211
  "advanced": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/plugin-openclaw",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "OpenClaw adapter for Remnic memory — thin wrapper delegating to @remnic/core",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",