@kilospark/nairo 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/api.d.ts +16 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +102 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/auth-browser.d.ts +5 -0
  6. package/dist/auth-browser.d.ts.map +1 -0
  7. package/dist/auth-browser.js +217 -0
  8. package/dist/auth-browser.js.map +1 -0
  9. package/dist/commands/bootstrap.d.ts +5 -0
  10. package/dist/commands/bootstrap.d.ts.map +1 -0
  11. package/dist/commands/bootstrap.js +363 -0
  12. package/dist/commands/bootstrap.js.map +1 -0
  13. package/dist/commands/delete.d.ts +4 -0
  14. package/dist/commands/delete.d.ts.map +1 -0
  15. package/dist/commands/delete.js +64 -0
  16. package/dist/commands/delete.js.map +1 -0
  17. package/dist/commands/export.d.ts +4 -0
  18. package/dist/commands/export.d.ts.map +1 -0
  19. package/dist/commands/export.js +25 -0
  20. package/dist/commands/export.js.map +1 -0
  21. package/dist/commands/hook.d.ts +4 -0
  22. package/dist/commands/hook.d.ts.map +1 -0
  23. package/dist/commands/hook.js +242 -0
  24. package/dist/commands/hook.js.map +1 -0
  25. package/dist/commands/import.d.ts +2 -0
  26. package/dist/commands/import.d.ts.map +1 -0
  27. package/dist/commands/import.js +210 -0
  28. package/dist/commands/import.js.map +1 -0
  29. package/dist/commands/install.d.ts +9 -0
  30. package/dist/commands/install.d.ts.map +1 -0
  31. package/dist/commands/install.js +282 -0
  32. package/dist/commands/install.js.map +1 -0
  33. package/dist/commands/list.d.ts +5 -0
  34. package/dist/commands/list.d.ts.map +1 -0
  35. package/dist/commands/list.js +90 -0
  36. package/dist/commands/list.js.map +1 -0
  37. package/dist/commands/login.d.ts +2 -0
  38. package/dist/commands/login.d.ts.map +1 -0
  39. package/dist/commands/login.js +24 -0
  40. package/dist/commands/login.js.map +1 -0
  41. package/dist/commands/search.d.ts +4 -0
  42. package/dist/commands/search.d.ts.map +1 -0
  43. package/dist/commands/search.js +42 -0
  44. package/dist/commands/search.js.map +1 -0
  45. package/dist/commands/signup.d.ts +2 -0
  46. package/dist/commands/signup.d.ts.map +1 -0
  47. package/dist/commands/signup.js +6 -0
  48. package/dist/commands/signup.js.map +1 -0
  49. package/dist/config.d.ts +10 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +35 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +93 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/prompt.d.ts +10 -0
  58. package/dist/prompt.d.ts.map +1 -0
  59. package/dist/prompt.js +37 -0
  60. package/dist/prompt.js.map +1 -0
  61. package/dist/tools/configure.d.ts +9 -0
  62. package/dist/tools/configure.d.ts.map +1 -0
  63. package/dist/tools/configure.js +326 -0
  64. package/dist/tools/configure.js.map +1 -0
  65. package/dist/tools/detect.d.ts +7 -0
  66. package/dist/tools/detect.d.ts.map +1 -0
  67. package/dist/tools/detect.js +125 -0
  68. package/dist/tools/detect.js.map +1 -0
  69. package/package.json +24 -0
