zen-code 4.7.4 → 4.8.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 (83) hide show
  1. package/dist/app.js +271 -0
  2. package/dist/chunk-0fhpz98a.js +2 -0
  3. package/dist/chunk-15smn69q.js +31 -0
  4. package/dist/chunk-3ep2tag7.js +2 -0
  5. package/dist/chunk-3jek9sxm.js +2 -0
  6. package/dist/chunk-3n2b4eb4.js +2 -0
  7. package/dist/chunk-3znrwnd8.js +1 -0
  8. package/dist/chunk-4b8yaknt.js +1 -0
  9. package/dist/chunk-5fqt5yg1.js +81 -0
  10. package/dist/chunk-5nzs0q25.js +1 -0
  11. package/dist/chunk-5wn1nfqy.js +6 -0
  12. package/dist/chunk-6ty22kkt.js +4 -0
  13. package/dist/chunk-70a0e941.js +1 -0
  14. package/dist/chunk-7dp8kq2f.js +2 -0
  15. package/dist/chunk-8nhayyat.js +1 -0
  16. package/dist/chunk-9k57afdm.js +2 -0
  17. package/dist/chunk-9kc9cea3.js +7 -0
  18. package/dist/chunk-bgpcx3bm.js +2 -0
  19. package/dist/chunk-bjywwcgn.js +26 -0
  20. package/dist/chunk-c9q11tk2.js +88 -0
  21. package/dist/chunk-cga0m5sy.js +1 -0
  22. package/dist/chunk-cze71w02.js +2 -0
  23. package/dist/chunk-czz2fs2w.js +7 -0
  24. package/dist/chunk-dh3jz71n.js +1 -0
  25. package/dist/chunk-e0sqjq2h.js +1 -0
  26. package/dist/chunk-efhkdw2z.js +1 -0
  27. package/dist/chunk-ew7249h9.js +1 -0
  28. package/dist/chunk-h5nnz4dy.js +1 -0
  29. package/dist/chunk-hww94vjn.js +1 -0
  30. package/dist/chunk-j1n8jp1w.js +253 -0
  31. package/dist/chunk-j204fejq.js +1 -0
  32. package/dist/chunk-jkbtx9va.js +2 -0
  33. package/dist/chunk-k67epfhc.js +1 -0
  34. package/dist/chunk-kbs4px1b.js +6 -0
  35. package/dist/chunk-keqk70wm.js +2 -0
  36. package/dist/chunk-kxk71nn0.js +1 -0
  37. package/dist/chunk-mg8zpgaz.js +1 -0
  38. package/dist/chunk-n1d8xx5k.js +2 -0
  39. package/dist/chunk-ndtwq2zx.js +2 -0
  40. package/dist/chunk-pdkbrds7.js +1 -0
  41. package/dist/chunk-q8arjxg1.js +23 -0
  42. package/dist/chunk-rdc9pxf6.js +1 -0
  43. package/dist/chunk-rrkzfahh.js +91 -0
  44. package/dist/chunk-s3fyfrka.js +2 -0
  45. package/dist/chunk-sft6ep0c.js +310 -0
  46. package/dist/chunk-vc384abg.js +3 -0
  47. package/dist/chunk-vjj00e3e.js +6 -0
  48. package/dist/chunk-vkng13p1.js +424 -0
  49. package/dist/chunk-wbn1hbxf.js +1 -0
  50. package/dist/chunk-wwn7gw8g.js +274 -0
  51. package/dist/chunk-yaa4eesd.js +2 -0
  52. package/dist/chunk-yvhq458c.js +25 -0
  53. package/dist/cli.js +2 -0
  54. package/dist/nonInteractive.js +4 -0
  55. package/dist/zen-keyboard.js +3 -0
  56. package/package.json +88 -87
  57. package/LICENSE +0 -201
  58. package/dist/FileSystemPluginStore-ChortK7z.mjs +0 -64
  59. package/dist/FileSystemSkillStore-Dl5briBv.mjs +0 -108
  60. package/dist/MultiLineTextInput-CL8nm9nv.mjs +0 -24492
  61. package/dist/_commonjsHelpers-DQNKXVTB.mjs +0 -33
  62. package/dist/app-CK3nD8Gj.mjs +0 -22428
  63. package/dist/checkpoint-C5AFBYE--CczNxXBB.mjs +0 -355
  64. package/dist/checkpoint-DxiUsHMy-B5iaccT2.mjs +0 -394
  65. package/dist/cli.mjs +0 -57
  66. package/dist/devtools-CzaVuYnh.mjs +0 -2667
  67. package/dist/graphBuilder-DJoMXf6J.mjs +0 -28909
  68. package/dist/index-BPG5Np-8.mjs +0 -144
  69. package/dist/index-Dxfhvdx8.mjs +0 -23
  70. package/dist/index-F6_SKYUd.mjs +0 -463
  71. package/dist/load-iYJqYrjn.mjs +0 -119
  72. package/dist/memories-CaHDnBK1.mjs +0 -115
  73. package/dist/metadata-XVTVXthy.mjs +0 -6
  74. package/dist/nonInteractive.mjs +0 -55
  75. package/dist/pg-adapter-BFtir1GE-BbUXBpaX.mjs +0 -60
  76. package/dist/queue-DySatFkr-CG2GdO4P.mjs +0 -106
  77. package/dist/remote-threads-CrG03ZS7-C9duTCnB.mjs +0 -157
  78. package/dist/shallow-G4eKoZ7M.mjs +0 -331
  79. package/dist/shallow-checkpoint-BEhTdp7z-DfHxnfoU.mjs +0 -383
  80. package/dist/sqlite-adapter-oBA95xba-BrBWorSV.mjs +0 -82
  81. package/dist/subTasks-DNjIN4eU.mjs +0 -18
  82. package/dist/zen-code.mjs +0 -3
  83. package/dist/zen-keyboard.mjs +0 -13
