@weavelogic/knowledge-graph-agent 0.9.0 → 0.10.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 (40) hide show
  1. package/README.md +166 -2
  2. package/dist/_virtual/index10.js +2 -2
  3. package/dist/_virtual/index11.js +2 -2
  4. package/dist/_virtual/index8.js +2 -2
  5. package/dist/_virtual/index9.js +2 -2
  6. package/dist/claude/hook-capture.d.ts +209 -0
  7. package/dist/claude/hook-capture.d.ts.map +1 -0
  8. package/dist/claude/hook-capture.js +792 -0
  9. package/dist/claude/hook-capture.js.map +1 -0
  10. package/dist/claude/index.d.ts +15 -0
  11. package/dist/claude/index.d.ts.map +1 -0
  12. package/dist/claude/types.d.ts +1054 -0
  13. package/dist/claude/types.d.ts.map +1 -0
  14. package/dist/claude/types.js +61 -0
  15. package/dist/claude/types.js.map +1 -0
  16. package/dist/cli/commands/analyze.js +3 -3
  17. package/dist/cli/commands/analyze.js.map +1 -1
  18. package/dist/cli/commands/convert.js +1 -1
  19. package/dist/cli/commands/convert.js.map +1 -1
  20. package/dist/cli/commands/hooks.d.ts +11 -0
  21. package/dist/cli/commands/hooks.d.ts.map +1 -0
  22. package/dist/cli/commands/hooks.js +282 -0
  23. package/dist/cli/commands/hooks.js.map +1 -0
  24. package/dist/cli/index.d.ts.map +1 -1
  25. package/dist/cli/index.js +9 -1
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/generators/docs-analyzer.d.ts +2 -2
  28. package/dist/generators/docs-analyzer.d.ts.map +1 -1
  29. package/dist/generators/docs-analyzer.js +1 -1
  30. package/dist/generators/docs-analyzer.js.map +1 -1
  31. package/dist/generators/docs-convert.d.ts +1 -1
  32. package/dist/generators/docs-convert.d.ts.map +1 -1
  33. package/dist/generators/docs-convert.js +1 -1
  34. package/dist/generators/docs-convert.js.map +1 -1
  35. package/dist/node_modules/@typescript-eslint/project-service/dist/index.js +1 -1
  36. package/dist/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/dist/commonjs/index.js +1 -1
  37. package/dist/node_modules/fdir/dist/index.js +1 -1
  38. package/dist/node_modules/tinyglobby/dist/index.js +1 -1
  39. package/dist/node_modules/ts-api-utils/lib/index.js +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-capture.js","sources":["../../src/claude/hook-capture.ts"],"sourcesContent":["/**\n * Hook Capture System\n *\n * Captures all Claude interactions (prompts, responses, tool calls)\n * and stores them in the knowledge graph with hierarchical structure.\n *\n * @module claude/hook-capture\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport {\n SessionId,\n ConversationId,\n MessageId,\n ToolCallId,\n SubAgentId,\n SwarmId,\n WorkflowId,\n ClaudeSession,\n ClaudeConversation,\n ClaudeMessage,\n ClaudeToolCall,\n ClaudeSubAgent,\n ClaudeSwarm,\n TokenUsage,\n AggregatedTokenUsage,\n ExecutionStatus,\n ClaudeAgentType,\n ToolCategory,\n SwarmTopology,\n SwarmStrategy,\n TextContentBlock,\n BaseMetadata,\n SessionEnvironment,\n createSessionId,\n createConversationId,\n createMessageId,\n createToolCallId,\n createSubAgentId,\n createSwarmId,\n} from './types.js';\n\n/**\n * Hook event types from Claude Code\n */\nexport type HookEventType =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'UserPromptSubmit'\n | 'Stop'\n | 'PreCompact';\n\n/**\n * Raw hook event data received from Claude Code\n */\nexport interface HookEventData {\n event: HookEventType;\n timestamp: string;\n sessionId?: string;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n toolOutput?: string;\n userPrompt?: string;\n exitCode?: number;\n duration?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture configuration options\n */\nexport interface CaptureConfig {\n /** Base directory for storing captured data */\n storageDir: string;\n /** Whether to store in knowledge graph format */\n useKnowledgeGraph: boolean;\n /** Whether to create markdown documents */\n createMarkdown: boolean;\n /** Whether to track tool outputs separately */\n separateToolOutputs: boolean;\n /** Maximum content length to store (truncates if exceeded) */\n maxContentLength: number;\n /** Whether to capture sub-agent spawns */\n captureSubAgents: boolean;\n /** Whether to capture swarm operations */\n captureSwarms: boolean;\n /** Whether to capture workflow executions */\n captureWorkflows: boolean;\n /** Tags to add to all captured items */\n defaultTags: string[];\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CAPTURE_CONFIG: CaptureConfig = {\n storageDir: '.kg/claude',\n useKnowledgeGraph: true,\n createMarkdown: true,\n separateToolOutputs: true,\n maxContentLength: 50000,\n captureSubAgents: true,\n captureSwarms: true,\n captureWorkflows: true,\n defaultTags: ['claude', 'interaction'],\n};\n\n/**\n * In-memory storage for active session data\n */\ninterface StoredSession {\n session: ClaudeSession;\n conversations: Map<ConversationId, ClaudeConversation>;\n messages: Map<MessageId, ClaudeMessage>;\n toolCalls: Map<ToolCallId, ClaudeToolCall>;\n subAgents: Map<SubAgentId, ClaudeSubAgent>;\n swarms: Map<SwarmId, ClaudeSwarm>;\n}\n\n/**\n * Active session state\n */\ninterface CaptureState {\n currentSessionId: SessionId | null;\n currentConversationId: ConversationId | null;\n pendingToolCalls: Map<string, ToolCallId>;\n subAgentStack: SubAgentId[];\n activeSwarmId: SwarmId | null;\n storage: StoredSession | null;\n}\n\n/**\n * Hook Capture System\n *\n * Manages the capture and storage of all Claude interactions.\n */\nexport class HookCaptureSystem {\n private config: CaptureConfig;\n private state: CaptureState;\n private projectRoot: string;\n\n constructor(projectRoot: string, config: Partial<CaptureConfig> = {}) {\n this.projectRoot = projectRoot;\n this.config = { ...DEFAULT_CAPTURE_CONFIG, ...config };\n this.state = {\n currentSessionId: null,\n currentConversationId: null,\n pendingToolCalls: new Map(),\n subAgentStack: [],\n activeSwarmId: null,\n storage: null,\n };\n\n this.ensureStorageDir();\n }\n\n /**\n * Ensure storage directory exists\n */\n private ensureStorageDir(): void {\n const fullPath = join(this.projectRoot, this.config.storageDir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n\n /**\n * Create empty token usage\n */\n private createEmptyTokenUsage(): TokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n }\n\n /**\n * Create empty aggregated token usage\n */\n private createEmptyAggregatedTokenUsage(): AggregatedTokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n operationCount: 0,\n };\n }\n\n /**\n * Create base metadata\n */\n private createBaseMetadata(tags: string[] = []): BaseMetadata {\n const now = new Date();\n return {\n createdAt: now,\n updatedAt: now,\n tags: [...this.config.defaultTags, ...tags],\n };\n }\n\n /**\n * Get current git branch\n */\n private getGitBranch(): string | undefined {\n try {\n const headPath = join(this.projectRoot, '.git', 'HEAD');\n if (existsSync(headPath)) {\n const content = readFileSync(headPath, 'utf-8').trim();\n if (content.startsWith('ref: refs/heads/')) {\n return content.replace('ref: refs/heads/', '');\n }\n }\n } catch {\n // Ignore errors\n }\n return undefined;\n }\n\n /**\n * Start a new session\n */\n startSession(name?: string, purpose?: string): ClaudeSession {\n const sessionId = createSessionId();\n const now = new Date();\n\n const environment: SessionEnvironment = {\n workingDirectory: this.projectRoot,\n gitBranch: this.getGitBranch(),\n platform: process.platform,\n };\n\n const session: ClaudeSession = {\n id: sessionId,\n name: name || `Session ${now.toISOString().slice(0, 16)}`,\n purpose: purpose || 'General interaction',\n startedAt: now,\n status: 'running',\n conversationIds: [],\n swarmIds: [],\n workflowIds: [],\n environment,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['session']),\n };\n\n // Initialize storage\n this.state.storage = {\n session,\n conversations: new Map(),\n messages: new Map(),\n toolCalls: new Map(),\n subAgents: new Map(),\n swarms: new Map(),\n };\n\n this.state.currentSessionId = sessionId;\n this.saveSession(session);\n\n return session;\n }\n\n /**\n * End the current session\n */\n endSession(): ClaudeSession | null {\n if (!this.state.storage) return null;\n\n const session = this.state.storage.session;\n session.endedAt = new Date();\n session.status = 'completed';\n session.metadata.updatedAt = new Date();\n\n // Aggregate token usage from all conversations\n this.aggregateSessionTokens();\n\n this.saveSession(session);\n const result = { ...session };\n\n // Reset state\n this.state.currentSessionId = null;\n this.state.currentConversationId = null;\n this.state.storage = null;\n\n return result;\n }\n\n /**\n * Start a new conversation\n */\n startConversation(model?: string, systemPrompt?: string): ClaudeConversation {\n if (!this.state.storage) {\n this.startSession();\n }\n\n const conversationId = createConversationId();\n const now = new Date();\n\n const conversation: ClaudeConversation = {\n id: conversationId,\n sessionId: this.state.storage!.session.id,\n model: model || 'claude-opus-4-5-20251101',\n systemPrompt,\n messageIds: [],\n subAgentIds: [],\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['conversation']),\n };\n\n this.state.storage!.conversations.set(conversationId, conversation);\n this.state.storage!.session.conversationIds.push(conversationId);\n this.state.currentConversationId = conversationId;\n\n return conversation;\n }\n\n /**\n * Handle hook events\n */\n handleHookEvent(event: HookEventData): void {\n switch (event.event) {\n case 'UserPromptSubmit':\n this.handleUserPrompt(event);\n break;\n case 'PreToolUse':\n this.handlePreToolUse(event);\n break;\n case 'PostToolUse':\n this.handlePostToolUse(event);\n break;\n case 'Stop':\n this.handleSessionStop(event);\n break;\n case 'PreCompact':\n this.handlePreCompact(event);\n break;\n }\n }\n\n /**\n * Handle user prompt submission\n */\n private handleUserPrompt(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const messageId = createMessageId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n const textBlock: TextContentBlock = {\n type: 'text',\n text: this.truncateContent(event.userPrompt || ''),\n };\n\n const message: ClaudeMessage = {\n id: messageId,\n conversationId,\n role: 'user',\n content: textBlock.text,\n contentBlocks: [textBlock],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['prompt', 'user']),\n };\n\n this.state.storage!.messages.set(messageId, message);\n\n const conversation = this.state.storage!.conversations.get(conversationId);\n if (conversation) {\n conversation.messageIds.push(messageId);\n }\n\n this.saveMessage(message);\n }\n\n /**\n * Handle pre-tool use event\n */\n private handlePreToolUse(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const toolCallId = createToolCallId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n // Get or create assistant message\n let lastMessageId: MessageId | undefined;\n const conversation = this.state.storage!.conversations.get(conversationId);\n\n if (conversation && conversation.messageIds.length > 0) {\n lastMessageId = conversation.messageIds[conversation.messageIds.length - 1];\n const lastMessage = this.state.storage!.messages.get(lastMessageId);\n\n if (!lastMessage || lastMessage.role === 'user') {\n // Create new assistant message\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n conversation.messageIds.push(assistantMsgId);\n lastMessageId = assistantMsgId;\n }\n } else {\n // Create new assistant message if no conversation exists\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n if (conversation) {\n conversation.messageIds.push(assistantMsgId);\n }\n lastMessageId = assistantMsgId;\n }\n\n const toolCall: ClaudeToolCall = {\n id: toolCallId,\n messageId: lastMessageId!,\n toolName: event.toolName || 'unknown',\n toolCategory: this.categorizeToolCall(event.toolName || ''),\n input: event.toolInput || {},\n status: 'running',\n startedAt: now,\n metadata: this.createBaseMetadata(['tool-call', event.toolName || 'unknown']),\n };\n\n this.state.storage!.toolCalls.set(toolCallId, toolCall);\n\n // Add to message's tool call list\n const message = this.state.storage!.messages.get(lastMessageId!);\n if (message) {\n message.toolCallIds = message.toolCallIds || [];\n message.toolCallIds.push(toolCallId);\n }\n\n // Track pending tool call by name for matching\n this.state.pendingToolCalls.set(event.toolName || 'unknown', toolCallId);\n\n // Check if this is a Task (sub-agent spawn)\n if (event.toolName === 'Task' && this.config.captureSubAgents) {\n this.handleSubAgentSpawn(event, toolCall);\n }\n\n // Check if this is a swarm operation\n if (event.toolName?.includes('swarm') && this.config.captureSwarms) {\n this.handleSwarmOperation(event, toolCall);\n }\n }\n\n /**\n * Handle post-tool use event\n */\n private handlePostToolUse(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const now = new Date();\n\n // Find the pending tool call\n const toolCallId = this.state.pendingToolCalls.get(event.toolName || 'unknown');\n if (!toolCallId) return;\n\n this.state.pendingToolCalls.delete(event.toolName || 'unknown');\n\n const toolCall = this.state.storage.toolCalls.get(toolCallId);\n if (!toolCall) return;\n\n toolCall.output = this.truncateContent(event.toolOutput || '');\n toolCall.completedAt = now;\n toolCall.status = event.error ? 'failed' : 'completed';\n toolCall.executionTimeMs = event.duration;\n if (event.error) {\n toolCall.error = {\n type: 'execution_error',\n message: event.error,\n };\n }\n toolCall.metadata.updatedAt = now;\n\n // Track affected files for file operations\n if (toolCall.toolCategory === 'file') {\n const input = toolCall.input as Record<string, unknown>;\n const filePath = input.file_path || input.path;\n if (filePath) {\n toolCall.affectedFiles = [String(filePath)];\n }\n }\n\n // Handle sub-agent completion\n if (event.toolName === 'Task' && this.state.subAgentStack.length > 0) {\n this.handleSubAgentComplete(event);\n }\n\n this.saveToolCall(toolCall);\n }\n\n /**\n * Handle session stop event\n */\n private handleSessionStop(_event: HookEventData): void {\n this.endSession();\n }\n\n /**\n * Handle pre-compact event\n */\n private handlePreCompact(_event: HookEventData): void {\n // Save current state before compaction\n if (this.state.storage) {\n this.state.storage.session.metadata.custom = {\n ...this.state.storage.session.metadata.custom,\n lastCompaction: new Date().toISOString(),\n };\n this.saveSession(this.state.storage.session);\n }\n }\n\n /**\n * Handle sub-agent spawn\n */\n private handleSubAgentSpawn(event: HookEventData, toolCall: ClaudeToolCall): void {\n if (!this.state.storage || !this.state.currentConversationId) return;\n\n const subAgentId = createSubAgentId();\n const now = new Date();\n\n const input = event.toolInput as Record<string, unknown>;\n const parentConversationId = this.state.currentConversationId;\n const parentMessageId = toolCall.messageId;\n\n const subAgent: ClaudeSubAgent = {\n id: subAgentId,\n parentConversationId,\n parentMessageId,\n toolCallId: toolCall.id,\n agentType: (input.subagent_type as ClaudeAgentType) || 'custom',\n name: String(input.description || 'Sub-agent'),\n task: this.truncateContent(String(input.prompt || input.description || 'Unknown task')),\n model: (input.model as string) || 'claude-sonnet-4-20250514',\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['sub-agent', String(input.subagent_type || 'custom')]),\n };\n\n this.state.storage.subAgents.set(subAgentId, subAgent);\n this.state.subAgentStack.push(subAgentId);\n\n // Add to conversation's sub-agent list\n const conversation = this.state.storage.conversations.get(parentConversationId);\n if (conversation) {\n conversation.subAgentIds = conversation.subAgentIds || [];\n conversation.subAgentIds.push(subAgentId);\n }\n }\n\n /**\n * Handle sub-agent completion\n */\n private handleSubAgentComplete(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const subAgentId = this.state.subAgentStack.pop();\n if (!subAgentId) return;\n\n const subAgent = this.state.storage.subAgents.get(subAgentId);\n if (!subAgent) return;\n\n const now = new Date();\n subAgent.completedAt = now;\n subAgent.status = event.error ? 'failed' : 'completed';\n\n // Parse result\n subAgent.result = {\n success: !event.error,\n summary: this.truncateContent(event.toolOutput || '').slice(0, 500),\n error: event.error,\n };\n\n subAgent.metadata.updatedAt = now;\n this.saveSubAgent(subAgent);\n }\n\n /**\n * Handle swarm operation\n */\n private handleSwarmOperation(event: HookEventData, _toolCall: ClaudeToolCall): void {\n if (!this.state.storage) return;\n\n const input = event.toolInput as Record<string, unknown>;\n\n if (event.toolName?.includes('swarm_init')) {\n const swarmId = createSwarmId();\n const now = new Date();\n\n const swarm: ClaudeSwarm = {\n id: swarmId,\n sessionId: this.state.storage.session.id,\n name: String(input.name || 'Swarm'),\n topology: (input.topology as SwarmTopology) || 'mesh',\n strategy: (input.strategy as SwarmStrategy) || 'adaptive',\n maxAgents: (input.maxAgents as number) || 8,\n agentIds: [],\n task: String(input.task || 'Swarm task'),\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['swarm']),\n };\n\n this.state.storage.swarms.set(swarmId, swarm);\n this.state.storage.session.swarmIds = this.state.storage.session.swarmIds || [];\n this.state.storage.session.swarmIds.push(swarmId);\n this.state.activeSwarmId = swarmId;\n }\n }\n\n /**\n * Categorize tool calls\n */\n private categorizeToolCall(toolName: string): ToolCategory {\n const categories: Record<string, ToolCategory> = {\n Read: 'file',\n Write: 'file',\n Edit: 'file',\n MultiEdit: 'file',\n Glob: 'file',\n Grep: 'file',\n Bash: 'bash',\n Task: 'task',\n WebFetch: 'search',\n WebSearch: 'search',\n TodoWrite: 'todo',\n NotebookEdit: 'notebook',\n Skill: 'skill',\n };\n\n if (toolName.startsWith('mcp__')) {\n return 'mcp';\n }\n\n return categories[toolName] || 'other';\n }\n\n /**\n * Aggregate session tokens\n */\n private aggregateSessionTokens(): void {\n if (!this.state.storage) return;\n\n let totalInput = 0;\n let totalOutput = 0;\n let operationCount = 0;\n\n for (const conversation of this.state.storage.conversations.values()) {\n totalInput += conversation.tokenUsage.inputTokens;\n totalOutput += conversation.tokenUsage.outputTokens;\n operationCount++;\n }\n\n this.state.storage.session.tokenUsage = {\n inputTokens: totalInput,\n outputTokens: totalOutput,\n totalTokens: totalInput + totalOutput,\n operationCount,\n };\n }\n\n /**\n * Truncate content to max length\n */\n private truncateContent(content: string): string {\n if (content.length <= this.config.maxContentLength) {\n return content;\n }\n return content.slice(0, this.config.maxContentLength) + '\\n\\n[... truncated ...]';\n }\n\n /**\n * Get storage path for an entity\n */\n private getStoragePath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.json`);\n }\n\n /**\n * Get markdown path for an entity\n */\n private getMarkdownPath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, 'docs', type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.md`);\n }\n\n /**\n * Save session to storage\n */\n private saveSession(session: ClaudeSession): void {\n const path = this.getStoragePath('sessions', session.id);\n writeFileSync(path, JSON.stringify(session, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSessionMarkdown(session);\n }\n }\n\n /**\n * Save session as markdown\n */\n private saveSessionMarkdown(session: ClaudeSession): void {\n const path = this.getMarkdownPath('sessions', session.id);\n\n const content = `---\ntitle: \"${session.name}\"\ntype: claude-session\nstatus: ${session.status}\ncreated: ${session.startedAt.toISOString()}\nupdated: ${session.metadata.updatedAt.toISOString()}\ntags: [${session.metadata.tags.join(', ')}]\nsession_id: \"${session.id}\"\n---\n\n# ${session.name}\n\n**Purpose:** ${session.purpose || 'General interaction'}\n\n**Started:** ${session.startedAt.toISOString()}\n${session.endedAt ? `**Ended:** ${session.endedAt.toISOString()}` : '**Status:** In Progress'}\n\n## Environment\n\n- **Working Directory:** ${session.environment?.workingDirectory || 'Unknown'}\n${session.environment?.gitBranch ? `- **Git Branch:** ${session.environment.gitBranch}` : ''}\n\n## Conversations\n\n${session.conversationIds.map(id => `- [[${id}]]`).join('\\n') || 'No conversations yet'}\n\n## Token Usage\n\n| Metric | Count |\n|--------|-------|\n| Input Tokens | ${session.tokenUsage.inputTokens} |\n| Output Tokens | ${session.tokenUsage.outputTokens} |\n| Total Tokens | ${session.tokenUsage.totalTokens} |\n| Operations | ${session.tokenUsage.operationCount} |\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Save message to storage\n */\n private saveMessage(message: ClaudeMessage): void {\n if (this.config.createMarkdown) {\n this.appendToConversationLog(message);\n }\n }\n\n /**\n * Append message to conversation log\n */\n private appendToConversationLog(message: ClaudeMessage): void {\n const path = this.getMarkdownPath('conversations', message.conversationId);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Initialize file with header if new\n if (!existsSync(path)) {\n const header = `---\ntitle: \"Conversation ${message.conversationId}\"\ntype: claude-conversation\ncreated: ${message.timestamp.toISOString()}\ntags: [${this.config.defaultTags.join(', ')}]\n---\n\n# Conversation Log\n\n`;\n writeFileSync(path, header);\n }\n\n const roleIcon = message.role === 'user' ? '👤' : '🤖';\n\n const entry = `\n## ${roleIcon} ${message.role.charAt(0).toUpperCase() + message.role.slice(1)} - ${message.timestamp.toISOString()}\n\n${message.content}\n\n${message.toolCallIds && message.toolCallIds.length > 0 ? `**Tool Calls:** ${message.toolCallIds.join(', ')}` : ''}\n\n---\n`;\n\n appendFileSync(path, entry);\n }\n\n /**\n * Save tool call to storage\n */\n private saveToolCall(toolCall: ClaudeToolCall): void {\n if (this.config.separateToolOutputs && toolCall.output) {\n const path = this.getStoragePath('tool-outputs', toolCall.id);\n writeFileSync(\n path,\n JSON.stringify(\n {\n id: toolCall.id,\n name: toolCall.toolName,\n category: toolCall.toolCategory,\n input: toolCall.input,\n output: toolCall.output,\n status: toolCall.status,\n executionTimeMs: toolCall.executionTimeMs,\n affectedFiles: toolCall.affectedFiles,\n timestamp: toolCall.completedAt?.toISOString(),\n },\n null,\n 2\n )\n );\n }\n }\n\n /**\n * Save sub-agent to storage\n */\n private saveSubAgent(subAgent: ClaudeSubAgent): void {\n const path = this.getStoragePath('agents', subAgent.id);\n writeFileSync(path, JSON.stringify(subAgent, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSubAgentMarkdown(subAgent);\n }\n }\n\n /**\n * Save sub-agent as markdown\n */\n private saveSubAgentMarkdown(subAgent: ClaudeSubAgent): void {\n const path = this.getMarkdownPath('agents', subAgent.id);\n\n const content = `---\ntitle: \"Sub-Agent: ${subAgent.name.slice(0, 50)}\"\ntype: claude-agent\nstatus: ${subAgent.status}\nagent_type: ${subAgent.agentType}\ncreated: ${subAgent.startedAt.toISOString()}\ntags: [${subAgent.metadata.tags.join(', ')}]\n---\n\n# Sub-Agent: ${subAgent.agentType}\n\n**Name:** ${subAgent.name}\n**Task:** ${subAgent.task.slice(0, 200)}${subAgent.task.length > 200 ? '...' : ''}\n\n**Status:** ${subAgent.status}\n**Model:** ${subAgent.model}\n**Spawned:** ${subAgent.startedAt.toISOString()}\n${subAgent.completedAt ? `**Completed:** ${subAgent.completedAt.toISOString()}` : ''}\n\n## Task Description\n\n\\`\\`\\`\n${subAgent.task}\n\\`\\`\\`\n\n${\n subAgent.result\n ? `\n## Result\n\n**Success:** ${subAgent.result.success}\n\n${subAgent.result.summary ? `### Summary\\n${subAgent.result.summary}` : ''}\n\n${subAgent.result.error ? `### Error\\n\\`\\`\\`\\n${subAgent.result.error}\\n\\`\\`\\`` : ''}\n`\n : ''\n}\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Get current session\n */\n getCurrentSession(): ClaudeSession | null {\n return this.state.storage?.session || null;\n }\n\n /**\n * Get current conversation\n */\n getCurrentConversation(): ClaudeConversation | null {\n if (!this.state.storage || !this.state.currentConversationId) return null;\n return this.state.storage.conversations.get(this.state.currentConversationId) || null;\n }\n\n /**\n * Load session from storage\n */\n loadSession(sessionId: SessionId): ClaudeSession | null {\n const path = this.getStoragePath('sessions', sessionId);\n if (!existsSync(path)) return null;\n\n try {\n const data = readFileSync(path, 'utf-8');\n return JSON.parse(data) as ClaudeSession;\n } catch {\n return null;\n }\n }\n\n /**\n * List all stored sessions\n */\n listSessions(): SessionId[] {\n const sessionsDir = join(this.projectRoot, this.config.storageDir, 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n try {\n const { readdirSync } = require('fs');\n const files = readdirSync(sessionsDir) as string[];\n return files\n .filter((f: string) => f.endsWith('.json'))\n .map((f: string) => f.replace('.json', '') as SessionId);\n } catch {\n return [];\n }\n }\n}\n\n/**\n * Process hook event from stdin (for use as CLI hook)\n */\nexport async function processHookEvent(\n projectRoot: string,\n eventType: HookEventType,\n config?: Partial<CaptureConfig>\n): Promise<void> {\n const capture = new HookCaptureSystem(projectRoot, config);\n\n // Read event data from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const inputData = Buffer.concat(chunks).toString('utf-8');\n\n let eventData: HookEventData;\n\n try {\n const parsed = JSON.parse(inputData);\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n toolName: parsed.tool_name || process.env.TOOL_NAME,\n toolInput: parsed.tool_input,\n toolOutput: parsed.tool_output,\n userPrompt: parsed.user_prompt || inputData,\n metadata: parsed,\n };\n } catch {\n // Plain text input (e.g., user prompt)\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n userPrompt: inputData,\n };\n }\n\n capture.handleHookEvent(eventData);\n}\n\n/**\n * Generate Claude Code hook configuration\n */\nexport function generateHookConfig(projectRoot: string): Record<string, unknown> {\n const kgBinPath = 'npx @weavelogic/knowledge-graph-agent';\n\n return {\n hooks: {\n UserPromptSubmit: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event UserPromptSubmit --path \"${projectRoot}\"`,\n },\n ],\n PreToolUse: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PreToolUse --path \"${projectRoot}\"`,\n },\n ],\n PostToolUse: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PostToolUse --path \"${projectRoot}\"`,\n },\n ],\n Stop: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event Stop --path \"${projectRoot}\"`,\n },\n ],\n },\n };\n}\n\nexport default HookCaptureSystem;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Claude Interaction Storage Module
3
+ *
4
+ * Exports types and utilities for storing Claude prompts, outputs,
5
+ * and tool calls in a hierarchical knowledge graph structure.
6
+ *
7
+ * @module claude
8
+ */
9
+ export * from './types.js';
10
+ export type { SessionId, ConversationId, MessageId, ToolCallId, SubAgentId, SwarmId, WorkflowId, ClaudeSession, ClaudeConversation, ClaudeMessage, ClaudeToolCall, ClaudeSubAgent, ClaudeSwarm, ClaudeWorkflow, TokenUsage, AggregatedTokenUsage, BaseMetadata, ClaudeGraphEdge, ClaudeInteractionFilter, ClaudeAnalyticsSummary, } from './types.js';
11
+ export { createSessionId, createConversationId, createMessageId, createToolCallId, createSubAgentId, createSwarmId, createWorkflowId, } from './types.js';
12
+ export { isClaudeSession, isClaudeConversation, isClaudeMessage, isClaudeToolCall, isClaudeSubAgent, isClaudeSwarm, isClaudeWorkflow, } from './types.js';
13
+ export { TokenUsageSchema, BaseMetadataSchema, ClaudeSessionSchema, } from './types.js';
14
+ export { HookCaptureSystem, processHookEvent, generateHookConfig, DEFAULT_CAPTURE_CONFIG, type HookEventType, type HookEventData, type CaptureConfig, } from './hook-capture.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/claude/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,YAAY,CAAC;AAG3B,YAAY,EAEV,SAAS,EACT,cAAc,EACd,SAAS,EACT,UAAU,EACV,UAAU,EACV,OAAO,EACP,UAAU,EAGV,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EAGd,UAAU,EACV,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC"}