neoctl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +146 -0
  2. package/dist/agents/agent-definition.d.ts +39 -0
  3. package/dist/agents/agent-definition.js +57 -0
  4. package/dist/agents/agent-definition.js.map +1 -0
  5. package/dist/agents/agent-tool.d.ts +38 -0
  6. package/dist/agents/agent-tool.js +336 -0
  7. package/dist/agents/agent-tool.js.map +1 -0
  8. package/dist/agents/local-agent-task.d.ts +52 -0
  9. package/dist/agents/local-agent-task.js +63 -0
  10. package/dist/agents/local-agent-task.js.map +1 -0
  11. package/dist/agents/smoke-agents.d.ts +1 -0
  12. package/dist/agents/smoke-agents.js +142 -0
  13. package/dist/agents/smoke-agents.js.map +1 -0
  14. package/dist/agents/team.d.ts +10 -0
  15. package/dist/agents/team.js +2 -0
  16. package/dist/agents/team.js.map +1 -0
  17. package/dist/app/app-state.d.ts +21 -0
  18. package/dist/app/app-state.js +24 -0
  19. package/dist/app/app-state.js.map +1 -0
  20. package/dist/context/compaction.d.ts +49 -0
  21. package/dist/context/compaction.js +334 -0
  22. package/dist/context/compaction.js.map +1 -0
  23. package/dist/context/context-manager.d.ts +53 -0
  24. package/dist/context/context-manager.js +98 -0
  25. package/dist/context/context-manager.js.map +1 -0
  26. package/dist/context/prompts.d.ts +22 -0
  27. package/dist/context/prompts.js +84 -0
  28. package/dist/context/prompts.js.map +1 -0
  29. package/dist/context/smoke-context.d.ts +1 -0
  30. package/dist/context/smoke-context.js +151 -0
  31. package/dist/context/smoke-context.js.map +1 -0
  32. package/dist/core/assistant-output-filter.d.ts +9 -0
  33. package/dist/core/assistant-output-filter.js +78 -0
  34. package/dist/core/assistant-output-filter.js.map +1 -0
  35. package/dist/core/context-metrics.d.ts +10 -0
  36. package/dist/core/context-metrics.js +77 -0
  37. package/dist/core/context-metrics.js.map +1 -0
  38. package/dist/core/message-pipeline.d.ts +10 -0
  39. package/dist/core/message-pipeline.js +138 -0
  40. package/dist/core/message-pipeline.js.map +1 -0
  41. package/dist/core/query-engine.d.ts +86 -0
  42. package/dist/core/query-engine.js +337 -0
  43. package/dist/core/query-engine.js.map +1 -0
  44. package/dist/core/query.d.ts +47 -0
  45. package/dist/core/query.js +408 -0
  46. package/dist/core/query.js.map +1 -0
  47. package/dist/core/run-agent.d.ts +48 -0
  48. package/dist/core/run-agent.js +150 -0
  49. package/dist/core/run-agent.js.map +1 -0
  50. package/dist/core/smoke-core-loop.d.ts +1 -0
  51. package/dist/core/smoke-core-loop.js +42 -0
  52. package/dist/core/smoke-core-loop.js.map +1 -0
  53. package/dist/core/state.d.ts +37 -0
  54. package/dist/core/state.js +31 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/model/communication-logger.d.ts +30 -0
  60. package/dist/model/communication-logger.js +218 -0
  61. package/dist/model/communication-logger.js.map +1 -0
  62. package/dist/model/config.d.ts +25 -0
  63. package/dist/model/config.js +65 -0
  64. package/dist/model/config.js.map +1 -0
  65. package/dist/model/context-window.d.ts +32 -0
  66. package/dist/model/context-window.js +76 -0
  67. package/dist/model/context-window.js.map +1 -0
  68. package/dist/model/credentials.d.ts +13 -0
  69. package/dist/model/credentials.js +19 -0
  70. package/dist/model/credentials.js.map +1 -0
  71. package/dist/model/env.d.ts +8 -0
  72. package/dist/model/env.js +36 -0
  73. package/dist/model/env.js.map +1 -0
  74. package/dist/model/errors.d.ts +42 -0
  75. package/dist/model/errors.js +74 -0
  76. package/dist/model/errors.js.map +1 -0
  77. package/dist/model/http-transport.d.ts +26 -0
  78. package/dist/model/http-transport.js +118 -0
  79. package/dist/model/http-transport.js.map +1 -0
  80. package/dist/model/model-gateway.d.ts +103 -0
  81. package/dist/model/model-gateway.js +15 -0
  82. package/dist/model/model-gateway.js.map +1 -0
  83. package/dist/model/model-metadata.json +677 -0
  84. package/dist/model/openai-adapter.d.ts +34 -0
  85. package/dist/model/openai-adapter.js +152 -0
  86. package/dist/model/openai-adapter.js.map +1 -0
  87. package/dist/model/openai-chat-mapper.d.ts +11 -0
  88. package/dist/model/openai-chat-mapper.js +114 -0
  89. package/dist/model/openai-chat-mapper.js.map +1 -0
  90. package/dist/model/openai-mappers.d.ts +21 -0
  91. package/dist/model/openai-mappers.js +261 -0
  92. package/dist/model/openai-mappers.js.map +1 -0
  93. package/dist/model/openai-responses-adapter.d.ts +2 -0
  94. package/dist/model/openai-responses-adapter.js +2 -0
  95. package/dist/model/openai-responses-adapter.js.map +1 -0
  96. package/dist/model/openai-responses-mapper.d.ts +11 -0
  97. package/dist/model/openai-responses-mapper.js +218 -0
  98. package/dist/model/openai-responses-mapper.js.map +1 -0
  99. package/dist/model/provider-adapter.d.ts +17 -0
  100. package/dist/model/provider-adapter.js +2 -0
  101. package/dist/model/provider-adapter.js.map +1 -0
  102. package/dist/model/provider-factory.d.ts +4 -0
  103. package/dist/model/provider-factory.js +29 -0
  104. package/dist/model/provider-factory.js.map +1 -0
  105. package/dist/model/retry-runner.d.ts +8 -0
  106. package/dist/model/retry-runner.js +28 -0
  107. package/dist/model/retry-runner.js.map +1 -0
  108. package/dist/model/smoke-openai.d.ts +1 -0
  109. package/dist/model/smoke-openai.js +44 -0
  110. package/dist/model/smoke-openai.js.map +1 -0
  111. package/dist/model/smoke-responses-mapper.d.ts +1 -0
  112. package/dist/model/smoke-responses-mapper.js +72 -0
  113. package/dist/model/smoke-responses-mapper.js.map +1 -0
  114. package/dist/model/sse-decoder.d.ts +5 -0
  115. package/dist/model/sse-decoder.js +79 -0
  116. package/dist/model/sse-decoder.js.map +1 -0
  117. package/dist/repl/clipboard.d.ts +14 -0
  118. package/dist/repl/clipboard.js +92 -0
  119. package/dist/repl/clipboard.js.map +1 -0
  120. package/dist/repl/commands.d.ts +38 -0
  121. package/dist/repl/commands.js +86 -0
  122. package/dist/repl/commands.js.map +1 -0
  123. package/dist/repl/index.d.ts +2 -0
  124. package/dist/repl/index.js +2836 -0
  125. package/dist/repl/index.js.map +1 -0
  126. package/dist/repl/markdown-renderer.d.ts +81 -0
  127. package/dist/repl/markdown-renderer.js +546 -0
  128. package/dist/repl/markdown-renderer.js.map +1 -0
  129. package/dist/repl/render.d.ts +2 -0
  130. package/dist/repl/render.js +45 -0
  131. package/dist/repl/render.js.map +1 -0
  132. package/dist/repl/status-line.d.ts +19 -0
  133. package/dist/repl/status-line.js +160 -0
  134. package/dist/repl/status-line.js.map +1 -0
  135. package/dist/safety/audit.d.ts +10 -0
  136. package/dist/safety/audit.js +2 -0
  137. package/dist/safety/audit.js.map +1 -0
  138. package/dist/safety/permissions.d.ts +10 -0
  139. package/dist/safety/permissions.js +2 -0
  140. package/dist/safety/permissions.js.map +1 -0
  141. package/dist/safety/sandbox.d.ts +6 -0
  142. package/dist/safety/sandbox.js +2 -0
  143. package/dist/safety/sandbox.js.map +1 -0
  144. package/dist/session/session-store.d.ts +98 -0
  145. package/dist/session/session-store.js +249 -0
  146. package/dist/session/session-store.js.map +1 -0
  147. package/dist/session/smoke-session.d.ts +1 -0
  148. package/dist/session/smoke-session.js +85 -0
  149. package/dist/session/smoke-session.js.map +1 -0
  150. package/dist/session/tool-result-memory.d.ts +64 -0
  151. package/dist/session/tool-result-memory.js +303 -0
  152. package/dist/session/tool-result-memory.js.map +1 -0
  153. package/dist/skills/skill-tool.d.ts +28 -0
  154. package/dist/skills/skill-tool.js +107 -0
  155. package/dist/skills/skill-tool.js.map +1 -0
  156. package/dist/skills/smoke-skills.d.ts +1 -0
  157. package/dist/skills/smoke-skills.js +60 -0
  158. package/dist/skills/smoke-skills.js.map +1 -0
  159. package/dist/tasks/task-store.d.ts +43 -0
  160. package/dist/tasks/task-store.js +150 -0
  161. package/dist/tasks/task-store.js.map +1 -0
  162. package/dist/tasks/task-tools.d.ts +31 -0
  163. package/dist/tasks/task-tools.js +232 -0
  164. package/dist/tasks/task-tools.js.map +1 -0
  165. package/dist/tools/builtins/echo-tool.d.ts +4 -0
  166. package/dist/tools/builtins/echo-tool.js +26 -0
  167. package/dist/tools/builtins/echo-tool.js.map +1 -0
  168. package/dist/tools/builtins/edit-tool.d.ts +30 -0
  169. package/dist/tools/builtins/edit-tool.js +423 -0
  170. package/dist/tools/builtins/edit-tool.js.map +1 -0
  171. package/dist/tools/builtins/exec-tool.d.ts +18 -0
  172. package/dist/tools/builtins/exec-tool.js +290 -0
  173. package/dist/tools/builtins/exec-tool.js.map +1 -0
  174. package/dist/tools/builtins/filesystem-tools.d.ts +16 -0
  175. package/dist/tools/builtins/filesystem-tools.js +306 -0
  176. package/dist/tools/builtins/filesystem-tools.js.map +1 -0
  177. package/dist/tools/builtins/grep-tool.d.ts +56 -0
  178. package/dist/tools/builtins/grep-tool.js +320 -0
  179. package/dist/tools/builtins/grep-tool.js.map +1 -0
  180. package/dist/tools/builtins/ripgrep-binary.d.ts +6 -0
  181. package/dist/tools/builtins/ripgrep-binary.js +51 -0
  182. package/dist/tools/builtins/ripgrep-binary.js.map +1 -0
  183. package/dist/tools/builtins/search-providers.d.ts +49 -0
  184. package/dist/tools/builtins/search-providers.js +240 -0
  185. package/dist/tools/builtins/search-providers.js.map +1 -0
  186. package/dist/tools/builtins/search-tool.d.ts +18 -0
  187. package/dist/tools/builtins/search-tool.js +171 -0
  188. package/dist/tools/builtins/search-tool.js.map +1 -0
  189. package/dist/tools/registry.d.ts +18 -0
  190. package/dist/tools/registry.js +69 -0
  191. package/dist/tools/registry.js.map +1 -0
  192. package/dist/tools/run-tool-use.d.ts +13 -0
  193. package/dist/tools/run-tool-use.js +113 -0
  194. package/dist/tools/run-tool-use.js.map +1 -0
  195. package/dist/tools/schema.d.ts +2 -0
  196. package/dist/tools/schema.js +61 -0
  197. package/dist/tools/schema.js.map +1 -0
  198. package/dist/tools/smoke-tool-system.d.ts +1 -0
  199. package/dist/tools/smoke-tool-system.js +204 -0
  200. package/dist/tools/smoke-tool-system.js.map +1 -0
  201. package/dist/tools/streaming-tool-executor.d.ts +19 -0
  202. package/dist/tools/streaming-tool-executor.js +89 -0
  203. package/dist/tools/streaming-tool-executor.js.map +1 -0
  204. package/dist/tools/tool-orchestration.d.ts +15 -0
  205. package/dist/tools/tool-orchestration.js +89 -0
  206. package/dist/tools/tool-orchestration.js.map +1 -0
  207. package/dist/tools/tool.d.ts +121 -0
  208. package/dist/tools/tool.js +4 -0
  209. package/dist/tools/tool.js.map +1 -0
  210. package/dist/types/events.d.ts +66 -0
  211. package/dist/types/events.js +2 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/messages.d.ts +57 -0
  214. package/dist/types/messages.js +42 -0
  215. package/dist/types/messages.js.map +1 -0
  216. package/package.json +49 -0
  217. package/scripts/copy-model-metadata.mjs +4 -0
  218. package/scripts/install-ripgrep.cjs +152 -0
