@agents-tower/core 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.
- package/dist/adapters/claude.d.ts +2 -0
- package/dist/adapters/claude.js +43 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex-cloud.d.ts +4 -0
- package/dist/adapters/codex-cloud.js +80 -0
- package/dist/adapters/codex-cloud.js.map +1 -0
- package/dist/adapters/codex-local.d.ts +17 -0
- package/dist/adapters/codex-local.js +180 -0
- package/dist/adapters/codex-local.js.map +1 -0
- package/dist/adapters/cursor-cloud.d.ts +2 -0
- package/dist/adapters/cursor-cloud.js +54 -0
- package/dist/adapters/cursor-cloud.js.map +1 -0
- package/dist/adapters/cursor-local.d.ts +2 -0
- package/dist/adapters/cursor-local.js +37 -0
- package/dist/adapters/cursor-local.js.map +1 -0
- package/dist/adapters/helpers.d.ts +15 -0
- package/dist/adapters/helpers.js +33 -0
- package/dist/adapters/helpers.js.map +1 -0
- package/dist/adapters/hermes.d.ts +2 -0
- package/dist/adapters/hermes.js +41 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +37 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +2 -0
- package/dist/adapters/openclaw.js +41 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/presence.d.ts +2 -0
- package/dist/adapters/presence.js +36 -0
- package/dist/adapters/presence.js.map +1 -0
- package/dist/adapters/static-source.d.ts +15 -0
- package/dist/adapters/static-source.js +41 -0
- package/dist/adapters/static-source.js.map +1 -0
- package/dist/adapters/types.d.ts +44 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/app-server.d.ts +94 -0
- package/dist/app-server.js +382 -0
- package/dist/app-server.js.map +1 -0
- package/dist/app-settings.d.ts +52 -0
- package/dist/app-settings.js +268 -0
- package/dist/app-settings.js.map +1 -0
- package/dist/appearance.d.ts +6 -0
- package/dist/appearance.js +84 -0
- package/dist/appearance.js.map +1 -0
- package/dist/aseprite.d.ts +4 -0
- package/dist/aseprite.js +42 -0
- package/dist/aseprite.js.map +1 -0
- package/dist/claude-agent-sdk.d.ts +44 -0
- package/dist/claude-agent-sdk.js +347 -0
- package/dist/claude-agent-sdk.js.map +1 -0
- package/dist/claude-home-cache.d.ts +61 -0
- package/dist/claude-home-cache.js +438 -0
- package/dist/claude-home-cache.js.map +1 -0
- package/dist/claude.d.ts +154 -0
- package/dist/claude.js +3495 -0
- package/dist/claude.js.map +1 -0
- package/dist/cloud.d.ts +2 -0
- package/dist/cloud.js +25 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codex-command.d.ts +25 -0
- package/dist/codex-command.js +235 -0
- package/dist/codex-command.js.map +1 -0
- package/dist/codex-session-files.d.ts +8 -0
- package/dist/codex-session-files.js +509 -0
- package/dist/codex-session-files.js.map +1 -0
- package/dist/codex-thread-query.d.ts +14 -0
- package/dist/codex-thread-query.js +82 -0
- package/dist/codex-thread-query.js.map +1 -0
- package/dist/cursor-cloud-data.d.ts +34 -0
- package/dist/cursor-cloud-data.js +344 -0
- package/dist/cursor-cloud-data.js.map +1 -0
- package/dist/cursor-lib/local-discovery.d.ts +17 -0
- package/dist/cursor-lib/local-discovery.js +251 -0
- package/dist/cursor-lib/local-discovery.js.map +1 -0
- package/dist/cursor-lib/shared.d.ts +5 -0
- package/dist/cursor-lib/shared.js +88 -0
- package/dist/cursor-lib/shared.js.map +1 -0
- package/dist/cursor.d.ts +8 -0
- package/dist/cursor.js +1584 -0
- package/dist/cursor.js.map +1 -0
- package/dist/domain/codex-turn-semantics.d.ts +4 -0
- package/dist/domain/codex-turn-semantics.js +49 -0
- package/dist/domain/codex-turn-semantics.js.map +1 -0
- package/dist/domain/workload-policy.d.ts +8 -0
- package/dist/domain/workload-policy.js +268 -0
- package/dist/domain/workload-policy.js.map +1 -0
- package/dist/domain/workspace-activity.d.ts +10 -0
- package/dist/domain/workspace-activity.js +372 -0
- package/dist/domain/workspace-activity.js.map +1 -0
- package/dist/goal.d.ts +11 -0
- package/dist/goal.js +76 -0
- package/dist/goal.js.map +1 -0
- package/dist/hermes-hook-install.d.ts +12 -0
- package/dist/hermes-hook-install.js +335 -0
- package/dist/hermes-hook-install.js.map +1 -0
- package/dist/hermes.d.ts +97 -0
- package/dist/hermes.js +2446 -0
- package/dist/hermes.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/live-monitor-lib/events.d.ts +43 -0
- package/dist/live-monitor-lib/events.js +1463 -0
- package/dist/live-monitor-lib/events.js.map +1 -0
- package/dist/live-monitor-lib/rollout-hooks.d.ts +13 -0
- package/dist/live-monitor-lib/rollout-hooks.js +253 -0
- package/dist/live-monitor-lib/rollout-hooks.js.map +1 -0
- package/dist/live-monitor.d.ts +102 -0
- package/dist/live-monitor.js +1461 -0
- package/dist/live-monitor.js.map +1 -0
- package/dist/local-thread-selection.d.ts +2 -0
- package/dist/local-thread-selection.js +58 -0
- package/dist/local-thread-selection.js.map +1 -0
- package/dist/openclaw.d.ts +41 -0
- package/dist/openclaw.js +715 -0
- package/dist/openclaw.js.map +1 -0
- package/dist/presence.d.ts +9 -0
- package/dist/presence.js +108 -0
- package/dist/presence.js.map +1 -0
- package/dist/project-identity.d.ts +7 -0
- package/dist/project-identity.js +162 -0
- package/dist/project-identity.js.map +1 -0
- package/dist/project-paths.d.ts +23 -0
- package/dist/project-paths.js +394 -0
- package/dist/project-paths.js.map +1 -0
- package/dist/project-storage.d.ts +7 -0
- package/dist/project-storage.js +79 -0
- package/dist/project-storage.js.map +1 -0
- package/dist/room-config.d.ts +21 -0
- package/dist/room-config.js +230 -0
- package/dist/room-config.js.map +1 -0
- package/dist/services/project-discovery.d.ts +1 -0
- package/dist/services/project-discovery.js +16 -0
- package/dist/services/project-discovery.js.map +1 -0
- package/dist/services/project-live-monitor.d.ts +1 -0
- package/dist/services/project-live-monitor.js +6 -0
- package/dist/services/project-live-monitor.js.map +1 -0
- package/dist/services/project-snapshot-coordinator.d.ts +49 -0
- package/dist/services/project-snapshot-coordinator.js +152 -0
- package/dist/services/project-snapshot-coordinator.js.map +1 -0
- package/dist/services/refresh-scheduler.d.ts +8 -0
- package/dist/services/refresh-scheduler.js +44 -0
- package/dist/services/refresh-scheduler.js.map +1 -0
- package/dist/services/snapshot-assembler.d.ts +8 -0
- package/dist/services/snapshot-assembler.js +167 -0
- package/dist/services/snapshot-assembler.js.map +1 -0
- package/dist/services/thread-store.d.ts +4 -0
- package/dist/services/thread-store.js +8 -0
- package/dist/services/thread-store.js.map +1 -0
- package/dist/snapshot-lib/activity-summary.d.ts +3 -0
- package/dist/snapshot-lib/activity-summary.js +220 -0
- package/dist/snapshot-lib/activity-summary.js.map +1 -0
- package/dist/snapshot-lib/dashboard-builder.d.ts +21 -0
- package/dist/snapshot-lib/dashboard-builder.js +146 -0
- package/dist/snapshot-lib/dashboard-builder.js.map +1 -0
- package/dist/snapshot-lib/thread-summary.d.ts +27 -0
- package/dist/snapshot-lib/thread-summary.js +953 -0
- package/dist/snapshot-lib/thread-summary.js.map +1 -0
- package/dist/snapshot.d.ts +2 -0
- package/dist/snapshot.js +21 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +368 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json.d.ts +4 -0
- package/dist/utils/json.js +29 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/text.d.ts +3 -0
- package/dist/utils/text.js +26 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/web-search.d.ts +1 -0
- package/dist/web-search.js +52 -0
- package/dist/web-search.js.map +1 -0
- package/dist/workload.d.ts +1 -0
- package/dist/workload.js +12 -0
- package/dist/workload.js.map +1 -0
- package/package.json +19 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CodexThread } from "./types";
|
|
2
|
+
export declare function parseCodexSessionThreadFromJsonl(filePath: string, text: string, fallbackMtimeMs?: number): CodexThread | null;
|
|
3
|
+
export declare function discoverCodexSessionThreads(input: {
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
maxFiles?: number;
|
|
6
|
+
now?: Date;
|
|
7
|
+
sessionDirectories?: string[];
|
|
8
|
+
}): Promise<CodexThread[]>;
|
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCodexSessionThreadFromJsonl = parseCodexSessionThreadFromJsonl;
|
|
4
|
+
exports.discoverCodexSessionThreads = discoverCodexSessionThreads;
|
|
5
|
+
const promises_1 = require("node:fs/promises");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const project_paths_1 = require("./project-paths");
|
|
9
|
+
const DEFAULT_MAX_SESSION_FILES = 240;
|
|
10
|
+
const DEFAULT_SESSION_LOOKBACK_DAYS = 2;
|
|
11
|
+
const SESSION_FILE_RECENCY_MS = 24 * 60 * 60 * 1000;
|
|
12
|
+
const SESSION_META_PREFIX_BYTES = 64 * 1024;
|
|
13
|
+
const SESSION_META_CACHE_LIMIT = 512;
|
|
14
|
+
const SESSION_META_READ_CONCURRENCY = 12;
|
|
15
|
+
const SESSION_FULL_READ_CONCURRENCY = 3;
|
|
16
|
+
const sessionMetaCache = new Map();
|
|
17
|
+
const fullSessionReadInFlight = new Map();
|
|
18
|
+
const fullSessionReadWaiters = [];
|
|
19
|
+
let activeFullSessionReads = 0;
|
|
20
|
+
function asRecord(value) {
|
|
21
|
+
return typeof value === "object" && value !== null ? value : null;
|
|
22
|
+
}
|
|
23
|
+
function asString(value) {
|
|
24
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
25
|
+
}
|
|
26
|
+
function asNumber(value) {
|
|
27
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
28
|
+
}
|
|
29
|
+
function unixSecondsFromIso(value, fallbackMs) {
|
|
30
|
+
const parsed = value ? Date.parse(value) : Number.NaN;
|
|
31
|
+
return Math.floor((Number.isFinite(parsed) ? parsed : fallbackMs) / 1000);
|
|
32
|
+
}
|
|
33
|
+
function sessionDateDirectories(now = new Date(), lookbackDays = DEFAULT_SESSION_LOOKBACK_DAYS) {
|
|
34
|
+
const root = (0, node_path_1.join)((0, node_os_1.homedir)(), ".codex", "sessions");
|
|
35
|
+
const directories = [];
|
|
36
|
+
for (let offset = 0; offset < lookbackDays; offset += 1) {
|
|
37
|
+
const date = new Date(now.getTime() - offset * 24 * 60 * 60 * 1000);
|
|
38
|
+
const year = String(date.getFullYear()).padStart(4, "0");
|
|
39
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
40
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
41
|
+
directories.push((0, node_path_1.join)(root, year, month, day));
|
|
42
|
+
}
|
|
43
|
+
return directories;
|
|
44
|
+
}
|
|
45
|
+
async function listRecentSessionFiles(input) {
|
|
46
|
+
const nowMs = (input.now ?? new Date()).getTime();
|
|
47
|
+
const directories = input.sessionDirectories ?? sessionDateDirectories(input.now, input.lookbackDays);
|
|
48
|
+
const files = (await Promise.all(directories.map(async (directory) => {
|
|
49
|
+
try {
|
|
50
|
+
const entries = await (0, promises_1.readdir)(directory, { withFileTypes: true });
|
|
51
|
+
return await Promise.all(entries
|
|
52
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
|
|
53
|
+
.map(async (entry) => {
|
|
54
|
+
const filePath = (0, node_path_1.join)(directory, entry.name);
|
|
55
|
+
try {
|
|
56
|
+
const entryStat = await (0, promises_1.stat)(filePath);
|
|
57
|
+
if (nowMs - entryStat.mtimeMs > SESSION_FILE_RECENCY_MS) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return { filePath, mtimeMs: entryStat.mtimeMs, size: entryStat.size };
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}))).flat().filter((entry) => Boolean(entry));
|
|
71
|
+
return files
|
|
72
|
+
.sort((left, right) => right.mtimeMs - left.mtimeMs)
|
|
73
|
+
.slice(0, input.maxFiles ?? DEFAULT_MAX_SESSION_FILES);
|
|
74
|
+
}
|
|
75
|
+
async function mapWithConcurrency(values, concurrency, mapper) {
|
|
76
|
+
if (values.length === 0) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
const results = new Array(values.length);
|
|
80
|
+
let nextIndex = 0;
|
|
81
|
+
const workers = Array.from({ length: Math.min(values.length, Math.max(1, concurrency)) }, async () => {
|
|
82
|
+
while (nextIndex < values.length) {
|
|
83
|
+
const index = nextIndex;
|
|
84
|
+
nextIndex += 1;
|
|
85
|
+
results[index] = await mapper(values[index], index);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
await Promise.all(workers);
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
function sessionFileSignature(file) {
|
|
92
|
+
return `${file.mtimeMs}:${file.size}`;
|
|
93
|
+
}
|
|
94
|
+
function fullSessionReadKey(file) {
|
|
95
|
+
return `${file.filePath}\u0000${sessionFileSignature(file)}`;
|
|
96
|
+
}
|
|
97
|
+
function pruneSessionMetaCache() {
|
|
98
|
+
while (sessionMetaCache.size > SESSION_META_CACHE_LIMIT) {
|
|
99
|
+
const oldestKey = sessionMetaCache.keys().next().value;
|
|
100
|
+
if (!oldestKey) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
sessionMetaCache.delete(oldestKey);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function readSessionMetaPrefix(file) {
|
|
107
|
+
const handle = await (0, promises_1.open)(file.filePath, "r");
|
|
108
|
+
try {
|
|
109
|
+
const length = Math.min(file.size, SESSION_META_PREFIX_BYTES);
|
|
110
|
+
if (length <= 0) {
|
|
111
|
+
return { kind: "unknown" };
|
|
112
|
+
}
|
|
113
|
+
const buffer = Buffer.alloc(length);
|
|
114
|
+
const { bytesRead } = await handle.read(buffer, 0, length, 0);
|
|
115
|
+
const prefix = buffer.subarray(0, bytesRead).toString("utf8").replace(/^\uFEFF/, "");
|
|
116
|
+
const newlineIndex = prefix.search(/\r?\n/);
|
|
117
|
+
if (newlineIndex < 0 && file.size > bytesRead) {
|
|
118
|
+
return { kind: "unknown" };
|
|
119
|
+
}
|
|
120
|
+
const firstLine = (newlineIndex >= 0 ? prefix.slice(0, newlineIndex) : prefix).trim();
|
|
121
|
+
const entry = parseJsonLine(firstLine);
|
|
122
|
+
const payload = asRecord(entry?.payload);
|
|
123
|
+
if (!entry || entry.type !== "session_meta" || !payload) {
|
|
124
|
+
return { kind: "unknown" };
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
kind: "known",
|
|
128
|
+
cwd: asString(payload.cwd),
|
|
129
|
+
isSubagent: sessionSourceIsSubagent(payload.source, asString(payload.thread_source))
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
await handle.close();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function getSessionMetaProbe(file) {
|
|
137
|
+
const signature = sessionFileSignature(file);
|
|
138
|
+
const cached = sessionMetaCache.get(file.filePath);
|
|
139
|
+
if (cached?.signature === signature) {
|
|
140
|
+
sessionMetaCache.delete(file.filePath);
|
|
141
|
+
sessionMetaCache.set(file.filePath, cached);
|
|
142
|
+
return cached.promise;
|
|
143
|
+
}
|
|
144
|
+
const promise = readSessionMetaPrefix(file).catch(() => ({ kind: "unknown" }));
|
|
145
|
+
sessionMetaCache.set(file.filePath, { signature, promise });
|
|
146
|
+
pruneSessionMetaCache();
|
|
147
|
+
return promise;
|
|
148
|
+
}
|
|
149
|
+
async function acquireFullSessionReadSlot() {
|
|
150
|
+
if (activeFullSessionReads < SESSION_FULL_READ_CONCURRENCY) {
|
|
151
|
+
activeFullSessionReads += 1;
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await new Promise((resolve) => fullSessionReadWaiters.push(resolve));
|
|
155
|
+
}
|
|
156
|
+
function releaseFullSessionReadSlot() {
|
|
157
|
+
const next = fullSessionReadWaiters.shift();
|
|
158
|
+
if (next) {
|
|
159
|
+
// Transfer the occupied slot directly to the next reader.
|
|
160
|
+
next();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
activeFullSessionReads = Math.max(0, activeFullSessionReads - 1);
|
|
164
|
+
}
|
|
165
|
+
async function readAndParseSessionFile(file) {
|
|
166
|
+
const key = fullSessionReadKey(file);
|
|
167
|
+
const existing = fullSessionReadInFlight.get(key);
|
|
168
|
+
if (existing) {
|
|
169
|
+
return existing;
|
|
170
|
+
}
|
|
171
|
+
const promise = (async () => {
|
|
172
|
+
await acquireFullSessionReadSlot();
|
|
173
|
+
try {
|
|
174
|
+
const contents = await (0, promises_1.readFile)(file.filePath, "utf8");
|
|
175
|
+
const thread = parseCodexSessionThreadFromJsonl(file.filePath, contents, file.mtimeMs);
|
|
176
|
+
if (thread) {
|
|
177
|
+
sessionMetaCache.set(file.filePath, {
|
|
178
|
+
signature: sessionFileSignature(file),
|
|
179
|
+
promise: Promise.resolve({ kind: "known", cwd: thread.cwd, isSubagent: true })
|
|
180
|
+
});
|
|
181
|
+
pruneSessionMetaCache();
|
|
182
|
+
}
|
|
183
|
+
return thread;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
releaseFullSessionReadSlot();
|
|
190
|
+
}
|
|
191
|
+
})();
|
|
192
|
+
fullSessionReadInFlight.set(key, promise);
|
|
193
|
+
void promise.finally(() => {
|
|
194
|
+
if (fullSessionReadInFlight.get(key) === promise) {
|
|
195
|
+
fullSessionReadInFlight.delete(key);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return promise;
|
|
199
|
+
}
|
|
200
|
+
function parseJsonLine(line) {
|
|
201
|
+
try {
|
|
202
|
+
return asRecord(JSON.parse(line));
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function contentText(content) {
|
|
209
|
+
if (typeof content === "string") {
|
|
210
|
+
return content;
|
|
211
|
+
}
|
|
212
|
+
if (!Array.isArray(content)) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
const text = content
|
|
216
|
+
.map((entry) => asRecord(entry))
|
|
217
|
+
.map((entry) => asString(entry?.text))
|
|
218
|
+
.filter((entry) => Boolean(entry))
|
|
219
|
+
.join("\n")
|
|
220
|
+
.trim();
|
|
221
|
+
return text.length > 0 ? text : null;
|
|
222
|
+
}
|
|
223
|
+
function parseNestedAgentEnvelope(text) {
|
|
224
|
+
const trimmed = text.trim();
|
|
225
|
+
if (!trimmed.startsWith("{")) {
|
|
226
|
+
return text;
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const parsed = JSON.parse(trimmed);
|
|
230
|
+
const content = asString(parsed.content);
|
|
231
|
+
return content ?? text;
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return text;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function parseCommandArguments(argumentsText) {
|
|
238
|
+
if (!argumentsText) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
try {
|
|
242
|
+
const parsed = JSON.parse(argumentsText);
|
|
243
|
+
const command = asString(parsed.cmd);
|
|
244
|
+
if (!command) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
command,
|
|
249
|
+
cwd: asString(parsed.workdir) ?? undefined
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function outputSucceeded(output) {
|
|
257
|
+
if (!output) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
const exitMatch = output.match(/Process exited with code\s+(\d+)/);
|
|
261
|
+
return !exitMatch || exitMatch[1] === "0";
|
|
262
|
+
}
|
|
263
|
+
function sessionSourceIsSubagent(source, threadSource) {
|
|
264
|
+
if (threadSource?.toLowerCase() === "subagent") {
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
const record = asRecord(source);
|
|
268
|
+
return Boolean(record?.subagent || record?.subAgent || record?.sub_agent);
|
|
269
|
+
}
|
|
270
|
+
function ensureTurn(turnsById, turnId) {
|
|
271
|
+
const existing = turnsById.get(turnId);
|
|
272
|
+
if (existing) {
|
|
273
|
+
return existing;
|
|
274
|
+
}
|
|
275
|
+
const turn = {
|
|
276
|
+
id: turnId,
|
|
277
|
+
status: "inProgress",
|
|
278
|
+
error: null,
|
|
279
|
+
items: []
|
|
280
|
+
};
|
|
281
|
+
turnsById.set(turnId, turn);
|
|
282
|
+
return turn;
|
|
283
|
+
}
|
|
284
|
+
function pushResponseItem(input) {
|
|
285
|
+
const type = asString(input.payload.type);
|
|
286
|
+
if (!type) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (type === "message") {
|
|
290
|
+
const text = contentText(input.payload.content);
|
|
291
|
+
if (!text) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const role = asString(input.payload.role);
|
|
295
|
+
const normalizedText = parseNestedAgentEnvelope(text);
|
|
296
|
+
if (normalizedText.trim().startsWith("<turn_aborted>")) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
input.turn.items.push({
|
|
300
|
+
type: role === "user" ? "userMessage" : "agentMessage",
|
|
301
|
+
id: `session-item-${input.itemIndex}`,
|
|
302
|
+
text: normalizedText,
|
|
303
|
+
phase: asString(input.payload.phase) ?? (role === "assistant" ? "commentary" : "updated")
|
|
304
|
+
});
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (type === "reasoning") {
|
|
308
|
+
const summary = contentText(input.payload.summary) ?? asString(input.payload.text) ?? "Reasoning";
|
|
309
|
+
input.turn.items.push({
|
|
310
|
+
type: "reasoning",
|
|
311
|
+
id: `session-item-${input.itemIndex}`,
|
|
312
|
+
summary,
|
|
313
|
+
status: "completed"
|
|
314
|
+
});
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (type === "function_call") {
|
|
318
|
+
const callId = asString(input.payload.call_id) ?? `session-call-${input.itemIndex}`;
|
|
319
|
+
const toolName = asString(input.payload.name) ?? "tool";
|
|
320
|
+
const command = toolName === "exec_command"
|
|
321
|
+
? parseCommandArguments(asString(input.payload.arguments))
|
|
322
|
+
: null;
|
|
323
|
+
const item = command
|
|
324
|
+
? {
|
|
325
|
+
type: "commandExecution",
|
|
326
|
+
id: callId,
|
|
327
|
+
command: command.command,
|
|
328
|
+
cwd: command.cwd,
|
|
329
|
+
status: "inProgress"
|
|
330
|
+
}
|
|
331
|
+
: {
|
|
332
|
+
type: "dynamicToolCall",
|
|
333
|
+
id: callId,
|
|
334
|
+
tool: toolName,
|
|
335
|
+
status: "inProgress"
|
|
336
|
+
};
|
|
337
|
+
input.pendingToolItems.set(callId, item);
|
|
338
|
+
input.turn.items.push(item);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (type === "function_call_output") {
|
|
342
|
+
const callId = asString(input.payload.call_id);
|
|
343
|
+
const item = callId ? input.pendingToolItems.get(callId) : null;
|
|
344
|
+
if (item) {
|
|
345
|
+
item.status = outputSucceeded(asString(input.payload.output)) ? "completed" : "failed";
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
function parseCodexSessionThreadFromJsonl(filePath, text, fallbackMtimeMs = Date.now()) {
|
|
350
|
+
const lines = text.split(/\r?\n/).filter((line) => line.trim().length > 0);
|
|
351
|
+
if (lines.length === 0) {
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
let meta;
|
|
355
|
+
let currentTurnId = null;
|
|
356
|
+
let latestTimestamp = null;
|
|
357
|
+
let latestTaskEvent = null;
|
|
358
|
+
const turnsById = new Map();
|
|
359
|
+
const pendingToolItems = new Map();
|
|
360
|
+
lines.forEach((line, lineIndex) => {
|
|
361
|
+
const entry = parseJsonLine(line);
|
|
362
|
+
if (!entry) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
latestTimestamp = asString(entry.timestamp) ?? latestTimestamp;
|
|
366
|
+
const payload = asRecord(entry.payload);
|
|
367
|
+
if (!payload) {
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (entry.type === "session_meta") {
|
|
371
|
+
meta = payload;
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (entry.type === "turn_context") {
|
|
375
|
+
currentTurnId = asString(payload.turn_id) ?? currentTurnId;
|
|
376
|
+
if (currentTurnId) {
|
|
377
|
+
ensureTurn(turnsById, currentTurnId);
|
|
378
|
+
}
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (entry.type === "event_msg") {
|
|
382
|
+
const payloadType = asString(payload.type);
|
|
383
|
+
const turnId = asString(payload.turn_id) ?? currentTurnId;
|
|
384
|
+
if (payloadType === "task_started") {
|
|
385
|
+
latestTaskEvent = "started";
|
|
386
|
+
currentTurnId = turnId ?? currentTurnId;
|
|
387
|
+
if (currentTurnId) {
|
|
388
|
+
ensureTurn(turnsById, currentTurnId).status = "inProgress";
|
|
389
|
+
}
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (payloadType === "task_complete") {
|
|
393
|
+
latestTaskEvent = "complete";
|
|
394
|
+
if (turnId) {
|
|
395
|
+
const turn = ensureTurn(turnsById, turnId);
|
|
396
|
+
turn.status = "completed";
|
|
397
|
+
const lastMessage = asString(payload.last_agent_message);
|
|
398
|
+
if (lastMessage) {
|
|
399
|
+
turn.items.push({
|
|
400
|
+
type: "agentMessage",
|
|
401
|
+
id: `session-item-${lineIndex}`,
|
|
402
|
+
text: lastMessage,
|
|
403
|
+
phase: "final_answer"
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
if (payloadType === "turn_aborted") {
|
|
410
|
+
latestTaskEvent = "aborted";
|
|
411
|
+
if (turnId) {
|
|
412
|
+
ensureTurn(turnsById, turnId).status = "interrupted";
|
|
413
|
+
}
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
if (payloadType === "agent_message") {
|
|
417
|
+
const message = asString(payload.message);
|
|
418
|
+
if (message && currentTurnId) {
|
|
419
|
+
ensureTurn(turnsById, currentTurnId).items.push({
|
|
420
|
+
type: "agentMessage",
|
|
421
|
+
id: `session-item-${lineIndex}`,
|
|
422
|
+
text: parseNestedAgentEnvelope(message),
|
|
423
|
+
phase: asString(payload.phase) ?? "commentary"
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
if (entry.type === "response_item" && currentTurnId) {
|
|
430
|
+
pushResponseItem({
|
|
431
|
+
payload,
|
|
432
|
+
turn: ensureTurn(turnsById, currentTurnId),
|
|
433
|
+
itemIndex: lineIndex,
|
|
434
|
+
pendingToolItems
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
const sessionMeta = meta;
|
|
439
|
+
if (!sessionMeta) {
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
const id = asString(sessionMeta.id);
|
|
443
|
+
const cwd = asString(sessionMeta.cwd);
|
|
444
|
+
if (!id || !cwd || !sessionSourceIsSubagent(sessionMeta.source, asString(sessionMeta.thread_source))) {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
const latestMs = Date.parse(latestTimestamp ?? "") || fallbackMtimeMs;
|
|
448
|
+
const createdAt = unixSecondsFromIso(asString(sessionMeta.timestamp), fallbackMtimeMs);
|
|
449
|
+
const updatedAt = Math.floor(latestMs / 1000);
|
|
450
|
+
const turns = [...turnsById.values()];
|
|
451
|
+
const lastTurn = turns.at(-1) ?? null;
|
|
452
|
+
if (latestTaskEvent === "complete" && lastTurn && lastTurn.status === "inProgress") {
|
|
453
|
+
lastTurn.status = "completed";
|
|
454
|
+
}
|
|
455
|
+
if (latestTaskEvent === "aborted" && lastTurn && lastTurn.status === "inProgress") {
|
|
456
|
+
lastTurn.status = "interrupted";
|
|
457
|
+
}
|
|
458
|
+
const preview = asString(sessionMeta.agent_nickname)
|
|
459
|
+
?? asString(sessionMeta.agent_path)
|
|
460
|
+
?? asString(sessionMeta.agent_role)
|
|
461
|
+
?? "Subagent";
|
|
462
|
+
return {
|
|
463
|
+
id,
|
|
464
|
+
preview,
|
|
465
|
+
ephemeral: false,
|
|
466
|
+
modelProvider: asString(sessionMeta.model_provider) ?? "openai",
|
|
467
|
+
createdAt,
|
|
468
|
+
updatedAt,
|
|
469
|
+
status: latestTaskEvent === "started" ? { type: "active", activeFlags: [] } : { type: "notLoaded" },
|
|
470
|
+
path: filePath,
|
|
471
|
+
cwd,
|
|
472
|
+
cliVersion: asString(sessionMeta.cli_version) ?? "",
|
|
473
|
+
source: asRecord(sessionMeta.source) ?? { subagent: {} },
|
|
474
|
+
agentNickname: asString(sessionMeta.agent_nickname),
|
|
475
|
+
agentRole: asString(sessionMeta.agent_role),
|
|
476
|
+
gitInfo: null,
|
|
477
|
+
name: null,
|
|
478
|
+
turns
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
async function discoverCodexSessionThreads(input) {
|
|
482
|
+
const sessionFiles = await listRecentSessionFiles({
|
|
483
|
+
now: input.now,
|
|
484
|
+
maxFiles: input.maxFiles,
|
|
485
|
+
sessionDirectories: input.sessionDirectories
|
|
486
|
+
});
|
|
487
|
+
const canonicalProjectRoot = (0, project_paths_1.canonicalizeProjectPath)(input.projectRoot);
|
|
488
|
+
if (!canonicalProjectRoot) {
|
|
489
|
+
return [];
|
|
490
|
+
}
|
|
491
|
+
const probes = await mapWithConcurrency(sessionFiles, SESSION_META_READ_CONCURRENCY, async (file) => ({ file, probe: await getSessionMetaProbe(file) }));
|
|
492
|
+
const candidates = probes
|
|
493
|
+
.filter(({ probe }) => {
|
|
494
|
+
if (probe.kind === "unknown") {
|
|
495
|
+
// Older or partially-written session files still get a compatibility
|
|
496
|
+
// parse, but only through the bounded global full-read queue.
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
return probe.isSubagent
|
|
500
|
+
&& Boolean(probe.cwd && (0, project_paths_1.sameProjectPath)(probe.cwd, canonicalProjectRoot));
|
|
501
|
+
})
|
|
502
|
+
.map(({ file }) => file);
|
|
503
|
+
const threads = await mapWithConcurrency(candidates, SESSION_FULL_READ_CONCURRENCY, readAndParseSessionFile);
|
|
504
|
+
return threads
|
|
505
|
+
.filter((thread) => Boolean(thread))
|
|
506
|
+
.filter((thread) => (0, project_paths_1.sameProjectPath)(thread.cwd, canonicalProjectRoot))
|
|
507
|
+
.sort((left, right) => right.updatedAt - left.updatedAt);
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=codex-session-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-session-files.js","sourceRoot":"","sources":["../src/codex-session-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CodexAppServerClient } from "./app-server";
|
|
2
|
+
import type { CodexThread } from "./types";
|
|
3
|
+
export declare function listCodexProjectThreadCandidates(input: {
|
|
4
|
+
client: CodexAppServerClient;
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
localLimit: number;
|
|
7
|
+
includeSessionThreads?: boolean;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
allThreads: CodexThread[];
|
|
10
|
+
projectThreads: CodexThread[];
|
|
11
|
+
trackedThreads: CodexThread[];
|
|
12
|
+
usedUnscopedFallback: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function readCodexThreadWithTimeout(client: CodexAppServerClient, threadId: string, timeoutMs?: number): Promise<CodexThread>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listCodexProjectThreadCandidates = listCodexProjectThreadCandidates;
|
|
4
|
+
exports.readCodexThreadWithTimeout = readCodexThreadWithTimeout;
|
|
5
|
+
const codex_session_files_1 = require("./codex-session-files");
|
|
6
|
+
const project_paths_1 = require("./project-paths");
|
|
7
|
+
const local_thread_selection_1 = require("./local-thread-selection");
|
|
8
|
+
const APP_SERVER_THREAD_LIST_TIMEOUT_MS = 15000;
|
|
9
|
+
const APP_SERVER_THREAD_READ_TIMEOUT_MS = 15000;
|
|
10
|
+
function mergeThreadLists(...threadLists) {
|
|
11
|
+
const byId = new Map();
|
|
12
|
+
for (const thread of threadLists.flat()) {
|
|
13
|
+
const existing = byId.get(thread.id);
|
|
14
|
+
if (!existing
|
|
15
|
+
|| thread.updatedAt > existing.updatedAt
|
|
16
|
+
|| (thread.updatedAt === existing.updatedAt
|
|
17
|
+
&& thread.turns.length > existing.turns.length)) {
|
|
18
|
+
byId.set(thread.id, thread);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return [...byId.values()].sort((left, right) => right.updatedAt - left.updatedAt);
|
|
22
|
+
}
|
|
23
|
+
async function withTimeout(promise, timeoutMs, label) {
|
|
24
|
+
return await Promise.race([
|
|
25
|
+
promise,
|
|
26
|
+
new Promise((_, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
reject(new Error(`${label} timed out after ${timeoutMs}ms`));
|
|
29
|
+
}, timeoutMs);
|
|
30
|
+
timer.unref?.();
|
|
31
|
+
promise.finally(() => clearTimeout(timer)).catch(() => clearTimeout(timer));
|
|
32
|
+
})
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
async function listCodexProjectThreadCandidates(input) {
|
|
36
|
+
const scopedLimit = Math.max(input.localLimit * 4, 40);
|
|
37
|
+
const scopedThreads = await withTimeout(input.client.listThreads({
|
|
38
|
+
cwd: input.projectRoot,
|
|
39
|
+
limit: scopedLimit
|
|
40
|
+
}), APP_SERVER_THREAD_LIST_TIMEOUT_MS, "thread/list");
|
|
41
|
+
const sessionThreads = input.includeSessionThreads === false
|
|
42
|
+
? []
|
|
43
|
+
: await (0, codex_session_files_1.discoverCodexSessionThreads)({
|
|
44
|
+
projectRoot: input.projectRoot,
|
|
45
|
+
maxFiles: Math.max(scopedLimit * 3, 120)
|
|
46
|
+
});
|
|
47
|
+
const scopedAllThreads = mergeThreadLists(scopedThreads, sessionThreads);
|
|
48
|
+
const scopedProjectThreads = (0, project_paths_1.filterThreadsForProject)(input.projectRoot, scopedAllThreads);
|
|
49
|
+
const scopedTrackedThreads = (0, local_thread_selection_1.selectProjectThreadsWithParents)(input.projectRoot, scopedAllThreads, input.localLimit);
|
|
50
|
+
if (scopedTrackedThreads.length > 0) {
|
|
51
|
+
return {
|
|
52
|
+
allThreads: scopedAllThreads,
|
|
53
|
+
projectThreads: scopedProjectThreads,
|
|
54
|
+
trackedThreads: scopedTrackedThreads,
|
|
55
|
+
usedUnscopedFallback: false
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const unscopedThreads = await withTimeout(input.client.listThreads({
|
|
59
|
+
limit: Math.max(input.localLimit * 8, 100)
|
|
60
|
+
}), APP_SERVER_THREAD_LIST_TIMEOUT_MS, "thread/list fallback");
|
|
61
|
+
const fallbackAllThreads = mergeThreadLists(unscopedThreads, sessionThreads);
|
|
62
|
+
const fallbackProjectThreads = (0, project_paths_1.filterThreadsForProject)(input.projectRoot, fallbackAllThreads);
|
|
63
|
+
const fallbackTrackedThreads = (0, local_thread_selection_1.selectProjectThreadsWithParents)(input.projectRoot, fallbackAllThreads, input.localLimit);
|
|
64
|
+
if (fallbackTrackedThreads.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
allThreads: scopedAllThreads,
|
|
67
|
+
projectThreads: scopedProjectThreads,
|
|
68
|
+
trackedThreads: scopedTrackedThreads,
|
|
69
|
+
usedUnscopedFallback: false
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
allThreads: fallbackAllThreads,
|
|
74
|
+
projectThreads: fallbackProjectThreads,
|
|
75
|
+
trackedThreads: fallbackTrackedThreads,
|
|
76
|
+
usedUnscopedFallback: true
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async function readCodexThreadWithTimeout(client, threadId, timeoutMs = APP_SERVER_THREAD_READ_TIMEOUT_MS) {
|
|
80
|
+
return await withTimeout(client.readThread(threadId), timeoutMs, "thread/read");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=codex-thread-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-thread-query.js","sourceRoot":"","sources":["../src/codex-thread-query.ts"],"names":[],"mappings":";;AAwCA,4EA+DC;AAED,gEAUC;AAlHD,+DAAoE;AACpE,mDAA0D;AAC1D,qEAA2E;AAG3E,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAChD,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAEhD,SAAS,gBAAgB,CAAC,GAAG,WAA4B;IACvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,IACE,CAAC,QAAQ;eACN,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;eACrC,CACD,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS;mBACpC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAC/C,EACD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAiB,EAAE,KAAa;IACjF,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;QACxB,OAAO;QACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,SAAS,IAAI,CAAC,CAAC,CAAC;YAC/D,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,gCAAgC,CAAC,KAKtD;IAMC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,WAAW,CACrC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;QACvB,GAAG,EAAE,KAAK,CAAC,WAAW;QACtB,KAAK,EAAE,WAAW;KACnB,CAAC,EACF,iCAAiC,EACjC,aAAa,CACd,CAAC;IACF,MAAM,cAAc,GAAG,KAAK,CAAC,qBAAqB,KAAK,KAAK;QAC1D,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,IAAA,iDAA2B,EAAC;YAClC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,GAAG,CAAC;SACzC,CAAC,CAAC;IACL,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACzE,MAAM,oBAAoB,GAAG,IAAA,uCAAuB,EAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC1F,MAAM,oBAAoB,GAAG,IAAA,wDAA+B,EAAC,KAAK,CAAC,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpH,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,UAAU,EAAE,gBAAgB;YAC5B,cAAc,EAAE,oBAAoB;YACpC,cAAc,EAAE,oBAAoB;YACpC,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,WAAW,CACvC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;QACvB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,CAAC;KAC3C,CAAC,EACF,iCAAiC,EACjC,sBAAsB,CACvB,CAAC;IACF,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAC7E,MAAM,sBAAsB,GAAG,IAAA,uCAAuB,EAAC,KAAK,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC9F,MAAM,sBAAsB,GAAG,IAAA,wDAA+B,EAAC,KAAK,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACxH,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO;YACL,UAAU,EAAE,gBAAgB;YAC5B,cAAc,EAAE,oBAAoB;YACpC,cAAc,EAAE,oBAAoB;YACpC,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,kBAAkB;QAC9B,cAAc,EAAE,sBAAsB;QACtC,cAAc,EAAE,sBAAsB;QACtC,oBAAoB,EAAE,IAAI;KAC3B,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,0BAA0B,CAC9C,MAA4B,EAC5B,QAAgB,EAChB,SAAS,GAAG,iCAAiC;IAE7C,OAAO,MAAM,WAAW,CACtB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC3B,SAAS,EACT,aAAa,CACd,CAAC;AACJ,CAAC"}
|