@psiclawops/hypermem 0.9.5 → 0.9.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 +15 -3
- package/INSTALL.md +7 -10
- package/README.md +4 -4
- package/bench/data-access-bench.mjs +1 -1
- package/dist/background-indexer.js +9 -9
- package/dist/cross-agent.d.ts +1 -1
- package/dist/cross-agent.js +17 -17
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/seed.d.ts +1 -1
- package/dist/seed.js +1 -1
- package/dist/session-flusher.d.ts +2 -2
- package/dist/session-flusher.js +2 -2
- package/dist/spawn-context.d.ts +1 -1
- package/dist/spawn-context.js +1 -1
- package/dist/topic-store.js +5 -5
- package/dist/topic-synthesizer.js +1 -1
- package/dist/trigger-registry.d.ts +1 -1
- package/dist/trigger-registry.js +4 -4
- package/dist/types.d.ts +2 -2
- package/docs/DIAGNOSTICS.md +16 -1
- package/docs/INTEGRATION_VALIDATION.md +15 -0
- package/docs/MIGRATION.md +1 -1
- package/install.sh +0 -0
- package/memory-plugin/dist/index.d.ts +3 -3
- package/memory-plugin/dist/index.js +1 -1
- package/memory-plugin/openclaw.plugin.json +6 -0
- package/memory-plugin/package.json +10 -7
- package/package.json +13 -2
- package/plugin/dist/index.d.ts +3 -3
- package/plugin/dist/index.d.ts.map +1 -1
- package/plugin/dist/index.js +4 -5
- package/plugin/dist/index.js.map +1 -1
- package/plugin/openclaw.plugin.json +2 -1
- package/plugin/package.json +11 -8
- package/scripts/install-packed-runtime.mjs +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to hypermem are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.9.7 - 2026-05-02
|
|
6
|
+
|
|
7
|
+
- **OpenClaw Plugin SDK imports modernized.** HyperCompositor and HyperMem memory now import plugin entry helpers through the canonical public Plugin SDK surface and refresh OpenClaw/Plugin SDK build provenance to the validated runtime.
|
|
8
|
+
- **SDK drift is now actively challenged.** Release gates enforce public SDK imports and exact build metadata for reproducibility, while a latest-SDK canary and Dependabot tracking keep the pin from quietly aging into another compatibility break.
|
|
9
|
+
- **Memory plugin tool contract declared.** `hypermem` now declares ownership of the optional `history_query` tool in its OpenClaw plugin manifest, satisfying the 2026.5.2 plugin checker contract gate.
|
|
10
|
+
- **Plugin checker gates are now standard release infrastructure.** HyperMem CI runs Plugin Inspector static/runtime checks plus isolated dependency-install cold import proof, production/dev dependency audit, and issue-debt validation; publish readiness has a packed-artifact OpenClaw `plugins doctor`/runtime-inspect gate. The previous context-engine root SDK barrel P2 is fixed by deriving context-engine types from the public `OpenClawPluginApi` core type surface.
|
|
11
|
+
|
|
12
|
+
## 0.9.6 - 2026-05-01
|
|
13
|
+
|
|
14
|
+
- **OpenClaw 2026.4.29 plugin startup compatibility.** HyperCompositor and HyperMem memory manifests now declare `activation.onStartup: false`, making slot-triggered loading explicit and removing reliance on deprecated implicit startup sidecar fallback behavior.
|
|
15
|
+
- **Release parity preserved.** Core, context-engine plugin, memory plugin, and lockfiles are aligned at 0.9.6 for the compatibility update.
|
|
16
|
+
|
|
5
17
|
## 0.9.5 - 2026-04-29
|
|
6
18
|
|
|
7
19
|
- **Install-readiness defaults hardened.** Fresh installs now stage `embedding.provider: "none"` by default, making the first-install path FTS5-only and free of Ollama or hosted-provider dependencies.
|
|
@@ -22,7 +34,7 @@ All notable changes to hypermem are documented here.
|
|
|
22
34
|
## 0.9.3 - OpenClaw 2026.4.26 compatibility hardening
|
|
23
35
|
|
|
24
36
|
- **Plugin manifests declare runtime config schema.** HyperCompositor and HyperMem memory manifests now expose the supported config surface for OpenClaw 2026.4.26 registry/config validation.
|
|
25
|
-
- **Install and doctor flow aligned with persisted plugin registry.**
|
|
37
|
+
- **Install and doctor flow aligned with persisted plugin registry.** Operator guidance and `hypermem-doctor` now include registry refresh, doctor repair, and plugin-list verification steps.
|
|
26
38
|
- **Native compaction collision guard added.** `hypermem-doctor` warns when `agents.defaults.compaction.maxActiveTranscriptBytes` is set; HyperMem deployments should leave it unset so HyperMem remains the single trim/compose pressure owner.
|
|
27
39
|
- **Embedding query/document asymmetry supported.** HyperMem config now supports query/document input types and prefixes, with defaults for `nomic-embed-text`, `qwen3-embedding`, and `mxbai-embed-large`.
|
|
28
40
|
- **Forked subagent warm-start repair.** `prepareSubagentSpawn()` falls back to durable runtime history when the hot cache is empty, so forked children inherit parent working context instead of silently starting cold.
|
|
@@ -41,7 +53,7 @@ All notable changes to hypermem are documented here.
|
|
|
41
53
|
- **Vector store init log shows actual provider/model/dims.** Diagnostic log line at startup now reflects the resolved configuration instead of the static placeholder, so misconfiguration is visible immediately.
|
|
42
54
|
- **Tool artifact API arity + hydration docs aligned.** Doc-only follow-ups; no runtime behavior change.
|
|
43
55
|
|
|
44
|
-
**
|
|
56
|
+
**Operator action:** upgrade from 0.9.0 is recommended. 0.9.0 in production with a configured non-default embedder may have written mismatched vectors; check `hypermem-status` for vector-store init line after upgrade.
|
|
45
57
|
|
|
46
58
|
## 0.9.0 - adaptive context lifecycle
|
|
47
59
|
|
|
@@ -74,7 +86,7 @@ All notable changes to hypermem are documented here.
|
|
|
74
86
|
- **Provider + model identity is now tracked explicitly in HyperCompositor model state.** Mid-session routing changes are detected on the full `provider/model` key, not budget alone, so `github-copilot/claude-sonnet-4-6` and `anthropic/claude-sonnet-4-6` are treated as different operational envelopes.
|
|
75
87
|
- **Downshift detection now keys off provider/model-aware state.** Budget-downshift handling still stays conservative, but verbose logs now surface provider swaps, model swaps, and budget deltas clearly during `context:assemble`.
|
|
76
88
|
- **Install docs now declare the full operator path.** README, INSTALL.md, and TUNING.md now separate staging from activation, document install states explicitly, add merge-safe wiring guidance, and clarify what healthy-but-empty looks like on a first run.
|
|
77
|
-
- **0.8.5 release parity.** Package versions are aligned for the next publish while preserving the npm-first installer and merge-safe config guidance landed from
|
|
89
|
+
- **0.8.5 release parity.** Package versions are aligned for the next publish while preserving the npm-first installer and merge-safe config guidance landed from Pylon's install review.
|
|
78
90
|
|
|
79
91
|
## 0.8.4 — compaction fence fix, install-path fixes, zod runtime packaging
|
|
80
92
|
|
package/INSTALL.md
CHANGED
|
@@ -616,7 +616,7 @@ openclaw status # look for hypermem in plugi
|
|
|
616
616
|
|
|
617
617
|
### Step 5 — Configure your fleet
|
|
618
618
|
|
|
619
|
-
hypermem works out of the box for both single-agent and multi-agent installs. The source ships with generic placeholder agent names (`
|
|
619
|
+
hypermem works out of the box for both single-agent and multi-agent installs. The source ships with generic placeholder agent names (`agent1`, `agent2`, `director1`, etc.) in two files that define fleet topology:
|
|
620
620
|
|
|
621
621
|
| File | What it defines |
|
|
622
622
|
|---|---|
|
|
@@ -643,7 +643,7 @@ Facts, episodes, and topics are all scoped to your agent ID automatically. Cross
|
|
|
643
643
|
|
|
644
644
|
#### Multi-agent installs
|
|
645
645
|
|
|
646
|
-
hypermem ships with generic placeholder agent names (`
|
|
646
|
+
hypermem ships with generic placeholder agent names (`agent1`, `agent2`, `director1`, etc.) in the two fleet topology files listed above.
|
|
647
647
|
|
|
648
648
|
Replace the placeholder names with your fleet:
|
|
649
649
|
|
|
@@ -651,7 +651,7 @@ Replace the placeholder names with your fleet:
|
|
|
651
651
|
|
|
652
652
|
```typescript
|
|
653
653
|
// Before (placeholder):
|
|
654
|
-
|
|
654
|
+
agent1: { agentId: 'agent1', tier: 'council' },
|
|
655
655
|
|
|
656
656
|
// After (your fleet):
|
|
657
657
|
architect: { agentId: 'architect', tier: 'council' },
|
|
@@ -661,7 +661,7 @@ architect: { agentId: 'architect', tier: 'council' },
|
|
|
661
661
|
|
|
662
662
|
```typescript
|
|
663
663
|
// Before (placeholder):
|
|
664
|
-
|
|
664
|
+
agent1: 'infrastructure',
|
|
665
665
|
|
|
666
666
|
// After (your fleet):
|
|
667
667
|
architect: 'infrastructure',
|
|
@@ -820,17 +820,14 @@ Resolution order is: (1) `plugins.entries.hypercompositor.config` in `openclaw.j
|
|
|
820
820
|
|
|
821
821
|
These settings live in `~/.openclaw/hypermem/config.json` under the `compositor` key. All fields are optional — omit any knob to get the code-level default. Gateway restart required after changes.
|
|
822
822
|
|
|
823
|
-
The recommended starting config for a standard single-agent deployment is the same recall-friendly profile shipped in `assets/default-config.json` and written by `hypermem-install` when no config exists. It keeps
|
|
823
|
+
The recommended starting config for a standard single-agent deployment is the same recall-friendly context profile shipped in `assets/default-config.json` and written by `hypermem-install` when no config exists. It keeps embeddings disabled for baseline install safety, protects topic-bearing warm context, boosts recent antecedents, and guards the literal antecedent of the current user turn under non-critical pressure. Enable Ollama, OpenRouter, or Gemini after the baseline FTS5 install is verified.
|
|
824
824
|
|
|
825
|
-
Key
|
|
825
|
+
Key starter defaults:
|
|
826
826
|
|
|
827
827
|
```json
|
|
828
828
|
{
|
|
829
829
|
"embedding": {
|
|
830
|
-
"provider": "
|
|
831
|
-
"model": "nomic-embed-text",
|
|
832
|
-
"dims": 768,
|
|
833
|
-
"dimensions": 768
|
|
830
|
+
"provider": "none"
|
|
834
831
|
},
|
|
835
832
|
"compositor": {
|
|
836
833
|
"turnBudget": {
|
package/README.md
CHANGED
|
@@ -332,7 +332,7 @@ Diagnostics expose reranker status, candidate count, and provider, so operators
|
|
|
332
332
|
| Knowledge / wiki | Domain knowledge and synthesized topic pages with full-text search |
|
|
333
333
|
| Episodes | Significant events, decisions, discoveries, participants, and source links |
|
|
334
334
|
| Topics | Cross-session thread tracking and topic lifecycle state |
|
|
335
|
-
| Preferences |
|
|
335
|
+
| Preferences | Operator and agent behavior patterns |
|
|
336
336
|
| Documents | Chunked workspace/governance docs, doc sources, and trigger retrieval metadata |
|
|
337
337
|
| Knowledge graph | Links between facts, knowledge, topics, episodes, agents, and preferences |
|
|
338
338
|
| Fleet registry | Agents, orgs, tiers, capabilities, and fleet topology |
|
|
@@ -477,7 +477,7 @@ If you prefer, hand the install to your OpenClaw agent:
|
|
|
477
477
|
|
|
478
478
|
> "Install hypermem following INSTALL.md. I'm running a [solo / multi-agent] setup."
|
|
479
479
|
|
|
480
|
-
###
|
|
480
|
+
### Operator guides
|
|
481
481
|
|
|
482
482
|
- **[docs/MEMORY_MD_AUTHORING.md](./docs/MEMORY_MD_AUTHORING.md)**, how to keep `MEMORY.md` compact, durable, and reviewable
|
|
483
483
|
- **[docs/TUNING.md](./docs/TUNING.md)**, context assembly and output shaping profiles
|
|
@@ -546,7 +546,7 @@ README keeps the interface surface short. Use the detailed docs for exact exampl
|
|
|
546
546
|
|
|
547
547
|
**Runtime API:** import `HyperMem` from `@psiclawops/hypermem` for direct Node.js use, custom tests, and non-OpenClaw integrations. See **[INSTALL.md § Non-OpenClaw usage](./INSTALL.md#non-openclaw-usage)** and package TypeScript declarations for the current interface.
|
|
548
548
|
|
|
549
|
-
**
|
|
549
|
+
**Operator CLIs:**
|
|
550
550
|
|
|
551
551
|
```bash
|
|
552
552
|
hypermem-status --health
|
|
@@ -613,7 +613,7 @@ The migration guide includes worked examples showing how to bring data from Open
|
|
|
613
613
|
|
|
614
614
|
All examples default to dry-run. Nothing is written until you add `--apply`.
|
|
615
615
|
|
|
616
|
-
|
|
616
|
+
Operator guide: **[docs/MIGRATION_GUIDE.md](./docs/MIGRATION_GUIDE.md)**
|
|
617
617
|
|
|
618
618
|
|
|
619
619
|
---
|
|
@@ -16,7 +16,7 @@ function argValue(name, fallback = null) {
|
|
|
16
16
|
return process.argv.find((a, i) => process.argv[i - 1] === name) ?? fallback;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const DATA_DIR = argValue('--data-dir', process.env.HYPERMEM_DATA_DIR ?? path.join(process.env.HOME ||
|
|
19
|
+
const DATA_DIR = argValue('--data-dir', process.env.HYPERMEM_DATA_DIR ?? path.join(process.env.HOME || '/home/user', '.openclaw', 'hypermem'));
|
|
20
20
|
const ITERATIONS = parseInt(argValue('--iterations', '100'), 10);
|
|
21
21
|
const WARMUP = parseInt(argValue('--warmup', '3'), 10);
|
|
22
22
|
const TARGET_AGENT = argValue('--agent', null);
|
|
@@ -37,27 +37,27 @@ import { isSafeForSharedVisibility } from './secret-scanner.js';
|
|
|
37
37
|
// returns results. New agents default to 'general'.
|
|
38
38
|
//
|
|
39
39
|
// ── EXAMPLE DATA ──────────────────────────────────────────────────
|
|
40
|
-
// The agent names below (
|
|
40
|
+
// The agent names below (agent1, director1, etc.) are PLACEHOLDERS.
|
|
41
41
|
// Replace them with your own agent IDs and domain labels to match
|
|
42
42
|
// your fleet. Single-agent installs don't need to edit this:
|
|
43
43
|
// unknown agents fall through to 'general' automatically.
|
|
44
44
|
// See INSTALL.md § "Configure your fleet" for details.
|
|
45
45
|
// ─────────────────────────────────────────────────────────────────
|
|
46
46
|
const AGENT_DOMAIN_MAP = {
|
|
47
|
-
|
|
47
|
+
agent1: 'infrastructure',
|
|
48
48
|
director2: 'infrastructure',
|
|
49
49
|
director1: 'infrastructure',
|
|
50
50
|
director3: 'infrastructure',
|
|
51
|
-
|
|
51
|
+
agent2: 'product',
|
|
52
52
|
director4: 'product',
|
|
53
53
|
director5: 'product',
|
|
54
54
|
director6: 'product',
|
|
55
|
-
|
|
55
|
+
agent3: 'security',
|
|
56
56
|
director7: 'security',
|
|
57
57
|
director8: 'security',
|
|
58
58
|
agent4: 'ux',
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
agent6: 'governance',
|
|
60
|
+
agent5: 'strategy',
|
|
61
61
|
specialist1: 'development',
|
|
62
62
|
specialist2: 'communications',
|
|
63
63
|
main: 'general',
|
|
@@ -94,7 +94,7 @@ function extractFactCandidates(content) {
|
|
|
94
94
|
// Preference patterns — medium confidence (0.60)
|
|
95
95
|
const preferencePatterns = [
|
|
96
96
|
/(?:prefer|always use|never use|don't use|avoid) (.{10,150})/gi,
|
|
97
|
-
/(?:operator) (?:wants|prefers|likes|hates|dislikes) (.{10,150})/gi,
|
|
97
|
+
/(?:operator|operator) (?:wants|prefers|likes|hates|dislikes) (.{10,150})/gi,
|
|
98
98
|
];
|
|
99
99
|
// Operational patterns: deployments, incidents, fixes — high confidence (0.70)
|
|
100
100
|
const operationalPatterns = [
|
|
@@ -148,7 +148,7 @@ const OPERATIONAL_BOILERPLATE = [
|
|
|
148
148
|
/still\s*waiting/i,
|
|
149
149
|
/will\s*pick\s*(it\s*)?up\s*(on\s*(next|the))?/i,
|
|
150
150
|
/message\s*is\s*in\s*(his|her|their|the)\s*queue/i,
|
|
151
|
-
/sent\s+to\s+(
|
|
151
|
+
/sent\s+to\s+(agent6|agent2|agent4|agent3|agent5|agent1)/i,
|
|
152
152
|
/dispatched\s+(it\s+)?to/i,
|
|
153
153
|
/timed\s*out\s*after/i,
|
|
154
154
|
/\bNO_REPLY\b/,
|
|
@@ -393,7 +393,7 @@ function detectTopic(content) {
|
|
|
393
393
|
if (!content || content.length < 50)
|
|
394
394
|
return null;
|
|
395
395
|
// Product/project name detection
|
|
396
|
-
const productMatch = content.match(/\b(HyperMem|ClawText|
|
|
396
|
+
const productMatch = content.match(/\b(HyperMem|ClawText|ClawDash|ClawCanvas|ClawCouncil|ClawTomation|OpenClaw|ClawDispatch)\b/i);
|
|
397
397
|
if (productMatch)
|
|
398
398
|
return productMatch[1];
|
|
399
399
|
// Infrastructure topic detection
|
package/dist/cross-agent.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export interface OrgRegistry {
|
|
|
27
27
|
* Default fleet org structure.
|
|
28
28
|
*
|
|
29
29
|
* ── EXAMPLE DATA ──────────────────────────────────────────────────────────
|
|
30
|
-
* The agent names below (
|
|
30
|
+
* The agent names below (agent1, agent2, director1, etc.) are PLACEHOLDERS.
|
|
31
31
|
* Replace them with your own agent IDs to match your fleet configuration.
|
|
32
32
|
*
|
|
33
33
|
* Single-agent installs: you don't need to edit this. Your agent ID is
|
package/dist/cross-agent.js
CHANGED
|
@@ -21,7 +21,7 @@ import { FleetStore } from './fleet-store.js';
|
|
|
21
21
|
* Default fleet org structure.
|
|
22
22
|
*
|
|
23
23
|
* ── EXAMPLE DATA ──────────────────────────────────────────────────────────
|
|
24
|
-
* The agent names below (
|
|
24
|
+
* The agent names below (agent1, agent2, director1, etc.) are PLACEHOLDERS.
|
|
25
25
|
* Replace them with your own agent IDs to match your fleet configuration.
|
|
26
26
|
*
|
|
27
27
|
* Single-agent installs: you don't need to edit this. Your agent ID is
|
|
@@ -34,27 +34,27 @@ import { FleetStore } from './fleet-store.js';
|
|
|
34
34
|
*/
|
|
35
35
|
export function defaultOrgRegistry() {
|
|
36
36
|
const agents = {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
agent1: { agentId: 'agent1', tier: 'council' },
|
|
38
|
+
agent2: { agentId: 'agent2', tier: 'council' },
|
|
39
39
|
agent4: { agentId: 'agent4', tier: 'council' },
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
director1: { agentId: 'director1', tier: 'director', org: '
|
|
44
|
-
director2: { agentId: 'director2', tier: 'director', org: '
|
|
45
|
-
director3: { agentId: 'director3', tier: 'director', org: '
|
|
46
|
-
director4: { agentId: 'director4', tier: 'director', org: '
|
|
47
|
-
director5: { agentId: 'director5', tier: 'director', org: '
|
|
48
|
-
director6: { agentId: 'director6', tier: 'director', org: '
|
|
49
|
-
director7: { agentId: 'director7', tier: 'director', org: '
|
|
50
|
-
director8: { agentId: 'director8', tier: 'director', org: '
|
|
40
|
+
agent3: { agentId: 'agent3', tier: 'council' },
|
|
41
|
+
agent6: { agentId: 'agent6', tier: 'council' },
|
|
42
|
+
agent5: { agentId: 'agent5', tier: 'council' },
|
|
43
|
+
director1: { agentId: 'director1', tier: 'director', org: 'agent1-org', councilLead: 'agent1' },
|
|
44
|
+
director2: { agentId: 'director2', tier: 'director', org: 'agent1-org', councilLead: 'agent1' },
|
|
45
|
+
director3: { agentId: 'director3', tier: 'director', org: 'agent1-org', councilLead: 'agent1' },
|
|
46
|
+
director4: { agentId: 'director4', tier: 'director', org: 'agent2-org', councilLead: 'agent2' },
|
|
47
|
+
director5: { agentId: 'director5', tier: 'director', org: 'agent2-org', councilLead: 'agent2' },
|
|
48
|
+
director6: { agentId: 'director6', tier: 'director', org: 'agent2-org', councilLead: 'agent2' },
|
|
49
|
+
director7: { agentId: 'director7', tier: 'director', org: 'agent3-org', councilLead: 'agent3' },
|
|
50
|
+
director8: { agentId: 'director8', tier: 'director', org: 'agent3-org', councilLead: 'agent3' },
|
|
51
51
|
specialist1: { agentId: 'specialist1', tier: 'specialist' },
|
|
52
52
|
specialist2: { agentId: 'specialist2', tier: 'specialist' },
|
|
53
53
|
};
|
|
54
54
|
const orgs = {
|
|
55
|
-
'
|
|
56
|
-
'
|
|
57
|
-
'
|
|
55
|
+
'agent1-org': ['agent1', 'director1', 'director2', 'director3'],
|
|
56
|
+
'agent2-org': ['agent2', 'director4', 'director5', 'director6'],
|
|
57
|
+
'agent3-org': ['agent3', 'director7', 'director8'],
|
|
58
58
|
};
|
|
59
59
|
return { orgs, agents };
|
|
60
60
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -135,8 +135,8 @@ export interface StartupFleetSeedResult {
|
|
|
135
135
|
*
|
|
136
136
|
* Usage:
|
|
137
137
|
* const hm = await hypermem.create({ dataDir: '~/.openclaw/hypermem' });
|
|
138
|
-
* await hm.record('
|
|
139
|
-
* const result = await hm.compose({ agentId: '
|
|
138
|
+
* await hm.record('agent1', 'agent:agent1:webchat:main', userMsg);
|
|
139
|
+
* const result = await hm.compose({ agentId: 'agent1', sessionKey: '...', ... });
|
|
140
140
|
*/
|
|
141
141
|
export declare class HyperMem {
|
|
142
142
|
readonly dbManager: DatabaseManager;
|
|
@@ -202,7 +202,7 @@ export declare class HyperMem {
|
|
|
202
202
|
/**
|
|
203
203
|
* List archived or forked contexts for an agent.
|
|
204
204
|
*
|
|
205
|
-
*
|
|
205
|
+
* Operator-safe enumeration path. This is the approved archived-context
|
|
206
206
|
* listing surface. Active composition remains separate.
|
|
207
207
|
*/
|
|
208
208
|
listArchivedContexts(agentId: string, opts?: {
|
package/dist/index.js
CHANGED
|
@@ -103,7 +103,7 @@ const DEFAULT_CONFIG = {
|
|
|
103
103
|
cache: {
|
|
104
104
|
keyPrefix: 'hm:',
|
|
105
105
|
sessionTTL: 14400, // 4 hours — system/identity/meta slots
|
|
106
|
-
historyTTL: 604800, // 7 days — extended for
|
|
106
|
+
historyTTL: 604800, // 7 days — extended for ClawCanvas display
|
|
107
107
|
},
|
|
108
108
|
compositor: {
|
|
109
109
|
// TUNE-010 (2026-04-02): Raised from 65000 → 90000.
|
|
@@ -337,8 +337,8 @@ function discoverStartupFleetCandidates(dbManager, opts = {}) {
|
|
|
337
337
|
*
|
|
338
338
|
* Usage:
|
|
339
339
|
* const hm = await hypermem.create({ dataDir: '~/.openclaw/hypermem' });
|
|
340
|
-
* await hm.record('
|
|
341
|
-
* const result = await hm.compose({ agentId: '
|
|
340
|
+
* await hm.record('agent1', 'agent:agent1:webchat:main', userMsg);
|
|
341
|
+
* const result = await hm.compose({ agentId: 'agent1', sessionKey: '...', ... });
|
|
342
342
|
*/
|
|
343
343
|
export class HyperMem {
|
|
344
344
|
dbManager;
|
|
@@ -604,7 +604,7 @@ export class HyperMem {
|
|
|
604
604
|
/**
|
|
605
605
|
* List archived or forked contexts for an agent.
|
|
606
606
|
*
|
|
607
|
-
*
|
|
607
|
+
* Operator-safe enumeration path. This is the approved archived-context
|
|
608
608
|
* listing surface. Active composition remains separate.
|
|
609
609
|
*/
|
|
610
610
|
listArchivedContexts(agentId, opts) {
|
package/dist/seed.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
8
|
* const seeder = new WorkspaceSeeder(hypermem);
|
|
9
|
-
* const result = await seeder.seedWorkspace('/path/to/workspace', { agentId: '
|
|
9
|
+
* const result = await seeder.seedWorkspace('/path/to/workspace', { agentId: 'agent1' });
|
|
10
10
|
*
|
|
11
11
|
* Idempotent: skips files whose source hash hasn't changed since last index.
|
|
12
12
|
* Atomic: each file's chunks are swapped in a single transaction.
|
package/dist/seed.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
8
|
* const seeder = new WorkspaceSeeder(hypermem);
|
|
9
|
-
* const result = await seeder.seedWorkspace('/path/to/workspace', { agentId: '
|
|
9
|
+
* const result = await seeder.seedWorkspace('/path/to/workspace', { agentId: 'agent1' });
|
|
10
10
|
*
|
|
11
11
|
* Idempotent: skips files whose source hash hasn't changed since last index.
|
|
12
12
|
* Atomic: each file's chunks are swapped in a single transaction.
|
|
@@ -33,8 +33,8 @@ export interface FlushSessionResult {
|
|
|
33
33
|
* from those stores naturally.
|
|
34
34
|
*
|
|
35
35
|
* @param cache Connected CacheLayer instance
|
|
36
|
-
* @param agentId Agent identifier (e.g. "
|
|
37
|
-
* @param sessionKey Full session key (e.g. "agent:
|
|
36
|
+
* @param agentId Agent identifier (e.g. "agent1")
|
|
37
|
+
* @param sessionKey Full session key (e.g. "agent:agent1:webchat:scratchpad")
|
|
38
38
|
* @param opts Optional flags
|
|
39
39
|
*/
|
|
40
40
|
export declare function flushSession(cache: CacheLayer, agentId: string, sessionKey: string, opts?: FlushSessionOptions): Promise<FlushSessionResult>;
|
package/dist/session-flusher.js
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* from those stores naturally.
|
|
19
19
|
*
|
|
20
20
|
* @param cache Connected CacheLayer instance
|
|
21
|
-
* @param agentId Agent identifier (e.g. "
|
|
22
|
-
* @param sessionKey Full session key (e.g. "agent:
|
|
21
|
+
* @param agentId Agent identifier (e.g. "agent1")
|
|
22
|
+
* @param sessionKey Full session key (e.g. "agent:agent1:webchat:scratchpad")
|
|
23
23
|
* @param opts Optional flags
|
|
24
24
|
*/
|
|
25
25
|
export async function flushSession(cache, agentId, sessionKey, opts = {}) {
|
package/dist/spawn-context.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
8
|
* const ctx = await buildSpawnContext(messageStore, docChunkStore, agentId, {
|
|
9
|
-
* parentSessionKey: 'agent:
|
|
9
|
+
* parentSessionKey: 'agent:agent1:webchat:main',
|
|
10
10
|
* workingSnapshot: 10,
|
|
11
11
|
* documents: ['/path/to/spec.md'],
|
|
12
12
|
* });
|
package/dist/spawn-context.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Usage:
|
|
8
8
|
* const ctx = await buildSpawnContext(messageStore, docChunkStore, agentId, {
|
|
9
|
-
* parentSessionKey: 'agent:
|
|
9
|
+
* parentSessionKey: 'agent:agent1:webchat:main',
|
|
10
10
|
* workingSnapshot: 10,
|
|
11
11
|
* documents: ['/path/to/spec.md'],
|
|
12
12
|
* });
|
package/dist/topic-store.js
CHANGED
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
const KNOWN_NAMES = {
|
|
13
13
|
hypermem: 'HyperMem',
|
|
14
14
|
hyperbuilder: 'HyperBuilder',
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
clawcanvas: 'ClawCanvas',
|
|
16
|
+
clawdash: 'ClawDash',
|
|
17
|
+
clawdispatch: 'ClawDispatch',
|
|
18
18
|
clawtext: 'ClawText',
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
clawtomation: 'ClawTomation',
|
|
20
|
+
clawcouncil: 'ClawCouncil',
|
|
21
21
|
openclaw: 'OpenClaw',
|
|
22
22
|
clawhub: 'ClawHub',
|
|
23
23
|
};
|
|
@@ -35,7 +35,7 @@ function keystoneScore(msg) {
|
|
|
35
35
|
const backtickMatches = text.match(/`[^`]+`/g) || [];
|
|
36
36
|
score += backtickMatches.length * 0.2;
|
|
37
37
|
// Agent mentions (known patterns)
|
|
38
|
-
const agentMentions = text.match(/\b(
|
|
38
|
+
const agentMentions = text.match(/\b(agent1|agent2|agent4|agent3|agent5|agent6|director1|director2|director7|specialist2|specialist1)\b/gi) || [];
|
|
39
39
|
score += agentMentions.length * 0.25;
|
|
40
40
|
// Quoted content
|
|
41
41
|
const quotedMatches = text.match(/"[^"]{10,}"/g) || [];
|
|
@@ -39,7 +39,7 @@ export interface CollectionTrigger {
|
|
|
39
39
|
export declare const TRIGGER_REGISTRY_VERSION = "1.0.0";
|
|
40
40
|
/**
|
|
41
41
|
* Default trigger registry for standard ACA collections.
|
|
42
|
-
* Covers the core ACA offload use case from
|
|
42
|
+
* Covers the core ACA offload use case from agent6's spec.
|
|
43
43
|
*/
|
|
44
44
|
export declare const TRIGGER_REGISTRY: CollectionTrigger[];
|
|
45
45
|
/** Backward-compat alias — same reference as TRIGGER_REGISTRY */
|
package/dist/trigger-registry.js
CHANGED
|
@@ -13,7 +13,7 @@ import { createHash } from 'node:crypto';
|
|
|
13
13
|
export const TRIGGER_REGISTRY_VERSION = '1.0.0';
|
|
14
14
|
/**
|
|
15
15
|
* Default trigger registry for standard ACA collections.
|
|
16
|
-
* Covers the core ACA offload use case from
|
|
16
|
+
* Covers the core ACA offload use case from agent6's spec.
|
|
17
17
|
*/
|
|
18
18
|
export const TRIGGER_REGISTRY = [
|
|
19
19
|
{
|
|
@@ -69,7 +69,7 @@ export const TRIGGER_REGISTRY = [
|
|
|
69
69
|
],
|
|
70
70
|
maxTokens: 800,
|
|
71
71
|
maxChunks: 2,
|
|
72
|
-
owner: '
|
|
72
|
+
owner: 'agent1',
|
|
73
73
|
category: 'operations',
|
|
74
74
|
description: 'Agent operational procedures: boot sequence, heartbeat, work queue, session startup',
|
|
75
75
|
},
|
|
@@ -106,7 +106,7 @@ export const TRIGGER_REGISTRY = [
|
|
|
106
106
|
],
|
|
107
107
|
maxTokens: 1500,
|
|
108
108
|
maxChunks: 4,
|
|
109
|
-
owner: '
|
|
109
|
+
owner: 'agent1',
|
|
110
110
|
category: 'memory',
|
|
111
111
|
description: 'Decision history: past choices, previously agreed approaches, recalled context',
|
|
112
112
|
},
|
|
@@ -132,7 +132,7 @@ export const TRIGGER_REGISTRY = [
|
|
|
132
132
|
],
|
|
133
133
|
maxTokens: 1200,
|
|
134
134
|
maxChunks: 3,
|
|
135
|
-
owner: '
|
|
135
|
+
owner: 'agent1',
|
|
136
136
|
category: 'operations',
|
|
137
137
|
description: 'Agent tooling reference: CLI commands, config paths, deployment procedures, quick reference',
|
|
138
138
|
},
|
package/dist/types.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ export type FactScope = 'agent' | 'session' | 'user';
|
|
|
72
72
|
/**
|
|
73
73
|
* Memory visibility levels:
|
|
74
74
|
* - private: Only the owning agent can read. Identity, SOUL, personal reflections.
|
|
75
|
-
* - org: Agents in the same org (e.g.,
|
|
75
|
+
* - org: Agents in the same org (e.g., agent1's directors: Pylon, Vigil, Plane).
|
|
76
76
|
* - council: All council seats can read.
|
|
77
77
|
* - fleet: Any agent in the fleet can read.
|
|
78
78
|
*/
|
|
@@ -654,7 +654,7 @@ export interface ProviderMessage {
|
|
|
654
654
|
* to identify high-signal unprocessed messages.
|
|
655
655
|
*
|
|
656
656
|
* Stored in Redis (hm:{a}:s:{s}:cursor) with dual-write to SQLite for
|
|
657
|
-
* durability across Redis eviction (
|
|
657
|
+
* durability across Redis eviction (agent2 Gate 2).
|
|
658
658
|
*/
|
|
659
659
|
export interface SessionCursor {
|
|
660
660
|
/** StoredMessage.id of the newest message included in the last window */
|
package/docs/DIAGNOSTICS.md
CHANGED
|
@@ -7,18 +7,33 @@ HyperMem diagnostics are split into operator CLIs, validation scripts, and runti
|
|
|
7
7
|
| Surface | Command | Proves |
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| Health summary | `hypermem-status --health` | data dir, SQLite health, basic runtime state |
|
|
10
|
-
|
|
|
10
|
+
| Operator dashboard | `hypermem-status --master` | concise fleet-facing status summary |
|
|
11
11
|
| JSON status | `hypermem-status --json` | machine-readable database and runtime state |
|
|
12
12
|
| Model audit | `hypermem-model-audit --strict` | active models have known context-window behavior or overrides |
|
|
13
13
|
| Memory benchmark | `hypermem-bench --iterations 1000 --warmup 50 --agent <agent>` | local dataset access latency with p50/p95/p99 timings |
|
|
14
14
|
| Compose report | `node scripts/compose-report.mjs` | direct compositor slot selection, budget decisions, diagnostics fields |
|
|
15
15
|
| Trim report | `node scripts/trim-report.mjs` | trim events, cache invalidation, pressure behavior |
|
|
16
16
|
| Version parity | `npm run validate:version-parity` | package versions and plugin dependencies are release-aligned |
|
|
17
|
+
| SDK import policy | `npm run validate:sdk-imports` | plugin packages use public OpenClaw Plugin SDK entrypoints and pinned build metadata |
|
|
18
|
+
| Latest SDK canary | `npm run validate:sdk-latest-canary` | both plugin packages still typecheck and build against the latest published OpenClaw SDK |
|
|
19
|
+
| Plugin compatibility gates | `npm run validate:plugin-checkers` | Plugin Inspector static/runtime reports, isolated dependency-install cold import proof, production/dev dependency audit, and zero unhandled Plugin Inspector issue debt |
|
|
20
|
+
| OpenClaw plugin runtime gate | `npm run validate:plugins:runtime` | packed artifact installs into OpenClaw's plugin runtime, registry refreshes, plugin doctor passes for HyperMem-owned plugins, and runtime inspection is clean |
|
|
17
21
|
| Release path | `npm run validate:release-path` | build plus plugin pipeline gateway path |
|
|
18
22
|
| Docs/config validation | `npm run validate:docs && npm run validate:config` | documented commands and config surfaces match code |
|
|
19
23
|
| History query validation | `npm run validate:history-query` | `MessageStore.queryHistory()`, `history_query` plugin tool, metadata-only telemetry, and health JSON surface are wired |
|
|
20
24
|
| Fresh-install smoke gate | `npm run release:install-smoke` | packed npm artifact installs without source fallback, no-Ollama failure is clear, skip-mode stages, existing config is preserved, and failure artifacts are captured |
|
|
21
25
|
|
|
26
|
+
## Plugin compatibility gates
|
|
27
|
+
|
|
28
|
+
Use the smallest gate that matches the decision.
|
|
29
|
+
|
|
30
|
+
- Sprint completion / PR readiness: `npm run validate:plugin-checkers`. This runs Plugin Inspector static/runtime reports, proves dependency-install cold import in isolated npm workspaces, audits production and plugin dev dependencies, and fails if any Plugin Inspector issue lacks proof-backed coverage.
|
|
31
|
+
- Publish readiness on an OpenClaw host: `npm run validate:plugins:runtime`. This installs the packed 0.9.x-shaped artifact, refreshes the OpenClaw plugin registry, runs `openclaw plugins doctor`, and inspects both HyperMem plugins with `--runtime`.
|
|
32
|
+
|
|
33
|
+
`openclaw plugins doctor` is not a replacement for Plugin Inspector. Doctor proves the installed artifact satisfies the current host loader. Plugin Inspector proves the package remains compatible as a plugin project and produces durable CI artifacts. The full release gate runs both because either one alone can lie. That's how you buy fewer 3am pages.
|
|
34
|
+
|
|
35
|
+
As of 0.9.7, Plugin Inspector's raw reports can still surface `package-dependency-install-required` as an inspector-owned P2 because Plugin Inspector 0.3.6 does not reconcile dependency-install proof artifacts. HyperMem does not ignore that row: `validate:plugin-checkers` runs `validate:plugin-isolated-cold-import`, writes proof under `.artifacts/plugin-isolated-cold-import/`, and `validate:plugin-inspector:debt` fails on any Plugin Inspector issue without proof-backed coverage. P0/P1/live issues, deprecations, hard breakages, production or plugin dev audit findings, unproved inspector gaps, and HyperMem-owned `openclaw plugins doctor` diagnostics block publish.
|
|
36
|
+
|
|
22
37
|
## `hypermem-status`
|
|
23
38
|
|
|
24
39
|
Primary uses:
|
|
@@ -143,6 +143,9 @@ Before publishing a release, run:
|
|
|
143
143
|
|
|
144
144
|
```bash
|
|
145
145
|
npm run validate:version-parity
|
|
146
|
+
npm run validate:sdk-imports
|
|
147
|
+
npm run validate:sdk-latest-canary
|
|
148
|
+
npm run validate:plugin-checkers
|
|
146
149
|
npm run validate:docs
|
|
147
150
|
npm run validate:config
|
|
148
151
|
npm run validate:release-path
|
|
@@ -154,6 +157,10 @@ npm pack ./plugin --dry-run
|
|
|
154
157
|
npm pack ./memory-plugin --dry-run
|
|
155
158
|
```
|
|
156
159
|
|
|
160
|
+
The SDK gates are split deliberately: `validate:sdk-imports` enforces reproducible pinned OpenClaw Plugin SDK metadata, while `validate:sdk-latest-canary` rebuilds both plugin packages against the latest published OpenClaw SDK in a temp workspace so a stale pin cannot hide a future import break.
|
|
161
|
+
|
|
162
|
+
The plugin checker gate is deliberately composite: it runs Plugin Inspector static/runtime reports, isolated dependency-install cold import proof, production/dev dependency audit, Plugin Inspector issue-debt validation for the plugin packages. Raw Plugin Inspector P2 rows are not ignored: they must either disappear or have a proof artifact consumed by `validate:plugin-inspector:debt`.
|
|
163
|
+
|
|
157
164
|
Runtime validation must install the packed artifact, not the repo working tree. The production-shaped local install path is:
|
|
158
165
|
|
|
159
166
|
```bash
|
|
@@ -163,6 +170,14 @@ openclaw plugins list
|
|
|
163
170
|
node ~/.openclaw/plugins/hypermem/bin/hypermem-status.mjs --master
|
|
164
171
|
```
|
|
165
172
|
|
|
173
|
+
The final OpenClaw host-runtime plugin checker is:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npm run validate:plugins:runtime
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
That gate packs and installs the release artifact into OpenClaw's managed plugin directory, refreshes the plugin registry, runs `openclaw plugins doctor`, and runs runtime inspection for `hypercompositor` and `hypermem`. Treat HyperMem-owned doctor diagnostics as release-blocking. Unrelated local plugin diagnostics are reported but ignored by the HyperMem gate.
|
|
180
|
+
|
|
166
181
|
For isolated validation, test the packed artifact from a temp directory:
|
|
167
182
|
|
|
168
183
|
```bash
|
package/docs/MIGRATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Start here.
|
|
4
4
|
|
|
5
|
-
- **
|
|
5
|
+
- **Operator guide:** [`MIGRATION_GUIDE.md`](./MIGRATION_GUIDE.md)
|
|
6
6
|
- **Current repo state:** source-specific migration examples live in `MIGRATION_GUIDE.md`. There is no bundled unified migration dispatcher in this repo yet.
|
|
7
7
|
|
|
8
8
|
All migration examples default to **dry-run** where shown. Add `--apply` only when you are ready to write data.
|
package/install.sh
CHANGED
|
File without changes
|
|
@@ -18,7 +18,7 @@ declare const _default: {
|
|
|
18
18
|
id: string;
|
|
19
19
|
name: string;
|
|
20
20
|
description: string;
|
|
21
|
-
configSchema: import("openclaw/plugin-sdk").OpenClawPluginConfigSchema;
|
|
22
|
-
register: NonNullable<import("openclaw/plugin-sdk/
|
|
23
|
-
} & Pick<import("openclaw/plugin-sdk/
|
|
21
|
+
configSchema: import("openclaw/plugin-sdk/core").OpenClawPluginConfigSchema;
|
|
22
|
+
register: NonNullable<import("openclaw/plugin-sdk/core").OpenClawPluginDefinition["register"]>;
|
|
23
|
+
} & Pick<import("openclaw/plugin-sdk/core").OpenClawPluginDefinition, "kind" | "reload" | "nodeHostCommands" | "securityAuditCollectors">;
|
|
24
24
|
export default _default;
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*
|
|
15
15
|
* Both plugins share the same HyperMem singleton (loaded from repo dist).
|
|
16
16
|
*/
|
|
17
|
-
import { definePluginEntry, emptyPluginConfigSchema } from 'openclaw/plugin-sdk/
|
|
17
|
+
import { definePluginEntry, emptyPluginConfigSchema } from 'openclaw/plugin-sdk/core';
|
|
18
18
|
import { matchTriggers, TRIGGER_REGISTRY } from '@psiclawops/hypermem';
|
|
19
19
|
import path from 'path';
|
|
20
20
|
import fs from 'fs/promises';
|