@@ -0,0 +1,160 @@
1
+ import readline from "node:readline";
2
+ export class ReplStatusLine {
3
+ output;
4
+ phase = "ready";
5
+ lastDetail = "";
6
+ metrics;
7
+ lastUsage;
8
+ outputTokensStreamed = 0;
9
+ visible = false;
10
+ pulseFrame = 0;
11
+ constructor(output) {
12
+ this.output = output;
13
+ }
14
+ handle(event) {
15
+ if (event.type === "state") {
16
+ this.phase = event.phase;
17
+ this.lastDetail = event.detail ?? "";
18
+ if (event.phase === "preparing") {
19
+ this.lastUsage = undefined;
20
+ this.outputTokensStreamed = 0;
21
+ }
22
+ }
23
+ if (event.type === "context.metrics") {
24
+ this.metrics = event.metrics;
25
+ }
26
+ if (event.type === "assistant.delta") {
27
+ this.outputTokensStreamed += estimateDeltaTokens(event.text);
28
+ }
29
+ if (event.type === "usage") {
30
+ this.lastUsage = event.usage;
31
+ }
32
+ if (event.type === "terminal") {
33
+ this.phase = "stopped";
34
+ this.lastDetail = event.reason;
35
+ }
36
+ }
37
+ clear() {
38
+ if (!this.visible || !this.output.isTTY)
39
+ return;
40
+ readline.clearLine(this.output, 0);
41
+ readline.cursorTo(this.output, 0);
42
+ this.visible = false;
43
+ }
44
+ render() {
45
+ if (!this.output.isTTY)
46
+ return;
47
+ const line = this.renderLine();
48
+ readline.clearLine(this.output, 0);
49
+ readline.cursorTo(this.output, 0);
50
+ this.output.write(line);
51
+ this.visible = true;
52
+ }
53
+ renderLine() {
54
+ const input = this.lastUsage?.inputTokens ?? this.metrics?.estimatedInputTokens;
55
+ const output = this.lastUsage?.outputTokens ?? this.outputTokensStreamed;
56
+ const context = renderContext(this.metrics);
57
+ const model = this.metrics?.model ?? "model?";
58
+ const source = this.metrics?.contextWindowSource ?? "unknown";
59
+ const detail = this.lastDetail ? ` - ${this.lastDetail}` : "";
60
+ const width = terminalWidth(this.output);
61
+ const label = animatedPhaseLabel(this.phase, this.pulseFrame);
62
+ if (isActivePhase(this.phase))
63
+ this.pulseFrame += 1;
64
+ const fixedPrefix = [
65
+ fixed(label, 12, "left"),
66
+ contextMeter(this.metrics, 10),
67
+ `model ${fixed(truncateMiddle(model, 20), 20, "left")}`,
68
+ `in ${fixed(formatCompact(input), 7, "left")}`,
69
+ `out ${fixed(formatCompact(output), 7, "left")}`,
70
+ `ctx ${fixed(context, 20, "left")}`,
71
+ `src ${fixed(source, 7, "left")}`,
72
+ ].join(" ");
73
+ return fitToWidth(`${fixedPrefix}${detail}`, width);
74
+ }
75
+ }
76
+ function renderContext(metrics) {
77
+ if (!metrics)
78
+ return "unknown";
79
+ const used = formatCompact(metrics.estimatedInputTokens);
80
+ if (!metrics.contextWindowTokens)
81
+ return `${used}/?`;
82
+ const window = formatCompact(metrics.contextWindowTokens);
83
+ const percent = metrics.contextUsageRatio === undefined ? "?" : `${(metrics.contextUsageRatio * 100).toFixed(1)}%`;
84
+ return `${used}/${window} ${percent}`;
85
+ }
86
+ function estimateDeltaTokens(text) {
87
+ if (!text)
88
+ return 0;
89
+ return Math.max(1, Math.ceil(text.length / 4));
90
+ }
91
+ function formatCompact(value) {
92
+ if (value === undefined)
93
+ return "?";
94
+ const rounded = Math.max(0, Math.round(value));
95
+ if (rounded >= 1_000_000)
96
+ return `${trimFixed(rounded / 1_000_000)}m`;
97
+ if (rounded >= 10_000)
98
+ return `${Math.round(rounded / 1000)}k`;
99
+ if (rounded >= 1000)
100
+ return `${trimFixed(rounded / 1000)}k`;
101
+ return String(rounded);
102
+ }
103
+ function trimFixed(value) {
104
+ return value >= 10 ? value.toFixed(0) : value.toFixed(1).replace(/\.0$/, "");
105
+ }
106
+ function terminalWidth(output) {
107
+ return Math.max(72, Math.min(output.columns ?? 100, 160)) - 1;
108
+ }
109
+ function animatedPhaseLabel(phase, tick) {
110
+ const label = phaseLabel(phase).toUpperCase();
111
+ if (!isActivePhase(phase))
112
+ return label;
113
+ return `${label}${STATUS_PULSE_FRAMES[tick % STATUS_PULSE_FRAMES.length]}`;
114
+ }
115
+ function phaseLabel(phase) {
116
+ if (phase === "calling_model")
117
+ return "model";
118
+ if (phase === "running_tools")
119
+ return "tools";
120
+ if (phase === "injecting_context")
121
+ return "context";
122
+ return phase;
123
+ }
124
+ function isActivePhase(phase) {
125
+ return phase === "running" ||
126
+ phase === "preparing" ||
127
+ phase === "calling_model" ||
128
+ phase === "running_tools" ||
129
+ phase === "compacting" ||
130
+ phase === "injecting_context";
131
+ }
132
+ function contextMeter(metrics, width) {
133
+ if (!metrics || metrics.contextUsageRatio === undefined)
134
+ return `[${"-".repeat(width)}]`;
135
+ const ratio = Math.max(0, Math.min(1, metrics.contextUsageRatio));
136
+ const filled = Math.min(width, Math.max(0, Math.round(ratio * width)));
137
+ return `[${"#".repeat(filled)}${"-".repeat(width - filled)}]`;
138
+ }
139
+ function fixed(value, width, align = "right") {
140
+ const clipped = value.length > width ? value.slice(0, width) : value;
141
+ return align === "left" ? clipped.padEnd(width, " ") : clipped.padStart(width, " ");
142
+ }
143
+ function fitToWidth(value, width) {
144
+ if (value.length === width)
145
+ return value;
146
+ if (value.length > width)
147
+ return value.slice(0, width);
148
+ return value.padEnd(width, " ");
149
+ }
150
+ function truncateMiddle(value, maxLength) {
151
+ if (value.length <= maxLength)
152
+ return value;
153
+ if (maxLength <= 3)
154
+ return value.slice(0, maxLength);
155
+ const left = Math.ceil((maxLength - 3) / 2);
156
+ const right = Math.floor((maxLength - 3) / 2);
157
+ return `${value.slice(0, left)}...${value.slice(value.length - right)}`;
158
+ }
159
+ const STATUS_PULSE_FRAMES = ["", ".", "..", "..."];
160
+ //# sourceMappingURL=status-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-line.js","sourceRoot":"","sources":["../../src/repl/status-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface AuditEvent {
2
+ id: string;
3
+ agentId: string;
4
+ type: string;
5
+ createdAt: string;
6
+ payload: Record<string, unknown>;
7
+ }
8
+ export interface AuditSink {
9
+ record(event: AuditEvent): Promise<void>;
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/safety/audit.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export type PermissionDecision = "allow" | "deny" | "ask";
2
+ export interface PermissionRequest {
3
+ agentId: string;
4
+ action: string;
5
+ resource?: string;
6
+ metadata?: Record<string, unknown>;
7
+ }
8
+ export interface PermissionPolicy {
9
+ decide(request: PermissionRequest): Promise<PermissionDecision>;
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/safety/permissions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface SandboxProfile {
2
+ name: string;
3
+ network: "enabled" | "disabled" | "restricted";
4
+ filesystem: "read-only" | "workspace-write" | "full";
5
+ commandAllowList?: string[];
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/safety/sandbox.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ import type { Message } from "../types/messages.js";
2
+ import { type ContentReplacementRecord, type ToolResultMemory } from "./tool-result-memory.js";
3
+ export type SessionTitleKind = "initial" | "refinement";
4
+ export type SessionTranscriptEntry = {
5
+ type: "message";
6
+ sessionId: string;
7
+ agentId: string;
8
+ message: Message;
9
+ } | {
10
+ type: "content-replacement";
11
+ sessionId: string;
12
+ agentId: string;
13
+ replacements: ContentReplacementRecord[];
14
+ } | {
15
+ type: "title";
16
+ sessionId: string;
17
+ agentId: string;
18
+ title: string;
19
+ createdAt: string;
20
+ kind?: SessionTitleKind;
21
+ } | {
22
+ type: "reset";
23
+ sessionId: string;
24
+ agentId: string;
25
+ createdAt: string;
26
+ };
27
+ export interface SessionStoreOptions {
28
+ cwd?: string;
29
+ agentId: string;
30
+ sessionId?: string;
31
+ rootDir?: string;
32
+ resume?: boolean;
33
+ toolResultThresholdChars?: number;
34
+ }
35
+ export interface SessionListOptions {
36
+ cwd?: string;
37
+ agentId?: string;
38
+ rootDir?: string;
39
+ limit?: number;
40
+ }
41
+ export interface SessionDeleteOptions {
42
+ cwd?: string;
43
+ sessionId: string;
44
+ rootDir?: string;
45
+ }
46
+ export interface SessionSummary {
47
+ sessionId: string;
48
+ sessionDir: string;
49
+ transcriptPath: string;
50
+ title?: string;
51
+ updatedAt?: string;
52
+ entryCount: number;
53
+ messages: number;
54
+ contentReplacements: number;
55
+ }
56
+ export interface SessionStoreSnapshot {
57
+ sessionId: string;
58
+ sessionDir: string;
59
+ transcriptPath: string;
60
+ title?: string;
61
+ titleKind?: SessionTitleKind;
62
+ hasInitialTitle: boolean;
63
+ hasTitleRefinement: boolean;
64
+ resumedMessages: number;
65
+ contentReplacements: number;
66
+ }
67
+ export interface SessionTitleState {
68
+ title?: string;
69
+ kind?: SessionTitleKind;
70
+ hasInitialTitle: boolean;
71
+ hasRefinement: boolean;
72
+ }
73
+ export declare class SessionStore {
74
+ readonly sessionId: string;
75
+ readonly sessionDir: string;
76
+ readonly transcriptPath: string;
77
+ readonly toolResultMemory: ToolResultMemory;
78
+ private readonly agentId;
79
+ private readonly resumedMessages;
80
+ private readonly contentReplacements;
81
+ private title?;
82
+ private titleKind?;
83
+ private hasInitialTitle;
84
+ private hasTitleRefinement;
85
+ private constructor();
86
+ static open(options: SessionStoreOptions): Promise<SessionStore>;
87
+ static list(options?: SessionListOptions): Promise<SessionSummary[]>;
88
+ static delete(options: SessionDeleteOptions): Promise<boolean>;
89
+ getInitialMessages(): Message[];
90
+ recordMessage(message: Message): void;
91
+ recordTitle(title: string, kind?: SessionTitleKind): void;
92
+ getTitle(): string | undefined;
93
+ getTitleState(): SessionTitleState;
94
+ recordContentReplacements(replacements: readonly ContentReplacementRecord[]): void;
95
+ reset(): void;
96
+ snapshot(): SessionStoreSnapshot;
97
+ private appendEntry;
98
+ }
@@ -0,0 +1,249 @@
1
+ import fs from "node:fs";
2
+ import fsp from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { FileToolResultMemory } from "./tool-result-memory.js";
6
+ export class SessionStore {
7
+ sessionId;
8
+ sessionDir;
9
+ transcriptPath;
10
+ toolResultMemory;
11
+ agentId;
12
+ resumedMessages;
13
+ contentReplacements;
14
+ title;
15
+ titleKind;
16
+ hasInitialTitle = false;
17
+ hasTitleRefinement = false;
18
+ constructor(options, sessionId, loaded) {
19
+ this.agentId = options.agentId;
20
+ this.sessionId = sessionId;
21
+ this.sessionDir = path.join(resolveSessionRoot(options), sessionId);
22
+ this.transcriptPath = path.join(this.sessionDir, "transcript.jsonl");
23
+ this.resumedMessages = loaded.messages;
24
+ this.contentReplacements = loaded.replacements;
25
+ this.title = loaded.title;
26
+ this.titleKind = loaded.titleKind;
27
+ this.hasInitialTitle = loaded.hasInitialTitle;
28
+ this.hasTitleRefinement = loaded.hasTitleRefinement;
29
+ this.toolResultMemory = new FileToolResultMemory({
30
+ sessionDir: this.sessionDir,
31
+ thresholdChars: options.toolResultThresholdChars,
32
+ }, loaded.replacements);
33
+ }
34
+ static async open(options) {
35
+ const requestedSessionId = normalizeRequestedSessionId(options.sessionId);
36
+ const sessionId = options.resume && (!requestedSessionId || requestedSessionId === "latest")
37
+ ? (await findLatestSessionId(options)) ?? createSessionId()
38
+ : requestedSessionId ?? createSessionId();
39
+ const sessionDir = path.join(resolveSessionRoot(options), sessionId);
40
+ const transcriptPath = path.join(sessionDir, "transcript.jsonl");
41
+ const loaded = options.resume ? await loadTranscript(transcriptPath, options.agentId) : createEmptyLoadedTranscript();
42
+ await fsp.mkdir(sessionDir, { recursive: true });
43
+ return new SessionStore(options, sessionId, loaded);
44
+ }
45
+ static async list(options = {}) {
46
+ const root = resolveSessionRoot(options);
47
+ const entries = await fsp.readdir(root, { withFileTypes: true }).catch(() => []);
48
+ const summaries = await Promise.all(entries
49
+ .filter((entry) => entry.isDirectory())
50
+ .map(async (entry) => {
51
+ const sessionId = entry.name;
52
+ const sessionDir = path.join(root, sessionId);
53
+ const transcriptPath = path.join(sessionDir, "transcript.jsonl");
54
+ const stat = await fsp.stat(transcriptPath).catch(() => undefined);
55
+ if (!stat)
56
+ return undefined;
57
+ const loaded = await loadTranscript(transcriptPath, options.agentId);
58
+ const summary = {
59
+ sessionId,
60
+ sessionDir,
61
+ transcriptPath,
62
+ updatedAt: stat.mtime.toISOString(),
63
+ updatedAtMs: stat.mtimeMs,
64
+ entryCount: loaded.entries,
65
+ messages: loaded.messages.length,
66
+ contentReplacements: loaded.replacements.length,
67
+ };
68
+ if (loaded.title)
69
+ summary.title = loaded.title;
70
+ return summary;
71
+ }));
72
+ return summaries
73
+ .filter(isSessionSummaryWithUpdatedAtMs)
74
+ .filter((summary) => !options.agentId || summary.entryCount > 0)
75
+ .sort((left, right) => right.updatedAtMs - left.updatedAtMs)
76
+ .slice(0, Math.max(0, options.limit ?? Number.POSITIVE_INFINITY))
77
+ .map(({ updatedAtMs: _updatedAtMs, ...summary }) => summary);
78
+ }
79
+ static async delete(options) {
80
+ const sessionId = normalizeRequestedSessionId(options.sessionId);
81
+ if (!sessionId || sessionId === "latest")
82
+ throw new Error("a concrete session id is required");
83
+ if (path.basename(sessionId) !== sessionId || sessionId.includes("/") || sessionId.includes("\\")) {
84
+ throw new Error(`invalid session id: ${options.sessionId}`);
85
+ }
86
+ const sessionDir = path.join(resolveSessionRoot(options), sessionId);
87
+ const stat = await fsp.stat(sessionDir).catch(() => undefined);
88
+ if (!stat)
89
+ return false;
90
+ if (!stat.isDirectory())
91
+ throw new Error(`session path is not a directory: ${sessionDir}`);
92
+ await fsp.rm(sessionDir, { recursive: true, force: true });
93
+ return true;
94
+ }
95
+ getInitialMessages() {
96
+ return this.resumedMessages.map(cloneMessage);
97
+ }
98
+ recordMessage(message) {
99
+ if (!shouldPersistMessage(message))
100
+ return;
101
+ this.appendEntry({ type: "message", sessionId: this.sessionId, agentId: this.agentId, message });
102
+ }
103
+ recordTitle(title, kind = "initial") {
104
+ const normalized = normalizeTitle(title);
105
+ if (!normalized || (normalized === this.title && kind === this.titleKind))
106
+ return;
107
+ this.title = normalized;
108
+ this.titleKind = kind;
109
+ if (kind === "initial")
110
+ this.hasInitialTitle = true;
111
+ if (kind === "refinement") {
112
+ this.hasInitialTitle = true;
113
+ this.hasTitleRefinement = true;
114
+ }
115
+ this.appendEntry({ type: "title", sessionId: this.sessionId, agentId: this.agentId, title: normalized, kind, createdAt: new Date().toISOString() });
116
+ }
117
+ getTitle() {
118
+ return this.title;
119
+ }
120
+ getTitleState() {
121
+ return {
122
+ title: this.title,
123
+ kind: this.titleKind,
124
+ hasInitialTitle: this.hasInitialTitle,
125
+ hasRefinement: this.hasTitleRefinement,
126
+ };
127
+ }
128
+ recordContentReplacements(replacements) {
129
+ if (replacements.length === 0)
130
+ return;
131
+ this.contentReplacements.push(...replacements);
132
+ this.appendEntry({
133
+ type: "content-replacement",
134
+ sessionId: this.sessionId,
135
+ agentId: this.agentId,
136
+ replacements: [...replacements],
137
+ });
138
+ }
139
+ reset() {
140
+ this.resumedMessages.length = 0;
141
+ this.contentReplacements.length = 0;
142
+ this.title = undefined;
143
+ this.titleKind = undefined;
144
+ this.hasInitialTitle = false;
145
+ this.hasTitleRefinement = false;
146
+ this.appendEntry({ type: "reset", sessionId: this.sessionId, agentId: this.agentId, createdAt: new Date().toISOString() });
147
+ }
148
+ snapshot() {
149
+ return {
150
+ sessionId: this.sessionId,
151
+ sessionDir: this.sessionDir,
152
+ transcriptPath: this.transcriptPath,
153
+ title: this.title,
154
+ titleKind: this.titleKind,
155
+ hasInitialTitle: this.hasInitialTitle,
156
+ hasTitleRefinement: this.hasTitleRefinement,
157
+ resumedMessages: this.resumedMessages.length,
158
+ contentReplacements: this.contentReplacements.length,
159
+ };
160
+ }
161
+ appendEntry(entry) {
162
+ fs.mkdirSync(this.sessionDir, { recursive: true });
163
+ fs.appendFileSync(this.transcriptPath, `${JSON.stringify(entry)}\n`, "utf8");
164
+ }
165
+ }
166
+ function isSessionSummaryWithUpdatedAtMs(summary) {
167
+ return summary !== undefined;
168
+ }
169
+ async function findLatestSessionId(options) {
170
+ const [latest] = await SessionStore.list({ cwd: options.cwd, rootDir: options.rootDir, agentId: options.agentId, limit: 1 });
171
+ return latest?.sessionId;
172
+ }
173
+ async function loadTranscript(transcriptPath, agentId) {
174
+ const text = await fsp.readFile(transcriptPath, "utf8").catch(() => "");
175
+ const loaded = createEmptyLoadedTranscript();
176
+ if (!text.trim())
177
+ return loaded;
178
+ for (const line of text.split(/\r?\n/)) {
179
+ if (!line.trim())
180
+ continue;
181
+ try {
182
+ const entry = JSON.parse(line);
183
+ if (agentId && "agentId" in entry && entry.agentId !== agentId)
184
+ continue;
185
+ loaded.entries += 1;
186
+ if (entry.type === "reset") {
187
+ loaded.messages.length = 0;
188
+ loaded.replacements.length = 0;
189
+ loaded.title = undefined;
190
+ loaded.titleKind = undefined;
191
+ loaded.hasInitialTitle = false;
192
+ loaded.hasTitleRefinement = false;
193
+ }
194
+ if (entry.type === "message")
195
+ loaded.messages.push(entry.message);
196
+ if (entry.type === "content-replacement")
197
+ loaded.replacements.push(...entry.replacements);
198
+ if (entry.type === "title") {
199
+ const normalizedTitle = normalizeTitle(entry.title);
200
+ if (normalizedTitle) {
201
+ const kind = entry.kind ?? "initial";
202
+ loaded.title = normalizedTitle;
203
+ loaded.titleKind = kind;
204
+ if (kind === "initial")
205
+ loaded.hasInitialTitle = true;
206
+ if (kind === "refinement") {
207
+ loaded.hasInitialTitle = true;
208
+ loaded.hasTitleRefinement = true;
209
+ }
210
+ }
211
+ }
212
+ }
213
+ catch {
214
+ // Skip malformed lines so a partial write does not make the session unusable.
215
+ }
216
+ }
217
+ return loaded;
218
+ }
219
+ function createEmptyLoadedTranscript() {
220
+ return { messages: [], replacements: [], entries: 0, hasInitialTitle: false, hasTitleRefinement: false };
221
+ }
222
+ function resolveSessionRoot(options) {
223
+ if (options.rootDir)
224
+ return path.resolve(options.rootDir);
225
+ const cwd = path.resolve(options.cwd ?? process.cwd());
226
+ return path.join(cwd, ".agent", "sessions");
227
+ }
228
+ function createSessionId() {
229
+ return `${new Date().toISOString().replace(/[:.]/g, "-")}-${os.hostname()}-${Math.random().toString(36).slice(2, 8)}`;
230
+ }
231
+ function cloneMessage(message) {
232
+ return JSON.parse(JSON.stringify(message));
233
+ }
234
+ function shouldPersistMessage(message) {
235
+ if (message.role === "progress")
236
+ return false;
237
+ if (message.metadata?.systemInit === true)
238
+ return false;
239
+ return true;
240
+ }
241
+ function normalizeTitle(title) {
242
+ const normalized = title?.replace(/[\r\n]+/g, " ").replace(/\s+/g, " ").trim();
243
+ return normalized ? normalized.slice(0, 120) : undefined;
244
+ }
245
+ function normalizeRequestedSessionId(sessionId) {
246
+ const normalized = sessionId?.trim();
247
+ return normalized ? normalized : undefined;
248
+ }
249
+ //# sourceMappingURL=session-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/session/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAwD,MAAM,yBAAyB,CAAC;AA8DrH,MAAM,OAAO,YAAY;IACd,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,cAAc,CAAS;IACvB,gBAAgB,CAAmB;IAC3B,OAAO,CAAS;IAChB,eAAe,CAAY;IAC3B,mBAAmB,CAA6B;IACzD,KAAK,CAAU;IACf,SAAS,CAAoB;IAC7B,eAAe,GAAG,KAAK,CAAC;IACxB,kBAAkB,GAAG,KAAK,CAAC;IAEnC,YAAoB,OAA4B,EAAE,SAAiB,EAAE,MAAwB;QAC3F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;QACvC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QACpD,IAAI,CAAC,gBAAgB,GAAG,IAAI,oBAAoB,CAC9C;YACE,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,OAAO,CAAC,wBAAwB;SACjD,EACD,MAAM,CAAC,YAAY,CACpB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAA4B;QAC5C,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,SAAS,GACb,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,kBAAkB,IAAI,kBAAkB,KAAK,QAAQ,CAAC;YACxE,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,eAAe,EAAE;YAC3D,CAAC,CAAC,kBAAkB,IAAI,eAAe,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,2BAA2B,EAAE,CAAC;QACtH,MAAM,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAA8B,EAAE;QAChD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,OAAO;aACJ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;aACtC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACnB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI;gBAAE,OAAO,SAAS,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACrE,MAAM,OAAO,GAAkC;gBAC7C,SAAS;gBACT,UAAU;gBACV,cAAc;gBACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBACnC,WAAW,EAAE,IAAI,CAAC,OAAO;gBACzB,UAAU,EAAE,MAAM,CAAC,OAAO;gBAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAChC,mBAAmB,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;aAChD,CAAC;YACF,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC/C,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CACL,CAAC;QAEF,OAAO,SAAS;aACb,MAAM,CAAC,+BAA+B,CAAC;aACvC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;aAC/D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;aAC3D,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;aAChE,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAA6B;QAC/C,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC/F,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClG,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;QAC3F,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,OAAgB;QAC5B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAAE,OAAO;QAC3C,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,OAAyB,SAAS;QAC3D,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO;QAClF,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QACpD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,aAAa;QACX,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,aAAa,EAAE,IAAI,CAAC,kBAAkB;SACvC,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,YAAiD;QACzE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACtC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC;YACf,IAAI,EAAE,qBAAqB;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,CAAC,GAAG,YAAY,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC7H,CAAC;IAED,QAAQ;QACN,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;YAC5C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM;SACrD,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,KAA6B;QAC/C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;CACF;AAiBD,SAAS,+BAA+B,CAAC,OAAkD;IACzF,OAAO,OAAO,KAAK,SAAS,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAA4B;IAC7D,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7H,OAAO,MAAM,EAAE,SAAS,CAAC;AAC3B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,cAAsB,EAAE,OAAgB;IACpE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAC;IAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;YACzD,IAAI,OAAO,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;gBAAE,SAAS;YACzE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3B,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;gBACzB,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC/B,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC;YACpC,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClE,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB;gBAAE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACpD,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;oBACrC,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;oBAC/B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;oBACxB,IAAI,IAAI,KAAK,SAAS;wBAAE,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;oBACtD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;wBAC1B,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;wBAC9B,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBACnC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8EAA8E;QAChF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;AAC3G,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAqD;IAC/E,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACxH,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAY,CAAC;AACxD,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,OAAO,CAAC,QAAQ,EAAE,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,MAAM,UAAU,GAAG,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,2BAA2B,CAAC,SAA6B;IAChE,MAAM,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;IACrC,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC"}
@@ -0,0 +1 @@
1
+ export {};