@snoai/mem-claude 1.0.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.
Files changed (72) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +36 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +126 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/constants.d.ts +4 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +4 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/doctor.d.ts +3 -0
  12. package/dist/doctor.d.ts.map +1 -0
  13. package/dist/doctor.js +66 -0
  14. package/dist/doctor.js.map +1 -0
  15. package/dist/explicit.d.ts +9 -0
  16. package/dist/explicit.d.ts.map +1 -0
  17. package/dist/explicit.js +88 -0
  18. package/dist/explicit.js.map +1 -0
  19. package/dist/files.d.ts +6 -0
  20. package/dist/files.d.ts.map +1 -0
  21. package/dist/files.js +71 -0
  22. package/dist/files.js.map +1 -0
  23. package/dist/hooks.d.ts +8 -0
  24. package/dist/hooks.d.ts.map +1 -0
  25. package/dist/hooks.js +385 -0
  26. package/dist/hooks.js.map +1 -0
  27. package/dist/import.d.ts +13 -0
  28. package/dist/import.d.ts.map +1 -0
  29. package/dist/import.js +106 -0
  30. package/dist/import.js.map +1 -0
  31. package/dist/install.d.ts +26 -0
  32. package/dist/install.d.ts.map +1 -0
  33. package/dist/install.js +118 -0
  34. package/dist/install.js.map +1 -0
  35. package/dist/memory-client.d.ts +4 -0
  36. package/dist/memory-client.d.ts.map +1 -0
  37. package/dist/memory-client.js +9 -0
  38. package/dist/memory-client.js.map +1 -0
  39. package/dist/messages.d.ts +9 -0
  40. package/dist/messages.d.ts.map +1 -0
  41. package/dist/messages.js +9 -0
  42. package/dist/messages.js.map +1 -0
  43. package/dist/paths.d.ts +9 -0
  44. package/dist/paths.d.ts.map +1 -0
  45. package/dist/paths.js +30 -0
  46. package/dist/paths.js.map +1 -0
  47. package/dist/recall.d.ts +2 -0
  48. package/dist/recall.d.ts.map +1 -0
  49. package/dist/recall.js +20 -0
  50. package/dist/recall.js.map +1 -0
  51. package/dist/scope.d.ts +6 -0
  52. package/dist/scope.d.ts.map +1 -0
  53. package/dist/scope.js +36 -0
  54. package/dist/scope.js.map +1 -0
  55. package/dist/session-state.d.ts +55 -0
  56. package/dist/session-state.d.ts.map +1 -0
  57. package/dist/session-state.js +112 -0
  58. package/dist/session-state.js.map +1 -0
  59. package/dist/settings.d.ts +23 -0
  60. package/dist/settings.d.ts.map +1 -0
  61. package/dist/settings.js +33 -0
  62. package/dist/settings.js.map +1 -0
  63. package/dist/skill-runs.d.ts +7 -0
  64. package/dist/skill-runs.d.ts.map +1 -0
  65. package/dist/skill-runs.js +108 -0
  66. package/dist/skill-runs.js.map +1 -0
  67. package/dist/worker.d.ts +23 -0
  68. package/dist/worker.d.ts.map +1 -0
  69. package/dist/worker.js +319 -0
  70. package/dist/worker.js.map +1 -0
  71. package/package.json +40 -0
  72. package/skills/sno-mem-claude/SKILL.md +22 -0
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ declare const settingsSchema: z.ZodObject<{
3
+ hooks: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
4
+ hooks: z.ZodArray<z.ZodObject<{
5
+ type: z.ZodString;
6
+ command: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$loose>>;
8
+ }, z.core.$loose>>>>;
9
+ permissions: z.ZodOptional<z.ZodObject<{
10
+ allow: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ }, z.core.$loose>>;
12
+ disableAllHooks: z.ZodOptional<z.ZodBoolean>;
13
+ }, z.core.$loose>;
14
+ type Settings = z.infer<typeof settingsSchema>;
15
+ export interface InstallOptions {
16
+ configDir: string;
17
+ programPath: string;
18
+ dryRun?: boolean;
19
+ writeOutput: (line: string) => void;
20
+ }
21
+ export declare function isOwnedHookCommand(command: string, subcommand: string): boolean;
22
+ export declare function isOwnedPermissionRule(rule: string): boolean;
23
+ export declare function readSettings(configDir: string): Promise<Settings | undefined>;
24
+ export declare function installClaude(options: InstallOptions): Promise<void>;
25
+ export {};
26
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,cAAc;;;;;;;;;;;iBAIlB,CAAC;AACH,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE/C,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAUD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAS/E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAiBnF;AA+BD,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB1E"}
@@ -0,0 +1,118 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, isAbsolute, join } from "node:path";
3
+ import { CODING_SKIN_HOOKS } from "@snoai/memory/coding-skin";
4
+ import { z } from "zod";
5
+ import { APP_NAME } from "./constants.js";
6
+ import { MESSAGES } from "./messages.js";
7
+ const hookSchema = z.looseObject({ type: z.string(), command: z.string().optional() });
8
+ const groupSchema = z.looseObject({ hooks: z.array(hookSchema) });
9
+ const settingsSchema = z.looseObject({
10
+ hooks: z.record(z.string(), z.array(groupSchema)).optional(),
11
+ permissions: z.looseObject({ allow: z.array(z.string()).optional() }).optional(),
12
+ disableAllHooks: z.boolean().optional(),
13
+ });
14
+ function shellQuote(value) {
15
+ return `'${value.replaceAll("'", "'\\''")}'`;
16
+ }
17
+ function isOwnedProgram(program) {
18
+ return basename(program) === APP_NAME || /\/mem-claude\/(?:dist|src)\/cli\.(?:js|ts)$/.test(program);
19
+ }
20
+ export function isOwnedHookCommand(command, subcommand) {
21
+ const suffix = ` ${subcommand}`;
22
+ const trimmed = command.trim();
23
+ if (!trimmed.endsWith(suffix))
24
+ return false;
25
+ const encoded = trimmed.slice(0, -suffix.length);
26
+ const program = encoded.startsWith("'") && encoded.endsWith("'")
27
+ ? encoded.slice(1, -1).replaceAll("'\\''", "'") : encoded;
28
+ if (encoded !== shellQuote(program) && !/^[\w./-]+$/.test(encoded))
29
+ return false;
30
+ return isOwnedProgram(program);
31
+ }
32
+ export function isOwnedPermissionRule(rule) {
33
+ return rule.startsWith("Bash(") && rule.endsWith(" *)")
34
+ && isAbsolute(rule.slice(5, -3)) && isOwnedProgram(rule.slice(5, -3));
35
+ }
36
+ export async function readSettings(configDir) {
37
+ let text;
38
+ try {
39
+ text = await readFile(join(configDir, "settings.json"), "utf8");
40
+ }
41
+ catch (error) {
42
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
43
+ return {};
44
+ throw error;
45
+ }
46
+ try {
47
+ const parsed = JSON.parse(text);
48
+ if (!settingsSchema.safeParse(parsed).success)
49
+ return undefined;
50
+ // Keep validated user objects intact, including their original key order.
51
+ return parsed;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof SyntaxError)
55
+ return undefined;
56
+ throw error;
57
+ }
58
+ }
59
+ function updateSettings(settings, programPath) {
60
+ settings.hooks ??= {};
61
+ for (const event of Object.keys(CODING_SKIN_HOOKS)) {
62
+ const details = CODING_SKIN_HOOKS[event];
63
+ const groups = settings.hooks[event] ?? [];
64
+ let installed = false;
65
+ const hook = {
66
+ type: "command", command: `${shellQuote(programPath)} ${details.subcommand}`,
67
+ timeout: details.timeout,
68
+ };
69
+ for (const group of groups) {
70
+ group.hooks = group.hooks.map(current => {
71
+ if (!current.command || !isOwnedHookCommand(current.command, details.subcommand))
72
+ return current;
73
+ installed = true;
74
+ return hook;
75
+ });
76
+ }
77
+ if (!installed)
78
+ groups.push({ hooks: [hook] });
79
+ settings.hooks[event] = groups;
80
+ }
81
+ settings.permissions ??= {};
82
+ const allow = settings.permissions.allow ?? [];
83
+ const rule = `Bash(${programPath} *)`;
84
+ const index = allow.findIndex(isOwnedPermissionRule);
85
+ if (index < 0)
86
+ allow.push(rule);
87
+ else
88
+ allow[index] = rule;
89
+ settings.permissions.allow = allow;
90
+ }
91
+ export async function installClaude(options) {
92
+ const settings = await readSettings(options.configDir);
93
+ const writes = [{
94
+ path: join(options.configDir, "skills", APP_NAME, "SKILL.md"),
95
+ content: await readFile(new URL(`../skills/${APP_NAME}/SKILL.md`, import.meta.url), "utf8"),
96
+ }];
97
+ if (settings) {
98
+ updateSettings(settings, options.programPath);
99
+ writes.unshift({
100
+ path: join(options.configDir, "settings.json"),
101
+ content: `${JSON.stringify(settings, null, 2)}\n`,
102
+ });
103
+ }
104
+ else {
105
+ options.writeOutput(MESSAGES.settingsUnparsable);
106
+ }
107
+ for (const write of writes) {
108
+ if (options.dryRun)
109
+ options.writeOutput(`${MESSAGES.dryRunPrefix} ${write.path}`);
110
+ else {
111
+ await mkdir(dirname(write.path), { recursive: true, mode: 0o700 });
112
+ await writeFile(write.path, write.content, { mode: 0o600 });
113
+ }
114
+ }
115
+ if (!options.dryRun && settings)
116
+ options.writeOutput(MESSAGES.installComplete);
117
+ }
118
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type DegradedConnection, type MemoryClient } from "@snoai/memory/client";
2
+ export declare function connectMemory(): Promise<MemoryClient | DegradedConnection>;
3
+ export declare function isDegradedConnection(connection: MemoryClient | DegradedConnection): connection is DegradedConnection;
4
+ //# sourceMappingURL=memory-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-client.d.ts","sourceRoot":"","sources":["../src/memory-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,MAAM,sBAAsB,CAAC;AAG9B,wBAAsB,aAAa,IAAI,OAAO,CAAC,YAAY,GAAG,kBAAkB,CAAC,CAEhF;AAED,wBAAgB,oBAAoB,CACnC,UAAU,EAAE,YAAY,GAAG,kBAAkB,GAC3C,UAAU,IAAI,kBAAkB,CAElC"}
@@ -0,0 +1,9 @@
1
+ import { connect, } from "@snoai/memory/client";
2
+ import { SKIN_ID } from "./constants.js";
3
+ export async function connectMemory() {
4
+ return connect({ skinId: SKIN_ID });
5
+ }
6
+ export function isDegradedConnection(connection) {
7
+ return connection.degraded;
8
+ }
9
+ //# sourceMappingURL=memory-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-client.js","sourceRoot":"","sources":["../src/memory-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,OAAO,GAGP,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,aAAa;IAClC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,UAA6C;IAE7C,OAAO,UAAU,CAAC,QAAQ,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare const MESSAGES: {
2
+ readonly usage: "Usage: sno-mem-claude <session-start|user-prompt-submit|stop|install|doctor|import|recall|get|remember|correct>";
3
+ readonly dryRunPrefix: "would write";
4
+ readonly installComplete: "sno-mem-claude install complete";
5
+ readonly settingsUnparsable: "settings.json parse error; settings preserved";
6
+ readonly importCaptureDisabled: "Automatic capture is off in settings.json (capture.ambient); imported notes will be skipped.";
7
+ readonly doctorUnavailable: "doctor: unavailable";
8
+ };
9
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;aACpB,KAAK,EAAE,iHAAiH;aACxH,YAAY,EAAE,aAAa;aAC3B,eAAe,EAAE,iCAAiC;aAClD,kBAAkB,EAAE,+CAA+C;aACnE,qBAAqB,EAAE,8FAA8F;aACrH,iBAAiB,EAAE,qBAAqB;CAC/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const MESSAGES = {
2
+ usage: "Usage: sno-mem-claude <session-start|user-prompt-submit|stop|install|doctor|import|recall|get|remember|correct>",
3
+ dryRunPrefix: "would write",
4
+ installComplete: "sno-mem-claude install complete",
5
+ settingsUnparsable: "settings.json parse error; settings preserved",
6
+ importCaptureDisabled: "Automatic capture is off in settings.json (capture.ambient); imported notes will be skipped.",
7
+ doctorUnavailable: "doctor: unavailable",
8
+ };
9
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACvB,KAAK,EAAE,iHAAiH;IACxH,YAAY,EAAE,aAAa;IAC3B,eAAe,EAAE,iCAAiC;IAClD,kBAAkB,EAAE,+CAA+C;IACnE,qBAAqB,EAAE,8FAA8F;IACrH,iBAAiB,EAAE,qBAAqB;CAC/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function profileRoot(): string;
2
+ export declare function appStateRoot(): string;
3
+ export declare function sessionPath(sessionId: string): string;
4
+ export declare function spoolDirectory(): string;
5
+ export declare function workerLockPath(): string;
6
+ export declare function workerLogPath(): string;
7
+ export declare function importDirectory(): string;
8
+ export declare function sidecarDiscoveryPath(): string;
9
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
package/dist/paths.js ADDED
@@ -0,0 +1,30 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { APP_NAME } from "./constants.js";
4
+ export function profileRoot() {
5
+ return resolve(process.env["SNO_PROFILE_DIR"] ?? join(homedir(), ".sno"));
6
+ }
7
+ export function appStateRoot() {
8
+ return join(profileRoot(), APP_NAME);
9
+ }
10
+ export function sessionPath(sessionId) {
11
+ if (!/^[a-zA-Z0-9_-]+$/.test(sessionId))
12
+ throw new Error("invalid-session-id");
13
+ return join(appStateRoot(), "sessions", `${sessionId}.json`);
14
+ }
15
+ export function spoolDirectory() {
16
+ return join(appStateRoot(), "spool");
17
+ }
18
+ export function workerLockPath() {
19
+ return join(appStateRoot(), "worker.lock");
20
+ }
21
+ export function workerLogPath() {
22
+ return join(appStateRoot(), "worker.log");
23
+ }
24
+ export function importDirectory() {
25
+ return join(appStateRoot(), "import");
26
+ }
27
+ export function sidecarDiscoveryPath() {
28
+ return join(profileRoot(), "station", "sidecar.json");
29
+ }
30
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,UAAU,WAAW;IAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC5C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa;IAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe;IAC9B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function withinDeadline<T>(run: Promise<T>, timeoutMs: number): Promise<T>;
2
+ //# sourceMappingURL=recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA,wBAAsB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAgBtF"}
package/dist/recall.js ADDED
@@ -0,0 +1,20 @@
1
+ export async function withinDeadline(run, timeoutMs) {
2
+ let timer;
3
+ try {
4
+ return await Promise.race([
5
+ run,
6
+ new Promise((_resolve, reject) => {
7
+ timer = setTimeout(() => {
8
+ const error = new Error("timeout");
9
+ error.name = "TimeoutError";
10
+ reject(error);
11
+ }, timeoutMs);
12
+ }),
13
+ ]);
14
+ }
15
+ finally {
16
+ if (timer)
17
+ clearTimeout(timer);
18
+ }
19
+ }
20
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../src/recall.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,GAAe,EAAE,SAAiB;IACzE,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACJ,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACzB,GAAG;YACH,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACvC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBACvB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;oBACnC,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;gBACf,CAAC,EAAE,SAAS,CAAC,CAAC;YACf,CAAC,CAAC;SACF,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ScopeCtx } from "@snoai/memory/client";
2
+ /** One workspace is the git repository root when `cwd` is inside one, else `cwd` itself. */
3
+ export declare function workspaceRoot(cwd: string): Promise<string>;
4
+ export declare function hookScope(project: string, sessionId: string): ScopeCtx;
5
+ export declare function manualScope(project: string): ScopeCtx;
6
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKrD,4FAA4F;AAC5F,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAOtE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAOrD"}
package/dist/scope.js ADDED
@@ -0,0 +1,36 @@
1
+ import { execFile } from "node:child_process";
2
+ import { resolve } from "node:path";
3
+ import { promisify } from "node:util";
4
+ import { CODING_SKIN_MANUAL_SESSION_ID } from "@snoai/memory/coding-skin";
5
+ const execFileAsync = promisify(execFile);
6
+ /** One workspace is the git repository root when `cwd` is inside one, else `cwd` itself. */
7
+ export async function workspaceRoot(cwd) {
8
+ try {
9
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--show-toplevel"], {
10
+ cwd,
11
+ timeout: 2_000,
12
+ });
13
+ const root = stdout.trim();
14
+ return root.length > 0 ? root : resolve(cwd);
15
+ }
16
+ catch {
17
+ return resolve(cwd);
18
+ }
19
+ }
20
+ export function hookScope(project, sessionId) {
21
+ return {
22
+ principal: "client-replaced-by-sidecar-library",
23
+ project,
24
+ session: sessionId,
25
+ host: { sessionId, workspace: project },
26
+ };
27
+ }
28
+ export function manualScope(project) {
29
+ return {
30
+ principal: "client-replaced-by-sidecar-library",
31
+ project,
32
+ session: CODING_SKIN_MANUAL_SESSION_ID,
33
+ host: { sessionId: CODING_SKIN_MANUAL_SESSION_ID, workspace: project },
34
+ };
35
+ }
36
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAE1E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,4FAA4F;AAC5F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC9C,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC/E,GAAG;YACH,OAAO,EAAE,KAAK;SACd,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,SAAiB;IAC3D,OAAO;QACN,SAAS,EAAE,oCAAoC;QAC/C,OAAO;QACP,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE;KACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IAC1C,OAAO;QACN,SAAS,EAAE,oCAAoC;QAC/C,OAAO;QACP,OAAO,EAAE,6BAA6B;QACtC,IAAI,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,SAAS,EAAE,OAAO,EAAE;KACtE,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ declare const lastSessionSchema: z.ZodObject<{
3
+ sessionId: z.ZodString;
4
+ transcriptPath: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare function readLastSession(project: string): Promise<z.infer<typeof lastSessionSchema> | undefined>;
7
+ export declare function writeLastSession(project: string, sessionId: string, transcriptPath: string): Promise<void>;
8
+ declare const sessionStateSchema: z.ZodObject<{
9
+ sessionId: z.ZodString;
10
+ skillRunsReported: z.ZodDefault<z.ZodNumber>;
11
+ prompts: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
12
+ prompt: z.ZodString;
13
+ at: z.ZodNumber;
14
+ }, z.core.$strip>>>;
15
+ receipt: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ invocations: z.ZodDefault<z.ZodNumber>;
17
+ lookups: z.ZodDefault<z.ZodNumber>;
18
+ itemsInjected: z.ZodDefault<z.ZodNumber>;
19
+ charsInjected: z.ZodDefault<z.ZodNumber>;
20
+ skips: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
21
+ degraded: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
22
+ resets: z.ZodDefault<z.ZodNumber>;
23
+ latencyMs: z.ZodDefault<z.ZodArray<z.ZodNumber>>;
24
+ }, z.core.$strip>>>;
25
+ toolStarts: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
26
+ }, z.core.$strip>;
27
+ export type SessionState = z.infer<typeof sessionStateSchema>;
28
+ export declare function readSession(sessionId: string): Promise<SessionState>;
29
+ export declare function writeSession(state: SessionState): Promise<void>;
30
+ /** Applies `change` to the newest session file under a lock: tool hooks run as parallel processes, and a plain read-then-write lets the last one erase the others. */
31
+ export declare function updateSession(sessionId: string, change: (state: SessionState) => void): Promise<void>;
32
+ export declare function recordInvocation(state: SessionState, event: string, latencyMs: number): void;
33
+ export declare function recordSkip(state: SessionState, event: string, reason: string): void;
34
+ export declare function recordDegraded(state: SessionState, event: string, reason: string): void;
35
+ export declare function recordLookup(state: SessionState, event: string): void;
36
+ export declare function recordInjection(state: SessionState, event: string, items: number, chars: number): void;
37
+ export interface SpoolRecord {
38
+ sessionId: string;
39
+ turnId: string;
40
+ project: string;
41
+ childCwd: string;
42
+ user: string;
43
+ assistant?: string;
44
+ kind?: "turn" | "import";
45
+ importReceipt?: {
46
+ path: string;
47
+ file: string;
48
+ };
49
+ at: number;
50
+ attempts: number;
51
+ state: "pending" | "failed";
52
+ }
53
+ export declare function appendSpool(record: Omit<SpoolRecord, "attempts" | "state">): Promise<string>;
54
+ export {};
55
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,iBAAiB;;;iBAAgF,CAAC;AAMxG,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GAAG,SAAS,CAAC,CAO7G;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhH;AAaD,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;iBAOtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAS1E;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAID,sKAAsK;AACtK,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3G;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK5F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAInF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIvF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAKtG;AAED,MAAM,WAAW,WAAW;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC5B;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlG"}
@@ -0,0 +1,112 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { mkdir, readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { setTimeout as sleep } from "node:timers/promises";
5
+ import { z } from "zod";
6
+ import { acquirePidFileLock, writeJsonAtomic } from "./files.js";
7
+ import { appStateRoot, sessionPath, spoolDirectory } from "./paths.js";
8
+ const lastSessionSchema = z.object({ sessionId: z.string().min(1), transcriptPath: z.string().min(1) });
9
+ function lastSessionPath(project) {
10
+ return join(appStateRoot(), "last-session", `${createHash("sha256").update(project).digest("hex")}.json`);
11
+ }
12
+ export async function readLastSession(project) {
13
+ try {
14
+ return lastSessionSchema.parse(JSON.parse(await readFile(lastSessionPath(project), "utf8")));
15
+ }
16
+ catch (error) {
17
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
18
+ return undefined;
19
+ throw error;
20
+ }
21
+ }
22
+ export async function writeLastSession(project, sessionId, transcriptPath) {
23
+ await writeJsonAtomic(lastSessionPath(project), { sessionId, transcriptPath });
24
+ }
25
+ const receiptEventSchema = z.object({
26
+ invocations: z.number().int().nonnegative().default(0),
27
+ lookups: z.number().int().nonnegative().default(0),
28
+ itemsInjected: z.number().int().nonnegative().default(0),
29
+ charsInjected: z.number().int().nonnegative().default(0),
30
+ skips: z.record(z.string(), z.number().int().nonnegative()).default({}),
31
+ degraded: z.record(z.string(), z.number().int().nonnegative()).default({}),
32
+ resets: z.number().int().nonnegative().default(0),
33
+ latencyMs: z.array(z.number().int().nonnegative()).default([]),
34
+ });
35
+ const sessionStateSchema = z.object({
36
+ sessionId: z.string().min(1),
37
+ skillRunsReported: z.number().int().nonnegative().default(0),
38
+ prompts: z.record(z.string(), z.object({ prompt: z.string(), at: z.number() })).default({}),
39
+ receipt: z.record(z.string(), receiptEventSchema).default({}),
40
+ /** PreToolUse arrival time by tool_use_id, consumed by PostToolUse to measure the call. */
41
+ toolStarts: z.record(z.string(), z.number()).default({}),
42
+ });
43
+ export async function readSession(sessionId) {
44
+ try {
45
+ return sessionStateSchema.parse(JSON.parse(await readFile(sessionPath(sessionId), "utf8")));
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
49
+ return sessionStateSchema.parse({ sessionId });
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ export async function writeSession(state) {
55
+ await writeJsonAtomic(sessionPath(state.sessionId), state);
56
+ }
57
+ const SESSION_LOCK_WAIT_MS = 2000;
58
+ /** Applies `change` to the newest session file under a lock: tool hooks run as parallel processes, and a plain read-then-write lets the last one erase the others. */
59
+ export async function updateSession(sessionId, change) {
60
+ const lockPath = `${sessionPath(sessionId)}.lock`;
61
+ const deadline = Date.now() + SESSION_LOCK_WAIT_MS;
62
+ let lock = await acquirePidFileLock(lockPath, SESSION_LOCK_WAIT_MS);
63
+ while (!lock) {
64
+ if (Date.now() >= deadline)
65
+ throw new Error("session-state-busy");
66
+ await sleep(10);
67
+ lock = await acquirePidFileLock(lockPath, SESSION_LOCK_WAIT_MS);
68
+ }
69
+ try {
70
+ const state = await readSession(sessionId);
71
+ change(state);
72
+ await writeSession(state);
73
+ }
74
+ finally {
75
+ await lock.release();
76
+ }
77
+ }
78
+ export function recordInvocation(state, event, latencyMs) {
79
+ const receipt = state.receipt[event] ?? receiptEventSchema.parse({});
80
+ receipt.invocations += 1;
81
+ receipt.latencyMs.push(Math.max(0, Math.round(latencyMs)));
82
+ state.receipt[event] = receipt;
83
+ }
84
+ export function recordSkip(state, event, reason) {
85
+ const receipt = state.receipt[event] ?? receiptEventSchema.parse({});
86
+ receipt.skips[reason] = (receipt.skips[reason] ?? 0) + 1;
87
+ state.receipt[event] = receipt;
88
+ }
89
+ export function recordDegraded(state, event, reason) {
90
+ const receipt = state.receipt[event] ?? receiptEventSchema.parse({});
91
+ receipt.degraded[reason] = (receipt.degraded[reason] ?? 0) + 1;
92
+ state.receipt[event] = receipt;
93
+ }
94
+ export function recordLookup(state, event) {
95
+ const receipt = state.receipt[event] ?? receiptEventSchema.parse({});
96
+ receipt.lookups += 1;
97
+ state.receipt[event] = receipt;
98
+ }
99
+ export function recordInjection(state, event, items, chars) {
100
+ const receipt = state.receipt[event] ?? receiptEventSchema.parse({});
101
+ receipt.itemsInjected += items;
102
+ receipt.charsInjected += chars;
103
+ state.receipt[event] = receipt;
104
+ }
105
+ export async function appendSpool(record) {
106
+ const directory = spoolDirectory();
107
+ await mkdir(directory, { recursive: true, mode: 0o700 });
108
+ const path = join(directory, `${String(record.at).padStart(16, "0")}-${randomUUID()}.json`);
109
+ await writeJsonAtomic(path, { ...record, attempts: 0, state: "pending" });
110
+ return path;
111
+ }
112
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ declare const recallSchema: z.ZodObject<{
3
+ auto: z.ZodBoolean;
4
+ sessionStart: z.ZodObject<{
5
+ limit: z.ZodNumber;
6
+ maxChars: z.ZodNumber;
7
+ timeoutMs: z.ZodNumber;
8
+ }, z.core.$strip>;
9
+ prompt: z.ZodObject<{
10
+ limit: z.ZodNumber;
11
+ maxChars: z.ZodNumber;
12
+ timeoutMs: z.ZodNumber;
13
+ minChars: z.ZodNumber;
14
+ minScore: z.ZodNumber;
15
+ }, z.core.$strip>;
16
+ explicitLimit: z.ZodNumber;
17
+ }, z.core.$strip>;
18
+ export declare function readRecallSettings(): z.infer<typeof recallSchema>;
19
+ export declare function readCaptureSettings(): {
20
+ ambient: boolean;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;iBAKhB,CAAC;AAeH,wBAAgB,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAEjE;AAED,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAE1D"}
@@ -0,0 +1,33 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { z } from "zod";
4
+ import { profileRoot } from "./paths.js";
5
+ const recallSchema = z.object({
6
+ auto: z.boolean(),
7
+ sessionStart: z.object({ limit: z.number(), maxChars: z.number(), timeoutMs: z.number() }),
8
+ prompt: z.object({ limit: z.number(), maxChars: z.number(), timeoutMs: z.number(), minChars: z.number(), minScore: z.number() }),
9
+ explicitLimit: z.number(),
10
+ });
11
+ function readSettings() {
12
+ const path = join(profileRoot(), "settings.json");
13
+ let raw;
14
+ try {
15
+ raw = JSON.parse(readFileSync(path, "utf8"));
16
+ }
17
+ catch {
18
+ throw new Error(`settings unavailable: ${path}: file; see https://github.com/sno-ai/sno-station/blob/main/docs/memory-setup.md`);
19
+ }
20
+ const parsed = z.object({ recall: recallSchema, capture: z.object({ ambient: z.boolean() }), memoryPackage: z.object({ path: z.string().min(1), node: z.string().min(1) }) }).safeParse(raw);
21
+ if (!parsed.success) {
22
+ const field = parsed.error.issues[0]?.path.join(".") || "recall";
23
+ throw new Error(`settings unavailable: ${path}: ${field}; see https://github.com/sno-ai/sno-station/blob/main/docs/memory-setup.md`);
24
+ }
25
+ return parsed.data;
26
+ }
27
+ export function readRecallSettings() {
28
+ return readSettings().recall;
29
+ }
30
+ export function readCaptureSettings() {
31
+ return readSettings().capture;
32
+ }
33
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACjB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAChI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC;AAEH,SAAS,YAAY;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IACrD,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,kFAAkF,CAAC,CAAC;IAAC,CAAC;IAC3I,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7L,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,KAAK,KAAK,4EAA4E,CAAC,CAAC;IACtI,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,OAAO,YAAY,EAAE,CAAC,OAAO,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type appendObserveLedgerRows } from "@snoai/memory/coding-skin";
2
+ export declare function readSkillRuns(input: {
3
+ session_id: string;
4
+ cwd: string;
5
+ transcript_path?: string | undefined;
6
+ }): Promise<Parameters<typeof appendObserveLedgerRows>[1]>;
7
+ //# sourceMappingURL=skill-runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-runs.d.ts","sourceRoot":"","sources":["../src/skill-runs.ts"],"names":[],"mappings":"AAGA,OAAO,EAGN,KAAK,uBAAuB,EAC5B,MAAM,2BAA2B,CAAC;AAqFnC,wBAAsB,aAAa,CAAC,KAAK,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAwBzD"}