claude-pager 0.2.2 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -4
- package/dist/channels/telegram/provider.d.ts.map +1 -1
- package/dist/channels/telegram/provider.js +14 -0
- package/dist/channels/telegram/provider.js.map +1 -1
- package/dist/cli/index.js +45 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/handlers.d.ts.map +1 -1
- package/dist/daemon/handlers.js +4 -3
- package/dist/daemon/handlers.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +160 -2
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/enricher.d.ts +3 -0
- package/dist/dashboard/enricher.d.ts.map +1 -1
- package/dist/dashboard/enricher.js +11 -6
- package/dist/dashboard/enricher.js.map +1 -1
- package/dist/dashboard/git-status.d.ts +1 -1
- package/dist/dashboard/git-status.d.ts.map +1 -1
- package/dist/dashboard/git-status.js +14 -12
- package/dist/dashboard/git-status.js.map +1 -1
- package/dist/dashboard/html.d.ts +1 -1
- package/dist/dashboard/html.d.ts.map +1 -1
- package/dist/dashboard/html.js +481 -6
- package/dist/dashboard/html.js.map +1 -1
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +12 -0
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/sse.d.ts +5 -0
- package/dist/dashboard/sse.d.ts.map +1 -0
- package/dist/dashboard/sse.js +45 -0
- package/dist/dashboard/sse.js.map +1 -0
- package/dist/hooks/index.js +40 -5
- package/dist/hooks/index.js.map +1 -1
- package/dist/injectors/composite.d.ts +10 -0
- package/dist/injectors/composite.d.ts.map +1 -0
- package/dist/injectors/composite.js +27 -0
- package/dist/injectors/composite.js.map +1 -0
- package/dist/injectors/factory.d.ts.map +1 -1
- package/dist/injectors/factory.js +8 -5
- package/dist/injectors/factory.js.map +1 -1
- package/dist/injectors/vscode/injector.d.ts +8 -0
- package/dist/injectors/vscode/injector.d.ts.map +1 -0
- package/dist/injectors/vscode/injector.js +38 -0
- package/dist/injectors/vscode/injector.js.map +1 -0
- package/dist/notes/__tests__/store.test.d.ts +2 -0
- package/dist/notes/__tests__/store.test.d.ts.map +1 -0
- package/dist/notes/__tests__/store.test.js +88 -0
- package/dist/notes/__tests__/store.test.js.map +1 -0
- package/dist/notes/store.d.ts +27 -0
- package/dist/notes/store.d.ts.map +1 -0
- package/dist/notes/store.js +174 -0
- package/dist/notes/store.js.map +1 -0
- package/dist/sessions/helpers.d.ts +4 -0
- package/dist/sessions/helpers.d.ts.map +1 -0
- package/dist/sessions/helpers.js +8 -0
- package/dist/sessions/helpers.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/voice/transcribe.js +1 -1
- package/dist/voice/transcribe.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/dashboard/sse.ts"],"names":[],"mappings":";;AAsBA,oCAIC;AAED,oCASC;AAED,wCAEC;AAvCD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;AACxC,IAAI,cAAc,GAA0C,IAAI,CAAC;AAEjE,SAAS,cAAc;IACrB,IAAI,cAAc;QAAE,OAAO;IAC3B,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;YACzC,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,MAAM,CAAC,CAAC;AACb,CAAC;AAED,SAAgB,YAAY,CAAC,KAAmB;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,cAAc,EAAE,CAAC;AACnB,CAAC;AAED,SAAgB,YAAY,CAAC,SAAS,GAAG,SAAS;IAChD,MAAM,OAAO,GAAG,UAAU,SAAS,WAAW,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -18,6 +18,9 @@ async function readStdin() {
|
|
|
18
18
|
return Buffer.concat(chunks).toString('utf-8');
|
|
19
19
|
}
|
|
20
20
|
function getActiveWindowId() {
|
|
21
|
+
// xdotool is X11-only — skip on macOS/Windows where it can't help anyway
|
|
22
|
+
if (process.platform !== 'linux')
|
|
23
|
+
return undefined;
|
|
21
24
|
try {
|
|
22
25
|
const out = (0, node_child_process_1.execFileSync)('xdotool', ['getactivewindow'], { timeout: 2000 });
|
|
23
26
|
return parseInt(out.toString().trim(), 10) || undefined;
|
|
@@ -41,16 +44,30 @@ function findToolUseInFile(filePath, maxLines) {
|
|
|
41
44
|
if (input?.command) {
|
|
42
45
|
toolInput = input.command;
|
|
43
46
|
}
|
|
47
|
+
else if (input?.old_string != null && input?.new_string != null) {
|
|
48
|
+
// Edit tool — show diff-like view
|
|
49
|
+
const file = input.file_path || '';
|
|
50
|
+
const old = String(input.old_string).slice(0, 300);
|
|
51
|
+
const nw = String(input.new_string).slice(0, 300);
|
|
52
|
+
toolInput = `${file}\n--- old\n${old}\n+++ new\n${nw}`;
|
|
53
|
+
}
|
|
54
|
+
else if (input?.file_path && input?.content) {
|
|
55
|
+
toolInput = `${input.file_path}\n${String(input.content).slice(0, 150)}`;
|
|
56
|
+
}
|
|
44
57
|
else if (input?.file_path) {
|
|
45
58
|
toolInput = input.file_path;
|
|
46
59
|
}
|
|
47
|
-
else if (input?.content) {
|
|
48
|
-
toolInput = `${input.file_path || ''}\n${String(input.content).slice(0, 150)}`;
|
|
49
|
-
}
|
|
50
60
|
else if (typeof input === 'object') {
|
|
51
61
|
toolInput = JSON.stringify(input).slice(0, 200);
|
|
52
62
|
}
|
|
53
|
-
|
|
63
|
+
// Extract assistant text from same message as context
|
|
64
|
+
const textBlocks = entry.message.content
|
|
65
|
+
.filter((b) => b.type === 'text' && b.text)
|
|
66
|
+
.map((b) => b.text);
|
|
67
|
+
const context = textBlocks.length > 0
|
|
68
|
+
? textBlocks.join('\n').slice(-500)
|
|
69
|
+
: undefined;
|
|
70
|
+
return { toolName: block.name, toolInput, context };
|
|
54
71
|
}
|
|
55
72
|
}
|
|
56
73
|
}
|
|
@@ -120,6 +137,9 @@ function extractLastAssistantMessage(transcriptPath) {
|
|
|
120
137
|
async function handleSessionStart() {
|
|
121
138
|
const input = await readStdin();
|
|
122
139
|
const data = JSON.parse(input);
|
|
140
|
+
const vscodePort = process.env.CLAUDE_PAGER_VSCODE_PORT
|
|
141
|
+
? parseInt(process.env.CLAUDE_PAGER_VSCODE_PORT, 10)
|
|
142
|
+
: undefined;
|
|
123
143
|
const info = {
|
|
124
144
|
sessionId: data.session_id,
|
|
125
145
|
pid: process.ppid,
|
|
@@ -127,10 +147,25 @@ async function handleSessionStart() {
|
|
|
127
147
|
cwd: data.cwd || process.cwd(),
|
|
128
148
|
windowId: getActiveWindowId(),
|
|
129
149
|
tmuxPane: process.env.TMUX_PANE || undefined,
|
|
150
|
+
vscodePort: vscodePort || undefined,
|
|
130
151
|
timestamp: Date.now(),
|
|
131
152
|
};
|
|
132
153
|
(0, index_js_1.ensureDataDir)();
|
|
133
154
|
(0, tracker_js_1.registerSession)(info);
|
|
155
|
+
// Register with VS Code extension for terminal mapping
|
|
156
|
+
if (vscodePort) {
|
|
157
|
+
try {
|
|
158
|
+
await fetch(`http://127.0.0.1:${vscodePort}/register`, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers: { 'Content-Type': 'application/json' },
|
|
161
|
+
body: JSON.stringify({ sessionId: data.session_id, pid: process.ppid }),
|
|
162
|
+
signal: AbortSignal.timeout(2000),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Extension not reachable — session still works without injection
|
|
167
|
+
}
|
|
168
|
+
}
|
|
134
169
|
}
|
|
135
170
|
async function handleNotification() {
|
|
136
171
|
const input = await readStdin();
|
|
@@ -146,7 +181,7 @@ async function handleNotification() {
|
|
|
146
181
|
// Enrich with tool name and input
|
|
147
182
|
const ctx = extractToolContext(data.transcript_path);
|
|
148
183
|
if (ctx.toolName) {
|
|
149
|
-
enriched = { ...data, tool_name: ctx.toolName, tool_input: ctx.toolInput };
|
|
184
|
+
enriched = { ...data, tool_name: ctx.toolName, tool_input: ctx.toolInput, context: ctx.context };
|
|
150
185
|
}
|
|
151
186
|
}
|
|
152
187
|
else if (type === 'idle_prompt') {
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":";;;AAEA,2DAAkD;AAClD,qCAA8D;AAC9D,yCAAiC;AACjC,uDAAyD;AACzD,iDAAmD;AAGnD,kFAAkF;AAClF,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,iCAAY,EAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InputInjector } from './injector.js';
|
|
2
|
+
import type { SessionInfo, EventType } from '../types.js';
|
|
3
|
+
export declare class CompositeInjector implements InputInjector {
|
|
4
|
+
readonly name = "composite";
|
|
5
|
+
private readonly injectors;
|
|
6
|
+
constructor(injectors: InputInjector[]);
|
|
7
|
+
resolve(session: SessionInfo): Promise<boolean>;
|
|
8
|
+
sendResponse(session: SessionInfo, text: string, eventType: EventType): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/injectors/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE1D,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;gBAEhC,SAAS,EAAE,aAAa,EAAE;IAIhC,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAO/C,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/F"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompositeInjector = void 0;
|
|
4
|
+
class CompositeInjector {
|
|
5
|
+
name = 'composite';
|
|
6
|
+
injectors;
|
|
7
|
+
constructor(injectors) {
|
|
8
|
+
this.injectors = injectors;
|
|
9
|
+
}
|
|
10
|
+
async resolve(session) {
|
|
11
|
+
for (const inj of this.injectors) {
|
|
12
|
+
if (await inj.resolve(session))
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
async sendResponse(session, text, eventType) {
|
|
18
|
+
for (const inj of this.injectors) {
|
|
19
|
+
if (await inj.resolve(session)) {
|
|
20
|
+
return inj.sendResponse(session, text, eventType);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.CompositeInjector = CompositeInjector;
|
|
27
|
+
//# sourceMappingURL=composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/injectors/composite.ts"],"names":[],"mappings":";;;AAGA,MAAa,iBAAiB;IACnB,IAAI,GAAG,WAAW,CAAC;IACX,SAAS,CAAkB;IAE5C,YAAY,SAA0B;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,IAAY,EAAE,SAAoB;QACzE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAvBD,8CAuBC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/injectors/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/injectors/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAiB/F"}
|
|
@@ -3,18 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createInjector = createInjector;
|
|
4
4
|
const injector_js_1 = require("./tmux/injector.js");
|
|
5
5
|
const injector_js_2 = require("./xdotool/injector.js");
|
|
6
|
+
const injector_js_3 = require("./vscode/injector.js");
|
|
7
|
+
const composite_js_1 = require("./composite.js");
|
|
6
8
|
function createInjector(type) {
|
|
9
|
+
const vscode = new injector_js_3.VscodeInjector();
|
|
7
10
|
switch (type) {
|
|
8
11
|
case 'tmux':
|
|
9
|
-
return new injector_js_1.TmuxInjector();
|
|
12
|
+
return new composite_js_1.CompositeInjector([vscode, new injector_js_1.TmuxInjector()]);
|
|
10
13
|
case 'xdotool':
|
|
11
|
-
return new injector_js_2.XdotoolInjector();
|
|
14
|
+
return new composite_js_1.CompositeInjector([vscode, new injector_js_2.XdotoolInjector()]);
|
|
12
15
|
case 'auto':
|
|
13
|
-
// Prefer tmux if available, fallback to xdotool
|
|
14
16
|
if (process.platform === 'linux') {
|
|
15
|
-
return new injector_js_1.TmuxInjector();
|
|
17
|
+
return new composite_js_1.CompositeInjector([vscode, new injector_js_1.TmuxInjector()]);
|
|
16
18
|
}
|
|
17
|
-
|
|
19
|
+
// On non-Linux (macOS/Windows), VS Code injector is the only option
|
|
20
|
+
return new composite_js_1.CompositeInjector([vscode]);
|
|
18
21
|
default:
|
|
19
22
|
throw new Error(`Unknown injector type: ${type}`);
|
|
20
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/injectors/factory.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/injectors/factory.ts"],"names":[],"mappings":";;AAMA,wCAiBC;AAtBD,oDAAkD;AAClD,uDAAwD;AACxD,sDAAsD;AACtD,iDAAmD;AAEnD,SAAgB,cAAc,CAAC,IAAiD;IAC9E,MAAM,MAAM,GAAG,IAAI,4BAAc,EAAE,CAAC;IAEpC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,IAAI,gCAAiB,CAAC,CAAC,MAAM,EAAE,IAAI,0BAAY,EAAE,CAAC,CAAC,CAAC;QAC7D,KAAK,SAAS;YACZ,OAAO,IAAI,gCAAiB,CAAC,CAAC,MAAM,EAAE,IAAI,6BAAe,EAAE,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM;YACT,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,OAAO,IAAI,gCAAiB,CAAC,CAAC,MAAM,EAAE,IAAI,0BAAY,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,oEAAoE;YACpE,OAAO,IAAI,gCAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InputInjector } from '../injector.js';
|
|
2
|
+
import type { SessionInfo, EventType } from '../../types.js';
|
|
3
|
+
export declare class VscodeInjector implements InputInjector {
|
|
4
|
+
readonly name = "vscode";
|
|
5
|
+
resolve(session: SessionInfo): Promise<boolean>;
|
|
6
|
+
sendResponse(session: SessionInfo, text: string, eventType: EventType): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../../src/injectors/vscode/injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE7D,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,YAAY;IAEnB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/C,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAe/F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VscodeInjector = void 0;
|
|
4
|
+
class VscodeInjector {
|
|
5
|
+
name = 'vscode';
|
|
6
|
+
async resolve(session) {
|
|
7
|
+
if (!session.vscodePort)
|
|
8
|
+
return false;
|
|
9
|
+
try {
|
|
10
|
+
const res = await fetch(`http://127.0.0.1:${session.vscodePort}/health`, {
|
|
11
|
+
signal: AbortSignal.timeout(1000),
|
|
12
|
+
});
|
|
13
|
+
return res.ok;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async sendResponse(session, text, eventType) {
|
|
20
|
+
if (!session.vscodePort)
|
|
21
|
+
return false;
|
|
22
|
+
try {
|
|
23
|
+
const res = await fetch(`http://127.0.0.1:${session.vscodePort}/inject`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: { 'Content-Type': 'application/json' },
|
|
26
|
+
body: JSON.stringify({ sessionId: session.sessionId, text, eventType }),
|
|
27
|
+
signal: AbortSignal.timeout(5000),
|
|
28
|
+
});
|
|
29
|
+
return res.ok;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.error('[vscode] sendResponse error:', err);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.VscodeInjector = VscodeInjector;
|
|
38
|
+
//# sourceMappingURL=injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.js","sourceRoot":"","sources":["../../../src/injectors/vscode/injector.ts"],"names":[],"mappings":";;;AAGA,MAAa,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,OAAO,CAAC,UAAU,SAAS,EAAE;gBACvE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE,IAAY,EAAE,SAAoB;QACzE,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,OAAO,CAAC,UAAU,SAAS,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACvE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA9BD,wCA8BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../../src/notes/__tests__/store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const store_js_1 = require("../store.js");
|
|
9
|
+
(0, node_test_1.describe)('notes store', () => {
|
|
10
|
+
(0, node_test_1.beforeEach)(() => {
|
|
11
|
+
(0, store_js_1._resetStore)();
|
|
12
|
+
});
|
|
13
|
+
(0, node_test_1.it)('should add a note and retrieve it', () => {
|
|
14
|
+
const note = (0, store_js_1.addNote)('/home/user/dev/myproject', 'fix the CSS', 'cli');
|
|
15
|
+
strict_1.default.ok(note.id);
|
|
16
|
+
strict_1.default.equal(note.project, 'myproject');
|
|
17
|
+
strict_1.default.equal(note.text, 'fix the CSS');
|
|
18
|
+
strict_1.default.equal(note.source, 'cli');
|
|
19
|
+
strict_1.default.equal(note.status, 'pending');
|
|
20
|
+
const retrieved = (0, store_js_1.getNote)(note.id);
|
|
21
|
+
strict_1.default.ok(retrieved);
|
|
22
|
+
strict_1.default.equal(retrieved.id, note.id);
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)('should list only pending notes', () => {
|
|
25
|
+
(0, store_js_1.addNote)('project-a', 'note 1', 'api');
|
|
26
|
+
const n2 = (0, store_js_1.addNote)('project-a', 'note 2', 'api');
|
|
27
|
+
(0, store_js_1.addNote)('project-b', 'note 3', 'api');
|
|
28
|
+
strict_1.default.equal((0, store_js_1.listNotes)().length, 3);
|
|
29
|
+
strict_1.default.equal((0, store_js_1.listNotes)('project-a').length, 2);
|
|
30
|
+
strict_1.default.equal((0, store_js_1.listNotes)('project-b').length, 1);
|
|
31
|
+
(0, store_js_1.markSent)(n2.id);
|
|
32
|
+
strict_1.default.equal((0, store_js_1.listNotes)('project-a').length, 1);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.it)('should remove a note', () => {
|
|
35
|
+
const note = (0, store_js_1.addNote)('project', 'test', 'dashboard');
|
|
36
|
+
strict_1.default.ok((0, store_js_1.getNote)(note.id));
|
|
37
|
+
const removed = (0, store_js_1.removeNote)(note.id);
|
|
38
|
+
strict_1.default.ok(removed);
|
|
39
|
+
strict_1.default.equal((0, store_js_1.getNote)(note.id), undefined);
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.it)('should return false when removing unknown note', () => {
|
|
42
|
+
strict_1.default.equal((0, store_js_1.removeNote)('nonexistent'), false);
|
|
43
|
+
});
|
|
44
|
+
(0, node_test_1.it)('should mark note as sent', () => {
|
|
45
|
+
const note = (0, store_js_1.addNote)('project', 'test', 'api');
|
|
46
|
+
strict_1.default.ok((0, store_js_1.markSent)(note.id));
|
|
47
|
+
const updated = (0, store_js_1.getNote)(note.id);
|
|
48
|
+
strict_1.default.equal(updated?.status, 'sent');
|
|
49
|
+
// Sent notes not listed in pending
|
|
50
|
+
strict_1.default.equal((0, store_js_1.listNotes)().length, 0);
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.it)('should list unique project names', () => {
|
|
53
|
+
(0, store_js_1.addNote)('project-a', 'note 1', 'api');
|
|
54
|
+
(0, store_js_1.addNote)('project-b', 'note 2', 'api');
|
|
55
|
+
(0, store_js_1.addNote)('project-a', 'note 3', 'api');
|
|
56
|
+
const projects = (0, store_js_1.listProjects)();
|
|
57
|
+
strict_1.default.equal(projects.length, 2);
|
|
58
|
+
strict_1.default.ok(projects.includes('project-a'));
|
|
59
|
+
strict_1.default.ok(projects.includes('project-b'));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.describe)('normalizeProject', () => {
|
|
63
|
+
(0, node_test_1.it)('should extract last path component', () => {
|
|
64
|
+
strict_1.default.equal((0, store_js_1.normalizeProject)('/home/user/dev/myproject'), 'myproject');
|
|
65
|
+
strict_1.default.equal((0, store_js_1.normalizeProject)('/home/user/dev/my-app/'), 'my-app');
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)('should lowercase simple names', () => {
|
|
68
|
+
strict_1.default.equal((0, store_js_1.normalizeProject)('MyProject'), 'myproject');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
(0, node_test_1.describe)('matchProject', () => {
|
|
72
|
+
(0, node_test_1.beforeEach)(() => {
|
|
73
|
+
(0, store_js_1._resetStore)();
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.it)('should match exact project name', () => {
|
|
76
|
+
(0, store_js_1.addNote)('claude-relay', 'test', 'api');
|
|
77
|
+
strict_1.default.equal((0, store_js_1.matchProject)('claude-relay'), 'claude-relay');
|
|
78
|
+
});
|
|
79
|
+
(0, node_test_1.it)('should fuzzy match with spaces to dashes', () => {
|
|
80
|
+
(0, store_js_1.addNote)('claude-relay', 'test', 'api');
|
|
81
|
+
strict_1.default.equal((0, store_js_1.matchProject)('claude relay'), 'claude-relay');
|
|
82
|
+
});
|
|
83
|
+
(0, node_test_1.it)('should return null when no match', () => {
|
|
84
|
+
(0, store_js_1.addNote)('some-project', 'test', 'api');
|
|
85
|
+
strict_1.default.equal((0, store_js_1.matchProject)('totally-different'), null);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/notes/__tests__/store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface Note {
|
|
2
|
+
id: string;
|
|
3
|
+
project: string;
|
|
4
|
+
text: string;
|
|
5
|
+
image?: string;
|
|
6
|
+
source: 'voice' | 'dashboard' | 'telegram' | 'cli' | 'api';
|
|
7
|
+
createdAt: number;
|
|
8
|
+
status: 'pending' | 'sent';
|
|
9
|
+
}
|
|
10
|
+
export declare function imagesDir(): string;
|
|
11
|
+
export declare function saveImage(data: Buffer): string;
|
|
12
|
+
export declare function setNoteImage(id: string, filename: string): boolean;
|
|
13
|
+
export declare function addNote(project: string, text: string, source?: Note['source']): Note;
|
|
14
|
+
export declare function listNotes(project?: string): Note[];
|
|
15
|
+
export declare function getNote(id: string): Note | undefined;
|
|
16
|
+
export declare function markSent(id: string): boolean;
|
|
17
|
+
export declare function removeNote(id: string): boolean;
|
|
18
|
+
export declare function updateNoteText(id: string, text: string): boolean;
|
|
19
|
+
export declare function reorderNotes(project: string, orderedIds: string[]): boolean;
|
|
20
|
+
export declare function listProjects(): string[];
|
|
21
|
+
/** Normalize project path to short name (last directory component) */
|
|
22
|
+
export declare function normalizeProject(project: string): string;
|
|
23
|
+
/** Find best matching project name for fuzzy input (e.g. voice "claude relay" → "claude-relay") */
|
|
24
|
+
export declare function matchProject(input: string): string | null;
|
|
25
|
+
/** Reset store — for testing only */
|
|
26
|
+
export declare function _resetStore(): void;
|
|
27
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/notes/store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;CAC5B;AAYD,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOlE;AAoBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,IAAI,CAAC,QAAQ,CAAS,GAAG,IAAI,CAiB3F;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAMlD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAGpD;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAO5C;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAW9C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOhE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAa3E;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAIvC;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAazD;AAED,qCAAqC;AACrC,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.imagesDir = imagesDir;
|
|
4
|
+
exports.saveImage = saveImage;
|
|
5
|
+
exports.setNoteImage = setNoteImage;
|
|
6
|
+
exports.addNote = addNote;
|
|
7
|
+
exports.listNotes = listNotes;
|
|
8
|
+
exports.getNote = getNote;
|
|
9
|
+
exports.markSent = markSent;
|
|
10
|
+
exports.removeNote = removeNote;
|
|
11
|
+
exports.updateNoteText = updateNoteText;
|
|
12
|
+
exports.reorderNotes = reorderNotes;
|
|
13
|
+
exports.listProjects = listProjects;
|
|
14
|
+
exports.normalizeProject = normalizeProject;
|
|
15
|
+
exports.matchProject = matchProject;
|
|
16
|
+
exports._resetStore = _resetStore;
|
|
17
|
+
const node_fs_1 = require("node:fs");
|
|
18
|
+
const node_path_1 = require("node:path");
|
|
19
|
+
const node_crypto_1 = require("node:crypto");
|
|
20
|
+
const index_js_1 = require("../config/index.js");
|
|
21
|
+
const json_js_1 = require("../utils/json.js");
|
|
22
|
+
const MAX_NOTES = 500;
|
|
23
|
+
let notes = [];
|
|
24
|
+
let loaded = false;
|
|
25
|
+
let testMode = false;
|
|
26
|
+
function notesFile() {
|
|
27
|
+
return (0, node_path_1.join)((0, index_js_1.getDataDir)(), 'notes.json');
|
|
28
|
+
}
|
|
29
|
+
function imagesDir() {
|
|
30
|
+
const dir = (0, node_path_1.join)((0, index_js_1.getDataDir)(), 'note-images');
|
|
31
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
32
|
+
return dir;
|
|
33
|
+
}
|
|
34
|
+
function saveImage(data) {
|
|
35
|
+
const filename = (0, node_crypto_1.randomUUID)() + '.png';
|
|
36
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(imagesDir(), filename), data);
|
|
37
|
+
return filename;
|
|
38
|
+
}
|
|
39
|
+
function setNoteImage(id, filename) {
|
|
40
|
+
load();
|
|
41
|
+
const note = notes.find(n => n.id === id);
|
|
42
|
+
if (!note)
|
|
43
|
+
return false;
|
|
44
|
+
note.image = filename;
|
|
45
|
+
persist();
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
function load() {
|
|
49
|
+
if (loaded)
|
|
50
|
+
return;
|
|
51
|
+
try {
|
|
52
|
+
const raw = (0, node_fs_1.readFileSync)(notesFile(), 'utf-8');
|
|
53
|
+
notes = (0, json_js_1.safeJsonParse)(raw, []);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
notes = [];
|
|
57
|
+
}
|
|
58
|
+
loaded = true;
|
|
59
|
+
}
|
|
60
|
+
function persist() {
|
|
61
|
+
if (testMode)
|
|
62
|
+
return;
|
|
63
|
+
const tmp = notesFile() + '.tmp';
|
|
64
|
+
(0, node_fs_1.writeFileSync)(tmp, JSON.stringify(notes, null, 2) + '\n');
|
|
65
|
+
(0, node_fs_1.renameSync)(tmp, notesFile());
|
|
66
|
+
}
|
|
67
|
+
function addNote(project, text, source = 'api') {
|
|
68
|
+
load();
|
|
69
|
+
const note = {
|
|
70
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
71
|
+
project: normalizeProject(project),
|
|
72
|
+
text: text.trim(),
|
|
73
|
+
source,
|
|
74
|
+
createdAt: Date.now(),
|
|
75
|
+
status: 'pending',
|
|
76
|
+
};
|
|
77
|
+
notes.push(note);
|
|
78
|
+
// Cap size
|
|
79
|
+
if (notes.length > MAX_NOTES) {
|
|
80
|
+
notes = notes.slice(notes.length - MAX_NOTES);
|
|
81
|
+
}
|
|
82
|
+
persist();
|
|
83
|
+
return note;
|
|
84
|
+
}
|
|
85
|
+
function listNotes(project) {
|
|
86
|
+
load();
|
|
87
|
+
const pending = notes.filter(n => n.status === 'pending');
|
|
88
|
+
if (!project)
|
|
89
|
+
return pending;
|
|
90
|
+
const normalized = normalizeProject(project);
|
|
91
|
+
return pending.filter(n => n.project === normalized);
|
|
92
|
+
}
|
|
93
|
+
function getNote(id) {
|
|
94
|
+
load();
|
|
95
|
+
return notes.find(n => n.id === id);
|
|
96
|
+
}
|
|
97
|
+
function markSent(id) {
|
|
98
|
+
load();
|
|
99
|
+
const note = notes.find(n => n.id === id);
|
|
100
|
+
if (!note)
|
|
101
|
+
return false;
|
|
102
|
+
note.status = 'sent';
|
|
103
|
+
persist();
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
function removeNote(id) {
|
|
107
|
+
load();
|
|
108
|
+
const idx = notes.findIndex(n => n.id === id);
|
|
109
|
+
if (idx === -1)
|
|
110
|
+
return false;
|
|
111
|
+
const note = notes[idx];
|
|
112
|
+
if (note.image) {
|
|
113
|
+
try {
|
|
114
|
+
(0, node_fs_1.unlinkSync)((0, node_path_1.join)(imagesDir(), note.image));
|
|
115
|
+
}
|
|
116
|
+
catch { /* already deleted */ }
|
|
117
|
+
}
|
|
118
|
+
notes.splice(idx, 1);
|
|
119
|
+
persist();
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
function updateNoteText(id, text) {
|
|
123
|
+
load();
|
|
124
|
+
const note = notes.find(n => n.id === id);
|
|
125
|
+
if (!note)
|
|
126
|
+
return false;
|
|
127
|
+
note.text = text.trim();
|
|
128
|
+
persist();
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
function reorderNotes(project, orderedIds) {
|
|
132
|
+
load();
|
|
133
|
+
const normalized = normalizeProject(project);
|
|
134
|
+
const projectNotes = notes.filter(n => n.project === normalized && n.status === 'pending');
|
|
135
|
+
const otherNotes = notes.filter(n => n.project !== normalized || n.status !== 'pending');
|
|
136
|
+
// Sort project notes by the provided order
|
|
137
|
+
const idIndex = new Map(orderedIds.map((id, i) => [id, i]));
|
|
138
|
+
projectNotes.sort((a, b) => (idIndex.get(a.id) ?? 999) - (idIndex.get(b.id) ?? 999));
|
|
139
|
+
notes = [...otherNotes, ...projectNotes];
|
|
140
|
+
persist();
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
function listProjects() {
|
|
144
|
+
load();
|
|
145
|
+
const projects = new Set(notes.filter(n => n.status === 'pending').map(n => n.project));
|
|
146
|
+
return Array.from(projects).sort();
|
|
147
|
+
}
|
|
148
|
+
/** Normalize project path to short name (last directory component) */
|
|
149
|
+
function normalizeProject(project) {
|
|
150
|
+
// If it looks like a path, take the last component
|
|
151
|
+
if (project.includes('/')) {
|
|
152
|
+
return project.replace(/\/+$/, '').split('/').pop() || project;
|
|
153
|
+
}
|
|
154
|
+
return project.toLowerCase().trim();
|
|
155
|
+
}
|
|
156
|
+
/** Find best matching project name for fuzzy input (e.g. voice "claude relay" → "claude-relay") */
|
|
157
|
+
function matchProject(input) {
|
|
158
|
+
load();
|
|
159
|
+
const projects = listProjects();
|
|
160
|
+
const normalized = input.toLowerCase().replace(/\s+/g, '-').trim();
|
|
161
|
+
// Exact match
|
|
162
|
+
if (projects.includes(normalized))
|
|
163
|
+
return normalized;
|
|
164
|
+
// Fuzzy: check if input is contained in a project name or vice versa
|
|
165
|
+
const match = projects.find(p => p.includes(normalized) || normalized.includes(p));
|
|
166
|
+
return match || null;
|
|
167
|
+
}
|
|
168
|
+
/** Reset store — for testing only */
|
|
169
|
+
function _resetStore() {
|
|
170
|
+
notes = [];
|
|
171
|
+
loaded = true; // Mark as loaded so it doesn't re-read the file
|
|
172
|
+
testMode = true; // Disable file persistence during tests
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/notes/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/sessions/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSessionInjectable = isSessionInjectable;
|
|
4
|
+
/** Check if a session has a reachable injection target (tmux pane or VS Code extension) */
|
|
5
|
+
function isSessionInjectable(s) {
|
|
6
|
+
return !!(s.tmuxPane || s.vscodePort);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/sessions/helpers.ts"],"names":[],"mappings":";;AAGA,kDAEC;AAHD,2FAA2F;AAC3F,SAAgB,mBAAmB,CAAC,CAAc;IAChD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC"}
|