memhook 0.2.2 → 0.4.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/CHANGELOG.md +30 -72
- package/README.md +158 -69
- package/dist/bin/memhook.d.ts +11 -6
- package/dist/bin/memhook.d.ts.map +1 -1
- package/dist/bin/memhook.js +208 -21
- package/dist/bin/memhook.js.map +1 -1
- package/dist/src/ansi.d.ts +71 -0
- package/dist/src/ansi.d.ts.map +1 -0
- package/dist/src/ansi.js +100 -0
- package/dist/src/ansi.js.map +1 -0
- package/dist/src/backup.d.ts +10 -0
- package/dist/src/backup.d.ts.map +1 -0
- package/dist/src/backup.js +17 -0
- package/dist/src/backup.js.map +1 -0
- package/dist/src/cache.d.ts.map +1 -1
- package/dist/src/cache.js +14 -7
- package/dist/src/cache.js.map +1 -1
- package/dist/src/config.d.ts +11 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +6 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/configFile.d.ts +6 -0
- package/dist/src/configFile.d.ts.map +1 -1
- package/dist/src/configFile.js.map +1 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init.d.ts +48 -0
- package/dist/src/init.d.ts.map +1 -0
- package/dist/src/init.js +327 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/install.d.ts +87 -0
- package/dist/src/install.d.ts.map +1 -0
- package/dist/src/install.js +124 -0
- package/dist/src/install.js.map +1 -0
- package/dist/src/router.d.ts +22 -0
- package/dist/src/router.d.ts.map +1 -1
- package/dist/src/router.js +113 -8
- package/dist/src/router.js.map +1 -1
- package/dist/src/skills.d.ts +68 -0
- package/dist/src/skills.d.ts.map +1 -0
- package/dist/src/skills.js +73 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/skillsCmd.d.ts +51 -0
- package/dist/src/skillsCmd.d.ts.map +1 -0
- package/dist/src/skillsCmd.js +273 -0
- package/dist/src/skillsCmd.js.map +1 -0
- package/dist/src/tail.d.ts +76 -0
- package/dist/src/tail.d.ts.map +1 -0
- package/dist/src/tail.js +280 -0
- package/dist/src/tail.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +9 -2
- package/skills/curate/SKILL.md +181 -0
- package/skills/curate/reference.md +105 -0
- package/skills/relay/SKILL.md +162 -0
- package/skills/wrap/SKILL.md +173 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure settings.json hook wiring — the dangerous-but-testable core of
|
|
3
|
+
* `memhook init` / `memhook uninstall`.
|
|
4
|
+
*
|
|
5
|
+
* Everything here is a pure data transform: it takes the parsed contents of
|
|
6
|
+
* `~/.claude/settings.json` and returns a NEW object with memhook's hooks
|
|
7
|
+
* added or removed. There is NO file I/O in this module — the orchestration
|
|
8
|
+
* layer (`src/init.ts`) handles reading, backing up, and writing. Keeping the
|
|
9
|
+
* merge pure means the idempotency / non-clobbering guarantees are unit-tested
|
|
10
|
+
* without touching anyone's real config (the one file we must never corrupt).
|
|
11
|
+
*
|
|
12
|
+
* The Claude Code hook shape (sourced from the README + docs/SPECIFICATION.md
|
|
13
|
+
* §10) is:
|
|
14
|
+
*
|
|
15
|
+
* {
|
|
16
|
+
* "hooks": {
|
|
17
|
+
* "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "memhook run" } ] } ],
|
|
18
|
+
* "SessionStart": [ { "hooks": [ { "type": "command", "command": "memhook build-catalog" } ] } ]
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* Each event maps to an array of matcher-groups; each group has a `hooks` array
|
|
23
|
+
* of `{ type, command }`. memhook contributes one group per event and leaves
|
|
24
|
+
* every other key — and every other user hook — untouched.
|
|
25
|
+
*/
|
|
26
|
+
/** The two events memhook wires, paired with the subcommand each runs. */
|
|
27
|
+
export const MEMHOOK_HOOKS = [
|
|
28
|
+
{ event: "UserPromptSubmit", subcommand: "run" },
|
|
29
|
+
{ event: "SessionStart", subcommand: "build-catalog" },
|
|
30
|
+
];
|
|
31
|
+
function isPlainObject(v) {
|
|
32
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* If `command` invokes the memhook binary, return its subcommand
|
|
36
|
+
* (e.g. "run", "build-catalog"), else null. Matches the README form
|
|
37
|
+
* (`memhook run`), an absolute-path form (`/usr/local/bin/memhook run`), and a
|
|
38
|
+
* node form (`node dist/bin/memhook.js run`). Detection is binary-name based
|
|
39
|
+
* (not the configured invocation), so `uninstall` cleans up a hook regardless
|
|
40
|
+
* of how it was originally written.
|
|
41
|
+
*/
|
|
42
|
+
export function memhookSubcommand(command) {
|
|
43
|
+
if (typeof command !== "string")
|
|
44
|
+
return null;
|
|
45
|
+
const m = command.match(/(?:^|[\s/\\])memhook(?:\.[cm]?js)?["']?\s+([a-z][a-z-]*)/i);
|
|
46
|
+
return m?.[1] ? m[1].toLowerCase() : null;
|
|
47
|
+
}
|
|
48
|
+
/** True if `group` contains a memhook hook for `subcommand`. */
|
|
49
|
+
function groupHasMemhook(group, subcommand) {
|
|
50
|
+
if (!Array.isArray(group.hooks))
|
|
51
|
+
return false;
|
|
52
|
+
return group.hooks.some((h) => memhookSubcommand(h?.command) === subcommand);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Return a deep clone with memhook's hooks added. Idempotent: an event that
|
|
56
|
+
* already has a memhook hook for its subcommand is left untouched. Every other
|
|
57
|
+
* key and every other user hook is preserved exactly.
|
|
58
|
+
*
|
|
59
|
+
* @param input parsed settings.json (non-object input is treated as `{}`)
|
|
60
|
+
* @param bin the command used to invoke memhook (default `"memhook"`)
|
|
61
|
+
*/
|
|
62
|
+
export function addHooks(input, bin = "memhook") {
|
|
63
|
+
const settings = isPlainObject(input) ? structuredClone(input) : {};
|
|
64
|
+
if (!isPlainObject(settings.hooks))
|
|
65
|
+
settings.hooks = {};
|
|
66
|
+
const hooks = settings.hooks;
|
|
67
|
+
const added = [];
|
|
68
|
+
const alreadyPresent = [];
|
|
69
|
+
for (const { event, subcommand } of MEMHOOK_HOOKS) {
|
|
70
|
+
const list = Array.isArray(hooks[event]) ? hooks[event] : (hooks[event] = []);
|
|
71
|
+
if (list.some((g) => isPlainObject(g) && groupHasMemhook(g, subcommand))) {
|
|
72
|
+
alreadyPresent.push(event);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
list.push({ hooks: [{ type: "command", command: `${bin} ${subcommand}` }] });
|
|
76
|
+
added.push(event);
|
|
77
|
+
}
|
|
78
|
+
return { settings, added, alreadyPresent };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Return a deep clone with every memhook hook removed. Scans ALL hook events
|
|
82
|
+
* (not just the two memhook registers) so a hook moved by hand is still cleaned
|
|
83
|
+
* up. Empties that result — a group whose `hooks` becomes empty, an event whose
|
|
84
|
+
* group list becomes empty — are pruned so no dangling shells are left behind.
|
|
85
|
+
*/
|
|
86
|
+
export function removeHooks(input) {
|
|
87
|
+
const settings = isPlainObject(input) ? structuredClone(input) : {};
|
|
88
|
+
let removed = 0;
|
|
89
|
+
const removedEvents = [];
|
|
90
|
+
if (!isPlainObject(settings.hooks))
|
|
91
|
+
return { settings, removed, removedEvents };
|
|
92
|
+
const hooks = settings.hooks;
|
|
93
|
+
for (const event of Object.keys(hooks)) {
|
|
94
|
+
const list = hooks[event];
|
|
95
|
+
if (!Array.isArray(list))
|
|
96
|
+
continue;
|
|
97
|
+
let removedHere = 0;
|
|
98
|
+
const kept = [];
|
|
99
|
+
for (const group of list) {
|
|
100
|
+
if (!isPlainObject(group) || !Array.isArray(group.hooks)) {
|
|
101
|
+
kept.push(group);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const before = group.hooks.length;
|
|
105
|
+
group.hooks = group.hooks.filter((h) => memhookSubcommand(h?.command) === null);
|
|
106
|
+
removedHere += before - group.hooks.length;
|
|
107
|
+
// Drop a group only if WE emptied it (a group that was already empty, or
|
|
108
|
+
// empty for other reasons, is preserved untouched).
|
|
109
|
+
if (group.hooks.length > 0 || before === 0)
|
|
110
|
+
kept.push(group);
|
|
111
|
+
}
|
|
112
|
+
if (removedHere > 0) {
|
|
113
|
+
removed += removedHere;
|
|
114
|
+
removedEvents.push(event);
|
|
115
|
+
if (kept.length > 0)
|
|
116
|
+
hooks[event] = kept;
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
118
|
+
else
|
|
119
|
+
delete hooks[event];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { settings, removed, removedEvents };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/src/router.d.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* Fail-soft: every error path falls back to empty additionalContext.
|
|
19
19
|
* Never blocks Claude Code.
|
|
20
20
|
*/
|
|
21
|
+
import { type MemhookConfig } from "./config.js";
|
|
21
22
|
export interface HookInput {
|
|
22
23
|
prompt: string;
|
|
23
24
|
cwd?: string;
|
|
@@ -27,6 +28,27 @@ export interface HookOutput {
|
|
|
27
28
|
hookEventName: "UserPromptSubmit";
|
|
28
29
|
additionalContext: string;
|
|
29
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* Optional, additive (v0.4). A one-line warning shown to the user — used only
|
|
33
|
+
* for the `/curate` nudge when the catalog grows large. Documented Claude Code
|
|
34
|
+
* field; absent on every turn the nudge does not fire, so the existing output
|
|
35
|
+
* shape is unchanged for existing consumers (docs/SPECIFICATION.md §10.2).
|
|
36
|
+
*/
|
|
37
|
+
systemMessage?: string;
|
|
30
38
|
}
|
|
31
39
|
export declare function route(stdinJson: string, env?: NodeJS.ProcessEnv): Promise<HookOutput>;
|
|
40
|
+
/**
|
|
41
|
+
* Proactive `/curate` nudge. Returns a one-line `systemMessage` when the memory
|
|
42
|
+
* catalog has grown past a threshold and the cooldown has elapsed, else
|
|
43
|
+
* undefined. Local-only: it reads the already-loaded catalog length, counts
|
|
44
|
+
* memory files, and stamps a local cooldown file — NO outbound call. The whole
|
|
45
|
+
* body is wrapped so any failure yields no nudge (fail-soft is never affected).
|
|
46
|
+
*
|
|
47
|
+
* Cost: within the cooldown it pays one tiny stamp read and returns; only once
|
|
48
|
+
* the cooldown elapses does it count files (a readdir per memory dir, the same
|
|
49
|
+
* order of I/O the router already does in `readSelected`).
|
|
50
|
+
*
|
|
51
|
+
* Exported for direct unit testing.
|
|
52
|
+
*/
|
|
53
|
+
export declare function maybeCurateNudge(config: MemhookConfig, catalogContent: string, now: number): string | undefined;
|
|
32
54
|
//# sourceMappingURL=router.d.ts.map
|
package/dist/src/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAeH,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAM7D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE;QAClB,aAAa,EAAE,kBAAkB,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAuBD,wBAAsB,KAAK,CACzB,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,UAAU,CAAC,CA+KrB;AAqID;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,CAqBpB"}
|
package/dist/src/router.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* Fail-soft: every error path falls back to empty additionalContext.
|
|
19
19
|
* Never blocks Claude Code.
|
|
20
20
|
*/
|
|
21
|
-
import { existsSync, readFileSync,
|
|
21
|
+
import { existsSync, readFileSync, writeFileSync, openSync, fstatSync, closeSync, appendFileSync, mkdirSync, readdirSync, } from "node:fs";
|
|
22
22
|
import { join, dirname, basename } from "node:path";
|
|
23
23
|
import { LocalCache } from "./cache.js";
|
|
24
24
|
import { loadConfig } from "./config.js";
|
|
@@ -52,7 +52,26 @@ export async function route(stdinJson, env = process.env) {
|
|
|
52
52
|
logEntry(config, baseLog(input.prompt, "pre_filter_skip"));
|
|
53
53
|
return EMPTY;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
// Read the catalog through a single fd: `fstat` gives the cache-key mtime and
|
|
56
|
+
// we read the content from the same handle. Using one open fd — instead of
|
|
57
|
+
// `existsSync`/`statSync` then `readFileSync` on the path — closes a
|
|
58
|
+
// check-then-use window (CodeQL js/file-system-race). A missing or unreadable
|
|
59
|
+
// catalog falls through to `no_catalog` (fail-soft). The content is only used
|
|
60
|
+
// on a cache miss, but reading it here (a small index file) keeps the catalog
|
|
61
|
+
// access to one race-free handle.
|
|
62
|
+
let catalogContent;
|
|
63
|
+
let catalogMtimeMs;
|
|
64
|
+
try {
|
|
65
|
+
const fd = openSync(config.catalog.path, "r");
|
|
66
|
+
try {
|
|
67
|
+
catalogMtimeMs = fstatSync(fd).mtimeMs;
|
|
68
|
+
catalogContent = readFileSync(fd, "utf8");
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
closeSync(fd);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
56
75
|
logEntry(config, baseLog(input.prompt, "no_catalog"));
|
|
57
76
|
return EMPTY;
|
|
58
77
|
}
|
|
@@ -63,12 +82,11 @@ export async function route(stdinJson, env = process.env) {
|
|
|
63
82
|
logEntry(config, baseLog(input.prompt, "no_api_key"));
|
|
64
83
|
return EMPTY;
|
|
65
84
|
}
|
|
66
|
-
const catalogStat = statSync(config.catalog.path);
|
|
67
85
|
const cache = new LocalCache(config.cache.dir, config.cache.ttlMin, config.cache.evictionDays);
|
|
68
86
|
const cacheKey = config.cache.enabled
|
|
69
87
|
? cache.key({
|
|
70
88
|
prompt: input.prompt,
|
|
71
|
-
catalogMtimeMs
|
|
89
|
+
catalogMtimeMs,
|
|
72
90
|
cwd,
|
|
73
91
|
scriptVersion: config.scriptVersion,
|
|
74
92
|
provider: `${config.provider.type}:${config.provider.model}`,
|
|
@@ -93,7 +111,6 @@ export async function route(stdinJson, env = process.env) {
|
|
|
93
111
|
}
|
|
94
112
|
}
|
|
95
113
|
if (!fromCache) {
|
|
96
|
-
const catalogContent = readFileSync(config.catalog.path, "utf8");
|
|
97
114
|
const systemPrompt = buildSystemPrompt(catalogContent);
|
|
98
115
|
// Provider construction can throw on bad config; the constructor `throw`s
|
|
99
116
|
// are reachable from the hook, so they MUST be caught here (fail-soft).
|
|
@@ -175,12 +192,19 @@ export async function route(stdinJson, env = process.env) {
|
|
|
175
192
|
additionalSizeTokensEst: Math.floor(additional.length / 4),
|
|
176
193
|
status,
|
|
177
194
|
});
|
|
178
|
-
|
|
195
|
+
const output = {
|
|
179
196
|
hookSpecificOutput: {
|
|
180
197
|
hookEventName: "UserPromptSubmit",
|
|
181
198
|
additionalContext: additional,
|
|
182
199
|
},
|
|
183
200
|
};
|
|
201
|
+
// Proactive `/curate` nudge — best-effort, local-only, never affects the
|
|
202
|
+
// additionalContext contract or fail-soft. `catalogContent` is already in hand
|
|
203
|
+
// (read above), so the catalog-size signal is free.
|
|
204
|
+
const nudge = maybeCurateNudge(config, catalogContent, Date.now());
|
|
205
|
+
if (nudge)
|
|
206
|
+
output.systemMessage = nudge;
|
|
207
|
+
return output;
|
|
184
208
|
}
|
|
185
209
|
function buildSystemPrompt(catalog) {
|
|
186
210
|
return `Tu es un sélecteur de mémoire pour Claude Code. Tu identifies les feedbacks et règles pertinents pour le prompt utilisateur. Tu réponds UNIQUEMENT avec un JSON array de basenames .md, sans explication, sans markdown code fence.
|
|
@@ -252,10 +276,16 @@ function readSelected(basenames, cwd, config) {
|
|
|
252
276
|
seen.push(name);
|
|
253
277
|
for (const dir of dirs) {
|
|
254
278
|
const file = join(dir, name);
|
|
255
|
-
|
|
279
|
+
// Read directly and treat a read failure as "not in this dir" — no
|
|
280
|
+
// existsSync precheck, so no check-then-use race (CodeQL js/file-system-race).
|
|
281
|
+
let content;
|
|
282
|
+
try {
|
|
283
|
+
content = readFileSync(file, "utf8");
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
256
286
|
continue;
|
|
287
|
+
}
|
|
257
288
|
// Cap-A1 projection check — pre-injection, allow ≥1 file always.
|
|
258
|
-
const content = readFileSync(file, "utf8");
|
|
259
289
|
const projected = additional.length + content.length + 64;
|
|
260
290
|
if (injected > 0 && projected > config.selection.maxAdditionalChars) {
|
|
261
291
|
return { additional, injected, allBasenames: seen };
|
|
@@ -300,6 +330,77 @@ function evictStale(config) {
|
|
|
300
330
|
// silent — eviction is best-effort
|
|
301
331
|
}
|
|
302
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* Proactive `/curate` nudge. Returns a one-line `systemMessage` when the memory
|
|
335
|
+
* catalog has grown past a threshold and the cooldown has elapsed, else
|
|
336
|
+
* undefined. Local-only: it reads the already-loaded catalog length, counts
|
|
337
|
+
* memory files, and stamps a local cooldown file — NO outbound call. The whole
|
|
338
|
+
* body is wrapped so any failure yields no nudge (fail-soft is never affected).
|
|
339
|
+
*
|
|
340
|
+
* Cost: within the cooldown it pays one tiny stamp read and returns; only once
|
|
341
|
+
* the cooldown elapses does it count files (a readdir per memory dir, the same
|
|
342
|
+
* order of I/O the router already does in `readSelected`).
|
|
343
|
+
*
|
|
344
|
+
* Exported for direct unit testing.
|
|
345
|
+
*/
|
|
346
|
+
export function maybeCurateNudge(config, catalogContent, now) {
|
|
347
|
+
try {
|
|
348
|
+
if (!config.curateNudge.enabled)
|
|
349
|
+
return undefined;
|
|
350
|
+
const stampFile = join(config.cache.dir, ".curate-nudge");
|
|
351
|
+
const last = readNudgeStamp(stampFile);
|
|
352
|
+
if (last !== null && now - last < config.curateNudge.cooldownDays * 86_400_000) {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
const tokensEst = Math.floor(catalogContent.length / 4);
|
|
356
|
+
const fileCount = countMemoryFiles(config.searchDirs[0]);
|
|
357
|
+
const over = tokensEst >= config.curateNudge.thresholdTokens ||
|
|
358
|
+
fileCount >= config.curateNudge.thresholdFiles;
|
|
359
|
+
if (!over)
|
|
360
|
+
return undefined;
|
|
361
|
+
writeNudgeStamp(stampFile, now);
|
|
362
|
+
const tokK = tokensEst >= 10_000 ? Math.round(tokensEst / 1000) : (tokensEst / 1000).toFixed(1);
|
|
363
|
+
return `📚 memhook: memory catalog is large (~${tokK}k tokens, ${fileCount} files). Run /curate to prune duplicate and stale entries.`;
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return undefined; // a nudge must never break fail-soft
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/** Count top-level `*.md` memory files (excludes MEMORY.md and the journal/ subdir). */
|
|
370
|
+
function countMemoryFiles(projectsRoot) {
|
|
371
|
+
let total = 0;
|
|
372
|
+
for (const dir of listProjectsMemoryDirs(projectsRoot)) {
|
|
373
|
+
let entries = [];
|
|
374
|
+
try {
|
|
375
|
+
entries = readdirSync(dir);
|
|
376
|
+
}
|
|
377
|
+
catch {
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
for (const e of entries) {
|
|
381
|
+
if (e.endsWith(".md") && e !== "MEMORY.md")
|
|
382
|
+
total++;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return total;
|
|
386
|
+
}
|
|
387
|
+
function readNudgeStamp(file) {
|
|
388
|
+
try {
|
|
389
|
+
const n = Number(readFileSync(file, "utf8").trim());
|
|
390
|
+
return Number.isFinite(n) ? n : null;
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
function writeNudgeStamp(file, now) {
|
|
397
|
+
try {
|
|
398
|
+
writeFileSync(file, String(now), "utf8");
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
// best-effort — a missed stamp just means the nudge may repeat
|
|
402
|
+
}
|
|
403
|
+
}
|
|
303
404
|
function baseLog(prompt, status) {
|
|
304
405
|
return {
|
|
305
406
|
ts: nowIso(),
|
|
@@ -329,6 +430,10 @@ function logEntry(config, entry) {
|
|
|
329
430
|
additional_size_chars: entry.additionalSizeChars,
|
|
330
431
|
additional_size_tokens_est: entry.additionalSizeTokensEst,
|
|
331
432
|
status: entry.status,
|
|
433
|
+
// Additive field (v0.3) — the model that handled this turn. Read by
|
|
434
|
+
// `memhook tail`. The frozen log schema permits adding fields; never
|
|
435
|
+
// rename/remove existing ones (docs/SPECIFICATION.md §14).
|
|
436
|
+
model: config.provider.model,
|
|
332
437
|
});
|
|
333
438
|
appendFileSync(config.logging.jsonlPath, line + "\n", "utf8");
|
|
334
439
|
}
|
package/dist/src/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure planning core for `memhook skills install|uninstall|list`.
|
|
3
|
+
*
|
|
4
|
+
* Like src/install.ts, this module has NO file I/O. The orchestration layer
|
|
5
|
+
* (src/skillsCmd.ts) reads the bundled skill files and the files already on
|
|
6
|
+
* disk, calls these pure planners, and applies the result with backups.
|
|
7
|
+
* Keeping the plan pure means the idempotency + non-clobbering guarantees are
|
|
8
|
+
* unit-tested without touching anyone's real `~/.claude/skills`.
|
|
9
|
+
*
|
|
10
|
+
* memhook ships three STANDALONE companion skills in Claude Code's skill format
|
|
11
|
+
* (`~/.claude/skills/<name>/SKILL.md`, invoked as `/<name>`):
|
|
12
|
+
*
|
|
13
|
+
* /wrap — end-of-session wrap-up (capture lessons into memory + journal)
|
|
14
|
+
* /curate — memory hygiene (dedupe, index sync, rebuild the catalog)
|
|
15
|
+
* /relay — generate a handoff prompt for a fresh session
|
|
16
|
+
*
|
|
17
|
+
* Standalone — not a plugin — so the command names stay bare (`/wrap`, not
|
|
18
|
+
* `/memhook:wrap`). See docs/SPECIFICATION.md "Companion skills".
|
|
19
|
+
*/
|
|
20
|
+
export declare const COMPANION_SKILLS: readonly ["wrap", "curate", "relay"];
|
|
21
|
+
export type CompanionSkill = (typeof COMPANION_SKILLS)[number];
|
|
22
|
+
/**
|
|
23
|
+
* Files bundled for each skill, relative to the skill's own directory. The
|
|
24
|
+
* orchestration layer reads `<sourceDir>/<name>/<relPath>` and writes
|
|
25
|
+
* `~/.claude/skills/<name>/<relPath>`.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SKILL_FILES: Record<CompanionSkill, readonly string[]>;
|
|
28
|
+
export declare function isCompanionSkill(name: string): name is CompanionSkill;
|
|
29
|
+
/** Bundled content for one skill, keyed by relative path. */
|
|
30
|
+
export type SkillSources = Record<string, string>;
|
|
31
|
+
/** Installed content per relative path; `null` means the file is not on disk. */
|
|
32
|
+
export type InstalledFiles = Record<string, string | null>;
|
|
33
|
+
export type SkillStatus = "absent" | "identical" | "differs";
|
|
34
|
+
export type InstallAction = "install" | "skip" | "overwrite" | "blocked";
|
|
35
|
+
/**
|
|
36
|
+
* Compare a skill's bundled files against what's on disk.
|
|
37
|
+
* - `absent` — none of the skill's files are installed.
|
|
38
|
+
* - `identical` — every bundled file is installed with matching content.
|
|
39
|
+
* - `differs` — installed but a file is missing or its content changed
|
|
40
|
+
* (a user edit, or an older shipped version).
|
|
41
|
+
*/
|
|
42
|
+
export declare function diffSkill(source: SkillSources, installed: InstalledFiles): SkillStatus;
|
|
43
|
+
export interface SkillInstallPlan {
|
|
44
|
+
name: CompanionSkill;
|
|
45
|
+
status: SkillStatus;
|
|
46
|
+
action: InstallAction;
|
|
47
|
+
/** Relative paths that will be written for `install` / `overwrite`. */
|
|
48
|
+
writes: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Plan one skill install. Idempotent: an `identical` skill is skipped. A skill
|
|
52
|
+
* that `differs` is NEVER clobbered without `force` (it's reported `blocked`),
|
|
53
|
+
* matching install.ts's "back up + never overwrite silently" stance. With
|
|
54
|
+
* `force`, a differing skill is `overwrite` (the caller backs up first).
|
|
55
|
+
*/
|
|
56
|
+
export declare function planInstall(name: CompanionSkill, source: SkillSources, installed: InstalledFiles, opts: {
|
|
57
|
+
force: boolean;
|
|
58
|
+
}): SkillInstallPlan;
|
|
59
|
+
export interface SkillUninstallPlan {
|
|
60
|
+
name: CompanionSkill;
|
|
61
|
+
present: boolean;
|
|
62
|
+
action: "remove" | "skip";
|
|
63
|
+
/** Relative paths that exist on disk and will be deleted. */
|
|
64
|
+
removes: string[];
|
|
65
|
+
}
|
|
66
|
+
/** Plan one skill uninstall: remove only the files memhook ships, if present. */
|
|
67
|
+
export declare function planUninstall(name: CompanionSkill, source: SkillSources, installed: InstalledFiles): SkillUninstallPlan;
|
|
68
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,eAAO,MAAM,gBAAgB,sCAAuC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAIjE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAErE;AAED,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAClD,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAC7D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAEzE;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,GAAG,WAAW,CAMtF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GACvB,gBAAgB,CAQlB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,GACxB,kBAAkB,CAIpB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure planning core for `memhook skills install|uninstall|list`.
|
|
3
|
+
*
|
|
4
|
+
* Like src/install.ts, this module has NO file I/O. The orchestration layer
|
|
5
|
+
* (src/skillsCmd.ts) reads the bundled skill files and the files already on
|
|
6
|
+
* disk, calls these pure planners, and applies the result with backups.
|
|
7
|
+
* Keeping the plan pure means the idempotency + non-clobbering guarantees are
|
|
8
|
+
* unit-tested without touching anyone's real `~/.claude/skills`.
|
|
9
|
+
*
|
|
10
|
+
* memhook ships three STANDALONE companion skills in Claude Code's skill format
|
|
11
|
+
* (`~/.claude/skills/<name>/SKILL.md`, invoked as `/<name>`):
|
|
12
|
+
*
|
|
13
|
+
* /wrap — end-of-session wrap-up (capture lessons into memory + journal)
|
|
14
|
+
* /curate — memory hygiene (dedupe, index sync, rebuild the catalog)
|
|
15
|
+
* /relay — generate a handoff prompt for a fresh session
|
|
16
|
+
*
|
|
17
|
+
* Standalone — not a plugin — so the command names stay bare (`/wrap`, not
|
|
18
|
+
* `/memhook:wrap`). See docs/SPECIFICATION.md "Companion skills".
|
|
19
|
+
*/
|
|
20
|
+
export const COMPANION_SKILLS = ["wrap", "curate", "relay"];
|
|
21
|
+
/**
|
|
22
|
+
* Files bundled for each skill, relative to the skill's own directory. The
|
|
23
|
+
* orchestration layer reads `<sourceDir>/<name>/<relPath>` and writes
|
|
24
|
+
* `~/.claude/skills/<name>/<relPath>`.
|
|
25
|
+
*/
|
|
26
|
+
export const SKILL_FILES = {
|
|
27
|
+
wrap: ["SKILL.md"],
|
|
28
|
+
curate: ["SKILL.md", "reference.md"],
|
|
29
|
+
relay: ["SKILL.md"],
|
|
30
|
+
};
|
|
31
|
+
export function isCompanionSkill(name) {
|
|
32
|
+
return COMPANION_SKILLS.includes(name);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compare a skill's bundled files against what's on disk.
|
|
36
|
+
* - `absent` — none of the skill's files are installed.
|
|
37
|
+
* - `identical` — every bundled file is installed with matching content.
|
|
38
|
+
* - `differs` — installed but a file is missing or its content changed
|
|
39
|
+
* (a user edit, or an older shipped version).
|
|
40
|
+
*/
|
|
41
|
+
export function diffSkill(source, installed) {
|
|
42
|
+
const rels = Object.keys(source);
|
|
43
|
+
const anyPresent = rels.some((r) => installed[r] != null);
|
|
44
|
+
if (!anyPresent)
|
|
45
|
+
return "absent";
|
|
46
|
+
const allMatch = rels.every((r) => installed[r] != null && installed[r] === source[r]);
|
|
47
|
+
return allMatch ? "identical" : "differs";
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Plan one skill install. Idempotent: an `identical` skill is skipped. A skill
|
|
51
|
+
* that `differs` is NEVER clobbered without `force` (it's reported `blocked`),
|
|
52
|
+
* matching install.ts's "back up + never overwrite silently" stance. With
|
|
53
|
+
* `force`, a differing skill is `overwrite` (the caller backs up first).
|
|
54
|
+
*/
|
|
55
|
+
export function planInstall(name, source, installed, opts) {
|
|
56
|
+
const status = diffSkill(source, installed);
|
|
57
|
+
let action;
|
|
58
|
+
if (status === "absent")
|
|
59
|
+
action = "install";
|
|
60
|
+
else if (status === "identical")
|
|
61
|
+
action = "skip";
|
|
62
|
+
else
|
|
63
|
+
action = opts.force ? "overwrite" : "blocked";
|
|
64
|
+
const writes = action === "install" || action === "overwrite" ? Object.keys(source) : [];
|
|
65
|
+
return { name, status, action, writes };
|
|
66
|
+
}
|
|
67
|
+
/** Plan one skill uninstall: remove only the files memhook ships, if present. */
|
|
68
|
+
export function planUninstall(name, source, installed) {
|
|
69
|
+
const removes = Object.keys(source).filter((r) => installed[r] != null);
|
|
70
|
+
const present = removes.length > 0;
|
|
71
|
+
return { name, present, action: present ? "remove" : "skip", removes };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAGrE;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAA8C;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,MAAM,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,KAAK,EAAE,CAAC,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,SAAyB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAAoB,EACpB,MAAoB,EACpB,SAAyB,EACzB,IAAwB;IAExB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,MAAqB,CAAC;IAC1B,IAAI,MAAM,KAAK,QAAQ;QAAE,MAAM,GAAG,SAAS,CAAC;SACvC,IAAI,MAAM,KAAK,WAAW;QAAE,MAAM,GAAG,MAAM,CAAC;;QAC5C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAUD,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAC3B,IAAoB,EACpB,MAAoB,EACpB,SAAyB;IAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `memhook skills install|uninstall|list` — copy the bundled companion skills
|
|
3
|
+
* (/wrap, /curate, /relay) into `~/.claude/skills/<name>/`.
|
|
4
|
+
*
|
|
5
|
+
* This is the I/O shell around the pure planner in src/skills.ts (same split as
|
|
6
|
+
* init.ts ↔ install.ts). All reads/writes/backups live here; the plan logic is
|
|
7
|
+
* pure and unit-tested. These are INTERACTIVE, user-invoked commands — not the
|
|
8
|
+
* hook path — so they may use the TTY and exit non-zero on user error
|
|
9
|
+
* (docs/SPECIFICATION.md §9). The one safety rule: never clobber a skill the
|
|
10
|
+
* user has edited without `--force`, and always back up before overwriting.
|
|
11
|
+
*/
|
|
12
|
+
import { type CompanionSkill, type SkillInstallPlan } from "./skills.js";
|
|
13
|
+
/**
|
|
14
|
+
* Directory holding the bundled skill sources. The module lives at `src/` in
|
|
15
|
+
* dev/tests and `dist/src/` once published, so the relative depth to the
|
|
16
|
+
* package-root `skills/` differs — walk up from the module dir until we find a
|
|
17
|
+
* `skills/wrap/SKILL.md`, which is unambiguous in either layout.
|
|
18
|
+
*/
|
|
19
|
+
export declare function bundledSkillsDir(): string;
|
|
20
|
+
export interface InstallSkillsOptions {
|
|
21
|
+
home?: string | undefined;
|
|
22
|
+
sourceDir?: string | undefined;
|
|
23
|
+
names?: CompanionSkill[] | undefined;
|
|
24
|
+
force?: boolean | undefined;
|
|
25
|
+
dryRun?: boolean | undefined;
|
|
26
|
+
}
|
|
27
|
+
export interface SkillInstallResult {
|
|
28
|
+
plan: SkillInstallPlan;
|
|
29
|
+
applied: boolean;
|
|
30
|
+
backedUp: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Install (copy) the requested skills, backing up any file an `--force`
|
|
34
|
+
* overwrite would replace. Pure-of-prompts: callers handle confirmation + I/O
|
|
35
|
+
* reporting. Returns one result per requested skill.
|
|
36
|
+
*/
|
|
37
|
+
export declare function installCompanionSkills(opts?: InstallSkillsOptions): SkillInstallResult[];
|
|
38
|
+
export type SkillsSubcommand = "install" | "uninstall" | "list";
|
|
39
|
+
export interface RunSkillsOptions {
|
|
40
|
+
subcommand: SkillsSubcommand;
|
|
41
|
+
names?: CompanionSkill[] | undefined;
|
|
42
|
+
yes: boolean;
|
|
43
|
+
dryRun: boolean;
|
|
44
|
+
force: boolean;
|
|
45
|
+
/** Test seams. */
|
|
46
|
+
home?: string | undefined;
|
|
47
|
+
sourceDir?: string | undefined;
|
|
48
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
49
|
+
}
|
|
50
|
+
export declare function runSkills(opts: RunSkillsOptions): Promise<number>;
|
|
51
|
+
//# sourceMappingURL=skillsCmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillsCmd.d.ts","sourceRoot":"","sources":["../../src/skillsCmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,OAAO,EAML,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAGtB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AA8BD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,oBAAyB,GAAG,kBAAkB,EAAE,CAqC5F;AAID,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IACrC,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;CACrC;AAkBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4JvE"}
|