@varveai/adit-hooks 0.2.1 → 0.3.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.
- package/dist/adapters/claude-vscode.d.ts +16 -0
- package/dist/adapters/claude-vscode.d.ts.map +1 -0
- package/dist/adapters/claude-vscode.js +42 -0
- package/dist/adapters/claude-vscode.js.map +1 -0
- package/dist/adapters/codex.d.ts +16 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +220 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/cursor.d.ts +19 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +330 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/gemini.d.ts +9 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +216 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/index.d.ts +6 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +6 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/registry.d.ts +11 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +104 -13
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/stub.d.ts +0 -4
- package/dist/adapters/stub.d.ts.map +1 -1
- package/dist/adapters/stub.js +0 -4
- package/dist/adapters/stub.js.map +1 -1
- package/dist/handlers/unified.d.ts.map +1 -1
- package/dist/handlers/unified.js +70 -1
- package/dist/handlers/unified.js.map +1 -1
- package/dist/index.js +42 -2
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code VS Code extension adapter.
|
|
3
|
+
*
|
|
4
|
+
* The VS Code Claude extension uses the same hook mechanism and
|
|
5
|
+
* .claude/settings.local.json configuration as the CLI. This adapter
|
|
6
|
+
* delegates all file I/O to the claude-code adapter and overrides
|
|
7
|
+
* only the platform identification so that VS Code sessions are
|
|
8
|
+
* tracked separately in the ADIT timeline.
|
|
9
|
+
*
|
|
10
|
+
* Detection relies on environment variables present in the VS Code
|
|
11
|
+
* extension host process (ELECTRON_RUN_AS_NODE + VSCODE_IPC_HOOK)
|
|
12
|
+
* which are NOT set when the CLI runs — even from VS Code's terminal.
|
|
13
|
+
*/
|
|
14
|
+
import type { PlatformAdapter } from "./types.js";
|
|
15
|
+
export declare const claudeVscodeAdapter: PlatformAdapter;
|
|
16
|
+
//# sourceMappingURL=claude-vscode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-vscode.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-vscode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,mBAAmB,EAAE,eAgCjC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code VS Code extension adapter.
|
|
3
|
+
*
|
|
4
|
+
* The VS Code Claude extension uses the same hook mechanism and
|
|
5
|
+
* .claude/settings.local.json configuration as the CLI. This adapter
|
|
6
|
+
* delegates all file I/O to the claude-code adapter and overrides
|
|
7
|
+
* only the platform identification so that VS Code sessions are
|
|
8
|
+
* tracked separately in the ADIT timeline.
|
|
9
|
+
*
|
|
10
|
+
* Detection relies on environment variables present in the VS Code
|
|
11
|
+
* extension host process (ELECTRON_RUN_AS_NODE + VSCODE_IPC_HOOK)
|
|
12
|
+
* which are NOT set when the CLI runs — even from VS Code's terminal.
|
|
13
|
+
*/
|
|
14
|
+
import { claudeCodeAdapter } from "./claude-code.js";
|
|
15
|
+
export const claudeVscodeAdapter = {
|
|
16
|
+
platform: "claude-vscode",
|
|
17
|
+
displayName: "Claude Code (VS Code)",
|
|
18
|
+
hookMappings: claudeCodeAdapter.hookMappings,
|
|
19
|
+
parseInput(raw, hookType) {
|
|
20
|
+
const input = claudeCodeAdapter.parseInput(raw, hookType);
|
|
21
|
+
// Override platform identification for VS Code sessions
|
|
22
|
+
input.platformCli = "claude-vscode";
|
|
23
|
+
return input;
|
|
24
|
+
},
|
|
25
|
+
generateHookConfig(aditBinaryPath) {
|
|
26
|
+
return claudeCodeAdapter.generateHookConfig(aditBinaryPath);
|
|
27
|
+
},
|
|
28
|
+
async validateInstallation(projectRoot) {
|
|
29
|
+
return claudeCodeAdapter.validateInstallation(projectRoot);
|
|
30
|
+
},
|
|
31
|
+
async installHooks(projectRoot, aditBinaryPath) {
|
|
32
|
+
return claudeCodeAdapter.installHooks(projectRoot, aditBinaryPath);
|
|
33
|
+
},
|
|
34
|
+
async uninstallHooks(projectRoot) {
|
|
35
|
+
return claudeCodeAdapter.uninstallHooks(projectRoot);
|
|
36
|
+
},
|
|
37
|
+
getResumeCommand(_projectRoot) {
|
|
38
|
+
// VS Code extension does not have a command-line resume mechanism
|
|
39
|
+
return null;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=claude-vscode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-vscode.js","sourceRoot":"","sources":["../../src/adapters/claude-vscode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,QAAQ,EAAE,eAA2B;IACrC,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,iBAAiB,CAAC,YAAY;IAE5C,UAAU,CAAC,GAA4B,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1D,wDAAwD;QACxD,KAAK,CAAC,WAAW,GAAG,eAAe,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,cAAsB;QACvC,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QAC5C,OAAO,iBAAiB,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,cAAsB;QAC5D,OAAO,iBAAiB,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,OAAO,iBAAiB,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,gBAAgB,CAAC,YAAoB;QACnC,kEAAkE;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Codex's hook events to ADIT's internal model.
|
|
5
|
+
* Supports all Codex clients: CLI, desktop App, and IDE Extension.
|
|
6
|
+
* All clients share the same hooks.json format and event schema.
|
|
7
|
+
* Handles installation into .codex/hooks.json.
|
|
8
|
+
*
|
|
9
|
+
* Key differences from Claude Code:
|
|
10
|
+
* - Timeout is in **seconds** (not milliseconds)
|
|
11
|
+
* - SessionStart uses matcher "startup|resume"
|
|
12
|
+
* - PostToolUse uses matcher "Bash"
|
|
13
|
+
*/
|
|
14
|
+
import type { PlatformAdapter } from "./types.js";
|
|
15
|
+
export declare const codexAdapter: PlatformAdapter;
|
|
16
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAsBpB,eAAO,MAAM,YAAY,EAAE,eAqN1B,CAAC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Codex's hook events to ADIT's internal model.
|
|
5
|
+
* Supports all Codex clients: CLI, desktop App, and IDE Extension.
|
|
6
|
+
* All clients share the same hooks.json format and event schema.
|
|
7
|
+
* Handles installation into .codex/hooks.json.
|
|
8
|
+
*
|
|
9
|
+
* Key differences from Claude Code:
|
|
10
|
+
* - Timeout is in **seconds** (not milliseconds)
|
|
11
|
+
* - SessionStart uses matcher "startup|resume"
|
|
12
|
+
* - PostToolUse uses matcher "Bash"
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
/** Timeout for Codex hooks — in SECONDS (not ms like Claude Code) */
|
|
17
|
+
const HOOK_TIMEOUT = 30;
|
|
18
|
+
const HOOK_MAPPINGS = [
|
|
19
|
+
{ platformEvent: "SessionStart", aditHandler: "session-start", matcher: "startup|resume" },
|
|
20
|
+
{ platformEvent: "UserPromptSubmit", aditHandler: "prompt-submit" },
|
|
21
|
+
{ platformEvent: "Stop", aditHandler: "stop" },
|
|
22
|
+
{ platformEvent: "PostToolUse", aditHandler: "notification", matcher: "Bash" },
|
|
23
|
+
];
|
|
24
|
+
/** Map Codex CLI platform events to ADIT hook types (derived from HOOK_MAPPINGS) */
|
|
25
|
+
const PLATFORM_TO_ADIT = Object.fromEntries(HOOK_MAPPINGS.map((m) => [m.platformEvent, m.aditHandler]));
|
|
26
|
+
/** Check if a command string is an ADIT hook (matches both npx and resolved-path formats) */
|
|
27
|
+
function isAditHookCommand(command) {
|
|
28
|
+
return command.includes("adit-hook") || command.includes("hooks/dist/index.js");
|
|
29
|
+
}
|
|
30
|
+
export const codexAdapter = {
|
|
31
|
+
platform: "codex",
|
|
32
|
+
displayName: "Codex",
|
|
33
|
+
hookMappings: HOOK_MAPPINGS,
|
|
34
|
+
parseInput(raw, hookType) {
|
|
35
|
+
const aditHookType = PLATFORM_TO_ADIT[hookType] ?? hookType;
|
|
36
|
+
const cwd = raw.cwd ?? process.cwd();
|
|
37
|
+
return {
|
|
38
|
+
cwd,
|
|
39
|
+
hookType: aditHookType,
|
|
40
|
+
platformCli: "codex",
|
|
41
|
+
platformSessionId: raw.session_id,
|
|
42
|
+
transcriptPath: raw.transcript_path,
|
|
43
|
+
// Prompt
|
|
44
|
+
prompt: raw.prompt,
|
|
45
|
+
// Stop
|
|
46
|
+
stopReason: raw.stop_reason,
|
|
47
|
+
lastAssistantMessage: raw.last_assistant_message,
|
|
48
|
+
stopHookActive: raw.stop_hook_active,
|
|
49
|
+
// Tool use (from PostToolUse)
|
|
50
|
+
toolName: raw.tool_name,
|
|
51
|
+
toolInput: raw.tool_input,
|
|
52
|
+
toolOutput: raw.tool_response,
|
|
53
|
+
// Session lifecycle
|
|
54
|
+
sessionSource: raw.source,
|
|
55
|
+
sessionEndReason: raw.reason,
|
|
56
|
+
// Common metadata (present in all events)
|
|
57
|
+
permissionMode: raw.permission_mode,
|
|
58
|
+
model: raw.model,
|
|
59
|
+
rawPlatformData: raw,
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
generateHookConfig(aditBinaryPath) {
|
|
63
|
+
const makeHookEntry = (command) => [
|
|
64
|
+
{ hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
|
|
65
|
+
];
|
|
66
|
+
const makeMatcherEntry = (matcher, command) => [
|
|
67
|
+
{ matcher, hooks: [{ type: "command", command: `CODEX=1 ${command}`, timeout: HOOK_TIMEOUT }] },
|
|
68
|
+
];
|
|
69
|
+
return {
|
|
70
|
+
configPath: ".codex/hooks.json",
|
|
71
|
+
content: {
|
|
72
|
+
hooks: {
|
|
73
|
+
SessionStart: makeMatcherEntry("startup|resume", `${aditBinaryPath} session-start`),
|
|
74
|
+
UserPromptSubmit: makeHookEntry(`${aditBinaryPath} prompt-submit`),
|
|
75
|
+
Stop: makeHookEntry(`${aditBinaryPath} stop`),
|
|
76
|
+
PostToolUse: makeMatcherEntry("Bash", `${aditBinaryPath} notification`),
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
async validateInstallation(projectRoot) {
|
|
82
|
+
const checks = [];
|
|
83
|
+
// Check .codex directory exists
|
|
84
|
+
const codexDir = join(projectRoot, ".codex");
|
|
85
|
+
const codexDirExists = existsSync(codexDir);
|
|
86
|
+
checks.push({
|
|
87
|
+
name: ".codex directory",
|
|
88
|
+
ok: codexDirExists,
|
|
89
|
+
detail: codexDirExists ? codexDir : "Not found",
|
|
90
|
+
});
|
|
91
|
+
// Check hooks file for hook configuration
|
|
92
|
+
const hooksPath = join(projectRoot, ".codex", "hooks.json");
|
|
93
|
+
let hooksFound = false;
|
|
94
|
+
let hooksDetail = "No hook configuration found";
|
|
95
|
+
const requiredHooks = HOOK_MAPPINGS.map((m) => m.platformEvent);
|
|
96
|
+
const missingHooks = [];
|
|
97
|
+
if (existsSync(hooksPath)) {
|
|
98
|
+
try {
|
|
99
|
+
const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
100
|
+
if (!hooksConfig.hooks) {
|
|
101
|
+
hooksDetail = "No hooks section found in hooks.json";
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
for (const hookName of requiredHooks) {
|
|
105
|
+
const entries = hooksConfig.hooks[hookName];
|
|
106
|
+
if (!Array.isArray(entries)) {
|
|
107
|
+
missingHooks.push(hookName);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
const hasAdit = entries.some((entry) => {
|
|
111
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
112
|
+
return true;
|
|
113
|
+
if (Array.isArray(entry.hooks)) {
|
|
114
|
+
return entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
115
|
+
}
|
|
116
|
+
return false;
|
|
117
|
+
});
|
|
118
|
+
if (!hasAdit)
|
|
119
|
+
missingHooks.push(hookName);
|
|
120
|
+
}
|
|
121
|
+
hooksFound = missingHooks.length === 0;
|
|
122
|
+
hooksDetail = hooksFound
|
|
123
|
+
? `All hooks registered in ${hooksPath}`
|
|
124
|
+
: `Missing hooks: ${missingHooks.join(", ")}`;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
hooksDetail = `Failed to parse ${hooksPath}`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
checks.push({
|
|
132
|
+
name: "Hook configuration",
|
|
133
|
+
ok: hooksFound,
|
|
134
|
+
detail: hooksDetail,
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
valid: checks.every((c) => c.ok),
|
|
138
|
+
checks,
|
|
139
|
+
};
|
|
140
|
+
},
|
|
141
|
+
async installHooks(projectRoot, aditBinaryPath) {
|
|
142
|
+
const codexDir = join(projectRoot, ".codex");
|
|
143
|
+
if (!existsSync(codexDir)) {
|
|
144
|
+
mkdirSync(codexDir, { recursive: true });
|
|
145
|
+
}
|
|
146
|
+
const hooksPath = join(codexDir, "hooks.json");
|
|
147
|
+
let hooksConfig = {};
|
|
148
|
+
if (existsSync(hooksPath)) {
|
|
149
|
+
try {
|
|
150
|
+
hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Start fresh if hooks are invalid
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const hookConfig = this.generateHookConfig(aditBinaryPath);
|
|
157
|
+
const existingHooks = hooksConfig.hooks ?? {};
|
|
158
|
+
const newHooks = hookConfig.content.hooks;
|
|
159
|
+
// Merge hook entries per event key: preserve other tools' hooks,
|
|
160
|
+
// remove stale ADIT entries, then append new ADIT entries.
|
|
161
|
+
const mergedHooks = { ...existingHooks };
|
|
162
|
+
for (const [eventKey, aditEntries] of Object.entries(newHooks)) {
|
|
163
|
+
const existing = Array.isArray(mergedHooks[eventKey]) ? mergedHooks[eventKey] : [];
|
|
164
|
+
// Remove stale ADIT entries (same logic as uninstallHooks)
|
|
165
|
+
const nonAditEntries = existing.filter((raw) => {
|
|
166
|
+
const entry = raw;
|
|
167
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
168
|
+
return false;
|
|
169
|
+
if (Array.isArray(entry.hooks)) {
|
|
170
|
+
return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
});
|
|
174
|
+
// Append new ADIT entries after other tools' hooks
|
|
175
|
+
mergedHooks[eventKey] = [...nonAditEntries, ...aditEntries];
|
|
176
|
+
}
|
|
177
|
+
hooksConfig.hooks = mergedHooks;
|
|
178
|
+
writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
|
|
179
|
+
},
|
|
180
|
+
getResumeCommand(_projectRoot) {
|
|
181
|
+
return "codex --continue";
|
|
182
|
+
},
|
|
183
|
+
async uninstallHooks(projectRoot) {
|
|
184
|
+
const hooksPath = join(projectRoot, ".codex", "hooks.json");
|
|
185
|
+
if (!existsSync(hooksPath))
|
|
186
|
+
return;
|
|
187
|
+
try {
|
|
188
|
+
const hooksConfig = JSON.parse(readFileSync(hooksPath, "utf-8"));
|
|
189
|
+
if (!hooksConfig.hooks)
|
|
190
|
+
return;
|
|
191
|
+
// Remove ADIT hook entries
|
|
192
|
+
for (const hookName of Object.keys(hooksConfig.hooks)) {
|
|
193
|
+
const entries = hooksConfig.hooks[hookName];
|
|
194
|
+
if (!Array.isArray(entries))
|
|
195
|
+
continue;
|
|
196
|
+
hooksConfig.hooks[hookName] = entries.filter((entry) => {
|
|
197
|
+
if (typeof entry.command === "string" && isAditHookCommand(entry.command))
|
|
198
|
+
return false;
|
|
199
|
+
if (Array.isArray(entry.hooks)) {
|
|
200
|
+
return !entry.hooks.some((h) => typeof h.command === "string" && isAditHookCommand(h.command));
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
});
|
|
204
|
+
// Clean up empty arrays
|
|
205
|
+
if (hooksConfig.hooks[hookName].length === 0) {
|
|
206
|
+
delete hooksConfig.hooks[hookName];
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Clean up empty hooks object
|
|
210
|
+
if (Object.keys(hooksConfig.hooks).length === 0) {
|
|
211
|
+
delete hooksConfig.hooks;
|
|
212
|
+
}
|
|
213
|
+
writeFileSync(hooksPath, JSON.stringify(hooksConfig, null, 2) + "\n");
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Ignore parse errors
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor IDE platform adapter.
|
|
3
|
+
*
|
|
4
|
+
* Maps Cursor's hook events to ADIT's internal model.
|
|
5
|
+
* Handles installation into .cursor/hooks.json.
|
|
6
|
+
*/
|
|
7
|
+
import type { PlatformAdapter } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Extract the last assistant message text from a Cursor transcript JSONL file.
|
|
10
|
+
*
|
|
11
|
+
* Cursor's stop event does not include the assistant's response text — only
|
|
12
|
+
* `status` and `transcript_path`. The actual response is in the JSONL transcript.
|
|
13
|
+
*
|
|
14
|
+
* Reads the tail of the file for efficiency, then scans backwards for the
|
|
15
|
+
* last `role: "assistant"` entry with text content.
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractLastAssistantMessage(transcriptPath: string): string | undefined;
|
|
18
|
+
export declare const cursorAdapter: PlatformAdapter;
|
|
19
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,eAAe,EAMhB,MAAM,YAAY,CAAC;AAuCpB;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0CtF;AAoBD,eAAO,MAAM,aAAa,EAAE,eA+P3B,CAAC"}
|