mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-11-07 06:19:43 -10:00
* feat(cua): preload the JavaScript computer use runtime * refactor(cua): remove the native Wayland backend * feat(cua): move app computer use into the driver * feat(cua): preserve background delivery and port platform fixes * feat(cua): add explicit desktop input and browser runtime facade * feat(cua): package the unified 0.26.0 computer use runtime * fix(cua): finalize cross-platform native reliability * fix(cua): isolate runtime releases from CLI versioning * fix(cua): keep Electron out of root workspace installs * fix(cua): synchronize consumers and async cleanup tests * fix(browser): migrate smoke to preloaded cua runtime * docs(cua): document MCP setup for Qwen Code Claude Code and Codex
125 lines
3.6 KiB
JavaScript
125 lines
3.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
// Copyright 2025 Google LLC
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const extensionsToCopy = ['.md', '.json', '.sb'];
|
|
|
|
function isBundledSkillDesignDoc(normalizedPath) {
|
|
// DESIGN.md files are maintainer design narratives, not runtime inputs
|
|
// (see copy_bundle_assets.js); the transpiled build loads bundled skills
|
|
// from dist/src/, so they must stay out of it too.
|
|
return (
|
|
normalizedPath.startsWith('skills/bundled/') &&
|
|
path.basename(normalizedPath) === 'DESIGN.md'
|
|
);
|
|
}
|
|
|
|
function copyFilesRecursive(source, target, rootSourceDir) {
|
|
if (!fs.existsSync(target)) {
|
|
fs.mkdirSync(target, { recursive: true });
|
|
}
|
|
|
|
const items = fs.readdirSync(source, { withFileTypes: true });
|
|
|
|
for (const item of items) {
|
|
const sourcePath = path.join(source, item.name);
|
|
const targetPath = path.join(target, item.name);
|
|
const relativePath = path.relative(rootSourceDir, sourcePath);
|
|
const normalizedPath = relativePath.replace(/\\/g, '/');
|
|
|
|
if (item.isDirectory()) {
|
|
if (
|
|
['skills/bundled/browser-use', 'skills/bundled/computer-use'].includes(
|
|
normalizedPath,
|
|
)
|
|
)
|
|
continue;
|
|
copyFilesRecursive(sourcePath, targetPath, rootSourceDir);
|
|
} else {
|
|
const ext = path.extname(item.name);
|
|
// Copy standard extensions, or .js files in i18n/locales directory
|
|
// Use path.relative for precise matching to avoid false positives
|
|
const isLocaleJs =
|
|
ext === '.js' && normalizedPath.startsWith('i18n/locales/');
|
|
if (
|
|
(extensionsToCopy.includes(ext) || isLocaleJs) &&
|
|
!isBundledSkillDesignDoc(normalizedPath)
|
|
) {
|
|
fs.copyFileSync(sourcePath, targetPath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function copyFiles({ root = process.cwd() } = {}) {
|
|
const sourceDir = path.join(root, 'src');
|
|
const targetDir = path.join(root, 'dist', 'src');
|
|
|
|
if (!fs.existsSync(sourceDir)) {
|
|
console.error(`Source directory ${sourceDir} not found.`);
|
|
process.exit(1);
|
|
}
|
|
|
|
for (const name of ['browser-use', 'computer-use']) {
|
|
fs.rmSync(path.join(targetDir, 'skills/bundled', name), {
|
|
recursive: true,
|
|
force: true,
|
|
});
|
|
}
|
|
copyFilesRecursive(sourceDir, targetDir, sourceDir);
|
|
|
|
const packageName = path.basename(root);
|
|
// Copy example extensions into the bundle.
|
|
if (packageName === 'cli') {
|
|
const examplesSource = path.join(
|
|
sourceDir,
|
|
'commands',
|
|
'extensions',
|
|
'examples',
|
|
);
|
|
const examplesTarget = path.join(
|
|
targetDir,
|
|
'commands',
|
|
'extensions',
|
|
'examples',
|
|
);
|
|
if (fs.existsSync(examplesSource)) {
|
|
fs.cpSync(examplesSource, examplesTarget, { recursive: true });
|
|
}
|
|
}
|
|
|
|
console.log('Successfully copied files.');
|
|
}
|
|
|
|
if (isDirectRun()) {
|
|
copyFiles();
|
|
}
|
|
|
|
function isDirectRun() {
|
|
return process.argv[1]
|
|
? fileURLToPath(import.meta.url) === path.resolve(process.argv[1])
|
|
: false;
|
|
}
|