@varveai/adit-hooks 0.2.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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/claude-code.d.ts +9 -0
  3. package/dist/adapters/claude-code.d.ts.map +1 -0
  4. package/dist/adapters/claude-code.js +349 -0
  5. package/dist/adapters/claude-code.js.map +1 -0
  6. package/dist/adapters/index.d.ts +12 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +29 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/opencode.d.ts +18 -0
  11. package/dist/adapters/opencode.d.ts.map +1 -0
  12. package/dist/adapters/opencode.js +961 -0
  13. package/dist/adapters/opencode.js.map +1 -0
  14. package/dist/adapters/registry.d.ts +31 -0
  15. package/dist/adapters/registry.d.ts.map +1 -0
  16. package/dist/adapters/registry.js +102 -0
  17. package/dist/adapters/registry.js.map +1 -0
  18. package/dist/adapters/stub.d.ts +24 -0
  19. package/dist/adapters/stub.d.ts.map +1 -0
  20. package/dist/adapters/stub.js +60 -0
  21. package/dist/adapters/stub.js.map +1 -0
  22. package/dist/adapters/types.d.ts +107 -0
  23. package/dist/adapters/types.d.ts.map +1 -0
  24. package/dist/adapters/types.js +8 -0
  25. package/dist/adapters/types.js.map +1 -0
  26. package/dist/common/context.d.ts +19 -0
  27. package/dist/common/context.d.ts.map +1 -0
  28. package/dist/common/context.js +94 -0
  29. package/dist/common/context.js.map +1 -0
  30. package/dist/handlers/index.d.ts +2 -0
  31. package/dist/handlers/index.d.ts.map +1 -0
  32. package/dist/handlers/index.js +2 -0
  33. package/dist/handlers/index.js.map +1 -0
  34. package/dist/handlers/unified.d.ts +13 -0
  35. package/dist/handlers/unified.d.ts.map +1 -0
  36. package/dist/handlers/unified.js +304 -0
  37. package/dist/handlers/unified.js.map +1 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +32 -0
  41. package/dist/index.js.map +1 -0
  42. package/package.json +37 -0
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Unified hook dispatcher.
3
+ *
4
+ * Platform-agnostic handler that processes normalized hook input
5
+ * and delegates to the appropriate ADIT handler.
6
+ */
7
+ import { getLatestEnvSnapshot, endSession, withPerf, } from "@varveai/adit-core";
8
+ import { getChangedFiles, createTimelineManager, captureEnvironment, diffEnvironments, } from "@varveai/adit-engine";
9
+ import { initHookContext } from "../common/context.js";
10
+ /**
11
+ * Dispatch a normalized hook input to the appropriate handler.
12
+ * This is the single entry point for all platform hook events.
13
+ */
14
+ export async function dispatchHook(input) {
15
+ const ctx = await initHookContext(input.cwd, input.platformCli ?? "other", input.platformSessionId);
16
+ const dataDir = ctx.config.dataDir;
17
+ try {
18
+ await withPerf(dataDir, "hook", input.hookType, async () => {
19
+ switch (input.hookType) {
20
+ case "prompt-submit":
21
+ await handlePromptSubmitUnified(ctx, input);
22
+ break;
23
+ case "stop":
24
+ await handleStopUnified(ctx, input);
25
+ break;
26
+ case "session-start":
27
+ await handleSessionStart(ctx, input);
28
+ break;
29
+ case "session-end":
30
+ await handleSessionEnd(ctx, input);
31
+ break;
32
+ case "task-completed":
33
+ await handleTaskCompleted(ctx, input);
34
+ break;
35
+ case "notification":
36
+ await handleNotification(ctx, input);
37
+ break;
38
+ case "subagent-start":
39
+ await handleSubagentStart(ctx, input);
40
+ break;
41
+ case "subagent-stop":
42
+ await handleSubagentStop(ctx, input);
43
+ break;
44
+ }
45
+ });
46
+ // Trigger transcript upload (fail-open).
47
+ // Every hook event carries transcript_path, so we check on each event.
48
+ // Awaited so db stays open until the query finishes.
49
+ if (input.transcriptPath) {
50
+ await withPerf(dataDir, "hook", "transcript-upload", () => triggerTranscriptUploadIfEnabled(ctx, input)).catch(() => {
51
+ /* fail-open */
52
+ });
53
+ }
54
+ // Auto-sync to cloud on every hook event (fail-open).
55
+ // Uses dynamic import so @varveai/adit-cloud is not a build-time dependency.
56
+ // The module name is constructed to prevent TypeScript from resolving it.
57
+ // Force sync on session-end (flush all data) and on stop/session.idle
58
+ // (ensures data is persisted even if /exit doesn't fire a session-end).
59
+ try {
60
+ await withPerf(dataDir, "network", "cloud-auto-sync", async () => {
61
+ const cloudModuleName = ["@adit", "cloud"].join("/");
62
+ const cloudModule = await import(cloudModuleName);
63
+ // Awaited so db stays open until it finishes querying.
64
+ // The actual network push happens inside triggerAutoSync's own fire-and-forget.
65
+ const force = input.hookType === "session-end" || input.hookType === "stop";
66
+ await cloudModule.triggerAutoSync(ctx.db, ctx.config.projectId, force ? { force: true } : undefined);
67
+ });
68
+ }
69
+ catch {
70
+ // @varveai/adit-cloud not installed — silently skip
71
+ }
72
+ }
73
+ finally {
74
+ ctx.db.close();
75
+ }
76
+ }
77
+ /** Handle prompt submission (kept lightweight — no git operations) */
78
+ async function handlePromptSubmitUnified(ctx, input) {
79
+ if (!input.prompt)
80
+ return;
81
+ const timeline = createTimelineManager(ctx.db, ctx.config);
82
+ // Only record the prompt text. Manual-edit detection (getChangedFiles) is
83
+ // deferred to handleStopUnified so this blocking UserPromptSubmit hook
84
+ // stays fast and doesn't run `git status` on every keystroke-enter.
85
+ await timeline.recordEvent({
86
+ sessionId: ctx.session.id,
87
+ eventType: "prompt_submit",
88
+ actor: "user",
89
+ promptText: input.prompt,
90
+ });
91
+ }
92
+ /** Handle stop (assistant response complete) */
93
+ async function handleStopUnified(ctx, input) {
94
+ const timeline = createTimelineManager(ctx.db, ctx.config);
95
+ // Use getChangedFiles directly so the result can be reused by captureEnvironment,
96
+ // avoiding a duplicate `git status` call.
97
+ const changedFiles = await withPerf(ctx.config.dataDir, "git", "getChangedFiles", () => getChangedFiles(input.cwd));
98
+ const dirty = changedFiles.length > 0;
99
+ const recentPrompts = await timeline.list({
100
+ sessionId: ctx.session.id,
101
+ eventType: "prompt_submit",
102
+ limit: 1,
103
+ });
104
+ const lastPrompt = recentPrompts[0]?.promptText ?? null;
105
+ // Use last_assistant_message as the response text (what the model actually said).
106
+ // Fall back to stop_reason for backward compatibility, then to "completed".
107
+ const responseText = input.lastAssistantMessage ?? input.stopReason ?? "completed";
108
+ const checkpointLabel = input.stopReason ?? "completed";
109
+ const event = await timeline.recordEvent({
110
+ sessionId: ctx.session.id,
111
+ eventType: "assistant_response",
112
+ actor: "assistant",
113
+ promptText: lastPrompt,
114
+ responseText,
115
+ });
116
+ if (dirty) {
117
+ await timeline.createCheckpoint(event.id, `[adit] assistant response (${checkpointLabel})`, changedFiles);
118
+ }
119
+ if (ctx.config.captureEnv) {
120
+ try {
121
+ // Get previous snapshot before capturing new one
122
+ const prevSnapshot = getLatestEnvSnapshot(ctx.db, ctx.session.id);
123
+ // Pass pre-computed changed files to avoid duplicate git status call
124
+ await withPerf(ctx.config.dataDir, "snapshot", "captureEnvironment", () => captureEnvironment(ctx.db, ctx.config, ctx.session.id, {
125
+ changedFiles,
126
+ }));
127
+ // Detect env drift if we have a previous snapshot
128
+ if (prevSnapshot) {
129
+ const currentSnapshot = getLatestEnvSnapshot(ctx.db, ctx.session.id);
130
+ if (currentSnapshot) {
131
+ const diff = diffEnvironments(prevSnapshot, currentSnapshot);
132
+ if (diff.changes.length > 0) {
133
+ await timeline.recordEvent({
134
+ sessionId: ctx.session.id,
135
+ eventType: "env_drift",
136
+ actor: "system",
137
+ responseText: `Environment drift detected: ${diff.changes.length} changes (${diff.severity})`,
138
+ toolInputJson: JSON.stringify(diff),
139
+ });
140
+ }
141
+ }
142
+ }
143
+ }
144
+ catch {
145
+ // Fail-open
146
+ }
147
+ }
148
+ }
149
+ /** Handle session start — capture initial env snapshot and record metadata */
150
+ async function handleSessionStart(ctx, input) {
151
+ const timeline = createTimelineManager(ctx.db, ctx.config);
152
+ // Record session start event with platform metadata
153
+ const metadata = {};
154
+ if (input.model)
155
+ metadata.model = input.model;
156
+ if (input.sessionSource)
157
+ metadata.source = input.sessionSource;
158
+ if (input.permissionMode)
159
+ metadata.permissionMode = input.permissionMode;
160
+ if (Object.keys(metadata).length > 0) {
161
+ await timeline.recordEvent({
162
+ sessionId: ctx.session.id,
163
+ eventType: "checkpoint",
164
+ actor: "system",
165
+ responseText: `Session started (${input.sessionSource ?? "startup"})`,
166
+ toolInputJson: JSON.stringify(metadata),
167
+ });
168
+ }
169
+ if (ctx.config.captureEnv) {
170
+ try {
171
+ await withPerf(ctx.config.dataDir, "snapshot", "captureEnvironment", () => captureEnvironment(ctx.db, ctx.config, ctx.session.id));
172
+ }
173
+ catch {
174
+ // Fail-open
175
+ }
176
+ }
177
+ // Trigger auto-sync on session start to ensure the Project record
178
+ // exists server-side before the user runs `/adit link`.
179
+ try {
180
+ const { triggerAutoSync } = await import("@varveai/adit-cloud");
181
+ triggerAutoSync(ctx.db, ctx.config.projectId).catch(() => { });
182
+ }
183
+ catch {
184
+ // Fail-open — cloud package may not be available
185
+ }
186
+ // Trigger project-link auto-sync (fire-and-forget, fail-open).
187
+ // Spawns a detached background process to sync branches, commits,
188
+ // and documents — won't be killed by the 10s hook timeout.
189
+ try {
190
+ const cloudModuleName = ["@adit", "cloud"].join("/");
191
+ const { triggerProjectLinkSync } = await import(cloudModuleName);
192
+ triggerProjectLinkSync(ctx.db, ctx.config.projectId, ctx.config.projectRoot)
193
+ .catch(() => { });
194
+ }
195
+ catch {
196
+ // Fail-open — cloud package may not be available
197
+ }
198
+ }
199
+ /** Handle session end — capture final env snapshot and close session */
200
+ async function handleSessionEnd(ctx, input) {
201
+ if (ctx.config.captureEnv) {
202
+ try {
203
+ await withPerf(ctx.config.dataDir, "snapshot", "captureEnvironment", () => captureEnvironment(ctx.db, ctx.config, ctx.session.id));
204
+ }
205
+ catch {
206
+ // Fail-open
207
+ }
208
+ }
209
+ // Mark session as completed with end reason
210
+ const status = input.sessionEndReason === "error" ? "error" : "completed";
211
+ endSession(ctx.db, ctx.session.id, status);
212
+ }
213
+ /** Handle task completed — record semantic milestone in timeline */
214
+ async function handleTaskCompleted(ctx, input) {
215
+ const timeline = createTimelineManager(ctx.db, ctx.config);
216
+ await timeline.recordEvent({
217
+ sessionId: ctx.session.id,
218
+ eventType: "task_completed",
219
+ actor: "assistant",
220
+ responseText: input.taskSubject ?? "Task completed",
221
+ toolName: input.taskId ?? null,
222
+ toolInputJson: JSON.stringify({
223
+ taskId: input.taskId,
224
+ taskSubject: input.taskSubject,
225
+ taskDescription: input.taskDescription,
226
+ teammateName: input.teammateName,
227
+ teamName: input.teamName,
228
+ }),
229
+ });
230
+ }
231
+ /** Handle notification — record notification event (tool results, session diffs, etc.) */
232
+ async function handleNotification(ctx, input) {
233
+ const timeline = createTimelineManager(ctx.db, ctx.config);
234
+ const base = {
235
+ message: input.notificationMessage,
236
+ title: input.notificationTitle,
237
+ notificationType: input.notificationType,
238
+ };
239
+ await timeline.recordEvent({
240
+ sessionId: ctx.session.id,
241
+ eventType: "notification",
242
+ actor: "system",
243
+ responseText: input.notificationMessage ?? "Notification",
244
+ toolName: input.notificationType ?? null,
245
+ toolInputJson: JSON.stringify(base),
246
+ });
247
+ }
248
+ /** Handle subagent start — record when a subagent is spawned */
249
+ async function handleSubagentStart(ctx, input) {
250
+ const timeline = createTimelineManager(ctx.db, ctx.config);
251
+ await timeline.recordEvent({
252
+ sessionId: ctx.session.id,
253
+ eventType: "subagent_start",
254
+ actor: "assistant",
255
+ responseText: `Subagent started: ${input.agentType ?? "unknown"}`,
256
+ toolName: input.agentType ?? null,
257
+ toolInputJson: JSON.stringify({
258
+ agentId: input.agentId,
259
+ agentType: input.agentType,
260
+ }),
261
+ });
262
+ }
263
+ /** Handle subagent stop — record when a subagent finishes */
264
+ async function handleSubagentStop(ctx, input) {
265
+ const timeline = createTimelineManager(ctx.db, ctx.config);
266
+ await timeline.recordEvent({
267
+ sessionId: ctx.session.id,
268
+ eventType: "subagent_stop",
269
+ actor: "assistant",
270
+ responseText: input.lastAssistantMessage
271
+ ? `Subagent finished: ${input.agentType ?? "unknown"}`
272
+ : `Subagent stopped: ${input.agentType ?? "unknown"}`,
273
+ toolName: input.agentType ?? null,
274
+ toolInputJson: JSON.stringify({
275
+ agentId: input.agentId,
276
+ agentType: input.agentType,
277
+ agentTranscriptPath: input.agentTranscriptPath,
278
+ }),
279
+ toolOutputJson: input.lastAssistantMessage
280
+ ? JSON.stringify({ lastAssistantMessage: input.lastAssistantMessage })
281
+ : null,
282
+ });
283
+ }
284
+ /**
285
+ * Trigger transcript upload if cloud is configured.
286
+ *
287
+ * Uses dynamic import so @varveai/adit-cloud is not a build-time dependency.
288
+ * Fully fail-open: errors are silently swallowed.
289
+ *
290
+ * Reuses the existing HookContext to avoid opening a second DB connection.
291
+ */
292
+ async function triggerTranscriptUploadIfEnabled(ctx, input) {
293
+ if (!input.transcriptPath)
294
+ return;
295
+ try {
296
+ const cloudModuleName = ["@adit", "cloud"].join("/");
297
+ const cloudModule = (await import(cloudModuleName));
298
+ await cloudModule.triggerTranscriptUpload(ctx.db, ctx.session.id, input.transcriptPath);
299
+ }
300
+ catch {
301
+ // @varveai/adit-cloud not installed or other error — silently skip
302
+ }
303
+ }
304
+ //# sourceMappingURL=unified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../src/handlers/unified.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ADIT hook dispatcher.
4
+ *
5
+ * Entry point for `adit-hook <command>`.
6
+ * Uses the platform adapter pattern to handle events from any supported AI tool.
7
+ * All errors are caught and swallowed — hooks must never block the AI agent.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ADIT hook dispatcher.
4
+ *
5
+ * Entry point for `adit-hook <command>`.
6
+ * Uses the platform adapter pattern to handle events from any supported AI tool.
7
+ * All errors are caught and swallowed — hooks must never block the AI agent.
8
+ */
9
+ import { readStdin } from "./common/context.js";
10
+ import { detectPlatform, getAdapter } from "./adapters/index.js";
11
+ import { dispatchHook } from "./handlers/unified.js";
12
+ // Hard safety net: kill the process after 10 seconds no matter what.
13
+ // Hooks must never block the AI agent — this ensures we exit even if
14
+ // readStdin, database, git, or network operations hang.
15
+ setTimeout(() => process.exit(0), 10_000).unref();
16
+ const command = process.argv[2];
17
+ async function main() {
18
+ if (!command)
19
+ return;
20
+ const raw = await readStdin();
21
+ const platform = detectPlatform();
22
+ const adapter = getAdapter(platform);
23
+ const input = adapter.parseInput(raw, command);
24
+ await dispatchHook(input);
25
+ }
26
+ // Fail-open: catch everything, always exit 0.
27
+ // .finally() ensures the process exits immediately even when lingering
28
+ // handles (stdin listeners, network connections, timers) would keep it alive.
29
+ main()
30
+ .catch(() => { })
31
+ .finally(() => process.exit(0));
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qEAAqE;AACrE,qEAAqE;AACrE,wDAAwD;AACxD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;AAElD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,8CAA8C;AAC9C,uEAAuE;AACvE,8EAA8E;AAC9E,IAAI,EAAE;KACH,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;KACf,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@varveai/adit-hooks",
3
+ "version": "0.2.1",
4
+ "description": "Hook handlers for AI coding platforms",
5
+ "type": "module",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "bin": {
12
+ "adit-hook": "./dist/index.js"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js"
18
+ },
19
+ "./adapters": {
20
+ "types": "./dist/adapters/index.d.ts",
21
+ "import": "./dist/adapters/index.js"
22
+ }
23
+ },
24
+ "dependencies": {
25
+ "@varveai/adit-core": "0.2.1",
26
+ "@varveai/adit-engine": "0.2.1",
27
+ "@varveai/adit-cloud": "0.2.1"
28
+ },
29
+ "devDependencies": {
30
+ "@types/better-sqlite3": "^7.6.13",
31
+ "typescript": "^5.7.2"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "typecheck": "tsc --noEmit"
36
+ }
37
+ }