@@ -0,0 +1,253 @@
1
+ import{Fa as _}from"./chunk-vkng13p1.js";import{Ga as G,Ia as T,Ja as V,Ka as x,La as R}from"./chunk-bjywwcgn.js";function Z($,f="Human",J="AI"){let q=[];for(let B of $){let U;if(B.type==="human")U=f;else if(B.type==="ai")U=J;else if(B.type==="system")U="System";else if(B.type==="tool")U="Tool";else if(B.type==="generic")U=B.role;else throw Error(`Got unsupported message type: ${B.type}`);let O=B.name?`${B.name}, `:"",Q=typeof B.content==="string"?B.content:JSON.stringify(B.content,null,2);q.push(`${U}: ${O}${Q}`)}return q.join(`
2
+ `)}import{REMOVE_ALL_MESSAGES as j,START as I,StateGraph as S}from"@langchain/langgraph";import{AIMessage as v,RemoveMessage as u}from"@langchain/core/messages";import{HumanMessage as b}from"@langchain/core/messages";import{z as K}from"zod";import{promises as W}from"fs";import X from"path";import N from"yaml";var H=($)=>{return $?.replace(process.cwd(),".")||$||""};import{createAgent as P,toolStrategy as p}from"langchain";var E=K.object({summary_of_chat:K.string().describe("对话总结(300-500字):1) 完整复现对话的核心过程(任务背景→关键决策→解决方案→最终结果);2) 明确说明接下来要做什么(后续行动、待完成任务、需要用户确认的事项);3) 突出关键成果和交付物"),name:K.string().describe("记忆名称(kebab-case 格式)"),description:K.string().describe("对于这个记忆的中等长度描述(索引综述,200-500字符,包含背景、关键点、适用场景)"),tags:K.array(K.string()).describe("记忆标签"),category:K.enum(["architecture","bug-fix","workflow","configuration","optimization"]).describe("记忆分类"),created:K.string().describe("创建日期(ISO 格式:YYYY-MM-DD)"),last_updated:K.string().describe("最后更新日期(ISO 格式:YYYY-MM-DD)"),priority:K.enum(["high","medium","low"]).describe("优先级"),context_scope:K.enum(["user","project"]).describe("上下文范围"),content:K.string().describe("记忆内容(详细说明,包含代码示例)")}),k=`你是一个负责分析对话并提取关键信息的智能助手。
3
+
4
+ ## 任务
5
+
6
+ 1. **对话总结 (summary_of_chat)**:完整复现对话并明确后续行动
7
+ 2. **记忆提取**:判断是否有值得保存为长期记忆的信息
8
+
9
+ ## 对话总结要求 (summary_of_chat)
10
+
11
+ **必须包含以下三个部分**:
12
+
13
+ ### 1. 完整复现对话核心过程
14
+ - **任务背景**:用户想做什么?遇到什么问题?
15
+ - **关键决策**:做出了什么选择?为什么?
16
+ - **解决方案**:具体怎么实现的?用了什么技术/方法?
17
+ - **最终结果**:完成了什么?输出了什么?
18
+
19
+ ### 2. 明确后续行动
20
+ - **待完成任务**:还有哪些未完成的工作?
21
+ - **需要确认**:哪些事项需要用户决策?
22
+ - **下一步建议**:建议接下来做什么?
23
+
24
+ ### 3. 突出关键成果
25
+ - **交付物**:生成了什么文件/代码/文档?
26
+ - **价值点**:解决了什么核心问题?
27
+ - **可复用性**:什么内容可以复用?
28
+
29
+ **格式要求**:
30
+ - 300-500 字
31
+ - 使用清晰的结构(可用 → 表示流程)
32
+ - 突出关键信息(文件路径、函数名、配置项)
33
+
34
+ **示例**:
35
+ \`\`\`
36
+ 用户需要为 TUI 应用添加模型选择面板。通过创建 ModelPanel 组件实现交互式界面(↑↓选择、Enter切换、q关闭),在 Chat.tsx 中扩展 activeView 状态添加 'model' 类型,定义 switchToModel 回调并传递到命令系统,注册 /model-panel 和 /mp 命令。修复了 CommandHandler 未解构 switchToModel 的 bug。✓ 完成:可用的模型选择面板;⏳ 待定:是否需要添加模型描述信息展示;→ 建议:测试面板在不同终端下的渲染效果
37
+ \`\`\`
38
+
39
+ ## 记忆评分机制(总分 10 分,≥ 6 分才保存)
40
+
41
+ ## 记忆评分机制(总分 10 分,≥ 6 分才保存)
42
+
43
+ 1. **重要性** (0-3 分)
44
+ - 3 分:关键技术决策、架构设计、重要问题解决方案
45
+ - 2 分:有用的编码模式、最佳实践
46
+ - 1 分:一般性建议、参考信息
47
+ - 0 分:无实际内容
48
+
49
+ 2. **独特性** (0-3 分)
50
+ - 3 分:项目特定配置、非常规解决方案
51
+ - 2 分:非显而易见的技巧、特定场景知识
52
+ - 1 分:略有新意的做法
53
+ - 0 分:常见知识、通用做法
54
+
55
+ 3. **可复用性** (0-2 分)
56
+ - 2 分:跨场景可复用的模式/方法
57
+ - 1 分:特定场景下可复用
58
+ - 0 分:一次性信息、临时性内容
59
+
60
+ 4. **持久性** (0-2 分)
61
+ - 2 分:长期有效(架构决策、代码模式)
62
+ - 1 分:中期有效(配置信息、工作流程)
63
+ - 0 分:临时信息(调试过程、一次性请求)
64
+
65
+ **评分 < 6 分**:设置 name 为 "no-memory-{timestamp}",content 为 "无重要信息"
66
+
67
+ ## 记忆命名规范(强制执行)
68
+
69
+ **格式要求**:
70
+ - **仅包含小写字母、数字和单个连字符(-)**
71
+ - **不能包含空格、下划线、中文或其他特殊字符**
72
+ - **不能以连字符开头或结尾**
73
+ - **不能有连续的连字符**
74
+
75
+ **正确示例**:
76
+ - \`memory-system-design\`
77
+ - \`langchain-structured-output\`
78
+ - \`tui-panel-implementation\`
79
+
80
+ **错误示例**:
81
+ - \`Memory_System\` ❌(大写、下划线)
82
+ - \`zen-code-user-guide\` ❌(中文)
83
+ - \`memory--system\` ❌(连续连字符)
84
+ - \`-memory-system\` ❌(以连字符开头)
85
+ - \`memory system\` ❌(包含空格)
86
+
87
+ **命名建议**:
88
+ - 从核心主题中提取 2-4 个英文关键词
89
+ - 使用具体的技术术语
90
+ - 示例:
91
+ - "langchain-structured-output-single-object"
92
+ - "memory-system-design"
93
+ - "middleware-execution-order"
94
+ - "tui-panel-system"
95
+ - 避免通用名称:不使用 "fix-bug" 或 "optimization"
96
+
97
+ ## 内容提取模板
98
+
99
+ 提取的内容应包含以下部分(按需选择):
100
+
101
+ **背景**:什么问题/场景?
102
+ **决策**:做了什么选择?
103
+ **原因**:为什么这样选择?
104
+ **实现**:关键代码、文件路径、配置
105
+ **适用**:什么场景适用?什么场景不适用?
106
+ **注意**:有什么陷阱或边界情况?
107
+
108
+ ## 代码引用原则(强制执行)
109
+
110
+ **默认规则:代码超过 5 行 → 使用文件引用**
111
+
112
+ ### 何时使用文件引用
113
+ - 完整函数或方法实现
114
+ - 完整类或组件定义
115
+ - 长配置文件
116
+ - 任何 > 5 行的代码块
117
+
118
+ ### 文件引用格式
119
+ \`文件路径[:行号范围]\`:简短说明
120
+
121
+ 示例:
122
+ - \`agents/code/graph.ts:120-180\`:中间件链执行顺序
123
+ - \`tui/src/chat/Chat.tsx\`:完整的面板切换回调实现
124
+ - \`.claude/skills/web-research/SKILL.md\`:技能结构模板
125
+
126
+ ### 何时内联代码(仅限以下情况)
127
+ 1. **极短片段**(≤ 5 行):用于说明关键概念
128
+ 2. **配置示例**:JSON/YAML 配置片段
129
+ 3. **错误示例**:展示错误模式(不超过 5 行)
130
+
131
+ ### 代码长度限制
132
+ - **总代码占比**:content 中代码块总行数 ≤ 30%
133
+ - **单个代码块**:不超过 5 行
134
+ - **优先级**:文件引用 > 概述 > 短片段
135
+
136
+ ### 长代码处理方式
137
+
138
+ **错误示范**(代码过长):
139
+ \`\`\`typescript
140
+ const middleware = [
141
+ new SubAgentsMiddleware(),
142
+ new AgentsMdMiddleware(),
143
+ // ... 省略 20 行
144
+ ];
145
+ \`\`\`
146
+
147
+ **正确示范**(文件引用):
148
+ 中间件列表定义参见 \`agents/code/graph.ts:45-60\`,执行顺序为:SubAgents → AgentsMd → Skills → MCP → HumanInTheLoop → Cache
149
+
150
+ **关键片段**(如必要):
151
+ \`\`\`typescript
152
+ // 仅 3 行核心逻辑
153
+ middleware.forEach(m => m.wrapModelCall(req, handler))
154
+ \`\`\`
155
+
156
+
157
+ ## 输出格式要求
158
+
159
+ **你必须输出单个 JSON 对象(不是数组)**,包含以下字段:
160
+
161
+ - **name** (string): 记忆名称,kebab-case 格式,例如 "memory-system-design"
162
+ - **description** (string): 中等长度描述,索引综述(200-500字符),包含:
163
+ * 背景和问题/场景
164
+ * 关键决策或解决方案
165
+ * 适用场景或范围
166
+ * 使用清晰的分号或句号分隔各部分
167
+ - **content** (string): 详细内容,包含技术实现细节、文件路径、代码示例、关键决策等,按照内容提取模板组织
168
+ - **tags** (array of string): 记忆标签,3-5 个,用于检索和分类,例如 ["langchain", "structured-output", "zod"]
169
+ - **category** (enum): 记忆分类,可选值:architecture, bug-fix, workflow, configuration, optimization
170
+ - **priority** (enum): 优先级,可选值:high, medium, low
171
+ - **created** (string): 创建日期,ISO 格式 YYYY-MM-DD,例如 "2025-01-13"
172
+ - **last_updated** (string): 最后更新日期,ISO 格式 YYYY-MM-DD,例如 "2025-01-13"
173
+ - **context_scope** (enum): 上下文范围,可选值:user, project
174
+
175
+ ## 分类标准
176
+
177
+ - **architecture**: 架构决策、设计模式、系统结构
178
+ - **bug-fix**: Bug 修复和问题解决方案
179
+ - **workflow**: 工作流程和最佳实践
180
+ - **configuration**: 配置和环境设置
181
+ - **optimization**: 性能优化和改进
182
+
183
+ ## 优先级标准
184
+
185
+ - **high**: 关键架构决策、重要问题解决方案、影响系统正确性的问题
186
+ - **medium**: 有用的模式、次要的配置信息、影响开发效率的问题
187
+ - **low**: 一般性建议、参考信息、优化建议
188
+
189
+ ## 示例输出
190
+
191
+ ### 示例 1:有价值的记忆
192
+ \`\`\`json
193
+ {
194
+ "summary_of_chat": "用户反馈记忆系统的 summary_of_chat 字段过于简单,需要增强对话复现和后续行动说明。修改了 agents/code/memories/analyze.ts:1) 更新 MemoryCandidateSchema 中 summary_of_chat 的描述,要求 300-500 字包含完整对话过程、后续行动、关键成果;2) 在 smart_memory_prompt 中添加专门的"对话总结要求"章节,明确三部分内容(完整复现、后续行动、关键成果);3) 提供格式示例和清晰的模板。✓ 完成:增强版记忆提示词;⏳ 待定:是否需要添加示例输出展示新的 summary_of_chat 格式;→ 建议:测试新提示词在实际对话中的表现",
195
+ "name": "memory-prompt-summary-enhancement",
196
+ "description": "增强记忆系统的 summary_of_chat 字段要求,要求完整复现对话过程并明确后续行动;包括任务背景→关键决策→解决方案→最终结果的完整流程,以及待完成任务、需要确认事项、下一步建议;适用于所有需要高质量对话总结的场景",
197
+ "content": "## 背景\\n\\n用户反馈记忆系统生成的 summary_of_chat 过于简单,缺少后续行动说明,无法有效回顾对话和继续工作。\\n\\n## 解决方案\\n\\n修改 \`agents/code/memories/analyze.ts\` 的三处:\\n\\n1. **Schema 增强**(第 18 行):\\n\\\`\\\`\\\`typescript\\nsummary_of_chat: z.string().describe('对话总结(300-500字):1) 完整复现对话的核心过程(任务背景→关键决策→解决方案→最终结果);2) 明确说明接下来要做什么(后续行动、待完成任务、需要用户确认的事项);3) 突出关键成果和交付物')\\n\\\`\\\`\\\`\\n\\n2. **提示词添加专门章节**:在 smart_memory_prompt 中添加"对话总结要求"部分,明确三个组成部分:完整复现、后续行动、关键成果\\n\\n3. **提供格式示例**:使用 → 表示流程,✓ 表示完成,⏳ 表示待定,→ 表示建议\\n\\n## 适用场景\\n\\n- 需要高质量对话总结的 AI 系统\\n- 需要明确后续行动的任务管理场景",
198
+ "tags": ["prompt-engineering", "memory-system", "conversation-summary", "langchain"],
199
+ "category": "optimization",
200
+ "priority": "medium",
201
+ "created": "2025-01-17",
202
+ "last_updated": "2025-01-17",
203
+ "context_scope": "project"
204
+ }
205
+ \`\`\`
206
+
207
+ ### 示例 2:无重要信息
208
+ \`\`\`json
209
+ {
210
+ "summary_of_chat": "用户询问如何查看 TUI 应用中的模型列表。已告知可通过 /model-panel 或 /mp 命令打开模型选择面板,使用 ↑↓ 键选择、Enter 键切换模型、q 键关闭面板。当前无其他问题。✓ 完成:问题已解答;⏳ 待定:无;→ 建议:如需更多帮助可使用 /help 命令",
211
+ "name": "no-memory-1736736000000",
212
+ "description": "本次对话无重要信息需要保存",
213
+ "content": "无重要信息",
214
+ "tags": [],
215
+ "category": "workflow",
216
+ "priority": "low",
217
+ "created": "2025-01-13",
218
+ "last_updated": "2025-01-13",
219
+ "context_scope": "project"
220
+ }
221
+ \`\`\`
222
+
223
+ ## 重要原则
224
+
225
+ 1. **宁缺毋滥**:评分 < 6 分时,返回"无重要信息"
226
+ 2. **避免重复**:不要记录显而易见或通用的知识
227
+ 3. **用户优先**:明确记录用户的指示和偏好
228
+ 4. **精确具体**:使用具体的文件名、代码片段、配置项
229
+ 5. **独立完整**:记忆应能独立理解,不依赖外部上下文
230
+ `;async function F($,f){let J=[new b(f),new b("请分析这段对话,提取值得保存的信息。")],B=await P({model:$,tools:[],systemPrompt:k,responseFormat:p(E)}).invoke({messages:J});return await D(B.structuredResponse)}function w($,f){let J=$.toLowerCase().replace(/[^\u4e00-\u9fa5a-z0-9\s]/gi," ").split(/\s+/).filter((U)=>U.length>1).slice(0,4);if(J.length===0)return`memory-${Date.now()}-${f}`;let B=`${J.join("-")}-${Date.now()}-${f}`;return B.length>64?B.substring(0,61)+"...":B}function C($){return $.toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}async function D($){if($.name.startsWith("no-memory-"))return`${$.summary_of_chat}
231
+
232
+ ---
233
+
234
+ name: "${$.name}"
235
+ description: "${$.description}"
236
+
237
+ ⚠️ 无重要信息,未保存记忆`;let f=X.join(process.cwd(),".claude/memories");await W.mkdir(f,{recursive:!0});let q=C($.name||w($.content,0))||w($.content,0),B=X.join(f,q);await W.mkdir(B,{recursive:!0});let U=$.content.indexOf(`
238
+ `),O=U>0?$.content.substring(0,Math.min(U,100)):$.content.substring(0,Math.min(100,$.content.length)),Q={name:q,description:$.description.replace(/\n/g," "),tags:$.tags,category:$.category,created:$.created,last_updated:$.last_updated,priority:$.priority,context_scope:$.context_scope},L=`---
239
+ ${N.stringify(Q,{indent:2,lineWidth:0})}
240
+ ---
241
+
242
+ # ${O}
243
+
244
+ ${$.content}
245
+ `,Y=X.join(B,"MEMORY.md");return await W.writeFile(Y,L,"utf-8"),`${$.summary_of_chat}
246
+
247
+ ---
248
+
249
+ name: "${$.name}"
250
+ description: "${$.description}"
251
+
252
+ ✓ 保存记忆: ${H(Y)}`}var c={smart_memory:async($)=>{let f=await V($.model_id,{modelProvider:$.provider_type,streamUsage:!0,enableThinking:$.enable_thinking??!0}),J=await F(f,Z($.messages));return{switch_command:"",messages:[new u({id:j}),new v(J)]}}};async function A($,f,J,q){let B=await x($,f,J,q);J.thread_id=G(q);let U=await B.invoke(J,{recursionLimit:500,configurable:q.configurable,context:q.context});return{switch_command:"",task_store:U.task_store,messages:U.messages}}function z(){return new S(T).addNode("graph",async($,f)=>{let{switch_command:J}=$;if(J==="smart_memory")return c.smart_memory($);let q=_,B=await R(q),U=(J==="default"?"agents/default":J)||"agents/default";if(!B.includes(U))throw Error(`Unknown agent: ${J||"default"}. Available: ${B.join(", ")}`);return await A(U,q,$,f)}).addEdge(I,"graph").compile()}var O$=z();
253
+ export{O$ as ya};
@@ -0,0 +1 @@
1
+ import"./chunk-cze71w02.js";var Q=((f)=>{return f.NETWORK_ERROR="NETWORK_ERROR",f.CONNECTION_TIMEOUT="CONNECTION_TIMEOUT",f.INTERNAL_ERROR="INTERNAL_ERROR",f.THREAD_NOT_FOUND="THREAD_NOT_FOUND",f.THREAD_BUSY="THREAD_BUSY",f.RUN_NOT_FOUND="RUN_NOT_FOUND",f.GRAPH_NOT_FOUND="GRAPH_NOT_FOUND",f.INVALID_REQUEST="INVALID_REQUEST",f})(Q||{});class J extends Error{constructor(f,w,x){super(w);this.code=f,this.statusCode=x,this.name="RemoteApiError"}}async function N(f,w,x){try{let z=f;if(x?.query){let V=new URLSearchParams;Object.entries(x.query).forEach(([X,Y])=>{V.append(X,String(Y))}),z+=`?${V.toString()}`}let O=await fetch(z,{method:w,headers:{"Content-Type":"application/json"},body:x?.body?JSON.stringify(x.body):void 0}),F=await O.json();if(!O.ok||!F.success)throw new J(F.error?.code||Q.INTERNAL_ERROR,F.error?.message||"Unknown error",O.status);return F}catch(z){if(z instanceof J)throw z;throw new J(Q.NETWORK_ERROR,`Network error: ${z instanceof Error?z.message:"Unknown error"}`)}}async function H(f,w){return N(f,"GET",{query:w})}async function B(f,w,x){return N(f,"POST",{body:w,query:x})}async function W(f,w,x){return N(f,"PUT",{body:w,query:x})}async function _(f,w){return N(f,"DELETE",{query:w})}class ${constructor(f,w){this.serverUrl=f,this.httpClient=w,this.serverUrl=f.replace(/\/$/,""),this.httpClient=w||fetch}async setup(){await B(`${this.serverUrl}/setup`)}async create(f){return(await B(`${this.serverUrl}/threads`,f)).data}async search(f){let w={};if(f?.ids!==void 0&&f.ids.length>0)w.ids=JSON.stringify(f.ids);if(f?.metadata!==void 0)w.metadata=JSON.stringify(f.metadata);if(f?.limit!==void 0)w.limit=f.limit;if(f?.offset!==void 0)w.offset=f.offset;if(f?.status!==void 0)w.status=f.status;if(f?.sortBy!==void 0)w.sortBy=f.sortBy;if(f?.sortOrder!==void 0)w.sortOrder=f.sortOrder;if(f?.values!==void 0)w.values=JSON.stringify(f.values);if(f?.select!==void 0)w.select=JSON.stringify(f.select);if(f?.withoutDetails!==void 0)w.withoutDetails=f.withoutDetails;return(await H(`${this.serverUrl}/threads`,w)).data}async get(f){return(await H(`${this.serverUrl}/threads/${f}`)).data}async set(f,w){await W(`${this.serverUrl}/threads/${f}`,w)}async delete(f){await _(`${this.serverUrl}/threads/${f}`)}async updateState(f,w){return(await B(`${this.serverUrl}/threads/${f}/state`,w)).data}async createRun(f,w,x){return(await B(`${this.serverUrl}/threads/${f}/runs`,x||{},{assistantId:w})).data}async listRuns(f,w){let x={};if(w?.limit!==void 0)x.limit=w.limit;if(w?.offset!==void 0)x.offset=w.offset;if(w?.status!==void 0)x.status=w.status;return(await H(`${this.serverUrl}/threads/${f}/runs`,x)).data}async updateRun(f,w){await W(`${this.serverUrl}/runs/${f}`,w)}async count(f){let w={};if(f?.ids!==void 0&&f.ids.length>0)w.ids=JSON.stringify(f.ids);if(f?.metadata!==void 0)w.metadata=JSON.stringify(f.metadata);if(f?.status!==void 0)w.status=f.status;if(f?.values!==void 0)w.values=JSON.stringify(f.values);return(await H(`${this.serverUrl}/threads/count`,w)).data}async patch(f,w){return(await B(`${this.serverUrl}/threads/${f}`,w)).data}async getState(f,w){let x={};if(w?.subgraphs!==void 0)x.subgraphs=w.subgraphs;if(w?.checkpointId!==void 0)x.checkpointId=w.checkpointId;return(await B(`${this.serverUrl}/threads/${f}/state`,x)).data}async getStateHistory(f,w){let x={};if(w?.limit!==void 0)x.limit=w.limit;if(w?.before!==void 0)x.before=w.before;return(await B(`${this.serverUrl}/threads/${f}/history`,x)).data}async copy(f){return(await B(`${this.serverUrl}/threads/${f}/copy`)).data}}export{$ as RemoteKyselyThreadsManager};
@@ -0,0 +1,2 @@
1
+ import{Low as K}from"lowdb";import{JSONFile as M}from"lowdb/node";import Q from"os";import E from"path";import z from"fs";import R from"proper-lockfile";var A={config:{provider_id:"default",provider_type:"openai",model_id:"glm-5",providers:[{id:"default",type:"openai",apiKey:"",baseUrl:"https://api.openai.com/v1"}],compact_mode:!0}};function T(j){return"main_model"in j&&!("providers"in j)}function U(j){let q=[];if(j.model_provider==="openai"||j.openai_api_key||j.openai_base_url)q.push({id:"openai",type:"openai",apiKey:j.openai_api_key||"",baseUrl:j.openai_base_url||"https://api.openai.com/v1"});if(j.model_provider==="anthropic"||j.anthropic_api_key||j.anthropic_base_url)q.push({id:"anthropic",type:"anthropic",apiKey:j.anthropic_api_key||"",baseUrl:j.anthropic_base_url||"https://api.anthropic.com"});if(q.length===0)q.push({id:"default",type:"openai",apiKey:"",baseUrl:"https://api.openai.com/v1"});let x=j.model_provider==="anthropic"?"anthropic":"openai",B=q.find((G)=>G.id===x)||q[0];return{provider_id:B.id,provider_type:B.type,model_id:j.main_model,providers:q,mcp_config:j.mcp_config,stream_refresh_interval:j.stream_refresh_interval,enable_thinking:j.enable_thinking,switch_command:j.switch_command,compact_mode:j.compact_mode,permissions:j.permissions}}class V{db;zenConfigDir;dbPath;getLockfilePath(){return`${this.dbPath}.lock`}lockOptions={stale:5000,retries:{retries:5,minTimeout:100,maxTimeout:1000}};constructor(){let j=Q.homedir();this.zenConfigDir=E.join(j,".zen-code");let q=E.join(this.zenConfigDir,"settings.json"),x=new M(q);this.dbPath=q,this.db=new K(x,A)}async withLock(j){if(await z.promises.mkdir(this.zenConfigDir,{recursive:!0}),!z.existsSync(this.dbPath))await z.promises.writeFile(this.dbPath,JSON.stringify(A,null,2),"utf-8");let q=await R.lock(this.dbPath,{...this.lockOptions,lockfilePath:this.getLockfilePath()});try{return await j()}finally{await q()}}async initialize(){await this.withLock(async()=>{if(await this.db.read(),!this.db.data||!this.db.data.config)this.db.data=A,await this.db.write();else if(T(this.db.data.config))console.log("Migrating legacy config to new format..."),this.db.data.config=U(this.db.data.config),await this.db.write(),console.log("Config migration completed.");this.syncEnvFromConfig()})}async getConfig(){return this.withLock(async()=>{return await this.db.read(),this.db.data.config})}async updateConfig(j){await this.withLock(async()=>{await this.db.read(),Object.assign(this.db.data.config,j),await this.db.write(),this.syncEnvFromConfig()})}syncEnvFromConfig(){let j=this.db.data.config,q=j.providers.find((x)=>x.id===j.provider_id);if(q){if(q.type==="openai")process.env.MODEL_PROVIDER="openai",process.env.OPENAI_API_KEY=q.apiKey,process.env.OPENAI_BASE_URL=q.baseUrl;else if(q.type==="anthropic")process.env.MODEL_PROVIDER="anthropic",process.env.ANTHROPIC_API_KEY=q.apiKey,process.env.ANTHROPIC_BASE_URL=q.baseUrl;else if(q.type==="gemini"||q.type==="google")process.env.MODEL_PROVIDER="gemini",process.env.GOOGLE_API_KEY=q.apiKey,process.env.GOOGLE_BASE_URL=q.baseUrl}}getZenConfigDir(){return this.zenConfigDir}}
2
+ export{V as kb};
@@ -0,0 +1 @@
1
+ import{D as s,E as r}from"./chunk-3jek9sxm.js";import{L as o}from"./chunk-3n2b4eb4.js";import{M as T}from"./chunk-keqk70wm.js";import"./chunk-9kc9cea3.js";import{ca as l,da as Y,ea as H,ha as u,ka as p,la as f,na as i,pa as t}from"./chunk-wwn7gw8g.js";import"./chunk-dh3jz71n.js";import"./chunk-yaa4eesd.js";import"./chunk-jkbtx9va.js";import"./chunk-kbs4px1b.js";import"./chunk-9k57afdm.js";import{nb as S}from"./chunk-cze71w02.js";var qq=S(l(),1);var _=S(l(),1);var $=S(f(),1),a={openai:"\uD83E\uDD16",anthropic:"\uD83E\uDDE0",gemini:"✨",default:"\uD83D\uDD2E"};var Gq=({onClose:O})=>{let{extraParams:F,config:U,updateConfig:B}=T(),[X,A]=_.useState(""),k=_.useRef([]),G=_.useMemo(()=>{if(!U?.providers||U.providers.length===0)return[];return U.providers.map((q)=>{let Z=q.type||"default";return{id:q.id,label:q.id,icon:a[Z]||a.default,config:q}})},[U?.providers]);_.useMemo(()=>{if(G.length>0&&!X){let q=G.find((Z)=>Z.id===F.provider_id);A(q?.id||G[0].id)}},[G,F.provider_id,X]);let h=G.find((q)=>q.id===X),{data:P,isLoading:w,error:b}=s({provider:h?.config||null,enabled:!!X}),c=_.useMemo(()=>{let q=(P||[]).map((Z)=>({id:Z.id,name:Z.name}));return k.current=q,q},[P]),C=_.useCallback(async()=>{return k.current},[]),I=_.useCallback((q,Z,V)=>{let m=q.id===F.provider_id+"-"+q.id;return $.jsxDEV(i,{isSelected:V,isCurrent:m,children:[$.jsxDEV(H,{bold:!0,children:[Z+1,". ",q.id]},void 0,!0,void 0,this),$.jsxDEV(H,{dimColor:!0,children:[" ",q.name!==q.id?`(${q.name})`:""]},void 0,!0,void 0,this)]},`model-${Z}-${q.id}`,!0,void 0,this)},[F.provider_id]),D=_.useCallback((q)=>{return q.id===F.provider_id+"-"+q.id},[F.provider_id]),R=_.useCallback(async(q)=>{await B({provider_id:X,model_id:q.id}),O()},[B,X,O]),j=_.useCallback((q)=>{if(G.length<=1)return;let Z=G.findIndex((m)=>m.id===X),V=q==="left"?(Z-1+G.length)%G.length:(Z+1)%G.length;A(G[V].id)},[X,G]),E=_.useMemo(()=>{let q=h?.label||"加载中...";return{id:`model-${X}`,title:`模型选择 - ${q}`,icon:h?.icon||"\uD83D\uDD2E",dataSource:C,searchable:!0,searchFields:["id","name"],searchPlaceholder:"搜索模型...",itemHeight:1,visibleCount:10,renderItem:I,isSelected:D,onSelect:R,showCount:!0,keyMap:{leftArrow:(Z)=>{j("left")},rightArrow:(Z)=>{j("right")}}}},[X,h,C,I,D,R,j]);if(G.length===0)return $.jsxDEV(Y,{flexDirection:"column",paddingX:2,paddingY:1,children:[$.jsxDEV(H,{color:"yellow",children:"⚠️ 未配置任何 Provider"},void 0,!1,void 0,this),$.jsxDEV(H,{color:"gray",dimColor:!0,children:"请先配置 Provider 后再查看模型列表"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);let g=h?.config.apiKey;return $.jsxDEV(Y,{flexDirection:"column",children:[$.jsxDEV(Y,{gap:1,paddingX:1,paddingY:1,children:G.map((q)=>$.jsxDEV(H,{bold:q.id===X,color:q.id===X?"cyan":"gray",children:[q.icon," ",q.label,q.id===X&&" [当前]",q.id===X&&!g&&" (未配置 API Key)"]},q.id,!0,void 0,this))},void 0,!1,void 0,this),w?$.jsxDEV(Y,{paddingX:2,paddingY:1,children:$.jsxDEV(H,{color:"gray",children:"加载模型列表中..."},void 0,!1,void 0,this)},void 0,!1,void 0,this):b?$.jsxDEV(Y,{paddingX:2,paddingY:1,children:$.jsxDEV(H,{color:"red",children:["加载失败: ",b.message]},void 0,!0,void 0,this)},void 0,!1,void 0,this):!g?$.jsxDEV(Y,{paddingX:2,paddingY:1,children:$.jsxDEV(H,{color:"yellow",children:"请先配置 API Key"},void 0,!1,void 0,this)},void 0,!1,void 0,this):$.jsxDEV(t,{config:E,onClose:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},d=Gq;var z=S(l(),1);var Q=S(f(),1),Hq=({onClose:O})=>{let{config:F,updateConfig:U}=T(),[B,X]=z.useState("list"),[A,k]=z.useState(null),[G,h]=z.useState(0),[P,w]=z.useState(null),b=z.useCallback(()=>w(null),[]);o(b,P?3000:null);let c=z.useRef(B),C=z.useRef(G),I=z.useRef([]),D=z.useRef(!0);z.useEffect(()=>{c.current=B},[B]),z.useEffect(()=>{C.current=G},[G]);let R=F?.providers||[];z.useEffect(()=>{I.current=R},[R]);let j=z.useCallback(()=>{D.current=!0,k(null),X("form"),w(null)},[]),E=z.useCallback(()=>{let J=I.current,W=C.current,N=J[W];if(!N)return;D.current=!1,k(N),X("form"),w(null)},[]),g=z.useCallback(()=>{X("list"),k(null),w(null)},[]),q=z.useCallback(async(J)=>{let W=I.current,N=D.current,K=N?[...W,J]:W.map((L)=>L.id===J.id?J:L);if(await U({providers:K}),w(N?`已添加 Provider: ${J.id}`:`已更新 Provider: ${J.id}`),N){let L=K.findIndex((M)=>M.id===J.id);h(L>=0?L:0)}X("list"),k(null),w(null)},[U]),Z=z.useCallback(async()=>{let J=I.current,W=C.current,N=J[W];if(!N)return;if(J.length<=1){w("无法删除最后一个 Provider");return}let K=J.filter((M)=>M.id!==N.id);await U({providers:K});let L=Math.min(W,K.length-1);h(L>=0?L:0),w(`已删除 Provider: ${N.id}`)},[U]),V=z.useRef(j),m=z.useRef(E),v=z.useRef(Z),x=z.useRef(g),n=z.useRef(O);z.useEffect(()=>{V.current=j},[j]),z.useEffect(()=>{m.current=E},[E]),z.useEffect(()=>{v.current=Z},[Z]),z.useEffect(()=>{x.current=g},[g]),z.useEffect(()=>{n.current=O},[O]),p((J,W)=>{let N=c.current,K=I.current,L=C.current;if(N==="form"){if(W.escape)x.current();return}if(W.upArrow)h((M)=>M>0?M-1:K.length-1);else if(W.downArrow)h((M)=>M<K.length-1?M+1:0);else if(J==="n"||J==="N")V.current();else if((J==="e"||J==="E"||W.return)&&K[L])m.current();else if((J==="d"||J==="D")&&K[L])v.current();else if(W.escape)n.current()},{isActive:!0});let zq=z.useMemo(()=>{if(R.length===0)return Q.jsxDEV(Y,{paddingX:2,paddingY:1,children:Q.jsxDEV(H,{color:"yellow",children:"未配置任何 Provider"},void 0,!1,void 0,this)},void 0,!1,void 0,this);return Q.jsxDEV(Y,{flexDirection:"column",paddingX:2,gap:1,children:[R.map((J,W)=>{let N=!!J.apiKey,K=N?"green":"yellow";return Q.jsxDEV(Y,{marginBottom:0,gap:1,children:[Q.jsxDEV(H,{color:W===G?"cyan":"gray",bold:W===G,children:W===G?">":" "},void 0,!1,void 0,this),Q.jsxDEV(H,{bold:W===G,color:W===G?"cyan":void 0,children:J.id},void 0,!1,void 0,this),Q.jsxDEV(u,{},void 0,!1,void 0,this),Q.jsxDEV(H,{color:"gray",dimColor:W!==G,children:[" ",J.type]},void 0,!0,void 0,this),Q.jsxDEV(H,{color:K,dimColor:W!==G,children:[" ","[",N?"已配置":"未配置","]"]},void 0,!0,void 0,this)]},J.id,!0,void 0,this)}),Q.jsxDEV(Y,{marginTop:1,children:Q.jsxDEV(H,{color:"gray",dimColor:!0,children:[Q.jsxDEV(H,{color:"cyan",children:"↑↓"},void 0,!1,void 0,this)," 导航 ",Q.jsxDEV(H,{color:"cyan",children:"n"},void 0,!1,void 0,this)," 新增 ",Q.jsxDEV(H,{color:"cyan",children:"d"},void 0,!1,void 0,this)," ","删除 ",Q.jsxDEV(H,{color:"cyan",children:"Esc"},void 0,!1,void 0,this)," 关闭"]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},[R,G]);return Q.jsxDEV(Y,{flexDirection:"column",children:[Q.jsxDEV(Y,{paddingX:2,paddingY:1,children:Q.jsxDEV(H,{bold:!0,color:"cyan",children:"Providers"},void 0,!1,void 0,this)},void 0,!1,void 0,this),B==="list"?zq:Q.jsxDEV(r,{provider:A||void 0,onCancel:g,onSave:q},void 0,!1,void 0,this),P&&Q.jsxDEV(Y,{paddingX:2,paddingY:0,children:Q.jsxDEV(H,{color:"green",children:P},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},e=Hq;var y=S(f(),1),Jq=({onClose:O,initialTab:F="model"})=>{let[U,B]=qq.useState(F);return p((X,A)=>{if(A.leftArrow&&A.alt)B("model");else if(A.rightArrow&&A.alt)B("provider");else if(A.escape)O()},{isActive:!0}),y.jsxDEV(Y,{flexDirection:"column",width:"100%",borderStyle:"single",borderDimColor:!0,children:[y.jsxDEV(Y,{flexDirection:"column",paddingX:0,paddingY:0,children:[U==="model"&&y.jsxDEV(d,{onClose:O},void 0,!1,void 0,this),U==="provider"&&y.jsxDEV(e,{onClose:O},void 0,!1,void 0,this)]},void 0,!0,void 0,this),y.jsxDEV(Y,{flexDirection:"row",gap:2,paddingX:2,paddingY:1,borderTop:!0,borderBottom:!1,borderLeft:!1,borderRight:!1,borderStyle:"single",borderColor:"gray",children:[y.jsxDEV(H,{bold:U==="model",color:U==="model"?"cyan":"gray",children:"\uD83E\uDD16 Model"},void 0,!1,void 0,this),y.jsxDEV(H,{bold:U==="provider",color:U==="provider"?"cyan":"gray",children:"\uD83D\uDD0C Provider"},void 0,!1,void 0,this),y.jsxDEV(u,{},void 0,!1,void 0,this),y.jsxDEV(H,{dimColor:!0,children:"Alt+ < >"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},Iq=Jq;export{Iq as default};
@@ -0,0 +1,6 @@
1
+ import A from"fs/promises";import z from"path";import N from"os";import O from"yaml";class R{skillsDir;projectSkillsDir;constructor(){let b=N.homedir();this.skillsDir=z.join(b,".claude","skills"),this.projectSkillsDir=z.join(process.cwd(),".claude","skills")}async listSkills(){let b=new Map,g=await this.listSkillsInDir(this.skillsDir);for(let q of g)b.set(q.name,q);let x=await this.listSkillsInDir(this.projectSkillsDir);for(let q of x)b.set(q.name,q);return Array.from(b.values())}async listSkillsInDir(b){try{let g=await A.readdir(b,{withFileTypes:!0}),x=[];for(let q of g){let F=z.join(b,q.name),I=await A.lstat(F).catch(()=>null);if(!I)continue;let J=await A.stat(F).catch(()=>null);if(!J||!J.isDirectory())continue;if(I.isSymbolicLink()){let C=z.resolve(F),G=z.resolve(b),L=C.substring(G.length);if(!(C===G||L.startsWith("/")||L==="")){let Q=N.homedir();if(!C.startsWith(Q))continue}}let K=z.join(F,"SKILL.md");try{let C=await A.readFile(K,"utf-8"),G=this.parseFrontmatter(C);x.push({name:q.name,description:G.description||"",path:K})}catch{}}return x}catch{return[]}}async getSkill(b){let g=z.join(this.projectSkillsDir,b,"SKILL.md");try{let q=await A.readFile(g,"utf-8");return this.parseSkillContent(q)}catch{}let x=z.join(this.skillsDir,b,"SKILL.md");try{let q=await A.readFile(x,"utf-8");return this.parseSkillContent(q)}catch{return null}}async saveSkill(b,g){let x=z.join(this.skillsDir,b);await A.mkdir(x,{recursive:!0});let q=this.formatSkillContent(g);await A.writeFile(z.join(x,"SKILL.md"),q,"utf-8")}async deleteSkill(b){let g=z.join(this.skillsDir,b);await A.rm(g,{recursive:!0,force:!0})}async syncFromRemote(b){let g=await b.listRemoteSkills();for(let x of g){let q=await b.fetchSkill(x.name);if(q)await this.saveSkill(x.name,q)}}parseFrontmatter(b){let g=b.match(/^---\n(.+?)\n---/s);if(!g)return{};try{return O.parse(g[1])}catch{return{}}}parseSkillContent(b){let g=this.parseFrontmatter(b),x=b.replace(/^---\n.+?\n---\n*/s,"");return{frontmatter:g,markdown:x}}formatSkillContent(b){return`---
2
+ ${O.stringify(b.frontmatter).trim()}
3
+ ---
4
+
5
+ ${b.markdown}`}}
6
+ export{R as lb};
@@ -0,0 +1,2 @@
1
+ import{P as U,R as Y,S as B,T as W}from"./chunk-9kc9cea3.js";import{ca as q,da as T,ea as O,la as j}from"./chunk-wwn7gw8g.js";import{ib as k}from"./chunk-yaa4eesd.js";import{nb as b}from"./chunk-cze71w02.js";var J=b(q(),1);function K({manager:z,enabled:N=!0}){return Y({queryKey:W.config.detail(),queryFn:async()=>{return await z.initialize(),await z.getConfig()},enabled:N,staleTime:300000,gcTime:600000})}function P({manager:z}){let N=U();return B({mutationFn:async(R)=>{return await z.updateConfig(R),await z.getConfig()},onSuccess:(R)=>{N.setQueryData(W.config.detail(),R),N.invalidateQueries({queryKey:W.providers.all}),N.invalidateQueries({queryKey:W.models.all})}})}var X=b(j(),1),H=null,Z=null;async function S(){if(!H){if(!Z)Z=k().then((z)=>{return H=z,Z=null,z});return Z}return Promise.resolve(H)}var I=J.createContext(void 0),E=({manager:z,get_allowed_models:N,children:R})=>{let{data:G,isLoading:V,error:x}=K({manager:z}),$=P({manager:z}),{data:F=[],isLoading:h,error:p}=Y({queryKey:W.models.available(),queryFn:N,staleTime:1800000,retry:1}),A=J.useMemo(()=>{return{provider_id:G?.provider_id||"default",model_id:G?.model_id||F[0]?.id||"default",mcp_config:G?.mcp_config,enable_thinking:G?.enable_thinking??!0,switch_command:G?.switch_command||""}},[G?.provider_id,G?.model_id,G?.mcp_config,G?.enable_thinking,G?.switch_command,F]),Q=J.useMemo(()=>{return G?.compact_mode??!1},[G?.compact_mode]),w=async()=>{await $.mutateAsync({compact_mode:!Q})},v=J.useMemo(()=>{return G?.show_detailed_info??!1},[G?.show_detailed_info]),L=async()=>{await $.mutateAsync({show_detailed_info:!v})},D=async(_)=>{await $.mutateAsync(_)};if(V||h)return X.jsxDEV(T,{padding:2,children:X.jsxDEV(O,{children:"Loading configuration..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X.jsxDEV(I.Provider,{value:{config:G||null,updateConfig:D,extraParams:A,AVAILABLE_MODELS:F,manager:z,compactMode:Q,toggleCompactMode:w,showDetailedInfo:v,toggleDetailedInfo:L},children:R},void 0,!1,void 0,this)},s=()=>{let z=J.useContext(I);if(z===void 0)throw Error("useSettings must be used within a SettingsProvider");return z},r=({get_allowed_models:z,children:N})=>{let[R,G]=J.useState(null);if(J.useEffect(()=>{S().then(G)},[]),!R)return X.jsxDEV(T,{padding:2,children:X.jsxDEV(O,{children:"Initializing configuration manager..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return X.jsxDEV(E,{manager:R,get_allowed_models:z,children:N},void 0,!1,void 0,this)};
2
+ export{s as M,r as N};
@@ -0,0 +1 @@
1
+ import q from"node:path";import H from"node:os";import c from"node:fs";function J(r){let w=r.replace(/^~/,H.homedir()),O=q.resolve(w),C=q.dirname(O);if(!c.existsSync(C))c.mkdirSync(C,{recursive:!0});return O}function K(r,w){if(!c.existsSync(r)){process.env.DATABASE_INIT="true";return}let O=process.env.SQLITE_MAX_SIZE_MB?parseInt(process.env.SQLITE_MAX_SIZE_MB,10)*1024*1024:void 0,C=w??O??104857600,j=c.statSync(r).size,A=j/1048576;if(j>C){let G=C/1048576;console.warn(`⚠️ Database file is large: ${A.toFixed(2)}MB (limit: ${G.toFixed(2)}MB)`),console.warn(` Path: ${r}`),console.warn(" Set SQLITE_MAX_SIZE_MB to adjust limit")}}function T(r){let w=J(r);return process.env.SQLITE_DATABASE_URI=w,K(w),w}import x from"node-notifier";function W(r){if(typeof r==="string")x.notify({title:"Notification",message:r});else x.notify({title:r.title||"Notification",message:r.message,icon:r.icon,sound:r.sound??!0})}var Y={path:process.cwd()};export{T as $,W as aa,Y as ba};
@@ -0,0 +1 @@
1
+ import{u as M}from"./chunk-5nzs0q25.js";import"./chunk-3n2b4eb4.js";import{R as A,T as _}from"./chunk-9kc9cea3.js";import{ca as g,da as X,ea as Y,la as C,pa as K}from"./chunk-wwn7gw8g.js";import{xa as R}from"./chunk-n1d8xx5k.js";import{nb as Q}from"./chunk-cze71w02.js";var F=Q(g(),1);import{listSkills as V}from"@langgraph-js/standard-agent";import{join as w}from"path";function $({type:G,enabled:J=!0}){return A({queryKey:G==="memories"?_.knowledge.memories():_.knowledge.skills(),queryFn:async()=>{let L=w(process.cwd(),".claude",G),N=w(process.env.HOME||"",".deepagents/code",G);try{if(G==="memories")return R(N,L).map((W)=>({...W,type:"memory"}));else return V(N,L).map((W)=>({...W,type:"skill"}))}catch(O){return console.warn(`Failed to load ${G}:`,O),[]}},enabled:J,staleTime:120000})}var H=Q(C(),1),S=(G)=>{return G.length>80?G.slice(0,80)+"...":G},k=({onClose:G})=>{let[J,L]=F.useState("memories"),N=F.useRef(L);F.default.useEffect(()=>{N.current=L},[L]);let{data:O=[]}=$({type:"memories",enabled:J==="memories"}),{data:W=[]}=$({type:"skills",enabled:J==="skills"}),U=F.useCallback(async()=>{return J==="memories"?O:W},[J,O,W]),q=F.useCallback((z,h,Z)=>{let E=S(z.description);return H.jsxDEV(X,{flexDirection:"column",paddingY:1,children:[H.jsxDEV(X,{children:H.jsxDEV(Y,{bold:!0,color:Z?"cyan":"gray",children:[h+1,". ",z.name]},void 0,!0,void 0,this)},void 0,!1,void 0,this),H.jsxDEV(X,{paddingY:1,children:H.jsxDEV(Y,{color:Z?"white":"gray",children:E},void 0,!1,void 0,this)},void 0,!1,void 0,this),H.jsxDEV(X,{children:H.jsxDEV(Y,{color:"cyan",dimColor:!Z,children:[M(z.path),z.category&&H.jsxDEV(Y,{color:"yellow",children:[" ",z.category]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this)]},z.path,!0,void 0,this)},[]),I=F.useCallback((z)=>{console.log("Selected knowledge item:",z.name)},[]),P=F.useMemo(()=>[{id:"memory",label:"记忆",predicate:(z)=>z.type==="memory"},{id:"skill",label:"技能",predicate:(z)=>z.type==="skill"}],[]),B=F.useMemo(()=>({h:(z)=>{N.current("memories"),z.setActiveFilter("memory")},s:(z)=>{N.current("skills"),z.setActiveFilter("skill")}}),[]),f=F.useMemo(()=>({id:"knowledge",title:"知识库",icon:"\uD83D\uDCDA",dataSource:U,searchable:!0,searchFields:["name","description"],searchPlaceholder:"搜索知识库 (名称/描述/分类)...",filterable:!0,filters:P,defaultFilter:J==="memories"?"memory":"skill",itemHeight:8,visibleCount:3,renderItem:q,showCount:!0,onSelect:I,keyMap:B}),[U,P,q,I,B,J]);return H.jsxDEV(K,{config:f,onClose:G},void 0,!1,void 0,this)},l=k;export{l as default};
@@ -0,0 +1,2 @@
1
+ import{readFileSync as I,statSync as O,existsSync as G,readdirSync as R,lstatSync as u}from"fs";import{join as H,resolve as V}from"path";import{parse as N}from"yaml";var g=10485760,p=64,F=1024;function B(k,K){try{let q=V(k),Q=V(K),J=q.substring(Q.length);return q===Q||J.startsWith("/")||J===""}catch(q){return!1}}function v(k){if(!k)return[!1,"name is required"];if(k.length>p)return[!1,"name exceeds 64 characters"];if(!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(k))return[!1,"name must be lowercase alphanumeric with single hyphens only"];return[!0,""]}function E(k){let K=["architecture","bug-fix","workflow","configuration","optimization"];if(!k)return[!1,"category is required"];if(!K.includes(k))return[!1,`category must be one of: ${K.join(", ")}`];return[!0,""]}function f(k,K){try{let q=O(k);if(q.size>g)return console.warn(`Skipping ${k}: file too large (${q.size} bytes)`),null;let Q=I(k,"utf-8"),J=/^---\s*\n([\s\S]*?)\n---\s*\n/,W=Q.match(J);if(!W)return console.warn(`Skipping ${k}: no valid YAML frontmatter found`),null;let $=W[1],z;try{z=N($)}catch(j){return console.warn(`Invalid YAML in ${k}: ${j}`),null}if(typeof z!=="object"||z===null)return console.warn(`Skipping ${k}: frontmatter is not a mapping`),null;let{name:U,description:w,tags:Z,category:x}=z;if(!U||!w||!Z||!x)return console.warn(`Skipping ${k}: missing required fields (name, description, tags, category)`),null;let[X,Y]=v(String(U));if(!X)console.warn(`Memory '${U}' in ${k} does not follow naming convention: ${Y}. Consider renaming to be compliant.`);let[A,C]=E(String(x));if(!A)return console.warn(`Skipping ${k}: ${C}`),null;let b=String(w);if(b.length>F)console.warn(`Description exceeds ${F} chars in ${k}, truncating`),b=b.substring(0,F);if(!Array.isArray(Z))return console.warn(`Skipping ${k}: tags must be an array`),null;let T=Z.map(String);return{name:String(U),description:b,tags:T,category:String(x),path:k,source:K,created:z.created,last_updated:z.last_updated,priority:z.priority||"medium",context_scope:z.context_scope||"project"}}catch(q){return console.warn(`Error reading ${k}: ${q.message}`),null}}function L(k,K){if(!G(k))return[];let q;try{q=V(k)}catch(W){return[]}let Q=[],J;try{J=R(k)}catch(W){return[]}for(let W of J){let $=H(k,W);if(!B($,q))continue;let z;try{z=u($)}catch(Z){continue}if(!z.isDirectory())continue;let U=H($,"MEMORY.md");if(!G(U))continue;if(!B(U,q))continue;let w=f(U,K);if(w)Q.push(w)}return Q}function c(k,K){let q=new Map;if(k){let Q=L(k,"user");for(let J of Q)q.set(J.name,J)}if(K){let Q=L(K,"project");for(let J of Q)q.set(J.name,J)}return Array.from(q.values())}
2
+ export{c as xa};
@@ -0,0 +1,2 @@
1
+ import{s as i}from"./chunk-s3fyfrka.js";import{U as s,V as j,W as o,X as d,Y as r,Z as t,_ as a}from"./chunk-bgpcx3bm.js";import{rb as R}from"./chunk-cze71w02.js";import{AIMessageChunk as O0}from"@langchain/core/messages";import{Command as D0,Send as K0}from"@langchain/langgraph";import{concat as V0}from"@langchain/core/utils/stream";import{load as F0}from"@langchain/core/load";var V=[];for(let $=0;$<256;++$)V.push(($+256).toString(16).slice(1));function p($,x=0){return(V[$[x+0]]+V[$[x+1]]+V[$[x+2]]+V[$[x+3]]+"-"+V[$[x+4]]+V[$[x+5]]+"-"+V[$[x+6]]+V[$[x+7]]+"-"+V[$[x+8]]+V[$[x+9]]+"-"+V[$[x+10]]+V[$[x+11]]+V[$[x+12]]+V[$[x+13]]+V[$[x+14]]+V[$[x+15]]).toLowerCase()}import{randomFillSync as P0}from"node:crypto";var G=new Uint8Array(256),S=G.length;function w(){if(S>G.length-16)P0(G),S=0;return G.slice(S,S+=16)}var m={};function Q0($,x,X){let Y;if($)Y=l($.random??$.rng?.()??w(),$.msecs,$.seq,x,X);else{let Z=Date.now(),J=w();z0(m,Z,J),Y=l(J,m.msecs,m.seq,x,X)}return x??p(Y)}function z0($,x,X){if($.msecs??=-1/0,$.seq??=0,x>$.msecs)$.seq=X[6]<<23|X[7]<<16|X[8]<<8|X[9],$.msecs=x;else if($.seq=$.seq+1|0,$.seq===0)$.msecs++;return $}function l($,x,X,Y,Z=0){if($.length<16)throw Error("Random bytes length must be >= 16");if(!Y)Y=new Uint8Array(16),Z=0;else if(Z<0||Z+16>Y.length)throw RangeError(`UUID byte range ${Z}:${Z+15} is out of buffer bounds`);return x??=Date.now(),X??=$[6]*127<<24|$[7]<<16|$[8]<<8|$[9],Y[Z++]=x/1099511627776&255,Y[Z++]=x/4294967296&255,Y[Z++]=x/16777216&255,Y[Z++]=x/65536&255,Y[Z++]=x/256&255,Y[Z++]=x&255,Y[Z++]=112|X>>>28&15,Y[Z++]=X>>>20&255,Y[Z++]=128|X>>>14&63,Y[Z++]=X>>>6&255,Y[Z++]=X<<2&255|$[10]&3,Y[Z++]=$[11],Y[Z++]=$[12],Y[Z++]=$[13],Y[Z++]=$[14],Y[Z++]=$[15],Y}var B=Q0;import"kysely";var A0=($)=>{let x=$.goto!=null&&!Array.isArray($.goto)?[$.goto]:$.goto;return new D0({goto:x?.map((X)=>{if(typeof X!=="string")return new K0(X.node,X.input);return X}),update:$.update??void 0,resume:$.resume})},n="[...]",B0="[Circular]",M=[],E=[];function L0(){return{depthLimit:Number.MAX_SAFE_INTEGER,edgesLimit:Number.MAX_SAFE_INTEGER}}function N0($,x,X,Y){if(typeof Y>"u")Y=L0();k($,"",0,[],void 0,0,Y);var Z;try{if(E.length===0)Z=JSON.stringify($,x,X);else Z=JSON.stringify($,R0(x),X)}catch(U){return JSON.stringify("[unable to serialize, circular reference is too complex to analyze]")}finally{while(M.length!==0){var J=M.pop();if(J.length===4)Object.defineProperty(J[0],J[1],J[3]);else J[0][J[1]]=J[2]}}return Z}function b($,x,X,Y){var Z=Object.getOwnPropertyDescriptor(Y,X);if(Z.get!==void 0)if(Z.configurable)Object.defineProperty(Y,X,{value:$}),M.push([Y,X,x,Z]);else E.push([x,X,$]);else Y[X]=$,M.push([Y,X,x])}function k($,x,X,Y,Z,J,U){J+=1;var H;if(typeof $==="object"&&$!==null){for(H=0;H<Y.length;H++)if(Y[H]===$){b(B0,$,x,Z);return}if(typeof U.depthLimit<"u"&&J>U.depthLimit){b(n,$,x,Z);return}if(typeof U.edgesLimit<"u"&&X+1>U.edgesLimit){b(n,$,x,Z);return}if(Y.push($),Array.isArray($))for(H=0;H<$.length;H++)k($[H],H,H,Y,$,J,U);else{var W=Object.keys($);for(H=0;H<W.length;H++){var Q=W[H];k($[Q],Q,H,Y,$,J,U)}}Y.pop()}}function R0($){return $=typeof $<"u"?$:function(x,X){return X},function(x,X){if(E.length>0)for(var Y=0;Y<E.length;Y++){var Z=E[Y];if(Z[1]===x&&Z[0]===X){X=Z[2],E.splice(Y,1);break}}return $.call(this,x,X)}}function _0($){return $!==null&&$.lc===1&&$.type==="constructor"&&Array.isArray($.id)}async function y($){if($&&typeof $==="object")if(Array.isArray($))return await Promise.all($.map((X)=>y(X)));else{let x={};for(let[X,Y]of Object.entries($))x[X]=await y(Y);if(x.lc===2&&x.type==="undefined")return;else if(x.lc===2&&x.type==="constructor"&&Array.isArray(x.id))try{let X=x.id[x.id.length-1],Y;switch(X){case"Set":Y=Set;break;case"Map":Y=Map;break;case"RegExp":Y=RegExp;break;case"Error":Y=Error;break;default:return x}if(x.method)return Y[x.method](...x.args||[]);else return new Y(...x.args||[])}catch(X){return x}else if(_0(x))return F0(JSON.stringify(x));return x}return $}function v($,x,X,Y){return{lc:2,type:"constructor",id:[$.name],method:x??null,args:X??[],kwargs:Y??{}}}function E0($){if($===void 0)return{lc:2,type:"undefined"};else if($ instanceof Set||$ instanceof Map)return v($.constructor,void 0,[Array.from($)]);else if($ instanceof RegExp)return v(RegExp,void 0,[$.source,$.flags]);else if($ instanceof Error)return v($.constructor,void 0,[$.message]);else if($?.lg_name==="Send")return{node:$.node,args:$.args};else return $}class e{_dumps($){return new TextEncoder().encode(N0($,(X,Y)=>{return E0(Y)}))}async dumpsTyped($){if($ instanceof Uint8Array)return["bytes",$];else return["json",this._dumps($)]}async _loads($){let x=JSON.parse($);return y(x)}async loadsTyped($,x){if($==="bytes")return typeof x==="string"?new TextEncoder().encode(x):x;else if($==="json")return this._loads(typeof x==="string"?x:new TextDecoder().decode(x));else throw Error(`Unknown serialization type: ${$}`)}}class $0 extends i.default{constructor($,x=!0,X=300){super();this.id=$,this.compressMessages=x,this.ttl=X}serializer=new e;async encodeData($){let[x,X]=await this.serializer.dumpsTyped($);return X}async decodeData($){return await this.serializer.loadsTyped("json",$)}}class x0{queues=new Map;defaultCompressMessages;queueConstructor;constructor($,x={}){this.defaultCompressMessages=x.defaultCompressMessages??!0,this.queueConstructor=$}createQueue($,x=300){return this.queues.set($,new this.queueConstructor($,this.defaultCompressMessages,x)),this.queues.get($)}async getQueue($){let x=this.queues.get($);if(!x)if(await this.queueConstructor?.isQueueExist?.($))return this.createQueue($);else throw Error(`Queue with id '${$}' does not exist`);return x}async cancelQueue($){await this.removeQueue($)}async pushToQueue($,x){await(await this.getQueue($)).push(x)}async getQueueData($){let x=this.queues.get($);if(!x)throw Error(`Queue with id '${$}' does not exist`);return await x.getAll()}async clearQueue($){let x=this.queues.get($);if(x){let X=x.clear();if(X instanceof Promise)await X}}async removeQueue($){let x=this.queues.get($);if(!x)return!1;try{await x.cancel()}catch(X){console.error("Error cancelling queue:",X)}try{let X=x.clear();if(X instanceof Promise)await X}catch(X){console.error("Error clearing queue:",X)}if(typeof x.destroy==="function")try{await x.destroy()}catch(X){console.error("Error destroying queue:",X)}return this.queues.delete($)}getAllQueueIds(){return Array.from(this.queues.keys())}async getAllQueuesData(){let $={};for(let[x,X]of this.queues)$[x]=await X.getAll();return $}clearAllQueues(){for(let $ of this.queues.values())$.clear()}async copyQueue($,x,X){let Z=await(await this.getQueue($)).copyToQueue(x,X);return this.queues.set(x,Z),Z}}var T={};async function n0($,x){T[$]=x}async function X0($,x,X){if(!T[$])throw Error(`Graph "${$}" not found`);let Y=typeof T[$]==="function"?await T[$](x??{configurable:{}}):T[$];if(typeof X?.checkpointer<"u")Y.checkpointer=X?.checkpointer??F.globalCheckPointer;else Y.checkpointer=F.globalCheckPointer;return Y.store=X?.store??void 0,Y}class I{db;adapter;constructor($){this.db=$.db,this.adapter=$}async setup(){await this.adapter.createTables(this.db),await this.adapter.createIndexes(this.db)}async create($){let x=$?.threadId||B(),X=new Date,Y=$?.metadata||{},Z={};if($?.ifExists==="raise"){if(await this.db.selectFrom("threads").select("thread_id").where("thread_id","=",x).executeTakeFirst())throw Error(`Thread with ID ${x} already exists.`)}if($?.ifExists==="do_nothing"&&$?.threadId){let J=await this.db.selectFrom("threads").selectAll().where("thread_id","=",x).executeTakeFirst();if(J)return{thread_id:J.thread_id,created_at:this.adapter.dbToDate(J.created_at).toISOString(),updated_at:this.adapter.dbToDate(J.updated_at).toISOString(),state_updated_at:this.adapter.dbToDate(J.updated_at).toISOString(),metadata:this.adapter.dbToJson(J.metadata),status:J.status,values:J.values?this.adapter.dbToJson(J.values):null,interrupts:this.adapter.dbToJson(J.interrupts)}}return await this.db.insertInto("threads").values({thread_id:x,created_at:this.adapter.dateToDb(X),updated_at:this.adapter.dateToDb(X),metadata:this.adapter.jsonToDb(Y),status:"idle",values:null,interrupts:this.adapter.jsonToDb(Z)}).execute(),{thread_id:x,created_at:X.toISOString(),updated_at:X.toISOString(),state_updated_at:X.toISOString(),metadata:Y,status:"idle",values:null,interrupts:Z}}async search($){let x=this.db.selectFrom("threads"),X;if($?.select)X=new Set($.select);else if($?.withoutDetails)X=new Set(["thread_id","created_at","updated_at","metadata","status"]);else X=new Set(["thread_id","created_at","updated_at","metadata","status","values","interrupts"]);let Y=[];if(X.has("thread_id"))Y.push("thread_id");if(X.has("created_at"))Y.push("created_at");if(X.has("updated_at"))Y.push("updated_at");if(X.has("metadata"))Y.push("metadata");if(X.has("status"))Y.push("status");if(X.has("values"))Y.push("values");if(X.has("interrupts"))Y.push("interrupts");if(Y.length>0)x=x.select(Y);else x=x.selectAll();if($?.ids&&$.ids.length>0)x=x.where("thread_id","in",$.ids);if($?.status)x=x.where("status","=",$.status);if($?.metadata)for(let[J,U]of Object.entries($.metadata))x=x.where(this.adapter.buildJsonQuery(this.db,"metadata",J,U));if($?.values)x=x.where((J)=>{return J("values","=",this.adapter.jsonToDb($.values))});if($?.sortBy){let J=$.sortOrder==="desc"?"desc":"asc";x=x.orderBy($.sortBy,J)}if($?.limit!==void 0){if(x=x.limit($.limit),$?.offset!==void 0)x=x.offset($.offset)}return(await x.execute()).map((J)=>{let U={thread_id:J.thread_id};if(X.has("created_at"))U.created_at=this.adapter.dbToDate(J.created_at).toISOString();if(X.has("updated_at"))U.updated_at=this.adapter.dbToDate(J.updated_at).toISOString();if(X.has("metadata"))U.metadata=this.adapter.dbToJson(J.metadata);if(X.has("status"))U.status=J.status;if(X.has("values"))U.values=J.values?this.adapter.dbToJson(J.values):null;if(X.has("interrupts"))U.interrupts=this.adapter.dbToJson(J.interrupts);return U})}async get($){let x=await this.db.selectFrom("threads").selectAll().where("thread_id","=",$).executeTakeFirst();if(!x)throw Error(`Thread with ID ${$} not found.`);return{thread_id:x.thread_id,created_at:this.adapter.dbToDate(x.created_at).toISOString(),updated_at:this.adapter.dbToDate(x.updated_at).toISOString(),state_updated_at:this.adapter.dbToDate(x.updated_at).toISOString(),metadata:this.adapter.dbToJson(x.metadata),status:x.status,values:x.values?this.adapter.dbToJson(x.values):null,interrupts:this.adapter.dbToJson(x.interrupts)}}async set($,x){if(!await this.db.selectFrom("threads").select("thread_id").where("thread_id","=",$).executeTakeFirst())throw Error(`Thread with ID ${$} not found.`);let Y={updated_at:this.adapter.dateToDb(new Date)};if(x.metadata!==void 0)Y.metadata=this.adapter.jsonToDb(x.metadata);if(x.status!==void 0)Y.status=x.status;if(x.values!==void 0)Y.values=x.values?this.adapter.jsonToDb(x.values):null;if(x.interrupts!==void 0)Y.interrupts=this.adapter.jsonToDb(x.interrupts);await this.db.updateTable("threads").set(Y).where("thread_id","=",$).execute()}async delete($){if((await this.db.deleteFrom("threads").where("thread_id","=",$).executeTakeFirst()).numDeletedRows===0n)throw Error(`Thread with ID ${$} not found.`)}async updateState($,x){let X=await this.get($);if(X.status==="busy")throw Error(`Thread with ID ${$} is busy, can't update state.`);let Y=X.metadata?.graph_id;if(!Y)return await this.set($,{values:x.values??null}),{configurable:{thread_id:$}};let Z={configurable:{thread_id:$,graph_id:Y}},J=await X0(Y,Z),U=await J.updateState(Z,x.values),H=await J.getState(Z);return await this.set($,{values:JSON.parse(f(H.values))}),U}async createRun($,x,X){let Y=B(),Z=new Date,J=X?.metadata??{};return await this.db.insertInto("runs").values({run_id:Y,thread_id:$,assistant_id:x,created_at:this.adapter.dateToDb(Z),updated_at:this.adapter.dateToDb(Z),status:"pending",metadata:this.adapter.jsonToDb(J),multitask_strategy:"reject"}).execute(),{run_id:Y,thread_id:$,assistant_id:x,created_at:Z.toISOString(),updated_at:Z.toISOString(),status:"pending",metadata:J,multitask_strategy:"reject"}}async listRuns($,x){let X=this.db.selectFrom("runs").selectAll().where("thread_id","=",$).orderBy("created_at","desc");if(x?.status)X=X.where("status","=",x.status);if(x?.limit!==void 0){if(X=X.limit(x.limit),x?.offset!==void 0)X=X.offset(x.offset)}return(await X.execute()).map((Z)=>({run_id:Z.run_id,thread_id:Z.thread_id,assistant_id:Z.assistant_id,created_at:this.adapter.dbToDate(Z.created_at).toISOString(),updated_at:this.adapter.dbToDate(Z.updated_at).toISOString(),status:Z.status,metadata:this.adapter.dbToJson(Z.metadata),multitask_strategy:Z.multitask_strategy}))}async updateRun($,x){if(!await this.db.selectFrom("runs").select("run_id").where("run_id","=",$).executeTakeFirst())throw Error(`Run with ID ${$} not found.`);let Y={updated_at:this.adapter.dateToDb(new Date)};if(x.status!==void 0)Y.status=x.status;if(x.metadata!==void 0)Y.metadata=this.adapter.jsonToDb(x.metadata);if(x.multitask_strategy!==void 0)Y.multitask_strategy=x.multitask_strategy;await this.db.updateTable("runs").set(Y).where("run_id","=",$).execute()}async count($){return(await this.search($)).length}async patch($,x){let X=await this.db.selectFrom("threads").selectAll().where("thread_id","=",$).executeTakeFirst();if(!X)throw Error(`Thread with ID ${$} not found.`);let Y={updated_at:this.adapter.dateToDb(new Date)};if(x.metadata!==void 0){let Z=this.adapter.dbToJson(X.metadata)||{};Y.metadata=this.adapter.jsonToDb({...Z,...x.metadata})}if(x.status!==void 0)Y.status=x.status;if(x.values!==void 0)Y.values=x.values?this.adapter.jsonToDb(x.values):null;if(x.interrupts!==void 0)Y.interrupts=this.adapter.jsonToDb(x.interrupts);return await this.db.updateTable("threads").set(Y).where("thread_id","=",$).execute(),await this.get($)}async getState($,x){let X=await this.get($);if(x?.checkpointId){let Z=await this.db.selectFrom("checkpoints").selectAll().where("checkpoint_id","=",x.checkpointId).where("thread_id","=",$).executeTakeFirst();if(!Z)throw Error(`Checkpoint with ID ${x.checkpointId} not found for thread ${$}`);return{values:this.adapter.dbToJson(Z.values),next:this.adapter.dbToJson(Z.next),metadata:this.adapter.dbToJson(Z.metadata),checkpoint:{id:Z.checkpoint_id,thread_id:$,parent_checkpoint_id:null,checkpoint_ns:"",metadata:this.adapter.dbToJson(Z.metadata),created_at:this.adapter.dbToDate(Z.created_at).toISOString()},created_at:this.adapter.dbToDate(Z.created_at).toISOString(),parent_checkpoint:null,tasks:[]}}return{values:X.values||{},next:[],metadata:X.metadata,checkpoint:null,created_at:X.created_at,parent_checkpoint:null,tasks:[]}}async getStateHistory($,x){let Y=await this.db.selectFrom("checkpoints").selectAll().where("thread_id","=",$).orderBy("created_at","asc").execute(),Z=Y.map((J)=>({values:this.adapter.dbToJson(J.values),next:this.adapter.dbToJson(J.next),metadata:this.adapter.dbToJson(J.metadata),checkpoint:{thread_id:$,checkpoint_ns:"",checkpoint_id:J.checkpoint_id,checkpoint_map:null},created_at:this.adapter.dbToDate(J.created_at).toISOString(),parent_checkpoint:null,tasks:[]}));if(x?.before){let J=Y.findIndex((U)=>U.checkpoint_id===x.before);if(J!==-1)Z=Z.slice(J+1)}if(x?.limit)Z=Z.slice(0,x.limit);return Z}async copy($){let x=await this.get($),X=B(),Y=new Date;await this.db.insertInto("threads").values({thread_id:X,created_at:this.adapter.dateToDb(Y),updated_at:this.adapter.dateToDb(Y),metadata:this.adapter.jsonToDb(x.metadata),status:x.status,values:x.values?this.adapter.jsonToDb(x.values):null,interrupts:this.adapter.jsonToDb(x.interrupts)}).execute();let Z=await this.db.selectFrom("checkpoints").selectAll().where("thread_id","=",$).orderBy("created_at","asc").execute();for(let J of Z)await this.db.insertInto("checkpoints").values({checkpoint_id:B(),thread_id:X,values:J.values,next:J.next,config:J.config,created_at:J.created_at,metadata:J.metadata}).execute();return{...x,thread_id:X,created_at:Y.toISOString(),updated_at:Y.toISOString()}}async saveCheckpoint($,x,X,Y,Z){await this.db.insertInto("checkpoints").values({checkpoint_id:B(),thread_id:$,values:this.adapter.jsonToDb(x),next:this.adapter.jsonToDb(X),config:this.adapter.jsonToDb(Y),created_at:this.adapter.dateToDb(new Date),metadata:this.adapter.jsonToDb(Z||{})}).execute()}}function T0($){let[x,X]=$.split("::");return{threadId:x,checkpointNs:X??""}}function C($,x,X){return`${$}::${x}::${X}`}function g($){if($===null||typeof $!=="object")return JSON.stringify($);if(Array.isArray($))return JSON.stringify($.map((Y)=>g(Y)));let x={},X=Object.keys($).sort();for(let Y of X)x[Y]=$[Y];return JSON.stringify(x,(Y,Z)=>{if(Z!==null&&typeof Z==="object"&&!Array.isArray(Z)){let J={},U=Object.keys(Z).sort();for(let H of U)J[H]=Z[H];return J}return Z})}class Y0 extends d{storage={};writes={};constructor($){super($)}async get($){return(await this.getTuple($))?.checkpoint}async _migratePendingSends($,x,X,Y){let Z=$,J=C(x,X,Y),U=await Promise.all(Object.values(this.writes[J]??{}).filter(([H,W])=>W===j).map(async([H,W,Q])=>await this.serde.loadsTyped("json",Q)));Z.channel_values??={},Z.channel_values[j]=U,Z.channel_versions??={},Z.channel_versions[j]=Object.keys(Z.channel_versions).length>0?r(...Object.values(Z.channel_versions)):this.getNextVersion(void 0)}async _loadPendingWrites($,x,X){let Y=C($,x,X),Z=this.writes[Y]??{};if(Object.keys(Z).length===0)return[];return await Promise.all(Object.values(Z).map(async([J,U,H])=>{return[J,U,await this.serde.loadsTyped("json",H)]}))}_cleanupOldWrites($,x,X){let Y=C($,x,X);delete this.writes[Y]}_checkMetadataFilterMatch($,x){for(let[X,Y]of Object.entries(x)){let Z=$?.[X];if(Y===null){if(!(X in($||{}))||Z!==null)return!1}else if(typeof Y==="object"&&!Array.isArray(Y)){if(typeof Z!=="object"||Z===null)return!1;if(g(Y)!==g(Z))return!1}else if(Z!==Y)return!1}return!0}async getTuple($){let x=$.configurable?.thread_id,X=$.configurable?.checkpoint_ns??"",Y=a($);if(x===void 0)return;let Z=this.storage[x]?.[X];if(Z===void 0)return;let{checkpoint:J,metadata:U,checkpoint_id:H,parent_checkpoint_id:W}=Z;if(Y&&H!==Y)return;let Q=await this.serde.loadsTyped("json",J);if(Q.v<4&&W!==void 0)await this._migratePendingSends(Q,x,X,W);let P=await this._loadPendingWrites(x,X,H),O=await this.serde.loadsTyped("json",U),K={config:{configurable:{thread_id:x,checkpoint_ns:X,checkpoint_id:H}},checkpoint:Q,metadata:O,pendingWrites:P};if(W!==void 0)K.parentConfig={configurable:{thread_id:x,checkpoint_ns:X,checkpoint_id:W}};return K}async*list($,x){let{before:X,limit:Y,filter:Z}=x??{},J=$.configurable?.thread_id?[$.configurable.thread_id]:Object.keys(this.storage),U=$.configurable?.checkpoint_ns,H=$.configurable?.checkpoint_id,W=[];for(let P of J){let O=this.storage[P];if(O===void 0)continue;for(let K of Object.keys(O)){if(U!==void 0&&K!==U)continue;let A=O[K];if(A===void 0)continue;let{checkpoint_id:D}=A;if(H&&D!==H)continue;if(X?.configurable?.checkpoint_id&&D>=X.configurable.checkpoint_id)continue;let L=await this.serde.loadsTyped("json",A.metadata);if(Z&&!this._checkMetadataFilterMatch(L,Z))continue;W.push({threadId:P,checkpointNs:K,namespaceData:A})}}W.sort((P,O)=>O.namespaceData.checkpoint_ts-P.namespaceData.checkpoint_ts);let Q=0;for(let{threadId:P,checkpointNs:O,namespaceData:K}of W){if(Y!==void 0&&Q>=Y)return;let{checkpoint:A,metadata:D,checkpoint_id:L,parent_checkpoint_id:_}=K,z=await this.serde.loadsTyped("json",A);if(z.v<4&&_!==void 0)await this._migratePendingSends(z,P,O,_);let q=await this._loadPendingWrites(P,O,L),W0=await this.serde.loadsTyped("json",D),u={config:{configurable:{thread_id:P,checkpoint_ns:O,checkpoint_id:L}},checkpoint:z,metadata:W0,pendingWrites:q};if(_!==void 0)u.parentConfig={configurable:{thread_id:P,checkpoint_ns:O,checkpoint_id:_}};Q++,yield u}}async put($,x,X,Y){let Z=o(x),J=$.configurable?.thread_id,U=$.configurable?.checkpoint_ns??"",H=$.configurable?.checkpoint_id;if(J===void 0)throw Error("thread_id is required");let W=x.id||s(0);if(!this.storage[J])this.storage[J]={};let Q=this.storage[J][U];if(Q!==void 0&&Q.checkpoint_id!==W)this._cleanupOldWrites(J,U,Q.checkpoint_id);let[[,P],[,O]]=await Promise.all([this.serde.dumpsTyped(Z),this.serde.dumpsTyped(X)]);return this.storage[J][U]={checkpoint:P,metadata:O,checkpoint_id:W,parent_checkpoint_id:H,checkpoint_ts:Date.now()},{configurable:{thread_id:J,checkpoint_ns:U,checkpoint_id:W}}}async putWrites($,x,X){let Y=$.configurable?.thread_id,Z=$.configurable?.checkpoint_ns??"",J=$.configurable?.checkpoint_id;if(!Y||!J)throw Error("thread_id and checkpoint_id are required");let U=C(Y,Z,J),H=this.writes[U];if(this.writes[U]===void 0)this.writes[U]={};await Promise.all(x.map(async([W,Q],P)=>{let[,O]=await this.serde.dumpsTyped(Q),K=[X,t[W]||P],A=`${K[0]},${K[1]}`;if(K[1]>=0&&H&&A in H)return;this.writes[U][A]=[X,W,O]}))}async deleteThread($){delete this.storage[$];for(let x of Object.keys(this.writes)){let{threadId:X}=T0(x.split("::").slice(0,2).join("::"));if(X===$)delete this.writes[x]}}}class N{event;data;id;constructor($,x){this.event=$,this.data=x}}class Z0 extends N{constructor(){super("__system_cancel__","user cancel this run")}}class J0 extends N{constructor(){super("__stream_end__","stream end")}}class c extends N{constructor($){super("__stream_error__",{error:$.name,message:$.message})}}class h extends $0{data=[];activeGenerators=new Set;isDestroyed=!1;async push($){if(this.isDestroyed)return;let x=this.compressMessages?await this.encodeData($):$;process.env.LG_TEMP_MESSAGE!=="true"&&this.data.push(x),this.emit("dataChange",x)}onDataChange($){if(this.isDestroyed)return()=>{};return this.on("dataChange",async(x)=>{if(this.isDestroyed)return;$(this.compressMessages?await this.decodeData(x):x)}),()=>this.off("dataChange",$)}async*onDataReceive(){if(this.isDestroyed)return;let $=new AbortController;this.activeGenerators.add($);let x=[],X=null,Y=!1,Z=!1,J=null,U=async(Q)=>{if(Z||$.signal.aborted)return;try{let P=this.compressMessages?await this.decodeData(Q):Q;if(x.push(P),P.event==="__stream_end__"||P.event==="__stream_error__"||P.event==="__stream_cancel__"){if(J)clearTimeout(J),J=null;if(J=setTimeout(()=>{if(Y=!0,X)X(),X=null},300),P.event==="__stream_cancel__")$.abort("stream cancelled")}if(X)X(),X=null}catch(P){if(console.error("Error in handleData:",P),X)X(),X=null}};this.on("dataChange",U);let H=()=>{if(Y=!0,X)X(),X=null};$.signal.addEventListener("abort",H);let W=()=>{if(Z)return;if(Z=!0,J)clearTimeout(J),J=null;try{this.off("dataChange",U)}catch(Q){}try{$.signal.removeEventListener("abort",H)}catch(Q){}if(X)X(),X=null;x.length=0,this.activeGenerators.delete($)};try{if($.signal.aborted||this.isDestroyed)return;while(!Y&&!$.signal.aborted&&!this.isDestroyed)if(x.length>0){for(let Q of x)yield Q;x.length=0}else await new Promise((Q)=>{X=Q})}finally{W()}}async getAll(){if(this.isDestroyed)return[];return this.compressMessages?await Promise.all(this.data.map(($)=>this.decodeData($))):[...this.data]}clear(){this.data.length=0}cancelSignal=new AbortController;async cancel(){for(let $ of this.activeGenerators)try{$.abort("user cancel this run")}catch(x){}if(this.activeGenerators.clear(),!this.cancelSignal.signal.aborted)this.cancelSignal.abort("user cancel this run");if(!this.isDestroyed)await this.push(new Z0)}async copyToQueue($,x){let X=this.data.slice(),Y=new h($,this.compressMessages,x??this.ttl);return Y.data=X,Y}async destroy(){if(this.isDestroyed)return;this.isDestroyed=!0,await this.cancel(),this.clear(),this.removeAllListeners(),this.activeGenerators.clear()}}class U0{threads=[];checkpoints=new Map;async setup(){return}async create($){let x=$?.threadId||B();if($?.ifExists==="raise"&&this.threads.some((Y)=>Y.thread_id===x))throw Error(`Thread with ID ${x} already exists.`);let X={thread_id:x,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),state_updated_at:new Date().toISOString(),metadata:$?.metadata||{},status:"idle",values:null,interrupts:{}};return this.checkpoints.set(x,[]),this.threads.push(X),X}async search($){let x=[...this.threads];if($?.ids&&$.ids.length>0)x=x.filter((J)=>$.ids.includes(J.thread_id));if($?.status)x=x.filter((J)=>J.status===$.status);if($?.metadata){for(let J in $.metadata)if(Object.prototype.hasOwnProperty.call($.metadata,J))x=x.filter((U)=>U.metadata&&U.metadata[J]===$.metadata?.[J])}if($?.values)x=x.filter((J)=>{if(!J.values)return!1;return this.deepEqual(J.values,$.values)});if($?.sortBy)x.sort((J,U)=>{let H,W;switch($.sortBy){case"thread_id":H=J.thread_id,W=U.thread_id;break;case"created_at":H=new Date(J.created_at).getTime(),W=new Date(U.created_at).getTime();break;case"updated_at":H=new Date(J.updated_at).getTime(),W=new Date(U.updated_at).getTime();break;case"status":H=J.status,W=U.status;break;default:return 0}if($.sortOrder==="desc")return W>H?1:W<H?-1:0;else return H>W?1:H<W?-1:0});let X=$?.offset||0,Y=$?.limit||x.length;return x.slice(X,X+Y).map((J)=>{let U={thread_id:J.thread_id},H;if($?.select)H=new Set($.select);else if($?.withoutDetails)H=new Set(["thread_id","created_at","updated_at","metadata","status"]);else H=new Set(["thread_id","created_at","updated_at","metadata","status","values","interrupts"]);if(H.has("thread_id"))U.thread_id=J.thread_id;if(H.has("created_at"))U.created_at=J.created_at;if(H.has("updated_at"))U.updated_at=J.updated_at;if(H.has("metadata"))U.metadata=J.metadata;if(H.has("status"))U.status=J.status;if(H.has("values"))U.values=J.values;if(H.has("interrupts"))U.interrupts=J.interrupts;return U})}deepEqual($,x){if($===x)return!0;if(typeof $!==typeof x)return!1;if(typeof $!=="object"||$===null||x===null)return!1;let X=Object.keys($),Y=Object.keys(x);if(X.length!==Y.length)return!1;for(let Z of X){if(!Y.includes(Z))return!1;if(!this.deepEqual($[Z],x[Z]))return!1}return!0}async get($){let x=this.threads.find((X)=>X.thread_id===$);if(!x)throw Error(`Thread with ID ${$} not found.`);return x}async set($,x){let X=this.threads.findIndex((Y)=>Y.thread_id===$);if(X===-1)throw Error(`Thread with ID ${$} not found.`);this.threads[X]={...this.threads[X],...x}}async delete($){let x=this.threads.length;if(this.threads=this.threads.filter((X)=>X.thread_id!==$),this.checkpoints.delete($),this.threads.length===x)throw Error(`Thread with ID ${$} not found.`)}async updateState($,x){let X=this.threads.findIndex((Z)=>Z.thread_id===$);if(X===-1)throw Error(`Thread with ID ${$} not found.`);let Y=this.threads[X];if(Y.status==="busy")throw Error(`Thread with ID ${$} is busy, can't update state.`);if(this.threads[X]={...Y,values:x.values,updated_at:new Date().toISOString()},Y.metadata?.graph_id){let Z=Y.metadata?.graph_id,J={configurable:{thread_id:$,graph_id:Z}};try{let U=await X0(Z,J),H=await U.updateState(J,x.values),W=await U.getState(J);return await this.set($,{values:JSON.parse(f(W.values))}),H}catch(U){console.warn("Failed to update graph state:",U)}}return{configurable:{thread_id:$}}}runs=[];async createRun($,x,X){let Z={run_id:B(),thread_id:$,assistant_id:x,created_at:new Date().toISOString(),updated_at:new Date().toISOString(),status:"pending",metadata:X?.metadata??{},multitask_strategy:"reject"};return this.runs.push(Z),Z}async listRuns($,x){let X=[...this.runs];if(x?.status)X=X.filter((Y)=>Y.status===x.status);if(x?.limit)X=X.slice(x.offset||0,(x.offset||0)+x.limit);return X}async updateRun($,x){let X=this.runs.findIndex((Y)=>Y.run_id===$);if(X===-1)throw Error(`Run with ID ${$} not found.`);this.runs[X]={...this.runs[X],...x}}async count($){return(await this.search($)).length}async patch($,x){let X=this.threads.findIndex((Z)=>Z.thread_id===$);if(X===-1)throw Error(`Thread with ID ${$} not found.`);let Y={...this.threads[X],...x,updated_at:new Date().toISOString(),metadata:x.metadata?{...this.threads[X].metadata,...x.metadata}:this.threads[X].metadata};return this.threads[X]=Y,Y}async getState($,x){let X=await this.get($);if(x?.checkpointId){let J=(this.checkpoints.get($)||[]).find((U)=>U.checkpoint_id===x.checkpointId);if(!J)throw Error(`Checkpoint with ID ${x.checkpointId} not found for thread ${$}`);return{values:J.values,next:J.next,metadata:J.metadata,checkpoint:{id:J.checkpoint_id,thread_id:$,parent_checkpoint_id:null,checkpoint_ns:"",metadata:J.metadata,created_at:J.created_at},created_at:J.created_at,parent_checkpoint:null,tasks:[]}}return{values:X.values||{},next:[],metadata:X.metadata,checkpoint:null,created_at:X.created_at,parent_checkpoint:null,tasks:[]}}async getStateHistory($,x){let X=this.checkpoints.get($)||[],Y=X.map((Z)=>({values:Z.values,next:Z.next,metadata:Z.metadata,checkpoint:{checkpoint_id:Z.checkpoint_id,thread_id:$,checkpoint_ns:"",checkpoint_map:void 0},created_at:Z.created_at,parent_checkpoint:null,tasks:[]}));if(x?.before){let Z=X.findIndex((J)=>J.checkpoint_id===x.before);if(Z!==-1)Y=Y.slice(Z+1)}if(x?.limit)Y=Y.slice(0,x.limit);return Y}async copy($){let x=await this.get($),X=B(),Y={...x,thread_id:X,created_at:new Date().toISOString(),updated_at:new Date().toISOString()};this.threads.push(Y);let J=(this.checkpoints.get($)||[]).map((U)=>({...U,checkpoint_id:B(),thread_id:X}));return this.checkpoints.set(X,J),Y}async saveCheckpoint($,x,X,Y,Z){let J=this.checkpoints.get($)||[],U={checkpoint_id:B(),thread_id:$,values:x,next:X,config:Y,created_at:new Date().toISOString(),metadata:Z};J.push(U),this.checkpoints.set($,J)}}var S0=async()=>{if(process.env.REDIS_URL&&(process.env.CHECKPOINT_TYPE==="redis"||process.env.CHECKPOINT_TYPE==="shallow/redis")){if(process.env.CHECKPOINT_TYPE==="redis"){console.debug("LG | Using redis as checkpoint");let{RedisSaver:$}=await import("./chunk-pdkbrds7.js");return await $.fromUrl(process.env.REDIS_URL,{defaultTTL:60,refreshOnRead:!0})}if(process.env.CHECKPOINT_TYPE==="shallow/redis"){console.debug("LG | Using shallow redis as checkpoint");let{ShallowRedisSaver:$}=await import("./chunk-hww94vjn.js");return await $.fromUrl(process.env.REDIS_URL)}}if(process.env.DATABASE_URL&&H0(process.env.DATABASE_URL)==="postgres"){console.debug("LG | Using postgres as checkpoint");let{createPGCheckpoint:$}=await import("./chunk-c9q11tk2.js");return $()}if(process.env.SQLITE_DATABASE_URI){if(process.env.CHECKPOINT_TYPE==="sqlite"){console.debug("LG | Using sqlite (full) as checkpoint");let{SqliteSaver:X}=await import("./chunk-rrkzfahh.js");return await X.fromConnStringAsync(process.env.SQLITE_DATABASE_URI)}console.debug("LG | Using shallow sqlite as checkpoint (default)");let{SqliteShallowSaver:$}=await import("./chunk-5fqt5yg1.js");return await $.fromConnStringAsync(process.env.SQLITE_DATABASE_URI)}return console.log("LG | You are using memory as checkpoint!"),console.log("\x1B[33m%s\x1B[0m","LG | set SQLITE_DATABASE_URI=./.langgraph_api/langgraph.db to your .env file to use \x1B[1mSQLite\x1B[0m for dev!"),console.log("\x1B[33m%s\x1B[0m","LG | set DATABASE_URL=postgresql://user:pass@localhost:5432/db to your .env file to use \x1B[1mPostgreSQL\x1B[0m for prod!"),new Y0},G0=async()=>{let $;if(process.env.REDIS_URL){console.debug("LG | Using redis as stream queue");let{RedisStreamQueue:x}=await import("./chunk-vc384abg.js");$=x}else $=h;return new x0($)};function H0($){let x=$.toLowerCase();if(x.startsWith("http://")||x.startsWith("https://"))return"remote";return"postgres"}var w0=async($)=>{if(process.env.DATABASE_URL){if(H0(process.env.DATABASE_URL)==="remote"){console.debug("LG | Using Remote PostgreSQL ThreadsManager");let{RemoteKyselyThreadsManager:X}=await import("./chunk-j204fejq.js"),Y=new X(process.env.DATABASE_URL);if(process.env.DATABASE_INIT==="true")await Y.setup();return Y}else if($.checkpointer){console.debug("LG | Using PostgreSQL ThreadsManager");let{PostgresAdapter:X}=await import("./chunk-q8arjxg1.js"),Y=$.checkpointer.pool,Z=new I(new X(Y));if(process.env.DATABASE_INIT==="true")await Z.setup();return Z}}if(process.env.SQLITE_DATABASE_URI&&$.checkpointer){console.debug("LG | Using SQLite ThreadsManager");let{SQLiteAdapter:x}=await import("./chunk-yvhq458c.js"),X=$.checkpointer.db,Y=new I(new x(X));return await Y.setup(),Y}return new U0};class F{static globalMessageQueue=null;static globalCheckPointer=null;static globalThreadsManager=null;static isInitialized=null;static async initGlobal(){if(F.isInitialized)return F.isInitialized;return F.isInitialized=(async()=>{let[$,x]=await Promise.all([G0(),S0()]);console.debug("LG | checkpointer created");let X=await w0({checkpointer:x});console.debug("LG | threads manager created"),console.debug("LG | global init done"),F.globalMessageQueue=$,F.globalCheckPointer=x,F.globalThreadsManager=X})(),F.isInitialized}}async function C0($,x,X,Y,Z){let U=Y.config?.configurable?.graph_id;if(!U||typeof U!=="string")throw Error("Invalid or missing graph_id");let H=await Z.getGraph(U,Y.config,{checkpointer:Y.temporary?null:void 0}),W=Array.isArray(Y.streamMode)?Y.streamMode:Y.streamMode?[Y.streamMode]:[],Q=new Set(["values",...W.filter((D)=>D!=="events"&&D!=="messages-tuple")]);if(W.includes("messages-tuple"))Q.add("messages");if(W.includes("messages"))Q.add("values");await X.push(new N("metadata",{run_id:x.run_id,attempt:Z.attempt,graph_id:U}));let P={...Y.config?.metadata,run_attempt:Z.attempt},O=null,K=null,A=null;try{O=new Set,K=new Map,A=await H.stream(Y.command!=null?A0(Y.command):Y.input??null,{interruptAfter:Y.interruptAfter,interruptBefore:Y.interruptBefore,tags:Y.config?.tags,configurable:Y.config?.configurable,recursionLimit:Y.config?.recursionLimit,subgraphs:Y.streamSubgraphs,metadata:P,runId:x.run_id,streamMode:[...Q],signal:X.cancelSignal.signal});for await(let D of A){let L=[];if(D.length===3)L=D.splice(0,1);let _=(z)=>{if(L.length===0)return z;if(L.length===1&&L[0]?.length===0)return z;return`${z}|${L.join("|")}`};if(D[0]==="values"){let z=D[1];if(_("values")==="values")if(await X.push(new N(_("values"),z)),z?.__interrupt__)await $.set(x.thread_id,{status:"interrupted",interrupts:z?JSON.parse(f(z)):""});else await $.set(x.thread_id,{values:z?JSON.parse(f(z)):""})}else if(D[0]==="messages"){let z=D[1][0],q=D[1][1];if(z.id&&!O.has(z.id))await X.push(new N("messages/metadata",{[z.id]:q})),O.add(z.id);if(O0.isInstance(z)&&z.id){if(K.set(z.id,[...K.get(z.id)??[],z]),await X.push(new N("messages/partial",[K.get(z.id).reduce(V0)])),z.content===""&&!z.tool_calls?.length)K.delete(z.id)}else await X.push(new N("messages/partial",[z]))}else if(D[0]==="updates"){let z=D[1];await X.push(new N(_("updates"),z))}}}catch(D){if(!(D instanceof Error&&D.message?.includes("cancel"))){console.error("streamStateWithQueue error:",D);try{await X.push(new c(D))}catch(L){}}throw D}finally{try{await X.push(new J0)}catch(D){}if(O)O.clear(),O=null;if(K)K.clear(),K=null;A=null}}var f=($,x=0)=>{return JSON.stringify($,function(X,Y){let Z=this[X];if(Z!=null&&typeof Z==="object"&&"toDict"in Z&&typeof Z.toDict==="function"){let{type:J,data:U}=Z.toDict();return{...U,type:J}}return Y},x)};async function*i0($,x,X,Y){x=await x;let{run_id:Z,thread_id:J}=x,U=null,H=null,W=null,Q=!1;try{await $.set(J,{status:"busy"}),await $.updateRun(x.run_id,{status:"running"}),H=F.globalMessageQueue.createQueue(Z),U=H.onDataReceive(),W=C0($,x,H,X,Y).catch((P)=>{if(Q)return;if(P.message!=="user cancel this run")console.error("Queue task error:",P);F.globalMessageQueue.pushToQueue(Z,new c(P))});for await(let P of U)yield P;await $.updateRun(x.run_id,{status:"success"})}catch(P){console.error("Stream error:",P),await $.updateRun(x.run_id,{status:"error"}),await $.set(J,{status:"error"})}finally{if(Q=!0,U){try{await U.return(void 0)}catch(O){}U=null}if(H&&!H.cancelSignal.signal.aborted)try{H.cancelSignal.abort("Stream consumer disconnected")}catch(O){}if(W){try{await Promise.race([W,new Promise((O)=>setTimeout(O,1000))])}catch(O){}W=null}if((await $.get(J)).status==="interrupted")await F.globalMessageQueue.copyQueue(Z,J,30000);else await $.set(J,{status:"idle",interrupts:{}});await F.globalMessageQueue.removeQueue(Z),H=null}}
2
+ export{$0 as d,T as e,n0 as f,X0 as g,Z0 as h,F as i,f as j,i0 as k};
@@ -0,0 +1 @@
1
+ import{a as x,b as I}from"./chunk-5wn1nfqy.js";import"./chunk-7dp8kq2f.js";import{U as C,V as T,W as b,X as w,Y as v}from"./chunk-bgpcx3bm.js";import{nb as K}from"./chunk-cze71w02.js";var W=K(I(),1),g=[{index:"checkpoints",prefix:"checkpoint:",schema:{"$.thread_id":{type:"TAG",AS:"thread_id"},"$.checkpoint_ns":{type:"TAG",AS:"checkpoint_ns"},"$.checkpoint_id":{type:"TAG",AS:"checkpoint_id"},"$.parent_checkpoint_id":{type:"TAG",AS:"parent_checkpoint_id"},"$.checkpoint_ts":{type:"NUMERIC",AS:"checkpoint_ts"},"$.has_writes":{type:"TAG",AS:"has_writes"},"$.source":{type:"TAG",AS:"source"},"$.step":{type:"NUMERIC",AS:"step"}}},{index:"checkpoint_blobs",prefix:"checkpoint_blob:",schema:{"$.thread_id":{type:"TAG",AS:"thread_id"},"$.checkpoint_ns":{type:"TAG",AS:"checkpoint_ns"},"$.checkpoint_id":{type:"TAG",AS:"checkpoint_id"},"$.channel":{type:"TAG",AS:"channel"},"$.version":{type:"TAG",AS:"version"},"$.type":{type:"TAG",AS:"type"}}},{index:"checkpoint_writes",prefix:"checkpoint_write:",schema:{"$.thread_id":{type:"TAG",AS:"thread_id"},"$.checkpoint_ns":{type:"TAG",AS:"checkpoint_ns"},"$.checkpoint_id":{type:"TAG",AS:"checkpoint_id"},"$.task_id":{type:"TAG",AS:"task_id"},"$.idx":{type:"NUMERIC",AS:"idx"},"$.channel":{type:"TAG",AS:"channel"},"$.type":{type:"TAG",AS:"type"}}}],f=class z extends w{client;ttlConfig;constructor(G,J){super();this.client=G,this.ttlConfig=J}static async fromUrl(G,J){let Z=W.createClient({url:G});await Z.connect();let Q=new z(Z,J);return await Q.ensureIndexes(),Q}static async fromCluster(G,J){let Z=W.createCluster({rootNodes:G});await Z.connect();let Q=new z(Z,J);return await Q.ensureIndexes(),Q}async get(G){return(await this.getTuple(G))?.checkpoint}async getTuple(G){let J=G.configurable?.thread_id,Z=G.configurable?.checkpoint_ns??"",Q=G.configurable?.checkpoint_id;if(!J)return;let Y,E;if(Q)Y=`checkpoint:${J}:${Z}:${Q}`,E=await this.client.json.get(Y);else{let $=`checkpoint:${J}:${Z}:*`,_=await this.client.keys($);if(_.length===0)return;_.sort(),Y=_[_.length-1],E=await this.client.json.get(Y)}if(!E)return;if(this.ttlConfig?.refreshOnRead&&this.ttlConfig?.defaultTTL)await this.applyTTL(Y);let{checkpoint:F,pendingWrites:X}=await this.loadCheckpointWithWrites(E);return await this.createCheckpointTuple(E,F,X)}async put(G,J,Z,Q){await this.ensureIndexes();let Y=G.configurable?.thread_id,E=G.configurable?.checkpoint_ns??"",F=G.configurable?.checkpoint_id;if(!Y)throw Error("thread_id is required");let X=J.id||C(0),$=`checkpoint:${Y}:${E}:${X}`,_=b(J);if(_.channel_values&&Q!==void 0)if(Object.keys(Q).length===0)_.channel_values={};else{let U={};for(let B of Object.keys(Q))if(B in _.channel_values)U[B]=_.channel_values[B];_.channel_values=U}let H={thread_id:Y,checkpoint_ns:E===""?"__empty__":E,checkpoint_id:X,parent_checkpoint_id:F||null,checkpoint:_,metadata:Z,checkpoint_ts:Date.now(),has_writes:"false"};if(this.addSearchableMetadataFields(H,Z),await this.client.json.set($,"$",H),this.ttlConfig?.defaultTTL)await this.applyTTL($);return{configurable:{thread_id:Y,checkpoint_ns:E,checkpoint_id:X}}}async*list(G,J){if(await this.ensureIndexes(),J?.filter!==void 0){let Q=Object.values(J.filter).some((X)=>X===null),Y=[];if(G?.configurable?.thread_id){let X=G.configurable.thread_id.replace(/[-.@]/g,"\\$&");Y.push(`(@thread_id:{${X}})`)}if(G?.configurable?.checkpoint_ns!==void 0){let X=G.configurable.checkpoint_ns;if(X==="")Y.push("(@checkpoint_ns:{__empty__})");else{let $=X.replace(/[-.@]/g,"\\$&");Y.push(`(@checkpoint_ns:{${$}})`)}}if(!J?.before&&J?.filter){for(let[X,$]of Object.entries(J.filter))if($===void 0);else if($===null);else if(typeof $==="string"){let _=x(X),H=x($);Y.push(`(@${_}:{${H}})`)}else if(typeof $==="number"){let _=x(X);Y.push(`(@${_}:[${$} ${$}])`)}else if(typeof $==="object"&&Object.keys($).length===0);}if(Y.length===0)Y.push("*");let E=Y.join(" "),F=J?.limit??10;try{let X=J?.before&&!G?.configurable?.thread_id?1000:J?.before?F*10:F,$=(await this.client.ft.search("checkpoints",E,{LIMIT:{from:0,size:X},SORTBY:{BY:"checkpoint_ts",DIRECTION:"DESC"}})).documents,_=0;for(let H of $){if(_>=F)break;if(J?.before?.configurable?.checkpoint_id){if(H.value.checkpoint_id>=J.before.configurable.checkpoint_id)continue}let U=H.value,B=!0;if((Q||J?.before)&&J?.filter){for(let[M,O]of Object.entries(J.filter))if(O===null){if(U.metadata?.[M]!==null){B=!1;break}}else if(O!==void 0){let A=U.metadata?.[M];if(typeof O==="object"&&O!==null){if(q(A)!==q(O)){B=!1;break}}else if(A!==O){B=!1;break}}if(!B)continue}let{checkpoint:L,pendingWrites:R}=await this.loadCheckpointWithWrites(U);yield await this.createCheckpointTuple(U,L,R),_++}return}catch(X){if(X.message?.includes("no such index"));else throw X}if(G?.configurable?.thread_id){let X=G.configurable.thread_id,$=G.configurable.checkpoint_ns??"",_=`checkpoint:${X}:${$}:*`,H=await this.client.keys(_);H.sort().reverse();let U=H;if(J?.before?.configurable?.checkpoint_id){let R=`checkpoint:${J.before.configurable.thread_id||X}:${J.before.configurable.checkpoint_ns??$}:${J.before.configurable.checkpoint_id}`,M=H.indexOf(R);if(M>0)U=H.slice(M+1);else if(M===0)U=[]}let B=J?.limit??10,L=U.slice(0,B);for(let R of L){let M=await this.client.json.get(R);if(M){let O=!0;for(let[V,S]of Object.entries(J.filter)){let N=M.metadata?.[V];if(S===null){if(N!==null){O=!1;break}}else if(N!==S){O=!1;break}}if(!O)continue;let{checkpoint:A,pendingWrites:P}=await this.loadCheckpointWithWrites(M);yield await this.createCheckpointTuple(M,A,P)}}}else{let X=G?.configurable?.checkpoint_ns!==void 0?`checkpoint:*:${G.configurable.checkpoint_ns===""?"__empty__":G.configurable.checkpoint_ns}:*`:"checkpoint:*",$=await this.client.keys(X),_=[];for(let B of $){let L=await this.client.json.get(B);if(L)_.push({key:B,doc:L})}_.sort((B,L)=>L.doc.checkpoint_ts-B.doc.checkpoint_ts);let H=0,U=J?.limit??10;for(let{doc:B}of _){if(H>=U)break;if(J?.before?.configurable?.checkpoint_id){if(B.checkpoint_id>=J.before.configurable.checkpoint_id)continue}let L=!0;if(J?.filter){for(let[O,A]of Object.entries(J.filter))if(A===null){if(B.metadata?.[O]!==null){L=!1;break}}else if(A!==void 0){let P=B.metadata?.[O];if(typeof A==="object"&&A!==null){if(q(P)!==q(A)){L=!1;break}}else if(P!==A){L=!1;break}}if(!L)continue}let{checkpoint:R,pendingWrites:M}=await this.loadCheckpointWithWrites(B);yield await this.createCheckpointTuple(B,R,M),H++}}return}let Z={...J,filter:{}};yield*this.list(G,Z)}async putWrites(G,J,Z){await this.ensureIndexes();let Q=G.configurable?.thread_id,Y=G.configurable?.checkpoint_ns??"",E=G.configurable?.checkpoint_id;if(!Q||!E)throw Error("thread_id and checkpoint_id are required");let F=[],X=performance.now()*1000;for(let _=0;_<J.length;_++){let[H,U]=J[_],B=`checkpoint_write:${Q}:${Y}:${E}:${Z}:${_}`;F.push(B);let L={thread_id:Q,checkpoint_ns:Y,checkpoint_id:E,task_id:Z,idx:_,channel:H,type:typeof U==="object"?"json":"string",value:U,timestamp:X,global_idx:X+_};await this.client.json.set(B,"$",L)}if(F.length>0){let _=`write_keys_zset:${Q}:${Y}:${E}`,H={};if(F.forEach((U,B)=>{H[U]=X+B}),await this.client.zAdd(_,Object.entries(H).map(([U,B])=>({score:B,value:U}))),this.ttlConfig?.defaultTTL)await this.applyTTL(...F,_)}let $=`checkpoint:${Q}:${Y}:${E}`;if(await this.client.exists($)){let _=await this.client.json.get($);if(_)_.has_writes="true",await this.client.json.set($,"$",_)}}async deleteThread(G){let J=`checkpoint:${G}:*`,Z=await this.client.keys(J);if(Z.length>0)await this.client.del(Z);let Q=`writes:${G}:*`,Y=await this.client.keys(Q);if(Y.length>0)await this.client.del(Y)}async end(){await this.client.quit()}async loadPendingWrites(G,J,Z){let Q=`checkpoint_write:${G}:${J}:${Z}:*`,Y=await this.client.keys(Q);if(Y.length===0)return;let E=[];for(let X of Y){let $=await this.client.json.get(X);if($)E.push($)}E.sort((X,$)=>(X.global_idx||0)-($.global_idx||0));let F=[];for(let X of E){let $=await this.serde.loadsTyped("json",JSON.stringify(X.value));F.push([X.task_id,X.channel,$])}return F}async loadCheckpointWithWrites(G){let J=await this.serde.loadsTyped("json",JSON.stringify(G.checkpoint));if(J.v<4&&G.parent_checkpoint_id!=null){let Q=G.checkpoint_ns==="__empty__"?"":G.checkpoint_ns;await this.migratePendingSends(J,G.thread_id,Q,G.parent_checkpoint_id)}let Z;if(G.has_writes==="true"){let Q=G.checkpoint_ns==="__empty__"?"":G.checkpoint_ns;Z=await this.loadPendingWrites(G.thread_id,Q,G.checkpoint_id)}return{checkpoint:J,pendingWrites:Z}}async migratePendingSends(G,J,Z,Q){let Y=await this.loadPendingWrites(J,Z,Q);if(!Y||Y.length===0)return;let E=Y.filter(([,X])=>X===T);if(E.length===0)return;let F=[];for(let[,,X]of E)F.push(X);G.channel_values??={},G.channel_values[T]=F,G.channel_versions[T]=Object.keys(G.channel_versions).length>0?v(...Object.values(G.channel_versions)):1}async createCheckpointTuple(G,J,Z){let Q=G.checkpoint_ns==="__empty__"?"":G.checkpoint_ns,Y=await this.serde.loadsTyped("json",JSON.stringify(G.metadata));return{config:{configurable:{thread_id:G.thread_id,checkpoint_ns:Q,checkpoint_id:G.checkpoint_id}},checkpoint:J,metadata:Y,parentConfig:G.parent_checkpoint_id?{configurable:{thread_id:G.thread_id,checkpoint_ns:Q,checkpoint_id:G.parent_checkpoint_id}}:void 0,pendingWrites:Z}}addSearchableMetadataFields(G,J){if(!J)return;if("source"in J)G.source=J.source;if("step"in J)G.step=J.step;if("writes"in J)G.writes=typeof J.writes==="object"?JSON.stringify(J.writes):J.writes;if("score"in J)G.score=J.score}async applyTTL(...G){if(!this.ttlConfig?.defaultTTL)return;let J=Math.floor(this.ttlConfig.defaultTTL*60),Z=await Promise.allSettled(G.map((Q)=>this.client.expire(Q,J)));for(let Q=0;Q<Z.length;Q++)if(Z[Q].status==="rejected")console.warn(`Failed to set TTL for key ${G[Q]}:`,Z[Q].reason)}async ensureIndexes(){for(let G of g)try{await this.client.ft.create(G.index,G.schema,{ON:"JSON",PREFIX:G.prefix})}catch(J){if(!J.message?.includes("Index already exists"))console.error(`Failed to create index ${G.index}:`,J.message)}}};function q(z){if(z===null||typeof z!=="object")return JSON.stringify(z);if(Array.isArray(z))return JSON.stringify(z.map((Z)=>q(Z)));let G={},J=Object.keys(z).sort();for(let Z of J)G[Z]=z[Z];return JSON.stringify(G,(Z,Q)=>{if(Q!==null&&typeof Q==="object"&&!Array.isArray(Q)){let Y={},E=Object.keys(Q).sort();for(let F of E)Y[F]=Q[F];return Y}return Q})}export{f as RedisSaver};
@@ -0,0 +1,23 @@
1
+ import"./chunk-cze71w02.js";import{Kysely as H,PostgresDialect as I,sql as w}from"kysely";class J{constructor(h){this.pool=h,this.db=new H({dialect:new I({pool:h})})}db;dateToDb(h){return h}dbToDate(h){return h instanceof Date?h:new Date(h)}jsonToDb(h){return h}dbToJson(h){return h}buildJsonQuery(h,x,z,C){return w`${w.ref(x)}->>${w.lit(z)} = ${w.lit(JSON.stringify(C))}`}now(){return new Date}async createTables(h){await w`
2
+ CREATE TABLE IF NOT EXISTS threads (
3
+ thread_id TEXT PRIMARY KEY,
4
+ created_at TIMESTAMP NOT NULL,
5
+ updated_at TIMESTAMP NOT NULL,
6
+ metadata JSONB NOT NULL DEFAULT '{}',
7
+ status TEXT NOT NULL DEFAULT 'idle',
8
+ values JSONB,
9
+ interrupts JSONB NOT NULL DEFAULT '{}'
10
+ )
11
+ `.execute(h),await w`
12
+ CREATE TABLE IF NOT EXISTS runs (
13
+ run_id TEXT PRIMARY KEY,
14
+ thread_id TEXT NOT NULL,
15
+ assistant_id TEXT NOT NULL,
16
+ created_at TIMESTAMP NOT NULL,
17
+ updated_at TIMESTAMP NOT NULL,
18
+ status TEXT NOT NULL DEFAULT 'pending',
19
+ metadata JSONB NOT NULL DEFAULT '{}',
20
+ multitask_strategy TEXT NOT NULL DEFAULT 'reject',
21
+ FOREIGN KEY (thread_id) REFERENCES threads(thread_id) ON DELETE CASCADE
22
+ )
23
+ `.execute(h)}async createIndexes(h){await w`CREATE INDEX IF NOT EXISTS idx_threads_status ON threads(status)`.execute(h),await w`CREATE INDEX IF NOT EXISTS idx_threads_created_at ON threads(created_at)`.execute(h),await w`CREATE INDEX IF NOT EXISTS idx_threads_updated_at ON threads(updated_at)`.execute(h),await w`CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`.execute(h),await w`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`.execute(h)}}export{J as PostgresAdapter};
@@ -0,0 +1 @@
1
+ import{M}from"./chunk-keqk70wm.js";import"./chunk-9kc9cea3.js";import{ca as T,ea as G,ha as Z,la as Y,na as _,pa as $}from"./chunk-wwn7gw8g.js";import{sa as L}from"./chunk-3ep2tag7.js";import{Fa as w}from"./chunk-vkng13p1.js";import"./chunk-sft6ep0c.js";import"./chunk-dh3jz71n.js";import"./chunk-yaa4eesd.js";import"./chunk-jkbtx9va.js";import"./chunk-kbs4px1b.js";import"./chunk-9k57afdm.js";import{nb as K}from"./chunk-cze71w02.js";var z=K(T(),1);var y=K(Y(),1),h=({onClose:H})=>{let{config:U,updateConfig:N}=M(),B=U?.switch_command||"default",O=z.useCallback(async()=>{let q=await L(w);return Object.values(q)},[]),Q=z.useCallback((q,F,J)=>{let P=q.id===B;return y.jsxDEV(_,{isSelected:J,isCurrent:P,children:[y.jsxDEV(G,{bold:!0,children:[F+1,". ",q.id]},void 0,!0,void 0,this),y.jsxDEV(Z,{},void 0,!1,void 0,this),y.jsxDEV(G,{dimColor:!0,children:q.description},void 0,!1,void 0,this)]},`agent-${q.id}`,!0,void 0,this)},[B]),R=z.useCallback((q)=>{return q.id===B},[B]),W=z.useCallback(async(q)=>{let F=q.id==="default"?"":q.id;N({switch_command:F}),H()},[N,H]),X=z.useCallback((q)=>{let F=q.find((J)=>J.id===B);return F?y.jsxDEV(G,{color:"gray",dimColor:!0,children:["当前 Agent: ",y.jsxDEV(G,{color:"green",children:F.name},void 0,!1,void 0,this)]},void 0,!0,void 0,this):null},[B]),v=z.useMemo(()=>({id:"agent",title:"Agent 选择",icon:"\uD83E\uDD16",dataSource:O,searchable:!0,searchFields:["id","name","description"],searchPlaceholder:"搜索 agent (名称/描述)...",filterable:!0,filters:[{id:"default",label:"默认",predicate:(q)=>q.id==="default"},{id:"custom",label:"自定义",predicate:(q)=>q.id!=="default"}],defaultFilter:"all",itemHeight:3,visibleCount:15,renderItem:Q,isSelected:R,onSelect:W,showCount:!0,statusInfo:X}),[O,Q,R,W,X]);return y.jsxDEV($,{config:v,onClose:H},void 0,!1,void 0,this)},m=h;export{m as default};
@@ -0,0 +1,91 @@
1
+ import{V as z,W as P,X as K,Y as O}from"./chunk-bgpcx3bm.js";import{rb as b}from"./chunk-cze71w02.js";import{Kysely as L,sql as D}from"kysely";var G={maxRetries:3,baseDelayMs:100,nonRetryablePatterns:["database disk image is malformed","database is malformed","cannot rollback","no transaction is active","database or disk is full"],isRetryableError:(H)=>{let J=H?.message?.toLowerCase()||"";for(let V of G.nonRetryablePatterns)if(J.includes(V.toLowerCase()))return!1;return J.includes("sqlite_busy")||J.includes("database is locked")||J==="sqlite_busy"||J==="database is locked"}};async function F(H,J){let V=null;for(let Z=0;Z<G.maxRetries;Z++)try{return await H()}catch($){V=$;let X=$?.message?.toLowerCase()||"";if(!G.isRetryableError($)){if(X.includes("malformed")){let j=Error(`SQLite database is corrupted: ${$.message}
2
+
3
+ Context: ${J||"unknown"}
4
+
5
+ Possible causes:
6
+ 1. Database file was manually deleted or modified
7
+ 2. Disk I/O errors during write operations
8
+ 3. Concurrent access without proper locking
9
+
10
+ Recovery options:
11
+ - Delete the database file to start fresh (data will be lost)
12
+ - Use SQLite recovery tools: sqlite3 <db> ".recover" > recover.sql
13
+ - Switch to PostgreSQL/Redis for production use`);throw j.name="SQLiteCorruptError",j.cause=$,j}throw $}if(Z<G.maxRetries-1){let j=G.baseDelayMs*Math.pow(2,Z);console.warn(`SQLite lock detected${J?` (${J})`:""}, retrying in ${j}ms (attempt ${Z+1}/${G.maxRetries})`),await new Promise((U)=>setTimeout(U,j))}}throw V}var R=["source","step","parents"];function x(H){return H}var E=x(R);class N extends K{db;isSetup;constructor(H,J){super(J);this.db=new L({dialect:H}),this.isSetup=!1}static async fromConnStringAsync(H){let J;if(globalThis.Bun){console.log("LG | Using BunWorkerDialect "+H);let{BunSqliteDialect:V}=await import("kysely-bun-worker/normal");J=new N(new V({url:H}))}else{console.log("LG | Using NodeWasmDialect");let{default:V}=await import("node-sqlite3-wasm"),{NodeWasmDialect:Z}=await import("kysely-wasm");console.log(H);let $=new Z({database:new V.Database(H)});J=new N($)}return await J.setup(),J}async setup(){if(this.isSetup)return;await D`PRAGMA busy_timeout = 5000`.execute(this.db),await D`PRAGMA journal_mode = WAL`.execute(this.db),await D`PRAGMA synchronous = NORMAL`.execute(this.db),await D`PRAGMA wal_autocheckpoint = 1000`.execute(this.db),await D`
14
+ CREATE TABLE IF NOT EXISTS checkpoints (
15
+ thread_id TEXT NOT NULL,
16
+ checkpoint_ns TEXT NOT NULL DEFAULT '',
17
+ checkpoint_id TEXT NOT NULL,
18
+ parent_checkpoint_id TEXT,
19
+ type TEXT,
20
+ checkpoint BLOB,
21
+ metadata BLOB,
22
+ PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id)
23
+ )`.execute(this.db),await D`
24
+ CREATE TABLE IF NOT EXISTS writes (
25
+ thread_id TEXT NOT NULL,
26
+ checkpoint_ns TEXT NOT NULL DEFAULT '',
27
+ checkpoint_id TEXT NOT NULL,
28
+ task_id TEXT NOT NULL,
29
+ idx INTEGER NOT NULL,
30
+ channel TEXT NOT NULL,
31
+ type TEXT,
32
+ value BLOB,
33
+ PRIMARY KEY (thread_id, checkpoint_ns, checkpoint_id, task_id, idx)
34
+ )`.execute(this.db),this.isSetup=!0}async getTuple(H){await this.setup();let{thread_id:J,checkpoint_ns:V="",checkpoint_id:Z}=H.configurable??{},$=this.db.selectFrom("checkpoints").select(["thread_id","checkpoint_ns","checkpoint_id","parent_checkpoint_id","type","checkpoint","metadata",D`(
35
+ SELECT json_group_array(
36
+ json_object(
37
+ 'task_id', pw.task_id,
38
+ 'channel', pw.channel,
39
+ 'type', pw.type,
40
+ 'value', CAST(pw.value AS TEXT)
41
+ )
42
+ )
43
+ FROM writes as pw
44
+ WHERE pw.thread_id = checkpoints.thread_id
45
+ AND pw.checkpoint_ns = checkpoints.checkpoint_ns
46
+ AND pw.checkpoint_id = checkpoints.checkpoint_id
47
+ )`.as("pending_writes"),D`(
48
+ SELECT json_group_array(
49
+ json_object(
50
+ 'type', ps.type,
51
+ 'value', CAST(ps.value AS TEXT)
52
+ )
53
+ )
54
+ FROM writes as ps
55
+ WHERE ps.thread_id = checkpoints.thread_id
56
+ AND ps.checkpoint_ns = checkpoints.checkpoint_ns
57
+ AND ps.checkpoint_id = checkpoints.parent_checkpoint_id
58
+ AND ps.channel = ${z}
59
+ ORDER BY ps.idx
60
+ )`.as("pending_sends")]).where("thread_id","=",J).where("checkpoint_ns","=",V);if(Z)$=$.where("checkpoint_id","=",Z);else $=$.orderBy("checkpoint_id","desc").limit(1);let X=await $.executeTakeFirst();if(!X)return;let j=H;if(!Z)j={configurable:{thread_id:X.thread_id,checkpoint_ns:V,checkpoint_id:X.checkpoint_id}};if(j.configurable?.thread_id===void 0||j.configurable?.checkpoint_id===void 0)throw Error("Missing thread_id or checkpoint_id");let U=await Promise.all(JSON.parse(X.pending_writes).map(async(A)=>{return[A.task_id,A.channel,await this.serde.loadsTyped(A.type??"json",A.value??"")]})),W=await this.serde.loadsTyped(X.type??"json",new TextDecoder().decode(X.checkpoint));if(W.v<4&&X.parent_checkpoint_id!=null)await this.migratePendingSends(W,X.thread_id,X.parent_checkpoint_id);return{checkpoint:W,config:j,metadata:await this.serde.loadsTyped(X.type??"json",new TextDecoder().decode(X.metadata)),parentConfig:X.parent_checkpoint_id?{configurable:{thread_id:X.thread_id,checkpoint_ns:V,checkpoint_id:X.parent_checkpoint_id}}:void 0,pendingWrites:U}}async*list(H,J){let{limit:V,before:Z,filter:$}=J??{};await this.setup();let X=H.configurable?.thread_id,j=H.configurable?.checkpoint_ns,U=this.db.selectFrom("checkpoints").select(["thread_id","checkpoint_ns","checkpoint_id","parent_checkpoint_id","type","checkpoint","metadata",D`(
61
+ SELECT json_group_array(
62
+ json_object(
63
+ 'task_id', pw.task_id,
64
+ 'channel', pw.channel,
65
+ 'type', pw.type,
66
+ 'value', CAST(pw.value AS TEXT)
67
+ )
68
+ )
69
+ FROM writes as pw
70
+ WHERE pw.thread_id = checkpoints.thread_id
71
+ AND pw.checkpoint_ns = checkpoints.checkpoint_ns
72
+ AND pw.checkpoint_id = checkpoints.checkpoint_id
73
+ )`.as("pending_writes"),D`(
74
+ SELECT json_group_array(
75
+ json_object(
76
+ 'type', ps.type,
77
+ 'value', CAST(ps.value AS TEXT)
78
+ )
79
+ )
80
+ FROM writes as ps
81
+ WHERE ps.thread_id = checkpoints.thread_id
82
+ AND ps.checkpoint_ns = checkpoints.checkpoint_ns
83
+ AND ps.checkpoint_id = checkpoints.parent_checkpoint_id
84
+ AND ps.channel = ${z}
85
+ ORDER BY ps.idx
86
+ )`.as("pending_sends")]);if(X)U=U.where("thread_id","=",X);if(j!==void 0&&j!==null)U=U.where("checkpoint_ns","=",j);if(Z?.configurable?.checkpoint_id!==void 0)U=U.where("checkpoint_id","<",Z.configurable.checkpoint_id);let W=Object.fromEntries(Object.entries($??{}).filter(([B,M])=>M!==void 0&&E.includes(B)));for(let[B,M]of Object.entries(W))U=U.where(D`json_extract(CAST(metadata AS TEXT), ${D.lit("$."+B)})`,"=",D.lit(JSON.stringify(M)));if(U=U.orderBy("checkpoint_id","desc"),V)U=U.limit(parseInt(V,10));let A=await U.execute();for(let B of A){let M=await Promise.all(JSON.parse(B.pending_writes).map(async(Q)=>{return[Q.task_id,Q.channel,await this.serde.loadsTyped(Q.type??"json",Q.value??"")]})),Y=await this.serde.loadsTyped(B.type??"json",new TextDecoder().decode(B.checkpoint));if(Y.v<4&&B.parent_checkpoint_id!=null)await this.migratePendingSends(Y,B.thread_id,B.parent_checkpoint_id);yield{config:{configurable:{thread_id:B.thread_id,checkpoint_ns:B.checkpoint_ns,checkpoint_id:B.checkpoint_id}},checkpoint:Y,metadata:await this.serde.loadsTyped(B.type??"json",new TextDecoder().decode(B.metadata)),parentConfig:B.parent_checkpoint_id?{configurable:{thread_id:B.thread_id,checkpoint_ns:B.checkpoint_ns,checkpoint_id:B.parent_checkpoint_id}}:void 0,pendingWrites:M}}}async put(H,J,V){if(await this.setup(),!H.configurable)throw Error("Empty configuration supplied.");let Z=H.configurable?.thread_id,$=H.configurable?.checkpoint_ns??"",X=H.configurable?.checkpoint_id;if(!Z)throw Error('Missing "thread_id" field in passed "config.configurable".');let j=P(J),[[U,W],[A,B]]=await Promise.all([this.serde.dumpsTyped(j),this.serde.dumpsTyped(V)]);if(U!==A)throw Error("Failed to serialized checkpoint and metadata to the same type.");return await F(async()=>{await this.db.insertInto("checkpoints").values({thread_id:Z,checkpoint_ns:$,checkpoint_id:J.id,parent_checkpoint_id:X??null,type:U,checkpoint:new Uint8Array(Buffer.from(W)),metadata:new Uint8Array(Buffer.from(B))}).onConflict((M)=>M.columns(["thread_id","checkpoint_ns","checkpoint_id"]).doUpdateSet({parent_checkpoint_id:X??null,type:U,checkpoint:new Uint8Array(Buffer.from(W)),metadata:new Uint8Array(Buffer.from(B))})).execute()},`put(${Z}/${J.id})`),{configurable:{thread_id:Z,checkpoint_ns:$,checkpoint_id:J.id}}}async putWrites(H,J,V){if(await this.setup(),!H.configurable)throw Error("Empty configuration supplied.");if(!H.configurable?.thread_id)throw Error("Missing thread_id field in config.configurable.");if(!H.configurable?.checkpoint_id)throw Error("Missing checkpoint_id field in config.configurable.");let Z=await Promise.all(J.map(async(j,U)=>{let[W,A]=await this.serde.dumpsTyped(j[1]);return{thread_id:H.configurable.thread_id,checkpoint_ns:H.configurable.checkpoint_ns??"",checkpoint_id:H.configurable.checkpoint_id,task_id:V,idx:U,channel:j[0],type:W,value:new Uint8Array(Buffer.from(A))}}));if(Z.length===0)return;let $=H.configurable.thread_id,X=H.configurable.checkpoint_id;await F(async()=>{await this.db.transaction().execute(async(j)=>{await j.deleteFrom("writes").where("thread_id","=",$).where("checkpoint_ns","=",Z[0].checkpoint_ns).where("checkpoint_id","=",X).where("task_id","=",V).execute();for(let U of Z)await j.insertInto("writes").values(U).execute()})},`putWrites(${$}/${X}/${V})`)}async deleteThread(H){await F(async()=>{await this.db.transaction().execute(async(J)=>{await J.deleteFrom("checkpoints").where("thread_id","=",H).execute(),await J.deleteFrom("writes").where("thread_id","=",H).execute()})},`deleteThread(${H})`)}async migratePendingSends(H,J,V){let Z=await this.db.selectFrom("writes as ps").select(["ps.checkpoint_id",D`json_group_array(
87
+ json_object(
88
+ 'type', ps.type,
89
+ 'value', CAST(ps.value AS TEXT)
90
+ )
91
+ )`.as("pending_sends")]).where("ps.thread_id","=",J).where("ps.checkpoint_id","=",V).where("ps.channel","=",z).orderBy("ps.idx").executeTakeFirst();if(!Z)return;let $=H;$.channel_values??={},$.channel_values[z]=await Promise.all(JSON.parse(Z.pending_sends).map(({type:X,value:j})=>this.serde.loadsTyped(X,j))),$.channel_versions[z]=Object.keys(H.channel_versions).length>0?O(...Object.values(H.channel_versions)):this.getNextVersion(void 0)}}export{N as SqliteSaver};
@@ -0,0 +1,2 @@
1
+ import{nb as X,ob as U}from"./chunk-cze71w02.js";var S=U((Z,Q)=>{var V=Object.prototype.hasOwnProperty,H="~";function O(){}if(Object.create){if(O.prototype=Object.create(null),!new O().__proto__)H=!1}function W(B,q,y){this.fn=B,this.context=q,this.once=y||!1}function R(B,q,y,z,I){if(typeof y!=="function")throw TypeError("The listener must be a function");var F=new W(y,z||B,I),C=H?H+q:q;if(!B._events[C])B._events[C]=F,B._eventsCount++;else if(!B._events[C].fn)B._events[C].push(F);else B._events[C]=[B._events[C],F];return B}function P(B,q){if(--B._eventsCount===0)B._events=new O;else delete B._events[q]}function G(){this._events=new O,this._eventsCount=0}G.prototype.eventNames=function(){var q=[],y,z;if(this._eventsCount===0)return q;for(z in y=this._events)if(V.call(y,z))q.push(H?z.slice(1):z);if(Object.getOwnPropertySymbols)return q.concat(Object.getOwnPropertySymbols(y));return q};G.prototype.listeners=function(q){var y=H?H+q:q,z=this._events[y];if(!z)return[];if(z.fn)return[z.fn];for(var I=0,F=z.length,C=Array(F);I<F;I++)C[I]=z[I].fn;return C};G.prototype.listenerCount=function(q){var y=H?H+q:q,z=this._events[y];if(!z)return 0;if(z.fn)return 1;return z.length};G.prototype.emit=function(q,y,z,I,F,C){var J=H?H+q:q;if(!this._events[J])return!1;var k=this._events[J],K=arguments.length,M,D;if(k.fn){if(k.once)this.removeListener(q,k.fn,void 0,!0);switch(K){case 1:return k.fn.call(k.context),!0;case 2:return k.fn.call(k.context,y),!0;case 3:return k.fn.call(k.context,y,z),!0;case 4:return k.fn.call(k.context,y,z,I),!0;case 5:return k.fn.call(k.context,y,z,I,F),!0;case 6:return k.fn.call(k.context,y,z,I,F,C),!0}for(D=1,M=Array(K-1);D<K;D++)M[D-1]=arguments[D];k.fn.apply(k.context,M)}else{var T=k.length,N;for(D=0;D<T;D++){if(k[D].once)this.removeListener(q,k[D].fn,void 0,!0);switch(K){case 1:k[D].fn.call(k[D].context);break;case 2:k[D].fn.call(k[D].context,y);break;case 3:k[D].fn.call(k[D].context,y,z);break;case 4:k[D].fn.call(k[D].context,y,z,I);break;default:if(!M)for(N=1,M=Array(K-1);N<K;N++)M[N-1]=arguments[N];k[D].fn.apply(k[D].context,M)}}}return!0};G.prototype.on=function(q,y,z){return R(this,q,y,z,!1)};G.prototype.once=function(q,y,z){return R(this,q,y,z,!0)};G.prototype.removeListener=function(q,y,z,I){var F=H?H+q:q;if(!this._events[F])return this;if(!y)return P(this,F),this;var C=this._events[F];if(C.fn){if(C.fn===y&&(!I||C.once)&&(!z||C.context===z))P(this,F)}else{for(var J=0,k=[],K=C.length;J<K;J++)if(C[J].fn!==y||I&&!C[J].once||z&&C[J].context!==z)k.push(C[J]);if(k.length)this._events[F]=k.length===1?k[0]:k;else P(this,F)}return this};G.prototype.removeAllListeners=function(q){var y;if(q){if(y=H?H+q:q,this._events[y])P(this,y)}else this._events=new O,this._eventsCount=0;return this};G.prototype.off=G.prototype.removeListener;G.prototype.addListener=G.prototype.on;G.prefixed=H;G.EventEmitter=G;if(typeof Q<"u")Q.exports=G});var Y=X(S(),1);
2
+ export{Y as s};