experimental-agent 0.0.2 → 0.0.4

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 (57) hide show
  1. package/README.md +13 -2
  2. package/dist/agent-workflow.d.mts +11 -3
  3. package/dist/agent-workflow.d.ts +11 -3
  4. package/dist/agent-workflow.js +1921 -1144
  5. package/dist/agent-workflow.mjs +7 -3
  6. package/dist/chunk-3ODWQVIA.mjs +12 -0
  7. package/dist/chunk-64THY7Y7.mjs +155 -0
  8. package/dist/chunk-GSRJYPWF.mjs +284 -0
  9. package/dist/chunk-HJGPUEFC.mjs +42 -0
  10. package/dist/chunk-JCPQQWIK.mjs +2057 -0
  11. package/dist/chunk-JEE2FQ4O.mjs +844 -0
  12. package/dist/chunk-T7PMZLOX.mjs +79 -0
  13. package/dist/chunk-TQRCSTCF.mjs +103 -0
  14. package/dist/chunk-VBLZWXVE.mjs +318 -0
  15. package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
  16. package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
  17. package/dist/client-SREKHM6I.mjs +15 -0
  18. package/dist/client.d.mts +37 -0
  19. package/dist/client.d.ts +37 -0
  20. package/dist/client.js +58 -0
  21. package/dist/client.mjs +30 -0
  22. package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
  23. package/dist/index.d.mts +3 -4
  24. package/dist/index.d.ts +3 -4
  25. package/dist/index.js +3102 -1438
  26. package/dist/index.mjs +720 -147
  27. package/dist/lifecycle-workflow.d.mts +3 -10
  28. package/dist/lifecycle-workflow.d.ts +3 -10
  29. package/dist/lifecycle-workflow.js +170 -1246
  30. package/dist/lifecycle-workflow.mjs +5 -41
  31. package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
  32. package/dist/next/loader.d.mts +14 -0
  33. package/dist/next/loader.d.ts +14 -0
  34. package/dist/next/loader.js +206 -0
  35. package/dist/next/loader.mjs +103 -0
  36. package/dist/next.d.mts +34 -0
  37. package/dist/next.d.ts +34 -0
  38. package/dist/next.js +329 -0
  39. package/dist/next.mjs +224 -0
  40. package/dist/process-manager-JAKAXROL.mjs +10 -0
  41. package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
  42. package/dist/storage-Q376OZH3.mjs +20 -0
  43. package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
  44. package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
  45. package/package.json +32 -19
  46. package/dist/chunk-24DJSI7C.mjs +0 -374
  47. package/dist/chunk-4RGMKC2M.mjs +0 -755
  48. package/dist/chunk-6ICYKNCC.mjs +0 -284
  49. package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
  50. package/dist/client-BBpD9kKL.d.ts +0 -193
  51. package/dist/client-BGJViybU.d.mts +0 -193
  52. package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
  53. package/dist/local-BYPFRMLZ.mjs +0 -282
  54. package/dist/process-manager-H2HF6G4G.mjs +0 -153
  55. package/dist/sandbox-BFA4ECEQ.mjs +0 -10
  56. package/dist/storage-2U2QFNWI.mjs +0 -27
  57. /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
@@ -1,44 +1,8 @@
1
- // src/sandbox/lifecycle-workflow.ts
2
- import { defineHook, FatalError, sleep } from "workflow";
3
- var sandboxActivityHook = defineHook();
4
- var DEFAULT_IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
5
- async function sandboxLifecycleWorkflow({
6
- input
7
- }) {
8
- "use workflow";
9
- const activityHook = sandboxActivityHook.create({ token: input.id });
10
- const iterator = activityHook[Symbol.asyncIterator]();
11
- let pendingNext = iterator.next();
12
- let sandboxConfig = input.initialConfig;
13
- if (sandboxConfig.type !== "vercel") {
14
- throw new Error("Sandbox config is not a Vercel sandbox");
15
- }
16
- const idleTimeoutMs = sandboxConfig.lifecycle?.stopAfterInactiveMs ?? DEFAULT_IDLE_TIMEOUT_MS;
17
- while (true) {
18
- const result = await Promise.race([
19
- pendingNext.then((r) => ({ ...r, type: "activity" })),
20
- sleep(idleTimeoutMs).then(() => ({ type: "timeout" }))
21
- ]);
22
- if (result.type === "timeout") {
23
- const { snapshotSandboxStep } = await import("./lifecycle-workflow-steps-HHN46ZAD.mjs");
24
- await snapshotSandboxStep(input).catch((e) => {
25
- if (FatalError.is(e)) {
26
- console.error("Snapshot failed permanently:", e.message);
27
- return;
28
- }
29
- throw e;
30
- });
31
- break;
32
- }
33
- if (result.done) {
34
- break;
35
- }
36
- sandboxConfig = result.value.newConfig;
37
- pendingNext = iterator.next();
38
- }
39
- }
1
+ import {
2
+ sandboxLifecycleWorkflow
3
+ } from "./chunk-TQRCSTCF.mjs";
4
+ import "./chunk-3ODWQVIA.mjs";
40
5
  export {
41
- sandboxActivityHook,
42
6
  sandboxLifecycleWorkflow
43
7
  };