@@ -0,0 +1,363 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { gzipSync } from "node:zlib";
3
+ import { homedir } from "node:os";
4
+ import { basename, join } from "node:path";
5
+ import { getConfig } from "../config.js";
6
+ import { apiClient } from "../api.js";
7
+ import { prompt } from "../prompt.js";
8
+ const SCAN_FILES = [
9
+ "README.md",
10
+ "package.json",
11
+ "pyproject.toml",
12
+ "go.mod",
13
+ "tsconfig.json",
14
+ "CONTRIBUTING.md",
15
+ "CLAUDE.md",
16
+ "Cargo.toml",
17
+ "turbo.json",
18
+ "pnpm-workspace.yaml",
19
+ "lerna.json",
20
+ "nx.json",
21
+ "drizzle.config.ts",
22
+ "drizzle.config.js",
23
+ "Dockerfile",
24
+ "docker-compose.yml",
25
+ "docker-compose.yaml",
26
+ ".github/workflows/ci.yml",
27
+ ".github/workflows/ci.yaml",
28
+ ];
29
+ const SCAN_GLOBS = [
30
+ ".eslintrc",
31
+ ".eslintrc.js",
32
+ ".eslintrc.json",
33
+ ".eslintrc.yml",
34
+ ".eslintrc.yaml",
35
+ "eslint.config.js",
36
+ "eslint.config.mjs",
37
+ "eslint.config.cjs",
38
+ ];
39
+ /** Directories to scan for workspace package config files */
40
+ const WORKSPACE_DIRS = ["apps", "packages", "services", "libs", "modules"];
41
+ function isYes(value) {
42
+ const v = value.trim().toLowerCase();
43
+ return v === "y" || v === "yes";
44
+ }
45
+ function tryReadFile(filePath) {
46
+ try {
47
+ if (existsSync(filePath)) {
48
+ const content = readFileSync(filePath, "utf-8");
49
+ return content.trim() ? content : null;
50
+ }
51
+ }
52
+ catch {
53
+ // skip unreadable files
54
+ }
55
+ return null;
56
+ }
57
+ function scanProjectFiles(cwd) {
58
+ const files = [];
59
+ const seen = new Set();
60
+ function addFile(name, content) {
61
+ if (!seen.has(name)) {
62
+ seen.add(name);
63
+ files.push({ name, content });
64
+ }
65
+ }
66
+ // Scan known root files
67
+ for (const name of [...SCAN_FILES, ...SCAN_GLOBS]) {
68
+ const content = tryReadFile(join(cwd, name));
69
+ if (content !== null)
70
+ addFile(name, content);
71
+ }
72
+ // Scan workspace package directories (monorepo support)
73
+ for (const wsDir of WORKSPACE_DIRS) {
74
+ const wsDirPath = join(cwd, wsDir);
75
+ if (!existsSync(wsDirPath))
76
+ continue;
77
+ try {
78
+ const packages = readdirSync(wsDirPath);
79
+ for (const pkg of packages) {
80
+ const pkgDir = join(wsDirPath, pkg);
81
+ for (const name of ["package.json", "README.md", "CLAUDE.md", "tsconfig.json", "Cargo.toml", "pyproject.toml"]) {
82
+ const content = tryReadFile(join(pkgDir, name));
83
+ if (content !== null)
84
+ addFile(`${wsDir}/${pkg}/${name}`, content);
85
+ }
86
+ }
87
+ }
88
+ catch {
89
+ // skip
90
+ }
91
+ }
92
+ // Scan docs/adr/* and docs/decisions/*
93
+ for (const docsDir of ["docs/adr", "docs/decisions"]) {
94
+ const dirPath = join(cwd, docsDir);
95
+ if (!existsSync(dirPath))
96
+ continue;
97
+ try {
98
+ const entries = readdirSync(dirPath);
99
+ for (const entry of entries) {
100
+ const content = tryReadFile(join(dirPath, entry));
101
+ if (content !== null)
102
+ addFile(`${docsDir}/${entry}`, content);
103
+ }
104
+ }
105
+ catch {
106
+ // skip
107
+ }
108
+ }
109
+ return files;
110
+ }
111
+ function scanPreferenceSources(cwd) {
112
+ const sources = [];
113
+ const home = homedir();
114
+ // Claude Code conversation transcripts for this project
115
+ const projectDirName = cwd.replace(/\//g, "-");
116
+ const claudeProjectDir = join(home, ".claude", "projects", projectDirName);
117
+ if (existsSync(claudeProjectDir)) {
118
+ const transcripts = [];
119
+ try {
120
+ const entries = readdirSync(claudeProjectDir);
121
+ // Get .jsonl files, sorted by mtime descending, take most recent 5
122
+ const jsonlFiles = entries
123
+ .filter((e) => e.endsWith(".jsonl"))
124
+ .map((e) => ({
125
+ name: e,
126
+ path: join(claudeProjectDir, e),
127
+ mtime: statSync(join(claudeProjectDir, e)).mtimeMs,
128
+ size: statSync(join(claudeProjectDir, e)).size,
129
+ }))
130
+ .filter((e) => e.size > 1000) // skip tiny/empty sessions
131
+ .sort((a, b) => b.mtime - a.mtime)
132
+ .slice(0, 5);
133
+ for (const f of jsonlFiles) {
134
+ const content = tryReadFile(f.path);
135
+ if (content) {
136
+ // Keep only last 2000 lines per transcript to stay within payload limits
137
+ const lines = content.split("\n");
138
+ const trimmed = lines.length > 2000
139
+ ? lines.slice(-2000).join("\n")
140
+ : content;
141
+ transcripts.push({
142
+ archivePath: `claude/${f.name}`,
143
+ originalPath: f.path,
144
+ content: trimmed,
145
+ });
146
+ }
147
+ }
148
+ }
149
+ catch {
150
+ // skip
151
+ }
152
+ if (transcripts.length > 0) {
153
+ sources.push({ label: "claude", files: transcripts });
154
+ }
155
+ }
156
+ // Freeform preference files (CLAUDE.md, .cursorrules, etc.)
157
+ // Wrap them as synthetic Claude JSONL so the parser handles them
158
+ const prefFiles = [];
159
+ function addPrefFile(name, content, originalPath) {
160
+ // Wrap as a single-message JSONL so parseClaudeJSONL picks it up
161
+ const jsonl = JSON.stringify({
162
+ type: "user",
163
+ message: { role: "user", content: `[Preferences from ${name}]:\n${content}` },
164
+ });
165
+ prefFiles.push({ archivePath: `preferences/${name}`, originalPath, content: jsonl });
166
+ }
167
+ const globalClaude = tryReadFile(join(home, ".claude", "CLAUDE.md"));
168
+ if (globalClaude)
169
+ addPrefFile("global-claude.md", globalClaude, join(home, ".claude", "CLAUDE.md"));
170
+ const projectClaude = tryReadFile(join(cwd, ".claude", "CLAUDE.md"));
171
+ if (projectClaude)
172
+ addPrefFile("project-claude.md", projectClaude, join(cwd, ".claude", "CLAUDE.md"));
173
+ const cursorrules = tryReadFile(join(cwd, ".cursorrules"));
174
+ if (cursorrules)
175
+ addPrefFile("cursorrules", cursorrules, join(cwd, ".cursorrules"));
176
+ const cursorRulesDir = join(cwd, ".cursor", "rules");
177
+ if (existsSync(cursorRulesDir)) {
178
+ try {
179
+ for (const entry of readdirSync(cursorRulesDir)) {
180
+ const content = tryReadFile(join(cursorRulesDir, entry));
181
+ if (content)
182
+ addPrefFile(`cursor-rule-${entry}`, content, join(cursorRulesDir, entry));
183
+ }
184
+ }
185
+ catch { /* skip */ }
186
+ }
187
+ const cursorGlobalDir = join(home, ".cursor", "rules");
188
+ if (existsSync(cursorGlobalDir)) {
189
+ try {
190
+ for (const entry of readdirSync(cursorGlobalDir)) {
191
+ const content = tryReadFile(join(cursorGlobalDir, entry));
192
+ if (content)
193
+ addPrefFile(`cursor-global-${entry}`, content, join(cursorGlobalDir, entry));
194
+ }
195
+ }
196
+ catch { /* skip */ }
197
+ }
198
+ const copilot = tryReadFile(join(cwd, ".github", "copilot-instructions.md"));
199
+ if (copilot)
200
+ addPrefFile("copilot-instructions.md", copilot, join(cwd, ".github", "copilot-instructions.md"));
201
+ const windsurf = tryReadFile(join(cwd, ".windsurfrules"));
202
+ if (windsurf)
203
+ addPrefFile("windsurfrules", windsurf, join(cwd, ".windsurfrules"));
204
+ if (prefFiles.length > 0) {
205
+ sources.push({ label: "claude", files: prefFiles });
206
+ }
207
+ return sources;
208
+ }
209
+ /**
210
+ * Build a gzip-compressed import archive from preference sources.
211
+ */
212
+ function buildImportArchive(sources) {
213
+ const manifest = {
214
+ sources: sources.map((s) => ({
215
+ label: s.label,
216
+ rootPath: "",
217
+ files: s.files.map((f) => ({
218
+ archivePath: f.archivePath,
219
+ originalPath: f.originalPath,
220
+ })),
221
+ })),
222
+ };
223
+ const files = {};
224
+ for (const source of sources) {
225
+ for (const f of source.files) {
226
+ files[f.archivePath] = f.content;
227
+ }
228
+ }
229
+ const payload = JSON.stringify({ manifest, files });
230
+ return Buffer.from(gzipSync(Buffer.from(payload, "utf-8")));
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Main bootstrap command
234
+ // ---------------------------------------------------------------------------
235
+ export async function bootstrapCommand(options) {
236
+ getConfig();
237
+ const cwd = process.cwd();
238
+ const projectName = options.project ?? basename(cwd);
239
+ console.log(`Bootstrapping project: ${projectName}\n`);
240
+ // Step 1: Find or create project
241
+ let projectId;
242
+ try {
243
+ const projectsResp = await apiClient("/api/projects");
244
+ const existing = projectsResp.projects.find((p) => p.name === projectName);
245
+ if (existing) {
246
+ projectId = existing.id;
247
+ console.log(`Using existing project: ${projectName} (${projectId})\n`);
248
+ }
249
+ else {
250
+ const created = await apiClient("/api/projects", {
251
+ method: "POST",
252
+ body: { name: projectName },
253
+ });
254
+ projectId = created.project.id;
255
+ console.log(`Created project: ${projectName} (${projectId})\n`);
256
+ }
257
+ }
258
+ catch (error) {
259
+ const message = error instanceof Error ? error.message : String(error);
260
+ console.error(`Failed to set up project: ${message}`);
261
+ process.exit(1);
262
+ }
263
+ // Step 2: Scan and analyze project files (rule-based, fast)
264
+ console.log("Scanning project files...");
265
+ const files = scanProjectFiles(cwd);
266
+ if (files.length > 0) {
267
+ console.log(`Found ${files.length} project file(s). Analyzing...`);
268
+ try {
269
+ const resp = await apiClient("/api/bootstrap", {
270
+ method: "POST",
271
+ body: { projectId, files },
272
+ });
273
+ const events = resp.events;
274
+ if (events.length > 0) {
275
+ console.log(`Extracted ${events.length} project convention(s).\n`);
276
+ let saved = 0;
277
+ for (const event of events) {
278
+ try {
279
+ await apiClient("/api/events", {
280
+ method: "POST",
281
+ body: {
282
+ projectId,
283
+ type: event.type,
284
+ summary: event.summary,
285
+ confidence: event.confidence,
286
+ trigger: event.trigger ?? "prompted",
287
+ source: event.source ?? "system",
288
+ confirmationStatus: "confirmed",
289
+ },
290
+ });
291
+ saved++;
292
+ }
293
+ catch {
294
+ // skip individual failures
295
+ }
296
+ }
297
+ console.log(`Saved ${saved} project convention(s).`);
298
+ }
299
+ else {
300
+ console.log("No project conventions extracted.");
301
+ }
302
+ }
303
+ catch (error) {
304
+ const message = error instanceof Error ? error.message : String(error);
305
+ console.error(`Project analysis failed: ${message}`);
306
+ }
307
+ }
308
+ // Step 3: Check for pre-existing user preferences
309
+ const prefSources = scanPreferenceSources(cwd);
310
+ const totalPrefFiles = prefSources.reduce((sum, s) => sum + s.files.length, 0);
311
+ if (totalPrefFiles === 0) {
312
+ console.log("\nNo pre-existing preferences found.");
313
+ return;
314
+ }
315
+ // Show what was found
316
+ console.log(`\nFound ${totalPrefFiles} preference source(s):`);
317
+ for (const source of prefSources) {
318
+ for (const f of source.files) {
319
+ const sizeMB = (f.content.length / 1024 / 1024).toFixed(1);
320
+ console.log(` - ${f.archivePath} (${sizeMB} MB)`);
321
+ }
322
+ }
323
+ // Single prompt
324
+ let importPrefs = options.yes;
325
+ if (!importPrefs) {
326
+ const answer = await prompt("\nImport pre-existing preferences? [Y/n]: ");
327
+ importPrefs = !answer.trim() || isYes(answer);
328
+ }
329
+ if (!importPrefs) {
330
+ console.log("Skipped preference import.");
331
+ return;
332
+ }
333
+ // Step 4: Package and send to import pipeline
334
+ console.log("\nPackaging preferences for analysis...");
335
+ const archive = buildImportArchive(prefSources);
336
+ console.log(`Archive size: ${(archive.length / 1024).toFixed(0)} KB`);
337
+ try {
338
+ const config = getConfig();
339
+ const url = `${config.apiUrl}/api/import-memories`;
340
+ const response = await fetch(url, {
341
+ method: "POST",
342
+ headers: {
343
+ "Authorization": `Bearer ${config.apiKey}`,
344
+ "Content-Type": "application/gzip",
345
+ "x-nairo-project-id": projectId,
346
+ },
347
+ body: new Uint8Array(archive),
348
+ });
349
+ if (!response.ok) {
350
+ const data = await response.json().catch(() => ({}));
351
+ throw new Error(data.error || `HTTP ${response.status}`);
352
+ }
353
+ const result = await response.json();
354
+ console.log(`\nPreference import started (${result.fileCount} file(s)).`);
355
+ console.log("Memories will be extracted in the background and appear as pending events.");
356
+ console.log(`Import ID: ${result.importId}`);
357
+ }
358
+ catch (error) {
359
+ const message = error instanceof Error ? error.message : String(error);
360
+ console.error(`Preference import failed: ${message}`);
361
+ }
362
+ }
363
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function deleteCommand(eventId: string | undefined, options: {
2
+ all?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA2Ef"}
@@ -0,0 +1,64 @@
1
+ import { getConfig } from "../config.js";
2
+ import { apiClient } from "../api.js";
3
+ import { prompt } from "../prompt.js";
4
+ export async function deleteCommand(eventId, options) {
5
+ const config = getConfig();
6
+ if (options.all) {
7
+ // Delete all events — double confirmation
8
+ const answer1 = await prompt("Are you sure you want to delete ALL events? (yes/no): ");
9
+ if (answer1.toLowerCase() !== "yes") {
10
+ console.log("Cancelled.");
11
+ return;
12
+ }
13
+ const answer2 = await prompt("This cannot be undone. Type 'delete all' to confirm: ");
14
+ if (answer2 !== "delete all") {
15
+ console.log("Cancelled.");
16
+ return;
17
+ }
18
+ try {
19
+ // Get all projects, then delete all events from each
20
+ const projectsResp = await apiClient("/api/projects");
21
+ let totalDeleted = 0;
22
+ for (const project of projectsResp.projects) {
23
+ const eventsResp = await apiClient(`/api/events?projectId=${project.id}&limit=200`);
24
+ for (const event of eventsResp.events) {
25
+ try {
26
+ await apiClient(`/api/events/${event.id}`, { method: "DELETE" });
27
+ totalDeleted++;
28
+ }
29
+ catch {
30
+ // continue on individual failures
31
+ }
32
+ }
33
+ }
34
+ console.log(`Deleted ${totalDeleted} event(s).`);
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ console.error(`Delete failed: ${message}`);
39
+ process.exit(1);
40
+ }
41
+ return;
42
+ }
43
+ if (!eventId) {
44
+ console.error("Please provide an event ID, or use --all to delete all events.");
45
+ console.error("Usage: nairo delete <eventId>");
46
+ process.exit(1);
47
+ }
48
+ // Delete a single event
49
+ const answer = await prompt(`Are you sure you want to delete event ${eventId}? (y/n): `);
50
+ if (answer.toLowerCase() !== "y" && answer.toLowerCase() !== "yes") {
51
+ console.log("Cancelled.");
52
+ return;
53
+ }
54
+ try {
55
+ await apiClient(`/api/events/${eventId}`, { method: "DELETE" });
56
+ console.log(`Event ${eventId} deleted.`);
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ console.error(`Delete failed: ${message}`);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function exportCommand(options: {
2
+ output?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAYA,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhB"}
@@ -0,0 +1,25 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { getConfig } from "../config.js";
4
+ import { apiClient } from "../api.js";
5
+ export async function exportCommand(options) {
6
+ const config = getConfig();
7
+ const outputPath = options.output
8
+ ? resolve(options.output)
9
+ : join(process.cwd(), "nairo-export.json");
10
+ console.log("Exporting data...\n");
11
+ try {
12
+ const data = await apiClient("/api/export");
13
+ writeFileSync(outputPath, JSON.stringify(data, null, 2), "utf-8");
14
+ console.log(`Export saved to: ${outputPath}`);
15
+ console.log(` Projects: ${data.projects.length}`);
16
+ console.log(` Events: ${data.events.length}`);
17
+ console.log(` Exported: ${data.exportedAt}`);
18
+ }
19
+ catch (error) {
20
+ const message = error instanceof Error ? error.message : String(error);
21
+ console.error(`Export failed: ${message}`);
22
+ process.exit(1);
23
+ }
24
+ }
25
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAStC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAEnC;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;QAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,aAAa,CAAC,CAAC;QAExD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAElE,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function hookPostToolUse(): Promise<void>;
2
+ export declare function hookSessionStart(): Promise<void>;
3
+ export declare function hookSessionEnd(): Promise<void>;
4
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAuJA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCrD;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCtD;AAMD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BpD"}