@lesliechan721/aw 0.1.0-beta.54 → 0.1.0-beta.56
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/authoring/scripts/lib/plugin-version-check.mjs +1 -1
- package/dist/authoring/scripts/validate-plugin.mjs +208 -31
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- package/dist/scripts/bundle-plugins.js +8 -3
- package/dist/scripts/bundle-plugins.js.map +1 -1
- package/dist/src/adapters/helpers.d.ts +7 -0
- package/dist/src/adapters/helpers.js.map +1 -1
- package/dist/src/commands/aw-capabilities.d.ts +1 -1
- package/dist/src/commands/aw-capabilities.js +2 -0
- package/dist/src/commands/aw-capabilities.js.map +1 -1
- package/dist/src/commands/managed-commands.d.ts +26 -0
- package/dist/src/commands/managed-commands.js +277 -0
- package/dist/src/commands/managed-commands.js.map +1 -0
- package/dist/src/commands/operation-plan.d.ts +30 -1
- package/dist/src/commands/operation-plan.js.map +1 -1
- package/dist/src/commands/operation-planner.d.ts +1 -0
- package/dist/src/commands/operation-planner.js +1 -0
- package/dist/src/commands/operation-planner.js.map +1 -1
- package/dist/src/commands/plugin-capabilities.js +29 -1
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +2 -1
- package/dist/src/commands/rebuild-command.js +66 -26
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +13 -1
- package/dist/src/commands/rebuild-integration.js +535 -61
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.d.ts +3 -1
- package/dist/src/commands/rebuild-operations.js +9 -5
- package/dist/src/commands/rebuild-operations.js.map +1 -1
- package/dist/src/generators/local-plugin.js +16 -0
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/generators/permissions.d.ts +5 -2
- package/dist/src/generators/permissions.js +28 -15
- package/dist/src/generators/permissions.js.map +1 -1
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/command-receipt.d.ts +3 -1
- package/dist/src/output/command-receipt.js +30 -9
- package/dist/src/output/command-receipt.js.map +1 -1
- package/dist/src/output/rebuild-progress.js +14 -0
- package/dist/src/output/rebuild-progress.js.map +1 -1
- package/dist/src/portable/materializer.js +3 -0
- package/dist/src/portable/materializer.js.map +1 -1
- package/dist/src/review/skill-materialization.d.ts +14 -1
- package/dist/src/review/skill-materialization.js +138 -0
- package/dist/src/review/skill-materialization.js.map +1 -1
- package/dist/src/tui/console-app-v4.js +19 -7
- package/dist/src/tui/console-app-v4.js.map +1 -1
- package/dist/src/tui/controller-runtime.js +23 -9
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +5 -1
- package/dist/src/tui/controller.js +24 -3
- package/dist/src/tui/controller.js.map +1 -1
- package/dist/src/tui/diagnostic-projection.js +34 -6
- package/dist/src/tui/diagnostic-projection.js.map +1 -1
- package/dist/src/tui/operation-review-planner.js +102 -16
- package/dist/src/tui/operation-review-planner.js.map +1 -1
- package/dist/src/types.d.ts +22 -2
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/artifact-plan.d.ts +4 -3
- package/dist/src/utils/artifact-plan.js +50 -7
- package/dist/src/utils/artifact-plan.js.map +1 -1
- package/dist/src/utils/artifact-renderer.d.ts +7 -3
- package/dist/src/utils/artifact-renderer.js +19 -6
- package/dist/src/utils/artifact-renderer.js.map +1 -1
- package/dist/src/utils/artifact-request.d.ts +16 -5
- package/dist/src/utils/artifact-request.js +27 -15
- package/dist/src/utils/artifact-request.js.map +1 -1
- package/dist/src/utils/artifact-sources.d.ts +4 -0
- package/dist/src/utils/artifact-sources.js +17 -0
- package/dist/src/utils/artifact-sources.js.map +1 -1
- package/dist/src/utils/bundle-layout.js +7 -0
- package/dist/src/utils/bundle-layout.js.map +1 -1
- package/dist/src/utils/claude-skills-root.d.ts +8 -0
- package/dist/src/utils/claude-skills-root.js +76 -0
- package/dist/src/utils/claude-skills-root.js.map +1 -0
- package/dist/src/utils/codex-skills-root.d.ts +4 -0
- package/dist/src/utils/codex-skills-root.js +25 -0
- package/dist/src/utils/codex-skills-root.js.map +1 -0
- package/dist/src/utils/dynamic-skill-tree.d.ts +1 -0
- package/dist/src/utils/dynamic-skill-tree.js +25 -6
- package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
- package/dist/src/utils/local-marketplace.d.ts +9 -0
- package/dist/src/utils/local-marketplace.js +170 -90
- package/dist/src/utils/local-marketplace.js.map +1 -1
- package/dist/src/utils/managed-command-closure.d.ts +3 -0
- package/dist/src/utils/managed-command-closure.js +35 -0
- package/dist/src/utils/managed-command-closure.js.map +1 -0
- package/dist/src/utils/managed-command-evidence.d.ts +7 -0
- package/dist/src/utils/managed-command-evidence.js +86 -0
- package/dist/src/utils/managed-command-evidence.js.map +1 -0
- package/dist/src/utils/managed-command-materialization.d.ts +106 -0
- package/dist/src/utils/managed-command-materialization.js +307 -0
- package/dist/src/utils/managed-command-materialization.js.map +1 -0
- package/dist/src/utils/managed-command-runtime.d.ts +32 -0
- package/dist/src/utils/managed-command-runtime.js +110 -0
- package/dist/src/utils/managed-command-runtime.js.map +1 -0
- package/dist/src/utils/managed-command-store.d.ts +124 -0
- package/dist/src/utils/managed-command-store.js +576 -0
- package/dist/src/utils/managed-command-store.js.map +1 -0
- package/dist/src/utils/ownership.d.ts +2 -0
- package/dist/src/utils/plugin-config-impact.d.ts +8 -1
- package/dist/src/utils/plugin-config-impact.js +101 -26
- package/dist/src/utils/plugin-config-impact.js.map +1 -1
- package/dist/src/utils/plugin-config-write.js +142 -60
- package/dist/src/utils/plugin-config-write.js.map +1 -1
- package/dist/src/utils/rendered-contract.js +18 -1
- package/dist/src/utils/rendered-contract.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { getCommandPackageId, getManagedCommandArtifactTargets, getPluginCommandId, normalizeProducerIdentity, normalizeCommandRelativeFile, replaceManagedCommandPlaceholders, validateCommandEntryFiles, } from '@lesliechan721/aw-plugin-core/manifest';
|
|
5
|
+
import { resolveArtifactRenderConfig, runArtifactRenderer } from './artifact-renderer.js';
|
|
6
|
+
import { resolveCommandSourceDirectory } from './artifact-sources.js';
|
|
7
|
+
import { validateArtifactPlan } from './artifact-plan.js';
|
|
8
|
+
import { inspectManagedCommand, listManagedCommandPackages, listManagedCommands, managedCommandDiagnostic, ManagedCommandError, readInstalledCommandProducer, syncManagedCommandPackage, validateManagedCommandResource, } from './managed-command-store.js';
|
|
9
|
+
import { resolveCanonicalRepoProjectKey } from './state-paths.js';
|
|
10
|
+
import { validateManagedCommandPackageClosure } from './managed-command-closure.js';
|
|
11
|
+
import { isSkillAuthorOnlyPath } from './skill-authoring.js';
|
|
12
|
+
import { AW_RUNTIME_CONFIG_BINDING_PATH, AW_RUNTIME_CONFIG_READER_PATH, AW_RUNTIME_NATIVE_RECEIPT_PATH } from '@lesliechan721/aw-plugin-core';
|
|
13
|
+
export async function discoverRetainedManagedCommandPackages(options) {
|
|
14
|
+
const listed = await listManagedCommandPackages(options.env).catch(() => ({ packages: [], errors: [] }));
|
|
15
|
+
const selected = listed.packages.filter(({ producer }) => options.all === true || options.selectors.some((selector) => selector.pluginName === producer.pluginName && selector.sourceId === producer.sourceId));
|
|
16
|
+
let projectRoot;
|
|
17
|
+
if (options.scope === 'project' && selected.some(({ producer }) => producer.scope === 'project')) {
|
|
18
|
+
projectRoot = path.normalize(await fs.realpath(await resolveCanonicalRepoProjectKey(options.cwd)));
|
|
19
|
+
if (process.platform === 'win32')
|
|
20
|
+
projectRoot = projectRoot.replace(/^[a-z]:/u, (drive) => drive.toUpperCase());
|
|
21
|
+
}
|
|
22
|
+
return selected.filter(({ producer }) => producer.scope === 'user'
|
|
23
|
+
|| (options.scope === 'project' && producer.projectRoot === projectRoot)).map((entry) => ({
|
|
24
|
+
producer: entry.producer, packageId: entry.id, commandIds: entry.sets.flatMap((set) => set.commandIds),
|
|
25
|
+
availability: entry.availability, errors: entry.errors,
|
|
26
|
+
recoveryAction: `aw command package remove ${entry.id} --yes`,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
export function retainedManagedCommandPackageResult(entry) {
|
|
30
|
+
return { producer: entry.producer,
|
|
31
|
+
state: entry.availability === 'unavailable' ? 'partial' : 'completed', commandIds: entry.commandIds,
|
|
32
|
+
removedCommandIds: [], errors: entry.errors, recoveryActions: [entry.recoveryAction] };
|
|
33
|
+
}
|
|
34
|
+
export async function prepareManagedCommandPackageFiles(options) {
|
|
35
|
+
await validateManagedCommandResource(options.sourceRoot);
|
|
36
|
+
const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'aw-command-package-'));
|
|
37
|
+
const resourceRoot = path.join(tempRoot, 'resource');
|
|
38
|
+
try {
|
|
39
|
+
await fs.copy(options.sourceRoot, resourceRoot, { dereference: false, errorOnExist: true });
|
|
40
|
+
for (const [relative, content] of Object.entries(options.files)) {
|
|
41
|
+
normalizeCommandRelativeFile(relative, 'command package generated file');
|
|
42
|
+
if (isSkillAuthorOnlyPath(relative) || relative.split('/').some((segment) => ['.git', 'node_modules', '.agents-plugin', '.codex-plugin', '.claude-plugin', '.release', '.tmp', 'evals', 'reports', '.aw-command-producer.json', '.agent-workflows-owner.json', 'owner.json', 'aw-plugin-requirements.json'].includes(segment)) || [AW_RUNTIME_CONFIG_BINDING_PATH, AW_RUNTIME_CONFIG_READER_PATH, AW_RUNTIME_NATIVE_RECEIPT_PATH].includes(relative) || options.entries.some((entry) => entry.entry === relative))
|
|
43
|
+
throw new ManagedCommandError('commandResourceInvalid', 'Generated files cannot replace protected resources or command entries.');
|
|
44
|
+
const destination = path.join(resourceRoot, ...relative.split('/'));
|
|
45
|
+
const existing = await fs.lstat(destination).catch(() => null);
|
|
46
|
+
if (existing && !existing.isFile())
|
|
47
|
+
throw new ManagedCommandError('commandResourceInvalid', 'A generated file conflicts with a directory.');
|
|
48
|
+
if (existing && ((existing.mode & 0o111) !== 0 || /\.(?:[cm]?js|[cm]?ts|sh|bash|zsh|py|rb|exe|com|cmd|bat|ps1)$/iu.test(relative)))
|
|
49
|
+
throw new ManagedCommandError('commandResourceInvalid', 'Generated configuration cannot replace executable code.');
|
|
50
|
+
await fs.ensureDir(path.dirname(destination));
|
|
51
|
+
await fs.writeFile(destination, content, { mode: 0o600 });
|
|
52
|
+
await fs.chmod(destination, 0o600);
|
|
53
|
+
}
|
|
54
|
+
for (const reserved of ['.aw-command-producer.json', '.agent-workflows-owner.json', 'owner.json']) {
|
|
55
|
+
if (await fs.pathExists(path.join(resourceRoot, reserved)))
|
|
56
|
+
throw new ManagedCommandError('commandResourceInvalid', 'The package source contains an AW reserved resource.');
|
|
57
|
+
}
|
|
58
|
+
await validateManagedCommandResource(resourceRoot);
|
|
59
|
+
await validateCommandEntryFiles(resourceRoot, options.entries);
|
|
60
|
+
await validateManagedCommandPackageClosure(resourceRoot, options.entries);
|
|
61
|
+
for (const entry of options.entries)
|
|
62
|
+
await validateManagedCommandResource(resourceRoot, entry);
|
|
63
|
+
return { resourceRoot, cleanup: () => fs.remove(tempRoot) };
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
await fs.remove(tempRoot);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function sameProducer(left, right) {
|
|
71
|
+
return getCommandPackageId(left) === getCommandPackageId(right);
|
|
72
|
+
}
|
|
73
|
+
export async function managedCommandProducerIdentity(options) {
|
|
74
|
+
const { plugin, producer } = options;
|
|
75
|
+
if (!plugin.sourceId || !plugin.sourceIdentity)
|
|
76
|
+
throw new Error('commandReferenceInvalid: managed commands require verified source identity.');
|
|
77
|
+
let scope = options.scope;
|
|
78
|
+
let platform = options.platform ?? null;
|
|
79
|
+
let key;
|
|
80
|
+
if (producer.kind === 'package') {
|
|
81
|
+
const declaration = plugin.manifest.managedCommands?.packages.find((entry) => entry.key === producer.packageKey);
|
|
82
|
+
if (!declaration)
|
|
83
|
+
throw new Error('commandReferenceInvalid: command package is not declared.');
|
|
84
|
+
key = declaration.key;
|
|
85
|
+
scope = declaration.scope;
|
|
86
|
+
platform = null;
|
|
87
|
+
}
|
|
88
|
+
else if (producer.kind === 'static-skill') {
|
|
89
|
+
key = producer.skillKey;
|
|
90
|
+
platform = producer.platform;
|
|
91
|
+
scope = 'user';
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
key = producer.artifactId;
|
|
95
|
+
const declaration = plugin.manifest.artifacts?.targets?.find((entry) => entry.id === producer.artifactId);
|
|
96
|
+
if (!declaration?.platform)
|
|
97
|
+
throw new Error('commandReferenceInvalid: command artifact is not declared.');
|
|
98
|
+
platform = declaration.platform;
|
|
99
|
+
if (declaration.delivery?.mode === 'codex-native')
|
|
100
|
+
scope = 'user';
|
|
101
|
+
}
|
|
102
|
+
let projectRoot = null;
|
|
103
|
+
if (scope === 'project') {
|
|
104
|
+
projectRoot = path.normalize(await fs.realpath(await resolveCanonicalRepoProjectKey(options.cwd)));
|
|
105
|
+
if (process.platform === 'win32')
|
|
106
|
+
projectRoot = projectRoot.replace(/^[a-z]:/u, (drive) => drive.toUpperCase());
|
|
107
|
+
}
|
|
108
|
+
return normalizeProducerIdentity({ sourceId: plugin.sourceId, sourceIdentity: plugin.sourceIdentity, pluginName: plugin.manifest.name, kind: producer.kind, key, platform, scope, projectRoot });
|
|
109
|
+
}
|
|
110
|
+
export function commandSetsForProducer(options) {
|
|
111
|
+
const requested = (options.plugin.manifest.managedCommands?.sets ?? []).filter((set) => JSON.stringify(set.producer) === JSON.stringify(options.producer)
|
|
112
|
+
&& (options.requestedSetNames === undefined || options.requestedSetNames.has(set.set))).map((set) => {
|
|
113
|
+
if (set.mode === 'static')
|
|
114
|
+
return { set: set.set, state: 'present', entries: set.entries };
|
|
115
|
+
const artifact = options.artifacts?.find((entry) => entry.target === 'aw.command-set' && entry.id === `command-set.${set.set}`);
|
|
116
|
+
if (!artifact || artifact.target !== 'aw.command-set')
|
|
117
|
+
throw new Error(`commandReferenceInvalid: dynamic command set ${set.set} was not prepared.`);
|
|
118
|
+
return { set: set.set, state: artifact.state, entries: artifact.entries };
|
|
119
|
+
});
|
|
120
|
+
return options.requestedSetNames === undefined ? requested : [
|
|
121
|
+
...(options.previousSets ?? []).filter((set) => !options.requestedSetNames.has(set.set)),
|
|
122
|
+
...requested,
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
export async function prepareManagedCommandPackage(options) {
|
|
126
|
+
const declaration = options.plugin.manifest.managedCommands?.packages.find((entry) => entry.key === options.packageKey);
|
|
127
|
+
if (!declaration || declaration.scope !== options.scope)
|
|
128
|
+
throw new ManagedCommandError('commandDefinitionInvalid', 'The requested package and scope are not declared.');
|
|
129
|
+
const renderConfig = await resolveArtifactRenderConfig({
|
|
130
|
+
sourceId: options.plugin.sourceId, sourceIdentity: options.plugin.sourceIdentity,
|
|
131
|
+
logicalIdentity: options.plugin.catalogLogicalIdentity, pluginName: options.plugin.manifest.name,
|
|
132
|
+
manifest: options.plugin.manifest, scope: declaration.scope, cwd: options.cwd, env: options.env,
|
|
133
|
+
});
|
|
134
|
+
if (renderConfig.issues.length > 0)
|
|
135
|
+
throw new ManagedCommandError('commandDefinitionInvalid', 'Resolve the plugin configuration issues before refreshing its command package.');
|
|
136
|
+
const producerRef = { kind: 'package', packageKey: declaration.key };
|
|
137
|
+
const producer = await managedCommandProducerIdentity({ ...options, producer: producerRef });
|
|
138
|
+
const allTargets = getManagedCommandArtifactTargets(options.plugin.manifest).filter((target) => target.producer.kind === 'package' && target.producer.packageKey === declaration.key);
|
|
139
|
+
const explicitSubset = options.requestedArtifactIds !== undefined;
|
|
140
|
+
const requestedIds = new Set(options.requestedArtifactIds);
|
|
141
|
+
if (explicitSubset && (requestedIds.size === 0 || requestedIds.size !== options.requestedArtifactIds.length || [...requestedIds].some((id) => !allTargets.some((target) => target.id === id)))) {
|
|
142
|
+
throw new ManagedCommandError('commandDefinitionInvalid', 'A partial package request must contain unique declared targets of this producer.');
|
|
143
|
+
}
|
|
144
|
+
const targets = explicitSubset ? allTargets.filter((target) => requestedIds.has(target.id)) : allTargets;
|
|
145
|
+
const requestedSetNames = explicitSubset ? new Set(targets.flatMap((target) => target.set ? [target.set] : [])) : undefined;
|
|
146
|
+
let previous;
|
|
147
|
+
if (explicitSubset) {
|
|
148
|
+
const installed = (await listManagedCommandPackages(options.env)).packages.find((entry) => entry.id === getCommandPackageId(producer));
|
|
149
|
+
if (installed) {
|
|
150
|
+
if (installed.availability === 'unavailable')
|
|
151
|
+
throw new ManagedCommandError('commandBindingInvalid', 'Partial refresh requires a verified installed command package. Run a complete package sync.');
|
|
152
|
+
const record = await readInstalledCommandProducer(installed.resourceRoot);
|
|
153
|
+
if (!sameProducer(record.producer, producer))
|
|
154
|
+
throw new ManagedCommandError('commandIdentityConflict', 'The installed command package belongs to another producer.');
|
|
155
|
+
previous = { resourceRoot: installed.resourceRoot, sets: record.sets };
|
|
156
|
+
}
|
|
157
|
+
const hasUnrequestedSets = (options.plugin.manifest.managedCommands?.sets ?? []).some((set) => set.producer.kind === 'package' && set.producer.packageKey === declaration.key && !requestedSetNames.has(set.set));
|
|
158
|
+
if (!previous && (hasUnrequestedSets || (declaration.render && !targets.some((target) => target.target === 'aw.command-package'))))
|
|
159
|
+
throw new ManagedCommandError('commandBindingInvalid', 'Partial refresh cannot reconstruct unrequested producer content. Run a complete package sync.');
|
|
160
|
+
}
|
|
161
|
+
let artifacts = [];
|
|
162
|
+
let generatedFiles = {};
|
|
163
|
+
if (targets.length > 0) {
|
|
164
|
+
const rendered = await runArtifactRenderer({ plugin: options.plugin, event: options.event ?? 'install', platform: 'managed-commands', scope: declaration.scope, cwd: options.cwd, commandEnv: options.env, requestedArtifactIds: targets.map((target) => target.id), ...(options.event === 'refresh' ? { changedConfigKeys: options.changedConfigKeys ?? [] } : {}) });
|
|
165
|
+
artifacts = validateArtifactPlan({ manifest: options.plugin.manifest, plan: rendered.plan, platform: 'managed-commands', scope: declaration.scope, requestedArtifactIds: rendered.context.requestedArtifactIds, renderConfig: rendered.context.config, rendererDigest: rendered.target.rendererDigest, manifestDigest: rendered.target.manifestDigest }).artifacts;
|
|
166
|
+
for (const artifact of artifacts)
|
|
167
|
+
if (artifact.target === 'aw.command-package')
|
|
168
|
+
generatedFiles = artifact.files;
|
|
169
|
+
}
|
|
170
|
+
const sets = commandSetsForProducer({ plugin: options.plugin, producer: producerRef, artifacts, ...(requestedSetNames ? { requestedSetNames, previousSets: previous?.sets } : {}) });
|
|
171
|
+
let source = await resolveCommandSourceDirectory({ bundleRoot: options.plugin.rootDir, pluginRelativePath: declaration.sourceDir });
|
|
172
|
+
let temporarySource;
|
|
173
|
+
try {
|
|
174
|
+
if (previous && !targets.some((target) => target.target === 'aw.command-package')) {
|
|
175
|
+
temporarySource = await fs.mkdtemp(path.join(os.tmpdir(), 'aw-command-previous-'));
|
|
176
|
+
source = path.join(temporarySource, 'resource');
|
|
177
|
+
await fs.copy(previous.resourceRoot, source, { dereference: false, errorOnExist: true });
|
|
178
|
+
await fs.remove(path.join(source, '.aw-command-producer.json'));
|
|
179
|
+
}
|
|
180
|
+
const prepared = await prepareManagedCommandPackageFiles({ sourceRoot: source, files: generatedFiles, entries: sets.flatMap((set) => set.entries) });
|
|
181
|
+
return { producer, sets, ...prepared };
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
if (temporarySource)
|
|
185
|
+
await fs.remove(temporarySource);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
export async function syncPluginManagedCommandPackage(options) {
|
|
189
|
+
const producer = await managedCommandProducerIdentity({ ...options, producer: { kind: 'package', packageKey: options.packageKey } });
|
|
190
|
+
const key = getCommandPackageId(producer);
|
|
191
|
+
let result = options.managedCommandProducerCache?.get(key);
|
|
192
|
+
if (!result) {
|
|
193
|
+
result = (async () => {
|
|
194
|
+
let candidate;
|
|
195
|
+
try {
|
|
196
|
+
candidate = await prepareManagedCommandPackage(options);
|
|
197
|
+
const old = await listManagedCommandPackages(options.env);
|
|
198
|
+
const previousIds = old.packages.find((entry) => entry.id === key)?.sets.flatMap((set) => set.commandIds) ?? [];
|
|
199
|
+
const synced = await syncManagedCommandPackage({ producer, sourceDirectory: candidate.resourceRoot, sets: candidate.sets, env: options.env });
|
|
200
|
+
return { producer, state: 'completed', commandIds: synced.commandIds, removedCommandIds: previousIds.filter((id) => !synced.commandIds.includes(id)), errors: [], recoveryActions: [] };
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return { producer, state: 'failed', commandIds: [], removedCommandIds: [], errors: [managedCommandDiagnostic(error)], recoveryActions: [`aw command package sync ${producer.sourceId}/${producer.pluginName} ${producer.key} --scope ${producer.scope} --yes`] };
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
await candidate?.cleanup();
|
|
207
|
+
}
|
|
208
|
+
})();
|
|
209
|
+
options.managedCommandProducerCache?.set(key, result);
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
export async function discoverInstalledPluginManagedCommandPackages(options) {
|
|
214
|
+
const listed = await listManagedCommandPackages(options.env);
|
|
215
|
+
let currentProject;
|
|
216
|
+
const relevant = listed.packages.filter((entry) => entry.producer.sourceId === options.plugin.sourceId && entry.producer.pluginName === options.plugin.manifest.name);
|
|
217
|
+
const installedPackageIds = new Set(relevant.map((entry) => entry.id));
|
|
218
|
+
const errors = [...listed.errors];
|
|
219
|
+
if (relevant.some((entry) => entry.producer.scope === 'project') || (options.platformTargets?.length && options.plugin.manifest.managedCommands?.packages.some((entry) => entry.scope === 'project')))
|
|
220
|
+
currentProject = path.normalize(await fs.realpath(await resolveCanonicalRepoProjectKey(options.cwd)));
|
|
221
|
+
const producers = new Map();
|
|
222
|
+
for (const entry of relevant) {
|
|
223
|
+
const identity = entry.producer;
|
|
224
|
+
if (identity.scope === 'user' ? options.scope !== 'user' : identity.projectRoot !== currentProject)
|
|
225
|
+
continue;
|
|
226
|
+
if (identity.sourceIdentity !== options.plugin.sourceIdentity) {
|
|
227
|
+
errors.push({ code: 'commandSourceIdentityChanged', message: `The retained command package belongs to a previous source identity; remove it with aw command package remove ${entry.id} --yes.`, subject: entry.id });
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
producers.set(entry.id, identity);
|
|
231
|
+
}
|
|
232
|
+
for (const declaration of options.plugin.manifest.managedCommands?.packages ?? []) {
|
|
233
|
+
if (options.scope === 'project' && declaration.scope !== 'project')
|
|
234
|
+
continue;
|
|
235
|
+
if (!options.platformTargets?.some((target) => declaration.platforms.includes(target.platform)))
|
|
236
|
+
continue;
|
|
237
|
+
const producer = await managedCommandProducerIdentity({ ...options, producer: { kind: 'package', packageKey: declaration.key } });
|
|
238
|
+
producers.set(getCommandPackageId(producer), producer);
|
|
239
|
+
}
|
|
240
|
+
return { packages: [...producers].map(([packageId, producer]) => {
|
|
241
|
+
const declaration = options.plugin.manifest.managedCommands?.packages.find((entry) => entry.key === producer.key && entry.scope === producer.scope);
|
|
242
|
+
const setKeys = (options.plugin.manifest.managedCommands?.sets ?? []).flatMap((set) => set.producer.kind === 'package' && set.producer.packageKey === producer.key && set.mode === 'dynamic' ? set.refreshKeys : []);
|
|
243
|
+
return { producer, packageId, packageKey: producer.key, refreshKeys: [...new Set([...(declaration?.refreshKeys ?? []), ...setKeys])], declared: declaration !== undefined, installed: installedPackageIds.has(packageId) };
|
|
244
|
+
}), errors };
|
|
245
|
+
}
|
|
246
|
+
export async function createManagedCommandReferenceResolver(options) {
|
|
247
|
+
const resolved = new Map();
|
|
248
|
+
for (const set of options.plugin.manifest.managedCommands?.sets ?? []) {
|
|
249
|
+
if (set.producer.kind === 'static-skill' && set.producer.platform !== options.platform)
|
|
250
|
+
continue;
|
|
251
|
+
if (set.producer.kind === 'package') {
|
|
252
|
+
const declaration = options.plugin.manifest.managedCommands?.packages.find((entry) => set.producer.kind === 'package' && entry.key === set.producer.packageKey);
|
|
253
|
+
if (!declaration?.platforms.includes(options.platform) || (options.scope === 'user' && declaration.scope === 'project'))
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
else if (set.producer.kind === 'artifact') {
|
|
257
|
+
const declaration = options.plugin.manifest.artifacts?.targets?.find((entry) => set.producer.kind === 'artifact' && entry.id === set.producer.artifactId);
|
|
258
|
+
if (declaration?.platform !== options.platform || (options.scope === 'user' && declaration.delivery?.mode !== 'codex-native' && !declaration.scopes.includes('user')))
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const producer = await managedCommandProducerIdentity({ ...options, producer: set.producer });
|
|
262
|
+
if (producer.platform && producer.platform !== options.platform)
|
|
263
|
+
continue;
|
|
264
|
+
if (options.scope === 'user' && producer.scope === 'project')
|
|
265
|
+
continue;
|
|
266
|
+
if (set.producer.kind === 'package') {
|
|
267
|
+
const declaration = options.plugin.manifest.managedCommands?.packages.find((entry) => entry.key === producer.key);
|
|
268
|
+
if (!declaration?.platforms.includes(options.platform))
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
const candidate = [...(options.candidates ?? [])].reverse().find((entry) => sameProducer(entry.producer, producer));
|
|
272
|
+
const entries = candidate?.sets.find((entry) => entry.set === set.set);
|
|
273
|
+
if (candidate) {
|
|
274
|
+
if (entries?.state !== 'present')
|
|
275
|
+
continue;
|
|
276
|
+
for (const entry of entries.entries)
|
|
277
|
+
resolved.set(`${set.set}/${entry.key}/${entry.variant}`, getPluginCommandId({ schemaVersion: 1, producer, set: set.set, key: entry.key, variant: entry.variant }));
|
|
278
|
+
}
|
|
279
|
+
else if (set.mode === 'static') {
|
|
280
|
+
for (const entry of set.entries) {
|
|
281
|
+
const id = getPluginCommandId({ schemaVersion: 1, producer, set: set.set, key: entry.key, variant: entry.variant });
|
|
282
|
+
if ((await inspectManagedCommand(id, options.env)).availability === 'ready')
|
|
283
|
+
resolved.set(`${set.set}/${entry.key}/${entry.variant}`, id);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
const installed = await listManagedCommands(options.env);
|
|
288
|
+
for (const command of installed.commands)
|
|
289
|
+
if (command.availability === 'ready' && command.owner.kind === 'plugin' && sameProducer(command.owner.producer, producer) && command.name.startsWith(`${set.set}/`))
|
|
290
|
+
resolved.set(command.name, command.id);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return (reference) => {
|
|
294
|
+
if (!options.plugin.manifest.requires?.aw.capabilities?.includes('aw.managed-commands.v1'))
|
|
295
|
+
throw new Error('commandReferenceInvalid: managed command references require aw.managed-commands.v1.');
|
|
296
|
+
const id = resolved.get(`${reference.set}/${reference.key}/${reference.variant ?? 'default'}`);
|
|
297
|
+
if (!id)
|
|
298
|
+
throw new Error(`commandReferenceInvalid: command ${reference.set}/${reference.key}/${reference.variant ?? 'default'} has no verified producer for this consumer.`);
|
|
299
|
+
return id;
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
export function resolveSkillManagedCommandReferences(tree, resolve) {
|
|
303
|
+
for (const [relative, content] of Object.entries(tree.files))
|
|
304
|
+
if (relative.endsWith('.md'))
|
|
305
|
+
tree.files[relative] = Buffer.from(replaceManagedCommandPlaceholders(content.toString('utf8'), resolve), 'utf8');
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=managed-command-materialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-command-materialization.js","sourceRoot":"","sources":["../../../src/utils/managed-command-materialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,iCAAiC,EACjC,yBAAyB,GAK1B,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAsC,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,oCAAoC,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AA0B9I,MAAM,CAAC,KAAK,UAAU,sCAAsC,CAAC,OAG5D;IACC,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACpH,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3F,IAAI,WAA+B,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;QACjG,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,8BAA8B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,MAAM;WAC7D,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxF,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;QACtG,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM;QACtD,cAAc,EAAE,6BAA6B,KAAK,CAAC,EAAE,QAAQ;KAC9D,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,KAAoC;IACtF,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QAC/B,KAAK,EAAE,KAAK,CAAC,YAAY,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU;QACnG,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CAAC,OAEvD;IACC,MAAM,8BAA8B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,4BAA4B,CAAC,QAAQ,EAAE,gCAAgC,CAAC,CAAC;YACzE,IAAI,qBAAqB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,8BAA8B,EAAE,6BAA6B,EAAE,8BAA8B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;gBAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,wEAAwE,CAAC,CAAC;YACrnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC/D,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,8CAA8C,CAAC,CAAC;YAC5I,IAAI,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,gEAAgE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,yDAAyD,CAAC,CAAC;YACvP,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,CAAC,2BAA2B,EAAE,6BAA6B,EAAE,YAAY,CAAC,EAAE,CAAC;YAClG,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,EAAE,sDAAsD,CAAC,CAAC;QAC9K,CAAC;QACD,MAAM,8BAA8B,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,yBAAyB,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,oCAAoC,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO;YAAE,MAAM,8BAA8B,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/F,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB,EAAE,KAAuB;IACnE,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,OAEpD;IACC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IAC/I,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IACxC,IAAI,GAAW,CAAC;IAChB,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjH,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/F,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;QACtB,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAC1B,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5C,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACxB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC7B,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1G,IAAI,CAAC,WAAW,EAAE,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC1G,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;QAChC,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,KAAK,cAAc;YAAE,KAAK,GAAG,MAAM,CAAC;IACpE,CAAC;IACD,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,8BAA8B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,yBAAyB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AACnM,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAItC;IACC,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACrF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;WAC9D,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAuB,EAAE;QACvH,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,gBAAgB,IAAI,KAAK,CAAC,EAAE,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAChI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,gBAAgB;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC;QACpJ,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IACL,OAAO,OAAO,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3D,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzF,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAIlD;IACC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACxH,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,mBAAmB,CAAC,0BAA0B,EAAE,mDAAmD,CAAC,CAAC;IACxK,MAAM,YAAY,GAAG,MAAM,2BAA2B,CAAC;QACrD,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc;QAChF,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;QAChG,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG;KAChG,CAAC,CAAC;IACH,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,mBAAmB,CAAC,0BAA0B,EAAE,gFAAgF,CAAC,CAAC;IAChL,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,SAAkB,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7F,MAAM,UAAU,GAAG,gCAAgC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7F,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC;IACxF,MAAM,cAAc,GAAG,OAAO,CAAC,oBAAoB,KAAK,SAAS,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3D,IAAI,cAAc,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,oBAAqB,CAAC,MAAM,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChM,MAAM,IAAI,mBAAmB,CAAC,0BAA0B,EAAE,kFAAkF,CAAC,CAAC;IAChJ,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACzG,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5H,IAAI,QAA2E,CAAC;IAChF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,CAAC,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvI,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,SAAS,CAAC,YAAY,KAAK,aAAa;gBAAE,MAAM,IAAI,mBAAmB,CAAC,uBAAuB,EAAE,6FAA6F,CAAC,CAAC;YACpM,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAAE,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,EAAE,4DAA4D,CAAC,CAAC;YACrK,QAAQ,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACzE,CAAC;QACD,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,WAAW,CAAC,GAAG,IAAI,CAAC,iBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACnN,IAAI,CAAC,QAAQ,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,uBAAuB,EAAE,+FAA+F,CAAC,CAAC;IAC9R,CAAC;IACD,IAAI,SAAS,GAAoC,EAAE,CAAC;IACpD,IAAI,cAAc,GAA2B,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvW,SAAS,GAAG,oBAAoB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC;QACnW,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,oBAAoB;gBAAE,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClH,CAAC;IACD,MAAM,IAAI,GAAG,sBAAsB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrL,IAAI,MAAM,GAAG,MAAM,6BAA6B,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IACpI,IAAI,eAAmC,CAAC;IACxC,IAAI,CAAC;QACH,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,oBAAoB,CAAC,EAAE,CAAC;YAClF,eAAe,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACnF,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAChD,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrJ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzC,CAAC;YAAS,CAAC;QAAC,IAAI,eAAe;YAAE,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAKrD;IACC,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrI,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,SAAoD,CAAC;YACzD,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAChH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9I,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAoB,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;YACnM,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAiB,EAAE,UAAU,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,2BAA2B,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,GAAG,YAAY,QAAQ,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC5Q,CAAC;oBAAS,CAAC;gBAAC,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC;YAAC,CAAC;QAC3C,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6CAA6C,CAAC,OAGnE;IACC,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,cAAkC,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtK,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QAAE,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,8BAA8B,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7S,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,QAAQ,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,KAAK,cAAc;YAAE,SAAS;QAC7G,IAAI,QAAQ,CAAC,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,gHAAgH,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACrN,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QAClF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QAC7E,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAE,SAAS;QAC1G,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClI,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE;YAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpJ,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrN,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,KAAK,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7N,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qCAAqC,CAAC,OAG3D;IACC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAAE,SAAS;QACjG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChK,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,CAAC;gBAAE,SAAS;QACpI,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC1J,IAAI,WAAW,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,WAAW,CAAC,QAAQ,EAAE,IAAI,KAAK,cAAc,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAAE,SAAS;QAClL,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9F,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAAE,SAAS;QAC1E,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACvE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClH,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,SAAS;QACnE,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpH,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QACvE,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS;gBAAE,SAAS;YAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO;gBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1M,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpH,IAAI,CAAC,MAAM,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,OAAO;oBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5I,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACzD,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ;gBAAE,IAAI,OAAO,CAAC,YAAY,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACxP,CAAC;IACH,CAAC;IACD,OAAO,CAAC,SAAS,EAAE,EAAE;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,wBAAwB,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;QACnM,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,8CAA8C,CAAC,CAAC;QAC7K,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,IAAsB,EAAE,OAAuD;IAClI,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/M,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type CommandLaunch } from '@lesliechan721/aw-plugin-core/manifest';
|
|
2
|
+
export interface CommandHost {
|
|
3
|
+
schemaVersion: 1;
|
|
4
|
+
nodeExecutable: string;
|
|
5
|
+
cliEntry: string;
|
|
6
|
+
awHome: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function buildManagedCommandEnvironment(options: {
|
|
9
|
+
launch: CommandLaunch;
|
|
10
|
+
hostEnvironment: NodeJS.ProcessEnv;
|
|
11
|
+
host: CommandHost;
|
|
12
|
+
platform?: NodeJS.Platform;
|
|
13
|
+
}): NodeJS.ProcessEnv;
|
|
14
|
+
export declare function prepareManagedCommandRun(options: {
|
|
15
|
+
id: string;
|
|
16
|
+
args: string[];
|
|
17
|
+
cwd: string;
|
|
18
|
+
cliEntry: string;
|
|
19
|
+
env?: NodeJS.ProcessEnv;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
executable: string;
|
|
22
|
+
args: string[];
|
|
23
|
+
cwd: string;
|
|
24
|
+
env: NodeJS.ProcessEnv;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function runManagedCommand(options: {
|
|
27
|
+
id: string;
|
|
28
|
+
args: string[];
|
|
29
|
+
cwd: string;
|
|
30
|
+
cliEntry: string;
|
|
31
|
+
env?: NodeJS.ProcessEnv;
|
|
32
|
+
}): Promise<number>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { validateCommandEnvironment } from '@lesliechan721/aw-plugin-core/manifest';
|
|
5
|
+
import { resolveAwHomeCanonical } from './state-paths.js';
|
|
6
|
+
import { ManagedCommandError, resolveManagedCommand } from './managed-command-store.js';
|
|
7
|
+
export function buildManagedCommandEnvironment(options) {
|
|
8
|
+
const platform = options.platform ?? process.platform;
|
|
9
|
+
try {
|
|
10
|
+
validateCommandEnvironment(options.launch.env, options.launch.envFrom, platform);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new ManagedCommandError('commandEnvironmentInvalid', 'The command environment definition is invalid.');
|
|
14
|
+
}
|
|
15
|
+
const original = { ...options.hostEnvironment };
|
|
16
|
+
const result = Object.create(null);
|
|
17
|
+
const put = (name, value) => {
|
|
18
|
+
if (platform === 'win32') {
|
|
19
|
+
for (const key of Object.keys(result))
|
|
20
|
+
if (key.toUpperCase() === name.toUpperCase())
|
|
21
|
+
delete result[key];
|
|
22
|
+
}
|
|
23
|
+
result[name] = value;
|
|
24
|
+
};
|
|
25
|
+
for (const [name, value] of Object.entries(original)) {
|
|
26
|
+
if (/^AW_(?:PLUGIN|COMMAND)_/iu.test(name))
|
|
27
|
+
continue;
|
|
28
|
+
put(name, value);
|
|
29
|
+
}
|
|
30
|
+
for (const [name, value] of Object.entries(options.launch.env))
|
|
31
|
+
put(name, value);
|
|
32
|
+
for (const [name, source] of Object.entries(options.launch.envFrom)) {
|
|
33
|
+
const sourceKey = platform === 'win32'
|
|
34
|
+
? Object.keys(original).find((key) => key.toUpperCase() === source.toUpperCase())
|
|
35
|
+
: source;
|
|
36
|
+
const value = sourceKey === undefined ? undefined : original[sourceKey];
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
throw new ManagedCommandError('commandEnvironmentSourceMissing', `The command environment source ${source} is missing.`);
|
|
39
|
+
put(name, value);
|
|
40
|
+
}
|
|
41
|
+
put('AW_HOME', options.host.awHome);
|
|
42
|
+
put('AW_COMMAND_HOST', JSON.stringify(options.host));
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
export async function prepareManagedCommandRun(options) {
|
|
46
|
+
const hostEnvironment = { ...(options.env ?? process.env) };
|
|
47
|
+
const awHome = await resolveAwHomeCanonical(hostEnvironment);
|
|
48
|
+
const { launch, resourceRoot } = await resolveManagedCommand(options.id, hostEnvironment);
|
|
49
|
+
const absoluteEntry = path.resolve(resourceRoot, launch.entry);
|
|
50
|
+
return {
|
|
51
|
+
executable: launch.runner === 'node' ? process.execPath : absoluteEntry,
|
|
52
|
+
args: [...(launch.runner === 'node' ? [absoluteEntry] : []), ...launch.args, ...options.args],
|
|
53
|
+
cwd: launch.cwd === 'resource' ? resourceRoot : options.cwd,
|
|
54
|
+
env: buildManagedCommandEnvironment({ launch, hostEnvironment, host: {
|
|
55
|
+
schemaVersion: 1,
|
|
56
|
+
nodeExecutable: process.execPath,
|
|
57
|
+
cliEntry: path.resolve(options.cliEntry),
|
|
58
|
+
awHome,
|
|
59
|
+
} }),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export async function runManagedCommand(options) {
|
|
63
|
+
const invocation = await prepareManagedCommandRun(options);
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const child = spawn(invocation.executable, invocation.args, {
|
|
66
|
+
cwd: invocation.cwd,
|
|
67
|
+
env: invocation.env,
|
|
68
|
+
stdio: 'inherit',
|
|
69
|
+
shell: false,
|
|
70
|
+
});
|
|
71
|
+
const signals = process.platform === 'win32' ? ['SIGINT', 'SIGTERM'] : ['SIGINT', 'SIGTERM', 'SIGHUP'];
|
|
72
|
+
const handlers = new Map();
|
|
73
|
+
let received;
|
|
74
|
+
const clean = () => { for (const [signal, handler] of handlers)
|
|
75
|
+
process.off(signal, handler); };
|
|
76
|
+
for (const signal of signals) {
|
|
77
|
+
const handler = () => {
|
|
78
|
+
received = signal;
|
|
79
|
+
try {
|
|
80
|
+
child.kill(signal);
|
|
81
|
+
}
|
|
82
|
+
catch { /* Forwarding is best effort. */ }
|
|
83
|
+
};
|
|
84
|
+
handlers.set(signal, handler);
|
|
85
|
+
process.on(signal, handler);
|
|
86
|
+
}
|
|
87
|
+
child.once('error', () => {
|
|
88
|
+
clean();
|
|
89
|
+
reject(new ManagedCommandError('commandSpawnFailed', 'The operating system could not start the managed command.'));
|
|
90
|
+
});
|
|
91
|
+
child.once('exit', (code, signal) => {
|
|
92
|
+
clean();
|
|
93
|
+
if (process.platform === 'win32' && received) {
|
|
94
|
+
resolve(received === 'SIGINT' ? 130 : 143);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (signal && process.platform !== 'win32') {
|
|
98
|
+
const number = os.constants.signals[signal] ?? 0;
|
|
99
|
+
try {
|
|
100
|
+
process.kill(process.pid, signal);
|
|
101
|
+
}
|
|
102
|
+
catch { /* The numeric fallback is required when self-signalling is unavailable. */ }
|
|
103
|
+
resolve(128 + number);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
resolve(code ?? 1);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=managed-command-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-command-runtime.js","sourceRoot":"","sources":["../../../src/utils/managed-command-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { type CommandIdentity, type CommandLaunch, type ProducerIdentity, type InstalledCommandProducer, type UserCommandDefinition } from '@lesliechan721/aw-plugin-core/manifest';
|
|
2
|
+
export declare const COMMAND_PRODUCER_RECORD = ".aw-command-producer.json";
|
|
3
|
+
export type { InstalledCommandProducer, UserCommandDefinition };
|
|
4
|
+
export interface ManagedCommandDiagnostic {
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
subject?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ManagedCommandError extends Error {
|
|
10
|
+
readonly code: string;
|
|
11
|
+
readonly argumentError: boolean;
|
|
12
|
+
constructor(code: string, message: string, argumentError?: boolean);
|
|
13
|
+
}
|
|
14
|
+
export type InstalledCommandSet = InstalledCommandProducer['sets'][number];
|
|
15
|
+
export interface ManagedCommandBinding {
|
|
16
|
+
schemaVersion: 1;
|
|
17
|
+
id: string;
|
|
18
|
+
identity: CommandIdentity;
|
|
19
|
+
resourceRoot: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ManagedCommandView {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
owner: {
|
|
25
|
+
kind: 'user';
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'plugin';
|
|
28
|
+
producer: ProducerIdentity;
|
|
29
|
+
};
|
|
30
|
+
availability: 'ready' | 'unavailable';
|
|
31
|
+
resourceRoot: string | null;
|
|
32
|
+
launch: CommandLaunch | null;
|
|
33
|
+
errors: ManagedCommandDiagnostic[];
|
|
34
|
+
recoveryActions: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface ManagedCommandPackageView {
|
|
37
|
+
id: string;
|
|
38
|
+
producer: ProducerIdentity;
|
|
39
|
+
resourceRoot: string;
|
|
40
|
+
availability: 'ready' | 'empty' | 'unavailable';
|
|
41
|
+
sets: Array<{
|
|
42
|
+
set: string;
|
|
43
|
+
state: 'present' | 'disabled';
|
|
44
|
+
commandIds: string[];
|
|
45
|
+
}>;
|
|
46
|
+
errors: ManagedCommandDiagnostic[];
|
|
47
|
+
recoveryActions: string[];
|
|
48
|
+
}
|
|
49
|
+
export declare function managedCommandDiagnostic(error: unknown, subject?: string): ManagedCommandDiagnostic;
|
|
50
|
+
export declare function managedCommandRoot(env?: NodeJS.ProcessEnv): Promise<string>;
|
|
51
|
+
export declare function assertUserCommandId(id: string): void;
|
|
52
|
+
export declare function validateManagedCommandName(value: unknown): string;
|
|
53
|
+
export declare function parseManagedCommandLaunch(value: unknown): CommandLaunch;
|
|
54
|
+
export declare function readUserCommandDefinition(id: string, env?: NodeJS.ProcessEnv): Promise<UserCommandDefinition>;
|
|
55
|
+
export declare function validateManagedCommandResource(resourceRoot: string, launch?: CommandLaunch): Promise<void>;
|
|
56
|
+
export declare function copyManagedCommandDirectory(sourceDirectory: string, destination: string, env?: NodeJS.ProcessEnv, options?: {
|
|
57
|
+
trustedPluginSource?: boolean;
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
export declare function installUserCommand(options: {
|
|
60
|
+
sourceDirectory: string;
|
|
61
|
+
name: string;
|
|
62
|
+
launch: CommandLaunch;
|
|
63
|
+
env?: NodeJS.ProcessEnv;
|
|
64
|
+
}): Promise<string>;
|
|
65
|
+
export declare function updateUserCommand(options: {
|
|
66
|
+
id: string;
|
|
67
|
+
sourceDirectory: string;
|
|
68
|
+
name?: string;
|
|
69
|
+
launch?: Partial<CommandLaunch>;
|
|
70
|
+
env?: NodeJS.ProcessEnv;
|
|
71
|
+
}): Promise<{
|
|
72
|
+
errors: ManagedCommandDiagnostic[];
|
|
73
|
+
recoveryActions: string[];
|
|
74
|
+
}>;
|
|
75
|
+
export declare function removeUserCommand(id: string, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
76
|
+
export declare function normalizeInstalledCommandProducer(value: unknown): InstalledCommandProducer;
|
|
77
|
+
export declare function readInstalledCommandProducer(resourceRoot: string): Promise<InstalledCommandProducer>;
|
|
78
|
+
export declare function writeInstalledCommandProducer(resourceRoot: string, record: InstalledCommandProducer): Promise<void>;
|
|
79
|
+
export declare function revokeManagedCommandBindings(producer: ProducerIdentity, env?: NodeJS.ProcessEnv): Promise<string[]>;
|
|
80
|
+
export declare function assertManagedCommandBindingIdentities(options: {
|
|
81
|
+
producers: Array<Pick<InstalledCommandProducer, 'producer' | 'sets'>>;
|
|
82
|
+
env?: NodeJS.ProcessEnv;
|
|
83
|
+
}): Promise<void>;
|
|
84
|
+
export declare function publishManagedCommandBindings(options: {
|
|
85
|
+
producer: ProducerIdentity;
|
|
86
|
+
resourceRoot: string;
|
|
87
|
+
sets: InstalledCommandSet[];
|
|
88
|
+
env?: NodeJS.ProcessEnv;
|
|
89
|
+
}): Promise<string[]>;
|
|
90
|
+
export declare function readManagedCommandPackageOwner(id: string, env?: NodeJS.ProcessEnv): Promise<{
|
|
91
|
+
producer: ProducerIdentity;
|
|
92
|
+
resourceRoot: string;
|
|
93
|
+
}>;
|
|
94
|
+
export declare function removeManagedCommandPackage(id: string, env?: NodeJS.ProcessEnv): Promise<{
|
|
95
|
+
producer: ProducerIdentity;
|
|
96
|
+
removedCommandIds: string[];
|
|
97
|
+
}>;
|
|
98
|
+
export declare function syncManagedCommandPackage(options: {
|
|
99
|
+
producer: ProducerIdentity;
|
|
100
|
+
sourceDirectory: string;
|
|
101
|
+
sets: InstalledCommandSet[];
|
|
102
|
+
env?: NodeJS.ProcessEnv;
|
|
103
|
+
}): Promise<{
|
|
104
|
+
id: string;
|
|
105
|
+
resourceRoot: string;
|
|
106
|
+
commandIds: string[];
|
|
107
|
+
removedCommandIds: string[];
|
|
108
|
+
}>;
|
|
109
|
+
export declare function assertManagedCommandProducerOwnership(producer: ProducerIdentity, resourceRoot: string, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
110
|
+
export declare function resolveManagedCommand(id: string, env?: NodeJS.ProcessEnv): Promise<{
|
|
111
|
+
view: ManagedCommandView;
|
|
112
|
+
launch: CommandLaunch;
|
|
113
|
+
resourceRoot: string;
|
|
114
|
+
}>;
|
|
115
|
+
export declare function inspectManagedCommand(id: string, env?: NodeJS.ProcessEnv): Promise<ManagedCommandView>;
|
|
116
|
+
export declare function listManagedCommandPackages(env?: NodeJS.ProcessEnv): Promise<{
|
|
117
|
+
packages: ManagedCommandPackageView[];
|
|
118
|
+
errors: ManagedCommandDiagnostic[];
|
|
119
|
+
}>;
|
|
120
|
+
export declare function listManagedCommands(env?: NodeJS.ProcessEnv): Promise<{
|
|
121
|
+
commands: ManagedCommandView[];
|
|
122
|
+
packages: ManagedCommandPackageView[];
|
|
123
|
+
errors: ManagedCommandDiagnostic[];
|
|
124
|
+
}>;
|