44
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvbGlmZWN5Y2xlLXdvcmtmbG93LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBkZWZpbmVIb29rLCBGYXRhbEVycm9yLCBzbGVlcCB9IGZyb20gXCJ3b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBTYW5kYm94Q29uZmlnIH0gZnJvbSBcIi4uL3N0b3JhZ2UvcnBjXCI7XG5pbXBvcnQgdHlwZSB7IFNhbmRib3hMaWZlY3ljbGVJbnB1dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIHsgU2FuZGJveExpZmVjeWNsZUlucHV0IH07XG5cbmV4cG9ydCB0eXBlIFNhbmRib3hBY3Rpdml0eVNpZ25hbCA9IHtcbiAgdHlwZTogXCJhY3Rpdml0eVwiO1xuICBuZXdDb25maWc6IFNhbmRib3hDb25maWc7XG59O1xuXG5leHBvcnQgY29uc3Qgc2FuZGJveEFjdGl2aXR5SG9vayA9IGRlZmluZUhvb2s8U2FuZGJveEFjdGl2aXR5U2lnbmFsPigpO1xuXG5jb25zdCBERUZBVUxUX0lETEVfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlc1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FuZGJveExpZmVjeWNsZVdvcmtmbG93KHtcbiAgaW5wdXQsXG59OiB7XG4gIGlucHV0OiBTYW5kYm94TGlmZWN5Y2xlSW5wdXQ7XG59KSB7XG4gIFwidXNlIHdvcmtmbG93XCI7XG5cbiAgY29uc3QgYWN0aXZpdHlIb29rID0gc2FuZGJveEFjdGl2aXR5SG9vay5jcmVhdGUoeyB0b2tlbjogaW5wdXQuaWQgfSk7XG4gIGNvbnN0IGl0ZXJhdG9yID0gYWN0aXZpdHlIb29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICBsZXQgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgbGV0IHNhbmRib3hDb25maWcgPSBpbnB1dC5pbml0aWFsQ29uZmlnO1xuXG4gIGlmIChzYW5kYm94Q29uZmlnLnR5cGUgIT09IFwidmVyY2VsXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTYW5kYm94IGNvbmZpZyBpcyBub3QgYSBWZXJjZWwgc2FuZGJveFwiKTtcbiAgfVxuXG4gIGNvbnN0IGlkbGVUaW1lb3V0TXMgPVxuICAgIHNhbmRib3hDb25maWcubGlmZWN5Y2xlPy5zdG9wQWZ0ZXJJbmFjdGl2ZU1zID8/IERFRkFVTFRfSURMRV9USU1FT1VUX01TO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgIHBlbmRpbmdOZXh0LnRoZW4oKHIpID0+ICh7IC4uLnIsIHR5cGU6IFwiYWN0aXZpdHlcIiBhcyBjb25zdCB9KSksXG4gICAgICBzbGVlcChpZGxlVGltZW91dE1zKS50aGVuKCgpID0+ICh7IHR5cGU6IFwidGltZW91dFwiIGFzIGNvbnN0IH0pKSxcbiAgICBdKTtcblxuICAgIGlmIChyZXN1bHQudHlwZSA9PT0gXCJ0aW1lb3V0XCIpIHtcbiAgICAgIGNvbnN0IHsgc25hcHNob3RTYW5kYm94U3RlcCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4vbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzXCJcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbmFwc2hvdFNhbmRib3hTdGVwKGlucHV0KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBpZiAoRmF0YWxFcnJvci5pcyhlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTbmFwc2hvdCBmYWlsZWQgcGVybWFuZW50bHk6XCIsIGUubWVzc2FnZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc2FuZGJveENvbmZpZyA9IHJlc3VsdC52YWx1ZS5uZXdDb25maWc7XG4gICAgcGVuZGluZ05leHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLFlBQVksWUFBWSxhQUFhO0FBV3ZDLElBQU0sc0JBQXNCLFdBQWtDO0FBRXJFLElBQU0sMEJBQTBCLElBQUksS0FBSztBQUV6QyxlQUFzQix5QkFBeUI7QUFBQSxFQUM3QztBQUNGLEdBRUc7QUFDRDtBQUVBLFFBQU0sZUFBZSxvQkFBb0IsT0FBTyxFQUFFLE9BQU8sTUFBTSxHQUFHLENBQUM7QUFDbkUsUUFBTSxXQUFXLGFBQWEsT0FBTyxhQUFhLEVBQUU7QUFDcEQsTUFBSSxjQUFjLFNBQVMsS0FBSztBQUVoQyxNQUFJLGdCQUFnQixNQUFNO0FBRTFCLE1BQUksY0FBYyxTQUFTLFVBQVU7QUFDbkMsVUFBTSxJQUFJLE1BQU0sd0NBQXdDO0FBQUEsRUFDMUQ7QUFFQSxRQUFNLGdCQUNKLGNBQWMsV0FBVyx1QkFBdUI7QUFFbEQsU0FBTyxNQUFNO0FBQ1gsVUFBTSxTQUFTLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDaEMsWUFBWSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxNQUFNLFdBQW9CLEVBQUU7QUFBQSxNQUM3RCxNQUFNLGFBQWEsRUFBRSxLQUFLLE9BQU8sRUFBRSxNQUFNLFVBQW1CLEVBQUU7QUFBQSxJQUNoRSxDQUFDO0FBRUQsUUFBSSxPQUFPLFNBQVMsV0FBVztBQUM3QixZQUFNLEVBQUUsb0JBQW9CLElBQUksTUFBTSxPQUNwQyx5Q0FDRjtBQUNBLFlBQU0sb0JBQW9CLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTTtBQUM1QyxZQUFJLFdBQVcsR0FBRyxDQUFDLEdBQUc7QUFDcEIsa0JBQVEsTUFBTSxnQ0FBZ0MsRUFBRSxPQUFPO0FBQ3ZEO0FBQUEsUUFDRjtBQUNBLGNBQU07QUFBQSxNQUNSLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFFQSxRQUFJLE9BQU8sTUFBTTtBQUNmO0FBQUEsSUFDRjtBQUVBLG9CQUFnQixPQUFPLE1BQU07QUFDN0Isa0JBQWMsU0FBUyxLQUFLO0FBQUEsRUFDOUI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
8
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,235 @@
1
+ import "./chunk-3ODWQVIA.mjs";
2
+
3
+ // src/storage/bindings/local-fs-handlers.ts
4
+ import { mkdir, readdir, readFile, unlink, writeFile } from "node:fs/promises";
5
+ import { dirname, join, resolve } from "node:path";
6
+
7
+ // src/utils/paginate.ts
8
+ function paginate(opts) {
9
+ const { items, cursor, limit } = opts;
10
+ const startIndex = cursor ? items.findIndex((m) => m.id === cursor) + 1 : 0;
11
+ const sliced = limit !== void 0 ? items.slice(startIndex, startIndex + limit) : items.slice(startIndex);
12
+ const nextCursor = limit !== void 0 && startIndex + limit < items.length ? sliced.at(-1)?.id ?? null : null;
13
+ return { items: sliced, nextCursor };
14
+ }
15
+
16
+ // src/storage/bindings/local-fs-handlers.ts
17
+ function createFilesystemHandlers(basePath) {
18
+ const resolvedBase = resolve(basePath);
19
+ const sessionDir = join(resolvedBase, "session");
20
+ const messageDir = join(resolvedBase, "message");
21
+ const partDir = join(resolvedBase, "part");
22
+ const sandboxDir = join(resolvedBase, "sandbox");
23
+ const commandDir = join(resolvedBase, "command");
24
+ async function ensureDir(dir) {
25
+ await mkdir(dir, { recursive: true });
26
+ }
27
+ async function readJson(filePath) {
28
+ try {
29
+ const content = await readFile(filePath, "utf-8");
30
+ return JSON.parse(content);
31
+ } catch {
32
+ return null;
33
+ }
34
+ }
35
+ async function writeJsonFile(filePath, data) {
36
+ await ensureDir(dirname(filePath));
37
+ await writeFile(filePath, JSON.stringify(data, null, 2));
38
+ }
39
+ async function readAllFromDir(dir) {
40
+ try {
41
+ const files = await readdir(dir);
42
+ const results = await Promise.all(
43
+ files.filter((f) => f.endsWith(".json")).map((f) => readJson(join(dir, f)))
44
+ );
45
+ return results.filter((r) => r !== null);
46
+ } catch {
47
+ return [];
48
+ }
49
+ }
50
+ return {
51
+ "session.get": async ({ id }) => {
52
+ const sessionPath = join(sessionDir, `${id}.json`);
53
+ return await readJson(sessionPath) ?? null;
54
+ },
55
+ "session.set": async (session) => {
56
+ const now = Date.now();
57
+ const sessionPath = join(sessionDir, `${session.id}.json`);
58
+ const existing = await readJson(sessionPath);
59
+ const newSession = {
60
+ ...session,
61
+ tags: session.tags ?? existing?.tags ?? {},
62
+ createdAt: existing?.createdAt ?? session.createdAt ?? now,
63
+ updatedAt: now
64
+ };
65
+ await writeJsonFile(sessionPath, newSession);
66
+ return newSession;
67
+ },
68
+ "session.list": async ({ tags, cursor, limit }) => {
69
+ const allSessions = await readAllFromDir(sessionDir);
70
+ let filtered = allSessions;
71
+ if (tags && Object.keys(tags).length > 0) {
72
+ filtered = filtered.filter((s) => {
73
+ const sessionTags = s.tags ?? {};
74
+ return Object.entries(tags).every(
75
+ ([key, value]) => sessionTags[key] === value
76
+ );
77
+ });
78
+ }
79
+ filtered.sort((a, b) => a.createdAt - b.createdAt);
80
+ return paginate({ items: filtered, cursor, limit });
81
+ },
82
+ "session.listBySandbox": async ({ sandboxId, tags, cursor, limit }) => {
83
+ const allSessions = await readAllFromDir(sessionDir);
84
+ let filtered = allSessions.filter((s) => s.sandboxId === sandboxId);
85
+ if (tags && Object.keys(tags).length > 0) {
86
+ filtered = filtered.filter((s) => {
87
+ const sessionTags = s.tags ?? {};
88
+ return Object.entries(tags).every(
89
+ ([key, value]) => sessionTags[key] === value
90
+ );
91
+ });
92
+ }
93
+ filtered.sort((a, b) => a.createdAt - b.createdAt);
94
+ return paginate({ items: filtered, cursor, limit });
95
+ },
96
+ "session.tag.set": async ({ sessionId, tags }) => {
97
+ const sessionPath = join(sessionDir, `${sessionId}.json`);
98
+ const existing = await readJson(sessionPath);
99
+ if (!existing) {
100
+ throw new Error(`Session ${sessionId} not found`);
101
+ }
102
+ const mergedTags = { ...existing.tags, ...tags };
103
+ const now = Date.now();
104
+ const updatedSession = {
105
+ ...existing,
106
+ tags: mergedTags,
107
+ updatedAt: now
108
+ };
109
+ await writeJsonFile(sessionPath, updatedSession);
110
+ return updatedSession;
111
+ },
112
+ "message.get": async ({ id }) => {
113
+ return await readJson(join(messageDir, `${id}.json`));
114
+ },
115
+ "message.set": async (message) => {
116
+ await writeJsonFile(join(messageDir, `${message.id}.json`), message);
117
+ return message;
118
+ },
119
+ "message.list": async ({ sessionId, cursor, limit }) => {
120
+ const allMessages = await readAllFromDir(messageDir);
121
+ const filtered = allMessages.filter((m) => m.sessionId === sessionId).sort((a, b) => a.createdAt - b.createdAt);
122
+ return paginate({ items: filtered, cursor, limit });
123
+ },
124
+ "part.listByMessage": async ({ messageId, cursor, limit }) => {
125
+ const allParts = await readAllFromDir(partDir);
126
+ const filtered = allParts.filter((p) => p.messageId === messageId).sort((a, b) => a.index - b.index);
127
+ return paginate({ items: filtered, cursor, limit });
128
+ },
129
+ "part.listBySession": async ({ sessionId, cursor, limit }) => {
130
+ const allParts = await readAllFromDir(partDir);
131
+ const filtered = allParts.filter((p) => p.sessionId === sessionId).sort((a, b) => {
132
+ if (a.messageId !== b.messageId) {
133
+ return a.messageId.localeCompare(b.messageId);
134
+ }
135
+ return a.index - b.index;
136
+ });
137
+ return paginate({ items: filtered, cursor, limit });
138
+ },
139
+ "part.set": async (part) => {
140
+ await writeJsonFile(join(partDir, `${part.id}.json`), part);
141
+ return part;
142
+ },
143
+ "part.delete": async ({ id }) => {
144
+ try {
145
+ await unlink(join(partDir, `${id}.json`));
146
+ } catch {
147
+ }
148
+ },
149
+ "sandbox.get": async ({ key }) => {
150
+ const safeName = Buffer.from(key).toString("base64url");
151
+ const sandboxPath = join(sandboxDir, `${safeName}.json`);
152
+ const data = await readJson(sandboxPath);
153
+ if (!data) {
154
+ return null;
155
+ }
156
+ return data;
157
+ },
158
+ "sandbox.set": async (record) => {
159
+ const safeName = Buffer.from(record.id).toString("base64url");
160
+ const sandboxPath = join(sandboxDir, `${safeName}.json`);
161
+ const existing = await readJson(sandboxPath);
162
+ const newRecord = {
163
+ ...record,
164
+ tags: record.tags ?? existing?.tags ?? null
165
+ };
166
+ await writeJsonFile(sandboxPath, newRecord);
167
+ },
168
+ "sandbox.list": async ({ tags, order, cursor, limit }) => {
169
+ const allSandboxes = await readAllFromDir(sandboxDir);
170
+ let filtered = allSandboxes;
171
+ if (tags && Object.keys(tags).length > 0) {
172
+ filtered = filtered.filter((s) => {
173
+ const sandboxTags = s.tags ?? {};
174
+ return Object.entries(tags).every(
175
+ ([key, value]) => sandboxTags[key] === value
176
+ );
177
+ });
178
+ }
179
+ const sortField = order?.startsWith("lastActivityAt") ? "lastActivityAt" : "createdAt";
180
+ const sortDir = order?.endsWith("_desc") ? -1 : 1;
181
+ filtered.sort(
182
+ (a, b) => sortDir * ((a[sortField] ?? 0) - (b[sortField] ?? 0))
183
+ );
184
+ return paginate({ items: filtered, cursor, limit });
185
+ },
186
+ "sandbox.tag.set": async ({ sandboxId, tags }) => {
187
+ const safeName = Buffer.from(sandboxId).toString("base64url");
188
+ const sandboxPath = join(sandboxDir, `${safeName}.json`);
189
+ const existing = await readJson(sandboxPath);
190
+ if (!existing) {
191
+ throw new Error(`Sandbox ${sandboxId} not found`);
192
+ }
193
+ const mergedTags = { ...existing.tags, ...tags };
194
+ const updatedSandbox = {
195
+ ...existing,
196
+ tags: mergedTags
197
+ };
198
+ await writeJsonFile(sandboxPath, updatedSandbox);
199
+ return updatedSandbox;
200
+ },
201
+ "sandbox.getBySession": async ({ sessionId }) => {
202
+ const allSandboxes = await readAllFromDir(sandboxDir);
203
+ const matching = allSandboxes.filter(
204
+ (s) => s.id.startsWith(`${sessionId}-`)
205
+ );
206
+ if (matching.length === 0) {
207
+ return null;
208
+ }
209
+ matching.sort(
210
+ (a, b) => (b.lastActivityAt ?? 0) - (a.lastActivityAt ?? 0)
211
+ );
212
+ return matching[0];
213
+ },
214
+ "command.get": async ({ id }) => {
215
+ return await readJson(join(commandDir, `${id}.json`));
216
+ },
217
+ "command.set": async (command) => {
218
+ await writeJsonFile(join(commandDir, `${command.id}.json`), command);
219
+ return command;
220
+ },
221
+ "command.list": async ({ sessionId, includeFinished, cursor, limit }) => {
222
+ const allCommands = await readAllFromDir(commandDir);
223
+ let filtered = allCommands.filter((c) => c.sessionId === sessionId);
224
+ if (!includeFinished) {
225
+ filtered = filtered.filter((c) => c.status === "running");
226
+ }
227
+ filtered.sort((a, b) => a.startedAt - b.startedAt);
228
+ return paginate({ items: filtered, cursor, limit });
229
+ }
230
+ };
231
+ }
232
+ export {
233
+ createFilesystemHandlers
234
+ };
235
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwtZnMtaGFuZGxlcnMudHMiLCAiLi4vc3JjL3V0aWxzL3BhZ2luYXRlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYWdpbmF0ZSB9IGZyb20gXCIuLi8uLi91dGlscy9wYWdpbmF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kLFxuICBIYW5kbGVycyxcbiAgTWVzc2FnZSxcbiAgUGFydCxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbn0gZnJvbSBcIi4uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoYmFzZVBhdGg6IHN0cmluZyk6IEhhbmRsZXJzIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcmVzb2x2ZShiYXNlUGF0aCk7XG4gIGNvbnN0IHNlc3Npb25EaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzZXNzaW9uXCIpO1xuICBjb25zdCBtZXNzYWdlRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwibWVzc2FnZVwiKTtcbiAgY29uc3QgcGFydERpciA9IGpvaW4ocmVzb2x2ZWRCYXNlLCBcInBhcnRcIik7XG4gIGNvbnN0IHNhbmRib3hEaXIgPSBqb2luKHJlc29sdmVkQmFzZSwgXCJzYW5kYm94XCIpO1xuICBjb25zdCBjb21tYW5kRGlyID0gam9pbihyZXNvbHZlZEJhc2UsIFwiY29tbWFuZFwiKTtcblxuICBhc3luYyBmdW5jdGlvbiBlbnN1cmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZEpzb248VD4oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlSnNvbkZpbGUoZmlsZVBhdGg6IHN0cmluZywgZGF0YTogdW5rbm93bikge1xuICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKGZpbGVQYXRoKSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWFkQWxsRnJvbURpcjxUPihkaXI6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihkaXIpO1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlc1xuICAgICAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIuanNvblwiKSlcbiAgICAgICAgICAubWFwKChmKSA9PiByZWFkSnNvbjxUPihqb2luKGRpciwgZikpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigocik6IHIgaXMgTm9uTnVsbGFibGU8dHlwZW9mIHI+ID0+IHIgIT09IG51bGwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgXCJzZXNzaW9uLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7aWR9Lmpzb25gKTtcbiAgICAgIHJldHVybiAoYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpKSA/PyBudWxsO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24uc2V0XCI6IGFzeW5jIChzZXNzaW9uKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3Qgc2Vzc2lvblBhdGggPSBqb2luKHNlc3Npb25EaXIsIGAke3Nlc3Npb24uaWR9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2Vzc2lvbj4oc2Vzc2lvblBhdGgpO1xuICAgICAgY29uc3QgbmV3U2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgLi4uc2Vzc2lvbixcbiAgICAgICAgdGFnczogc2Vzc2lvbi50YWdzID8/IGV4aXN0aW5nPy50YWdzID8/IHt9LFxuICAgICAgICBjcmVhdGVkQXQ6IGV4aXN0aW5nPy5jcmVhdGVkQXQgPz8gc2Vzc2lvbi5jcmVhdGVkQXQgPz8gbm93LFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgIH07XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNlc3Npb25QYXRoLCBuZXdTZXNzaW9uKTtcbiAgICAgIHJldHVybiBuZXdTZXNzaW9uO1xuICAgIH0sXG5cbiAgICBcInNlc3Npb24ubGlzdFwiOiBhc3luYyAoeyB0YWdzLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFNlc3Npb25zID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2Vzc2lvbj4oc2Vzc2lvbkRpcik7XG4gICAgICBsZXQgZmlsdGVyZWQgPSBhbGxTZXNzaW9ucztcbiAgICAgIGlmICh0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uVGFncyA9IHMudGFncyA/PyB7fTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGFncykuZXZlcnkoXG4gICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBzZXNzaW9uVGFnc1trZXldID09PSB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwic2Vzc2lvbi5saXN0QnlTYW5kYm94XCI6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncywgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTZXNzaW9ucyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFNlc3Npb24+KHNlc3Npb25EaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsU2Vzc2lvbnMuZmlsdGVyKChzKSA9PiBzLnNhbmRib3hJZCA9PT0gc2FuZGJveElkKTtcbiAgICAgIGlmICh0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uVGFncyA9IHMudGFncyA/PyB7fTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGFncykuZXZlcnkoXG4gICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBzZXNzaW9uVGFnc1trZXldID09PSB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkQXQgLSBiLmNyZWF0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwic2Vzc2lvbi50YWcuc2V0XCI6IGFzeW5jICh7IHNlc3Npb25JZCwgdGFncyB9KSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uUGF0aCA9IGpvaW4oc2Vzc2lvbkRpciwgYCR7c2Vzc2lvbklkfS5qc29uYCk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRKc29uPFNlc3Npb24+KHNlc3Npb25QYXRoKTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7c2Vzc2lvbklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lcmdlZFRhZ3MgPSB7IC4uLmV4aXN0aW5nLnRhZ3MsIC4uLnRhZ3MgfTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGVkU2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgIHRhZ3M6IG1lcmdlZFRhZ3MsXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoc2Vzc2lvblBhdGgsIHVwZGF0ZWRTZXNzaW9uKTtcbiAgICAgIHJldHVybiB1cGRhdGVkU2Vzc2lvbjtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmdldFwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVhZEpzb248TWVzc2FnZT4oam9pbihtZXNzYWdlRGlyLCBgJHtpZH0uanNvbmApKTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLnNldFwiOiBhc3luYyAobWVzc2FnZSkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKG1lc3NhZ2VEaXIsIGAke21lc3NhZ2UuaWR9Lmpzb25gKSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9LFxuXG4gICAgXCJtZXNzYWdlLmxpc3RcIjogYXN5bmMgKHsgc2Vzc2lvbklkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8TWVzc2FnZT4obWVzc2FnZURpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbE1lc3NhZ2VzXG4gICAgICAgIC5maWx0ZXIoKG0pID0+IG0uc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmNyZWF0ZWRBdCAtIGIuY3JlYXRlZEF0KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0Lmxpc3RCeU1lc3NhZ2VcIjogYXN5bmMgKHsgbWVzc2FnZUlkLCBjdXJzb3IsIGxpbWl0IH0pID0+IHtcbiAgICAgIGNvbnN0IGFsbFBhcnRzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8UGFydD4ocGFydERpcik7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbFBhcnRzXG4gICAgICAgIC5maWx0ZXIoKHApID0+IHAubWVzc2FnZUlkID09PSBtZXNzYWdlSWQpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwicGFydC5saXN0QnlTZXNzaW9uXCI6IGFzeW5jICh7IHNlc3Npb25JZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxQYXJ0cyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPFBhcnQ+KHBhcnREaXIpO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBhbGxQYXJ0c1xuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGlmIChhLm1lc3NhZ2VJZCAhPT0gYi5tZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm1lc3NhZ2VJZC5sb2NhbGVDb21wYXJlKGIubWVzc2FnZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O1xuICAgICAgICB9KTtcbiAgICAgIHJldHVybiBwYWdpbmF0ZSh7IGl0ZW1zOiBmaWx0ZXJlZCwgY3Vyc29yLCBsaW1pdCB9KTtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LnNldFwiOiBhc3luYyAocGFydCkgPT4ge1xuICAgICAgYXdhaXQgd3JpdGVKc29uRmlsZShqb2luKHBhcnREaXIsIGAke3BhcnQuaWR9Lmpzb25gKSwgcGFydCk7XG4gICAgICByZXR1cm4gcGFydDtcbiAgICB9LFxuXG4gICAgXCJwYXJ0LmRlbGV0ZVwiOiBhc3luYyAoeyBpZCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB1bmxpbmsoam9pbihwYXJ0RGlyLCBgJHtpZH0uanNvbmApKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmUgaWYgZmlsZSBkb2Vzbid0IGV4aXN0XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwic2FuZGJveC5nZXRcIjogYXN5bmMgKHsga2V5IH0pID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20oa2V5KS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRKc29uPFNhbmRib3hSZWNvcmQ+KHNhbmRib3hQYXRoKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3guc2V0XCI6IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gQnVmZmVyLmZyb20ocmVjb3JkLmlkKS50b1N0cmluZyhcImJhc2U2NHVybFwiKTtcbiAgICAgIGNvbnN0IHNhbmRib3hQYXRoID0gam9pbihzYW5kYm94RGlyLCBgJHtzYWZlTmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSnNvbjxTYW5kYm94UmVjb3JkPihzYW5kYm94UGF0aCk7XG4gICAgICBjb25zdCBuZXdSZWNvcmQ6IFNhbmRib3hSZWNvcmQgPSB7XG4gICAgICAgIC4uLnJlY29yZCxcbiAgICAgICAgdGFnczogcmVjb3JkLnRhZ3MgPz8gZXhpc3Rpbmc/LnRhZ3MgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKHNhbmRib3hQYXRoLCBuZXdSZWNvcmQpO1xuICAgIH0sXG5cbiAgICBcInNhbmRib3gubGlzdFwiOiBhc3luYyAoeyB0YWdzLCBvcmRlciwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxTYW5kYm94ZXMgPSBhd2FpdCByZWFkQWxsRnJvbURpcjxTYW5kYm94UmVjb3JkPihzYW5kYm94RGlyKTtcbiAgICAgIGxldCBmaWx0ZXJlZCA9IGFsbFNhbmRib3hlcztcbiAgICAgIGlmICh0YWdzICYmIE9iamVjdC5rZXlzKHRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBzYW5kYm94VGFncyA9IHMudGFncyA/PyB7fTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGFncykuZXZlcnkoXG4gICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiBzYW5kYm94VGFnc1trZXldID09PSB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gb3JkZXI/LnN0YXJ0c1dpdGgoXCJsYXN0QWN0aXZpdHlBdFwiKVxuICAgICAgICA/IFwibGFzdEFjdGl2aXR5QXRcIlxuICAgICAgICA6IFwiY3JlYXRlZEF0XCI7XG4gICAgICBjb25zdCBzb3J0RGlyID0gb3JkZXI/LmVuZHNXaXRoKFwiX2Rlc2NcIikgPyAtMSA6IDE7XG4gICAgICBmaWx0ZXJlZC5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gc29ydERpciAqICgoYVtzb3J0RmllbGRdID8/IDApIC0gKGJbc29ydEZpZWxkXSA/PyAwKSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcblxuICAgIFwic2FuZGJveC50YWcuc2V0XCI6IGFzeW5jICh7IHNhbmRib3hJZCwgdGFncyB9KSA9PiB7XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IEJ1ZmZlci5mcm9tKHNhbmRib3hJZCkudG9TdHJpbmcoXCJiYXNlNjR1cmxcIik7XG4gICAgICBjb25zdCBzYW5kYm94UGF0aCA9IGpvaW4oc2FuZGJveERpciwgYCR7c2FmZU5hbWV9Lmpzb25gKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEpzb248U2FuZGJveFJlY29yZD4oc2FuZGJveFBhdGgpO1xuICAgICAgaWYgKCFleGlzdGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNhbmRib3ggJHtzYW5kYm94SWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZXhpc3RpbmcudGFncywgLi4udGFncyB9O1xuICAgICAgY29uc3QgdXBkYXRlZFNhbmRib3g6IFNhbmRib3hSZWNvcmQgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICB0YWdzOiBtZXJnZWRUYWdzLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHdyaXRlSnNvbkZpbGUoc2FuZGJveFBhdGgsIHVwZGF0ZWRTYW5kYm94KTtcbiAgICAgIHJldHVybiB1cGRhdGVkU2FuZGJveDtcbiAgICB9LFxuXG4gICAgXCJzYW5kYm94LmdldEJ5U2Vzc2lvblwiOiBhc3luYyAoeyBzZXNzaW9uSWQgfSkgPT4ge1xuICAgICAgY29uc3QgYWxsU2FuZGJveGVzID0gYXdhaXQgcmVhZEFsbEZyb21EaXI8U2FuZGJveFJlY29yZD4oc2FuZGJveERpcik7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IGFsbFNhbmRib3hlcy5maWx0ZXIoKHMpID0+XG4gICAgICAgIHMuaWQuc3RhcnRzV2l0aChgJHtzZXNzaW9uSWR9LWApXG4gICAgICApO1xuICAgICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIG1hdGNoaW5nLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiAoYi5sYXN0QWN0aXZpdHlBdCA/PyAwKSAtIChhLmxhc3RBY3Rpdml0eUF0ID8/IDApXG4gICAgICApO1xuICAgICAgcmV0dXJuIG1hdGNoaW5nWzBdO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuZ2V0XCI6IGFzeW5jICh7IGlkIH0pID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZWFkSnNvbjxDb21tYW5kPihqb2luKGNvbW1hbmREaXIsIGAke2lkfS5qc29uYCkpO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQuc2V0XCI6IGFzeW5jIChjb21tYW5kKSA9PiB7XG4gICAgICBhd2FpdCB3cml0ZUpzb25GaWxlKGpvaW4oY29tbWFuZERpciwgYCR7Y29tbWFuZC5pZH0uanNvbmApLCBjb21tYW5kKTtcbiAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH0sXG5cbiAgICBcImNvbW1hbmQubGlzdFwiOiBhc3luYyAoeyBzZXNzaW9uSWQsIGluY2x1ZGVGaW5pc2hlZCwgY3Vyc29yLCBsaW1pdCB9KSA9PiB7XG4gICAgICBjb25zdCBhbGxDb21tYW5kcyA9IGF3YWl0IHJlYWRBbGxGcm9tRGlyPENvbW1hbmQ+KGNvbW1hbmREaXIpO1xuICAgICAgbGV0IGZpbHRlcmVkID0gYWxsQ29tbWFuZHMuZmlsdGVyKChjKSA9PiBjLnNlc3Npb25JZCA9PT0gc2Vzc2lvbklkKTtcbiAgICAgIGlmICghaW5jbHVkZUZpbmlzaGVkKSB7XG4gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWQuc29ydCgoYSwgYikgPT4gYS5zdGFydGVkQXQgLSBiLnN0YXJ0ZWRBdCk7XG4gICAgICByZXR1cm4gcGFnaW5hdGUoeyBpdGVtczogZmlsdGVyZWQsIGN1cnNvciwgbGltaXQgfSk7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpc3RSZXN1bHQgfSBmcm9tIFwiLi4vc3RvcmFnZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFnaW5hdGU8VCBleHRlbmRzIHsgaWQ6IHN0cmluZyB9PihvcHRzOiB7XG4gIGl0ZW1zOiBUW107XG4gIGN1cnNvcj86IHN0cmluZztcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogTGlzdFJlc3VsdDxUPiB7XG4gIGNvbnN0IHsgaXRlbXMsIGN1cnNvciwgbGltaXQgfSA9IG9wdHM7XG4gIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJzb3IgPyBpdGVtcy5maW5kSW5kZXgoKG0pID0+IG0uaWQgPT09IGN1cnNvcikgKyAxIDogMDtcbiAgY29uc3Qgc2xpY2VkID1cbiAgICBsaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBsaW1pdClcbiAgICAgIDogaXRlbXMuc2xpY2Uoc3RhcnRJbmRleCk7XG4gIGNvbnN0IG5leHRDdXJzb3IgPVxuICAgIGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgc3RhcnRJbmRleCArIGxpbWl0IDwgaXRlbXMubGVuZ3RoXG4gICAgICA/IChzbGljZWQuYXQoLTEpPy5pZCA/PyBudWxsKVxuICAgICAgOiBudWxsO1xuICByZXR1cm4geyBpdGVtczogc2xpY2VkLCBuZXh0Q3Vyc29yIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFBQSxTQUFTLE9BQU8sU0FBUyxVQUFVLFFBQVEsaUJBQWlCO0FBQzVELFNBQVMsU0FBUyxNQUFNLGVBQWU7OztBQ0NoQyxTQUFTLFNBQW1DLE1BSWpDO0FBQ2hCLFFBQU0sRUFBRSxPQUFPLFFBQVEsTUFBTSxJQUFJO0FBQ2pDLFFBQU0sYUFBYSxTQUFTLE1BQU0sVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLE1BQU0sSUFBSSxJQUFJO0FBQzFFLFFBQU0sU0FDSixVQUFVLFNBQ04sTUFBTSxNQUFNLFlBQVksYUFBYSxLQUFLLElBQzFDLE1BQU0sTUFBTSxVQUFVO0FBQzVCLFFBQU0sYUFDSixVQUFVLFVBQWEsYUFBYSxRQUFRLE1BQU0sU0FDN0MsT0FBTyxHQUFHLEVBQUUsR0FBRyxNQUFNLE9BQ3RCO0FBQ04sU0FBTyxFQUFFLE9BQU8sUUFBUSxXQUFXO0FBQ3JDOzs7QUROTyxTQUFTLHlCQUF5QixVQUE0QjtBQUNuRSxRQUFNLGVBQWUsUUFBUSxRQUFRO0FBQ3JDLFFBQU0sYUFBYSxLQUFLLGNBQWMsU0FBUztBQUMvQyxRQUFNLGFBQWEsS0FBSyxjQUFjLFNBQVM7QUFDL0MsUUFBTSxVQUFVLEtBQUssY0FBYyxNQUFNO0FBQ3pDLFFBQU0sYUFBYSxLQUFLLGNBQWMsU0FBUztBQUMvQyxRQUFNLGFBQWEsS0FBSyxjQUFjLFNBQVM7QUFFL0MsaUJBQWUsVUFBVSxLQUFhO0FBQ3BDLFVBQU0sTUFBTSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxFQUN0QztBQUVBLGlCQUFlLFNBQVksVUFBcUM7QUFDOUQsUUFBSTtBQUNGLFlBQU0sVUFBVSxNQUFNLFNBQVMsVUFBVSxPQUFPO0FBQ2hELGFBQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxJQUMzQixRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBRUEsaUJBQWUs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
@@ -0,0 +1,14 @@
1
+ type LoaderOptions = {
2
+ debug?: boolean;
3
+ };
4
+ type LoaderContext = {
5
+ resourcePath: string;
6
+ getOptions(): LoaderOptions;
7
+ };
8
+ /**
9
+ * Webpack/Turbopack loader that wires up agent.rpc by requiring steps.js
10
+ * at the END of the file. Using require() avoids import hoisting issues.
11
+ */
12
+ declare function agentRpcLoader(this: LoaderContext, source: string): string;
13
+
14
+ export { agentRpcLoader as default };
@@ -0,0 +1,14 @@
1
+ type LoaderOptions = {
2
+ debug?: boolean;
3
+ };
4
+ type LoaderContext = {
5
+ resourcePath: string;
6
+ getOptions(): LoaderOptions;
7
+ };
8
+ /**
9
+ * Webpack/Turbopack loader that wires up agent.rpc by requiring steps.js
10
+ * at the END of the file. Using require() avoids import hoisting issues.
11
+ */
12
+ declare function agentRpcLoader(this: LoaderContext, source: string): string;
13
+
14
+ export { agentRpcLoader as default };
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/next/loader.ts
31
+ var loader_exports = {};
32
+ __export(loader_exports, {
33
+ default: () => agentRpcLoader
34
+ });
35
+ module.exports = __toCommonJS(loader_exports);
36
+ var path = __toESM(require("path"));
37
+ var import_core = require("@swc/core");
38
+
39
+ // package.json
40
+ var package_default = {
41
+ name: "experimental-agent",
42
+ version: "0.0.4",
43
+ main: "./dist/index.js",
44
+ module: "./dist/index.mjs",
45
+ types: "./dist/index.d.ts",
46
+ sideEffects: true,
47
+ license: "MIT",
48
+ files: [
49
+ "dist/**"
50
+ ],
51
+ exports: {
52
+ ".": {
53
+ types: "./dist/index.d.ts",
54
+ import: "./dist/index.mjs",
55
+ require: "./dist/index.js"
56
+ },
57
+ "./next": {
58
+ types: "./dist/next.d.ts",
59
+ import: "./dist/next.mjs",
60
+ require: "./dist/next.js"
61
+ },
62
+ "./next/loader": {
63
+ types: "./dist/next/loader.d.ts",
64
+ import: "./dist/next/loader.mjs",
65
+ require: "./dist/next/loader.js"
66
+ },
67
+ "./client": {
68
+ types: "./dist/client.d.ts",
69
+ import: "./dist/client.mjs",
70
+ require: "./dist/client.js"
71
+ }
72
+ },
73
+ scripts: {
74
+ build: "tsup",
75
+ dev: "tsup --watch",
76
+ clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
77
+ release: "pnpm build && npm publish",
78
+ typecheck: "tsc --noEmit",
79
+ test: "vitest run",
80
+ "test:watch": "vitest"
81
+ },
82
+ dependencies: {
83
+ "@hono/node-server": "^1.19.9",
84
+ "@swc/core": "^1.10.0",
85
+ "@vercel/oidc": "^3.1.0",
86
+ "better-all": "^0.0.5",
87
+ errore: "^0.8.2",
88
+ "fast-deep-equal": "^3.1.3",
89
+ glob: "^11.0.0",
90
+ hono: "^4.11.6",
91
+ sandbox: "^1.0.18",
92
+ ulid: "^3.0.2",
93
+ zod: "^4.3.6"
94
+ },
95
+ devDependencies: {
96
+ "@agent/tsconfig": "workspace:*",
97
+ "@types/node": "^20.11.24",
98
+ dotenv: "^17.2.3",
99
+ next: "^16.0.0",
100
+ tsup: "^8.0.2",
101
+ "type-fest": "^5.4.2",
102
+ typescript: "5.5.4",
103
+ vitest: "^3.0.0"
104
+ },
105
+ peerDependencies: {
106
+ ai: "^6.0.0",
107
+ workflow: "https://workflow-docs-7evupb64d.vercel.sh/workflow.tgz"
108
+ },
109
+ publishConfig: {
110
+ access: "public"
111
+ }
112
+ };
113
+
114
+ // src/next/loader.ts
115
+ var PACKAGE_NAME = package_default.name;
116
+ var AGENT_PROTOCOL_VERSION = "v1";
117
+ var TYPESCRIPT_EXT_REGEX = /\.(ts|tsx|mts|cts)$/;
118
+ function agentRpcLoader(source) {
119
+ const { debug } = this.getOptions();
120
+ const log = debug ? (...args) => console.log("[agent-loader]", ...args) : () => void 0;
121
+ log("processing:", this.resourcePath);
122
+ if (!source.includes(PACKAGE_NAME)) {
123
+ log("skipping - no package name");
124
+ return source;
125
+ }
126
+ const filename = this.resourcePath;
127
+ const isTypeScript = TYPESCRIPT_EXT_REGEX.test(filename);
128
+ let ast;
129
+ try {
130
+ ast = (0, import_core.parseSync)(source, {
131
+ syntax: isTypeScript ? "typescript" : "ecmascript",
132
+ tsx: filename.endsWith(".tsx"),
133
+ jsx: filename.endsWith(".jsx")
134
+ });
135
+ } catch {
136
+ return source;
137
+ }
138
+ const agentExports = findAgentExports(ast);
139
+ if (agentExports.length === 0) {
140
+ log("skipping - no agent exports");
141
+ return source;
142
+ }
143
+ log("found agent exports:", agentExports);
144
+ const fileDir = path.dirname(filename);
145
+ const srcIndex = filename.lastIndexOf(`${path.sep}src${path.sep}`);
146
+ if (srcIndex === -1) {
147
+ log("skipping - no src dir found");
148
+ return source;
149
+ }
150
+ const srcDir = filename.substring(0, srcIndex + 4);
151
+ const appDir = path.join(srcDir, "app");
152
+ const stepsPath = path.join(
153
+ appDir,
154
+ ".well-known",
155
+ "agent",
156
+ AGENT_PROTOCOL_VERSION,
157
+ "steps.js"
158
+ );
159
+ let relativePath = path.relative(fileDir, stepsPath).replace(/\\/g, "/");
160
+ if (!(relativePath.startsWith("./") || relativePath.startsWith("../"))) {
161
+ relativePath = `./${relativePath}`;
162
+ }
163
+ const initCalls = agentExports.map((name) => {
164
+ const initName = `__init${name[0].toUpperCase()}${name.slice(1)}`;
165
+ return `${initName}(${name});`;
166
+ }).join("\n");
167
+ const initImports = agentExports.map((name) => `__init${name[0].toUpperCase()}${name.slice(1)}`).join(", ");
168
+ log("injecting init calls for:", agentExports);
169
+ return `${source}
170
+ import { ${initImports} } from "${relativePath}";
171
+ ${initCalls}`;
172
+ }
173
+ function findAgentExports(ast) {
174
+ let agentLocalName = null;
175
+ for (const item of ast.body) {
176
+ if (item.type === "ImportDeclaration" && item.source.value === PACKAGE_NAME) {
177
+ for (const specifier of item.specifiers) {
178
+ if (specifier.type === "ImportSpecifier") {
179
+ const imported = specifier.imported?.type === "Identifier" ? specifier.imported.value : specifier.local.value;
180
+ if (imported === "agent") {
181
+ agentLocalName = specifier.local.value;
182
+ break;
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ if (!agentLocalName) {
189
+ return [];
190
+ }
191
+ const exports = [];
192
+ for (const item of ast.body) {
193
+ if (item.type === "ExportDeclaration" && item.declaration) {
194
+ const decl = item.declaration;
195
+ if (decl.type === "VariableDeclaration") {
196
+ for (const declarator of decl.declarations) {
197
+ if (declarator.id.type === "Identifier" && declarator.init?.type === "CallExpression" && declarator.init.callee.type === "Identifier" && declarator.init.callee.value === agentLocalName) {
198
+ exports.push(declarator.id.value);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+ return exports;
205
+ }
206
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL25leHQvbG9hZGVyLnRzIiwgIi4uLy4uL3BhY2thZ2UuanNvbiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyB0eXBlIE1vZHVsZSwgcGFyc2VTeW5jIH0gZnJvbSBcIkBzd2MvY29yZVwiO1xuaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCI7XG5cbnR5cGUgTG9hZGVyT3B0aW9ucyA9IHtcbiAgZGVidWc/OiBib29sZWFuO1xufTtcblxudHlwZSBMb2FkZXJDb250ZXh0ID0ge1xuICByZXNvdXJjZVBhdGg6IHN0cmluZztcbiAgZ2V0T3B0aW9ucygpOiBMb2FkZXJPcHRpb25zO1xufTtcblxuY29uc3QgUEFDS0FHRV9OQU1FID0gcGtnLm5hbWU7XG5jb25zdCBBR0VOVF9QUk9UT0NPTF9WRVJTSU9OID0gXCJ2MVwiO1xuY29uc3QgVFlQRVNDUklQVF9FWFRfUkVHRVggPSAvXFwuKHRzfHRzeHxtdHN8Y3RzKSQvO1xuXG4vKipcbiAqIFdlYnBhY2svVHVyYm9wYWNrIGxvYWRlciB0aGF0IHdpcmVzIHVwIGFnZW50LnJwYyBieSByZXF1aXJpbmcgc3RlcHMuanNcbiAqIGF0IHRoZSBFTkQgb2YgdGhlIGZpbGUuIFVzaW5nIHJlcXVpcmUoKSBhdm9pZHMgaW1wb3J0IGhvaXN0aW5nIGlzc3Vlcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWdlbnRScGNMb2FkZXIoXG4gIHRoaXM6IExvYWRlckNvbnRleHQsXG4gIHNvdXJjZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCB7IGRlYnVnIH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgY29uc3QgbG9nID0gZGVidWdcbiAgICA/ICguLi5hcmdzOiB1bmtub3duW10pID0+IGNvbnNvbGUubG9nKFwiW2FnZW50LWxvYWRlcl1cIiwgLi4uYXJncylcbiAgICA6ICgpID0+IHVuZGVmaW5lZDtcblxuICBsb2coXCJwcm9jZXNzaW5nOlwiLCB0aGlzLnJlc291cmNlUGF0aCk7XG5cbiAgaWYgKCFzb3VyY2UuaW5jbHVkZXMoUEFDS0FHRV9OQU1FKSkge1xuICAgIGxvZyhcInNraXBwaW5nIC0gbm8gcGFja2FnZSBuYW1lXCIpO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICBjb25zdCBmaWxlbmFtZSA9IHRoaXMucmVzb3VyY2VQYXRoO1xuICBjb25zdCBpc1R5cGVTY3JpcHQgPSBUWVBFU0NSSVBUX0VYVF9SRUdFWC50ZXN0KGZpbGVuYW1lKTtcblxuICBsZXQgYXN0OiBNb2R1bGU7XG4gIHRyeSB7XG4gICAgYXN0ID0gcGFyc2VTeW5jKHNvdXJjZSwge1xuICAgICAgc3ludGF4OiBpc1R5cGVTY3JpcHQgPyBcInR5cGVzY3JpcHRcIiA6IFwiZWNtYXNjcmlwdFwiLFxuICAgICAgdHN4OiBmaWxlbmFtZS5lbmRzV2l0aChcIi50c3hcIiksXG4gICAgICBqc3g6IGZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzeFwiKSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0IGFnZW50RXhwb3J0cyA9IGZpbmRBZ2VudEV4cG9ydHMoYXN0KTtcbiAgaWYgKGFnZW50RXhwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2coXCJza2lwcGluZyAtIG5vIGFnZW50IGV4cG9ydHNcIik7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGxvZyhcImZvdW5kIGFnZW50IGV4cG9ydHM6XCIsIGFnZW50RXhwb3J0cyk7XG5cbiAgLy8gQ2FsY3VsYXRlIHBhdGggdG8gc3RlcHMuanNcbiAgY29uc3QgZmlsZURpciA9IHBhdGguZGlybmFtZShmaWxlbmFtZSk7XG4gIGNvbnN0IHNyY0luZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoYCR7cGF0aC5zZXB9c3JjJHtwYXRoLnNlcH1gKTtcbiAgaWYgKHNyY0luZGV4ID09PSAtMSkge1xuICAgIGxvZyhcInNraXBwaW5nIC0gbm8gc3JjIGRpciBmb3VuZFwiKTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgY29uc3Qgc3JjRGlyID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIHNyY0luZGV4ICsgNCk7XG4gIGNvbnN0IGFwcERpciA9IHBhdGguam9pbihzcmNEaXIsIFwiYXBwXCIpO1xuICBjb25zdCBzdGVwc1BhdGggPSBwYXRoLmpvaW4oXG4gICAgYXBwRGlyLFxuICAgIFwiLndlbGwta25vd25cIixcbiAgICBcImFnZW50XCIsXG4gICAgQUdFTlRfUFJPVE9DT0xfVkVSU0lPTixcbiAgICBcInN0ZXBzLmpzXCJcbiAgKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc3RlcHNQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICBpZiAoIShyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cblxuICAvLyBJbXBvcnQgdGhlIGluaXQgZnVuY3Rpb24gZnJvbSBzdGVwcy5qcyBhbmQgY2FsbCBpdCBmb3IgZWFjaCBhZ2VudFxuICAvLyBzdGVwcy5qcyBubyBsb25nZXIgaW1wb3J0cyB0aGUgYWdlbnQsIHNvIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3lcbiAgY29uc3QgaW5pdENhbGxzID0gYWdlbnRFeHBvcnRzXG4gICAgLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgaW5pdE5hbWUgPSBgX19pbml0JHtuYW1lWzBdLnRvVXBwZXJDYXNlKCl9JHtuYW1lLnNsaWNlKDEpfWA7XG4gICAgICByZXR1cm4gYCR7aW5pdE5hbWV9KCR7bmFtZX0pO2A7XG4gICAgfSlcbiAgICAuam9pbihcIlxcblwiKTtcblxuICBjb25zdCBpbml0SW1wb3J0cyA9IGFnZW50RXhwb3J0c1xuICAgIC5tYXAoKG5hbWUpID0+IGBfX2luaXQke25hbWVbMF0udG9VcHBlckNhc2UoKX0ke25hbWUuc2xpY2UoMSl9YClcbiAgICAuam9pbihcIiwgXCIpO1xuXG4gIGxvZyhcImluamVjdGluZyBpbml0IGNhbGxzIGZvcjpcIiwgYWdlbnRFeHBvcnRzKTtcbiAgcmV0dXJuIGAke3NvdXJjZX1cbmltcG9ydCB7ICR7aW5pdEltcG9ydHN9IH0gZnJvbSBcIiR7cmVsYXRpdmVQYXRofVwiO1xuJHtpbml0Q2FsbHN9YDtcbn1cblxuZnVuY3Rpb24gZmluZEFnZW50RXhwb3J0cyhhc3Q6IE1vZHVsZSk6IHN0cmluZ1tdIHtcbiAgbGV0IGFnZW50TG9jYWxOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXN0LmJvZHkpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtLnR5cGUgPT09IFwiSW1wb3J0RGVjbGFyYXRpb25cIiAmJlxuICAgICAgaXRlbS5zb3VyY2UudmFsdWUgPT09IFBBQ0tBR0VfTkFNRVxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBzcGVjaWZpZXIgb2YgaXRlbS5zcGVjaWZpZXJzKSB7XG4gICAgICAgIGlmIChzcGVjaWZpZXIudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICAgIGNvbnN0IGltcG9ydGVkID1cbiAgICAgICAgICAgIHNwZWNpZmllci5pbXBvcnRlZD8udHlwZSA9PT0gXCJJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgPyBzcGVjaWZpZXIuaW1wb3J0ZWQudmFsdWVcbiAgICAgICAgICAgICAgOiBzcGVjaWZpZXIubG9jYWwudmFsdWU7XG5cbiAgICAgICAgICBpZiAoaW1wb3J0ZWQgPT09IFwiYWdlbnRcIikge1xuICAgICAgICAgICAgYWdlbnRMb2NhbE5hbWUgPSBzcGVjaWZpZXIubG9jYWwudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWFnZW50TG9jYWxOYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZXhwb3J0czogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXN0LmJvZHkpIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcIkV4cG9ydERlY2xhcmF0aW9uXCIgJiYgaXRlbS5kZWNsYXJhdGlvbikge1xuICAgICAgY29uc3QgZGVjbCA9IGl0ZW0uZGVjbGFyYXRpb247XG4gICAgICBpZiAoZGVjbC50eXBlID09PSBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIikge1xuICAgICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0b3Igb2YgZGVjbC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmlkLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmluaXQ/LnR5cGUgPT09IFwiQ2FsbEV4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICAgZGVjbGFyYXRvci5pbml0LmNhbGxlZS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICAgZGVjbGFyYXRvci5pbml0LmNhbGxlZS52YWx1ZSA9PT0gYWdlbnRMb2NhbE5hbWVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4cG9ydHMucHVzaChkZWNsYXJhdG9yLmlkLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwb3J0cztcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjAuNFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9uZXh0Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQuanNcIlxuICAgIH0sXG4gICAgXCIuL25leHQvbG9hZGVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuanNcIlxuICAgIH0sXG4gICAgXCIuL2NsaWVudFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGhvbm8vbm9kZS1zZXJ2ZXJcIjogXCJeMS4xOS45XCIsXG4gICAgXCJAc3djL2NvcmVcIjogXCJeMS4xMC4wXCIsXG4gICAgXCJAdmVyY2VsL29pZGNcIjogXCJeMy4xLjBcIixcbiAgICBcImJldHRlci1hbGxcIjogXCJeMC4wLjVcIixcbiAgICBcImVycm9yZVwiOiBcIl4wLjguMlwiLFxuICAgIFwiZmFzdC1kZWVwLWVxdWFsXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwiaG9ub1wiOiBcIl40LjExLjZcIixcbiAgICBcInNhbmRib3hcIjogXCJeMS4wLjE4XCIsXG4gICAgXCJ1bGlkXCI6IFwiXjMuMC4yXCIsXG4gICAgXCJ6b2RcIjogXCJeNC4zLjZcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYWdlbnQvdHNjb25maWdcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMTEuMjRcIixcbiAgICBcImRvdGVudlwiOiBcIl4xNy4yLjNcIixcbiAgICBcIm5leHRcIjogXCJeMTYuMC4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMC4yXCIsXG4gICAgXCJ0eXBlLWZlc3RcIjogXCJeNS40LjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjUuNFwiLFxuICAgIFwidml0ZXN0XCI6IFwiXjMuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImFpXCI6IFwiXjYuMC4wXCIsXG4gICAgXCJ3b3JrZmxvd1wiOiBcImh0dHBzOi8vd29ya2Zsb3ctZG9jcy03ZXZ1cGI2NGQudmVyY2VsLnNoL3dvcmtmbG93LnRnelwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsV0FBc0I7QUFDdEIsa0JBQXVDOzs7QUNEdkM7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLE1BQVE7QUFBQSxFQUNSLFFBQVU7QUFBQSxFQUNWLE9BQVM7QUFBQSxFQUNULGFBQWU7QUFBQSxFQUNmLFNBQVc7QUFBQSxFQUNYLE9BQVM7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBVztBQUFBLElBQ1QsS0FBSztBQUFBLE1BQ0gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxNQUNmLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFNBQVc7QUFBQSxJQUNULE9BQVM7QUFBQSxJQUNULEtBQU87QUFBQSxJQUNQLE9BQVM7QUFBQSxJQUNULFNBQVc7QUFBQSxJQUNYLFdBQWE7QUFBQSxJQUNiLE1BQVE7QUFBQSxJQUNSLGNBQWM7QUFBQSxFQUNoQjtBQUFBLEVBQ0EsY0FBZ0I7QUFBQSxJQUNkLHFCQUFxQjtBQUFBLElBQ3JCLGFBQWE7QUFBQSxJQUNiLGdCQUFnQjtBQUFBLElBQ2hCLGNBQWM7QUFBQSxJQUNkLFFBQVU7QUFB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