dexto 1.14.6 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/coding-agent/coding-agent.yml +0 -2
- package/dist/cli/agent-audit.d.ts +12 -0
- package/dist/cli/agent-audit.d.ts.map +1 -0
- package/dist/cli/agent-audit.js +52 -0
- package/dist/cli/auth/billing.d.ts +0 -6
- package/dist/cli/auth/billing.d.ts.map +1 -1
- package/dist/cli/auth/billing.js +0 -23
- package/dist/cli/auth/constants.d.ts +3 -31
- package/dist/cli/auth/constants.d.ts.map +1 -1
- package/dist/cli/auth/constants.js +9 -33
- package/dist/cli/auth/index.d.ts +2 -9
- package/dist/cli/auth/index.d.ts.map +1 -1
- package/dist/cli/auth/index.js +2 -7
- package/dist/cli/auth/sign-in-runtime.d.ts +12 -0
- package/dist/cli/auth/sign-in-runtime.d.ts.map +1 -0
- package/dist/cli/auth/sign-in-runtime.js +59 -0
- package/dist/cli/cloud/app-scopes.d.ts +4 -0
- package/dist/cli/cloud/app-scopes.d.ts.map +1 -0
- package/dist/cli/cloud/app-scopes.js +19 -0
- package/dist/cli/cloud/command.d.ts +107 -0
- package/dist/cli/cloud/command.d.ts.map +1 -0
- package/dist/cli/cloud/command.js +154 -0
- package/dist/cli/cloud/commands/account.d.ts +11 -0
- package/dist/cli/cloud/commands/account.d.ts.map +1 -0
- package/dist/cli/cloud/commands/account.js +129 -0
- package/dist/cli/cloud/commands/agents.d.ts +3 -0
- package/dist/cli/cloud/commands/agents.d.ts.map +1 -0
- package/dist/cli/cloud/commands/agents.js +526 -0
- package/dist/cli/cloud/commands/api.d.ts +3 -0
- package/dist/cli/cloud/commands/api.d.ts.map +1 -0
- package/dist/cli/cloud/commands/api.js +26 -0
- package/dist/cli/cloud/commands/app-files.d.ts +29 -0
- package/dist/cli/cloud/commands/app-files.d.ts.map +1 -0
- package/dist/cli/cloud/commands/app-files.js +72 -0
- package/dist/cli/cloud/commands/artifacts.d.ts +3 -0
- package/dist/cli/cloud/commands/artifacts.d.ts.map +1 -0
- package/dist/cli/cloud/commands/artifacts.js +267 -0
- package/dist/cli/cloud/commands/automations.d.ts +3 -0
- package/dist/cli/cloud/commands/automations.d.ts.map +1 -0
- package/dist/cli/cloud/commands/automations.js +233 -0
- package/dist/cli/cloud/commands/chats.d.ts +3 -0
- package/dist/cli/cloud/commands/chats.d.ts.map +1 -0
- package/dist/cli/cloud/commands/chats.js +204 -0
- package/dist/cli/cloud/commands/data-deletions.d.ts +3 -0
- package/dist/cli/cloud/commands/data-deletions.d.ts.map +1 -0
- package/dist/cli/cloud/commands/data-deletions.js +55 -0
- package/dist/cli/cloud/commands/deploys.d.ts +10 -0
- package/dist/cli/cloud/commands/deploys.d.ts.map +1 -0
- package/dist/cli/cloud/commands/deploys.js +225 -0
- package/dist/cli/cloud/commands/drive.d.ts +12 -0
- package/dist/cli/cloud/commands/drive.d.ts.map +1 -0
- package/dist/cli/cloud/commands/drive.js +321 -0
- package/dist/cli/cloud/commands/files.d.ts +24 -0
- package/dist/cli/cloud/commands/files.d.ts.map +1 -0
- package/dist/cli/cloud/commands/files.js +284 -0
- package/dist/cli/cloud/commands/find.d.ts +3 -0
- package/dist/cli/cloud/commands/find.d.ts.map +1 -0
- package/dist/cli/cloud/commands/find.js +63 -0
- package/dist/cli/cloud/commands/models.d.ts +3 -0
- package/dist/cli/cloud/commands/models.d.ts.map +1 -0
- package/dist/cli/cloud/commands/models.js +250 -0
- package/dist/cli/cloud/commands/profile.d.ts +3 -0
- package/dist/cli/cloud/commands/profile.d.ts.map +1 -0
- package/dist/cli/cloud/commands/profile.js +120 -0
- package/dist/cli/cloud/commands/projects.d.ts +5 -0
- package/dist/cli/cloud/commands/projects.d.ts.map +1 -0
- package/dist/cli/cloud/commands/projects.js +66 -0
- package/dist/cli/cloud/commands/publish.d.ts +3 -0
- package/dist/cli/cloud/commands/publish.d.ts.map +1 -0
- package/dist/cli/cloud/commands/publish.js +139 -0
- package/dist/cli/cloud/commands/sandboxes.d.ts +3 -0
- package/dist/cli/cloud/commands/sandboxes.d.ts.map +1 -0
- package/dist/cli/cloud/commands/sandboxes.js +266 -0
- package/dist/cli/cloud/commands/secrets.d.ts +3 -0
- package/dist/cli/cloud/commands/secrets.d.ts.map +1 -0
- package/dist/cli/cloud/commands/secrets.js +111 -0
- package/dist/cli/cloud/commands/skills.d.ts +3 -0
- package/dist/cli/cloud/commands/skills.d.ts.map +1 -0
- package/dist/cli/cloud/commands/skills.js +203 -0
- package/dist/cli/cloud/commands/traces.d.ts +3 -0
- package/dist/cli/cloud/commands/traces.d.ts.map +1 -0
- package/dist/cli/cloud/commands/traces.js +142 -0
- package/dist/cli/cloud/commands/web.d.ts +3 -0
- package/dist/cli/cloud/commands/web.d.ts.map +1 -0
- package/dist/cli/cloud/commands/web.js +53 -0
- package/dist/cli/cloud/commands/workspace-apps.d.ts +58 -0
- package/dist/cli/cloud/commands/workspace-apps.d.ts.map +1 -0
- package/dist/cli/cloud/commands/workspace-apps.js +657 -0
- package/dist/cli/cloud/commands/workspace.d.ts +36 -0
- package/dist/cli/cloud/commands/workspace.d.ts.map +1 -0
- package/dist/cli/cloud/commands/workspace.js +281 -0
- package/dist/cli/cloud/connection.d.ts +33 -0
- package/dist/cli/cloud/connection.d.ts.map +1 -0
- package/dist/cli/cloud/connection.js +38 -0
- package/dist/cli/cloud/events.d.ts +63 -0
- package/dist/cli/cloud/events.d.ts.map +1 -0
- package/dist/cli/cloud/events.js +72 -0
- package/dist/cli/cloud/host.d.ts +9 -0
- package/dist/cli/cloud/host.d.ts.map +1 -0
- package/dist/cli/cloud/host.js +109 -0
- package/dist/cli/cloud/output.d.ts +34 -0
- package/dist/cli/cloud/output.d.ts.map +1 -0
- package/dist/cli/cloud/output.js +77 -0
- package/dist/cli/cloud/run.d.ts +26 -0
- package/dist/cli/cloud/run.d.ts.map +1 -0
- package/dist/cli/cloud/run.js +444 -0
- package/dist/cli/cloud/runtime.d.ts +33 -0
- package/dist/cli/cloud/runtime.d.ts.map +1 -0
- package/dist/cli/cloud/runtime.js +86 -0
- package/dist/cli/cloud/tar.d.ts +9 -0
- package/dist/cli/cloud/tar.d.ts.map +1 -0
- package/dist/cli/cloud/tar.js +69 -0
- package/dist/cli/cloud/transfer.d.ts +13 -0
- package/dist/cli/cloud/transfer.d.ts.map +1 -0
- package/dist/cli/cloud/transfer.js +36 -0
- package/dist/cli/cloud/v1.d.ts +20 -0
- package/dist/cli/cloud/v1.d.ts.map +1 -0
- package/dist/cli/cloud/v1.js +66 -0
- package/dist/cli/cloud/zip.d.ts +8 -0
- package/dist/cli/cloud/zip.d.ts.map +1 -0
- package/dist/cli/cloud/zip.js +66 -0
- package/dist/cli/commands/auth/sign-in-commands.d.ts +62 -0
- package/dist/cli/commands/auth/sign-in-commands.d.ts.map +1 -0
- package/dist/cli/commands/auth/sign-in-commands.js +248 -0
- package/dist/cli/commands/auth/sign-in-context.d.ts +16 -0
- package/dist/cli/commands/auth/sign-in-context.d.ts.map +1 -0
- package/dist/cli/commands/auth/sign-in-context.js +68 -0
- package/dist/cli/commands/cloud/register.d.ts +5 -0
- package/dist/cli/commands/cloud/register.d.ts.map +1 -1
- package/dist/cli/commands/cloud/register.js +44 -24
- package/dist/cli/commands/create-app.js +5 -6
- package/dist/cli/commands/create-image.d.ts.map +1 -1
- package/dist/cli/commands/create-image.js +9 -10
- package/dist/cli/commands/index.d.ts +0 -2
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +0 -2
- package/dist/cli/commands/init.d.ts +0 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +5 -26
- package/dist/cli/commands/run/headless.d.ts.map +1 -1
- package/dist/cli/commands/run/headless.js +57 -2
- package/dist/cli/commands/run/output.d.ts +29 -10
- package/dist/cli/commands/run/output.d.ts.map +1 -1
- package/dist/cli/commands/run/output.js +44 -22
- package/dist/cli/commands/run/register.d.ts.map +1 -1
- package/dist/cli/commands/run/register.js +21 -9
- package/dist/cli/commands/run/step-log.d.ts +11 -0
- package/dist/cli/commands/run/step-log.d.ts.map +1 -0
- package/dist/cli/commands/run/step-log.js +42 -0
- package/dist/cli/commands/session/register.d.ts.map +1 -1
- package/dist/cli/commands/session/register.js +51 -21
- package/dist/cli/commands/session-commands.js +1 -1
- package/dist/cli/commands/setup.js +17 -14
- package/dist/cli/failure.d.ts +29 -0
- package/dist/cli/failure.d.ts.map +1 -0
- package/dist/cli/failure.js +31 -0
- package/dist/cli/help-json.d.ts +22 -0
- package/dist/cli/help-json.d.ts.map +1 -0
- package/dist/cli/help-json.js +20 -0
- package/dist/cli/import/claude-code.d.ts +10 -0
- package/dist/cli/import/claude-code.d.ts.map +1 -0
- package/dist/cli/import/claude-code.js +131 -0
- package/dist/cli/import/codex.d.ts +27 -0
- package/dist/cli/import/codex.d.ts.map +1 -0
- package/dist/cli/import/codex.js +148 -0
- package/dist/cli/import/git.d.ts +19 -0
- package/dist/cli/import/git.d.ts.map +1 -0
- package/dist/cli/import/git.js +95 -0
- package/dist/cli/import/local-chats.d.ts +28 -0
- package/dist/cli/import/local-chats.d.ts.map +1 -0
- package/dist/cli/import/local-chats.js +129 -0
- package/dist/cli/import/redaction.d.ts +37 -0
- package/dist/cli/import/redaction.d.ts.map +1 -0
- package/dist/cli/import/redaction.js +148 -0
- package/dist/cli/import/test-utils.d.ts +16 -0
- package/dist/cli/import/test-utils.d.ts.map +1 -0
- package/dist/cli/import/test-utils.js +223 -0
- package/dist/cli/import/transcript.d.ts +75 -0
- package/dist/cli/import/transcript.d.ts.map +1 -0
- package/dist/cli/import/transcript.js +123 -0
- package/dist/cli/interaction.d.ts +18 -0
- package/dist/cli/interaction.d.ts.map +1 -0
- package/dist/cli/interaction.js +30 -0
- package/dist/cli/modes/cli.d.ts.map +1 -1
- package/dist/cli/modes/cli.js +42 -9
- package/dist/cli/modes/server.js +8 -8
- package/dist/cli/modes/web.js +3 -3
- package/dist/cli/output.d.ts +9 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +6 -0
- package/dist/cli/utils/dexto-auth-check.d.ts +1 -1
- package/dist/cli/utils/dexto-auth-check.d.ts.map +1 -1
- package/dist/cli/utils/dexto-auth-check.js +4 -5
- package/dist/cli/utils/dexto-setup.d.ts +4 -5
- package/dist/cli/utils/dexto-setup.d.ts.map +1 -1
- package/dist/cli/utils/dexto-setup.js +17 -14
- package/dist/cli/utils/provider-setup.js +1 -1
- package/dist/cli/utils/scaffolding-utils.d.ts +9 -3
- package/dist/cli/utils/scaffolding-utils.d.ts.map +1 -1
- package/dist/cli/utils/scaffolding-utils.js +48 -40
- package/dist/cli/utils/version-check.d.ts.map +1 -1
- package/dist/cli/utils/version-check.js +2 -1
- package/dist/index-main.js +44 -65
- package/dist/webui/assets/index-D9xiOs62.js +1649 -0
- package/dist/webui/index.html +1 -1
- package/package.json +15 -14
- package/dist/cli/auth/api-client.d.ts +0 -125
- package/dist/cli/auth/api-client.d.ts.map +0 -1
- package/dist/cli/auth/api-client.js +0 -585
- package/dist/cli/auth/device.d.ts +0 -14
- package/dist/cli/auth/device.d.ts.map +0 -1
- package/dist/cli/auth/device.js +0 -84
- package/dist/cli/auth/dexto-api-key.d.ts +0 -34
- package/dist/cli/auth/dexto-api-key.d.ts.map +0 -1
- package/dist/cli/auth/dexto-api-key.js +0 -160
- package/dist/cli/auth/login-persistence.d.ts +0 -15
- package/dist/cli/auth/login-persistence.d.ts.map +0 -1
- package/dist/cli/auth/login-persistence.js +0 -72
- package/dist/cli/auth/oauth.d.ts +0 -39
- package/dist/cli/auth/oauth.d.ts.map +0 -1
- package/dist/cli/auth/oauth.js +0 -434
- package/dist/cli/auth/service.d.ts +0 -24
- package/dist/cli/auth/service.d.ts.map +0 -1
- package/dist/cli/auth/service.js +0 -161
- package/dist/cli/auth/types.d.ts +0 -11
- package/dist/cli/auth/types.d.ts.map +0 -1
- package/dist/cli/auth/types.js +0 -1
- package/dist/cli/cloud-chat.d.ts +0 -18
- package/dist/cli/cloud-chat.d.ts.map +0 -1
- package/dist/cli/cloud-chat.js +0 -734
- package/dist/cli/commands/auth/index.d.ts +0 -4
- package/dist/cli/commands/auth/index.d.ts.map +0 -1
- package/dist/cli/commands/auth/index.js +0 -4
- package/dist/cli/commands/auth/login.d.ts +0 -12
- package/dist/cli/commands/auth/login.d.ts.map +0 -1
- package/dist/cli/commands/auth/login.js +0 -153
- package/dist/cli/commands/auth/logout.d.ts +0 -5
- package/dist/cli/commands/auth/logout.d.ts.map +0 -1
- package/dist/cli/commands/auth/logout.js +0 -81
- package/dist/cli/commands/auth/register.d.ts +0 -3
- package/dist/cli/commands/auth/register.d.ts.map +0 -1
- package/dist/cli/commands/auth/register.js +0 -96
- package/dist/cli/commands/auth/status.d.ts +0 -2
- package/dist/cli/commands/auth/status.d.ts.map +0 -1
- package/dist/cli/commands/auth/status.js +0 -22
- package/dist/cli/commands/billing/index.d.ts +0 -2
- package/dist/cli/commands/billing/index.d.ts.map +0 -1
- package/dist/cli/commands/billing/index.js +0 -2
- package/dist/cli/commands/billing/register.d.ts +0 -3
- package/dist/cli/commands/billing/register.d.ts.map +0 -1
- package/dist/cli/commands/billing/register.js +0 -20
- package/dist/cli/commands/billing/status.d.ts +0 -8
- package/dist/cli/commands/billing/status.d.ts.map +0 -1
- package/dist/cli/commands/billing/status.js +0 -71
- package/dist/cli/commands/cloud/discovery.d.ts +0 -17
- package/dist/cli/commands/cloud/discovery.d.ts.map +0 -1
- package/dist/cli/commands/cloud/discovery.js +0 -88
- package/dist/cli/commands/deploy/client.d.ts +0 -113
- package/dist/cli/commands/deploy/client.d.ts.map +0 -1
- package/dist/cli/commands/deploy/client.js +0 -519
- package/dist/cli/commands/deploy/config.d.ts +0 -37
- package/dist/cli/commands/deploy/config.d.ts.map +0 -1
- package/dist/cli/commands/deploy/config.js +0 -144
- package/dist/cli/commands/deploy/entry-agent.d.ts +0 -3
- package/dist/cli/commands/deploy/entry-agent.d.ts.map +0 -1
- package/dist/cli/commands/deploy/entry-agent.js +0 -70
- package/dist/cli/commands/deploy/index.d.ts +0 -12
- package/dist/cli/commands/deploy/index.d.ts.map +0 -1
- package/dist/cli/commands/deploy/index.js +0 -370
- package/dist/cli/commands/deploy/links.d.ts +0 -3
- package/dist/cli/commands/deploy/links.d.ts.map +0 -1
- package/dist/cli/commands/deploy/links.js +0 -53
- package/dist/cli/commands/deploy/register.d.ts +0 -6
- package/dist/cli/commands/deploy/register.d.ts.map +0 -1
- package/dist/cli/commands/deploy/register.js +0 -128
- package/dist/cli/commands/deploy/snapshot.d.ts +0 -12
- package/dist/cli/commands/deploy/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/deploy/snapshot.js +0 -76
- package/dist/cli/commands/deploy/state.d.ts +0 -13
- package/dist/cli/commands/deploy/state.d.ts.map +0 -1
- package/dist/cli/commands/deploy/state.js +0 -122
- package/dist/cli/commands/span/register.d.ts +0 -6
- package/dist/cli/commands/span/register.d.ts.map +0 -1
- package/dist/cli/commands/span/register.js +0 -25
- package/dist/cli/commands/trace/client.d.ts +0 -98
- package/dist/cli/commands/trace/client.d.ts.map +0 -1
- package/dist/cli/commands/trace/client.js +0 -150
- package/dist/cli/commands/trace/format.d.ts +0 -5
- package/dist/cli/commands/trace/format.d.ts.map +0 -1
- package/dist/cli/commands/trace/format.js +0 -58
- package/dist/cli/commands/trace/index.d.ts +0 -21
- package/dist/cli/commands/trace/index.d.ts.map +0 -1
- package/dist/cli/commands/trace/index.js +0 -49
- package/dist/cli/commands/trace/register.d.ts +0 -6
- package/dist/cli/commands/trace/register.d.ts.map +0 -1
- package/dist/cli/commands/trace/register.js +0 -71
- package/dist/webui/assets/index-DEfRFmFT.js +0 -1667
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// `skills push`: packs a local Skill folder and creates or updates it in the person's library.
|
|
2
|
+
import { CommandFailure } from '../../failure.js';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { argument, flag, stringOption, UsageError, YES_OPTION, } from '../command.js';
|
|
8
|
+
import { tarArchive } from '../tar.js';
|
|
9
|
+
import { sendBytes } from '../transfer.js';
|
|
10
|
+
import { formatBytes } from './files.js';
|
|
11
|
+
import { agreeToCall, listWorkspaceTools, queryWorkspaceTool, toolCallLevel } from './workspace.js';
|
|
12
|
+
/** The most files a Skill bundle takes. */
|
|
13
|
+
const MAX_FILES = 200;
|
|
14
|
+
const SLUG = /^[a-z0-9._-]{1,80}$/u;
|
|
15
|
+
const PreparedSchema = z.object({
|
|
16
|
+
headers: z.record(z.string(), z.string()),
|
|
17
|
+
method: z.string(),
|
|
18
|
+
path: z.string(),
|
|
19
|
+
url: z.string(),
|
|
20
|
+
});
|
|
21
|
+
const SearchSchema = z.object({
|
|
22
|
+
skills: z.array(z.object({
|
|
23
|
+
slug: z.string(),
|
|
24
|
+
source: z.string(),
|
|
25
|
+
visibility: z.enum(['organization', 'private', 'shared']).nullable().default(null),
|
|
26
|
+
})),
|
|
27
|
+
});
|
|
28
|
+
const ImportedSchema = z.object({
|
|
29
|
+
location: z.object({ skillId: z.string() }),
|
|
30
|
+
slug: z.string(),
|
|
31
|
+
title: z.string(),
|
|
32
|
+
});
|
|
33
|
+
const push = {
|
|
34
|
+
arguments: '<folder>',
|
|
35
|
+
options: {
|
|
36
|
+
description: {
|
|
37
|
+
description: "What the Skill does (default: description in SKILL.md's header).",
|
|
38
|
+
type: 'string',
|
|
39
|
+
},
|
|
40
|
+
slug: {
|
|
41
|
+
description: "The Skill's slug (default: slug or name in SKILL.md's header, else the folder's name).",
|
|
42
|
+
type: 'string',
|
|
43
|
+
},
|
|
44
|
+
title: {
|
|
45
|
+
description: "The Skill's title (default: title in SKILL.md's header, else from the slug).",
|
|
46
|
+
type: 'string',
|
|
47
|
+
},
|
|
48
|
+
update: {
|
|
49
|
+
description: 'Update your Skill with this slug (default: update it if you have one, else create it).',
|
|
50
|
+
type: 'boolean',
|
|
51
|
+
},
|
|
52
|
+
...YES_OPTION,
|
|
53
|
+
},
|
|
54
|
+
path: ['skills', 'push'],
|
|
55
|
+
summary: 'Pack a local Skill folder (SKILL.md at its root, dotfiles left out) and create or update it in your library.',
|
|
56
|
+
async run(context, input) {
|
|
57
|
+
const folder = argument(input, 0, 'folder');
|
|
58
|
+
const files = await readSkillFolder(folder);
|
|
59
|
+
const header = skillHeader(new globalThis.TextDecoder().decode(files[0]?.bytes));
|
|
60
|
+
const named = header.name !== undefined && SLUG.test(header.name) ? header.name : null;
|
|
61
|
+
const slug = stringOption(input, 'slug') ??
|
|
62
|
+
header.slug ??
|
|
63
|
+
named ??
|
|
64
|
+
path.basename(path.resolve(folder));
|
|
65
|
+
if (!SLUG.test(slug))
|
|
66
|
+
throw new UsageError(`${slug} can't be a Skill's slug: use up to 80 lowercase letters, digits, dots, dashes and underscores. Pass --slug.`);
|
|
67
|
+
const title = stringOption(input, 'title') ??
|
|
68
|
+
header.title ??
|
|
69
|
+
(named === null ? header.name : undefined) ??
|
|
70
|
+
titleFromSlug(slug);
|
|
71
|
+
const description = stringOption(input, 'description') ?? header.description;
|
|
72
|
+
if (description === undefined)
|
|
73
|
+
throw new UsageError("SKILL.md's header has no description. Add one there, or pass --description.");
|
|
74
|
+
const mode = flag(input, 'update') || (await ownsSkill(context, slug)) ? 'update' : 'create';
|
|
75
|
+
const metadata = { description, mode, slug, title };
|
|
76
|
+
// Ask before anything is sent: the import is what changes the library.
|
|
77
|
+
const tool = (await listWorkspaceTools(context)).find((each) => each.name === 'dexto_skill_bundle_import');
|
|
78
|
+
const agreed = tool === undefined
|
|
79
|
+
? {}
|
|
80
|
+
: await agreeToCall(context, {
|
|
81
|
+
level: toolCallLevel(tool, metadata),
|
|
82
|
+
schema: tool.inputSchema,
|
|
83
|
+
title: `${mode === 'create' ? 'Create' : 'Update'} the Skill ${slug}`,
|
|
84
|
+
}, flag(input, 'yes'));
|
|
85
|
+
const archive = tarArchive(files);
|
|
86
|
+
const prepared = PreparedSchema.safeParse(await queryWorkspaceTool(context, 'dexto_upload_prepare', {
|
|
87
|
+
filename: `${slug}.tar`,
|
|
88
|
+
mimeType: 'application/x-tar',
|
|
89
|
+
purpose: 'skill-bundle',
|
|
90
|
+
sha256: createHash('sha256').update(archive).digest('hex'),
|
|
91
|
+
sizeBytes: archive.length,
|
|
92
|
+
}));
|
|
93
|
+
if (!prepared.success)
|
|
94
|
+
throw new CommandFailure('failed', "Dexto didn't say where to upload the bundle.", null);
|
|
95
|
+
const { headers, method, url } = prepared.data;
|
|
96
|
+
await sendBytes(context, { headers, method, url }, new globalThis.Blob([archive]));
|
|
97
|
+
const imported = await queryWorkspaceTool(context, 'dexto_skill_bundle_import', {
|
|
98
|
+
...metadata,
|
|
99
|
+
uploadPath: prepared.data.path,
|
|
100
|
+
...agreed,
|
|
101
|
+
});
|
|
102
|
+
const shown = ImportedSchema.safeParse(imported);
|
|
103
|
+
context.output.result(imported, shown.success
|
|
104
|
+
? `${mode === 'create' ? 'Created' : 'Updated'} ${shown.data.title} (${shown.data.slug}, ${files.length} file${files.length === 1 ? '' : 's'}, ${formatBytes(archive.length)}): skill ${shown.data.location.skillId}.`
|
|
105
|
+
: JSON.stringify(imported, null, 2));
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* The folder's files, SKILL.md first, as the bundle takes them: relative paths, the executable bit
|
|
110
|
+
* kept. Names starting with a dot (`.git`, the reserved `.dexto`) and links are left out.
|
|
111
|
+
*/
|
|
112
|
+
async function readSkillFolder(folder) {
|
|
113
|
+
if ((await stat(folder).catch(() => null))?.isDirectory() !== true)
|
|
114
|
+
throw new UsageError(`${folder} is not a folder.`);
|
|
115
|
+
const found = [];
|
|
116
|
+
const visit = async (relative) => {
|
|
117
|
+
const entries = await readdir(path.join(folder, relative), { withFileTypes: true });
|
|
118
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
119
|
+
if (entry.name.startsWith('.'))
|
|
120
|
+
continue;
|
|
121
|
+
const child = relative === '' ? entry.name : `${relative}/${entry.name}`;
|
|
122
|
+
if (entry.isDirectory())
|
|
123
|
+
await visit(child);
|
|
124
|
+
else if (entry.isFile())
|
|
125
|
+
found.push({
|
|
126
|
+
executable: ((await stat(path.join(folder, child))).mode & 0o111) !== 0,
|
|
127
|
+
path: child,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
await visit('');
|
|
132
|
+
if (!found.some((file) => file.path === 'SKILL.md'))
|
|
133
|
+
throw new UsageError(`${folder} has no SKILL.md at its root.`);
|
|
134
|
+
if (found.length > MAX_FILES)
|
|
135
|
+
throw new UsageError(`${folder} has ${found.length} files; a Skill takes up to ${MAX_FILES}.`);
|
|
136
|
+
const ordered = [
|
|
137
|
+
...found.filter((file) => file.path === 'SKILL.md'),
|
|
138
|
+
...found.filter((file) => file.path !== 'SKILL.md'),
|
|
139
|
+
];
|
|
140
|
+
return await Promise.all(ordered.map(async (file) => ({
|
|
141
|
+
...file,
|
|
142
|
+
bytes: await readFile(path.join(folder, file.path)),
|
|
143
|
+
})));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Whether the person has a Skill with this slug they can save over: their own, or their
|
|
147
|
+
* organization's. One someone shared with them is theirs to copy, so a push makes the person's own.
|
|
148
|
+
*/
|
|
149
|
+
async function ownsSkill(context, slug) {
|
|
150
|
+
const found = SearchSchema.safeParse(await queryWorkspaceTool(context, 'dexto_skills_search', {
|
|
151
|
+
limit: 50,
|
|
152
|
+
query: slug,
|
|
153
|
+
source: 'library',
|
|
154
|
+
}));
|
|
155
|
+
return (found.success &&
|
|
156
|
+
found.data.skills.some((skill) => skill.slug === slug &&
|
|
157
|
+
skill.source === 'user' &&
|
|
158
|
+
(skill.visibility === 'private' || skill.visibility === 'organization')));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The plain fields of SKILL.md's `---` header: one-line values, quoted or not, and `>` or `|` blocks
|
|
162
|
+
* on the indented lines below.
|
|
163
|
+
*/
|
|
164
|
+
function skillHeader(text) {
|
|
165
|
+
const lines = text.split(/\r?\n/u);
|
|
166
|
+
if (lines[0] !== '---')
|
|
167
|
+
return {};
|
|
168
|
+
const end = lines.indexOf('---', 1);
|
|
169
|
+
const body = lines.slice(1, end === -1 ? 1 : end);
|
|
170
|
+
const fields = {};
|
|
171
|
+
for (const [index, line] of body.entries()) {
|
|
172
|
+
const match = /^(description|name|slug|title):\s*(.*)$/u.exec(line);
|
|
173
|
+
if (match === null)
|
|
174
|
+
continue;
|
|
175
|
+
const [, key = '', raw = ''] = match;
|
|
176
|
+
const value = /^[>|][-+]?$/u.test(raw)
|
|
177
|
+
? blockValue(body.slice(index + 1), raw.startsWith('>') ? ' ' : '\n')
|
|
178
|
+
: unquote(raw.trim());
|
|
179
|
+
if (value.length > 0)
|
|
180
|
+
fields[key] = value;
|
|
181
|
+
}
|
|
182
|
+
return fields;
|
|
183
|
+
}
|
|
184
|
+
/** A `>` or `|` block: the indented lines after its key, joined. */
|
|
185
|
+
function blockValue(lines, separator) {
|
|
186
|
+
const end = lines.findIndex((line) => line.length > 0 && !/^\s/u.test(line));
|
|
187
|
+
return (end === -1 ? lines : lines.slice(0, end))
|
|
188
|
+
.map((line) => line.trim())
|
|
189
|
+
.join(separator)
|
|
190
|
+
.trim();
|
|
191
|
+
}
|
|
192
|
+
function unquote(value) {
|
|
193
|
+
return /^(["']).*\1$/u.test(value) ? value.slice(1, -1) : value;
|
|
194
|
+
}
|
|
195
|
+
/** `llm-wiki` is `Llm Wiki`. */
|
|
196
|
+
function titleFromSlug(slug) {
|
|
197
|
+
return slug
|
|
198
|
+
.split(/[-_.]+/u)
|
|
199
|
+
.filter((part) => part.length > 0)
|
|
200
|
+
.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
|
|
201
|
+
.join(' ');
|
|
202
|
+
}
|
|
203
|
+
export const skillCommands = [push];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traces.d.ts","sourceRoot":"","sources":["../../../../src/cli/cloud/commands/traces.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuD,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAgLlG,eAAO,MAAM,aAAa,EAAE,SAAS,OAAO,EAAqC,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// `trace list|view` and `span list`: a person's run traces, read from /v1/traces.
|
|
2
|
+
import { unwrap } from '@dexto/cloud-client';
|
|
3
|
+
import { argument, choiceOption, integerOption, stringOption } from '../command.js';
|
|
4
|
+
/**
|
|
5
|
+
* Every value the server takes for one query option, and no other: a value added or removed on the
|
|
6
|
+
* server fails to compile here, so the CLI never refuses what the server accepts.
|
|
7
|
+
*/
|
|
8
|
+
function everyValue() {
|
|
9
|
+
return (list) => list;
|
|
10
|
+
}
|
|
11
|
+
const RUN_STATUSES = everyValue()([
|
|
12
|
+
'cancelled',
|
|
13
|
+
'completed',
|
|
14
|
+
'failed',
|
|
15
|
+
'queued',
|
|
16
|
+
'retrying',
|
|
17
|
+
'running',
|
|
18
|
+
'waiting_approval',
|
|
19
|
+
]);
|
|
20
|
+
const SPAN_STATUSES = everyValue()(['completed', 'failed']);
|
|
21
|
+
const SPAN_SORTS = everyValue()(['started_at', 'duration']);
|
|
22
|
+
const TRACE_COLUMNS = [
|
|
23
|
+
{ header: 'run', value: (trace) => trace.run_id },
|
|
24
|
+
{ header: 'status', value: (trace) => trace.status },
|
|
25
|
+
{ header: 'spans', value: (trace) => trace.span_count },
|
|
26
|
+
{ header: 'errors', value: (trace) => trace.error_count },
|
|
27
|
+
{ header: 'duration', value: (trace) => milliseconds(trace.duration_ms) },
|
|
28
|
+
{ header: 'last span', value: (trace) => trace.last_span_started_at },
|
|
29
|
+
{ header: 'session', value: (trace) => trace.session_id },
|
|
30
|
+
{ header: 'span names', value: (trace) => trace.span_names.join(', ') },
|
|
31
|
+
];
|
|
32
|
+
const SPAN_COLUMNS = [
|
|
33
|
+
{ header: 'started', value: (span) => span.started_at },
|
|
34
|
+
{ header: 'status', value: (span) => span.status },
|
|
35
|
+
{ header: 'duration', value: (span) => milliseconds(span.duration_ms) },
|
|
36
|
+
{ header: 'name', value: (span) => span.name },
|
|
37
|
+
{ header: 'span', value: (span) => span.span_id },
|
|
38
|
+
{ header: 'error', value: (span) => span.error_message },
|
|
39
|
+
];
|
|
40
|
+
const traceList = {
|
|
41
|
+
options: {
|
|
42
|
+
limit: { description: 'How many to return (at most 100).', type: 'string', valueName: 'N' },
|
|
43
|
+
period: {
|
|
44
|
+
description: 'Only runs with a span in this recent period, such as 15m, 3h or 7d.',
|
|
45
|
+
type: 'string',
|
|
46
|
+
},
|
|
47
|
+
session: { description: 'Only runs of this chat.', type: 'string', valueName: 'ID' },
|
|
48
|
+
status: {
|
|
49
|
+
description: `Only runs in this status: ${RUN_STATUSES.join(', ')}.`,
|
|
50
|
+
type: 'string',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
path: ['trace', 'list'],
|
|
54
|
+
summary: 'List your recent run traces, newest first. Spans are kept 30 days.',
|
|
55
|
+
async run(context, input) {
|
|
56
|
+
const limit = integerOption(input, 'limit');
|
|
57
|
+
const period = stringOption(input, 'period');
|
|
58
|
+
const session = stringOption(input, 'session');
|
|
59
|
+
const status = choiceOption(input, 'status', RUN_STATUSES);
|
|
60
|
+
const page = await unwrap(await (await context.client()).GET('/v1/traces', {
|
|
61
|
+
params: {
|
|
62
|
+
query: {
|
|
63
|
+
...(limit === undefined ? {} : { limit }),
|
|
64
|
+
...(period === undefined ? {} : { period }),
|
|
65
|
+
...(session === undefined ? {} : { session_id: session }),
|
|
66
|
+
...(status === undefined ? {} : { status }),
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
}));
|
|
70
|
+
context.output.list(page, TRACE_COLUMNS);
|
|
71
|
+
if (page.has_more && !context.output.json)
|
|
72
|
+
context.output.note('More traces match: narrow --period or raise --limit (at most 100).');
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const traceView = {
|
|
76
|
+
arguments: '<run_id>',
|
|
77
|
+
path: ['trace', 'view'],
|
|
78
|
+
summary: "Show one run's trace: its spans in start order, with any errors.",
|
|
79
|
+
async run(context, input) {
|
|
80
|
+
const runId = argument(input, 0, 'run_id');
|
|
81
|
+
const trace = await unwrap(await (await context.client()).GET('/v1/traces/{run_id}', { params: { path: { run_id: runId } } }));
|
|
82
|
+
context.output.result(trace, formatTrace(trace));
|
|
83
|
+
if (trace.has_more && !context.output.json)
|
|
84
|
+
context.output.note(`This trace stops at ${trace.spans.length} spans. See the rest with dexto span list ${runId} --name or --status.`);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const spanList = {
|
|
88
|
+
arguments: '<run_id>',
|
|
89
|
+
options: {
|
|
90
|
+
limit: { description: 'How many to return (at most 500).', type: 'string', valueName: 'N' },
|
|
91
|
+
name: { description: 'Only spans with exactly this name.', type: 'string' },
|
|
92
|
+
sort: {
|
|
93
|
+
description: 'started_at (default), or duration for the longest first.',
|
|
94
|
+
type: 'string',
|
|
95
|
+
},
|
|
96
|
+
status: { description: 'Only spans that completed or failed.', type: 'string' },
|
|
97
|
+
},
|
|
98
|
+
path: ['span', 'list'],
|
|
99
|
+
summary: "List one run's spans.",
|
|
100
|
+
async run(context, input) {
|
|
101
|
+
const runId = argument(input, 0, 'run_id');
|
|
102
|
+
const limit = integerOption(input, 'limit');
|
|
103
|
+
const name = stringOption(input, 'name');
|
|
104
|
+
const sort = choiceOption(input, 'sort', SPAN_SORTS);
|
|
105
|
+
const status = choiceOption(input, 'status', SPAN_STATUSES);
|
|
106
|
+
const page = await unwrap(await (await context.client()).GET('/v1/traces/{run_id}/spans', {
|
|
107
|
+
params: {
|
|
108
|
+
path: { run_id: runId },
|
|
109
|
+
query: {
|
|
110
|
+
...(limit === undefined ? {} : { limit }),
|
|
111
|
+
...(name === undefined ? {} : { name }),
|
|
112
|
+
...(sort === undefined ? {} : { sort }),
|
|
113
|
+
...(status === undefined ? {} : { status }),
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
}));
|
|
117
|
+
context.output.list(page, SPAN_COLUMNS);
|
|
118
|
+
if (page.has_more && !context.output.json)
|
|
119
|
+
context.output.note('More spans match: filter with --name or raise --limit (at most 500).');
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
function milliseconds(value) {
|
|
123
|
+
return `${Math.round(value)}ms`;
|
|
124
|
+
}
|
|
125
|
+
/** 1.x's `dexto trace` view: one line per span, with its error under it. */
|
|
126
|
+
function formatTrace(trace) {
|
|
127
|
+
const lines = [
|
|
128
|
+
`Run trace ${trace.run_id}`,
|
|
129
|
+
`Spans: ${trace.spans.length} Events: ${trace.events.length}`,
|
|
130
|
+
];
|
|
131
|
+
if (trace.spans.length === 0)
|
|
132
|
+
return [...lines, 'No spans found.'].join('\n');
|
|
133
|
+
lines.push('');
|
|
134
|
+
// The API returns spans by start time.
|
|
135
|
+
for (const span of trace.spans) {
|
|
136
|
+
lines.push(`${span.started_at} ${span.status.padEnd(9)} ${milliseconds(span.duration_ms).padStart(8)} ${span.name}`);
|
|
137
|
+
if (span.error_message !== null)
|
|
138
|
+
lines.push(` error: ${span.error_message}`);
|
|
139
|
+
}
|
|
140
|
+
return lines.join('\n');
|
|
141
|
+
}
|
|
142
|
+
export const traceCommands = [traceList, traceView, spanList];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../../src/cli/cloud/commands/web.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AA+D5D,eAAO,MAAM,WAAW,EAAE,SAAS,OAAO,EAAyB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// `cloud search` and `cloud fetch`: the web as /v1/search and /v1/fetch serve it.
|
|
2
|
+
import { unwrap } from '@dexto/cloud-client';
|
|
3
|
+
import { integerOption } from '../command.js';
|
|
4
|
+
const search = {
|
|
5
|
+
arguments: '<query...>',
|
|
6
|
+
options: {
|
|
7
|
+
num: { description: 'How many results (default 10).', type: 'string', valueName: 'N' },
|
|
8
|
+
},
|
|
9
|
+
path: ['cloud', 'search'],
|
|
10
|
+
summary: 'Search the web.',
|
|
11
|
+
async run(context, input) {
|
|
12
|
+
const numResults = integerOption(input, 'num');
|
|
13
|
+
const result = await unwrap(await (await context.client()).POST('/v1/search', {
|
|
14
|
+
body: {
|
|
15
|
+
query: input.positionals.join(' '),
|
|
16
|
+
...(numResults === undefined ? {} : { num_results: numResults }),
|
|
17
|
+
},
|
|
18
|
+
}));
|
|
19
|
+
if (context.output.json)
|
|
20
|
+
return context.output.record(result);
|
|
21
|
+
for (const item of result.results)
|
|
22
|
+
context.runtime.writeOutput(`${item.title ?? item.url}\n ${item.url}${item.highlights.length === 0 ? '' : `\n ${item.highlights[0]}`}\n\n`);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const fetchPages = {
|
|
26
|
+
arguments: '<url...>',
|
|
27
|
+
options: {
|
|
28
|
+
'max-chars': {
|
|
29
|
+
description: 'Text characters per page, 100 to 100000 (default 20000).',
|
|
30
|
+
type: 'string',
|
|
31
|
+
valueName: 'N',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
path: ['cloud', 'fetch'],
|
|
35
|
+
summary: 'Read up to 10 web pages as text.',
|
|
36
|
+
async run(context, input) {
|
|
37
|
+
const maxCharacters = integerOption(input, 'max-chars');
|
|
38
|
+
const result = await unwrap(await (await context.client()).POST('/v1/fetch', {
|
|
39
|
+
body: {
|
|
40
|
+
urls: [...input.positionals],
|
|
41
|
+
...(maxCharacters === undefined ? {} : { max_characters: maxCharacters }),
|
|
42
|
+
},
|
|
43
|
+
}));
|
|
44
|
+
if (context.output.jsonContent)
|
|
45
|
+
return context.output.record(result);
|
|
46
|
+
for (const page of result.results)
|
|
47
|
+
context.runtime.writeOutput(page.status === 'ok'
|
|
48
|
+
? `# ${page.title ?? page.url}\n${page.url}\n\n${page.text ?? ''}\n\n`
|
|
49
|
+
: `# ${page.url}\nFailed: ${page.error?.code ?? 'error'}\n\n`);
|
|
50
|
+
return result.results.some((page) => page.status === 'error') ? 1 : 0;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
export const webCommands = [search, fetchPages];
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { type CommandContext } from '../command.js';
|
|
2
|
+
import { type WorkspaceTool } from './workspace.js';
|
|
3
|
+
/** One app or service: how many of its tools the sign-in reaches, and how many App actions it has. */
|
|
4
|
+
export interface WorkspaceApp {
|
|
5
|
+
readonly actions: number;
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly kind: string;
|
|
8
|
+
readonly tools: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* One thing an app does: a workspace tool, one action of a tool that is the whole app (such as
|
|
12
|
+
* `dexto_drive`), or an App action run through `dexto_apps_action`.
|
|
13
|
+
*/
|
|
14
|
+
export interface Operation {
|
|
15
|
+
readonly call: {
|
|
16
|
+
readonly kind: 'action';
|
|
17
|
+
readonly toolName: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly action: string | null;
|
|
20
|
+
/** Each action's own level, where a tool's actions differ (`dexto/action_levels`). */
|
|
21
|
+
readonly actionLevels: Readonly<Record<string, string>>;
|
|
22
|
+
readonly kind: 'tool';
|
|
23
|
+
readonly name: string;
|
|
24
|
+
};
|
|
25
|
+
/** The schema whose `confirm` field says the person agreed: the tool's, or `dexto_apps_action`'s. */
|
|
26
|
+
readonly confirmSchema: unknown;
|
|
27
|
+
readonly description: string;
|
|
28
|
+
readonly inputSchema: unknown;
|
|
29
|
+
readonly level: string;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly title: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The apps the sign-in reaches: those whose manifests provide its tools, and the Apps whose
|
|
35
|
+
* actions it can run. Tools a server lists without a provider stay under `workspace call`.
|
|
36
|
+
*/
|
|
37
|
+
export declare function listWorkspaceApps(context: CommandContext): Promise<WorkspaceApp[]>;
|
|
38
|
+
/** A command the CLI itself adds to an app, such as `drive put`, listed with the app's operations. */
|
|
39
|
+
export interface AppCommand {
|
|
40
|
+
/** Its words after the app's, such as `put`. */
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly summary: string;
|
|
43
|
+
readonly usage: string;
|
|
44
|
+
}
|
|
45
|
+
/** Runs `<app> [operation] [action] [--field value…]`; `commands` are the CLI's own for the app. */
|
|
46
|
+
export declare function runWorkspaceApp(context: CommandContext, args: readonly string[], help: boolean, commands: readonly AppCommand[]): Promise<number>;
|
|
47
|
+
/** A Dexto tool and the arguments to call it with, as search names a route's call. */
|
|
48
|
+
export interface ToolCall {
|
|
49
|
+
readonly arguments: Readonly<Record<string, unknown>>;
|
|
50
|
+
readonly tool: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The CLI command that makes a call: `dexto workspace <app> <operation> --field value`, or
|
|
54
|
+
* `workspace call` when no app operation does. A value written `<type>` is left for the caller to
|
|
55
|
+
* fill in. `operationsByApp` keeps each app's operations across calls.
|
|
56
|
+
*/
|
|
57
|
+
export declare function commandForCall(context: CommandContext, tools: readonly WorkspaceTool[], call: ToolCall, operationsByApp: Map<string, Operation[]>): Promise<string>;
|
|
58
|
+
//# sourceMappingURL=workspace-apps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-apps.d.ts","sourceRoot":"","sources":["../../../../src/cli/cloud/commands/workspace-apps.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiD,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAGnG,OAAO,EAMH,KAAK,aAAa,EACrB,MAAM,gBAAgB,CAAC;AAExB,sGAAsG;AACtG,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,IAAI,EACP;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACtD;QACI,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,sFAAsF;QACtF,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACzB,CAAC;IACR,qGAAqG;IACrG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAqBxF;AAED,sGAAsG;AACtG,MAAM,WAAW,UAAU;IACvB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,oGAAoG;AACpG,wBAAsB,eAAe,CACjC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,SAAS,UAAU,EAAE,GAChC,OAAO,CAAC,MAAM,CAAC,CAwDjB;AA0GD,sFAAsF;AACtF,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAChC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,IAAI,EAAE,QAAQ,EACd,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
|