@novator-ai/memtask-cli 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/README.md +96 -0
- package/dist/bin/memtask.d.ts +2 -0
- package/dist/bin/memtask.js +8 -0
- package/dist/bin/memtask.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +402 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/args.d.ts +9 -0
- package/dist/lib/args.js +106 -0
- package/dist/lib/args.js.map +1 -0
- package/dist/lib/config.d.ts +23 -0
- package/dist/lib/config.js +42 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +5 -0
- package/dist/lib/errors.js +15 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/http.d.ts +13 -0
- package/dist/lib/http.js +56 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/io.d.ts +6 -0
- package/dist/lib/io.js +83 -0
- package/dist/lib/io.js.map +1 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# MemTask CLI
|
|
2
|
+
|
|
3
|
+
MemTask CLI creates Task Rooms from local context, pulls scoped handoff packets for external agents, pushes results back into the same room, and can run a lightweight pull worker.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @novator-ai/memtask-cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
During local development:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm --workspace @novator-ai/memtask-cli run build
|
|
15
|
+
node packages/cli/dist/bin/memtask.js --help
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Configure
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
memtask login --email you@example.com
|
|
22
|
+
memtask doctor
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use a non-default backend when testing:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
memtask login --api-url https://YOUR_CONVEX_SITE.convex.site/cli/v1 --email you@example.com
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The config file is stored at `~/.memtask/config.json` with `0600` permissions. You can override it with `MEMTASK_CONFIG`.
|
|
32
|
+
|
|
33
|
+
## v0.1 Commands
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
memtask room create --workflow failure --from error.log
|
|
37
|
+
memtask packet pull <room-id> --out packet.md
|
|
38
|
+
memtask result push <room-id> --summary result.md --artifact patch.diff
|
|
39
|
+
memtask doctor --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Supported workflow aliases:
|
|
43
|
+
|
|
44
|
+
- `support`, `support-to-code`
|
|
45
|
+
- `failure`, `failure-room`
|
|
46
|
+
- `founder`, `founder-ticket`
|
|
47
|
+
- `review`, `scope`, `bug`, `general`
|
|
48
|
+
|
|
49
|
+
## v0.2 Commands
|
|
50
|
+
|
|
51
|
+
Create an external-agent connection:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
memtask worker connect --name "Local coding agent"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Run a pull worker once:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
memtask worker run --once --exec 'codex exec < "$MEMTASK_PACKET_PATH"'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Run continuously:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
memtask worker run --exec 'your-agent-command < "$MEMTASK_PACKET_PATH"'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The worker command provides:
|
|
70
|
+
|
|
71
|
+
- `MEMTASK_PACKET_PATH`
|
|
72
|
+
- `MEMTASK_INVOCATION_ID`
|
|
73
|
+
- `MEMTASK_STEP_ID`
|
|
74
|
+
- `MEMTASK_CONNECTION_ID`
|
|
75
|
+
- `MEMTASK_GATEWAY_BASE_URL`
|
|
76
|
+
|
|
77
|
+
The command stdout becomes the result returned to the Task Room. A non-zero exit code returns a failed result with stdout/stderr attached.
|
|
78
|
+
|
|
79
|
+
Replay a run:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
memtask replay <run-id>
|
|
83
|
+
memtask replay <run-id> --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Publishing
|
|
87
|
+
|
|
88
|
+
After creating the npm org/scope:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm login
|
|
92
|
+
npm --workspace @novator-ai/memtask-cli version patch
|
|
93
|
+
npm --workspace @novator-ai/memtask-cli publish --access public
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
If the npm scope changes, update `packages/cli/package.json` `name` first.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { main } from "../index.js";
|
|
3
|
+
import { CliError, errorMessage } from "../lib/errors.js";
|
|
4
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
5
|
+
console.error(errorMessage(error));
|
|
6
|
+
process.exit(error instanceof CliError ? error.exitCode : 1);
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=memtask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memtask.js","sourceRoot":"","sources":["../../src/bin/memtask.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function main(argv: string[]): Promise<void>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { mkdtemp, writeFile } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { parseArgs, flagBoolean, flagNumber, flagString, requirePositional } from "./lib/args.js";
|
|
6
|
+
import { configPath, gatewayBaseFromApiUrl, normalizeBaseUrl, readConfig, resolveApiUrl, resolveToken, writeConfig } from "./lib/config.js";
|
|
7
|
+
import { CliError, errorMessage } from "./lib/errors.js";
|
|
8
|
+
import { apiRequest } from "./lib/http.js";
|
|
9
|
+
import { promptSecret, promptText, readOptionalTextFile, readTextInput, writeOutput } from "./lib/io.js";
|
|
10
|
+
const VERSION = "0.1.0";
|
|
11
|
+
export async function main(argv) {
|
|
12
|
+
const parsed = parseArgs(argv);
|
|
13
|
+
if (flagBoolean(parsed, ["version", "v"]) || parsed.positionals[0] === "version") {
|
|
14
|
+
console.log(VERSION);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (parsed.positionals.length === 0 || flagBoolean(parsed, ["help", "h"])) {
|
|
18
|
+
printHelp();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const command = parsed.positionals[0];
|
|
22
|
+
const subcommand = parsed.positionals[1];
|
|
23
|
+
if (command === "login")
|
|
24
|
+
return await commandLogin(stripCommand(parsed, 1));
|
|
25
|
+
if (command === "doctor")
|
|
26
|
+
return await commandDoctor(stripCommand(parsed, 1));
|
|
27
|
+
if (command === "room" && subcommand === "create")
|
|
28
|
+
return await commandRoomCreate(stripCommand(parsed, 2));
|
|
29
|
+
if (command === "packet" && subcommand === "pull")
|
|
30
|
+
return await commandPacketPull(stripCommand(parsed, 2));
|
|
31
|
+
if (command === "result" && subcommand === "push")
|
|
32
|
+
return await commandResultPush(stripCommand(parsed, 2));
|
|
33
|
+
if (command === "worker" && subcommand === "connect")
|
|
34
|
+
return await commandWorkerConnect(stripCommand(parsed, 2));
|
|
35
|
+
if (command === "worker" && subcommand === "run")
|
|
36
|
+
return await commandWorkerRun(stripCommand(parsed, 2));
|
|
37
|
+
if (command === "replay")
|
|
38
|
+
return await commandReplay(stripCommand(parsed, 1));
|
|
39
|
+
throw new CliError(`Unknown command: ${parsed.positionals.join(" ")}`);
|
|
40
|
+
}
|
|
41
|
+
function stripCommand(args, count) {
|
|
42
|
+
return {
|
|
43
|
+
flags: args.flags,
|
|
44
|
+
positionals: args.positionals.slice(count)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async function commandLogin(args) {
|
|
48
|
+
const config = await readConfig();
|
|
49
|
+
const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
|
|
50
|
+
const email = flagString(args, ["email", "e"]) ?? (await promptText("Email: "));
|
|
51
|
+
const password = flagString(args, ["password", "p"]) ?? process.env.MEMTASK_PASSWORD ?? (await promptSecret("Password: "));
|
|
52
|
+
const result = await apiRequest(apiUrl, "/auth/login", {
|
|
53
|
+
method: "POST",
|
|
54
|
+
body: { email, password }
|
|
55
|
+
});
|
|
56
|
+
await writeConfig({
|
|
57
|
+
...config,
|
|
58
|
+
apiUrl,
|
|
59
|
+
sessionToken: result.sessionToken,
|
|
60
|
+
user: result.user
|
|
61
|
+
});
|
|
62
|
+
if (flagBoolean(args, ["json"])) {
|
|
63
|
+
console.log(JSON.stringify({ ok: true, apiUrl, user: result.user, expiresAt: result.expiresAt }, null, 2));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
console.log(`Logged in as ${result.user?.email ?? result.user?.username ?? result.user?.userId ?? "MemTask user"}.`);
|
|
67
|
+
console.log(`Config: ${configPath()}`);
|
|
68
|
+
}
|
|
69
|
+
async function commandDoctor(args) {
|
|
70
|
+
const config = await readConfig();
|
|
71
|
+
const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
|
|
72
|
+
const token = resolveToken(config, flagString(args, ["token"]));
|
|
73
|
+
const local = {
|
|
74
|
+
configPath: configPath(),
|
|
75
|
+
apiUrl,
|
|
76
|
+
authenticated: Boolean(token),
|
|
77
|
+
workerConfigured: Boolean(resolveWorkerConfig(config, apiUrl, args, false).connectionId && resolveWorkerConfig(config, apiUrl, args, false).token)
|
|
78
|
+
};
|
|
79
|
+
const checks = { local };
|
|
80
|
+
if (token) {
|
|
81
|
+
checks.api = await apiRequest(apiUrl, "/doctor", { token });
|
|
82
|
+
}
|
|
83
|
+
const worker = resolveWorkerConfig(config, apiUrl, args, false);
|
|
84
|
+
if (worker.connectionId && worker.token) {
|
|
85
|
+
checks.worker = await apiRequest(worker.gatewayBaseUrl, `/a2a/discover?connectionId=${encodeURIComponent(worker.connectionId)}`, {
|
|
86
|
+
token: worker.token,
|
|
87
|
+
timeoutMs: 20_000
|
|
88
|
+
}).catch((error) => ({ ok: false, error: errorMessage(error) }));
|
|
89
|
+
}
|
|
90
|
+
if (flagBoolean(args, ["json"])) {
|
|
91
|
+
console.log(JSON.stringify(checks, null, 2));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.log("MemTask CLI doctor");
|
|
95
|
+
console.log(`- Config: ${local.configPath}`);
|
|
96
|
+
console.log(`- API: ${apiUrl}`);
|
|
97
|
+
console.log(`- Login: ${local.authenticated ? "configured" : "missing"}`);
|
|
98
|
+
if (checks.api) {
|
|
99
|
+
const api = checks.api;
|
|
100
|
+
console.log(`- Backend: ${api.ok ? "ok" : "error"}`);
|
|
101
|
+
if (api.checks) {
|
|
102
|
+
console.log(`- Rooms: ${api.checks.rooms}`);
|
|
103
|
+
console.log(`- External connections: ${api.checks.externalConnections} (${api.checks.activeConnections} active)`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (checks.worker) {
|
|
107
|
+
const workerResult = checks.worker;
|
|
108
|
+
console.log(`- Worker gateway: ${workerResult.ok === false ? `error (${workerResult.error})` : "ok"}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function commandRoomCreate(args) {
|
|
112
|
+
const { apiUrl, token } = await requireSession(args);
|
|
113
|
+
const workflow = flagString(args, ["workflow", "w"], "general");
|
|
114
|
+
const sourcePath = flagString(args, ["from", "f"]);
|
|
115
|
+
const sourceText = await readTextInput(sourcePath, "--from");
|
|
116
|
+
const sourceName = flagString(args, ["source-name"]) ?? (sourcePath && sourcePath !== "-" ? path.basename(sourcePath) : "stdin.txt");
|
|
117
|
+
const title = flagString(args, ["title", "t"]);
|
|
118
|
+
const result = await apiRequest(apiUrl, "/rooms", {
|
|
119
|
+
method: "POST",
|
|
120
|
+
token,
|
|
121
|
+
body: { workflow, sourceName, sourceText, title }
|
|
122
|
+
});
|
|
123
|
+
if (flagBoolean(args, ["json"])) {
|
|
124
|
+
console.log(JSON.stringify(result, null, 2));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log(`Created room: ${result.title}`);
|
|
128
|
+
console.log(`Room ID: ${result.taskId}`);
|
|
129
|
+
console.log(`Workflow: ${result.workflowKind}`);
|
|
130
|
+
console.log(`Pull packet: memtask packet pull ${result.taskId}`);
|
|
131
|
+
}
|
|
132
|
+
async function commandPacketPull(args) {
|
|
133
|
+
const { apiUrl, token } = await requireSession(args);
|
|
134
|
+
const roomId = requirePositional(args, 0, "room id");
|
|
135
|
+
const format = flagString(args, ["format"], "markdown") === "json" ? "json" : "markdown";
|
|
136
|
+
const out = flagString(args, ["out", "o"]);
|
|
137
|
+
if (format === "markdown") {
|
|
138
|
+
const markdown = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/packet?format=markdown&raw=1`, {
|
|
139
|
+
token,
|
|
140
|
+
rawText: true
|
|
141
|
+
});
|
|
142
|
+
await writeOutput(out, markdown);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const payload = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/packet?format=json`, { token });
|
|
146
|
+
await writeOutput(out, JSON.stringify(payload, null, 2));
|
|
147
|
+
}
|
|
148
|
+
async function commandResultPush(args) {
|
|
149
|
+
const { apiUrl, token } = await requireSession(args);
|
|
150
|
+
const roomId = requirePositional(args, 0, "room id");
|
|
151
|
+
const summaryPath = flagString(args, ["summary", "s"]);
|
|
152
|
+
const artifactPath = flagString(args, ["artifact", "a"]);
|
|
153
|
+
const summaryText = await readTextInput(summaryPath, "--summary");
|
|
154
|
+
const artifactText = await readOptionalTextFile(artifactPath);
|
|
155
|
+
const artifactName = flagString(args, ["artifact-name"]) ?? (artifactPath && artifactPath !== "-" ? path.basename(artifactPath) : undefined);
|
|
156
|
+
const result = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/results`, {
|
|
157
|
+
method: "POST",
|
|
158
|
+
token,
|
|
159
|
+
body: { summaryText, artifactName, artifactText }
|
|
160
|
+
});
|
|
161
|
+
if (flagBoolean(args, ["json"])) {
|
|
162
|
+
console.log(JSON.stringify(result, null, 2));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
console.log(`Result pushed to room ${roomId}.`);
|
|
166
|
+
console.log(`Delivery ID: ${result.deliveryId}`);
|
|
167
|
+
}
|
|
168
|
+
async function commandWorkerConnect(args) {
|
|
169
|
+
const config = await readConfig();
|
|
170
|
+
const { apiUrl, token } = await requireSession(args, config);
|
|
171
|
+
const name = flagString(args, ["name", "n"], "MemTask CLI Worker");
|
|
172
|
+
const description = flagString(args, ["description", "d"], "External agent connected through the MemTask CLI. It receives scoped packets and returns results to the Task Room.");
|
|
173
|
+
const result = await apiRequest(apiUrl, "/workers/connect", {
|
|
174
|
+
method: "POST",
|
|
175
|
+
token,
|
|
176
|
+
body: { name, description, runtimeKind: flagString(args, ["runtime-kind"], "local_runtime") }
|
|
177
|
+
});
|
|
178
|
+
const gatewayBaseUrl = gatewayBaseFromApiUrl(apiUrl);
|
|
179
|
+
await writeConfig({
|
|
180
|
+
...config,
|
|
181
|
+
apiUrl,
|
|
182
|
+
sessionToken: token,
|
|
183
|
+
worker: {
|
|
184
|
+
gatewayBaseUrl,
|
|
185
|
+
connectionId: result.connectionId,
|
|
186
|
+
gatewayToken: result.token,
|
|
187
|
+
label: name
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
if (flagBoolean(args, ["json"])) {
|
|
191
|
+
console.log(JSON.stringify({ ...result, gatewayBaseUrl }, null, 2));
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log("External agent connection created.");
|
|
195
|
+
console.log(`Connection ID: ${result.connectionId}`);
|
|
196
|
+
console.log(`Gateway: ${gatewayBaseUrl}`);
|
|
197
|
+
console.log(`Token: ${result.tokenPreview ?? maskToken(result.token)}`);
|
|
198
|
+
console.log("");
|
|
199
|
+
console.log("For a VM or CI worker:");
|
|
200
|
+
console.log(`export MEMTASK_GATEWAY_BASE_URL=${shellQuote(gatewayBaseUrl)}`);
|
|
201
|
+
console.log(`export MEMTASK_CONNECTION_ID=${shellQuote(result.connectionId)}`);
|
|
202
|
+
console.log(`export MEMTASK_GATEWAY_TOKEN=${shellQuote(result.token)}`);
|
|
203
|
+
console.log("memtask worker run --exec 'your-agent-command < \"$MEMTASK_PACKET_PATH\"'");
|
|
204
|
+
}
|
|
205
|
+
async function commandWorkerRun(args) {
|
|
206
|
+
const config = await readConfig();
|
|
207
|
+
const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
|
|
208
|
+
const worker = resolveWorkerConfig(config, apiUrl, args, true);
|
|
209
|
+
const once = flagBoolean(args, ["once"]);
|
|
210
|
+
const intervalMs = Math.max(1000, flagNumber(args, ["interval"], 5000));
|
|
211
|
+
const execCommand = flagString(args, ["exec"]);
|
|
212
|
+
const printOnly = flagBoolean(args, ["print-only"]);
|
|
213
|
+
if (!execCommand && !printOnly) {
|
|
214
|
+
throw new CliError("worker run needs --exec <command> or --print-only.");
|
|
215
|
+
}
|
|
216
|
+
while (true) {
|
|
217
|
+
const found = await runOneWorkerPoll(worker, { execCommand, printOnly });
|
|
218
|
+
if (once) {
|
|
219
|
+
if (!found)
|
|
220
|
+
console.log("No queued work.");
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
await sleep(found ? 250 : intervalMs);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function runOneWorkerPoll(worker, options) {
|
|
227
|
+
const poll = await apiRequest(worker.gatewayBaseUrl, `/a2a/tasks/poll?connectionId=${encodeURIComponent(worker.connectionId)}`, { token: worker.token });
|
|
228
|
+
const invocationId = poll.invocationId ?? poll.invocation?.invocationId;
|
|
229
|
+
const stepId = poll.stepId ?? poll.invocation?.stepId ?? poll.invocation?.activeStep?.stepId;
|
|
230
|
+
if (!invocationId) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
await appendWorkerEvent(worker, invocationId, stepId, "agent.stream", "MemTask CLI worker picked up this task.");
|
|
234
|
+
const detail = await apiRequest(worker.gatewayBaseUrl, `/a2a/tasks/get?connectionId=${encodeURIComponent(worker.connectionId)}&invocationId=${encodeURIComponent(invocationId)}${stepId ? `&stepId=${encodeURIComponent(stepId)}` : ""}`, { token: worker.token });
|
|
235
|
+
const packet = detail.invocation ?? detail.envelope ?? detail;
|
|
236
|
+
const packetPath = await writePacketFile(invocationId, packet);
|
|
237
|
+
if (options.printOnly) {
|
|
238
|
+
console.log(JSON.stringify(packet, null, 2));
|
|
239
|
+
await submitWorkerResult(worker, invocationId, stepId, "blocked", "Packet printed by MemTask CLI worker; no executor was run.", "Printed packet.");
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
const result = await runShell(options.execCommand ?? "", {
|
|
243
|
+
MEMTASK_PACKET_PATH: packetPath,
|
|
244
|
+
MEMTASK_INVOCATION_ID: invocationId,
|
|
245
|
+
MEMTASK_STEP_ID: stepId ?? "",
|
|
246
|
+
MEMTASK_CONNECTION_ID: worker.connectionId,
|
|
247
|
+
MEMTASK_GATEWAY_BASE_URL: worker.gatewayBaseUrl
|
|
248
|
+
});
|
|
249
|
+
const body = [result.stdout.trim(), result.stderr.trim() ? `\n\nstderr:\n${result.stderr.trim()}` : ""].join("").trim();
|
|
250
|
+
if (result.code === 0) {
|
|
251
|
+
await submitWorkerResult(worker, invocationId, stepId, "completed", body || "Executor completed without output.", firstLine(body) || "Executor completed.");
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
await submitWorkerResult(worker, invocationId, stepId, "failed", body || `Executor exited with code ${result.code}.`, `Executor failed with code ${result.code}.`);
|
|
255
|
+
}
|
|
256
|
+
console.log(`Processed invocation ${invocationId}${stepId ? ` step ${stepId}` : ""}: exit ${result.code}`);
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
async function commandReplay(args) {
|
|
260
|
+
const { apiUrl, token } = await requireSession(args);
|
|
261
|
+
const runId = requirePositional(args, 0, "run id");
|
|
262
|
+
const result = await apiRequest(apiUrl, `/runs/${encodeURIComponent(runId)}/replay`, { token });
|
|
263
|
+
if (flagBoolean(args, ["json"])) {
|
|
264
|
+
console.log(JSON.stringify(result, null, 2));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const invocation = result.invocation ?? {};
|
|
268
|
+
console.log(`Run ${invocation.id ?? runId}`);
|
|
269
|
+
console.log(`Status: ${invocation.status ?? "unknown"}`);
|
|
270
|
+
console.log(`Mode: ${invocation.mode ?? "unknown"}`);
|
|
271
|
+
if (result.plan) {
|
|
272
|
+
console.log("Plan: available");
|
|
273
|
+
}
|
|
274
|
+
const steps = Array.isArray(result.steps) ? result.steps : [];
|
|
275
|
+
if (steps.length) {
|
|
276
|
+
console.log("Steps:");
|
|
277
|
+
for (const step of steps) {
|
|
278
|
+
console.log(`- ${step.title ?? step.role ?? "Step"}: ${step.status ?? "unknown"}${step.outputSummary ? ` · ${step.outputSummary}` : ""}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const events = Array.isArray(result.events) ? result.events.slice(-8) : [];
|
|
282
|
+
if (events.length) {
|
|
283
|
+
console.log("Recent events:");
|
|
284
|
+
for (const event of events) {
|
|
285
|
+
console.log(`- ${event.type}: ${event.message}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
async function requireSession(args, preloadedConfig) {
|
|
290
|
+
const config = preloadedConfig ?? (await readConfig());
|
|
291
|
+
const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
|
|
292
|
+
const token = resolveToken(config, flagString(args, ["token"]));
|
|
293
|
+
if (!token) {
|
|
294
|
+
throw new CliError("Not logged in. Run: memtask login --email <email>");
|
|
295
|
+
}
|
|
296
|
+
return { config, apiUrl, token };
|
|
297
|
+
}
|
|
298
|
+
function resolveWorkerConfig(config, apiUrl, args, required) {
|
|
299
|
+
const gatewayBaseUrl = normalizeBaseUrl(flagString(args, ["gateway-url"]) ??
|
|
300
|
+
process.env.MEMTASK_GATEWAY_BASE_URL ??
|
|
301
|
+
config.worker?.gatewayBaseUrl ??
|
|
302
|
+
gatewayBaseFromApiUrl(apiUrl));
|
|
303
|
+
const connectionId = flagString(args, ["connection-id"]) ?? process.env.MEMTASK_CONNECTION_ID ?? config.worker?.connectionId ?? "";
|
|
304
|
+
const token = flagString(args, ["gateway-token"]) ?? process.env.MEMTASK_GATEWAY_TOKEN ?? config.worker?.gatewayToken ?? "";
|
|
305
|
+
if (required && (!connectionId || !token)) {
|
|
306
|
+
throw new CliError("Worker is not connected. Run: memtask worker connect");
|
|
307
|
+
}
|
|
308
|
+
return { gatewayBaseUrl, connectionId, token };
|
|
309
|
+
}
|
|
310
|
+
async function appendWorkerEvent(worker, invocationId, stepId, type, message) {
|
|
311
|
+
await apiRequest(worker.gatewayBaseUrl, "/a2a/tasks/event", {
|
|
312
|
+
method: "POST",
|
|
313
|
+
token: worker.token,
|
|
314
|
+
body: { invocationId, connectionId: worker.connectionId, stepId, type, message }
|
|
315
|
+
}).catch(() => undefined);
|
|
316
|
+
}
|
|
317
|
+
async function submitWorkerResult(worker, invocationId, stepId, status, resultText, summary) {
|
|
318
|
+
return await apiRequest(worker.gatewayBaseUrl, "/a2a/tasks/result", {
|
|
319
|
+
method: "POST",
|
|
320
|
+
token: worker.token,
|
|
321
|
+
body: {
|
|
322
|
+
invocationId,
|
|
323
|
+
connectionId: worker.connectionId,
|
|
324
|
+
stepId,
|
|
325
|
+
status,
|
|
326
|
+
resultText,
|
|
327
|
+
summary,
|
|
328
|
+
artifactName: status === "completed" ? "CLI Worker Result" : "CLI Worker Update"
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
async function writePacketFile(invocationId, packet) {
|
|
333
|
+
const dir = await mkdtemp(path.join(tmpdir(), "memtask-"));
|
|
334
|
+
const file = path.join(dir, `${sanitizeFilename(invocationId)}.json`);
|
|
335
|
+
await writeFile(file, JSON.stringify(packet, null, 2), "utf8");
|
|
336
|
+
return file;
|
|
337
|
+
}
|
|
338
|
+
function runShell(command, env) {
|
|
339
|
+
return new Promise((resolve) => {
|
|
340
|
+
const child = spawn(command, {
|
|
341
|
+
shell: true,
|
|
342
|
+
env: { ...process.env, ...env },
|
|
343
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
344
|
+
});
|
|
345
|
+
const stdout = [];
|
|
346
|
+
const stderr = [];
|
|
347
|
+
child.stdout.on("data", (chunk) => stdout.push(Buffer.from(chunk)));
|
|
348
|
+
child.stderr.on("data", (chunk) => stderr.push(Buffer.from(chunk)));
|
|
349
|
+
child.on("close", (code) => {
|
|
350
|
+
resolve({
|
|
351
|
+
code: code ?? 1,
|
|
352
|
+
stdout: Buffer.concat(stdout).toString("utf8"),
|
|
353
|
+
stderr: Buffer.concat(stderr).toString("utf8")
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
function printHelp() {
|
|
359
|
+
console.log(`MemTask CLI ${VERSION}
|
|
360
|
+
|
|
361
|
+
Usage:
|
|
362
|
+
memtask login --email you@example.com
|
|
363
|
+
memtask doctor
|
|
364
|
+
memtask room create --workflow failure --from error.log
|
|
365
|
+
memtask packet pull <room-id> --out packet.md
|
|
366
|
+
memtask result push <room-id> --summary result.md --artifact patch.diff
|
|
367
|
+
memtask worker connect --name "Local agent"
|
|
368
|
+
memtask worker run --exec 'your-agent < "$MEMTASK_PACKET_PATH"'
|
|
369
|
+
memtask replay <run-id>
|
|
370
|
+
|
|
371
|
+
Global flags:
|
|
372
|
+
--api-url <url> MemTask CLI API. Default: https://mem-task.com/cli/v1
|
|
373
|
+
--token <token> Session token override.
|
|
374
|
+
--json Print machine-readable JSON.
|
|
375
|
+
|
|
376
|
+
Environment:
|
|
377
|
+
MEMTASK_API_URL, MEMTASK_TOKEN, MEMTASK_CONFIG
|
|
378
|
+
MEMTASK_GATEWAY_BASE_URL, MEMTASK_CONNECTION_ID, MEMTASK_GATEWAY_TOKEN`);
|
|
379
|
+
}
|
|
380
|
+
function maskToken(token) {
|
|
381
|
+
if (token.length <= 10) {
|
|
382
|
+
return "<configured>";
|
|
383
|
+
}
|
|
384
|
+
return `${token.slice(0, 6)}...${token.slice(-4)}`;
|
|
385
|
+
}
|
|
386
|
+
function shellQuote(value) {
|
|
387
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
388
|
+
}
|
|
389
|
+
function sanitizeFilename(value) {
|
|
390
|
+
return value.replace(/[^a-zA-Z0-9._-]+/g, "_").slice(0, 120) || "packet";
|
|
391
|
+
}
|
|
392
|
+
function firstLine(value) {
|
|
393
|
+
return value
|
|
394
|
+
.split(/\r?\n/)
|
|
395
|
+
.map((line) => line.trim())
|
|
396
|
+
.find(Boolean)
|
|
397
|
+
?.slice(0, 220);
|
|
398
|
+
}
|
|
399
|
+
function sleep(ms) {
|
|
400
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAmB,MAAM,eAAe,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5I,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzG,MAAM,OAAO,GAAG,OAAO,CAAC;AA2CxB,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1E,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,OAAO,KAAK,MAAM,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,MAAM,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,MAAM,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,MAAM,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,MAAM,oBAAoB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACjH,IAAI,OAAO,KAAK,QAAQ,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,MAAM,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACzG,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,IAAI,QAAQ,CAAC,oBAAoB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB,EAAE,KAAa;IACnD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAgB;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,MAAM,UAAU,CAAgB,MAAM,EAAE,aAAa,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;KAC1B,CAAC,CAAC;IACH,MAAM,WAAW,CAAC;QAChB,GAAG,MAAM;QACT,MAAM;QACN,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,cAAc,GAAG,CAAC,CAAC;IACrH,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAgB;IAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG;QACZ,UAAU,EAAE,UAAU,EAAE;QACxB,MAAM;QACN,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC;QAC7B,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,YAAY,IAAI,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC;KACnJ,CAAC;IACF,MAAM,MAAM,GAA4B,EAAE,KAAK,EAAE,CAAC;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,8BAA8B,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE;YAC/H,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,GAAU,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,MAAM,CAAC,mBAAmB,KAAK,GAAG,CAAC,MAAM,CAAC,iBAAiB,UAAU,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAa,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,YAAY,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAgB;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACrI,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,UAAU,CAA0B,MAAM,EAAE,QAAQ,EAAE;QACzE,MAAM,EAAE,MAAM;QACd,KAAK;QACL,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE;KAClD,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAgB;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IACzF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAS,MAAM,EAAE,UAAU,kBAAkB,CAAC,MAAM,CAAC,+BAA+B,EAAE;YACrH,KAAK;YACL,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAA0B,MAAM,EAAE,UAAU,kBAAkB,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxI,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAgB;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7I,MAAM,MAAM,GAAG,MAAM,UAAU,CAA0B,MAAM,EAAE,UAAU,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE;QAC/G,MAAM,EAAE,MAAM;QACd,KAAK;QACL,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE;KAClD,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,GAAG,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAgB;IAClD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,UAAU,CAC5B,IAAI,EACJ,CAAC,aAAa,EAAE,GAAG,CAAC,EACpB,oHAAoH,CACrH,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAA+B,MAAM,EAAE,kBAAkB,EAAE;QACxF,MAAM,EAAE,MAAM;QACd,KAAK;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,EAAE,eAAe,CAAC,EAAE;KAC9F,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,WAAW,CAAC;QAChB,GAAG,MAAM;QACT,MAAM;QACN,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE;YACN,cAAc;YACd,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,YAAY,EAAE,MAAM,CAAC,KAAK;YAC1B,KAAK,EAAE,IAAI;SACZ;KACF,CAAC,CAAC;IACH,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,YAAY,cAAc,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,gCAAgC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,gCAAgC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAgB;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,oDAAoD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACzE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAAuE,EACvE,OAAqD;IAErD,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,MAAM,CAAC,cAAc,EACrB,gCAAgC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EACzE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACxB,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;IAC7F,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,yCAAyC,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,MAAM,CAAC,cAAc,EACrB,+BAA+B,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,kBAAkB,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACjL,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CACxB,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC9D,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,4DAA4D,EAAE,iBAAiB,CAAC,CAAC;QACnJ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE;QACvD,mBAAmB,EAAE,UAAU;QAC/B,qBAAqB,EAAE,YAAY;QACnC,eAAe,EAAE,MAAM,IAAI,EAAE;QAC7B,qBAAqB,EAAE,MAAM,CAAC,YAAY;QAC1C,wBAAwB,EAAE,MAAM,CAAC,cAAc;KAChD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI,oCAAoC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,CAAC;IAC9J,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,6BAA6B,MAAM,CAAC,IAAI,GAAG,EAAE,6BAA6B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACrK,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3G,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAgB;IAC3C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAsB,MAAM,EAAE,SAAS,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACrH,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5I,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAgB,EAAE,eAAwD;IACtG,MAAM,MAAM,GAAG,eAAe,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,QAAQ,CAAC,mDAAmD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,mBAAmB,CAAC,MAA8C,EAAE,MAAc,EAAE,IAAgB,EAAE,QAAiB;IAC9H,MAAM,cAAc,GAAG,gBAAgB,CACrC,UAAU,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACpC,MAAM,CAAC,MAAM,EAAE,cAAc;QAC7B,qBAAqB,CAAC,MAAM,CAAC,CAChC,CAAC;IACF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;IACnI,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;IAC5H,IAAI,QAAQ,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,QAAQ,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAAuE,EACvE,YAAoB,EACpB,MAA0B,EAC1B,IAA0D,EAC1D,OAAe;IAEf,MAAM,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE;QAC1D,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;KACjF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAuE,EACvE,YAAoB,EACpB,MAA0B,EAC1B,MAA0C,EAC1C,UAAkB,EAClB,OAAe;IAEf,OAAO,MAAM,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE;YACJ,YAAY;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,MAAM;YACN,MAAM;YACN,UAAU;YACV,OAAO;YACP,YAAY,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;SACjF;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,YAAoB,EAAE,MAAe;IAClE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACtE,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,GAA2B;IAC5D,OAAO,IAAI,OAAO,CAAmD,CAAC,OAAO,EAAE,EAAE;QAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE;YAC3B,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,IAAI,CAAC;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC/C,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO;;;;;;;;;;;;;;;;;;;yEAmBqC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC;QACd,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ParsedArgs = {
|
|
2
|
+
positionals: string[];
|
|
3
|
+
flags: Record<string, string | boolean | string[]>;
|
|
4
|
+
};
|
|
5
|
+
export declare function parseArgs(argv: string[]): ParsedArgs;
|
|
6
|
+
export declare function flagString(args: ParsedArgs, names: string[], fallback?: string): string | undefined;
|
|
7
|
+
export declare function flagNumber(args: ParsedArgs, names: string[], fallback: number): number;
|
|
8
|
+
export declare function flagBoolean(args: ParsedArgs, names: string[]): boolean;
|
|
9
|
+
export declare function requirePositional(args: ParsedArgs, index: number, label: string): string;
|
package/dist/lib/args.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export function parseArgs(argv) {
|
|
3
|
+
const positionals = [];
|
|
4
|
+
const flags = {};
|
|
5
|
+
let i = 0;
|
|
6
|
+
while (i < argv.length) {
|
|
7
|
+
const token = argv[i] ?? "";
|
|
8
|
+
if (token === "--") {
|
|
9
|
+
positionals.push(...argv.slice(i + 1));
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
if (!token.startsWith("-") || token === "-") {
|
|
13
|
+
positionals.push(token);
|
|
14
|
+
i += 1;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (token.startsWith("--")) {
|
|
18
|
+
const raw = token.slice(2);
|
|
19
|
+
const eqIndex = raw.indexOf("=");
|
|
20
|
+
const name = eqIndex >= 0 ? raw.slice(0, eqIndex) : raw;
|
|
21
|
+
if (!name) {
|
|
22
|
+
throw new CliError(`Invalid flag: ${token}`);
|
|
23
|
+
}
|
|
24
|
+
const inlineValue = eqIndex >= 0 ? raw.slice(eqIndex + 1) : undefined;
|
|
25
|
+
const next = argv[i + 1];
|
|
26
|
+
const value = inlineValue ?? (next && !next.startsWith("-") ? next : true);
|
|
27
|
+
setFlag(flags, name, value);
|
|
28
|
+
i += inlineValue === undefined && typeof value === "string" ? 2 : 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const short = token.slice(1);
|
|
32
|
+
if (short.length > 1 && !short.includes("=")) {
|
|
33
|
+
for (const name of short) {
|
|
34
|
+
setFlag(flags, name, true);
|
|
35
|
+
}
|
|
36
|
+
i += 1;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const [name, inlineValue] = short.split("=", 2);
|
|
40
|
+
const next = argv[i + 1];
|
|
41
|
+
const value = inlineValue ?? (next && !next.startsWith("-") ? next : true);
|
|
42
|
+
setFlag(flags, name, value);
|
|
43
|
+
i += inlineValue === undefined && typeof value === "string" ? 2 : 1;
|
|
44
|
+
}
|
|
45
|
+
return { positionals, flags };
|
|
46
|
+
}
|
|
47
|
+
function setFlag(flags, name, value) {
|
|
48
|
+
const existing = flags[name];
|
|
49
|
+
if (existing === undefined) {
|
|
50
|
+
flags[name] = value;
|
|
51
|
+
}
|
|
52
|
+
else if (Array.isArray(existing)) {
|
|
53
|
+
existing.push(String(value));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
flags[name] = [String(existing), String(value)];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function flagString(args, names, fallback) {
|
|
60
|
+
for (const name of names) {
|
|
61
|
+
const value = args.flags[name];
|
|
62
|
+
if (typeof value === "string" && value.length > 0) {
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
if (Array.isArray(value) && value.length > 0) {
|
|
66
|
+
return value[value.length - 1];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return fallback;
|
|
70
|
+
}
|
|
71
|
+
export function flagNumber(args, names, fallback) {
|
|
72
|
+
const value = flagString(args, names);
|
|
73
|
+
if (value === undefined) {
|
|
74
|
+
return fallback;
|
|
75
|
+
}
|
|
76
|
+
const parsed = Number(value);
|
|
77
|
+
if (!Number.isFinite(parsed)) {
|
|
78
|
+
throw new CliError(`Expected a number for --${names[0]}.`);
|
|
79
|
+
}
|
|
80
|
+
return parsed;
|
|
81
|
+
}
|
|
82
|
+
export function flagBoolean(args, names) {
|
|
83
|
+
for (const name of names) {
|
|
84
|
+
const value = args.flags[name];
|
|
85
|
+
if (value === undefined) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (typeof value === "boolean") {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
const normalized = String(Array.isArray(value) ? value[value.length - 1] : value).toLowerCase();
|
|
92
|
+
if (["0", "false", "no", "off"].includes(normalized)) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
export function requirePositional(args, index, label) {
|
|
100
|
+
const value = args.positionals[index];
|
|
101
|
+
if (!value) {
|
|
102
|
+
throw new CliError(`Missing ${label}.`);
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type MemTaskConfig = {
|
|
2
|
+
apiUrl?: string;
|
|
3
|
+
sessionToken?: string;
|
|
4
|
+
user?: {
|
|
5
|
+
userId?: string;
|
|
6
|
+
email?: string;
|
|
7
|
+
username?: string;
|
|
8
|
+
};
|
|
9
|
+
worker?: {
|
|
10
|
+
gatewayBaseUrl?: string;
|
|
11
|
+
connectionId?: string;
|
|
12
|
+
gatewayToken?: string;
|
|
13
|
+
label?: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare const defaultApiUrl = "https://mem-task.com/cli/v1";
|
|
17
|
+
export declare function configPath(): string;
|
|
18
|
+
export declare function readConfig(): Promise<MemTaskConfig>;
|
|
19
|
+
export declare function writeConfig(config: MemTaskConfig): Promise<void>;
|
|
20
|
+
export declare function resolveApiUrl(config: MemTaskConfig, override?: string): string;
|
|
21
|
+
export declare function resolveToken(config: MemTaskConfig, override?: string): string;
|
|
22
|
+
export declare function gatewayBaseFromApiUrl(apiUrl: string): string;
|
|
23
|
+
export declare function normalizeBaseUrl(value: string): string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { CliError } from "./errors.js";
|
|
5
|
+
export const defaultApiUrl = "https://mem-task.com/cli/v1";
|
|
6
|
+
export function configPath() {
|
|
7
|
+
return process.env.MEMTASK_CONFIG || path.join(homedir(), ".memtask", "config.json");
|
|
8
|
+
}
|
|
9
|
+
export async function readConfig() {
|
|
10
|
+
try {
|
|
11
|
+
const raw = await readFile(configPath(), "utf8");
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error.code === "ENOENT") {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
if (error instanceof SyntaxError) {
|
|
19
|
+
throw new CliError(`Invalid MemTask config JSON: ${configPath()}`);
|
|
20
|
+
}
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function writeConfig(config) {
|
|
25
|
+
const file = configPath();
|
|
26
|
+
await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
|
|
27
|
+
await writeFile(file, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
|
|
28
|
+
await chmod(file, 0o600).catch(() => undefined);
|
|
29
|
+
}
|
|
30
|
+
export function resolveApiUrl(config, override) {
|
|
31
|
+
return normalizeBaseUrl(override || process.env.MEMTASK_API_URL || config.apiUrl || defaultApiUrl);
|
|
32
|
+
}
|
|
33
|
+
export function resolveToken(config, override) {
|
|
34
|
+
return override || process.env.MEMTASK_TOKEN || config.sessionToken || "";
|
|
35
|
+
}
|
|
36
|
+
export function gatewayBaseFromApiUrl(apiUrl) {
|
|
37
|
+
return normalizeBaseUrl(apiUrl.replace(/\/cli\/v1\/?$/i, ""));
|
|
38
|
+
}
|
|
39
|
+
export function normalizeBaseUrl(value) {
|
|
40
|
+
return value.replace(/\/+$/g, "");
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAkBvC,MAAM,CAAC,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAE3D,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CAAC,gCAAgC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB;IACrD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,QAAiB;IACpE,OAAO,gBAAgB,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,QAAiB;IACnE,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class CliError extends Error {
|
|
2
|
+
exitCode;
|
|
3
|
+
constructor(message, exitCode = 1) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "CliError";
|
|
6
|
+
this.exitCode = exitCode;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function errorMessage(error) {
|
|
10
|
+
if (error instanceof Error) {
|
|
11
|
+
return error.message;
|
|
12
|
+
}
|
|
13
|
+
return String(error ?? "Unknown error");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAS;IAEjB,YAAY,OAAe,EAAE,QAAQ,GAAG,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export type RequestOptions = {
|
|
3
|
+
method?: "GET" | "POST";
|
|
4
|
+
token?: string;
|
|
5
|
+
body?: unknown;
|
|
6
|
+
rawText?: boolean;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
};
|
|
9
|
+
export declare class MemTaskHttpError extends CliError {
|
|
10
|
+
status: number;
|
|
11
|
+
constructor(status: number, message: string);
|
|
12
|
+
}
|
|
13
|
+
export declare function apiRequest<T>(baseUrl: string, path: string, options?: RequestOptions): Promise<T>;
|
package/dist/lib/http.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export class MemTaskHttpError extends CliError {
|
|
3
|
+
status;
|
|
4
|
+
constructor(status, message) {
|
|
5
|
+
super(message, status === 401 || status === 403 ? 2 : 1);
|
|
6
|
+
this.name = "MemTaskHttpError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export async function apiRequest(baseUrl, path, options = {}) {
|
|
11
|
+
const url = path.startsWith("http") ? path : `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 120_000);
|
|
14
|
+
try {
|
|
15
|
+
const response = await fetch(url, {
|
|
16
|
+
method: options.method ?? (options.body === undefined ? "GET" : "POST"),
|
|
17
|
+
signal: controller.signal,
|
|
18
|
+
headers: {
|
|
19
|
+
Accept: options.rawText ? "text/plain" : "application/json",
|
|
20
|
+
...(options.body === undefined ? {} : { "Content-Type": "application/json" }),
|
|
21
|
+
...(options.token ? { Authorization: `Bearer ${options.token}` } : {})
|
|
22
|
+
},
|
|
23
|
+
...(options.body === undefined ? {} : { body: JSON.stringify(options.body) })
|
|
24
|
+
});
|
|
25
|
+
if (options.rawText) {
|
|
26
|
+
const text = await response.text();
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new MemTaskHttpError(response.status, text || `HTTP ${response.status}`);
|
|
29
|
+
}
|
|
30
|
+
return text;
|
|
31
|
+
}
|
|
32
|
+
const payload = (await response.json().catch(() => ({})));
|
|
33
|
+
if (!response.ok || payload.ok === false) {
|
|
34
|
+
const message = typeof payload.error === "string"
|
|
35
|
+
? payload.error
|
|
36
|
+
: typeof payload.error?.message === "string"
|
|
37
|
+
? String(payload.error.message)
|
|
38
|
+
: `HTTP ${response.status}`;
|
|
39
|
+
throw new MemTaskHttpError(response.status, message);
|
|
40
|
+
}
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof MemTaskHttpError) {
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
48
|
+
throw new CliError(`Request timed out: ${url}`);
|
|
49
|
+
}
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
clearTimeout(timeout);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/io.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function readTextInput(source: string | undefined, label: string): Promise<string>;
|
|
2
|
+
export declare function readOptionalTextFile(source: string | undefined): Promise<string | undefined>;
|
|
3
|
+
export declare function writeOutput(destination: string | undefined, body: string): Promise<void>;
|
|
4
|
+
export declare function readStdin(): Promise<string>;
|
|
5
|
+
export declare function promptText(question: string): Promise<string>;
|
|
6
|
+
export declare function promptSecret(question: string): Promise<string>;
|
package/dist/lib/io.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
4
|
+
import readline from "node:readline/promises";
|
|
5
|
+
import { CliError } from "./errors.js";
|
|
6
|
+
export async function readTextInput(source, label) {
|
|
7
|
+
if (!source) {
|
|
8
|
+
throw new CliError(`Missing ${label}. Use --from <file> or --from -.`);
|
|
9
|
+
}
|
|
10
|
+
if (source === "-") {
|
|
11
|
+
return await readStdin();
|
|
12
|
+
}
|
|
13
|
+
return await readFile(path.resolve(source), "utf8");
|
|
14
|
+
}
|
|
15
|
+
export async function readOptionalTextFile(source) {
|
|
16
|
+
if (!source) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
if (source === "-") {
|
|
20
|
+
return await readStdin();
|
|
21
|
+
}
|
|
22
|
+
return await readFile(path.resolve(source), "utf8");
|
|
23
|
+
}
|
|
24
|
+
export async function writeOutput(destination, body) {
|
|
25
|
+
if (!destination || destination === "-") {
|
|
26
|
+
console.log(body);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await writeFile(path.resolve(destination), body, "utf8");
|
|
30
|
+
}
|
|
31
|
+
export async function readStdin() {
|
|
32
|
+
const chunks = [];
|
|
33
|
+
for await (const chunk of input) {
|
|
34
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
35
|
+
}
|
|
36
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
37
|
+
}
|
|
38
|
+
export async function promptText(question) {
|
|
39
|
+
const rl = readline.createInterface({ input, output });
|
|
40
|
+
try {
|
|
41
|
+
return (await rl.question(question)).trim();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
rl.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function promptSecret(question) {
|
|
48
|
+
if (!input.isTTY) {
|
|
49
|
+
throw new CliError("Password is required. Pass --password or set MEMTASK_PASSWORD in non-interactive shells.");
|
|
50
|
+
}
|
|
51
|
+
output.write(question);
|
|
52
|
+
input.setRawMode(true);
|
|
53
|
+
input.resume();
|
|
54
|
+
let value = "";
|
|
55
|
+
return await new Promise((resolve, reject) => {
|
|
56
|
+
const cleanup = () => {
|
|
57
|
+
input.setRawMode(false);
|
|
58
|
+
input.pause();
|
|
59
|
+
input.off("data", onData);
|
|
60
|
+
output.write("\n");
|
|
61
|
+
};
|
|
62
|
+
const onData = (buffer) => {
|
|
63
|
+
const char = buffer.toString("utf8");
|
|
64
|
+
if (char === "\u0003") {
|
|
65
|
+
cleanup();
|
|
66
|
+
reject(new CliError("Cancelled.", 130));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (char === "\r" || char === "\n") {
|
|
70
|
+
cleanup();
|
|
71
|
+
resolve(value);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (char === "\u007f" || char === "\b") {
|
|
75
|
+
value = value.slice(0, -1);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
value += char;
|
|
79
|
+
};
|
|
80
|
+
input.on("data", onData);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/lib/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA0B,EAAE,KAAa;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,kCAAkC,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAA0B;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAA+B,EAAE,IAAY;IAC7E,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAAC,0FAA0F,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@novator-ai/memtask-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MemTask CLI for Task Rooms, handoff packets, external workers, and run replay.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"memtask": "./dist/bin/memtask.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/bin/memtask.js",
|
|
15
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
16
|
+
"prepublishOnly": "npm run build && node ./dist/bin/memtask.js --version"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=20.10.0"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^24.10.1",
|
|
26
|
+
"typescript": "^5.6.3"
|
|
27
|
+
}
|
|
28
|
+
}
|