fix: fix hot-api for not build in bun app.mjs

This commit is contained in:
2025-12-05 20:53:25 +08:00
parent 94e331e376
commit ee33208e6c
9 changed files with 95 additions and 38 deletions

View File

@@ -6,6 +6,7 @@ import fs from 'node:fs';
// bun run src/index.ts -- // bun run src/index.ts --
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
const __dirname = path.dirname(fileURLToPath(import.meta.url)); const __dirname = path.dirname(fileURLToPath(import.meta.url));
const external = ['pm2', '@kevisual/hot-api'];
/** /**
* *
* @param {string} p * @param {string} p
@@ -20,11 +21,10 @@ await Bun.build({
naming: { naming: {
entry: 'assistant.js', entry: 'assistant.js',
}, },
external: ['pm2'], external,
define: { define: {
ENVISION_VERSION: JSON.stringify(pkg.version), ENVISION_VERSION: JSON.stringify(pkg.version),
}, },
env: 'ENVISION_*',
}); });
await Bun.build({ await Bun.build({
@@ -38,8 +38,7 @@ await Bun.build({
define: { define: {
ENVISION_VERSION: JSON.stringify(pkg.version), ENVISION_VERSION: JSON.stringify(pkg.version),
}, },
external: ['pm2'], external,
env: 'ENVISION_*',
}); });
// const copyDist = ['dist', 'bin']; // const copyDist = ['dist', 'bin'];
const copyDist = ['dist']; const copyDist = ['dist'];

View File

@@ -20,8 +20,8 @@
], ],
"scripts": { "scripts": {
"dev": "bun run src/run.ts ", "dev": "bun run src/run.ts ",
"dev:server": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 bun --watch src/run-server.ts --home ", "dev:server": "bun --watch src/run-server.ts ",
"dev:share": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 bun --watch src/test/remote-app.ts ", "dev:share": "bun --watch src/test/remote-app.ts ",
"build:lib": "bun run bun-lib.config.mjs", "build:lib": "bun run bun-lib.config.mjs",
"postbuild:lib": "dts -i src/lib.ts -o assistant-lib.d.ts -d libs -t", "postbuild:lib": "dts -i src/lib.ts -o assistant-lib.d.ts -d libs -t",
"build": "rimraf dist && bun run bun.config.mjs", "build": "rimraf dist && bun run bun.config.mjs",
@@ -45,7 +45,7 @@
"@kevisual/load": "^0.0.6", "@kevisual/load": "^0.0.6",
"@kevisual/local-app-manager": "^0.1.32", "@kevisual/local-app-manager": "^0.1.32",
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
"@kevisual/query": "0.0.30", "@kevisual/query": "0.0.31",
"@kevisual/query-login": "0.0.7", "@kevisual/query-login": "0.0.7",
"@kevisual/router": "^0.0.33", "@kevisual/router": "^0.0.33",
"@kevisual/types": "^0.0.10", "@kevisual/types": "^0.0.10",
@@ -75,7 +75,7 @@
"access": "public" "access": "public"
}, },
"dependencies": { "dependencies": {
"@kevisual/hot-api": "^0.0.2", "@kevisual/hot-api": "^0.0.3",
"@nut-tree-fork/nut-js": "^4.2.6", "@nut-tree-fork/nut-js": "^4.2.6",
"eventemitter3": "^5.0.1", "eventemitter3": "^5.0.1",
"lowdb": "^7.0.1", "lowdb": "^7.0.1",

View File

@@ -4,10 +4,10 @@ import { spawnSync } from 'node:child_process';
const command = new Command('server') const command = new Command('server')
.description('启动服务') .description('启动服务')
.option('-d, --daemon', '是否以守护进程方式运行') .option('-d, --daemon', '是否以守护进程方式运行')
.option('-n, --name <name>', '服务名称') .option('-n, --name <name>', '服务名称', 'assistant-server')
.option('-p, --port <port>', '服务端口') .option('-p, --port <port>', '服务端口')
.option('-s, --start', '是否启动服务') .option('-s, --start', '是否启动服务')
.option('-i, --home', '是否以home方式运行') .option('-e, --interpreter <interpreter>', '指定使用的解释器', 'bun')
.action((options) => { .action((options) => {
const { port } = options; const { port } = options;
const [_interpreter, execPath] = process.argv; const [_interpreter, execPath] = process.argv;
@@ -24,8 +24,8 @@ const command = new Command('server')
if (port) { if (port) {
shellCommands.push(`-p ${port}`); shellCommands.push(`-p ${port}`);
} }
if (options.home) { if (options.interpreter) {
shellCommands.push('--home'); shellCommands.push(`-e ${options.interpreter}`);
} }
const basename = _interpreter.split('/').pop(); const basename = _interpreter.split('/').pop();

View File

@@ -0,0 +1,19 @@
import { app } from '@/app.ts';
import { Hotkeys } from '@kevisual/hot-api';
import { useContextKey } from '@kevisual/context';
app.route({
path: 'key-sender',
middleware: ['admin-auth']
}).define(async (ctx) => {
let keys = ctx.query.keys;
if (keys.includes(' ')) {
keys = keys.replace(/\s+/g, '+');
}
const hotKeys: Hotkeys = useContextKey('hotkeys', () => new Hotkeys());
if (typeof keys === 'string') {
await hotKeys.pressHotkey({
hotkey: keys,
});
}
ctx.body = 'ok';
}).addTo(app);

View File

@@ -2,8 +2,10 @@ import { app, assistantConfig } from '../app.ts';
import './config/index.ts'; import './config/index.ts';
import './shop-install/index.ts'; import './shop-install/index.ts';
import './ai/index.ts'; import './ai/index.ts';
import './light-code/index.ts'; // TODO:
// import './light-code/index.ts';
import './user/index.ts'; import './user/index.ts';
import './hot-api/key-sender/index.ts';
import os from 'node:os'; import os from 'node:os';
import { authCache } from '@/module/cache/auth.ts'; import { authCache } from '@/module/cache/auth.ts';

View File

@@ -1,10 +1,11 @@
import { app, assistantConfig } from '@/app.ts'; import { app, assistantConfig } from '@/app.ts';
import { AppDownload } from '@/services/app/index.ts'; import { AppDownload } from '@/services/app/index.ts';
import { AssistantApp } from '@/module/assistant/index.ts'; import { AssistantApp } from '@/module/assistant/index.ts';
import { shopDefine } from './define.ts';
app app
.route({ .route({
...shopDefine.get('getRegistry'), path: 'shop',
key: 'get-registry',
description: '获取应用商店注册表信息',
middleware: ['admin-auth'], middleware: ['admin-auth'],
metadata: { metadata: {
admin: true, admin: true,
@@ -19,7 +20,9 @@ app
app app
.route({ .route({
...shopDefine.get('listInstalled'), path: 'shop',
key: 'list-installed',
description: '列出当前已安装的所有应用',
middleware: ['admin-auth'], middleware: ['admin-auth'],
metadata: { metadata: {
admin: true, admin: true,
@@ -35,7 +38,9 @@ app
app app
.route({ .route({
...shopDefine.get('install'), path: 'shop',
key: 'install',
description: '安装指定的应用,可以指定 id、type、force 和 yes 参数',
middleware: ['admin-auth'], middleware: ['admin-auth'],
metadata: { metadata: {
admin: true, admin: true,
@@ -60,7 +65,9 @@ app
app app
.route({ .route({
...shopDefine.get('uninstall'), path: 'shop',
key: 'uninstall',
description: '卸载指定的应用,可以指定 id 和 type 参数',
middleware: ['admin-auth'], middleware: ['admin-auth'],
metadata: { metadata: {
admin: true, admin: true,

View File

@@ -7,7 +7,7 @@ app.route({
}).define(async (ctx) => { }).define(async (ctx) => {
const { username, password } = ctx.query; const { username, password } = ctx.query;
const query = assistantConfig.query; const query = assistantConfig.query;
const auth = assistantConfig.getConfig().auth; const auth = assistantConfig.getConfig().auth || {};
const res = await query.post({ const res = await query.post({
path: 'user', path: 'user',
key: 'login', key: 'login',
@@ -25,7 +25,7 @@ app.route({
} }
if (!auth.username) { if (!auth.username) {
// 初始管理员账号 // 初始管理员账号
auth.username = 'admin'; auth.username = loginUser;
assistantConfig.setConfig({ auth }); assistantConfig.setConfig({ auth });
} }
// 保存配置 // 保存配置

View File

@@ -1,6 +1,6 @@
{ {
"name": "@kevisual/cli", "name": "@kevisual/cli",
"version": "0.0.71", "version": "0.0.73",
"description": "envision 命令行工具", "description": "envision 命令行工具",
"type": "module", "type": "module",
"basename": "/root/cli", "basename": "/root/cli",
@@ -28,6 +28,7 @@
"scripts": { "scripts": {
"dev": "bun src/run.ts ", "dev": "bun src/run.ts ",
"dev:tsx": "tsx src/run.ts ", "dev:tsx": "tsx src/run.ts ",
"dev:server": "cd assistant && bun --watch src/run-server.ts ",
"build": "rimraf dist && bun run bun.config.mjs", "build": "rimraf dist && bun run bun.config.mjs",
"deploy": "ev pack -u -p -m no", "deploy": "ev pack -u -p -m no",
"pub:me": "npm publish --registry https://npm.xiongxiao.me --tag beta", "pub:me": "npm publish --registry https://npm.xiongxiao.me --tag beta",
@@ -41,15 +42,21 @@
"author": "abearxiong", "author": "abearxiong",
"dependencies": { "dependencies": {
"@kevisual/context": "^0.0.4", "@kevisual/context": "^0.0.4",
"@kevisual/hot-api": "^0.0.3",
"@nut-tree-fork/nut-js": "^4.2.6",
"eventemitter3": "^5.0.1",
"lowdb": "^7.0.1",
"lru-cache": "^11.2.4",
"micromatch": "^4.0.8", "micromatch": "^4.0.8",
"pm2": "^6.0.14", "pm2": "^6.0.14",
"semver": "^7.7.3" "semver": "^7.7.3",
"unstorage": "^1.17.3"
}, },
"devDependencies": { "devDependencies": {
"@kevisual/dts": "^0.0.3", "@kevisual/dts": "^0.0.3",
"@kevisual/load": "^0.0.6", "@kevisual/load": "^0.0.6",
"@kevisual/logger": "^0.0.4", "@kevisual/logger": "^0.0.4",
"@kevisual/query": "0.0.30", "@kevisual/query": "0.0.31",
"@kevisual/query-login": "0.0.7", "@kevisual/query-login": "0.0.7",
"@types/bun": "^1.3.3", "@types/bun": "^1.3.3",
"@types/crypto-js": "^4.2.2", "@types/crypto-js": "^4.2.2",

51
pnpm-lock.yaml generated
View File

@@ -11,6 +11,21 @@ importers:
'@kevisual/context': '@kevisual/context':
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4 version: 0.0.4
'@kevisual/hot-api':
specifier: ^0.0.3
version: 0.0.3(dotenv@17.2.3)(supports-color@10.2.2)
'@nut-tree-fork/nut-js':
specifier: ^4.2.6
version: 4.2.6
eventemitter3:
specifier: ^5.0.1
version: 5.0.1
lowdb:
specifier: ^7.0.1
version: 7.0.1
lru-cache:
specifier: ^11.2.4
version: 11.2.4
micromatch: micromatch:
specifier: ^4.0.8 specifier: ^4.0.8
version: 4.0.8 version: 4.0.8
@@ -20,6 +35,9 @@ importers:
semver: semver:
specifier: ^7.7.3 specifier: ^7.7.3
version: 7.7.3 version: 7.7.3
unstorage:
specifier: ^1.17.3
version: 1.17.3(idb-keyval@6.2.1)
devDependencies: devDependencies:
'@kevisual/dts': '@kevisual/dts':
specifier: ^0.0.3 specifier: ^0.0.3
@@ -31,11 +49,11 @@ importers:
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4 version: 0.0.4
'@kevisual/query': '@kevisual/query':
specifier: 0.0.30 specifier: 0.0.31
version: 0.0.30 version: 0.0.31
'@kevisual/query-login': '@kevisual/query-login':
specifier: 0.0.7 specifier: 0.0.7
version: 0.0.7(@kevisual/query@0.0.30) version: 0.0.7(@kevisual/query@0.0.31)
'@types/bun': '@types/bun':
specifier: ^1.3.3 specifier: ^1.3.3
version: 1.3.3 version: 1.3.3
@@ -91,8 +109,8 @@ importers:
assistant: assistant:
dependencies: dependencies:
'@kevisual/hot-api': '@kevisual/hot-api':
specifier: ^0.0.2 specifier: ^0.0.3
version: 0.0.2(dotenv@17.2.3)(supports-color@10.2.2) version: 0.0.3(dotenv@17.2.3)(supports-color@10.2.2)
'@nut-tree-fork/nut-js': '@nut-tree-fork/nut-js':
specifier: ^4.2.6 specifier: ^4.2.6
version: 4.2.6 version: 4.2.6
@@ -125,11 +143,11 @@ importers:
specifier: ^0.0.4 specifier: ^0.0.4
version: 0.0.4 version: 0.0.4
'@kevisual/query': '@kevisual/query':
specifier: 0.0.30 specifier: 0.0.31
version: 0.0.30 version: 0.0.31
'@kevisual/query-login': '@kevisual/query-login':
specifier: 0.0.7 specifier: 0.0.7
version: 0.0.7(@kevisual/query@0.0.30) version: 0.0.7(@kevisual/query@0.0.31)
'@kevisual/router': '@kevisual/router':
specifier: ^0.0.33 specifier: ^0.0.33
version: 0.0.33(supports-color@10.2.2) version: 0.0.33(supports-color@10.2.2)
@@ -527,8 +545,8 @@ packages:
resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==} resolution: {integrity: sha512-4T/m2LqhtwWEW+lWmg7jLxKFW7VtIAftsWFDDZvh10bZunqFf8iXxChHcVSQWikghJb4cq1IkWzPkvc2l+Asdw==}
hasBin: true hasBin: true
'@kevisual/hot-api@0.0.2': '@kevisual/hot-api@0.0.3':
resolution: {integrity: sha512-DUWfTScVmRx11f45rjoTjvs6b0LtZVT/EZfEw0l2rzx2vZWgRlYivIrYiH9QIV6dajVWNsth1xyjeNcu9+UfQA==} resolution: {integrity: sha512-qZ4CNK08StZP4+DR1vWwJhKVDoSXXC+PBFG4ZxtkXF5vO2rybE055zp1n3dg5jo8GwW5wxpqMIG3KBp3pYSTkg==}
'@kevisual/load@0.0.6': '@kevisual/load@0.0.6':
resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==} resolution: {integrity: sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA==}
@@ -550,6 +568,9 @@ packages:
'@kevisual/query@0.0.30': '@kevisual/query@0.0.30':
resolution: {integrity: sha512-mDPEaLX9LdTRgi9anmWQ4EJ491umsASu/gs6K85J5nJqtUN/kfnZ3x5IouUr6aNbgAhrNLv/vTqpQTBsQhEYHQ==} resolution: {integrity: sha512-mDPEaLX9LdTRgi9anmWQ4EJ491umsASu/gs6K85J5nJqtUN/kfnZ3x5IouUr6aNbgAhrNLv/vTqpQTBsQhEYHQ==}
'@kevisual/query@0.0.31':
resolution: {integrity: sha512-bBdepjmMICLpcj/a9fnn82/0CGGYUZiCV+usWsJZKAwVlZcnj+WtKmbgKT09KpP6g3jjYzYOaXHiNFB8N0bQAQ==}
'@kevisual/router@0.0.33': '@kevisual/router@0.0.33':
resolution: {integrity: sha512-9z7TkSzCIGbXn9SuHPBdZpGwHlAuwA8iN5jNAZBUvbEvBRkBxlrbdCSe9fBYiAHueLm2AceFNrW74uulOiAkqA==} resolution: {integrity: sha512-9z7TkSzCIGbXn9SuHPBdZpGwHlAuwA8iN5jNAZBUvbEvBRkBxlrbdCSe9fBYiAHueLm2AceFNrW74uulOiAkqA==}
@@ -2736,10 +2757,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@kevisual/hot-api@0.0.2(dotenv@17.2.3)(supports-color@10.2.2)': '@kevisual/hot-api@0.0.3(dotenv@17.2.3)(supports-color@10.2.2)':
dependencies: dependencies:
'@kevisual/ai': 0.0.16 '@kevisual/ai': 0.0.16
'@kevisual/query': 0.0.30 '@kevisual/query': 0.0.31
'@kevisual/router': 0.0.33(supports-color@10.2.2) '@kevisual/router': 0.0.33(supports-color@10.2.2)
'@kevisual/use-config': 1.0.21(dotenv@17.2.3) '@kevisual/use-config': 1.0.21(dotenv@17.2.3)
'@nut-tree-fork/nut-js': 4.2.6 '@nut-tree-fork/nut-js': 4.2.6
@@ -2771,14 +2792,16 @@ snapshots:
'@kevisual/permission@0.0.3': {} '@kevisual/permission@0.0.3': {}
'@kevisual/query-login@0.0.7(@kevisual/query@0.0.30)': '@kevisual/query-login@0.0.7(@kevisual/query@0.0.31)':
dependencies: dependencies:
'@kevisual/cache': 0.0.3 '@kevisual/cache': 0.0.3
'@kevisual/query': 0.0.30 '@kevisual/query': 0.0.31
dotenv: 17.2.3 dotenv: 17.2.3
'@kevisual/query@0.0.30': {} '@kevisual/query@0.0.30': {}
'@kevisual/query@0.0.31': {}
'@kevisual/router@0.0.33(supports-color@10.2.2)': '@kevisual/router@0.0.33(supports-color@10.2.2)':
dependencies: dependencies:
path-to-regexp: 8.3.0 path-to-regexp: 8.3.0