agentix-cli 0.8.0 → 0.9.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 (58) hide show
  1. package/README.md +337 -116
  2. package/dist/agent-QYQVGKLM.js +2 -0
  3. package/dist/chunk-34UAFPK4.js +10 -0
  4. package/dist/chunk-34UAFPK4.js.map +1 -0
  5. package/dist/{chunk-X7UN6JAA.js → chunk-6MKAXEE5.js} +2 -2
  6. package/dist/chunk-BAIQJHQF.js +64 -0
  7. package/dist/chunk-BAIQJHQF.js.map +1 -0
  8. package/dist/chunk-BHDLKX3G.js +6 -0
  9. package/dist/chunk-BHDLKX3G.js.map +1 -0
  10. package/dist/chunk-CJ45Y2IR.js +12 -0
  11. package/dist/chunk-CJ45Y2IR.js.map +1 -0
  12. package/dist/chunk-DSYKYZMT.js +2 -0
  13. package/dist/chunk-DSYKYZMT.js.map +1 -0
  14. package/dist/chunk-IVVVYXPH.js +136 -0
  15. package/dist/chunk-IVVVYXPH.js.map +1 -0
  16. package/dist/{chunk-MGMZNJCE.js → chunk-KXZMYLHQ.js} +27 -27
  17. package/dist/chunk-KXZMYLHQ.js.map +1 -0
  18. package/dist/chunk-SBUX74OU.js +108 -0
  19. package/dist/chunk-SBUX74OU.js.map +1 -0
  20. package/dist/chunk-X32247GM.js +2 -0
  21. package/dist/chunk-X32247GM.js.map +1 -0
  22. package/dist/chunk-ZRYBSI5G.js +23 -0
  23. package/dist/chunk-ZRYBSI5G.js.map +1 -0
  24. package/dist/cli.js +280 -36
  25. package/dist/cli.js.map +1 -1
  26. package/dist/compaction-E3MQRLTL.js +28 -0
  27. package/dist/compaction-E3MQRLTL.js.map +1 -0
  28. package/dist/config-MSWKC466.js +2 -0
  29. package/dist/debug-N3B5NVJU.js +2 -0
  30. package/dist/heal-OTGT5HHJ.js +2 -0
  31. package/dist/heal-OTGT5HHJ.js.map +1 -0
  32. package/dist/index.d.ts +712 -239
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/memory-extract-RGPUPMKU.js +2 -0
  36. package/dist/memory-extract-RGPUPMKU.js.map +1 -0
  37. package/dist/{providers-AVYG63KK.js → providers-G3WZ4RVJ.js} +2 -2
  38. package/dist/providers-G3WZ4RVJ.js.map +1 -0
  39. package/dist/registry-FP6FUOXF.js +2 -0
  40. package/dist/registry-FP6FUOXF.js.map +1 -0
  41. package/dist/subagent-WV7QKQ3L.js +3 -0
  42. package/dist/subagent-WV7QKQ3L.js.map +1 -0
  43. package/dist/usage-dashboard-2TJQBFSH.js +404 -0
  44. package/dist/usage-dashboard-2TJQBFSH.js.map +1 -0
  45. package/package.json +4 -1
  46. package/dist/agent-K2YOEOJ5.js +0 -2
  47. package/dist/chunk-F73GPYCO.js +0 -106
  48. package/dist/chunk-F73GPYCO.js.map +0 -1
  49. package/dist/chunk-MGMZNJCE.js.map +0 -1
  50. package/dist/chunk-NGKOM4ZZ.js +0 -137
  51. package/dist/chunk-NGKOM4ZZ.js.map +0 -1
  52. package/dist/chunk-Z4GC5D6D.js +0 -12
  53. package/dist/chunk-Z4GC5D6D.js.map +0 -1
  54. package/dist/heal-UV5A6B5T.js +0 -2
  55. /package/dist/{agent-K2YOEOJ5.js.map → agent-QYQVGKLM.js.map} +0 -0
  56. /package/dist/{chunk-X7UN6JAA.js.map → chunk-6MKAXEE5.js.map} +0 -0
  57. /package/dist/{heal-UV5A6B5T.js.map → config-MSWKC466.js.map} +0 -0
  58. /package/dist/{providers-AVYG63KK.js.map → debug-N3B5NVJU.js.map} +0 -0
