epismo 1.2.1 → 1.4.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/LICENSE +201 -0
- package/README.md +84 -75
- package/npm/bin/epismo.exe +1 -0
- package/npm/install.js +82 -0
- package/package.json +30 -38
- package/dist/analytics.js +0 -44
- package/dist/analytics.js.map +0 -1
- package/dist/api.js +0 -111
- package/dist/api.js.map +0 -1
- package/dist/auth.js +0 -658
- package/dist/auth.js.map +0 -1
- package/dist/bin.js +0 -3
- package/dist/bin.js.map +0 -1
- package/dist/cases.js +0 -25
- package/dist/cases.js.map +0 -1
- package/dist/config.js +0 -109
- package/dist/config.js.map +0 -1
- package/dist/context.js +0 -16
- package/dist/context.js.map +0 -1
- package/dist/credits.js +0 -31
- package/dist/credits.js.map +0 -1
- package/dist/errors.js +0 -111
- package/dist/errors.js.map +0 -1
- package/dist/index.js +0 -36
- package/dist/index.js.map +0 -1
- package/dist/input.js +0 -211
- package/dist/input.js.map +0 -1
- package/dist/output.js +0 -10
- package/dist/output.js.map +0 -1
- package/dist/playbook-program.js +0 -466
- package/dist/playbook-program.js.map +0 -1
- package/dist/playbooks.js +0 -61
- package/dist/playbooks.js.map +0 -1
- package/dist/program.js +0 -368
- package/dist/program.js.map +0 -1
- package/dist/projects.js +0 -54
- package/dist/projects.js.map +0 -1
- package/dist/records.js +0 -12
- package/dist/records.js.map +0 -1
- package/dist/suggestions.js +0 -15
- package/dist/suggestions.js.map +0 -1
- package/dist/token.js +0 -10
- package/dist/token.js.map +0 -1
- package/dist/update-check.js +0 -121
- package/dist/update-check.js.map +0 -1
- package/dist/workspace.js +0 -19
- package/dist/workspace.js.map +0 -1
- package/dist/workspaces.js +0 -61
- package/dist/workspaces.js.map +0 -1
package/dist/program.js
DELETED
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
import { Command, Option } from "commander";
|
|
2
|
-
import { clearWorkspace, getCurrentWorkspace, listAvailableWorkspaces, login, logout, useWorkspace, whoami } from "./auth.js";
|
|
3
|
-
import { resolveExecutionContext } from "./context.js";
|
|
4
|
-
import { mergeDefined, parseStringArrayInput, readJsonObjectInput } from "./input.js";
|
|
5
|
-
import { printJson, printWarning } from "./output.js";
|
|
6
|
-
import { creditBalance, creditCheckout } from "./credits.js";
|
|
7
|
-
import { CliError, toErrorPayload } from "./errors.js";
|
|
8
|
-
import { createWorkspace, deleteWorkspaceMembers, getWorkspaceCheckout, listWorkspaceMembers, updateWorkspace, upsertWorkspaceMembers } from "./workspaces.js";
|
|
9
|
-
import { addProjectMembers, createProject, deleteProjectMembers, listProjectMembers, listProjects, updateProject } from "./projects.js";
|
|
10
|
-
import { createToken } from "./token.js";
|
|
11
|
-
import { registerPlaybookProgram } from "./playbook-program.js";
|
|
12
|
-
// centralize warning codes so wording is consistent everywhere
|
|
13
|
-
const WARNING_ENV_TOKEN_WORKSPACE_IGNORED = "EPISMO_TOKEN_WORKSPACE_IGNORED";
|
|
14
|
-
async function resolveInput(options, overrides) {
|
|
15
|
-
const base = await readJsonObjectInput(options.input);
|
|
16
|
-
return mergeDefined(base, overrides);
|
|
17
|
-
}
|
|
18
|
-
async function resolveContext() {
|
|
19
|
-
const context = await resolveExecutionContext();
|
|
20
|
-
if (context.warning) {
|
|
21
|
-
printWarning({
|
|
22
|
-
warning: { code: WARNING_ENV_TOKEN_WORKSPACE_IGNORED, message: context.warning }
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
return context;
|
|
26
|
-
}
|
|
27
|
-
export function buildProgram(version) {
|
|
28
|
-
const program = new Command();
|
|
29
|
-
program
|
|
30
|
-
.name("epismo")
|
|
31
|
-
.description("Agent-first CLI for discovering, authoring, and coordinating reusable AI Playbooks.")
|
|
32
|
-
.version(version)
|
|
33
|
-
.showHelpAfterError(false)
|
|
34
|
-
.showSuggestionAfterError(false)
|
|
35
|
-
.configureOutput({ writeErr: () => { } })
|
|
36
|
-
.exitOverride();
|
|
37
|
-
program.addHelpText("after", `
|
|
38
|
-
Workspace resolution:
|
|
39
|
-
All commands resolve workspace in this order:
|
|
40
|
-
1. Saved default (epismo workspace use)
|
|
41
|
-
2. Personal space (fallback)
|
|
42
|
-
When EPISMO_TOKEN is set, the saved default is skipped — the workspace is
|
|
43
|
-
resolved from the token itself. Use epismo token create --workspace-id to
|
|
44
|
-
issue a workspace-scoped token for CI/CD.
|
|
45
|
-
|
|
46
|
-
Examples:
|
|
47
|
-
epismo login
|
|
48
|
-
epismo whoami
|
|
49
|
-
epismo workspace list`);
|
|
50
|
-
program
|
|
51
|
-
.command("login")
|
|
52
|
-
.description("log in through a browser, or use email with automatic SSO discovery")
|
|
53
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
54
|
-
.option("--email <email>", "use company SSO when configured, otherwise enter a code here")
|
|
55
|
-
.action(async (options) => {
|
|
56
|
-
const payload = await resolveInput({ input: options.input }, {
|
|
57
|
-
email: options.email
|
|
58
|
-
});
|
|
59
|
-
const result = await login({
|
|
60
|
-
email: typeof payload.email === "string" ? payload.email : undefined
|
|
61
|
-
});
|
|
62
|
-
const base = {
|
|
63
|
-
userId: result.userId,
|
|
64
|
-
expiresAt: result.expiresAt,
|
|
65
|
-
lastLoginEmail: result.lastLoginEmail
|
|
66
|
-
};
|
|
67
|
-
if (result.alreadyLoggedIn) {
|
|
68
|
-
printJson({
|
|
69
|
-
alreadyLoggedIn: true,
|
|
70
|
-
...base,
|
|
71
|
-
hint: "Already logged in. Run `epismo logout` first to switch accounts, or pass --email <other> to sign in as someone else."
|
|
72
|
-
});
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
printJson({
|
|
76
|
-
loggedIn: true,
|
|
77
|
-
...base,
|
|
78
|
-
...(result.hint ? { hint: result.hint } : {})
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
program.commands.at(-1)?.addHelpText("after", `
|
|
82
|
-
Examples:
|
|
83
|
-
epismo login open a browser and choose a sign-in method
|
|
84
|
-
epismo login --email you@example.com use SSO or finish email-code login in this terminal`);
|
|
85
|
-
program
|
|
86
|
-
.command("logout")
|
|
87
|
-
.description("revoke credentials and clear ~/.epismo/credentials")
|
|
88
|
-
.action(async () => {
|
|
89
|
-
const result = await logout();
|
|
90
|
-
printJson(result);
|
|
91
|
-
});
|
|
92
|
-
program
|
|
93
|
-
.command("whoami")
|
|
94
|
-
.description("show the currently authenticated user")
|
|
95
|
-
.action(async () => {
|
|
96
|
-
const context = await resolveContext();
|
|
97
|
-
printJson(await whoami({ workspaceId: context.workspaceId, auth: context.auth }));
|
|
98
|
-
});
|
|
99
|
-
program.commands.at(-1)?.addHelpText("after", `
|
|
100
|
-
Examples:
|
|
101
|
-
epismo whoami
|
|
102
|
-
EPISMO_TOKEN=<access-token> epismo whoami`);
|
|
103
|
-
const workspace = program
|
|
104
|
-
.command("workspace")
|
|
105
|
-
.description("manage workspaces and the saved default workspace");
|
|
106
|
-
workspace
|
|
107
|
-
.command("list")
|
|
108
|
-
.description("list accessible workspaces")
|
|
109
|
-
.action(async () => {
|
|
110
|
-
printJson(await listAvailableWorkspaces());
|
|
111
|
-
});
|
|
112
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
113
|
-
Example:
|
|
114
|
-
epismo workspace list`);
|
|
115
|
-
workspace
|
|
116
|
-
.command("current")
|
|
117
|
-
.description("show the saved default workspace")
|
|
118
|
-
.action(async () => {
|
|
119
|
-
printJson(await getCurrentWorkspace());
|
|
120
|
-
});
|
|
121
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
122
|
-
Example:
|
|
123
|
-
epismo workspace current`);
|
|
124
|
-
workspace
|
|
125
|
-
.command("use")
|
|
126
|
-
.description("set the default workspace")
|
|
127
|
-
.argument("<workspace-id>", "workspace id to set as default")
|
|
128
|
-
.action(async (workspaceId) => {
|
|
129
|
-
printJson(await useWorkspace({ workspaceId }));
|
|
130
|
-
});
|
|
131
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
132
|
-
Example:
|
|
133
|
-
epismo workspace use <workspace-id>`);
|
|
134
|
-
workspace
|
|
135
|
-
.command("clear")
|
|
136
|
-
.description("clear the saved workspace (reverts to personal space)")
|
|
137
|
-
.action(async () => {
|
|
138
|
-
printJson(await clearWorkspace());
|
|
139
|
-
});
|
|
140
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
141
|
-
Example:
|
|
142
|
-
epismo workspace clear`);
|
|
143
|
-
workspace
|
|
144
|
-
.command("create")
|
|
145
|
-
.description("create a new workspace")
|
|
146
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
147
|
-
.option("--handle <handle>", "workspace handle (URL-safe slug)")
|
|
148
|
-
.action(async (options) => {
|
|
149
|
-
const payload = await resolveInput({ input: options.input }, { handle: options.handle });
|
|
150
|
-
const context = await resolveContext();
|
|
151
|
-
const created = await createWorkspace(context, payload);
|
|
152
|
-
const workspaceId = created.workspace?.id;
|
|
153
|
-
if (workspaceId) {
|
|
154
|
-
try {
|
|
155
|
-
const checkout = await getWorkspaceCheckout(context, workspaceId);
|
|
156
|
-
printJson({ ...created, ...checkout });
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
printJson({
|
|
160
|
-
...created,
|
|
161
|
-
checkoutError: toErrorPayload(error).payload.error,
|
|
162
|
-
hint: `Workspace creation succeeded. Retry checkout with \`epismo workspace checkout ${workspaceId}\`.`
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
printJson(created);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
171
|
-
Examples:
|
|
172
|
-
epismo workspace create --handle my-team
|
|
173
|
-
epismo workspace create --input @workspace.json`);
|
|
174
|
-
workspace
|
|
175
|
-
.command("checkout")
|
|
176
|
-
.description("get the billing URL for a workspace (to complete or retry payment)")
|
|
177
|
-
.argument("<workspace-id>", "workspace id")
|
|
178
|
-
.action(async (workspaceId) => {
|
|
179
|
-
const context = await resolveContext();
|
|
180
|
-
printJson(await getWorkspaceCheckout(context, workspaceId));
|
|
181
|
-
});
|
|
182
|
-
workspace.commands.at(-1)?.addHelpText("after", `
|
|
183
|
-
Examples:
|
|
184
|
-
epismo workspace checkout <workspace-id>`);
|
|
185
|
-
workspace
|
|
186
|
-
.command("update")
|
|
187
|
-
.description("update a workspace you own (PATCH — omitted fields are unchanged)")
|
|
188
|
-
.argument("<workspace-id>", "workspace id to update")
|
|
189
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
190
|
-
.option("--handle <handle>", "updated workspace handle (URL-safe slug)")
|
|
191
|
-
.action(async (workspaceId, options) => {
|
|
192
|
-
const payload = await resolveInput(options, { handle: options.handle });
|
|
193
|
-
const context = await resolveContext();
|
|
194
|
-
printJson(await updateWorkspace(context, workspaceId, payload));
|
|
195
|
-
});
|
|
196
|
-
const workspaceMember = workspace.command("member").description("manage workspace members");
|
|
197
|
-
workspaceMember
|
|
198
|
-
.command("list")
|
|
199
|
-
.description("list members in a workspace")
|
|
200
|
-
.action(async () => {
|
|
201
|
-
const context = await resolveContext();
|
|
202
|
-
printJson(await listWorkspaceMembers(context, { workspaceId: context.workspaceId }));
|
|
203
|
-
});
|
|
204
|
-
workspaceMember
|
|
205
|
-
.command("upsert")
|
|
206
|
-
.description("add a workspace member or update the member role")
|
|
207
|
-
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
208
|
-
.addOption(new Option("--role <role>", "owner | admin | member")
|
|
209
|
-
.choices(["owner", "admin", "member"])
|
|
210
|
-
.makeOptionMandatory())
|
|
211
|
-
.action(async (userIdsArg, options) => {
|
|
212
|
-
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
213
|
-
if (userIds.length === 0) {
|
|
214
|
-
throw new CliError({
|
|
215
|
-
code: "INVALID_INPUT",
|
|
216
|
-
message: "At least one user id is required."
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
const context = await resolveContext();
|
|
220
|
-
printJson(await upsertWorkspaceMembers(context, userIds, options.role));
|
|
221
|
-
});
|
|
222
|
-
workspaceMember
|
|
223
|
-
.command("delete")
|
|
224
|
-
.description("remove a workspace member")
|
|
225
|
-
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
226
|
-
.action(async (userIdsArg) => {
|
|
227
|
-
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
228
|
-
if (userIds.length === 0) {
|
|
229
|
-
throw new CliError({
|
|
230
|
-
code: "INVALID_INPUT",
|
|
231
|
-
message: "At least one user id is required."
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
const context = await resolveContext();
|
|
235
|
-
printJson(await deleteWorkspaceMembers(context, userIds));
|
|
236
|
-
});
|
|
237
|
-
const project = program.command("project").description("manage workspace projects");
|
|
238
|
-
project
|
|
239
|
-
.command("list")
|
|
240
|
-
.description("list projects visible in the selected workspace")
|
|
241
|
-
.action(async () => {
|
|
242
|
-
const context = await resolveContext();
|
|
243
|
-
printJson(await listProjects(context));
|
|
244
|
-
});
|
|
245
|
-
project
|
|
246
|
-
.command("create")
|
|
247
|
-
.description("create a project in the selected workspace")
|
|
248
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
249
|
-
.option("--name <name>", "project name")
|
|
250
|
-
.option("--description <description>", "project description")
|
|
251
|
-
.action(async (options) => {
|
|
252
|
-
const payload = await resolveInput(options, {
|
|
253
|
-
name: options.name,
|
|
254
|
-
description: options.description
|
|
255
|
-
});
|
|
256
|
-
const context = await resolveContext();
|
|
257
|
-
printJson(await createProject(context, payload));
|
|
258
|
-
});
|
|
259
|
-
project
|
|
260
|
-
.command("update")
|
|
261
|
-
.description("update a project you can access (PATCH — omitted fields are unchanged)")
|
|
262
|
-
.argument("<project-id>", "project id to update")
|
|
263
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
264
|
-
.option("--name <name>", "updated project name")
|
|
265
|
-
.option("--description <description>", "updated project description")
|
|
266
|
-
.action(async (projectId, options) => {
|
|
267
|
-
const payload = await resolveInput(options, {
|
|
268
|
-
name: options.name,
|
|
269
|
-
description: options.description
|
|
270
|
-
});
|
|
271
|
-
const context = await resolveContext();
|
|
272
|
-
printJson(await updateProject(context, projectId, payload));
|
|
273
|
-
});
|
|
274
|
-
const projectMember = project.command("member").description("manage project members");
|
|
275
|
-
projectMember
|
|
276
|
-
.command("list")
|
|
277
|
-
.description("list members across one or more projects")
|
|
278
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
279
|
-
.option("--project-ids <projectIds>", "JSON array or comma-separated project ids")
|
|
280
|
-
.action(async (options) => {
|
|
281
|
-
const payload = await resolveInput(options, {
|
|
282
|
-
projectIds: parseStringArrayInput(options.projectIds, "--project-ids")
|
|
283
|
-
});
|
|
284
|
-
const context = await resolveContext();
|
|
285
|
-
printJson(await listProjectMembers(context, payload));
|
|
286
|
-
});
|
|
287
|
-
projectMember
|
|
288
|
-
.command("add")
|
|
289
|
-
.description("add member(s) to a project")
|
|
290
|
-
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
291
|
-
.requiredOption("--project-id <projectId>", "project id")
|
|
292
|
-
.action(async (userIdsArg, options) => {
|
|
293
|
-
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
294
|
-
if (userIds.length === 0) {
|
|
295
|
-
throw new CliError({
|
|
296
|
-
code: "INVALID_INPUT",
|
|
297
|
-
message: "At least one user id is required."
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
const context = await resolveContext();
|
|
301
|
-
printJson(await addProjectMembers(context, options.projectId, userIds));
|
|
302
|
-
});
|
|
303
|
-
projectMember
|
|
304
|
-
.command("delete")
|
|
305
|
-
.description("remove user(s) from a project")
|
|
306
|
-
.argument("<user-ids>", "user id(s); comma-separated for multiple")
|
|
307
|
-
.requiredOption("--project-id <projectId>", "project id")
|
|
308
|
-
.action(async (userIdsArg, options) => {
|
|
309
|
-
const userIds = parseStringArrayInput(userIdsArg, "<user-ids>") ?? [];
|
|
310
|
-
if (userIds.length === 0) {
|
|
311
|
-
throw new CliError({
|
|
312
|
-
code: "INVALID_INPUT",
|
|
313
|
-
message: "At least one user id is required."
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
const context = await resolveContext();
|
|
317
|
-
printJson(await deleteProjectMembers(context, options.projectId, userIds));
|
|
318
|
-
});
|
|
319
|
-
const credit = program.command("credit").description("view balance and purchase credits");
|
|
320
|
-
credit
|
|
321
|
-
.command("balance")
|
|
322
|
-
.description("show current credit balance")
|
|
323
|
-
.action(async () => {
|
|
324
|
-
const context = await resolveContext();
|
|
325
|
-
printJson(await creditBalance(context));
|
|
326
|
-
});
|
|
327
|
-
credit.commands.at(-1)?.addHelpText("after", `
|
|
328
|
-
Examples:
|
|
329
|
-
epismo credit balance`);
|
|
330
|
-
credit
|
|
331
|
-
.command("checkout")
|
|
332
|
-
.description("start a credit purchase and get a checkout URL")
|
|
333
|
-
.option("--input <input>", "JSON object, @file, or - for stdin")
|
|
334
|
-
.option("--quantity <quantity>", "Number of credits to add to the active balance", (value) => Number(value))
|
|
335
|
-
.action(async (options) => {
|
|
336
|
-
const payload = await resolveInput(options, {
|
|
337
|
-
quantity: options.quantity
|
|
338
|
-
});
|
|
339
|
-
const context = await resolveContext();
|
|
340
|
-
printJson(await creditCheckout(context, payload));
|
|
341
|
-
});
|
|
342
|
-
credit.commands.at(-1)?.addHelpText("after", `
|
|
343
|
-
Example:
|
|
344
|
-
epismo credit checkout --quantity 500`);
|
|
345
|
-
const token = program.command("token").description("manage CLI tokens for CI/CD");
|
|
346
|
-
token
|
|
347
|
-
.command("create")
|
|
348
|
-
.description("issue a workspace-scoped CLI token for use in CI/CD pipelines")
|
|
349
|
-
.option("--workspace-id <workspaceId>", "workspace to scope the token to (omit for personal space)")
|
|
350
|
-
.action(async (options) => {
|
|
351
|
-
const context = await resolveContext();
|
|
352
|
-
printJson(await createToken(context, options.workspaceId ?? context.workspaceId));
|
|
353
|
-
});
|
|
354
|
-
token.commands.at(-1)?.addHelpText("after", `
|
|
355
|
-
Notes:
|
|
356
|
-
The issued token has the same scopes as a normal CLI token (read, write, offline_access)
|
|
357
|
-
but carries the workspace ID embedded. Use it via the EPISMO_TOKEN environment variable
|
|
358
|
-
in CI/CD so no --workspace-id flag is needed at runtime.
|
|
359
|
-
If --workspace-id is omitted, the saved default workspace is used (epismo workspace use),
|
|
360
|
-
falling back to personal space when no default is set.
|
|
361
|
-
|
|
362
|
-
Examples:
|
|
363
|
-
epismo token create --workspace-id <workspace-id>
|
|
364
|
-
epismo token create # uses saved default workspace, or personal space if none`);
|
|
365
|
-
registerPlaybookProgram(program, { resolveInput, resolveContext });
|
|
366
|
-
return program;
|
|
367
|
-
}
|
|
368
|
-
//# sourceMappingURL=program.js.map
|
package/dist/program.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,KAAK,EACL,MAAM,EACN,YAAY,EACZ,MAAM,EACN,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,uBAAuB,EAAyB,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACN,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAMhE,+DAA+D;AAC/D,MAAM,mCAAmC,GAAG,gCAAgC,CAAC;AAE7E,KAAK,UAAU,YAAY,CAC1B,OAAsB,EACtB,SAAkC;IAElC,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,MAAM,uBAAuB,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,YAAY,CAAC;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;SAChF,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACL,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CACX,qFAAqF,CACrF;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,kBAAkB,CAAC,KAAK,CAAC;SACzB,wBAAwB,CAAC,KAAK,CAAC;SAC/B,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;SACvC,YAAY,EAAE,CAAC;IACjB,OAAO,CAAC,WAAW,CAClB,OAAO,EACP;;;;;;;;;;;;wBAYsB,CACtB,CAAC;IAEF,OAAO;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,8DAA8D,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,YAAY,CACjC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EACxB;YACC,KAAK,EAAE,OAAO,CAAC,KAAK;SACpB,CACD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;YAC1B,KAAK,EAAE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SACpE,CAAC,CAAC;QACH,MAAM,IAAI,GAAG;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;SACrC,CAAC;QACF,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC5B,SAAS,CAAC;gBACT,eAAe,EAAE,IAAI;gBACrB,GAAG,IAAI;gBACP,IAAI,EAAE,sHAAsH;aAC5H,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QACD,SAAS,CAAC;YACT,QAAQ,EAAE,IAAI;YACd,GAAG,IAAI;YACP,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACnC,OAAO,EACP;;;4FAG0F,CAC1F,CAAC;IAEF,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAC;QAC9B,SAAS,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACnC,OAAO,EACP;;;4CAG0C,CAC1C,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO;SACvB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,mDAAmD,CAAC,CAAC;IACnE,SAAS;SACP,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,SAAS,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;wBAEsB,CACtB,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,SAAS,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;2BAEyB,CACzB,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,EAAE;QACrC,SAAS,CAAC,MAAM,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;sCAEoC,CACpC,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,SAAS,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;yBAEuB,CACvB,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,WAAW,GAAI,OAA2C,CAAC,SAAS,EAAE,EAAE,CAAC;QAC/E,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC;gBACJ,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAClE,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,SAAS,CAAC;oBACT,GAAG,OAAO;oBACV,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK;oBAClD,IAAI,EAAE,iFAAiF,WAAW,KAAK;iBACvG,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;aAAM,CAAC;YACP,SAAS,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACF,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;;kDAGgD,CAChD,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oEAAoE,CAAC;SACjF,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACJ,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACrC,OAAO,EACP;;2CAEyC,CACzC,CAAC;IAEF,SAAS;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SACpD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAAO,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC5F,eAAe;SACb,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEJ,eAAe;SACb,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAClE,SAAS,CACT,IAAI,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACnD,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SACrC,mBAAmB,EAAE,CACvB;SACA,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC;gBAClB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mCAAmC;aAC5C,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEJ,eAAe;SACb,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC;gBAClB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mCAAmC;aAC5C,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IACpF,OAAO;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC;SACvC,MAAM,CAAC,6BAA6B,EAAE,qBAAqB,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;SAChC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wEAAwE,CAAC;SACrF,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;SAChC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEJ,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;IACtF,aAAa;SACX,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CAAC,4BAA4B,EAAE,2CAA2C,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YAC3C,UAAU,EAAE,qBAAqB,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC;SACtE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEJ,aAAa;SACX,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAClE,cAAc,CAAC,0BAA0B,EAAE,YAAY,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC;gBAClB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mCAAmC;aAC5C,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEJ,aAAa;SACX,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,QAAQ,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAClE,cAAc,CAAC,0BAA0B,EAAE,YAAY,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,qBAAqB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,QAAQ,CAAC;gBAClB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,mCAAmC;aAC5C,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAC;IAC1F,MAAM;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAClC,OAAO,EACP;;wBAEsB,CACtB,CAAC;IACF,MAAM;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SAC/D,MAAM,CACN,uBAAuB,EACvB,gDAAgD,EAChD,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CACxB;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAClC,OAAO,EACP;;wCAEsC,CACtC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC;IAClF,KAAK;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CACN,8BAA8B,EAC9B,2DAA2D,CAC3D;SACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACJ,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CACjC,OAAO,EACP;;;;;;;;;;kFAUgF,CAChF,CAAC;IAEF,uBAAuB,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;IAEnE,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
package/dist/projects.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { requestJson, withWorkspaceQuery } from "./api.js";
|
|
2
|
-
import { resolveApiUrl } from "./config.js";
|
|
3
|
-
import { CliError } from "./errors.js";
|
|
4
|
-
import { parseStringArrayInput, toObjectInput } from "./input.js";
|
|
5
|
-
export async function listProjects(context) {
|
|
6
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery("/v1/projects", context.workspaceId), {
|
|
7
|
-
authToken: context.auth.accessToken
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
export async function createProject(context, input) {
|
|
11
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery("/v1/projects", context.workspaceId), {
|
|
12
|
-
method: "POST",
|
|
13
|
-
authToken: context.auth.accessToken,
|
|
14
|
-
body: toObjectInput(input)
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
export async function updateProject(context, id, input) {
|
|
18
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/projects/${encodeURIComponent(id)}`, context.workspaceId), {
|
|
19
|
-
method: "PATCH",
|
|
20
|
-
authToken: context.auth.accessToken,
|
|
21
|
-
body: toObjectInput(input)
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
export async function listProjectMembers(context, input) {
|
|
25
|
-
const payload = toObjectInput(input);
|
|
26
|
-
const projectIds = parseStringArrayInput(payload.projectIds, "projectIds");
|
|
27
|
-
if (!projectIds || projectIds.length === 0) {
|
|
28
|
-
throw new CliError({
|
|
29
|
-
code: "INVALID_INPUT",
|
|
30
|
-
message: '"projectIds" is required.',
|
|
31
|
-
hint: "Pass --project-ids <id1,id2>."
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery("/v1/projects/members/list", context.workspaceId), {
|
|
35
|
-
method: "POST",
|
|
36
|
-
authToken: context.auth.accessToken,
|
|
37
|
-
body: { projectIds }
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
export async function addProjectMembers(context, projectId, userIds) {
|
|
41
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/projects/${encodeURIComponent(projectId)}/members`, context.workspaceId), {
|
|
42
|
-
method: "PUT",
|
|
43
|
-
authToken: context.auth.accessToken,
|
|
44
|
-
body: { userIds }
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
export async function deleteProjectMembers(context, projectId, userIds) {
|
|
48
|
-
const query = `userIds=${encodeURIComponent(userIds.join(","))}`;
|
|
49
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery(`/v1/projects/${encodeURIComponent(projectId)}/members?${query}`, context.workspaceId), {
|
|
50
|
-
method: "DELETE",
|
|
51
|
-
authToken: context.auth.accessToken
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=projects.js.map
|
package/dist/projects.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/records.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { requestJson, withWorkspaceQuery } from "./api.js";
|
|
2
|
-
import { resolveApiUrl } from "./config.js";
|
|
3
|
-
import { toObjectInput } from "./input.js";
|
|
4
|
-
import { withIdempotency, withQuery } from "./playbooks.js";
|
|
5
|
-
async function call(context, pathname, method = "GET", body) {
|
|
6
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery(pathname, context.workspaceId), { method, authToken: context.auth.accessToken, ...(body === undefined ? {} : { body }) });
|
|
7
|
-
}
|
|
8
|
-
export const recordApi = {
|
|
9
|
-
append: (context, caseId, input) => call(context, "/v1/records", "POST", withIdempotency({ ...toObjectInput(input), caseId })),
|
|
10
|
-
list: (context, input) => call(context, withQuery("/v1/records", input))
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=records.js.map
|
package/dist/records.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../src/records.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,KAAK,UAAU,IAAI,CAClB,OAAyB,EACzB,QAAgB,EAChB,SAAyB,KAAK,EAC9B,IAAc;IAEd,OAAO,WAAW,CACjB,aAAa,EAAE,EACf,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EACjD,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CACxF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,MAAM,EAAE,CAAC,OAAyB,EAAE,MAAc,EAAE,KAAc,EAAE,EAAE,CACrE,IAAI,CACH,OAAO,EACP,aAAa,EACb,MAAM,EACN,eAAe,CAAC,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CACpD;IACF,IAAI,EAAE,CAAC,OAAyB,EAAE,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;CACnG,CAAC"}
|
package/dist/suggestions.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { requestJson, withWorkspaceQuery } from "./api.js";
|
|
2
|
-
import { resolveApiUrl } from "./config.js";
|
|
3
|
-
import { withIdempotency, withQuery } from "./playbooks.js";
|
|
4
|
-
const part = (value) => encodeURIComponent(value);
|
|
5
|
-
async function call(context, pathname, method = "GET", body) {
|
|
6
|
-
return requestJson(resolveApiUrl(), withWorkspaceQuery(pathname, context.workspaceId), { method, authToken: context.auth.accessToken, ...(body === undefined ? {} : { body }) });
|
|
7
|
-
}
|
|
8
|
-
export const suggestionApi = {
|
|
9
|
-
create: (c, input) => call(c, "/v1/suggestions", "POST", withIdempotency(input)),
|
|
10
|
-
get: (c, id) => call(c, `/v1/suggestions/${part(id)}`),
|
|
11
|
-
list: (c, input) => call(c, withQuery("/v1/suggestions", input)),
|
|
12
|
-
update: (c, id, input) => call(c, `/v1/suggestions/${part(id)}`, "PATCH", withIdempotency(input)),
|
|
13
|
-
resolve: (c, id, input) => call(c, `/v1/suggestions/${part(id)}/resolve`, "POST", withIdempotency(input))
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=suggestions.js.map
|
package/dist/suggestions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../src/suggestions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAE1D,KAAK,UAAU,IAAI,CAClB,OAAyB,EACzB,QAAgB,EAChB,SAAmC,KAAK,EACxC,IAAc;IAEd,OAAO,WAAW,CACjB,aAAa,EAAE,EACf,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EACjD,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CACxF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,MAAM,EAAE,CAAC,CAAmB,EAAE,KAAc,EAAE,EAAE,CAC/C,IAAI,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3D,GAAG,EAAE,CAAC,CAAmB,EAAE,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,mBAAmB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,IAAI,EAAE,CAAC,CAAmB,EAAE,KAAc,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAC3F,MAAM,EAAE,CAAC,CAAmB,EAAE,EAAU,EAAE,KAAc,EAAE,EAAE,CAC3D,IAAI,CAAC,CAAC,EAAE,mBAAmB,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAmB,EAAE,EAAU,EAAE,KAAc,EAAE,EAAE,CAC5D,IAAI,CAAC,CAAC,EAAE,mBAAmB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;CAC/E,CAAC"}
|
package/dist/token.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { requestJson } from "./api.js";
|
|
2
|
-
import { resolveApiUrl } from "./config.js";
|
|
3
|
-
export async function createToken(context, workspaceId) {
|
|
4
|
-
return requestJson(resolveApiUrl(), "/v1/cli/tokens", {
|
|
5
|
-
method: "POST",
|
|
6
|
-
authToken: context.auth.accessToken,
|
|
7
|
-
body: workspaceId ? { workspaceId } : {}
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=token.js.map
|
package/dist/token.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,OAAyB,EACzB,WAAoB;IAEpB,OAAO,WAAW,CAAmB,aAAa,EAAE,EAAE,gBAAgB,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;QACnC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;KACxC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/update-check.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { get } from "node:https";
|
|
2
|
-
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
3
|
-
import { dirname } from "node:path";
|
|
4
|
-
import { getUpdateCachePath } from "./config.js";
|
|
5
|
-
import { printWarning } from "./output.js";
|
|
6
|
-
const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 1 day
|
|
7
|
-
function parseVersion(v) {
|
|
8
|
-
// Strip a leading "v" and any prerelease/build suffix (e.g. "1.2.3-beta+build")
|
|
9
|
-
// so the core x.y.z compares numerically instead of yielding NaN.
|
|
10
|
-
const core = v.replace(/^v/, "").split(/[-+]/, 1)[0] ?? "";
|
|
11
|
-
const [major = 0, minor = 0, patch = 0] = core
|
|
12
|
-
.split(".")
|
|
13
|
-
.map((part) => Number.parseInt(part, 10) || 0);
|
|
14
|
-
return [major, minor, patch];
|
|
15
|
-
}
|
|
16
|
-
function isNewer(latest, current) {
|
|
17
|
-
const [lMaj, lMin, lPat] = parseVersion(latest);
|
|
18
|
-
const [cMaj, cMin, cPat] = parseVersion(current);
|
|
19
|
-
if (lMaj !== cMaj)
|
|
20
|
-
return lMaj > cMaj;
|
|
21
|
-
if (lMin !== cMin)
|
|
22
|
-
return lMin > cMin;
|
|
23
|
-
return lPat > cPat;
|
|
24
|
-
}
|
|
25
|
-
function fetchLatestVersion(packageName) {
|
|
26
|
-
return new Promise((resolve) => {
|
|
27
|
-
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`;
|
|
28
|
-
const req = get(url, { timeout: 5000 }, (res) => {
|
|
29
|
-
// unref so this doesn't block process exit
|
|
30
|
-
res.socket?.unref();
|
|
31
|
-
let data = "";
|
|
32
|
-
res.on("data", (chunk) => (data += chunk.toString()));
|
|
33
|
-
res.on("end", () => {
|
|
34
|
-
try {
|
|
35
|
-
const json = JSON.parse(data);
|
|
36
|
-
resolve(json.version ?? null);
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
resolve(null);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
req.on("error", () => resolve(null));
|
|
44
|
-
req.on("timeout", () => {
|
|
45
|
-
req.destroy();
|
|
46
|
-
resolve(null);
|
|
47
|
-
});
|
|
48
|
-
req.socket?.unref(); // run in background: don't block process exit
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
function getCacheFilePath() {
|
|
52
|
-
const cacheFile = getUpdateCachePath();
|
|
53
|
-
const cacheDir = dirname(cacheFile);
|
|
54
|
-
mkdirSync(cacheDir, { recursive: true });
|
|
55
|
-
return cacheFile;
|
|
56
|
-
}
|
|
57
|
-
function readCache(cacheFile) {
|
|
58
|
-
try {
|
|
59
|
-
const raw = readFileSync(cacheFile, "utf8");
|
|
60
|
-
return JSON.parse(raw);
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function writeCache(cacheFile, data) {
|
|
67
|
-
try {
|
|
68
|
-
writeFileSync(cacheFile, JSON.stringify(data), "utf8");
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// ignore cache write failures
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Starts a background version check and shows a notification if a newer version
|
|
76
|
-
* is found in the cache from a previous check.
|
|
77
|
-
*
|
|
78
|
-
* Timing:
|
|
79
|
-
* - On call: reads cache and shows notification immediately if an update is available
|
|
80
|
-
* - Background: queries npm registry and updates cache for future runs
|
|
81
|
-
* - Check interval: once per day (network request only when cache is stale)
|
|
82
|
-
*/
|
|
83
|
-
export async function checkForUpdate(packageName, currentVersion) {
|
|
84
|
-
if (!shouldCheckForUpdates()) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const cacheFile = getCacheFilePath();
|
|
88
|
-
const cache = readCache(cacheFile);
|
|
89
|
-
const now = Date.now();
|
|
90
|
-
// show notification immediately if cache has a newer version
|
|
91
|
-
if (cache && isNewer(cache.latestVersion, currentVersion) && shouldDisplayUpdateNotification()) {
|
|
92
|
-
printWarning({
|
|
93
|
-
warning: {
|
|
94
|
-
code: "UPDATE_AVAILABLE",
|
|
95
|
-
message: `Update available: ${currentVersion} → ${cache.latestVersion}. Run: npm install -g ${packageName}`
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
// only check if cache is missing or stale
|
|
100
|
-
if (!cache || now - cache.lastChecked > CHECK_INTERVAL_MS) {
|
|
101
|
-
// use setImmediate to avoid blocking the main command
|
|
102
|
-
setImmediate(() => {
|
|
103
|
-
fetchLatestVersion(packageName)
|
|
104
|
-
.then((latestVersion) => {
|
|
105
|
-
if (latestVersion) {
|
|
106
|
-
writeCache(cacheFile, { lastChecked: now, latestVersion });
|
|
107
|
-
}
|
|
108
|
-
})
|
|
109
|
-
.catch(() => {
|
|
110
|
-
// ignore background update check failures
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function shouldCheckForUpdates() {
|
|
116
|
-
return process.env.EPISMO_UPDATE_CHECK?.trim() !== "0";
|
|
117
|
-
}
|
|
118
|
-
function shouldDisplayUpdateNotification() {
|
|
119
|
-
return process.stderr.isTTY === true && process.stdout.isTTY === true;
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=update-check.js.map
|
package/dist/update-check.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"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"}
|