@eddacraft/kindling-adapter-claude-code 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +198 -0
  3. package/dist/claude-code/events.d.ts +134 -0
  4. package/dist/claude-code/events.d.ts.map +1 -0
  5. package/dist/claude-code/events.js +94 -0
  6. package/dist/claude-code/events.js.map +1 -0
  7. package/dist/claude-code/filter.d.ts +60 -0
  8. package/dist/claude-code/filter.d.ts.map +1 -0
  9. package/dist/claude-code/filter.js +150 -0
  10. package/dist/claude-code/filter.js.map +1 -0
  11. package/dist/claude-code/hooks.d.ts +105 -0
  12. package/dist/claude-code/hooks.d.ts.map +1 -0
  13. package/dist/claude-code/hooks.js +113 -0
  14. package/dist/claude-code/hooks.js.map +1 -0
  15. package/dist/claude-code/index.d.ts +12 -0
  16. package/dist/claude-code/index.d.ts.map +1 -0
  17. package/dist/claude-code/index.js +18 -0
  18. package/dist/claude-code/index.js.map +1 -0
  19. package/dist/claude-code/mapping.d.ts +27 -0
  20. package/dist/claude-code/mapping.d.ts.map +1 -0
  21. package/dist/claude-code/mapping.js +234 -0
  22. package/dist/claude-code/mapping.js.map +1 -0
  23. package/dist/claude-code/provenance.d.ts +27 -0
  24. package/dist/claude-code/provenance.d.ts.map +1 -0
  25. package/dist/claude-code/provenance.js +134 -0
  26. package/dist/claude-code/provenance.js.map +1 -0
  27. package/dist/claude-code/session.d.ts +98 -0
  28. package/dist/claude-code/session.d.ts.map +1 -0
  29. package/dist/claude-code/session.js +191 -0
  30. package/dist/claude-code/session.js.map +1 -0
  31. package/dist/index.d.ts +22 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +22 -0
  34. package/dist/index.js.map +1 -0
  35. package/package.json +62 -0
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Event to observation mapping for Claude Code
3
+ *
4
+ * Maps Claude Code hook events to Kindling observations with provenance.
5
+ */
6
+ import { extractProvenance } from './provenance.js';
7
+ import { filterContent, filterToolResult } from './filter.js';
8
+ /**
9
+ * Mapping from tool names to observation kinds
10
+ */
11
+ const TOOL_TO_KIND_MAP = {
12
+ // File operations -> file_diff
13
+ Write: 'file_diff',
14
+ Edit: 'file_diff',
15
+ // Shell commands -> command
16
+ Bash: 'command',
17
+ // Everything else -> tool_call
18
+ Read: 'tool_call',
19
+ Glob: 'tool_call',
20
+ Grep: 'tool_call',
21
+ Task: 'tool_call',
22
+ WebFetch: 'tool_call',
23
+ WebSearch: 'tool_call',
24
+ AskUserQuestion: 'tool_call',
25
+ Skill: 'tool_call',
26
+ };
27
+ /**
28
+ * Map a Claude Code event to a Kindling observation
29
+ */
30
+ export function mapEvent(event) {
31
+ switch (event.type) {
32
+ case 'session_start':
33
+ case 'pre_compact':
34
+ // Session lifecycle handled separately
35
+ return { skip: true };
36
+ case 'post_tool_use':
37
+ return mapToolUseEvent(event);
38
+ case 'user_prompt':
39
+ return mapUserPromptEvent(event);
40
+ case 'subagent_stop':
41
+ return mapSubagentStopEvent(event);
42
+ case 'stop':
43
+ // Stop event triggers capsule close, handled separately
44
+ return { skip: true };
45
+ default:
46
+ return { error: `Unknown event type: ${event.type}` };
47
+ }
48
+ }
49
+ /**
50
+ * Map a tool use event to an observation
51
+ */
52
+ function mapToolUseEvent(event) {
53
+ if (!event.toolName) {
54
+ return { error: 'Tool use event missing toolName' };
55
+ }
56
+ // Determine observation kind
57
+ const kind = TOOL_TO_KIND_MAP[event.toolName] ?? 'tool_call';
58
+ // Format content based on tool type
59
+ const content = formatToolContent(event);
60
+ // Extract provenance
61
+ const provenance = extractProvenance(event);
62
+ // Build scope IDs
63
+ const scopeIds = {
64
+ sessionId: event.sessionId,
65
+ repoId: event.cwd,
66
+ };
67
+ return {
68
+ observation: {
69
+ kind,
70
+ content,
71
+ provenance,
72
+ scopeIds,
73
+ },
74
+ };
75
+ }
76
+ /**
77
+ * Map a user prompt event to an observation
78
+ */
79
+ function mapUserPromptEvent(event) {
80
+ if (!event.userContent) {
81
+ return { error: 'User prompt event missing content' };
82
+ }
83
+ const content = filterContent(event.userContent, { maxLength: 10000 });
84
+ const provenance = extractProvenance(event);
85
+ const scopeIds = {
86
+ sessionId: event.sessionId,
87
+ repoId: event.cwd,
88
+ };
89
+ return {
90
+ observation: {
91
+ kind: 'message',
92
+ content,
93
+ provenance,
94
+ scopeIds,
95
+ },
96
+ };
97
+ }
98
+ /**
99
+ * Map a subagent stop event to an observation
100
+ */
101
+ function mapSubagentStopEvent(event) {
102
+ const content = formatSubagentContent(event);
103
+ const provenance = extractProvenance(event);
104
+ const scopeIds = {
105
+ sessionId: event.sessionId,
106
+ repoId: event.cwd,
107
+ };
108
+ return {
109
+ observation: {
110
+ kind: 'node_end',
111
+ content,
112
+ provenance,
113
+ scopeIds,
114
+ },
115
+ };
116
+ }
117
+ /**
118
+ * Format tool content for human readability
119
+ */
120
+ function formatToolContent(event) {
121
+ const toolName = event.toolName ?? 'unknown';
122
+ const parts = [`Tool: ${toolName}`];
123
+ // Add tool-specific content
124
+ switch (toolName) {
125
+ case 'Read': {
126
+ const filePath = event.toolInput?.file_path;
127
+ if (filePath)
128
+ parts.push(`File: ${filePath}`);
129
+ break;
130
+ }
131
+ case 'Write': {
132
+ const filePath = event.toolInput?.file_path;
133
+ if (filePath)
134
+ parts.push(`File: ${filePath}`);
135
+ parts.push('Action: Created/overwrote file');
136
+ break;
137
+ }
138
+ case 'Edit': {
139
+ const filePath = event.toolInput?.file_path;
140
+ if (filePath)
141
+ parts.push(`File: ${filePath}`);
142
+ parts.push('Action: Edited file');
143
+ break;
144
+ }
145
+ case 'Bash': {
146
+ const command = event.toolInput?.command;
147
+ if (command)
148
+ parts.push(`$ ${command}`);
149
+ const resultStr = filterToolResult(toolName, event.toolResult);
150
+ if (resultStr)
151
+ parts.push(resultStr);
152
+ break;
153
+ }
154
+ case 'Glob': {
155
+ const pattern = event.toolInput?.pattern;
156
+ const path = event.toolInput?.path;
157
+ if (pattern)
158
+ parts.push(`Pattern: ${pattern}`);
159
+ if (path)
160
+ parts.push(`Path: ${path}`);
161
+ break;
162
+ }
163
+ case 'Grep': {
164
+ const pattern = event.toolInput?.pattern;
165
+ const path = event.toolInput?.path;
166
+ if (pattern)
167
+ parts.push(`Pattern: ${pattern}`);
168
+ if (path)
169
+ parts.push(`Path: ${path}`);
170
+ break;
171
+ }
172
+ case 'Task': {
173
+ const agentType = event.toolInput?.subagent_type;
174
+ const description = event.toolInput?.description;
175
+ if (agentType)
176
+ parts.push(`Agent: ${agentType}`);
177
+ if (description)
178
+ parts.push(`Task: ${description}`);
179
+ break;
180
+ }
181
+ case 'WebFetch': {
182
+ const url = event.toolInput?.url;
183
+ if (url)
184
+ parts.push(`URL: ${url}`);
185
+ break;
186
+ }
187
+ case 'WebSearch': {
188
+ const query = event.toolInput?.query;
189
+ if (query)
190
+ parts.push(`Query: ${query}`);
191
+ break;
192
+ }
193
+ default: {
194
+ // For unknown tools, show input keys
195
+ if (event.toolInput) {
196
+ const keys = Object.keys(event.toolInput).join(', ');
197
+ parts.push(`Input keys: ${keys}`);
198
+ }
199
+ }
200
+ }
201
+ // Add error if present
202
+ if (event.toolError) {
203
+ parts.push(`Error: ${event.toolError}`);
204
+ }
205
+ return parts.join('\n\n');
206
+ }
207
+ /**
208
+ * Format subagent content
209
+ */
210
+ function formatSubagentContent(event) {
211
+ const parts = [`Subagent: ${event.agentType ?? 'unknown'}`];
212
+ if (event.agentOutput) {
213
+ const output = filterContent(event.agentOutput, { maxLength: 5000 });
214
+ parts.push(`Output:\n${output}`);
215
+ }
216
+ return parts.join('\n\n');
217
+ }
218
+ /**
219
+ * Batch map multiple events
220
+ */
221
+ export function mapEvents(events) {
222
+ const observations = [];
223
+ for (const event of events) {
224
+ const result = mapEvent(event);
225
+ if (result.observation) {
226
+ observations.push(result.observation);
227
+ }
228
+ else if (result.error) {
229
+ console.warn(`Failed to map event: ${result.error}`, event);
230
+ }
231
+ }
232
+ return observations;
233
+ }
234
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/claude-code/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Provenance extraction for Claude Code events
3
+ *
4
+ * Extracts structured metadata from events for queryability and explainability.
5
+ */
6
+ import type { ClaudeCodeEvent } from './events.js';
7
+ /**
8
+ * Extract provenance from a tool use event
9
+ */
10
+ export declare function extractToolUseProvenance(event: ClaudeCodeEvent): Record<string, unknown>;
11
+ /**
12
+ * Extract provenance from a user prompt event
13
+ */
14
+ export declare function extractUserPromptProvenance(event: ClaudeCodeEvent): Record<string, unknown>;
15
+ /**
16
+ * Extract provenance from a subagent stop event
17
+ */
18
+ export declare function extractSubagentProvenance(event: ClaudeCodeEvent): Record<string, unknown>;
19
+ /**
20
+ * Extract provenance from a stop event
21
+ */
22
+ export declare function extractStopProvenance(event: ClaudeCodeEvent): Record<string, unknown>;
23
+ /**
24
+ * Extract provenance based on event type
25
+ */
26
+ export declare function extractProvenance(event: ClaudeCodeEvent): Record<string, unknown>;
27
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/claude-code/provenance.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6DxF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS3F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQrF;AAuBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBjF"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Provenance extraction for Claude Code events
3
+ *
4
+ * Extracts structured metadata from events for queryability and explainability.
5
+ */
6
+ /**
7
+ * Extract provenance from a tool use event
8
+ */
9
+ export function extractToolUseProvenance(event) {
10
+ if (event.type !== 'post_tool_use') {
11
+ return {};
12
+ }
13
+ const provenance = {
14
+ toolName: event.toolName,
15
+ hasError: !!event.toolError,
16
+ };
17
+ // Extract tool-specific provenance
18
+ switch (event.toolName) {
19
+ case 'Read':
20
+ provenance.filePath = event.toolInput?.file_path;
21
+ break;
22
+ case 'Write':
23
+ provenance.filePath = event.toolInput?.file_path;
24
+ break;
25
+ case 'Edit':
26
+ provenance.filePath = event.toolInput?.file_path;
27
+ provenance.hasOldString = !!event.toolInput?.old_string;
28
+ break;
29
+ case 'Bash':
30
+ provenance.command = extractCommandName(event.toolInput?.command);
31
+ provenance.exitCode = extractExitCode(event.toolResult);
32
+ break;
33
+ case 'Glob':
34
+ provenance.pattern = event.toolInput?.pattern;
35
+ provenance.path = event.toolInput?.path;
36
+ break;
37
+ case 'Grep':
38
+ provenance.pattern = event.toolInput?.pattern;
39
+ provenance.path = event.toolInput?.path;
40
+ break;
41
+ case 'Task':
42
+ provenance.subagentType = event.toolInput?.subagent_type;
43
+ provenance.description = event.toolInput?.description;
44
+ break;
45
+ case 'WebFetch':
46
+ provenance.url = event.toolInput?.url;
47
+ break;
48
+ case 'WebSearch':
49
+ provenance.query = event.toolInput?.query;
50
+ break;
51
+ default:
52
+ // For unknown tools, include sanitized input keys
53
+ if (event.toolInput) {
54
+ provenance.inputKeys = Object.keys(event.toolInput);
55
+ }
56
+ }
57
+ return provenance;
58
+ }
59
+ /**
60
+ * Extract provenance from a user prompt event
61
+ */
62
+ export function extractUserPromptProvenance(event) {
63
+ if (event.type !== 'user_prompt') {
64
+ return {};
65
+ }
66
+ return {
67
+ role: 'user',
68
+ length: event.userContent?.length ?? 0,
69
+ };
70
+ }
71
+ /**
72
+ * Extract provenance from a subagent stop event
73
+ */
74
+ export function extractSubagentProvenance(event) {
75
+ if (event.type !== 'subagent_stop') {
76
+ return {};
77
+ }
78
+ return {
79
+ agentType: event.agentType,
80
+ hasOutput: !!event.agentOutput,
81
+ outputLength: event.agentOutput?.length ?? 0,
82
+ };
83
+ }
84
+ /**
85
+ * Extract provenance from a stop event
86
+ */
87
+ export function extractStopProvenance(event) {
88
+ if (event.type !== 'stop') {
89
+ return {};
90
+ }
91
+ return {
92
+ reason: event.stopReason ?? 'unknown',
93
+ };
94
+ }
95
+ /**
96
+ * Extract the command name from a full command string
97
+ */
98
+ function extractCommandName(command) {
99
+ if (!command)
100
+ return undefined;
101
+ const parts = command.trim().split(/\s+/);
102
+ return parts[0] || undefined;
103
+ }
104
+ /**
105
+ * Extract exit code from bash tool result
106
+ */
107
+ function extractExitCode(result) {
108
+ if (typeof result === 'object' && result !== null) {
109
+ const r = result;
110
+ if (typeof r.exitCode === 'number')
111
+ return r.exitCode;
112
+ if (typeof r.exit_code === 'number')
113
+ return r.exit_code;
114
+ }
115
+ return undefined;
116
+ }
117
+ /**
118
+ * Extract provenance based on event type
119
+ */
120
+ export function extractProvenance(event) {
121
+ switch (event.type) {
122
+ case 'post_tool_use':
123
+ return extractToolUseProvenance(event);
124
+ case 'user_prompt':
125
+ return extractUserPromptProvenance(event);
126
+ case 'subagent_stop':
127
+ return extractSubagentProvenance(event);
128
+ case 'stop':
129
+ return extractStopProvenance(event);
130
+ default:
131
+ return {};
132
+ }
133
+ }
134
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/claude-code/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Claude Code session lifecycle management
3
+ *
4
+ * Manages the lifecycle of session capsules via hooks:
5
+ * - onSessionStart: Opens a new capsule
6
+ * - onEvent: Maps events and attaches observations
7
+ * - onStop: Closes the capsule
8
+ */
9
+ import type { Capsule, CapsuleStore, Observation, ID } from '@eddacraft/kindling-core';
10
+ import type { ClaudeCodeEvent } from './events.js';
11
+ /**
12
+ * Session context tracking active session state
13
+ */
14
+ export interface SessionContext {
15
+ sessionId: string;
16
+ cwd: string;
17
+ activeCapsuleId: ID;
18
+ eventCount: number;
19
+ startedAt: number;
20
+ }
21
+ /**
22
+ * Options for starting a session
23
+ */
24
+ export interface SessionStartOptions {
25
+ sessionId: string;
26
+ cwd: string;
27
+ intent?: string;
28
+ }
29
+ /**
30
+ * Signals for ending a session
31
+ */
32
+ export interface SessionEndSignals {
33
+ reason?: string;
34
+ summaryContent?: string;
35
+ summaryConfidence?: number;
36
+ evidenceRefs?: ID[];
37
+ }
38
+ /**
39
+ * Result of processing an event
40
+ */
41
+ export interface EventProcessingResult {
42
+ observation?: Observation;
43
+ skipped?: boolean;
44
+ error?: string;
45
+ }
46
+ /**
47
+ * SessionManager manages Claude Code session lifecycles
48
+ *
49
+ * Provides hooks for session start, event processing, and session end.
50
+ * Each session gets its own capsule that collects observations.
51
+ */
52
+ export declare class SessionManager {
53
+ private store;
54
+ private activeSessions;
55
+ constructor(store: CapsuleStore & {
56
+ insertObservation(observation: Observation): void;
57
+ attachObservationToCapsule(capsuleId: ID, observationId: ID): void;
58
+ });
59
+ /**
60
+ * Start a new session
61
+ *
62
+ * Opens a capsule for the session. If a session already has an open capsule,
63
+ * returns the existing context.
64
+ */
65
+ onSessionStart(options: SessionStartOptions): SessionContext;
66
+ /**
67
+ * Process an event from the session
68
+ *
69
+ * Maps the event to an observation and attaches it to the active capsule.
70
+ */
71
+ onEvent(event: ClaudeCodeEvent): EventProcessingResult;
72
+ /**
73
+ * End a session (called on Stop hook)
74
+ *
75
+ * Closes the active capsule for the session.
76
+ */
77
+ onStop(sessionId: string, signals?: SessionEndSignals): Capsule;
78
+ /**
79
+ * Get active session context
80
+ */
81
+ getSession(sessionId: string): SessionContext | undefined;
82
+ /**
83
+ * Check if session is active
84
+ */
85
+ isSessionActive(sessionId: string): boolean;
86
+ /**
87
+ * Get all active session IDs
88
+ */
89
+ getActiveSessions(): string[];
90
+ /**
91
+ * Get session statistics
92
+ */
93
+ getSessionStats(sessionId: string): {
94
+ eventCount: number;
95
+ duration: number;
96
+ } | undefined;
97
+ }
98
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/claude-code/session.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IAIvB,OAAO,CAAC,KAAK;IAHf,OAAO,CAAC,cAAc,CAA0C;gBAGtD,KAAK,EAAE,YAAY,GAAG;QAC5B,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;QAClD,0BAA0B,CAAC,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC;KACpE;IAGH;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,cAAc;IAqD5D;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,qBAAqB;IA+CtD;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO;IA6C/D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIzD;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI3C;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CASzF"}