hippo-memory 1.14.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +862 -861
- package/dist/audit.d.ts +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1594 -229
- package/dist/cli.js.map +1 -1
- package/dist/customer-notes.d.ts +95 -0
- package/dist/customer-notes.d.ts.map +1 -0
- package/dist/customer-notes.js +296 -0
- package/dist/customer-notes.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +1286 -472
- package/dist/db.js.map +1 -1
- package/dist/decisions.d.ts +91 -0
- package/dist/decisions.d.ts.map +1 -0
- package/dist/decisions.js +278 -0
- package/dist/decisions.js.map +1 -0
- package/dist/graph-extract.d.ts +39 -0
- package/dist/graph-extract.d.ts.map +1 -0
- package/dist/graph-extract.js +141 -0
- package/dist/graph-extract.js.map +1 -0
- package/dist/graph-recall.d.ts +41 -0
- package/dist/graph-recall.d.ts.map +1 -0
- package/dist/graph-recall.js +246 -0
- package/dist/graph-recall.js.map +1 -0
- package/dist/graph.d.ts +137 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +433 -0
- package/dist/graph.js.map +1 -0
- package/dist/incidents.d.ts +100 -0
- package/dist/incidents.d.ts.map +1 -0
- package/dist/incidents.js +322 -0
- package/dist/incidents.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +6 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +6 -0
- package/dist/memory.js.map +1 -1
- package/dist/policies.d.ts +149 -0
- package/dist/policies.d.ts.map +1 -0
- package/dist/policies.js +380 -0
- package/dist/policies.js.map +1 -0
- package/dist/processes.d.ts +104 -0
- package/dist/processes.d.ts.map +1 -0
- package/dist/processes.js +330 -0
- package/dist/processes.js.map +1 -0
- package/dist/project-briefs.d.ts +126 -0
- package/dist/project-briefs.d.ts.map +1 -0
- package/dist/project-briefs.js +453 -0
- package/dist/project-briefs.js.map +1 -0
- package/dist/search.d.ts +7 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1181 -8
- package/dist/server.js.map +1 -1
- package/dist/skills.d.ts +98 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +339 -0
- package/dist/skills.js.map +1 -0
- package/dist/src/audit.js.map +1 -1
- package/dist/src/cli.js +1594 -229
- package/dist/src/cli.js.map +1 -1
- package/dist/src/customer-notes.js +296 -0
- package/dist/src/customer-notes.js.map +1 -0
- package/dist/src/db.js +1286 -472
- package/dist/src/db.js.map +1 -1
- package/dist/src/decisions.js +278 -0
- package/dist/src/decisions.js.map +1 -0
- package/dist/src/graph-extract.js +141 -0
- package/dist/src/graph-extract.js.map +1 -0
- package/dist/src/graph-recall.js +246 -0
- package/dist/src/graph-recall.js.map +1 -0
- package/dist/src/graph.js +433 -0
- package/dist/src/graph.js.map +1 -0
- package/dist/src/incidents.js +322 -0
- package/dist/src/incidents.js.map +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory.js +6 -0
- package/dist/src/memory.js.map +1 -1
- package/dist/src/policies.js +380 -0
- package/dist/src/policies.js.map +1 -0
- package/dist/src/processes.js +330 -0
- package/dist/src/processes.js.map +1 -0
- package/dist/src/project-briefs.js +453 -0
- package/dist/src/project-briefs.js.map +1 -0
- package/dist/src/search.js.map +1 -1
- package/dist/src/server.js +1181 -8
- package/dist/src/server.js.map +1 -1
- package/dist/src/skills.js +339 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +46 -46
- package/extensions/openclaw-plugin/package.json +14 -14
- package/openclaw.plugin.json +45 -45
- package/package.json +75 -75
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2 skill first-class object (docs/plans/2026-05-30-e2-skill-object.md).
|
|
3
|
+
*
|
|
4
|
+
* A `skill` is a reusable, agent-followable capability: an `instructions` body
|
|
5
|
+
* plus an optional `trigger` ("when to apply"), evolving via the supersede delta
|
|
6
|
+
* lifecycle. "Executable" is scoped to an agent-followable INSTRUCTION that, once
|
|
7
|
+
* exported into the agent's in-force rules (AGENTS.md / CLAUDE.md) via
|
|
8
|
+
* `exportSkills`, is executed by the agent reading it. Literal code/command
|
|
9
|
+
* execution is deferred (security; a future sandbox). The distinguishing
|
|
10
|
+
* capability is therefore the EXPORT renderer, not a runtime.
|
|
11
|
+
*
|
|
12
|
+
* Reuses the process/decision supersede machinery verbatim (superseded_by self-FK
|
|
13
|
+
* + CAS + INSERT-preflight + server-derived version + change_summary + supersede
|
|
14
|
+
* tenant-match trigger). It DROPS process's `steps` (a skill's content is a single
|
|
15
|
+
* `instructions` body) and ADDS `trigger` (stored in the `trigger_text` column -
|
|
16
|
+
* `trigger` is a SQLite reserved keyword).
|
|
17
|
+
*
|
|
18
|
+
* The `skills` table is the source of truth (survives memory decay); the memory
|
|
19
|
+
* mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
|
|
20
|
+
*
|
|
21
|
+
* Lifecycle: active -> superseded (a newer version replaces it) or active ->
|
|
22
|
+
* closed (retired). Export renders ACTIVE skills only.
|
|
23
|
+
*/
|
|
24
|
+
import { openHippoDb, closeHippoDb } from './db.js';
|
|
25
|
+
import { writeEntry, assertTenantId } from './store.js';
|
|
26
|
+
import { createMemory, Layer, SKILL_HALF_LIFE_DAYS } from './memory.js';
|
|
27
|
+
import { appendAuditEvent } from './audit.js';
|
|
28
|
+
export const VALID_SKILL_STATES = new Set([
|
|
29
|
+
'active',
|
|
30
|
+
'superseded',
|
|
31
|
+
'closed',
|
|
32
|
+
]);
|
|
33
|
+
/** Field caps (untrusted at the HTTP/SDK boundary). instructions is a body, so a
|
|
34
|
+
* larger cap than the 4096 short-field convention. */
|
|
35
|
+
export const MAX_SKILL_NAME_LEN = 256;
|
|
36
|
+
export const MAX_SKILL_INSTRUCTIONS_LEN = 8192;
|
|
37
|
+
export const MAX_SKILL_TRIGGER_LEN = 1024;
|
|
38
|
+
/** Aggregate bound on a single export render (plan-eng-critic: cap the unbounded
|
|
39
|
+
* export body). Realistic active-skill counts are tens; 1000 is a generous bound. */
|
|
40
|
+
export const MAX_EXPORT_SKILLS = 1000;
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Validation
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Validate + normalise skill fields. skill_name is trimmed and MUST be a single
|
|
46
|
+
* line (no newlines) so it cannot break the H2 header in the export render
|
|
47
|
+
* (plan-eng-critic). instructions are kept verbatim (operator content) but capped.
|
|
48
|
+
* Returns the normalised name + trigger (null when absent/empty).
|
|
49
|
+
*/
|
|
50
|
+
function validateSkillFields(skillName, instructions, trigger) {
|
|
51
|
+
const name = (skillName ?? '').trim();
|
|
52
|
+
if (name.length === 0)
|
|
53
|
+
throw new Error('saveSkill: skillName is required');
|
|
54
|
+
if (/[\r\n]/.test(name))
|
|
55
|
+
throw new Error('saveSkill: skillName must be a single line (no newlines)');
|
|
56
|
+
if (name.length > MAX_SKILL_NAME_LEN) {
|
|
57
|
+
throw new Error(`saveSkill: skillName exceeds the ${MAX_SKILL_NAME_LEN}-char cap`);
|
|
58
|
+
}
|
|
59
|
+
if (!instructions || instructions.trim().length === 0) {
|
|
60
|
+
throw new Error('saveSkill: instructions are required');
|
|
61
|
+
}
|
|
62
|
+
if (instructions.length > MAX_SKILL_INSTRUCTIONS_LEN) {
|
|
63
|
+
throw new Error(`saveSkill: instructions exceed the ${MAX_SKILL_INSTRUCTIONS_LEN}-char cap`);
|
|
64
|
+
}
|
|
65
|
+
let triggerVal = null;
|
|
66
|
+
if (trigger !== undefined && trigger !== null && trigger.trim().length > 0) {
|
|
67
|
+
if (trigger.length > MAX_SKILL_TRIGGER_LEN) {
|
|
68
|
+
throw new Error(`saveSkill: trigger exceeds the ${MAX_SKILL_TRIGGER_LEN}-char cap`);
|
|
69
|
+
}
|
|
70
|
+
// Single-line, like skill_name: a trigger is a short "when to apply" phrase,
|
|
71
|
+
// and a newline would let it forge a heading inside the export **When:** line
|
|
72
|
+
// (independent-review 2026-05-30). Reject rather than emit a multi-line trigger.
|
|
73
|
+
if (/[\r\n]/.test(trigger)) {
|
|
74
|
+
throw new Error('saveSkill: trigger must be a single line (no newlines)');
|
|
75
|
+
}
|
|
76
|
+
triggerVal = trigger;
|
|
77
|
+
}
|
|
78
|
+
return { name, trigger: triggerVal };
|
|
79
|
+
}
|
|
80
|
+
function rowToSkill(row) {
|
|
81
|
+
return {
|
|
82
|
+
id: row.id,
|
|
83
|
+
memoryId: row.memory_id,
|
|
84
|
+
tenantId: row.tenant_id,
|
|
85
|
+
skillName: row.skill_name,
|
|
86
|
+
instructions: row.instructions,
|
|
87
|
+
trigger: row.trigger_text,
|
|
88
|
+
version: row.version,
|
|
89
|
+
status: row.status,
|
|
90
|
+
supersededBy: row.superseded_by,
|
|
91
|
+
supersededAt: row.superseded_at,
|
|
92
|
+
changeSummary: row.change_summary,
|
|
93
|
+
closedAt: row.closed_at,
|
|
94
|
+
createdAt: row.created_at,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const SKILL_COLS = `
|
|
98
|
+
id, memory_id, tenant_id, skill_name, instructions, trigger_text, version, status,
|
|
99
|
+
superseded_by, superseded_at, change_summary, closed_at, created_at
|
|
100
|
+
`;
|
|
101
|
+
/** Recall-surface content for the memory mirror: name + optional trigger +
|
|
102
|
+
* instructions. Named (mirrors buildProcessContent) so the recall surface is
|
|
103
|
+
* deterministic + unit-testable. */
|
|
104
|
+
function buildSkillContent(skillName, instructions, trigger) {
|
|
105
|
+
let content = skillName;
|
|
106
|
+
if (trigger)
|
|
107
|
+
content += `\n\nWhen: ${trigger}`;
|
|
108
|
+
content += `\n\n${instructions}`;
|
|
109
|
+
return content;
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Public API
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
/**
|
|
115
|
+
* Create a skill (or a new version that supersedes an existing one). Writes the
|
|
116
|
+
* memory mirror + the skills row atomically inside writeEntry's SAVEPOINT. When
|
|
117
|
+
* supersedesSkillId is given, the referenced ACTIVE row is preflighted (status +
|
|
118
|
+
* version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same SAVEPOINT;
|
|
119
|
+
* the new version = predecessor.version + 1 (server-derived).
|
|
120
|
+
*/
|
|
121
|
+
export function saveSkill(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
122
|
+
assertTenantId('saveSkill', tenantId);
|
|
123
|
+
const { name, trigger } = validateSkillFields(opts.skillName, opts.instructions, opts.trigger);
|
|
124
|
+
const isSupersede = opts.supersedesSkillId !== undefined;
|
|
125
|
+
const changeSummary = isSupersede ? (opts.changeSummary ?? null) : null;
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
const content = buildSkillContent(name, opts.instructions, trigger);
|
|
128
|
+
const tags = ['skill', ...(opts.extraTags ?? [])];
|
|
129
|
+
const mem = createMemory(content, {
|
|
130
|
+
tags,
|
|
131
|
+
layer: Layer.Semantic,
|
|
132
|
+
confidence: 'verified',
|
|
133
|
+
source: 'skill',
|
|
134
|
+
tenantId,
|
|
135
|
+
});
|
|
136
|
+
mem.half_life_days = SKILL_HALF_LIFE_DAYS;
|
|
137
|
+
let savedRow;
|
|
138
|
+
writeEntry(hippoRoot, mem, {
|
|
139
|
+
actor,
|
|
140
|
+
afterWrite: (db, memoryId) => {
|
|
141
|
+
// Preflight the supersede target BEFORE inserting the new row (so the new
|
|
142
|
+
// autoincrement id can never be its own supersede target); read the
|
|
143
|
+
// predecessor version in the same SELECT for server-derived versioning.
|
|
144
|
+
// Mirrors saveProcess / savePolicy (codex P1 2026-05-28).
|
|
145
|
+
let version = 1;
|
|
146
|
+
if (opts.supersedesSkillId !== undefined) {
|
|
147
|
+
const pred = db.prepare(`SELECT status, version FROM skills WHERE id = ? AND tenant_id = ?`).get(opts.supersedesSkillId, tenantId);
|
|
148
|
+
if (!pred) {
|
|
149
|
+
throw new Error(`saveSkill: skill ${opts.supersedesSkillId} to supersede not found for tenant ${tenantId}`);
|
|
150
|
+
}
|
|
151
|
+
if (pred.status !== 'active') {
|
|
152
|
+
throw new Error(`saveSkill: skill ${opts.supersedesSkillId} is not active (status='${pred.status}'); only active skills can be superseded.`);
|
|
153
|
+
}
|
|
154
|
+
version = pred.version + 1;
|
|
155
|
+
}
|
|
156
|
+
const result = db.prepare(`
|
|
157
|
+
INSERT INTO skills(
|
|
158
|
+
memory_id, tenant_id, skill_name, instructions, trigger_text, version,
|
|
159
|
+
status, superseded_by, superseded_at, change_summary, closed_at, created_at
|
|
160
|
+
) VALUES (?, ?, ?, ?, ?, ?, 'active', NULL, NULL, ?, NULL, ?)
|
|
161
|
+
`).run(memoryId, tenantId, name, opts.instructions, trigger, version, changeSummary, now);
|
|
162
|
+
const skillId = Number(result.lastInsertRowid ?? 0);
|
|
163
|
+
if (opts.supersedesSkillId !== undefined) {
|
|
164
|
+
const sup = db.prepare(`
|
|
165
|
+
UPDATE skills
|
|
166
|
+
SET status = 'superseded', superseded_by = ?, superseded_at = ?
|
|
167
|
+
WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
|
|
168
|
+
`).run(skillId, now, opts.supersedesSkillId, tenantId, skillId);
|
|
169
|
+
if (sup.changes === 0) {
|
|
170
|
+
throw new Error(`saveSkill: skill ${opts.supersedesSkillId} could not be superseded (no longer active or self-reference).`);
|
|
171
|
+
}
|
|
172
|
+
appendAuditEvent(db, {
|
|
173
|
+
tenantId,
|
|
174
|
+
actor,
|
|
175
|
+
op: 'skill_supersede',
|
|
176
|
+
targetId: String(opts.supersedesSkillId),
|
|
177
|
+
metadata: {
|
|
178
|
+
skill_id: opts.supersedesSkillId,
|
|
179
|
+
superseded_by: skillId,
|
|
180
|
+
new_version: version,
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
const row = db.prepare(`SELECT ${SKILL_COLS} FROM skills WHERE id = ?`)
|
|
185
|
+
.get(skillId);
|
|
186
|
+
if (!row)
|
|
187
|
+
throw new Error('saveSkill: failed to reload saved skill row');
|
|
188
|
+
savedRow = row;
|
|
189
|
+
// GDPR-light metadata: ids + flags only, no skill text.
|
|
190
|
+
appendAuditEvent(db, {
|
|
191
|
+
tenantId,
|
|
192
|
+
actor,
|
|
193
|
+
op: 'skill_create',
|
|
194
|
+
targetId: String(skillId),
|
|
195
|
+
metadata: {
|
|
196
|
+
skill_id: skillId,
|
|
197
|
+
version,
|
|
198
|
+
has_trigger: trigger !== null,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
if (!savedRow) {
|
|
204
|
+
throw new Error('saveSkill: afterWrite did not populate the row');
|
|
205
|
+
}
|
|
206
|
+
return rowToSkill(savedRow);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Close (retire) an active skill. CAS guard WHERE status='active'; 0 changes
|
|
210
|
+
* distinguishes not-found from not-active. A superseded row is terminal.
|
|
211
|
+
*/
|
|
212
|
+
export function closeSkill(hippoRoot, tenantId, id, actor = 'cli') {
|
|
213
|
+
assertTenantId('closeSkill', tenantId);
|
|
214
|
+
const now = new Date().toISOString();
|
|
215
|
+
const db = openHippoDb(hippoRoot);
|
|
216
|
+
try {
|
|
217
|
+
db.exec('BEGIN IMMEDIATE');
|
|
218
|
+
try {
|
|
219
|
+
const updateResult = db.prepare(`
|
|
220
|
+
UPDATE skills
|
|
221
|
+
SET status = 'closed', closed_at = ?
|
|
222
|
+
WHERE id = ? AND tenant_id = ? AND status = 'active'
|
|
223
|
+
`).run(now, id, tenantId);
|
|
224
|
+
if (updateResult.changes === 0) {
|
|
225
|
+
const existing = db.prepare(`SELECT status FROM skills WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
226
|
+
if (!existing) {
|
|
227
|
+
throw new Error(`closeSkill: skill ${id} not found for tenant ${tenantId}`);
|
|
228
|
+
}
|
|
229
|
+
throw new Error(`closeSkill: skill ${id} is not active (status='${existing.status}'); only active skills can be closed.`);
|
|
230
|
+
}
|
|
231
|
+
const row = db.prepare(`SELECT ${SKILL_COLS} FROM skills WHERE id = ? AND tenant_id = ?`)
|
|
232
|
+
.get(id, tenantId);
|
|
233
|
+
if (!row)
|
|
234
|
+
throw new Error(`closeSkill: skill ${id} not found after UPDATE`);
|
|
235
|
+
appendAuditEvent(db, {
|
|
236
|
+
tenantId,
|
|
237
|
+
actor,
|
|
238
|
+
op: 'skill_close',
|
|
239
|
+
targetId: String(id),
|
|
240
|
+
metadata: { skill_id: id },
|
|
241
|
+
});
|
|
242
|
+
db.exec('COMMIT');
|
|
243
|
+
return rowToSkill(row);
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
try {
|
|
247
|
+
db.exec('ROLLBACK');
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Ignore rollback failures — the throw below is what matters.
|
|
251
|
+
}
|
|
252
|
+
throw e;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
closeHippoDb(db);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function loadSkillById(hippoRoot, tenantId, id) {
|
|
260
|
+
assertTenantId('loadSkillById', tenantId);
|
|
261
|
+
const db = openHippoDb(hippoRoot);
|
|
262
|
+
try {
|
|
263
|
+
const row = db.prepare(`SELECT ${SKILL_COLS} FROM skills WHERE id = ? AND tenant_id = ?`)
|
|
264
|
+
.get(id, tenantId);
|
|
265
|
+
return row ? rowToSkill(row) : null;
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
closeHippoDb(db);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export function loadSkills(hippoRoot, tenantId, opts = {}) {
|
|
272
|
+
assertTenantId('loadSkills', tenantId);
|
|
273
|
+
const limit = opts.limit ?? 100;
|
|
274
|
+
const db = openHippoDb(hippoRoot);
|
|
275
|
+
try {
|
|
276
|
+
let rows;
|
|
277
|
+
if (opts.status) {
|
|
278
|
+
if (!VALID_SKILL_STATES.has(opts.status)) {
|
|
279
|
+
throw new Error(`loadSkills: status must be one of ${Array.from(VALID_SKILL_STATES).join('|')}; got ${opts.status}`);
|
|
280
|
+
}
|
|
281
|
+
rows = db.prepare(`
|
|
282
|
+
SELECT ${SKILL_COLS} FROM skills
|
|
283
|
+
WHERE tenant_id = ? AND status = ?
|
|
284
|
+
ORDER BY created_at DESC, id DESC
|
|
285
|
+
LIMIT ?
|
|
286
|
+
`).all(tenantId, opts.status, limit);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
rows = db.prepare(`
|
|
290
|
+
SELECT ${SKILL_COLS} FROM skills
|
|
291
|
+
WHERE tenant_id = ?
|
|
292
|
+
ORDER BY created_at DESC, id DESC
|
|
293
|
+
LIMIT ?
|
|
294
|
+
`).all(tenantId, limit);
|
|
295
|
+
}
|
|
296
|
+
return rows.map(rowToSkill);
|
|
297
|
+
}
|
|
298
|
+
finally {
|
|
299
|
+
closeHippoDb(db);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
export function loadActiveSkills(hippoRoot, tenantId, opts = {}) {
|
|
303
|
+
return loadSkills(hippoRoot, tenantId, { status: 'active', limit: opts.limit });
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Render the tenant's ACTIVE skills into ONE AGENTS.md / CLAUDE.md-style markdown
|
|
307
|
+
* block (one H2 per skill, ordered by skill_name ASC for determinism), and RETURN
|
|
308
|
+
* the string. Does NOT write any file. Returns '' when there are no active skills.
|
|
309
|
+
*
|
|
310
|
+
* skill_name is single-line (validated on save) so it cannot break the H2 header;
|
|
311
|
+
* instructions are emitted verbatim (operator content). Bounded by MAX_EXPORT_SKILLS
|
|
312
|
+
* active rows; each field is capped on save, so the rendered string is bounded.
|
|
313
|
+
*/
|
|
314
|
+
export function exportSkills(hippoRoot, tenantId) {
|
|
315
|
+
assertTenantId('exportSkills', tenantId);
|
|
316
|
+
const db = openHippoDb(hippoRoot);
|
|
317
|
+
try {
|
|
318
|
+
const rows = db.prepare(`
|
|
319
|
+
SELECT ${SKILL_COLS} FROM skills
|
|
320
|
+
WHERE tenant_id = ? AND status = 'active'
|
|
321
|
+
ORDER BY skill_name ASC, id ASC
|
|
322
|
+
LIMIT ?
|
|
323
|
+
`).all(tenantId, MAX_EXPORT_SKILLS);
|
|
324
|
+
return rows
|
|
325
|
+
.map(rowToSkill)
|
|
326
|
+
.map((s) => {
|
|
327
|
+
let block = `## ${s.skillName}`;
|
|
328
|
+
if (s.trigger)
|
|
329
|
+
block += `\n\n**When:** ${s.trigger}`;
|
|
330
|
+
block += `\n\n${s.instructions}`;
|
|
331
|
+
return block;
|
|
332
|
+
})
|
|
333
|
+
.join('\n\n');
|
|
334
|
+
}
|
|
335
|
+
finally {
|
|
336
|
+
closeHippoDb(db);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,CAAC,MAAM,kBAAkB,GAA6B,IAAI,GAAG,CAAc;IAC/E,QAAQ;IACR,YAAY;IACZ,QAAQ;CACT,CAAC,CAAC;AAEH;uDACuD;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C;sFACsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAyCtC,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,YAAoB,EACpB,OAA2B;IAE3B,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IACrG,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,kBAAkB,WAAW,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,YAAY,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,sCAAsC,0BAA0B,WAAW,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,kCAAkC,qBAAqB,WAAW,CAAC,CAAC;QACtF,CAAC;QACD,6EAA6E;QAC7E,8EAA8E;QAC9E,iFAAiF;QACjF,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,UAAU,GAAG,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAsBD,SAAS,UAAU,CAAC,GAAa;IAC/B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,OAAO,EAAE,GAAG,CAAC,YAAY;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAqB;QACjC,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG;;;CAGlB,CAAC;AAEF;;qCAEqC;AACrC,SAAS,iBAAiB,CAAC,SAAiB,EAAE,YAAoB,EAAE,OAAsB;IACxF,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,OAAO;QAAE,OAAO,IAAI,aAAa,OAAO,EAAE,CAAC;IAC/C,OAAO,IAAI,OAAO,YAAY,EAAE,CAAC;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,QAAgB,EAChB,IAAmB,EACnB,QAAgB,KAAK;IAErB,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC;IACzD,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE;QAChC,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ;KACT,CAAC,CAAC;IACH,GAAG,CAAC,cAAc,GAAG,oBAAoB,CAAC;IAE1C,IAAI,QAA8B,CAAC;IAEnC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK;QACL,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE;YAC3B,0EAA0E;YAC1E,oEAAoE;YACpE,wEAAwE;YACxE,0DAA0D;YAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,mEAAmE,CACpE,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAEzB,CAAC;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,iBAAiB,sCAAsC,QAAQ,EAAE,CAC3F,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,iBAAiB,2BAA2B,IAAI,CAAC,MAAM,2CAA2C,CAC5H,CAAC;gBACJ,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;OAKzB,CAAC,CAAC,GAAG,CACJ,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,CAAC,YAAY,EACjB,OAAO,EACP,OAAO,EACP,aAAa,EACb,GAAG,CACJ,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;YAEpD,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;SAItB,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChE,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,iBAAiB,gEAAgE,CAC3G,CAAC;gBACJ,CAAC;gBACD,gBAAgB,CAAC,EAAE,EAAE;oBACnB,QAAQ;oBACR,KAAK;oBACL,EAAE,EAAE,iBAAiB;oBACrB,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;oBACxC,QAAQ,EAAE;wBACR,QAAQ,EAAE,IAAI,CAAC,iBAAiB;wBAChC,aAAa,EAAE,OAAO;wBACtB,WAAW,EAAE,OAAO;qBACrB;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,UAAU,2BAA2B,CAAC;iBACpE,GAAG,CAAC,OAAO,CAAyB,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACzE,QAAQ,GAAG,GAAG,CAAC;YAEf,wDAAwD;YACxD,gBAAgB,CAAC,EAAE,EAAE;gBACnB,QAAQ;gBACR,KAAK;gBACL,EAAE,EAAE,cAAc;gBAClB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;gBACzB,QAAQ,EAAE;oBACR,QAAQ,EAAE,OAAO;oBACjB,OAAO;oBACP,WAAW,EAAE,OAAO,KAAK,IAAI;iBAC9B;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,QAAgB,EAChB,EAAU,EACV,QAAgB,KAAK;IAErB,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;;OAI/B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE1B,IAAI,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,0DAA0D,CAC3D,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAmC,CAAC;gBACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,yBAAyB,QAAQ,EAAE,CAAC,CAAC;gBAC9E,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,qBAAqB,EAAE,2BAA2B,QAAQ,CAAC,MAAM,uCAAuC,CACzG,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,UAAU,6CAA6C,CAAC;iBACtF,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAyB,CAAC;YAC7C,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,yBAAyB,CAAC,CAAC;YAE5E,gBAAgB,CAAC,EAAE,EAAE;gBACnB,QAAQ;gBACR,KAAK;gBACL,EAAE,EAAE,aAAa;gBACjB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpB,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC3B,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,QAAgB,EAChB,EAAU;IAEV,cAAc,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,UAAU,6CAA6C,CAAC;aACtF,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAyB,CAAC;QAC7C,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,SAAiB,EACjB,QAAgB,EAChB,OAAuB,EAAE;IAEzB,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,IAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACb,qCAAqC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CACpG,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;iBACP,UAAU;;;;OAIpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAe,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;iBACP,UAAU;;;;OAIpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAe,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,QAAgB,EAChB,OAA2B,EAAE;IAE7B,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,QAAgB;IAC9D,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;eACb,UAAU;;;;KAIpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAe,CAAC;QAClD,OAAO,IAAI;aACR,GAAG,CAAC,UAAU,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,OAAO;gBAAE,KAAK,IAAI,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC;YACrD,KAAK,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/src/version.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* an ESM `import` can resolve cleanly, and a hardcoded constant survives
|
|
19
19
|
* any packager that drops .json files.
|
|
20
20
|
*/
|
|
21
|
-
export const PACKAGE_VERSION = '1.
|
|
21
|
+
export const PACKAGE_VERSION = '1.16.0';
|
|
22
22
|
// Bump on every release alongside the 4 other manifests + lockfile.
|
|
23
23
|
/**
|
|
24
24
|
* Compare two semver strings. Returns positive if a > b, 0 if equal, negative
|
package/dist/src/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,oEAAoE;AAEpE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAY,EAAE,CACpC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* an ESM `import` can resolve cleanly, and a hardcoded constant survives
|
|
19
19
|
* any packager that drops .json files.
|
|
20
20
|
*/
|
|
21
|
-
export declare const PACKAGE_VERSION = "1.
|
|
21
|
+
export declare const PACKAGE_VERSION = "1.16.0";
|
|
22
22
|
/**
|
|
23
23
|
* Compare two semver strings. Returns positive if a > b, 0 if equal, negative
|
|
24
24
|
* if a < b.
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,WAAW,CAAC;AAGxC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1D"}
|
package/dist/version.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* an ESM `import` can resolve cleanly, and a hardcoded constant survives
|
|
19
19
|
* any packager that drops .json files.
|
|
20
20
|
*/
|
|
21
|
-
export const PACKAGE_VERSION = '1.
|
|
21
|
+
export const PACKAGE_VERSION = '1.16.0';
|
|
22
22
|
// Bump on every release alongside the 4 other manifests + lockfile.
|
|
23
23
|
/**
|
|
24
24
|
* Compare two semver strings. Returns positive if a > b, 0 if equal, negative
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AACxC,oEAAoE;AAEpE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAY,EAAE,CACpC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IACL,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "hippo-memory",
|
|
3
|
-
"name": "Hippo Memory",
|
|
4
|
-
"description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
|
|
5
|
-
"version": "1.
|
|
6
|
-
|
|
7
|
-
"configSchema": {
|
|
8
|
-
"type": "object",
|
|
9
|
-
"additionalProperties": false,
|
|
10
|
-
"properties": {
|
|
11
|
-
"budget": {
|
|
12
|
-
"type": "number",
|
|
13
|
-
"description": "Default token budget for context injection (default: 1500)"
|
|
14
|
-
},
|
|
15
|
-
"autoContext": {
|
|
16
|
-
"type": "boolean",
|
|
17
|
-
"description": "Auto-inject hippo context at session start (default: true)"
|
|
18
|
-
},
|
|
19
|
-
"autoLearn": {
|
|
20
|
-
"type": "boolean",
|
|
21
|
-
"description": "Auto-capture errors during agent sessions (default: true)"
|
|
22
|
-
},
|
|
23
|
-
"autoSleep": {
|
|
24
|
-
"type": "boolean",
|
|
25
|
-
"description": "Queue detached consolidation after sessions with 10+ new memories (default: false)"
|
|
26
|
-
},
|
|
27
|
-
"framing": {
|
|
28
|
-
"type": "string",
|
|
29
|
-
"enum": ["observe", "suggest", "assert"],
|
|
30
|
-
"description": "How memories are framed in context (default: observe)"
|
|
31
|
-
},
|
|
32
|
-
"root": {
|
|
33
|
-
"type": "string",
|
|
34
|
-
"description": "Custom .hippo directory path (default: auto-detect from workspace)"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
"uiHints": {
|
|
39
|
-
"budget": { "label": "Token Budget", "placeholder": "1500" },
|
|
40
|
-
"autoContext": { "label": "Auto-inject Context" },
|
|
41
|
-
"autoLearn": { "label": "Auto-capture Errors" },
|
|
42
|
-
"autoSleep": { "label": "Auto-consolidate" },
|
|
43
|
-
"framing": { "label": "Memory Framing" },
|
|
44
|
-
"root": { "label": "Hippo Root Path", "placeholder": ".hippo/" }
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "hippo-memory",
|
|
3
|
+
"name": "Hippo Memory",
|
|
4
|
+
"description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
|
|
5
|
+
"version": "1.16.0",
|
|
6
|
+
|
|
7
|
+
"configSchema": {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"additionalProperties": false,
|
|
10
|
+
"properties": {
|
|
11
|
+
"budget": {
|
|
12
|
+
"type": "number",
|
|
13
|
+
"description": "Default token budget for context injection (default: 1500)"
|
|
14
|
+
},
|
|
15
|
+
"autoContext": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"description": "Auto-inject hippo context at session start (default: true)"
|
|
18
|
+
},
|
|
19
|
+
"autoLearn": {
|
|
20
|
+
"type": "boolean",
|
|
21
|
+
"description": "Auto-capture errors during agent sessions (default: true)"
|
|
22
|
+
},
|
|
23
|
+
"autoSleep": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"description": "Queue detached consolidation after sessions with 10+ new memories (default: false)"
|
|
26
|
+
},
|
|
27
|
+
"framing": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"enum": ["observe", "suggest", "assert"],
|
|
30
|
+
"description": "How memories are framed in context (default: observe)"
|
|
31
|
+
},
|
|
32
|
+
"root": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "Custom .hippo directory path (default: auto-detect from workspace)"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"uiHints": {
|
|
39
|
+
"budget": { "label": "Token Budget", "placeholder": "1500" },
|
|
40
|
+
"autoContext": { "label": "Auto-inject Context" },
|
|
41
|
+
"autoLearn": { "label": "Auto-capture Errors" },
|
|
42
|
+
"autoSleep": { "label": "Auto-consolidate" },
|
|
43
|
+
"framing": { "label": "Memory Framing" },
|
|
44
|
+
"root": { "label": "Hippo Root Path", "placeholder": ".hippo/" }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "hippo-memory",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Hippo Memory plugin for OpenClaw - biologically-inspired agent memory",
|
|
5
|
-
"main": "index.ts",
|
|
6
|
-
"openclaw": {
|
|
7
|
-
"extensions": [
|
|
8
|
-
"./index.ts"
|
|
9
|
-
]
|
|
10
|
-
},
|
|
11
|
-
"peerDependencies": {
|
|
12
|
-
"hippo-memory": ">=0.4.0"
|
|
13
|
-
},
|
|
14
|
-
"license": "MIT"
|
|
1
|
+
{
|
|
2
|
+
"name": "hippo-memory",
|
|
3
|
+
"version": "1.16.0",
|
|
4
|
+
"description": "Hippo Memory plugin for OpenClaw - biologically-inspired agent memory",
|
|
5
|
+
"main": "index.ts",
|
|
6
|
+
"openclaw": {
|
|
7
|
+
"extensions": [
|
|
8
|
+
"./index.ts"
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
"peerDependencies": {
|
|
12
|
+
"hippo-memory": ">=0.4.0"
|
|
13
|
+
},
|
|
14
|
+
"license": "MIT"
|
|
15
15
|
}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "hippo-memory",
|
|
3
|
-
"name": "Hippo Memory",
|
|
4
|
-
"description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
|
|
5
|
-
"version": "1.
|
|
6
|
-
"configSchema": {
|
|
7
|
-
"type": "object",
|
|
8
|
-
"additionalProperties": false,
|
|
9
|
-
"properties": {
|
|
10
|
-
"budget": {
|
|
11
|
-
"type": "number",
|
|
12
|
-
"description": "Default token budget for context injection (default: 1500)"
|
|
13
|
-
},
|
|
14
|
-
"autoContext": {
|
|
15
|
-
"type": "boolean",
|
|
16
|
-
"description": "Auto-inject hippo context at session start (default: true)"
|
|
17
|
-
},
|
|
18
|
-
"autoLearn": {
|
|
19
|
-
"type": "boolean",
|
|
20
|
-
"description": "Auto-capture errors during agent sessions (default: true)"
|
|
21
|
-
},
|
|
22
|
-
"autoSleep": {
|
|
23
|
-
"type": "boolean",
|
|
24
|
-
"description": "Queue detached consolidation after sessions with 10+ new memories (default: false)"
|
|
25
|
-
},
|
|
26
|
-
"framing": {
|
|
27
|
-
"type": "string",
|
|
28
|
-
"enum": ["observe", "suggest", "assert"],
|
|
29
|
-
"description": "How memories are framed in context (default: observe)"
|
|
30
|
-
},
|
|
31
|
-
"root": {
|
|
32
|
-
"type": "string",
|
|
33
|
-
"description": "Custom .hippo directory path (default: auto-detect from workspace)"
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
"uiHints": {
|
|
38
|
-
"budget": { "label": "Token Budget", "placeholder": "1500" },
|
|
39
|
-
"autoContext": { "label": "Auto-inject Context" },
|
|
40
|
-
"autoLearn": { "label": "Auto-capture Errors" },
|
|
41
|
-
"autoSleep": { "label": "Auto-consolidate" },
|
|
42
|
-
"framing": { "label": "Memory Framing" },
|
|
43
|
-
"root": { "label": "Hippo Root Path", "placeholder": ".hippo/" }
|
|
44
|
-
}
|
|
45
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "hippo-memory",
|
|
3
|
+
"name": "Hippo Memory",
|
|
4
|
+
"description": "Biologically-inspired memory for AI agents. Decay by default, retrieval strengthening, sleep consolidation.",
|
|
5
|
+
"version": "1.16.0",
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"budget": {
|
|
11
|
+
"type": "number",
|
|
12
|
+
"description": "Default token budget for context injection (default: 1500)"
|
|
13
|
+
},
|
|
14
|
+
"autoContext": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"description": "Auto-inject hippo context at session start (default: true)"
|
|
17
|
+
},
|
|
18
|
+
"autoLearn": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"description": "Auto-capture errors during agent sessions (default: true)"
|
|
21
|
+
},
|
|
22
|
+
"autoSleep": {
|
|
23
|
+
"type": "boolean",
|
|
24
|
+
"description": "Queue detached consolidation after sessions with 10+ new memories (default: false)"
|
|
25
|
+
},
|
|
26
|
+
"framing": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"enum": ["observe", "suggest", "assert"],
|
|
29
|
+
"description": "How memories are framed in context (default: observe)"
|
|
30
|
+
},
|
|
31
|
+
"root": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"description": "Custom .hippo directory path (default: auto-detect from workspace)"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"uiHints": {
|
|
38
|
+
"budget": { "label": "Token Budget", "placeholder": "1500" },
|
|
39
|
+
"autoContext": { "label": "Auto-inject Context" },
|
|
40
|
+
"autoLearn": { "label": "Auto-capture Errors" },
|
|
41
|
+
"autoSleep": { "label": "Auto-consolidate" },
|
|
42
|
+
"framing": { "label": "Memory Framing" },
|
|
43
|
+
"root": { "label": "Hippo Root Path", "placeholder": ".hippo/" }
|
|
44
|
+
}
|
|
45
|
+
}
|