@@ -0,0 +1,28 @@
1
+ import"./chunk-4YCH6IZV.js";var c="claude-haiku-4-20250514";var m=`You are a conversation summarizer. Given a conversation history between a user and an AI agent, produce a concise summary that preserves:
2
+
3
+ 1. Key decisions made and their reasoning
4
+ 2. Important facts learned (names, IDs, paths, URLs, credentials shared)
5
+ 3. Commitments and action items (what was promised, deadlines)
6
+ 4. Current task state (what's in progress, what's done, what's blocked)
7
+ 5. User preferences expressed during the conversation
8
+
9
+ Format as a structured summary:
10
+ [Session Summary]
11
+ - Decisions: ...
12
+ - Facts: ...
13
+ - In progress: ...
14
+ - Done: ...
15
+ - Preferences: ...
16
+
17
+ Keep it under 500 words. Prioritize actionable information over conversational flow.
18
+ Do NOT include greetings, acknowledgments, or meta-commentary about the conversation.`;function g(e){return e.length<8?!1:e.reduce((s,n)=>s+n.content.length,0)>1e4}async function h(e,t,s){if(e.length<8)return{summary:"",compactedCount:0,keptCount:e.length,memoryFlushed:!1};let n=Math.max(0,e.length-6),o=e.slice(0,n),r=e.slice(n);if(o.length===0)return{summary:"",compactedCount:0,keptCount:r.length,memoryFlushed:!1};let a=!1;if(s)try{await u(t,o,s),a=!0}catch{}let i=l(o);return{summary:await p(i),compactedCount:o.length,keptCount:r.length,memoryFlushed:a}}function C(e,t){if(t.compactedCount===0)return e;let s=e.slice(-t.keptCount);return[{role:"agent",name:"system",content:`[Compacted conversation summary \u2014 ${t.compactedCount} earlier messages]
19
+
20
+ ${t.summary}`,timestamp:new Date().toISOString()},...s]}async function u(e,t,s){let n=[],o=[];for(let a of t)a.role==="user"?n.push(`${a.name||"User"}: ${a.content}`):o.push(a.content);if(n.length===0||o.length===0)return;let{extractMemories:r}=await import("./memory-extract-RGPUPMKU.js");await r(e,n.join(`
21
+ `),o.join(`
22
+ `),{channel:"compaction",chatId:"flush",sender:"compaction"},s)}function l(e){return e.map(t=>{let s=t.timestamp.slice(11,16),n=t.role==="user"?t.name||"User":t.name||"Agent";return`[${s}] ${n}: ${t.content}`}).join(`
23
+
24
+ `)}async function p(e){let s=e.length>2e4?e.slice(-2e4):e;try{let{createProvider:n}=await import("./providers-G3WZ4RVJ.js");return(await n("claude").generate([{role:"system",content:m},{role:"user",content:s}],{model:c,maxTokens:1024})).content.trim()}catch{let r=e.split(`
25
+ `).slice(-20);return`[Summary unavailable \u2014 keeping last ${r.length} lines]
26
+ ${r.join(`
27
+ `)}`}}export{C as applyCompaction,h as compactSession,g as needsCompaction};
28
+ //# sourceMappingURL=compaction-E3MQRLTL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agents/compaction.ts"],"sourcesContent":["import type { SessionMessage } from \"./sessions\"\nimport type { MemoryStore } from \"./memory-store\"\n\n// --- Context Compaction ---\n//\n// Summarizes conversation history when it grows too large,\n// preventing context loss in long-running sessions.\n//\n// Strategy:\n// 1. Memory flush: extract memorable facts BEFORE compacting\n// 2. Split-aware: keep tool_use/tool_result pairs intact\n// 3. Uses cheaper model (Haiku) for summarization\n// 4. Preserves recent messages verbatim, compacts older ones\n\nconst COMPACTION_MODEL = \"claude-haiku-4-20250514\"\nconst MAX_HISTORY_CHARS = 12000\nconst COMPACT_THRESHOLD = 10000 // Start compacting when history exceeds this\nconst KEEP_RECENT = 6 // Always keep last N messages verbatim\nconst MIN_MESSAGES_TO_COMPACT = 8 // Don't compact if fewer than this\n\nconst COMPACTION_PROMPT = `You are a conversation summarizer. Given a conversation history between a user and an AI agent, produce a concise summary that preserves:\n\n1. Key decisions made and their reasoning\n2. Important facts learned (names, IDs, paths, URLs, credentials shared)\n3. Commitments and action items (what was promised, deadlines)\n4. Current task state (what's in progress, what's done, what's blocked)\n5. User preferences expressed during the conversation\n\nFormat as a structured summary:\n[Session Summary]\n- Decisions: ...\n- Facts: ...\n- In progress: ...\n- Done: ...\n- Preferences: ...\n\nKeep it under 500 words. Prioritize actionable information over conversational flow.\nDo NOT include greetings, acknowledgments, or meta-commentary about the conversation.`\n\nexport interface CompactionResult {\n /** Summarized text replacing older messages */\n summary: string\n /** Messages that were compacted (removed from history) */\n compactedCount: number\n /** Messages kept verbatim (recent) */\n keptCount: number\n /** Whether memory flush was performed before compaction */\n memoryFlushed: boolean\n}\n\n/**\n * Check whether a session's history needs compaction.\n */\nexport function needsCompaction(messages: SessionMessage[]): boolean {\n if (messages.length < MIN_MESSAGES_TO_COMPACT) return false\n const totalChars = messages.reduce((sum, m) => sum + m.content.length, 0)\n return totalChars > COMPACT_THRESHOLD\n}\n\n/**\n * Compact a session's conversation history.\n *\n * Flow:\n * 1. Flush memories from the about-to-be-compacted messages\n * 2. Summarize older messages using Haiku\n * 3. Return summary + preserved recent messages\n */\nexport async function compactSession(\n messages: SessionMessage[],\n agentId: string,\n memoryStore?: MemoryStore,\n): Promise<CompactionResult> {\n if (messages.length < MIN_MESSAGES_TO_COMPACT) {\n return {\n summary: \"\",\n compactedCount: 0,\n keptCount: messages.length,\n memoryFlushed: false,\n }\n }\n\n // Split: older messages to compact, recent to keep\n const splitIdx = Math.max(0, messages.length - KEEP_RECENT)\n const toCompact = messages.slice(0, splitIdx)\n const toKeep = messages.slice(splitIdx)\n\n if (toCompact.length === 0) {\n return {\n summary: \"\",\n compactedCount: 0,\n keptCount: toKeep.length,\n memoryFlushed: false,\n }\n }\n\n // Step 1: Memory flush — extract facts from messages about to be compacted\n let memoryFlushed = false\n if (memoryStore) {\n try {\n await flushMemories(agentId, toCompact, memoryStore)\n memoryFlushed = true\n } catch {\n // Best-effort memory flush\n }\n }\n\n // Step 2: Summarize older messages\n const historyText = formatMessagesForSummary(toCompact)\n const summary = await summarize(historyText)\n\n return {\n summary,\n compactedCount: toCompact.length,\n keptCount: toKeep.length,\n memoryFlushed,\n }\n}\n\n/**\n * Apply compaction result to a session's messages.\n * Replaces older messages with a single summary message and keeps recent ones.\n */\nexport function applyCompaction(\n messages: SessionMessage[],\n result: CompactionResult,\n): SessionMessage[] {\n if (result.compactedCount === 0) return messages\n\n const kept = messages.slice(-result.keptCount)\n\n // Prepend summary as a synthetic \"system\" message\n const summaryMessage: SessionMessage = {\n role: \"agent\",\n name: \"system\",\n content: `[Compacted conversation summary — ${result.compactedCount} earlier messages]\\n\\n${result.summary}`,\n timestamp: new Date().toISOString(),\n }\n\n return [summaryMessage, ...kept]\n}\n\n/**\n * Flush extractable memories from messages before they get compacted.\n * This ensures important facts survive compaction.\n */\nasync function flushMemories(\n agentId: string,\n messages: SessionMessage[],\n store: MemoryStore,\n): Promise<void> {\n // Build a conversation block from the messages\n const userMessages: string[] = []\n const agentMessages: string[] = []\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n userMessages.push(`${msg.name || \"User\"}: ${msg.content}`)\n } else {\n agentMessages.push(msg.content)\n }\n }\n\n if (userMessages.length === 0 || agentMessages.length === 0) return\n\n // Use the existing memory extraction on a combined block\n const { extractMemories } = await import(\"./memory-extract\")\n await extractMemories(\n agentId,\n userMessages.join(\"\\n\"),\n agentMessages.join(\"\\n\"),\n { channel: \"compaction\", chatId: \"flush\", sender: \"compaction\" },\n store,\n )\n}\n\n/**\n * Format messages into a readable transcript for the summarizer.\n */\nfunction formatMessagesForSummary(messages: SessionMessage[]): string {\n return messages\n .map((m) => {\n const time = m.timestamp.slice(11, 16)\n const speaker = m.role === \"user\" ? (m.name || \"User\") : (m.name || \"Agent\")\n return `[${time}] ${speaker}: ${m.content}`\n })\n .join(\"\\n\\n\")\n}\n\n/**\n * Summarize a conversation transcript using a cheap/fast model.\n */\nasync function summarize(transcript: string): Promise<string> {\n // Truncate extremely long transcripts to avoid exceeding Haiku's context\n const maxInputChars = 20000\n const truncated = transcript.length > maxInputChars\n ? transcript.slice(-maxInputChars)\n : transcript\n\n try {\n const { createProvider } = await import(\"@/agent/providers\")\n const provider = createProvider(\"claude\")\n\n const result = await provider.generate(\n [\n { role: \"system\", content: COMPACTION_PROMPT },\n { role: \"user\", content: truncated },\n ],\n { model: COMPACTION_MODEL, maxTokens: 1024 },\n )\n\n return result.content.trim()\n } catch (error: any) {\n // Fallback: simple truncation if summarization fails\n const lines = transcript.split(\"\\n\")\n const kept = lines.slice(-20)\n return `[Summary unavailable — keeping last ${kept.length} lines]\\n${kept.join(\"\\n\")}`\n }\n}\n"],"mappings":"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","names":["COMPACTION_MODEL","COMPACTION_PROMPT","needsCompaction","messages","sum","m","compactSession","agentId","memoryStore","splitIdx","toCompact","toKeep","memoryFlushed","flushMemories","historyText","formatMessagesForSummary","summarize","applyCompaction","result","kept","store","userMessages","agentMessages","msg","extractMemories","time","speaker","transcript","truncated","createProvider","COMPACTION_MODEL"]}
@@ -0,0 +1,2 @@
1
+ import{a,b,c}from"./chunk-BHDLKX3G.js";import"./chunk-4YCH6IZV.js";export{a as daemonConfigSchema,b as loadDaemonConfig,c as validateWorkspaces};
2
+ //# sourceMappingURL=config-MSWKC466.js.map
@@ -0,0 +1,2 @@
1
+ import{a,b,c,d,e}from"./chunk-DSYKYZMT.js";import"./chunk-4YCH6IZV.js";export{e as debug,d as getDebugLogs,c as getDebugState,b as isDebug,a as setDebug};
2
+ //# sourceMappingURL=debug-N3B5NVJU.js.map
@@ -0,0 +1,2 @@
1
+ import{a}from"./chunk-6MKAXEE5.js";import"./chunk-SFQUP3BP.js";import"./chunk-KXZMYLHQ.js";import"./chunk-M7HKBG3V.js";import"./chunk-4YCH6IZV.js";export{a as HealEngine};
2
+ //# sourceMappingURL=heal-OTGT5HHJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}