Compare commits
52 Commits
c00062d704
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0476b24c14 | ||
|
|
57326c14d6 | ||
|
|
c832465d57 | ||
|
|
babee3f155 | ||
|
|
35d3cae9f1 | ||
|
|
b7e2bdcb1c | ||
|
|
c3bc0d2465 | ||
|
|
bcb5552ebc | ||
|
|
342b68abe3 | ||
|
|
228635a3cc | ||
|
|
4e8eb06f56 | ||
|
|
85a88cdf1a | ||
|
|
fdfea838a3 | ||
|
|
0a2b1a0042 | ||
|
|
0ee0ce9fdc | ||
|
|
8d85e83418 | ||
| bd0ce0058e | |||
| 9df4021d68 | |||
| 3243baa872 | |||
| ee9c573bba | |||
| 761eeec9f6 | |||
| 9d07685b8d | |||
| 060595c352 | |||
| d33db1b8e7 | |||
| 6aeff117dc | |||
| 94e4db8d44 | |||
| cb8e709c5d | |||
| 8867951893 | |||
| 2d4666ce90 | |||
| ad494248cc | |||
| 5594123cc7 | |||
| 3b383639d6 | |||
| c2c6d4a7d3 | |||
| 57bf884360 | |||
| 73d0fb9730 | |||
| acd88fb815 | |||
| e5e04e0cc9 | |||
| 31a7a99dbd | |||
| a9ce575be5 | |||
| 22ef776b27 | |||
| 37e00a9ff3 | |||
| d3104bd5a5 | |||
|
|
6795cef3d5 | ||
| dff858d820 | |||
| f67ca752f3 | |||
| bda7fc3b92 | |||
| 58a0e9e61f | |||
| 4b935036ad | |||
| 8875c0ea3d | |||
| d6e3f67ac3 | |||
|
|
88313d5b8e | ||
|
|
e377557587 |
30
.cnb.yml
30
.cnb.yml
@@ -4,8 +4,7 @@ include:
|
||||
|
||||
.common_env: &common_env
|
||||
env:
|
||||
TO_REPO: kevisual/cli
|
||||
TO_URL: git.xiongxiao.me
|
||||
USERNAME: root
|
||||
imports:
|
||||
- https://cnb.cool/kevisual/env/-/blob/main/.env.development
|
||||
|
||||
@@ -16,29 +15,6 @@ $:
|
||||
services:
|
||||
- vscode
|
||||
- docker
|
||||
env: !reference [.common_env, env]
|
||||
imports: !reference [.common_env, imports]
|
||||
# 开发环境启动后会执行的任务
|
||||
# stages:
|
||||
# - name: pnpm install
|
||||
# script: pnpm install
|
||||
stages: !reference [.dev_tempalte, stages]
|
||||
|
||||
.common_sync_to_gitea: &common_sync_to_gitea
|
||||
- <<: *common_env
|
||||
services: !reference [.common_sync_to_gitea_template, services]
|
||||
stages: !reference [.common_sync_to_gitea_template, stages]
|
||||
|
||||
.common_sync_from_gitea: &common_sync_from_gitea
|
||||
- <<: *common_env
|
||||
services: !reference [.common_sync_from_gitea_template, services]
|
||||
stages: !reference [.common_sync_from_gitea_template, stages]
|
||||
|
||||
main:
|
||||
web_trigger_sync_to_gitea:
|
||||
- <<: *common_sync_to_gitea
|
||||
web_trigger_sync_from_gitea:
|
||||
- <<: *common_sync_from_gitea
|
||||
api_trigger_sync_to_gitea:
|
||||
- <<: *common_sync_to_gitea
|
||||
api_trigger_sync_from_gitea:
|
||||
- <<: *common_sync_from_gitea
|
||||
stages: !reference [.dev_template, stages]
|
||||
@@ -1,11 +0,0 @@
|
||||
# .cnb/web_trigger.yml
|
||||
branch:
|
||||
# 如下按钮在分支名以 release 开头的分支详情页面显示
|
||||
- reg: "^main"
|
||||
buttons:
|
||||
- name: 同步代码到gitea
|
||||
description: 同步代码到gitea
|
||||
event: web_trigger_sync_to_gitea
|
||||
- name: 同步gitea代码到当前仓库
|
||||
description: 同步gitea代码到当前仓库
|
||||
event: web_trigger_sync_from_gitea
|
||||
1
.npmrc
1
.npmrc
@@ -1,3 +1,2 @@
|
||||
//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN}
|
||||
//npm.cnb.cool/kevisual/registry/-/packages/:_authToken=${CNB_API_KEY}
|
||||
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
|
||||
@@ -1,10 +1,11 @@
|
||||
---
|
||||
name: kill-opencode
|
||||
description: 自动查找并杀死所有opencode相关的进程,确保系统资源释放。
|
||||
tags:
|
||||
- opencode
|
||||
- process-management
|
||||
- automation
|
||||
metadata:
|
||||
tags:
|
||||
- opencode
|
||||
- process-management
|
||||
- automation
|
||||
---
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
77
assistant/.opencode/skills/opencode-skill-creator/SKILL.md
Normal file
77
assistant/.opencode/skills/opencode-skill-creator/SKILL.md
Normal file
@@ -0,0 +1,77 @@
|
||||
---
|
||||
name: opencode-skill-creator
|
||||
description: 教你如何在opencode中创建自定义skill
|
||||
---
|
||||
|
||||
## Skill 创建指南
|
||||
|
||||
### 目录结构
|
||||
|
||||
每个skill都是一个文件夹,包含以下文件:
|
||||
```
|
||||
skills/
|
||||
└── your-skill-name/
|
||||
└── SKILL.md
|
||||
```
|
||||
|
||||
### SKILL.md 文件格式
|
||||
|
||||
使用 YAML frontmatter 定义元数据:
|
||||
|
||||
```yaml
|
||||
---
|
||||
name: 技能名称
|
||||
description: 技能描述
|
||||
---
|
||||
```
|
||||
|
||||
### Frontmatter 字段说明
|
||||
|
||||
| 字段 | 必填 | 说明 |
|
||||
|------|------|------|
|
||||
| `name` | 是 | 技能名称,用于显示在技能列表中 |
|
||||
| `description` | 是 | 技能简短描述 |
|
||||
|
||||
### 技能内容规范
|
||||
|
||||
1. **描述要详细**:清楚地说明这个skill能做什么
|
||||
2. **提供示例**:包含实际使用的代码示例
|
||||
3. **说明参数**:列出所有可用参数及其作用
|
||||
4. **保持简洁**:避免冗长的说明
|
||||
|
||||
### 创建步骤
|
||||
|
||||
1. 在 `/workspace/.opencode/skills/` 目录下创建新文件夹
|
||||
2. 在文件夹中创建 `SKILL.md` 文件
|
||||
3. 编写frontmatter和内容
|
||||
4. 技能将自动被系统识别
|
||||
|
||||
### 示例
|
||||
|
||||
```yaml
|
||||
---
|
||||
name: 示例技能
|
||||
description: 这是一个示例技能的描述
|
||||
---
|
||||
|
||||
这是一个详细的技能说明文档。
|
||||
|
||||
## 使用方法
|
||||
|
||||
```bash
|
||||
# 示例命令
|
||||
echo "Hello World"
|
||||
```
|
||||
|
||||
## 参数说明
|
||||
|
||||
- `param1`: 参数1说明
|
||||
- `param2`: 参数2说明
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
|
||||
- 文件名必须是 `SKILL.md`(大写)
|
||||
- frontmatter 必须使用 `---` 包裹
|
||||
- 内容支持 Markdown 语法
|
||||
- 可以包含代码块、表格、列表等
|
||||
213
assistant/.opencode/skills/router-creator/SKILL.md
Normal file
213
assistant/.opencode/skills/router-creator/SKILL.md
Normal file
@@ -0,0 +1,213 @@
|
||||
---
|
||||
name: router-creator
|
||||
description: 教你如何使用 @kevisual/router 创建和管理路由
|
||||
metadata:
|
||||
tags:
|
||||
- router
|
||||
- api
|
||||
- routes
|
||||
---
|
||||
|
||||
# router
|
||||
|
||||
一个轻量级的路由框架,支持链式调用、中间件、嵌套路由等功能。
|
||||
|
||||
## 快速开始
|
||||
|
||||
```ts
|
||||
import { App } from '@kevisual/router';
|
||||
|
||||
const app = new App();
|
||||
app.listen(4002);
|
||||
|
||||
app
|
||||
.route({ path: 'demo', key: '02' })
|
||||
.define(async (ctx) => {
|
||||
ctx.body = '02';
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({ path: 'demo', key: '03' })
|
||||
.define(async (ctx) => {
|
||||
ctx.body = '03';
|
||||
})
|
||||
.addTo(app);
|
||||
```
|
||||
|
||||
## 核心概念
|
||||
|
||||
### RouteContext 属性说明
|
||||
|
||||
在 route handler 中,你可以通过 `ctx` 访问以下属性:
|
||||
|
||||
| 属性 | 类型 | 说明 |
|
||||
| --------------- | ---------------------------- | ---------------------------- |
|
||||
| `query` | `object` | 请求参数,会自动合并 payload |
|
||||
| `body` | `number \| string \| Object` | 响应内容 |
|
||||
| `code` | `number` | 响应状态码,默认为 200 |
|
||||
| `message` | `string` | 响应消息 |
|
||||
| `state` | `any` | 状态数据,可在路由间传递 |
|
||||
| `appId` | `string` | 应用标识 |
|
||||
| `currentId` | `string` | 当前路由ID |
|
||||
| `currentPath` | `string` | 当前路由路径 |
|
||||
| `currentKey` | `string` | 当前路由 key |
|
||||
| `currentRoute` | `Route` | 当前 Route 实例 |
|
||||
| `progress` | `[string, string][]` | 路由执行路径记录 |
|
||||
| `nextQuery` | `object` | 传递给下一个路由的参数 |
|
||||
| `end` | `boolean` | 是否提前结束路由执行 |
|
||||
| `app` | `QueryRouter` | 路由实例引用 |
|
||||
| `error` | `any` | 错误信息 |
|
||||
| `index` | `number` | 当前路由执行深度 |
|
||||
| `needSerialize` | `boolean` | 是否需要序列化响应数据 |
|
||||
|
||||
### 上下文方法
|
||||
|
||||
| 方法 | 参数 | 说明 |
|
||||
| ----------------------------------- | ----------------------------------------- | -------------------------------------------- |
|
||||
| `ctx.call(msg, ctx?)` | `{ path, key?, payload?, ... } \| { id }` | 调用其他路由,返回完整 context |
|
||||
| `ctx.run(msg, ctx?)` | `{ path, key?, payload? }` | 调用其他路由,返回 `{ code, data, message }` |
|
||||
| `ctx.forward(res)` | `{ code, data?, message? }` | 设置响应结果 |
|
||||
| `ctx.throw(code?, message?, tips?)` | - | 抛出自定义错误 |
|
||||
|
||||
## 完整示例
|
||||
|
||||
```ts
|
||||
import { App } from '@kevisual/router';
|
||||
import z from 'zod';
|
||||
const app = new App();
|
||||
app.listen(4002);
|
||||
|
||||
// 基本路由
|
||||
app
|
||||
.route({ path: 'user', key: 'info', id: 'user-info' })
|
||||
.define(async (ctx) => {
|
||||
// ctx.query 包含请求参数
|
||||
const { id } = ctx.query;
|
||||
// 使用 state 在路由间传递数据
|
||||
ctx.state.orderId = '12345';
|
||||
ctx.body = { id, name: '张三' };
|
||||
ctx.code = 200;
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
app
|
||||
.route({ path: 'order', key: 'pay', middleware: ['user-info'] })
|
||||
.define(async (ctx) => {
|
||||
// 可以获取前一个路由设置的 state
|
||||
const { orderId } = ctx.state;
|
||||
ctx.body = { orderId, status: 'paid' };
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 调用其他路由
|
||||
app
|
||||
.route({ path: 'dashboard', key: 'stats' })
|
||||
.define(async (ctx) => {
|
||||
// 调用 user/info 路由
|
||||
const userRes = await ctx.run({ path: 'user', key: 'info', payload: { id: 1 } });
|
||||
// 调用 product/list 路由
|
||||
const productRes = await ctx.run({ path: 'product', key: 'list' });
|
||||
|
||||
ctx.body = {
|
||||
user: userRes.data,
|
||||
products: productRes.data,
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 使用 throw 抛出错误
|
||||
app
|
||||
.route({ path: 'admin', key: 'delete' })
|
||||
.define(async (ctx) => {
|
||||
const { id } = ctx.query;
|
||||
if (!id) {
|
||||
ctx.throw(400, '缺少参数', 'id is required');
|
||||
}
|
||||
ctx.body = { success: true };
|
||||
})
|
||||
.addTo(app);
|
||||
```
|
||||
|
||||
## 中间件
|
||||
|
||||
```ts
|
||||
import { App, Route } from '@kevisual/router';
|
||||
|
||||
const app = new App();
|
||||
|
||||
// 定义中间件
|
||||
app
|
||||
.route({
|
||||
id: 'auth-example',
|
||||
description: '权限校验中间件',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const token = ctx.query.token;
|
||||
if (!token) {
|
||||
ctx.throw(401, '未登录', '需要 token');
|
||||
}
|
||||
// 验证通过,设置用户信息到 state
|
||||
ctx.state.tokenUser = { id: 1, name: '用户A' };
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
// 使用中间件(通过 id 引用)
|
||||
app
|
||||
.route({ path: 'admin', key: 'panel', middleware: ['auth-example'] })
|
||||
.define(async (ctx) => {
|
||||
// 可以访问中间件设置的 state
|
||||
const { tokenUser } = ctx.state;
|
||||
ctx.body = { tokenUser };
|
||||
})
|
||||
.addTo(app);
|
||||
```
|
||||
|
||||
## 一个丰富的router示例
|
||||
|
||||
```ts
|
||||
import { App } from '@kevisual/router';
|
||||
const app = new App();
|
||||
|
||||
app
|
||||
.router({
|
||||
path: 'dog',
|
||||
key: 'info',
|
||||
description: '获取狗的信息',
|
||||
metedata: {
|
||||
args: {
|
||||
owner: z.string().describe('狗主人姓名'),
|
||||
age: z.number().describe('狗的年龄'),
|
||||
},
|
||||
},
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const { owner, age } = ctx.query;
|
||||
ctx.body = {
|
||||
content: `这是一只${age}岁的狗,主人是${owner}`,
|
||||
};
|
||||
})
|
||||
.addTo(app);
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **path 和 key 的组合是路由的唯一标识**,同一个 path+key 只能添加一个路由,后添加的会覆盖之前的。
|
||||
|
||||
2. **ctx.call vs ctx.run**:
|
||||
- `call` 返回完整 context,包含所有属性
|
||||
- `run` 返回 `{ code, data, message }` 格式,data 即 body
|
||||
|
||||
3. **ctx.throw 会自动结束执行**,抛出自定义错误。
|
||||
|
||||
4. **payload 会自动合并到 query**,调用 `ctx.run({ path, key, payload })` 时,payload 会合并到 query。
|
||||
|
||||
5. **nextQuery 用于传递给 nextRoute**,在当前路由中设置 `ctx.nextQuery`,会在执行 nextRoute 时合并到 query。
|
||||
|
||||
6. **避免 nextRoute 循环调用**,默认最大深度为 40 次,超过会返回 500 错误。
|
||||
|
||||
7. **needSerialize 默认为 true**,会自动对 body 进行 JSON 序列化和反序列化。
|
||||
|
||||
8. **progress 记录执行路径**,可用于调试和追踪路由调用链。
|
||||
|
||||
9. **中间件找不到会返回 404**,错误信息中会包含找不到的中间件列表。
|
||||
875
assistant/bun.lock
Normal file
875
assistant/bun.lock
Normal file
@@ -0,0 +1,875 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"configVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "@kevisual/assistant-cli",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.1008.0",
|
||||
"@kevisual/js-filter": "^0.0.6",
|
||||
"@kevisual/oss": "^0.0.20",
|
||||
"@kevisual/video-tools": "^0.0.13",
|
||||
"@opencode-ai/sdk": "^1.2.24",
|
||||
"es-toolkit": "^1.45.1",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"lowdb": "^7.0.1",
|
||||
"lru-cache": "^11.2.6",
|
||||
"pm2": "^6.0.14",
|
||||
"unstorage": "^1.17.4",
|
||||
"zod": "^4.3.6",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@inquirer/prompts": "^8.3.0",
|
||||
"@kevisual/ai": "^0.0.28",
|
||||
"@kevisual/api": "^0.0.64",
|
||||
"@kevisual/load": "^0.0.6",
|
||||
"@kevisual/local-app-manager": "^0.1.32",
|
||||
"@kevisual/logger": "^0.0.4",
|
||||
"@kevisual/query": "0.0.53",
|
||||
"@kevisual/router": "^0.1.1",
|
||||
"@kevisual/types": "^0.0.12",
|
||||
"@kevisual/use-config": "^1.0.30",
|
||||
"@opencode-ai/plugin": "^1.2.24",
|
||||
"@types/bun": "^1.3.10",
|
||||
"@types/node": "^25.5.0",
|
||||
"@types/send": "^1.2.1",
|
||||
"@types/ws": "^8.18.1",
|
||||
"chalk": "^5.6.2",
|
||||
"commander": "^14.0.3",
|
||||
"cross-env": "^10.1.0",
|
||||
"dayjs": "^1.11.20",
|
||||
"dotenv": "^17.3.1",
|
||||
"get-port": "^7.1.0",
|
||||
"meilisearch": "^0.55.0",
|
||||
"nanoid": "^5.1.6",
|
||||
"send": "^1.2.1",
|
||||
"supports-color": "^10.2.2",
|
||||
"table": "^6.9.0",
|
||||
"ws": "npm:@kevisual/ws",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@ai-sdk/anthropic": ["@ai-sdk/anthropic@3.0.58", "https://registry.npmmirror.com/@ai-sdk/anthropic/-/anthropic-3.0.58.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/53SACgmVukO4bkms4dpxpRlYhW8Ct6QZRe6sj1Pi5H00hYhxIrqfiLbZBGxkdRvjsBQeP/4TVGsXgH5rQeb8Q=="],
|
||||
|
||||
"@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.66", "https://registry.npmmirror.com/@ai-sdk/gateway/-/gateway-3.0.66.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A=="],
|
||||
|
||||
"@ai-sdk/openai": ["@ai-sdk/openai@3.0.41", "https://registry.npmmirror.com/@ai-sdk/openai/-/openai-3.0.41.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-IZ42A+FO+vuEQCVNqlnAPYQnnUpUfdJIwn1BEDOBywiEHa23fw7PahxVtlX9zm3/zMvTW4JKPzWyvAgDu+SQ2A=="],
|
||||
|
||||
"@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.35", "https://registry.npmmirror.com/@ai-sdk/openai-compatible/-/openai-compatible-2.0.35.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-g3wA57IAQFb+3j4YuFndgkUdXyRETZVvbfAWM+UX7bZSxA3xjes0v3XKgIdKdekPtDGsh4ZX2byHD0gJIMPfiA=="],
|
||||
|
||||
"@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "https://registry.npmmirror.com/@ai-sdk/provider/-/provider-3.0.8.tgz", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="],
|
||||
|
||||
"@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.19", "https://registry.npmmirror.com/@ai-sdk/provider-utils/-/provider-utils-4.0.19.tgz", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-3eG55CrSWCu2SXlqq2QCsFjo3+E7+Gmg7i/oRVoSZzIodTuDSfLb3MRje67xE9RFea73Zao7Lm4mADIfUETKGg=="],
|
||||
|
||||
"@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "https://registry.npmmirror.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="],
|
||||
|
||||
"@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "https://registry.npmmirror.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="],
|
||||
|
||||
"@aws-crypto/sha1-browser": ["@aws-crypto/sha1-browser@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", { "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg=="],
|
||||
|
||||
"@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="],
|
||||
|
||||
"@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "https://registry.npmmirror.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="],
|
||||
|
||||
"@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "https://registry.npmmirror.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="],
|
||||
|
||||
"@aws-crypto/util": ["@aws-crypto/util@5.2.0", "https://registry.npmmirror.com/@aws-crypto/util/-/util-5.2.0.tgz", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="],
|
||||
|
||||
"@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1008.0", "https://registry.npmmirror.com/@aws-sdk/client-s3/-/client-s3-3.1008.0.tgz", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.19", "@aws-sdk/credential-provider-node": "^3.972.20", "@aws-sdk/middleware-bucket-endpoint": "^3.972.7", "@aws-sdk/middleware-expect-continue": "^3.972.7", "@aws-sdk/middleware-flexible-checksums": "^3.973.5", "@aws-sdk/middleware-host-header": "^3.972.7", "@aws-sdk/middleware-location-constraint": "^3.972.7", "@aws-sdk/middleware-logger": "^3.972.7", "@aws-sdk/middleware-recursion-detection": "^3.972.7", "@aws-sdk/middleware-sdk-s3": "^3.972.19", "@aws-sdk/middleware-ssec": "^3.972.7", "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/region-config-resolver": "^3.972.7", "@aws-sdk/signature-v4-multi-region": "^3.996.7", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", "@aws-sdk/util-user-agent-browser": "^3.972.7", "@aws-sdk/util-user-agent-node": "^3.973.6", "@smithy/config-resolver": "^4.4.10", "@smithy/core": "^3.23.9", "@smithy/eventstream-serde-browser": "^4.2.11", "@smithy/eventstream-serde-config-resolver": "^4.3.11", "@smithy/eventstream-serde-node": "^4.2.11", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/hash-blob-browser": "^4.2.12", "@smithy/hash-node": "^4.2.11", "@smithy/hash-stream-node": "^4.2.11", "@smithy/invalid-dependency": "^4.2.11", "@smithy/md5-js": "^4.2.11", "@smithy/middleware-content-length": "^4.2.11", "@smithy/middleware-endpoint": "^4.4.23", "@smithy/middleware-retry": "^4.4.40", "@smithy/middleware-serde": "^4.2.12", "@smithy/middleware-stack": "^4.2.11", "@smithy/node-config-provider": "^4.3.11", "@smithy/node-http-handler": "^4.4.14", "@smithy/protocol-http": "^5.3.11", "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.11", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.39", "@smithy/util-defaults-mode-node": "^4.2.42", "@smithy/util-endpoints": "^3.3.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-retry": "^4.2.11", "@smithy/util-stream": "^4.5.17", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-w/SIRD25v2zVMbkn8CYIxUsac8yf5Jghkhw5j7EsNWdJhl56m/nWpUX7t1etFUW1cnzpFjZV0lXt0dNFSnbXwA=="],
|
||||
|
||||
"@aws-sdk/core": ["@aws-sdk/core@3.973.19", "https://registry.npmmirror.com/@aws-sdk/core/-/core-3.973.19.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@aws-sdk/xml-builder": "^3.972.10", "@smithy/core": "^3.23.9", "@smithy/node-config-provider": "^4.3.11", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", "@smithy/signature-v4": "^5.3.11", "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ=="],
|
||||
|
||||
"@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.972.4", "https://registry.npmmirror.com/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.4.tgz", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-HKZIZLbRyvzo/bXZU7Zmk6XqU+1C9DjI56xd02vwuDIxedxBEqP17t9ExhbP9QFeNq/a3l9GOcyirFXxmbDhmw=="],
|
||||
|
||||
"@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.17", "https://registry.npmmirror.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA=="],
|
||||
|
||||
"@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.19", "https://registry.npmmirror.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/node-http-handler": "^4.4.14", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/util-stream": "^4.5.17", "tslib": "^2.6.2" } }, "sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA=="],
|
||||
|
||||
"@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.972.19", "https://registry.npmmirror.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/credential-provider-env": "^3.972.17", "@aws-sdk/credential-provider-http": "^3.972.19", "@aws-sdk/credential-provider-login": "^3.972.19", "@aws-sdk/credential-provider-process": "^3.972.17", "@aws-sdk/credential-provider-sso": "^3.972.19", "@aws-sdk/credential-provider-web-identity": "^3.972.19", "@aws-sdk/nested-clients": "^3.996.9", "@aws-sdk/types": "^3.973.5", "@smithy/credential-provider-imds": "^4.2.11", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-pVJVjWqVrPqjpFq7o0mCmeZu1Y0c94OCHSYgivdCD2wfmYVtBbwQErakruhgOD8pcMcx9SCqRw1pzHKR7OGBcA=="],
|
||||
|
||||
"@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.19", "https://registry.npmmirror.com/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/nested-clients": "^3.996.9", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/protocol-http": "^5.3.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-jOXdZ1o+CywQKr6gyxgxuUmnGwTTnY2Kxs1PM7fI6AYtDWDnmW/yKXayNqkF8KjP1unflqMWKVbVt5VgmE3L0g=="],
|
||||
|
||||
"@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.20", "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.20.tgz", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.17", "@aws-sdk/credential-provider-http": "^3.972.19", "@aws-sdk/credential-provider-ini": "^3.972.19", "@aws-sdk/credential-provider-process": "^3.972.17", "@aws-sdk/credential-provider-sso": "^3.972.19", "@aws-sdk/credential-provider-web-identity": "^3.972.19", "@aws-sdk/types": "^3.973.5", "@smithy/credential-provider-imds": "^4.2.11", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-0xHca2BnPY0kzjDYPH7vk8YbfdBPpWVS67rtqQMalYDQUCBYS37cZ55K6TuFxCoIyNZgSCFrVKr9PXC5BVvQQw=="],
|
||||
|
||||
"@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.17", "https://registry.npmmirror.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg=="],
|
||||
|
||||
"@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.972.19", "https://registry.npmmirror.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/nested-clients": "^3.996.9", "@aws-sdk/token-providers": "3.1008.0", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-kVjQsEU3b///q7EZGrUzol9wzwJFKbEzqJKSq82A9ShrUTEO7FNylTtby3sPV19ndADZh1H3FB3+5ZrvKtEEeg=="],
|
||||
|
||||
"@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.19", "https://registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/nested-clients": "^3.996.9", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-BV1BlTFdG4w4tAihxN7iXDBoNcNewXD4q8uZlNQiUrnqxwGWUhKHODIQVSPlQGxXClEj+63m+cqZskw+ESmeZg=="],
|
||||
|
||||
"@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/node-config-provider": "^4.3.11", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA=="],
|
||||
|
||||
"@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ=="],
|
||||
|
||||
"@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.973.5", "https://registry.npmmirror.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.5.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "^3.973.19", "@aws-sdk/crc64-nvme": "^3.972.4", "@aws-sdk/types": "^3.973.5", "@smithy/is-array-buffer": "^4.2.2", "@smithy/node-config-provider": "^4.3.11", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "@smithy/util-middleware": "^4.2.11", "@smithy/util-stream": "^4.5.17", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-Dp3hqE5W6hG8HQ3Uh+AINx9wjjqYmFHbxede54sGj3akx/haIQrkp85lNdTdC+ouNUcSYNiuGkzmyDREfHX1Gg=="],
|
||||
|
||||
"@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ=="],
|
||||
|
||||
"@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig=="],
|
||||
|
||||
"@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w=="],
|
||||
|
||||
"@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ=="],
|
||||
|
||||
"@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.972.19", "https://registry.npmmirror.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.19.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-arn-parser": "^3.972.3", "@smithy/core": "^3.23.9", "@smithy/node-config-provider": "^4.3.11", "@smithy/protocol-http": "^5.3.11", "@smithy/signature-v4": "^5.3.11", "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-stream": "^4.5.17", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-/CtOHHVFg4ZuN6CnLnYkrqWgVEnbOBC4kNiKa+4fldJ9cioDt3dD/f5vpq0cWLOXwmGL2zgVrVxNhjxWpxNMkg=="],
|
||||
|
||||
"@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.972.7", "https://registry.npmmirror.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ=="],
|
||||
|
||||
"@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.972.20", "https://registry.npmmirror.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", "@smithy/core": "^3.23.9", "@smithy/protocol-http": "^5.3.11", "@smithy/types": "^4.13.0", "@smithy/util-retry": "^4.2.11", "tslib": "^2.6.2" } }, "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA=="],
|
||||
|
||||
"@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.996.9", "https://registry.npmmirror.com/@aws-sdk/nested-clients/-/nested-clients-3.996.9.tgz", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.19", "@aws-sdk/middleware-host-header": "^3.972.7", "@aws-sdk/middleware-logger": "^3.972.7", "@aws-sdk/middleware-recursion-detection": "^3.972.7", "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/region-config-resolver": "^3.972.7", "@aws-sdk/types": "^3.973.5", "@aws-sdk/util-endpoints": "^3.996.4", "@aws-sdk/util-user-agent-browser": "^3.972.7", "@aws-sdk/util-user-agent-node": "^3.973.6", "@smithy/config-resolver": "^4.4.10", "@smithy/core": "^3.23.9", "@smithy/fetch-http-handler": "^5.3.13", "@smithy/hash-node": "^4.2.11", "@smithy/invalid-dependency": "^4.2.11", "@smithy/middleware-content-length": "^4.2.11", "@smithy/middleware-endpoint": "^4.4.23", "@smithy/middleware-retry": "^4.4.40", "@smithy/middleware-serde": "^4.2.12", "@smithy/middleware-stack": "^4.2.11", "@smithy/node-config-provider": "^4.3.11", "@smithy/node-http-handler": "^4.4.14", "@smithy/protocol-http": "^5.3.11", "@smithy/smithy-client": "^4.12.3", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.11", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.39", "@smithy/util-defaults-mode-node": "^4.2.42", "@smithy/util-endpoints": "^3.3.2", "@smithy/util-middleware": "^4.2.11", "@smithy/util-retry": "^4.2.11", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-+RpVtpmQbbtzFOKhMlsRcXM/3f1Z49qTOHaA8gEpHOYruERmog6f2AUtf/oTRLCWjR9H2b3roqryV/hI7QMW8w=="],
|
||||
|
||||
"@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.972.7", "https://registry.npmmirror.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/config-resolver": "^4.4.10", "@smithy/node-config-provider": "^4.3.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA=="],
|
||||
|
||||
"@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.7", "https://registry.npmmirror.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.7.tgz", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "^3.972.19", "@aws-sdk/types": "^3.973.5", "@smithy/protocol-http": "^5.3.11", "@smithy/signature-v4": "^5.3.11", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-mYhh7FY+7OOqjkYkd6+6GgJOsXK1xBWmuR+c5mxJPj2kr5TBNeZq+nUvE9kANWAux5UxDVrNOSiEM/wlHzC3Lg=="],
|
||||
|
||||
"@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1008.0", "https://registry.npmmirror.com/@aws-sdk/token-providers/-/token-providers-3.1008.0.tgz", { "dependencies": { "@aws-sdk/core": "^3.973.19", "@aws-sdk/nested-clients": "^3.996.9", "@aws-sdk/types": "^3.973.5", "@smithy/property-provider": "^4.2.11", "@smithy/shared-ini-file-loader": "^4.4.6", "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-TulwlHQBWcJs668kNUDMZHN51DeLrDsYT59Ux4a/nbvr025gM6HjKJJ3LvnZccam7OS/ZKUVkWomCneRQKJbBg=="],
|
||||
|
||||
"@aws-sdk/types": ["@aws-sdk/types@3.973.5", "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.973.5.tgz", { "dependencies": { "@smithy/types": "^4.13.0", "tslib": "^2.6.2" } }, "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ=="],
|
||||
|
||||
"@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.972.3", "https://registry.npmmirror.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA=="],
|
||||
|
||||
"@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.996.4", "https://registry.npmmirror.com/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/types": "^4.13.0", "@smithy/url-parser": "^4.2.11", "@smithy/util-endpoints": "^3.3.2", "tslib": "^2.6.2" } }, "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA=="],
|
||||
|
||||
"@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.5", "https://registry.npmmirror.com/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ=="],
|
||||
|
||||
"@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.972.7", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", { "dependencies": { "@aws-sdk/types": "^3.973.5", "@smithy/types": "^4.13.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw=="],
|
||||
|
||||
"@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.973.6", "https://registry.npmmirror.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.6.tgz", { "dependencies": { "@aws-sdk/middleware-user-agent": "^3.972.20", "@aws-sdk/types": "^3.973.5", "@smithy/node-config-provider": "^4.3.11", "@smithy/types": "^4.13.0", "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ=="],
|
||||
|
||||
"@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.10", "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz", { "dependencies": { "@smithy/types": "^4.13.0", "fast-xml-parser": "5.4.1", "tslib": "^2.6.2" } }, "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA=="],
|
||||
|
||||
"@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.4", "https://registry.npmmirror.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", {}, "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ=="],
|
||||
|
||||
"@epic-web/invariant": ["@epic-web/invariant@1.0.0", "https://registry.npmmirror.com/@epic-web/invariant/-/invariant-1.0.0.tgz", {}, "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA=="],
|
||||
|
||||
"@gradio/client": ["@gradio/client@2.1.0", "https://registry.npmmirror.com/@gradio/client/-/client-2.1.0.tgz", { "dependencies": { "fetch-event-stream": "^0.1.5" } }, "sha512-LyDyvpueETaZI62xbjaLa74iSrtsbib6c2uhzxML0eSYkfX553imlK5Nu9NIcwMU2+ULAsCqUCutgd0PeCumww=="],
|
||||
|
||||
"@inquirer/ansi": ["@inquirer/ansi@2.0.3", "https://registry.npmmirror.com/@inquirer/ansi/-/ansi-2.0.3.tgz", {}, "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw=="],
|
||||
|
||||
"@inquirer/checkbox": ["@inquirer/checkbox@5.1.0", "https://registry.npmmirror.com/@inquirer/checkbox/-/checkbox-5.1.0.tgz", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g=="],
|
||||
|
||||
"@inquirer/confirm": ["@inquirer/confirm@6.0.8", "https://registry.npmmirror.com/@inquirer/confirm/-/confirm-6.0.8.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw=="],
|
||||
|
||||
"@inquirer/core": ["@inquirer/core@11.1.5", "https://registry.npmmirror.com/@inquirer/core/-/core-11.1.5.tgz", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A=="],
|
||||
|
||||
"@inquirer/editor": ["@inquirer/editor@5.0.8", "https://registry.npmmirror.com/@inquirer/editor/-/editor-5.0.8.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/external-editor": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-sLcpbb9B3XqUEGrj1N66KwhDhEckzZ4nI/W6SvLXyBX8Wic3LDLENlWRvkOGpCPoserabe+MxQkpiMoI8irvyA=="],
|
||||
|
||||
"@inquirer/expand": ["@inquirer/expand@5.0.8", "https://registry.npmmirror.com/@inquirer/expand/-/expand-5.0.8.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-QieW3F1prNw3j+hxO7/NKkG1pk3oz7pOB6+5Upwu3OIwADfPX0oZVppsqlL+Vl/uBHHDSOBY0BirLctLnXwGGg=="],
|
||||
|
||||
"@inquirer/external-editor": ["@inquirer/external-editor@2.0.3", "https://registry.npmmirror.com/@inquirer/external-editor/-/external-editor-2.0.3.tgz", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w=="],
|
||||
|
||||
"@inquirer/figures": ["@inquirer/figures@2.0.3", "https://registry.npmmirror.com/@inquirer/figures/-/figures-2.0.3.tgz", {}, "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g=="],
|
||||
|
||||
"@inquirer/input": ["@inquirer/input@5.0.8", "https://registry.npmmirror.com/@inquirer/input/-/input-5.0.8.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw=="],
|
||||
|
||||
"@inquirer/number": ["@inquirer/number@4.0.8", "https://registry.npmmirror.com/@inquirer/number/-/number-4.0.8.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-uGLiQah9A0F9UIvJBX52m0CnqtLaym0WpT9V4YZrjZ+YRDKZdwwoEPz06N6w8ChE2lrnsdyhY9sL+Y690Kh9gQ=="],
|
||||
|
||||
"@inquirer/password": ["@inquirer/password@5.0.8", "https://registry.npmmirror.com/@inquirer/password/-/password-5.0.8.tgz", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-zt1sF4lYLdvPqvmvHdmjOzuUUjuCQ897pdUCO8RbXMUDKXJTTyOQgtn23le+jwcb+MpHl3VAFvzIdxRAf6aPlA=="],
|
||||
|
||||
"@inquirer/prompts": ["@inquirer/prompts@8.3.0", "https://registry.npmmirror.com/@inquirer/prompts/-/prompts-8.3.0.tgz", { "dependencies": { "@inquirer/checkbox": "^5.1.0", "@inquirer/confirm": "^6.0.8", "@inquirer/editor": "^5.0.8", "@inquirer/expand": "^5.0.8", "@inquirer/input": "^5.0.8", "@inquirer/number": "^4.0.8", "@inquirer/password": "^5.0.8", "@inquirer/rawlist": "^5.2.4", "@inquirer/search": "^4.1.4", "@inquirer/select": "^5.1.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-JAj66kjdH/F1+B7LCigjARbwstt3SNUOSzMdjpsvwJmzunK88gJeXmcm95L9nw1KynvFVuY4SzXh/3Y0lvtgSg=="],
|
||||
|
||||
"@inquirer/rawlist": ["@inquirer/rawlist@5.2.4", "https://registry.npmmirror.com/@inquirer/rawlist/-/rawlist-5.2.4.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-fTuJ5Cq9W286isLxwj6GGyfTjx1Zdk4qppVEPexFuA6yioCCXS4V1zfKroQqw7QdbDPN73xs2DiIAlo55+kBqg=="],
|
||||
|
||||
"@inquirer/search": ["@inquirer/search@4.1.4", "https://registry.npmmirror.com/@inquirer/search/-/search-4.1.4.tgz", { "dependencies": { "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9yPTxq7LPmYjrGn3DRuaPuPbmC6u3fiWcsE9ggfLcdgO/ICHYgxq7mEy1yJ39brVvgXhtOtvDVjDh9slJxE4LQ=="],
|
||||
|
||||
"@inquirer/select": ["@inquirer/select@5.1.0", "https://registry.npmmirror.com/@inquirer/select/-/select-5.1.0.tgz", { "dependencies": { "@inquirer/ansi": "^2.0.3", "@inquirer/core": "^11.1.5", "@inquirer/figures": "^2.0.3", "@inquirer/type": "^4.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q=="],
|
||||
|
||||
"@inquirer/type": ["@inquirer/type@4.0.3", "https://registry.npmmirror.com/@inquirer/type/-/type-4.0.3.tgz", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw=="],
|
||||
|
||||
"@kevisual/ai": ["@kevisual/ai@0.0.28", "https://registry.npmmirror.com/@kevisual/ai/-/ai-0.0.28.tgz", { "dependencies": { "@ai-sdk/anthropic": "^3.0.58", "@ai-sdk/openai": "^3.0.41", "@ai-sdk/openai-compatible": "^2.0.35", "@kevisual/js-filter": "^0.0.6", "@kevisual/logger": "^0.0.4", "@kevisual/permission": "^0.0.4", "@kevisual/query": "^0.0.53", "ai": "^6.0.116", "zod": "^4.3.6" } }, "sha512-GLwCNXfopDvOj+hEZwEIwOV2/3VGd+TCPgBClaYuAv30KzhgehlCW05HPjBducSg+uPcdKacEzZsecHjo5fMUQ=="],
|
||||
|
||||
"@kevisual/api": ["@kevisual/api@0.0.64", "https://registry.npmmirror.com/@kevisual/api/-/api-0.0.64.tgz", { "dependencies": { "@kevisual/context": "^0.0.8", "@kevisual/js-filter": "^0.0.6", "@kevisual/load": "^0.0.6", "@paralleldrive/cuid2": "^3.3.0", "es-toolkit": "^1.45.1", "eventemitter3": "^5.0.4", "fuse.js": "^7.1.0", "nanoid": "^5.1.6", "path-browserify-esm": "^1.0.6", "sonner": "^2.0.7", "spark-md5": "^3.0.2", "zustand": "^5.0.11" } }, "sha512-y7wP8ucvi/rflVGd6uJpvuEUTwI7wMef8+ITQzv4flg7a2pwWZYe/DT0TOyaqDAqKOTlXaVIdBeI15jXuUxIIg=="],
|
||||
|
||||
"@kevisual/context": ["@kevisual/context@0.0.8", "https://registry.npmmirror.com/@kevisual/context/-/context-0.0.8.tgz", {}, "sha512-DTJpyHI34NE76B7g6f+QlIqiCCyqI2qkBMQE736dzeRDGxOjnbe2iQY9W+Rt2PE6kmymM3qyOmSfNovyWyWrkA=="],
|
||||
|
||||
"@kevisual/js-filter": ["@kevisual/js-filter@0.0.6", "https://registry.npmmirror.com/@kevisual/js-filter/-/js-filter-0.0.6.tgz", {}, "sha512-FcbOsmS1inhwrfgXMM/XLFTGTHUxBCss32JEMYdEFWQDYCar5rN8cxD1W8FuKDTVRlpA+zBpQ/BE6XT4UaeljA=="],
|
||||
|
||||
"@kevisual/load": ["@kevisual/load@0.0.6", "https://registry.npmmirror.com/@kevisual/load/-/load-0.0.6.tgz", { "dependencies": { "eventemitter3": "^5.0.1" } }, "sha512-+3YTFehRcZ1haGel5DKYMUwmi5i6f2psyaPZlfkKU/cOXgkpwoG9/BEqPCnPjicKqqnksEpixVRkyHJ+5bjLVA=="],
|
||||
|
||||
"@kevisual/local-app-manager": ["@kevisual/local-app-manager@0.1.32", "https://registry.npmmirror.com/@kevisual/local-app-manager/-/local-app-manager-0.1.32.tgz", { "dependencies": { "pm2": "^6.0.14" } }, "sha512-G1pvemOrw7BB2BQ27AIPPWM+VNOtc5/6pHB3Dx01UGJV27nCc2dpHDc+GEIM7GM1jSJ5OYyL+fbB6lVB595cog=="],
|
||||
|
||||
"@kevisual/logger": ["@kevisual/logger@0.0.4", "https://registry.npmmirror.com/@kevisual/logger/-/logger-0.0.4.tgz", {}, "sha512-+fpr92eokSxoGOW1SIRl/27lPuO+zyY+feR5o2Q4YCNlAdt2x64NwC/w8r/3NEC5QenLgd4K0azyKTI2mHbARw=="],
|
||||
|
||||
"@kevisual/oss": ["@kevisual/oss@0.0.20", "https://registry.npmmirror.com/@kevisual/oss/-/oss-0.0.20.tgz", {}, "sha512-apsE+D79kNQrgdvgGzoS/kGEEfrO58WoHSFpUQOL1leuGdcmiT6pKLhBaWiAkmiJkacLBRwUNUTjz6xI+4liBg=="],
|
||||
|
||||
"@kevisual/permission": ["@kevisual/permission@0.0.4", "https://registry.npmmirror.com/@kevisual/permission/-/permission-0.0.4.tgz", {}, "sha512-zwBYPnT/z21W4q2wkklJrxvoYBYWG/+a3iXFDKqXQAnDOcxm/SU1f1N6FQb9KxGKl36/fclVlhxlxqszvKCenQ=="],
|
||||
|
||||
"@kevisual/query": ["@kevisual/query@0.0.53", "https://registry.npmmirror.com/@kevisual/query/-/query-0.0.53.tgz", {}, "sha512-PAhpCLBr0emz0lGNlTVHMbJiC5wrtGLbInPddRzgKE35fiyNt+SWSsUWABiD0DeNrLN/OxWyAFobt880Z/e5MQ=="],
|
||||
|
||||
"@kevisual/router": ["@kevisual/router@0.1.1", "https://registry.npmmirror.com/@kevisual/router/-/router-0.1.1.tgz", { "dependencies": { "es-toolkit": "^1.45.1" } }, "sha512-+uaJc+Bf/T1mfxyfy9PmwuxJGPOLhVqrmsli2xUPqkkFvizrFIGB1vBTITuo5XP/FnwGqxgbjsitG57AMubm3w=="],
|
||||
|
||||
"@kevisual/types": ["@kevisual/types@0.0.12", "https://registry.npmmirror.com/@kevisual/types/-/types-0.0.12.tgz", {}, "sha512-zJXH2dosir3jVrQ6QG4i0+iLQeT9gJ3H+cKXs8ReWboxBSYzUZO78XssVeVrFPsJ33iaAqo4q3DWbSS1dWGn7Q=="],
|
||||
|
||||
"@kevisual/use-config": ["@kevisual/use-config@1.0.30", "https://registry.npmmirror.com/@kevisual/use-config/-/use-config-1.0.30.tgz", { "dependencies": { "@kevisual/load": "^0.0.6" }, "peerDependencies": { "dotenv": "^17" } }, "sha512-kPdna0FW/X7D600aMdiZ5UTjbCo6d8d4jjauSc8RMmBwUU6WliFDSPUNKVpzm2BsDX5Nth1IXFPYMqH+wxqAmw=="],
|
||||
|
||||
"@kevisual/video": ["@kevisual/video@0.0.2", "https://registry.npmmirror.com/@kevisual/video/-/video-0.0.2.tgz", {}, "sha512-v2k9CC6Nq2UDzGwR9V7BMFf4jUsyCRKes1+3V7odPqOrbu+DskirWZVnMQFCkndB2Mmhkz1BugFVFrYak8bBew=="],
|
||||
|
||||
"@kevisual/video-tools": ["@kevisual/video-tools@0.0.13", "https://registry.npmmirror.com/@kevisual/video-tools/-/video-tools-0.0.13.tgz", { "dependencies": { "@gradio/client": "^2.0.1", "@kevisual/ai": "^0.0.19", "@kevisual/router": "0.0.51", "@kevisual/use-config": "^1.0.21", "@kevisual/video": "^0.0.2", "crypto-js": "^4.2.0", "dayjs": "^1.11.19", "eventemitter3": "^5.0.1", "nanoid": "^5.1.6" } }, "sha512-bbAMTQznmlm70csVX5nQTeV+TsZw4BohYoYxcUsCi/slKZry2pWQaJgN3uKT0ovkZzLp1bogBEcBHmeP3wxXiw=="],
|
||||
|
||||
"@noble/hashes": ["@noble/hashes@2.0.1", "https://registry.npmmirror.com/@noble/hashes/-/hashes-2.0.1.tgz", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
|
||||
|
||||
"@opencode-ai/plugin": ["@opencode-ai/plugin@1.2.25", "https://registry.npmmirror.com/@opencode-ai/plugin/-/plugin-1.2.25.tgz", { "dependencies": { "@opencode-ai/sdk": "1.2.25", "zod": "4.1.8" } }, "sha512-IQnjkcN7cvI/zoiDNx1d2qnGzn5BR/Bu95Kq05/vdd8oX4ARgYkqfaJgKkNSpjUVoNBKHTd8m9q1TtzuKlyGUg=="],
|
||||
|
||||
"@opencode-ai/sdk": ["@opencode-ai/sdk@1.2.25", "https://registry.npmmirror.com/@opencode-ai/sdk/-/sdk-1.2.25.tgz", {}, "sha512-ikuGWob48OM7LTgfXFqGOZKVOqh50FEjvtIBhXGhGowJhifmjZ+xuq/ypP8nPjTwUX73pbu1C3X9ZBWVkCN9mA=="],
|
||||
|
||||
"@opentelemetry/api": ["@opentelemetry/api@1.9.0", "https://registry.npmmirror.com/@opentelemetry/api/-/api-1.9.0.tgz", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
|
||||
|
||||
"@paralleldrive/cuid2": ["@paralleldrive/cuid2@3.3.0", "https://registry.npmmirror.com/@paralleldrive/cuid2/-/cuid2-3.3.0.tgz", { "dependencies": { "@noble/hashes": "^2.0.1", "bignumber.js": "^9.3.1", "error-causes": "^3.0.2" }, "bin": { "cuid2": "bin/cuid2.js" } }, "sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw=="],
|
||||
|
||||
"@peculiar/asn1-cms": ["@peculiar/asn1-cms@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "@peculiar/asn1-x509-attr": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw=="],
|
||||
|
||||
"@peculiar/asn1-csr": ["@peculiar/asn1-csr@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w=="],
|
||||
|
||||
"@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g=="],
|
||||
|
||||
"@peculiar/asn1-pfx": ["@peculiar/asn1-pfx@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-cms": "^2.6.1", "@peculiar/asn1-pkcs8": "^2.6.1", "@peculiar/asn1-rsa": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw=="],
|
||||
|
||||
"@peculiar/asn1-pkcs8": ["@peculiar/asn1-pkcs8@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw=="],
|
||||
|
||||
"@peculiar/asn1-pkcs9": ["@peculiar/asn1-pkcs9@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-cms": "^2.6.1", "@peculiar/asn1-pfx": "^2.6.1", "@peculiar/asn1-pkcs8": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "@peculiar/asn1-x509-attr": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw=="],
|
||||
|
||||
"@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA=="],
|
||||
|
||||
"@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.6.0", "https://registry.npmmirror.com/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", { "dependencies": { "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg=="],
|
||||
|
||||
"@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA=="],
|
||||
|
||||
"@peculiar/asn1-x509-attr": ["@peculiar/asn1-x509-attr@2.6.1", "https://registry.npmmirror.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", { "dependencies": { "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ=="],
|
||||
|
||||
"@peculiar/x509": ["@peculiar/x509@1.14.3", "https://registry.npmmirror.com/@peculiar/x509/-/x509-1.14.3.tgz", { "dependencies": { "@peculiar/asn1-cms": "^2.6.0", "@peculiar/asn1-csr": "^2.6.0", "@peculiar/asn1-ecc": "^2.6.0", "@peculiar/asn1-pkcs9": "^2.6.0", "@peculiar/asn1-rsa": "^2.6.0", "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.0", "pvtsutils": "^1.3.6", "reflect-metadata": "^0.2.2", "tslib": "^2.8.1", "tsyringe": "^4.10.0" } }, "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA=="],
|
||||
|
||||
"@pm2/agent": ["@pm2/agent@2.1.1", "https://registry.npmmirror.com/@pm2/agent/-/agent-2.1.1.tgz", { "dependencies": { "async": "~3.2.0", "chalk": "~3.0.0", "dayjs": "~1.8.24", "debug": "~4.3.1", "eventemitter2": "~5.0.1", "fast-json-patch": "^3.1.0", "fclone": "~1.0.11", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.0", "proxy-agent": "~6.4.0", "semver": "~7.5.0", "ws": "~7.5.10" } }, "sha512-0V9ckHWd/HSC8BgAbZSoq8KXUG81X97nSkAxmhKDhmF8vanyaoc1YXwc2KVkbWz82Rg4gjd2n9qiT3i7bdvGrQ=="],
|
||||
|
||||
"@pm2/blessed": ["@pm2/blessed@0.1.81", "https://registry.npmmirror.com/@pm2/blessed/-/blessed-0.1.81.tgz", { "bin": { "blessed": "bin/tput.js" } }, "sha512-ZcNHqQjMuNRcQ7Z1zJbFIQZO/BDKV3KbiTckWdfbUaYhj7uNmUwb+FbdDWSCkvxNr9dBJQwvV17o6QBkAvgO0g=="],
|
||||
|
||||
"@pm2/io": ["@pm2/io@6.1.0", "https://registry.npmmirror.com/@pm2/io/-/io-6.1.0.tgz", { "dependencies": { "async": "~2.6.1", "debug": "~4.3.1", "eventemitter2": "^6.3.1", "require-in-the-middle": "^5.0.0", "semver": "~7.5.4", "shimmer": "^1.2.0", "signal-exit": "^3.0.3", "tslib": "1.9.3" } }, "sha512-IxHuYURa3+FQ6BKePlgChZkqABUKFYH6Bwbw7V/pWU1pP6iR1sCI26l7P9ThUEB385ruZn/tZS3CXDUF5IA1NQ=="],
|
||||
|
||||
"@pm2/js-api": ["@pm2/js-api@0.8.0", "https://registry.npmmirror.com/@pm2/js-api/-/js-api-0.8.0.tgz", { "dependencies": { "async": "^2.6.3", "debug": "~4.3.1", "eventemitter2": "^6.3.1", "extrareqp2": "^1.0.0", "ws": "^7.0.0" } }, "sha512-nmWzrA/BQZik3VBz+npRcNIu01kdBhWL0mxKmP1ciF/gTcujPTQqt027N9fc1pK9ERM8RipFhymw7RcmCyOEYA=="],
|
||||
|
||||
"@pm2/pm2-version-check": ["@pm2/pm2-version-check@1.0.4", "https://registry.npmmirror.com/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz", { "dependencies": { "debug": "^4.3.1" } }, "sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA=="],
|
||||
|
||||
"@smithy/abort-controller": ["@smithy/abort-controller@4.2.12", "https://registry.npmmirror.com/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q=="],
|
||||
|
||||
"@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.2", "https://registry.npmmirror.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw=="],
|
||||
|
||||
"@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.3", "https://registry.npmmirror.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", { "dependencies": { "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw=="],
|
||||
|
||||
"@smithy/config-resolver": ["@smithy/config-resolver@4.4.11", "https://registry.npmmirror.com/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "@smithy/util-config-provider": "^4.2.2", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw=="],
|
||||
|
||||
"@smithy/core": ["@smithy/core@3.23.11", "https://registry.npmmirror.com/@smithy/core/-/core-3.23.11.tgz", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-stream": "^4.5.19", "@smithy/util-utf8": "^4.2.2", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ=="],
|
||||
|
||||
"@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.12", "https://registry.npmmirror.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg=="],
|
||||
|
||||
"@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.12", "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA=="],
|
||||
|
||||
"@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.12", "https://registry.npmmirror.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A=="],
|
||||
|
||||
"@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.12", "https://registry.npmmirror.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q=="],
|
||||
|
||||
"@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.12", "https://registry.npmmirror.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA=="],
|
||||
|
||||
"@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.12", "https://registry.npmmirror.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", { "dependencies": { "@smithy/eventstream-codec": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ=="],
|
||||
|
||||
"@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.15", "https://registry.npmmirror.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" } }, "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A=="],
|
||||
|
||||
"@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.13", "https://registry.npmmirror.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.2", "@smithy/chunked-blob-reader-native": "^4.2.3", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g=="],
|
||||
|
||||
"@smithy/hash-node": ["@smithy/hash-node@4.2.12", "https://registry.npmmirror.com/@smithy/hash-node/-/hash-node-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w=="],
|
||||
|
||||
"@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.12", "https://registry.npmmirror.com/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw=="],
|
||||
|
||||
"@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.12", "https://registry.npmmirror.com/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g=="],
|
||||
|
||||
"@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.2", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow=="],
|
||||
|
||||
"@smithy/md5-js": ["@smithy/md5-js@4.2.12", "https://registry.npmmirror.com/@smithy/md5-js/-/md5-js-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ=="],
|
||||
|
||||
"@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.12", "https://registry.npmmirror.com/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", { "dependencies": { "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA=="],
|
||||
|
||||
"@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.25", "https://registry.npmmirror.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/middleware-serde": "^4.2.14", "@smithy/node-config-provider": "^4.3.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-middleware": "^4.2.12", "tslib": "^2.6.2" } }, "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A=="],
|
||||
|
||||
"@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.42", "https://registry.npmmirror.com/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/protocol-http": "^5.3.12", "@smithy/service-error-classification": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" } }, "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg=="],
|
||||
|
||||
"@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.14", "https://registry.npmmirror.com/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg=="],
|
||||
|
||||
"@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.12", "https://registry.npmmirror.com/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw=="],
|
||||
|
||||
"@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.12", "https://registry.npmmirror.com/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw=="],
|
||||
|
||||
"@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.16", "https://registry.npmmirror.com/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/querystring-builder": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw=="],
|
||||
|
||||
"@smithy/property-provider": ["@smithy/property-provider@4.2.12", "https://registry.npmmirror.com/@smithy/property-provider/-/property-provider-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A=="],
|
||||
|
||||
"@smithy/protocol-http": ["@smithy/protocol-http@5.3.12", "https://registry.npmmirror.com/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw=="],
|
||||
|
||||
"@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.12", "https://registry.npmmirror.com/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg=="],
|
||||
|
||||
"@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.12", "https://registry.npmmirror.com/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw=="],
|
||||
|
||||
"@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.12", "https://registry.npmmirror.com/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1" } }, "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ=="],
|
||||
|
||||
"@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.7", "https://registry.npmmirror.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw=="],
|
||||
|
||||
"@smithy/signature-v4": ["@smithy/signature-v4@5.3.12", "https://registry.npmmirror.com/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-uri-escape": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw=="],
|
||||
|
||||
"@smithy/smithy-client": ["@smithy/smithy-client@4.12.5", "https://registry.npmmirror.com/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", { "dependencies": { "@smithy/core": "^3.23.11", "@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-stack": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/types": "^4.13.1", "@smithy/util-stream": "^4.5.19", "tslib": "^2.6.2" } }, "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w=="],
|
||||
|
||||
"@smithy/types": ["@smithy/types@4.13.1", "https://registry.npmmirror.com/@smithy/types/-/types-4.13.1.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g=="],
|
||||
|
||||
"@smithy/url-parser": ["@smithy/url-parser@4.2.12", "https://registry.npmmirror.com/@smithy/url-parser/-/url-parser-4.2.12.tgz", { "dependencies": { "@smithy/querystring-parser": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA=="],
|
||||
|
||||
"@smithy/util-base64": ["@smithy/util-base64@4.3.2", "https://registry.npmmirror.com/@smithy/util-base64/-/util-base64-4.3.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ=="],
|
||||
|
||||
"@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.2", "https://registry.npmmirror.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ=="],
|
||||
|
||||
"@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.3", "https://registry.npmmirror.com/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g=="],
|
||||
|
||||
"@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.2", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", { "dependencies": { "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q=="],
|
||||
|
||||
"@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.2", "https://registry.npmmirror.com/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ=="],
|
||||
|
||||
"@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.41", "https://registry.npmmirror.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", { "dependencies": { "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g=="],
|
||||
|
||||
"@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.44", "https://registry.npmmirror.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", { "dependencies": { "@smithy/config-resolver": "^4.4.11", "@smithy/credential-provider-imds": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/smithy-client": "^4.12.5", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ=="],
|
||||
|
||||
"@smithy/util-endpoints": ["@smithy/util-endpoints@3.3.3", "https://registry.npmmirror.com/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", { "dependencies": { "@smithy/node-config-provider": "^4.3.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig=="],
|
||||
|
||||
"@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.2", "https://registry.npmmirror.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg=="],
|
||||
|
||||
"@smithy/util-middleware": ["@smithy/util-middleware@4.2.12", "https://registry.npmmirror.com/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ=="],
|
||||
|
||||
"@smithy/util-retry": ["@smithy/util-retry@4.2.12", "https://registry.npmmirror.com/@smithy/util-retry/-/util-retry-4.2.12.tgz", { "dependencies": { "@smithy/service-error-classification": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ=="],
|
||||
|
||||
"@smithy/util-stream": ["@smithy/util-stream@4.5.19", "https://registry.npmmirror.com/@smithy/util-stream/-/util-stream-4.5.19.tgz", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.15", "@smithy/node-http-handler": "^4.4.16", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-buffer-from": "^4.2.2", "@smithy/util-hex-encoding": "^4.2.2", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w=="],
|
||||
|
||||
"@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.2", "https://registry.npmmirror.com/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw=="],
|
||||
|
||||
"@smithy/util-utf8": ["@smithy/util-utf8@4.2.2", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", { "dependencies": { "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw=="],
|
||||
|
||||
"@smithy/util-waiter": ["@smithy/util-waiter@4.2.13", "https://registry.npmmirror.com/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", { "dependencies": { "@smithy/abort-controller": "^4.2.12", "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ=="],
|
||||
|
||||
"@smithy/uuid": ["@smithy/uuid@1.1.2", "https://registry.npmmirror.com/@smithy/uuid/-/uuid-1.1.2.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g=="],
|
||||
|
||||
"@standard-schema/spec": ["@standard-schema/spec@1.1.0", "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
|
||||
|
||||
"@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
|
||||
|
||||
"@types/bun": ["@types/bun@1.3.10", "https://registry.npmmirror.com/@types/bun/-/bun-1.3.10.tgz", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="],
|
||||
|
||||
"@types/node": ["@types/node@25.5.0", "https://registry.npmmirror.com/@types/node/-/node-25.5.0.tgz", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
|
||||
|
||||
"@types/send": ["@types/send@1.2.1", "https://registry.npmmirror.com/@types/send/-/send-1.2.1.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="],
|
||||
|
||||
"@types/ws": ["@types/ws@8.18.1", "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
|
||||
|
||||
"@vercel/oidc": ["@vercel/oidc@3.1.0", "https://registry.npmmirror.com/@vercel/oidc/-/oidc-3.1.0.tgz", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
|
||||
|
||||
"agent-base": ["agent-base@7.1.4", "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
|
||||
|
||||
"ai": ["ai@6.0.116", "https://registry.npmmirror.com/ai/-/ai-6.0.116.tgz", { "dependencies": { "@ai-sdk/gateway": "3.0.66", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.19", "@opentelemetry/api": "1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-7yM+cTmyRLeNIXwt4Vj+mrrJgVQ9RMIW5WO0ydoLoYkewIvsMcvUmqS4j2RJTUXaF1HphwmSKUMQ/HypNRGOmA=="],
|
||||
|
||||
"ajv": ["ajv@8.18.0", "https://registry.npmmirror.com/ajv/-/ajv-8.18.0.tgz", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
|
||||
|
||||
"amp": ["amp@0.3.1", "https://registry.npmmirror.com/amp/-/amp-0.3.1.tgz", {}, "sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw=="],
|
||||
|
||||
"amp-message": ["amp-message@0.1.2", "https://registry.npmmirror.com/amp-message/-/amp-message-0.1.2.tgz", { "dependencies": { "amp": "0.3.1" } }, "sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg=="],
|
||||
|
||||
"ansi-colors": ["ansi-colors@4.1.3", "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
|
||||
|
||||
"ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
|
||||
|
||||
"ansis": ["ansis@4.0.0-node10", "https://registry.npmmirror.com/ansis/-/ansis-4.0.0-node10.tgz", {}, "sha512-BRrU0Bo1X9dFGw6KgGz6hWrqQuOlVEDOzkb0QSLZY9sXHqA7pNj7yHPVJRz7y/rj4EOJ3d/D5uxH+ee9leYgsg=="],
|
||||
|
||||
"anymatch": ["anymatch@3.1.3", "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
||||
|
||||
"argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
|
||||
|
||||
"asn1js": ["asn1js@3.0.7", "https://registry.npmmirror.com/asn1js/-/asn1js-3.0.7.tgz", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ=="],
|
||||
|
||||
"ast-types": ["ast-types@0.13.4", "https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
|
||||
|
||||
"astral-regex": ["astral-regex@2.0.0", "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="],
|
||||
|
||||
"async": ["async@3.2.6", "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
|
||||
|
||||
"basic-ftp": ["basic-ftp@5.2.0", "https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.2.0.tgz", {}, "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw=="],
|
||||
|
||||
"bignumber.js": ["bignumber.js@9.3.1", "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
|
||||
|
||||
"binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
|
||||
|
||||
"bodec": ["bodec@0.1.0", "https://registry.npmmirror.com/bodec/-/bodec-0.1.0.tgz", {}, "sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ=="],
|
||||
|
||||
"bowser": ["bowser@2.14.1", "https://registry.npmmirror.com/bowser/-/bowser-2.14.1.tgz", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"buffer-from": ["buffer-from@1.1.2", "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
|
||||
|
||||
"bun-types": ["bun-types@1.3.10", "https://registry.npmmirror.com/bun-types/-/bun-types-1.3.10.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
|
||||
|
||||
"bytestreamjs": ["bytestreamjs@2.0.1", "https://registry.npmmirror.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz", {}, "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ=="],
|
||||
|
||||
"chalk": ["chalk@5.6.2", "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
||||
|
||||
"chardet": ["chardet@2.1.1", "https://registry.npmmirror.com/chardet/-/chardet-2.1.1.tgz", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
|
||||
|
||||
"charm": ["charm@0.1.2", "https://registry.npmmirror.com/charm/-/charm-0.1.2.tgz", {}, "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ=="],
|
||||
|
||||
"chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
|
||||
|
||||
"cli-tableau": ["cli-tableau@2.0.1", "https://registry.npmmirror.com/cli-tableau/-/cli-tableau-2.0.1.tgz", { "dependencies": { "chalk": "3.0.0" } }, "sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ=="],
|
||||
|
||||
"cli-width": ["cli-width@4.1.0", "https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
|
||||
|
||||
"color-convert": ["color-convert@2.0.1", "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
|
||||
|
||||
"color-name": ["color-name@1.1.4", "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
|
||||
|
||||
"commander": ["commander@14.0.3", "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
|
||||
|
||||
"cookie-es": ["cookie-es@1.2.2", "https://registry.npmmirror.com/cookie-es/-/cookie-es-1.2.2.tgz", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="],
|
||||
|
||||
"croner": ["croner@4.1.97", "https://registry.npmmirror.com/croner/-/croner-4.1.97.tgz", {}, "sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ=="],
|
||||
|
||||
"cross-env": ["cross-env@10.1.0", "https://registry.npmmirror.com/cross-env/-/cross-env-10.1.0.tgz", { "dependencies": { "@epic-web/invariant": "^1.0.0", "cross-spawn": "^7.0.6" }, "bin": { "cross-env": "dist/bin/cross-env.js", "cross-env-shell": "dist/bin/cross-env-shell.js" } }, "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw=="],
|
||||
|
||||
"cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
|
||||
|
||||
"crossws": ["crossws@0.3.5", "https://registry.npmmirror.com/crossws/-/crossws-0.3.5.tgz", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="],
|
||||
|
||||
"crypto-js": ["crypto-js@4.2.0", "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="],
|
||||
|
||||
"culvert": ["culvert@0.1.2", "https://registry.npmmirror.com/culvert/-/culvert-0.1.2.tgz", {}, "sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg=="],
|
||||
|
||||
"data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
|
||||
|
||||
"dayjs": ["dayjs@1.11.20", "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.20.tgz", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="],
|
||||
|
||||
"debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
|
||||
"defu": ["defu@6.1.4", "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
|
||||
|
||||
"degenerator": ["degenerator@5.0.1", "https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="],
|
||||
|
||||
"depd": ["depd@2.0.0", "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
|
||||
|
||||
"destr": ["destr@2.0.5", "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
|
||||
|
||||
"dotenv": ["dotenv@17.3.1", "https://registry.npmmirror.com/dotenv/-/dotenv-17.3.1.tgz", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="],
|
||||
|
||||
"ee-first": ["ee-first@1.1.1", "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
|
||||
|
||||
"emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
|
||||
|
||||
"encodeurl": ["encodeurl@2.0.0", "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
|
||||
|
||||
"enquirer": ["enquirer@2.3.6", "https://registry.npmmirror.com/enquirer/-/enquirer-2.3.6.tgz", { "dependencies": { "ansi-colors": "^4.1.1" } }, "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg=="],
|
||||
|
||||
"error-causes": ["error-causes@3.0.2", "https://registry.npmmirror.com/error-causes/-/error-causes-3.0.2.tgz", {}, "sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw=="],
|
||||
|
||||
"es-toolkit": ["es-toolkit@1.45.1", "https://registry.npmmirror.com/es-toolkit/-/es-toolkit-1.45.1.tgz", {}, "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw=="],
|
||||
|
||||
"escape-html": ["escape-html@1.0.3", "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
|
||||
|
||||
"escape-string-regexp": ["escape-string-regexp@4.0.0", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
|
||||
|
||||
"escodegen": ["escodegen@2.1.0", "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="],
|
||||
|
||||
"esprima": ["esprima@4.0.1", "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
|
||||
|
||||
"estraverse": ["estraverse@5.3.0", "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
|
||||
|
||||
"esutils": ["esutils@2.0.3", "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
|
||||
|
||||
"etag": ["etag@1.8.1", "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
|
||||
|
||||
"eventemitter2": ["eventemitter2@5.0.1", "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-5.0.1.tgz", {}, "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg=="],
|
||||
|
||||
"eventemitter3": ["eventemitter3@5.0.4", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
|
||||
|
||||
"eventsource-parser": ["eventsource-parser@3.0.6", "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.0.6.tgz", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
|
||||
|
||||
"extrareqp2": ["extrareqp2@1.0.0", "https://registry.npmmirror.com/extrareqp2/-/extrareqp2-1.0.0.tgz", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA=="],
|
||||
|
||||
"fast-deep-equal": ["fast-deep-equal@3.1.3", "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
|
||||
|
||||
"fast-json-patch": ["fast-json-patch@3.1.1", "https://registry.npmmirror.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz", {}, "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="],
|
||||
|
||||
"fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "https://registry.npmmirror.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="],
|
||||
|
||||
"fast-string-width": ["fast-string-width@3.0.2", "https://registry.npmmirror.com/fast-string-width/-/fast-string-width-3.0.2.tgz", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="],
|
||||
|
||||
"fast-uri": ["fast-uri@3.1.0", "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
|
||||
|
||||
"fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "https://registry.npmmirror.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="],
|
||||
|
||||
"fast-xml-builder": ["fast-xml-builder@1.1.3", "https://registry.npmmirror.com/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg=="],
|
||||
|
||||
"fast-xml-parser": ["fast-xml-parser@5.4.1", "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A=="],
|
||||
|
||||
"fclone": ["fclone@1.0.11", "https://registry.npmmirror.com/fclone/-/fclone-1.0.11.tgz", {}, "sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw=="],
|
||||
|
||||
"fetch-event-stream": ["fetch-event-stream@0.1.6", "https://registry.npmmirror.com/fetch-event-stream/-/fetch-event-stream-0.1.6.tgz", {}, "sha512-GREtJ5HNikdU2AXtZ6E/5bk+aslMU6ie5mPG6H9nvsdDkkHQ6m5lHwmmmDTOBexok9hApQ7EprsXCdmz9ZC68w=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"follow-redirects": ["follow-redirects@1.15.11", "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="],
|
||||
|
||||
"fresh": ["fresh@2.0.0", "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
|
||||
|
||||
"fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||
|
||||
"function-bind": ["function-bind@1.1.2", "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||
|
||||
"fuse.js": ["fuse.js@7.1.0", "https://registry.npmmirror.com/fuse.js/-/fuse.js-7.1.0.tgz", {}, "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ=="],
|
||||
|
||||
"get-port": ["get-port@7.1.0", "https://registry.npmmirror.com/get-port/-/get-port-7.1.0.tgz", {}, "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw=="],
|
||||
|
||||
"get-uri": ["get-uri@6.0.5", "https://registry.npmmirror.com/get-uri/-/get-uri-6.0.5.tgz", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],
|
||||
|
||||
"git-node-fs": ["git-node-fs@1.0.0", "https://registry.npmmirror.com/git-node-fs/-/git-node-fs-1.0.0.tgz", {}, "sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ=="],
|
||||
|
||||
"git-sha1": ["git-sha1@0.1.2", "https://registry.npmmirror.com/git-sha1/-/git-sha1-0.1.2.tgz", {}, "sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg=="],
|
||||
|
||||
"glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"h3": ["h3@1.15.6", "https://registry.npmmirror.com/h3/-/h3-1.15.6.tgz", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.5", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ=="],
|
||||
|
||||
"has-flag": ["has-flag@4.0.0", "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
|
||||
|
||||
"hasown": ["hasown@2.0.2", "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||
|
||||
"http-errors": ["http-errors@2.0.1", "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
|
||||
|
||||
"http-proxy-agent": ["http-proxy-agent@7.0.2", "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
|
||||
|
||||
"https-proxy-agent": ["https-proxy-agent@7.0.6", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
|
||||
|
||||
"iconv-lite": ["iconv-lite@0.4.24", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
|
||||
|
||||
"inherits": ["inherits@2.0.4", "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
|
||||
|
||||
"ini": ["ini@1.3.8", "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
|
||||
|
||||
"ip-address": ["ip-address@10.1.0", "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="],
|
||||
|
||||
"iron-webcrypto": ["iron-webcrypto@1.2.1", "https://registry.npmmirror.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
|
||||
|
||||
"is-binary-path": ["is-binary-path@2.1.0", "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
|
||||
|
||||
"is-core-module": ["is-core-module@2.16.1", "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
|
||||
|
||||
"js-git": ["js-git@0.7.8", "https://registry.npmmirror.com/js-git/-/js-git-0.7.8.tgz", { "dependencies": { "bodec": "^0.1.0", "culvert": "^0.1.2", "git-sha1": "^0.1.2", "pako": "^0.2.5" } }, "sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA=="],
|
||||
|
||||
"js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
|
||||
|
||||
"json-schema": ["json-schema@0.4.0", "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],
|
||||
|
||||
"json-schema-traverse": ["json-schema-traverse@1.0.0", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
|
||||
|
||||
"json-stringify-safe": ["json-stringify-safe@5.0.1", "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
|
||||
|
||||
"lodash": ["lodash@4.17.23", "https://registry.npmmirror.com/lodash/-/lodash-4.17.23.tgz", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
|
||||
|
||||
"lodash.truncate": ["lodash.truncate@4.4.2", "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="],
|
||||
|
||||
"lowdb": ["lowdb@7.0.1", "https://registry.npmmirror.com/lowdb/-/lowdb-7.0.1.tgz", { "dependencies": { "steno": "^4.0.2" } }, "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw=="],
|
||||
|
||||
"lru-cache": ["lru-cache@11.2.6", "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.6.tgz", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
|
||||
|
||||
"meilisearch": ["meilisearch@0.55.0", "https://registry.npmmirror.com/meilisearch/-/meilisearch-0.55.0.tgz", {}, "sha512-qSMeiezfDgIqciIeYzh5E4pXDZZD7CtHeWDCs43kN3trLgl5FtfmBAIkljL3huFaOx08feYtC8FfIFUpVwq6rg=="],
|
||||
|
||||
"mime-db": ["mime-db@1.54.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
|
||||
|
||||
"mime-types": ["mime-types@3.0.2", "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
|
||||
|
||||
"mkdirp": ["mkdirp@1.0.4", "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="],
|
||||
|
||||
"module-details-from-path": ["module-details-from-path@1.0.4", "https://registry.npmmirror.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"mute-stream": ["mute-stream@3.0.0", "https://registry.npmmirror.com/mute-stream/-/mute-stream-3.0.0.tgz", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
|
||||
|
||||
"nanoid": ["nanoid@5.1.6", "https://registry.npmmirror.com/nanoid/-/nanoid-5.1.6.tgz", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="],
|
||||
|
||||
"needle": ["needle@2.4.0", "https://registry.npmmirror.com/needle/-/needle-2.4.0.tgz", { "dependencies": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" }, "bin": { "needle": "./bin/needle" } }, "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg=="],
|
||||
|
||||
"netmask": ["netmask@2.0.2", "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="],
|
||||
|
||||
"node-fetch-native": ["node-fetch-native@1.6.7", "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
|
||||
|
||||
"node-mock-http": ["node-mock-http@1.0.4", "https://registry.npmmirror.com/node-mock-http/-/node-mock-http-1.0.4.tgz", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="],
|
||||
|
||||
"normalize-path": ["normalize-path@3.0.0", "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
|
||||
|
||||
"ofetch": ["ofetch@1.5.1", "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="],
|
||||
|
||||
"on-finished": ["on-finished@2.4.1", "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
|
||||
|
||||
"pac-proxy-agent": ["pac-proxy-agent@7.2.0", "https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],
|
||||
|
||||
"pac-resolver": ["pac-resolver@7.0.1", "https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.1.tgz", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],
|
||||
|
||||
"pako": ["pako@0.2.9", "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="],
|
||||
|
||||
"path-browserify-esm": ["path-browserify-esm@1.0.6", "https://registry.npmmirror.com/path-browserify-esm/-/path-browserify-esm-1.0.6.tgz", {}, "sha512-9nUwYvvu/yq1PYrUyYCihNWmpzacaRYF6gGbjLWErrZ4MRDWyfPN7RpE8E7tsw8eqBU/rr7mcoTXbS+Vih8uUA=="],
|
||||
|
||||
"path-expression-matcher": ["path-expression-matcher@1.1.3", "https://registry.npmmirror.com/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", {}, "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ=="],
|
||||
|
||||
"path-key": ["path-key@3.1.1", "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
|
||||
|
||||
"path-parse": ["path-parse@1.0.7", "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
|
||||
|
||||
"path-to-regexp": ["path-to-regexp@8.3.0", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
|
||||
|
||||
"picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"pidusage": ["pidusage@3.0.2", "https://registry.npmmirror.com/pidusage/-/pidusage-3.0.2.tgz", { "dependencies": { "safe-buffer": "^5.2.1" } }, "sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w=="],
|
||||
|
||||
"pkijs": ["pkijs@3.3.3", "https://registry.npmmirror.com/pkijs/-/pkijs-3.3.3.tgz", { "dependencies": { "@noble/hashes": "1.4.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw=="],
|
||||
|
||||
"pm2": ["pm2@6.0.14", "https://registry.npmmirror.com/pm2/-/pm2-6.0.14.tgz", { "dependencies": { "@pm2/agent": "~2.1.1", "@pm2/blessed": "0.1.81", "@pm2/io": "~6.1.0", "@pm2/js-api": "~0.8.0", "@pm2/pm2-version-check": "^1.0.4", "ansis": "4.0.0-node10", "async": "3.2.6", "chokidar": "3.6.0", "cli-tableau": "2.0.1", "commander": "2.15.1", "croner": "4.1.97", "dayjs": "1.11.15", "debug": "4.4.3", "enquirer": "2.3.6", "eventemitter2": "5.0.1", "fclone": "1.0.11", "js-yaml": "4.1.1", "mkdirp": "1.0.4", "needle": "2.4.0", "pidusage": "3.0.2", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.1", "pm2-deploy": "~1.0.2", "pm2-multimeter": "^0.1.2", "promptly": "2.2.0", "semver": "7.7.2", "source-map-support": "0.5.21", "sprintf-js": "1.1.2", "vizion": "~2.2.1" }, "optionalDependencies": { "pm2-sysmonit": "^1.2.8" }, "bin": { "pm2": "bin/pm2", "pm2-dev": "bin/pm2-dev", "pm2-docker": "bin/pm2-docker", "pm2-runtime": "bin/pm2-runtime" } }, "sha512-wX1FiFkzuT2H/UUEA8QNXDAA9MMHDsK/3UHj6Dkd5U7kxyigKDA5gyDw78ycTQZAuGCLWyUX5FiXEuVQWafukA=="],
|
||||
|
||||
"pm2-axon": ["pm2-axon@4.0.1", "https://registry.npmmirror.com/pm2-axon/-/pm2-axon-4.0.1.tgz", { "dependencies": { "amp": "~0.3.1", "amp-message": "~0.1.1", "debug": "^4.3.1", "escape-string-regexp": "^4.0.0" } }, "sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg=="],
|
||||
|
||||
"pm2-axon-rpc": ["pm2-axon-rpc@0.7.1", "https://registry.npmmirror.com/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz", { "dependencies": { "debug": "^4.3.1" } }, "sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw=="],
|
||||
|
||||
"pm2-deploy": ["pm2-deploy@1.0.2", "https://registry.npmmirror.com/pm2-deploy/-/pm2-deploy-1.0.2.tgz", { "dependencies": { "run-series": "^1.1.8", "tv4": "^1.3.0" } }, "sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg=="],
|
||||
|
||||
"pm2-multimeter": ["pm2-multimeter@0.1.2", "https://registry.npmmirror.com/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz", { "dependencies": { "charm": "~0.1.1" } }, "sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA=="],
|
||||
|
||||
"pm2-sysmonit": ["pm2-sysmonit@1.2.8", "https://registry.npmmirror.com/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz", { "dependencies": { "async": "^3.2.0", "debug": "^4.3.1", "pidusage": "^2.0.21", "systeminformation": "^5.7", "tx2": "~1.0.4" } }, "sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA=="],
|
||||
|
||||
"promptly": ["promptly@2.2.0", "https://registry.npmmirror.com/promptly/-/promptly-2.2.0.tgz", { "dependencies": { "read": "^1.0.4" } }, "sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA=="],
|
||||
|
||||
"proxy-agent": ["proxy-agent@6.4.0", "https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.4.0.tgz", { "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.3", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.0.1", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.2" } }, "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ=="],
|
||||
|
||||
"proxy-from-env": ["proxy-from-env@1.1.0", "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
|
||||
|
||||
"pvtsutils": ["pvtsutils@1.3.6", "https://registry.npmmirror.com/pvtsutils/-/pvtsutils-1.3.6.tgz", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="],
|
||||
|
||||
"pvutils": ["pvutils@1.1.5", "https://registry.npmmirror.com/pvutils/-/pvutils-1.1.5.tgz", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="],
|
||||
|
||||
"radix3": ["radix3@1.1.2", "https://registry.npmmirror.com/radix3/-/radix3-1.1.2.tgz", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="],
|
||||
|
||||
"range-parser": ["range-parser@1.2.1", "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
|
||||
|
||||
"react": ["react@19.2.4", "https://registry.npmmirror.com/react/-/react-19.2.4.tgz", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
|
||||
|
||||
"react-dom": ["react-dom@19.2.4", "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.4.tgz", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
|
||||
|
||||
"read": ["read@1.0.7", "https://registry.npmmirror.com/read/-/read-1.0.7.tgz", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="],
|
||||
|
||||
"readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
|
||||
|
||||
"reflect-metadata": ["reflect-metadata@0.2.2", "https://registry.npmmirror.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="],
|
||||
|
||||
"require-from-string": ["require-from-string@2.0.2", "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
|
||||
|
||||
"require-in-the-middle": ["require-in-the-middle@5.2.0", "https://registry.npmmirror.com/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", { "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", "resolve": "^1.22.1" } }, "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg=="],
|
||||
|
||||
"resolve": ["resolve@1.22.11", "https://registry.npmmirror.com/resolve/-/resolve-1.22.11.tgz", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
|
||||
|
||||
"run-series": ["run-series@1.1.9", "https://registry.npmmirror.com/run-series/-/run-series-1.1.9.tgz", {}, "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g=="],
|
||||
|
||||
"safe-buffer": ["safe-buffer@5.2.1", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"safer-buffer": ["safer-buffer@2.1.2", "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
||||
|
||||
"sax": ["sax@1.5.0", "https://registry.npmmirror.com/sax/-/sax-1.5.0.tgz", {}, "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA=="],
|
||||
|
||||
"scheduler": ["scheduler@0.27.0", "https://registry.npmmirror.com/scheduler/-/scheduler-0.27.0.tgz", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
||||
|
||||
"selfsigned": ["selfsigned@5.5.0", "https://registry.npmmirror.com/selfsigned/-/selfsigned-5.5.0.tgz", { "dependencies": { "@peculiar/x509": "^1.14.2", "pkijs": "^3.3.3" } }, "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew=="],
|
||||
|
||||
"semver": ["semver@7.7.2", "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
|
||||
|
||||
"send": ["send@1.2.1", "https://registry.npmmirror.com/send/-/send-1.2.1.tgz", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
|
||||
|
||||
"setprototypeof": ["setprototypeof@1.2.0", "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
|
||||
|
||||
"shebang-command": ["shebang-command@2.0.0", "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
|
||||
|
||||
"shebang-regex": ["shebang-regex@3.0.0", "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
|
||||
|
||||
"shimmer": ["shimmer@1.2.1", "https://registry.npmmirror.com/shimmer/-/shimmer-1.2.1.tgz", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="],
|
||||
|
||||
"signal-exit": ["signal-exit@3.0.7", "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
|
||||
|
||||
"slice-ansi": ["slice-ansi@4.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="],
|
||||
|
||||
"smart-buffer": ["smart-buffer@4.2.0", "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
|
||||
|
||||
"socks": ["socks@2.8.7", "https://registry.npmmirror.com/socks/-/socks-2.8.7.tgz", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="],
|
||||
|
||||
"socks-proxy-agent": ["socks-proxy-agent@8.0.5", "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
|
||||
|
||||
"sonner": ["sonner@2.0.7", "https://registry.npmmirror.com/sonner/-/sonner-2.0.7.tgz", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="],
|
||||
|
||||
"source-map": ["source-map@0.6.1", "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
|
||||
|
||||
"source-map-support": ["source-map-support@0.5.21", "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
|
||||
|
||||
"spark-md5": ["spark-md5@3.0.2", "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="],
|
||||
|
||||
"sprintf-js": ["sprintf-js@1.1.2", "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.2.tgz", {}, "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug=="],
|
||||
|
||||
"statuses": ["statuses@2.0.2", "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
|
||||
|
||||
"steno": ["steno@4.0.2", "https://registry.npmmirror.com/steno/-/steno-4.0.2.tgz", {}, "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A=="],
|
||||
|
||||
"string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strnum": ["strnum@2.2.0", "https://registry.npmmirror.com/strnum/-/strnum-2.2.0.tgz", {}, "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg=="],
|
||||
|
||||
"supports-color": ["supports-color@10.2.2", "https://registry.npmmirror.com/supports-color/-/supports-color-10.2.2.tgz", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
|
||||
|
||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||
|
||||
"systeminformation": ["systeminformation@5.31.4", "https://registry.npmmirror.com/systeminformation/-/systeminformation-5.31.4.tgz", { "os": "!aix", "bin": { "systeminformation": "lib/cli.js" } }, "sha512-lZppDyQx91VdS5zJvAyGkmwe+Mq6xY978BDUG2wRkWE+jkmUF5ti8cvOovFQoN5bvSFKCXVkyKEaU5ec3SJiRg=="],
|
||||
|
||||
"table": ["table@6.9.0", "https://registry.npmmirror.com/table/-/table-6.9.0.tgz", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"toidentifier": ["toidentifier@1.0.1", "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
|
||||
|
||||
"tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
|
||||
"tsyringe": ["tsyringe@4.10.0", "https://registry.npmmirror.com/tsyringe/-/tsyringe-4.10.0.tgz", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw=="],
|
||||
|
||||
"tv4": ["tv4@1.3.0", "https://registry.npmmirror.com/tv4/-/tv4-1.3.0.tgz", {}, "sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw=="],
|
||||
|
||||
"tx2": ["tx2@1.0.5", "https://registry.npmmirror.com/tx2/-/tx2-1.0.5.tgz", { "dependencies": { "json-stringify-safe": "^5.0.1" } }, "sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg=="],
|
||||
|
||||
"ufo": ["ufo@1.6.3", "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
|
||||
|
||||
"uncrypto": ["uncrypto@0.1.3", "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="],
|
||||
|
||||
"undici-types": ["undici-types@7.18.2", "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
|
||||
|
||||
"unstorage": ["unstorage@1.17.4", "https://registry.npmmirror.com/unstorage/-/unstorage-1.17.4.tgz", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.5", "lru-cache": "^11.2.0", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw=="],
|
||||
|
||||
"vizion": ["vizion@2.2.1", "https://registry.npmmirror.com/vizion/-/vizion-2.2.1.tgz", { "dependencies": { "async": "^2.6.3", "git-node-fs": "^1.0.0", "ini": "^1.3.5", "js-git": "^0.7.8" } }, "sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww=="],
|
||||
|
||||
"which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
|
||||
|
||||
"ws": ["@kevisual/ws@8.19.0", "https://registry.npmmirror.com/@kevisual/ws/-/ws-8.19.0.tgz", {}, "sha512-jLsL80wBBKkrJZrfk3SQpJ9JA/zREdlUROj7eCkmzqduAWKSI0wVcXuCKf+mLFCHB0Q0Tkh2rgzjSlurt3JQgw=="],
|
||||
|
||||
"yallist": ["yallist@4.0.0", "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
|
||||
|
||||
"zod": ["zod@4.3.6", "https://registry.npmmirror.com/zod/-/zod-4.3.6.tgz", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
|
||||
|
||||
"zustand": ["zustand@5.0.11", "https://registry.npmmirror.com/zustand/-/zustand-5.0.11.tgz", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg=="],
|
||||
|
||||
"@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
|
||||
|
||||
"@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
|
||||
|
||||
"@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
|
||||
|
||||
"@inquirer/core/signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
||||
|
||||
"@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.2", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
|
||||
|
||||
"@kevisual/video-tools/@kevisual/ai": ["@kevisual/ai@0.0.19", "https://registry.npmmirror.com/@kevisual/ai/-/ai-0.0.19.tgz", { "dependencies": { "@kevisual/logger": "^0.0.4", "@kevisual/permission": "^0.0.3", "@kevisual/query": "^0.0.31" } }, "sha512-AFc8m6OcHZNxCb88bvzhvwWTZ4EVYyPupBzPUsLKLpdNBvsqm9TRboKCM2brJj2cqHnm+H+RbAk9AcGJkYhRCA=="],
|
||||
|
||||
"@kevisual/video-tools/@kevisual/router": ["@kevisual/router@0.0.51", "https://registry.npmmirror.com/@kevisual/router/-/router-0.0.51.tgz", { "dependencies": { "path-to-regexp": "^8.3.0", "selfsigned": "^5.4.0", "send": "^1.2.1" } }, "sha512-i9qYBeS/um78oC912oWJD3iElB+5NTKyTrz1Hzf4DckiUFnjLL81UPwjIh5I2l9+ul0IZ/Pxx+sFSF99fJkzKg=="],
|
||||
|
||||
"@opencode-ai/plugin/zod": ["zod@4.1.8", "https://registry.npmmirror.com/zod/-/zod-4.1.8.tgz", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="],
|
||||
|
||||
"@pm2/agent/chalk": ["chalk@3.0.0", "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],
|
||||
|
||||
"@pm2/agent/dayjs": ["dayjs@1.8.36", "https://registry.npmmirror.com/dayjs/-/dayjs-1.8.36.tgz", {}, "sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw=="],
|
||||
|
||||
"@pm2/agent/debug": ["debug@4.3.7", "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
|
||||
|
||||
"@pm2/agent/semver": ["semver@7.5.4", "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="],
|
||||
|
||||
"@pm2/agent/ws": ["ws@7.5.10", "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
|
||||
|
||||
"@pm2/io/async": ["async@2.6.4", "https://registry.npmmirror.com/async/-/async-2.6.4.tgz", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="],
|
||||
|
||||
"@pm2/io/debug": ["debug@4.3.7", "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
|
||||
|
||||
"@pm2/io/eventemitter2": ["eventemitter2@6.4.9", "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.9.tgz", {}, "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="],
|
||||
|
||||
"@pm2/io/semver": ["semver@7.5.4", "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="],
|
||||
|
||||
"@pm2/io/tslib": ["tslib@1.9.3", "https://registry.npmmirror.com/tslib/-/tslib-1.9.3.tgz", {}, "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="],
|
||||
|
||||
"@pm2/js-api/async": ["async@2.6.4", "https://registry.npmmirror.com/async/-/async-2.6.4.tgz", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="],
|
||||
|
||||
"@pm2/js-api/debug": ["debug@4.3.7", "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
|
||||
|
||||
"@pm2/js-api/eventemitter2": ["eventemitter2@6.4.9", "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.9.tgz", {}, "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg=="],
|
||||
|
||||
"@pm2/js-api/ws": ["ws@7.5.10", "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
|
||||
|
||||
"cli-tableau/chalk": ["chalk@3.0.0", "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="],
|
||||
|
||||
"needle/debug": ["debug@3.2.7", "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
|
||||
|
||||
"pkijs/@noble/hashes": ["@noble/hashes@1.4.0", "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.4.0.tgz", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="],
|
||||
|
||||
"pm2/commander": ["commander@2.15.1", "https://registry.npmmirror.com/commander/-/commander-2.15.1.tgz", {}, "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="],
|
||||
|
||||
"pm2/dayjs": ["dayjs@1.11.15", "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.15.tgz", {}, "sha512-MC+DfnSWiM9APs7fpiurHGCoeIx0Gdl6QZBy+5lu8MbYKN5FZEXqOgrundfibdfhGZ15o9hzmZ2xJjZnbvgKXQ=="],
|
||||
|
||||
"pm2-sysmonit/pidusage": ["pidusage@2.0.21", "https://registry.npmmirror.com/pidusage/-/pidusage-2.0.21.tgz", { "dependencies": { "safe-buffer": "^5.2.1" } }, "sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA=="],
|
||||
|
||||
"proxy-agent/lru-cache": ["lru-cache@7.18.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
|
||||
|
||||
"read/mute-stream": ["mute-stream@0.0.8", "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="],
|
||||
|
||||
"tsyringe/tslib": ["tslib@1.9.3", "https://registry.npmmirror.com/tslib/-/tslib-1.9.3.tgz", {}, "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="],
|
||||
|
||||
"unstorage/chokidar": ["chokidar@5.0.0", "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
|
||||
|
||||
"vizion/async": ["async@2.6.4", "https://registry.npmmirror.com/async/-/async-2.6.4.tgz", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="],
|
||||
|
||||
"@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
|
||||
|
||||
"@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
|
||||
|
||||
"@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
|
||||
|
||||
"@kevisual/video-tools/@kevisual/ai/@kevisual/permission": ["@kevisual/permission@0.0.3", "https://registry.npmmirror.com/@kevisual/permission/-/permission-0.0.3.tgz", {}, "sha512-8JsA/5O5Ax/z+M+MYpFYdlioHE6jNmWMuFSokBWYs9CCAHNiSKMR01YLkoVDoPvncfH/Y8F5K/IEXRCbptuMNA=="],
|
||||
|
||||
"@kevisual/video-tools/@kevisual/ai/@kevisual/query": ["@kevisual/query@0.0.31", "https://registry.npmmirror.com/@kevisual/query/-/query-0.0.31.tgz", {}, "sha512-bBdepjmMICLpcj/a9fnn82/0CGGYUZiCV+usWsJZKAwVlZcnj+WtKmbgKT09KpP6g3jjYzYOaXHiNFB8N0bQAQ=="],
|
||||
|
||||
"@pm2/agent/chalk/supports-color": ["supports-color@7.2.0", "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"@pm2/agent/semver/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"@pm2/io/semver/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
|
||||
|
||||
"cli-tableau/chalk/supports-color": ["supports-color@7.2.0", "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
|
||||
|
||||
"unstorage/chokidar/readdirp": ["readdirp@5.0.0", "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
|
||||
|
||||
"@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
|
||||
|
||||
"@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
|
||||
|
||||
"@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
],
|
||||
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
|
||||
"license": "MIT",
|
||||
"packageManager": "pnpm@10.30.1",
|
||||
"packageManager": "pnpm@10.32.1",
|
||||
"type": "module",
|
||||
"files": [
|
||||
"dist",
|
||||
@@ -21,7 +21,7 @@
|
||||
"scripts": {
|
||||
"dev": "bun run src/run.ts ",
|
||||
"dev:server": "bun --watch src/run-server.ts ",
|
||||
"dev:cnb": "ASSISTANT_CONFIG_DIR=/workspace bun --watch src/run-server.ts ",
|
||||
"dev:cnb": "ASSISTANT_CONFIG_DIR=/workspace/kevisual bun --watch src/run-server.ts ",
|
||||
"dev:share": "bun --watch src/test/remote-app.ts ",
|
||||
"build:lib": "bun run bun-lib.config.mjs",
|
||||
"postbuild:lib": "dts -i src/lib.ts -o assistant-lib.d.ts -d libs -t",
|
||||
@@ -42,28 +42,29 @@
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@inquirer/prompts": "^8.2.1",
|
||||
"@kevisual/ai": "^0.0.24",
|
||||
"@kevisual/api": "^0.0.58",
|
||||
"@inquirer/prompts": "^8.3.2",
|
||||
"@kevisual/ai": "^0.0.28",
|
||||
"@kevisual/api": "^0.0.64",
|
||||
"@kevisual/load": "^0.0.6",
|
||||
"@kevisual/local-app-manager": "^0.1.32",
|
||||
"@kevisual/logger": "^0.0.4",
|
||||
"@kevisual/query": "0.0.49",
|
||||
"@kevisual/router": "^0.0.83",
|
||||
"@kevisual/query": "0.0.53",
|
||||
"@kevisual/router": "^0.1.5",
|
||||
"@kevisual/types": "^0.0.12",
|
||||
"@kevisual/use-config": "^1.0.30",
|
||||
"@opencode-ai/plugin": "^1.2.10",
|
||||
"@types/bun": "^1.3.9",
|
||||
"@types/node": "^25.3.0",
|
||||
"@opencode-ai/plugin": "^1.2.27",
|
||||
"@types/bun": "^1.3.10",
|
||||
"@types/node": "^25.5.0",
|
||||
"@types/send": "^1.2.1",
|
||||
"@types/ws": "^8.18.1",
|
||||
"chalk": "^5.6.2",
|
||||
"commander": "^14.0.3",
|
||||
"cross-env": "^10.1.0",
|
||||
"dayjs": "^1.11.19",
|
||||
"dayjs": "^1.11.20",
|
||||
"dotenv": "^17.3.1",
|
||||
"get-port": "^7.1.0",
|
||||
"nanoid": "^5.1.6",
|
||||
"meilisearch": "^0.56.0",
|
||||
"nanoid": "^5.1.7",
|
||||
"send": "^1.2.1",
|
||||
"supports-color": "^10.2.2",
|
||||
"table": "^6.9.0",
|
||||
@@ -76,15 +77,15 @@
|
||||
"access": "public"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.995.0",
|
||||
"@kevisual/js-filter": "^0.0.5",
|
||||
"@kevisual/oss": "^0.0.19",
|
||||
"@aws-sdk/client-s3": "^3.1011.0",
|
||||
"@kevisual/js-filter": "^0.0.6",
|
||||
"@kevisual/oss": "^0.0.20",
|
||||
"@kevisual/video-tools": "^0.0.13",
|
||||
"@opencode-ai/sdk": "^1.2.10",
|
||||
"es-toolkit": "^1.44.0",
|
||||
"@opencode-ai/sdk": "^1.2.27",
|
||||
"es-toolkit": "^1.45.1",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"lowdb": "^7.0.1",
|
||||
"lru-cache": "^11.2.6",
|
||||
"lru-cache": "^11.2.7",
|
||||
"pm2": "^6.0.14",
|
||||
"unstorage": "^1.17.4",
|
||||
"zod": "^4.3.6"
|
||||
|
||||
@@ -5,5 +5,6 @@ import './routes/index.ts';
|
||||
import './routes-simple/index.ts';
|
||||
|
||||
export const AgentPlugin: Plugin = createRouterAgentPluginFn({
|
||||
router: app,
|
||||
})
|
||||
router: app as any,
|
||||
})
|
||||
export { app }
|
||||
@@ -9,7 +9,7 @@ const envKevisualDir = process.env.ASSISTANT_CONFIG_DIR
|
||||
if (envKevisualDir) {
|
||||
kevisualDir = envKevisualDir;
|
||||
logger.debug('使用环境变量 ASSISTANT_CONFIG_DIR 作为 kevisual 目录:', kevisualDir);
|
||||
}
|
||||
}
|
||||
|
||||
export const HomeConfigDir = path.join(kevisualDir, 'assistant-app');
|
||||
|
||||
|
||||
@@ -379,18 +379,34 @@ export class AssistantConfig {
|
||||
return checkConfigDir;
|
||||
}
|
||||
protected getDefaultInitAssistantConfig() {
|
||||
const id = randomId();
|
||||
let id = randomId();
|
||||
const isCNB = !!useKey('CNB');
|
||||
let kevisualUrl = 'https://kevisual.cn';
|
||||
if (isCNB) {
|
||||
const uri = getCNBUrl();
|
||||
if (uri) {
|
||||
kevisualUrl = uri;
|
||||
} else {
|
||||
kevisualUrl = 'http://kevisual.cn';
|
||||
}
|
||||
}
|
||||
const routes = ["@kevisual/cnb/routes"]
|
||||
if (isCNB) {
|
||||
routes.push("@kevisual/project-search/routes")
|
||||
id = 'cnb-dev'
|
||||
}
|
||||
return {
|
||||
app: {
|
||||
url: 'https://kevisual.cn',
|
||||
url: kevisualUrl,
|
||||
id,
|
||||
},
|
||||
description: '助手配置文件',
|
||||
docs: "https://kevisual.cn/root/cli/docs/",
|
||||
home: '/root/home',
|
||||
docs: `${kevisualUrl}/root/cli/docs/`,
|
||||
home: isCNB ? '/root/cli-center' : '/root/home',
|
||||
proxy: [],
|
||||
"routes": routes,
|
||||
share: {
|
||||
enabled: false,
|
||||
enabled: true,
|
||||
url: 'https://kevisual.cn/ws/proxy',
|
||||
},
|
||||
} as AssistantConfigData;
|
||||
@@ -412,4 +428,14 @@ export const parseIfJson = (content: string) => {
|
||||
|
||||
export * from './args.ts';
|
||||
|
||||
const randomId = () => Math.random().toString(36).substring(2, 8);
|
||||
const randomId = () => Math.random().toString(36).substring(2, 8);
|
||||
|
||||
export const getCNBUrl = () => {
|
||||
const isCNB = !!useKey('CNB');
|
||||
const uri = useKey('CNB_VSCODE_PROXY_URI') as string;
|
||||
if (!isCNB) return null
|
||||
if (uri) {
|
||||
return uri.replace('{{port}}', '51515');
|
||||
}
|
||||
return null
|
||||
}
|
||||
@@ -37,6 +37,22 @@ export class AssistantApp extends Manager {
|
||||
this.config = config;
|
||||
this.resolver = new ModuleResolver(config.configPath.configDir);
|
||||
}
|
||||
async init(opts?: { isServer?: boolean }) {
|
||||
const manager = this;
|
||||
await manager.load({ runtime: 'client' });
|
||||
console.log('Assistant App Loaded');
|
||||
await manager.checkLocalUser();
|
||||
const token = await assistantQuery.getToken();
|
||||
if (token) {
|
||||
console.log('用户已登录,正在初始化远程应用连接...');
|
||||
await manager.initRemoteApp({ token });
|
||||
await manager.initRouterProxyLightApp();
|
||||
}
|
||||
await manager.initRouterProxyApp();
|
||||
if (opts?.isServer) {
|
||||
await manager.initRoutes();
|
||||
}
|
||||
}
|
||||
async pageList() {
|
||||
const pages = await glob(['*/*/package.json'], {
|
||||
cwd: this.pagesPath,
|
||||
@@ -99,7 +115,11 @@ export class AssistantApp extends Manager {
|
||||
}
|
||||
let token = opts?.token;
|
||||
if (!token) {
|
||||
token = await assistantQuery.queryLogin.getToken();
|
||||
token = await assistantQuery.getToken();
|
||||
}
|
||||
if (!token) {
|
||||
logger.error('[remote-app] cli当前未登录,无法连接远程app');
|
||||
return;
|
||||
}
|
||||
let shareUrl = share?.url;
|
||||
if (!shareUrl) {
|
||||
@@ -109,16 +129,17 @@ export class AssistantApp extends Manager {
|
||||
}
|
||||
const url = new URL(shareUrl);
|
||||
const id = config?.app?.id;
|
||||
if (token && url && id) {
|
||||
if (url && id) {
|
||||
const remoteApp = new RemoteApp({
|
||||
url: url.toString(),
|
||||
token,
|
||||
username: config?.auth?.username || '',
|
||||
id,
|
||||
app: this.mainApp,
|
||||
// 使用 RemoteApp 内置的自动重连机制
|
||||
autoReconnect: true,
|
||||
reconnectDelay: 5000, // 首次重连延迟 5 秒
|
||||
maxReconnectAttempts: Infinity, // 无限重连
|
||||
maxReconnectAttempts: 50, // 最大重连次数
|
||||
enableBackoff: true, // 启用指数退避
|
||||
});
|
||||
remoteApp.isConnect();
|
||||
@@ -140,7 +161,7 @@ export class AssistantApp extends Manager {
|
||||
logger.info('[remote-app] 远程连接已关闭,自动重连机制正在处理...');
|
||||
});
|
||||
remoteApp.on('maxReconnectAttemptsReached', () => {
|
||||
logger.error('远程应用重连达到最大次数,停止重连');
|
||||
logger.error('[remote-app] 远程应用重连达到最大次数,停止重连');
|
||||
});
|
||||
this.remoteApp = remoteApp;
|
||||
} else {
|
||||
@@ -161,11 +182,10 @@ export class AssistantApp extends Manager {
|
||||
* - lightcode: 轻代码模块配置
|
||||
* @returns
|
||||
*/
|
||||
async initRouterApp() {
|
||||
async initRouterProxyApp() {
|
||||
const config = this.config.getConfig();
|
||||
const routerProxy = config?.router?.proxy || [];
|
||||
let routerProxy = config?.router?.proxy || [];
|
||||
const base = config.router?.base ?? false;
|
||||
const lightcode = config.router?.lightcode ?? true;
|
||||
if (base) {
|
||||
routerProxy.push({
|
||||
type: 'router',
|
||||
@@ -174,42 +194,13 @@ export class AssistantApp extends Manager {
|
||||
}
|
||||
})
|
||||
}
|
||||
if (lightcode) {
|
||||
routerProxy.push({
|
||||
type: 'lightcode',
|
||||
lightcode: {
|
||||
id: 'main',
|
||||
sync: 'remote',
|
||||
rootPath: path.join(this.config.configPath.appsDir, 'light-code', 'code'),
|
||||
}
|
||||
})
|
||||
}
|
||||
routerProxy = routerProxy.filter(item => item.type === 'router');
|
||||
if (routerProxy.length === 0) {
|
||||
return
|
||||
}
|
||||
for (const proxyInfo of routerProxy) {
|
||||
if (proxyInfo.type !== 'router' && proxyInfo.type !== 'lightcode') {
|
||||
console.warn('路由的type必须是"router", 或者lightcode');
|
||||
continue;
|
||||
}
|
||||
if (proxyInfo.type === 'lightcode') {
|
||||
const schema = z.object({
|
||||
rootPath: z.string().describe('light-code 代码存放路径'),
|
||||
sync: z.enum(['remote', 'local', 'both']).describe('同步方式,remote: 仅从远程拉取,local: 仅上传本地代码,both: 双向同步').default('remote'),
|
||||
});
|
||||
const parseRes = schema.safeParse(proxyInfo.lightcode);
|
||||
if (!parseRes.success) {
|
||||
console.warn('lightcode 配置错误', parseRes.error);
|
||||
continue;
|
||||
}
|
||||
const lightcodeConfig = parseRes.data;
|
||||
|
||||
initLightCode({
|
||||
router: this.mainApp,
|
||||
config: this.config,
|
||||
sync: lightcodeConfig.sync,
|
||||
rootPath: lightcodeConfig.rootPath,
|
||||
});
|
||||
if (proxyInfo.type !== 'router') {
|
||||
console.warn('路由的type必须是"router"');
|
||||
continue;
|
||||
}
|
||||
const url = proxyInfo.router!.url;
|
||||
@@ -220,7 +211,7 @@ export class AssistantApp extends Manager {
|
||||
const query = new Query({ url });
|
||||
try {
|
||||
initApi({
|
||||
router: this.mainApp,
|
||||
router: this.mainApp as any,
|
||||
item: {
|
||||
type: 'api',
|
||||
api: {
|
||||
@@ -236,6 +227,49 @@ export class AssistantApp extends Manager {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async initRouterProxyLightApp() {
|
||||
const config = this.config.getConfig();
|
||||
let routerProxy = config?.router?.proxy || [];
|
||||
const lightcode = config.router?.lightcode ?? true;
|
||||
if (lightcode) {
|
||||
routerProxy.push({
|
||||
type: 'lightcode',
|
||||
lightcode: {
|
||||
id: 'main',
|
||||
sync: 'remote',
|
||||
rootPath: path.join(this.config.configPath.appsDir, 'light-code', 'code'),
|
||||
}
|
||||
})
|
||||
}
|
||||
routerProxy = routerProxy.filter(item => item.type === 'lightcode');
|
||||
if (routerProxy.length === 0) {
|
||||
return
|
||||
}
|
||||
for (const proxyInfo of routerProxy) {
|
||||
if (proxyInfo.type !== 'lightcode') {
|
||||
console.warn('路由的type必须是"lightcode"');
|
||||
continue;
|
||||
}
|
||||
const schema = z.object({
|
||||
rootPath: z.string().describe('light-code 代码存放路径'),
|
||||
sync: z.enum(['remote', 'local', 'both']).describe('同步方式,remote: 仅从远程拉取,local: 仅上传本地代码,both: 双向同步').default('remote'),
|
||||
});
|
||||
const parseRes = schema.safeParse(proxyInfo.lightcode);
|
||||
if (!parseRes.success) {
|
||||
console.warn('lightcode 配置错误', parseRes.error);
|
||||
continue;
|
||||
}
|
||||
const lightcodeConfig = parseRes.data;
|
||||
|
||||
await initLightCode({
|
||||
router: this.mainApp,
|
||||
config: this.config,
|
||||
sync: lightcodeConfig.sync,
|
||||
rootPath: lightcodeConfig.rootPath,
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 动态加载文件插件模块的应用模块
|
||||
* @info 不需要登录
|
||||
@@ -246,6 +280,7 @@ export class AssistantApp extends Manager {
|
||||
try {
|
||||
const routeStr = typeof route === 'string' ? route : route.path;
|
||||
const resolvedPath = this.resolver.resolve(routeStr);
|
||||
// console.log('Resolved route path:', routeStr, '->', resolvedPath);
|
||||
await import(resolvedPath);
|
||||
console.log('[routes] 路由已初始化', route);
|
||||
} catch (err) {
|
||||
@@ -265,34 +300,57 @@ export class AssistantApp extends Manager {
|
||||
const checkLocalUser = async (opts: { assistantApp: AssistantApp }) => {
|
||||
const { assistantApp } = opts;
|
||||
const config = assistantApp.config.getConfig();
|
||||
const auth = config?.auth;
|
||||
let checkCNB = false;
|
||||
if (!auth?.username) {
|
||||
checkCNB = true;
|
||||
// 没有登录过,自动检测ci进行登录
|
||||
// 检测条件1:环境变量中存在 CNB_TOKEN
|
||||
} else {
|
||||
let temp = await assistantQuery.getToken()
|
||||
logger.info('[assistant] 当前登录用户', auth.username, 'token有效性检查结果', !!temp);
|
||||
const auth = config?.auth || {};
|
||||
const isLogin = await assistantQuery.queryLogin.getToken();
|
||||
logger.log('[assistant] 正在检查本地用户登录状态...', 'user', auth.username, '是否已登录', !!isLogin);
|
||||
|
||||
const saveAuth = (auth: typeof config.auth, opts: { appId?: string, username: string; share: 'protected' | 'private' }) => {
|
||||
auth.username = auth.username ?? opts.username;
|
||||
auth.share = auth.share ?? opts.share;
|
||||
const app = config?.app || {};
|
||||
if (!app?.id) {
|
||||
app.id = opts.appId || 'dev-cnb'
|
||||
}
|
||||
assistantApp.config.setConfig({
|
||||
auth,
|
||||
app
|
||||
});
|
||||
}
|
||||
const cnbToken = useKey('CNB_TOKEN');
|
||||
if (!checkCNB && cnbToken) {
|
||||
if (!auth?.username && isLogin) {
|
||||
// 没有登录过,自动检测ci进行登录
|
||||
// 检测条件1:环境变量中存在 CNB_API_KEY
|
||||
// 检测条件2:本地没有登录过
|
||||
const userInfo = await assistantQuery.queryLogin.checkLocalUser()
|
||||
saveAuth(auth, { username: userInfo.username, share: 'protected' })
|
||||
return;
|
||||
}
|
||||
if (isLogin) return;
|
||||
// 没有登录,尝试根据环境变量进行登录
|
||||
|
||||
// 尝试使用 CNB_API_KEY 登录, 并设置管理员用户
|
||||
const cnbToken = useKey('CNB_API_KEY');
|
||||
if (cnbToken) {
|
||||
logger.info('[cnb]检测到 CNB_API_KEY,正在尝试使用 CNB_API_KEY 登录...');
|
||||
const res = await assistantQuery.queryLogin.loginByCnb({ cnbToken })
|
||||
if (res.code === 200) {
|
||||
logger.info('CNB登录成功,用户信息已更新');
|
||||
const userInfo = await assistantQuery.queryLogin.checkLocalUser()
|
||||
auth.username = userInfo.username;
|
||||
auth.share = 'protected'
|
||||
const app = config?.app || {};
|
||||
if (!app?.id) {
|
||||
app.id = 'dev-cnb'
|
||||
if (!userInfo.username) {
|
||||
saveAuth(auth, { username: userInfo.username, share: 'protected' })
|
||||
}
|
||||
assistantApp.config.setConfig({
|
||||
auth,
|
||||
app
|
||||
});
|
||||
return
|
||||
} else {
|
||||
console.error('CNB登录失败,无法获取用户信息', res);
|
||||
logger.error('CNB登录失败,无法获取用户信息', res);
|
||||
}
|
||||
}
|
||||
const accessToken = useKey('KEVISUAL_TOKEN');
|
||||
if (accessToken) {
|
||||
logger.info('[cnb]检测到 KEVISUAL_TOKEN,正在尝试使用 KEVISUAL_TOKEN 登录...');
|
||||
const res = await assistantQuery.queryLogin.refreshLoginUser({ accessToken, refreshToken: '' })
|
||||
if (res.code === 200) {
|
||||
if (!auth.username) {
|
||||
const userInfo = await assistantQuery.queryLogin.checkLocalUser()
|
||||
saveAuth(auth, { username: userInfo.username, share: 'protected' })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,10 +37,6 @@ export class AssistantQuery {
|
||||
}
|
||||
async getToken() {
|
||||
const token = await this.queryLogin.getToken();
|
||||
if (!token) return '';
|
||||
const isExpired = await this.queryLogin.checkTokenValid()
|
||||
console.log('Token 是否过期', isExpired, token);
|
||||
console.log('info', this.queryLogin.cacheStore.cacheData)
|
||||
return token;
|
||||
}
|
||||
}
|
||||
|
||||
6
assistant/src/module/client-auth/cache-auth.ts
Normal file
6
assistant/src/module/client-auth/cache-auth.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { LRUCache } from 'lru-cache'
|
||||
|
||||
export const authCache = new LRUCache<string, any>({
|
||||
max: 10000, // 最大缓存数量
|
||||
ttl: 1000 * 60 * 60 * 24 * 7, // 缓存过期时间,单位为毫秒,这里设置为7天
|
||||
});
|
||||
58
assistant/src/module/client-auth/index.ts
Normal file
58
assistant/src/module/client-auth/index.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { Query } from "@kevisual/query";
|
||||
import { authCache } from './cache-auth.ts';
|
||||
|
||||
const getTokenUser = async (token: string) => {
|
||||
const query = new Query();
|
||||
const res = await query.post({
|
||||
path: 'user',
|
||||
key: 'me',
|
||||
token: token,
|
||||
});
|
||||
return res;
|
||||
}
|
||||
export const getTokenUserCache = async (token: string) => {
|
||||
const tokenUser = await authCache.get(token);
|
||||
if (tokenUser) {
|
||||
return {
|
||||
code: 200,
|
||||
data: tokenUser,
|
||||
};
|
||||
}
|
||||
const res = await getTokenUser(token);
|
||||
if (res.code === 200) {
|
||||
authCache.set(token, res.data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
export const checkAuth = async (ctx: any, isAdmin = false) => {
|
||||
const token = ctx.query.token;
|
||||
if (!token) {
|
||||
return {
|
||||
code: 401,
|
||||
message: '未登录',
|
||||
}
|
||||
}
|
||||
// 鉴权代理
|
||||
let tokenUser = await authCache.get(token);
|
||||
if (!tokenUser) {
|
||||
const tokenUserRes = await getTokenUser(token);
|
||||
if (tokenUserRes.code !== 200) {
|
||||
return {
|
||||
code: tokenUserRes.code,
|
||||
message: '验证失败' + tokenUserRes.message,
|
||||
}
|
||||
} else {
|
||||
tokenUser = tokenUserRes.data;
|
||||
}
|
||||
authCache.set(token, tokenUser);
|
||||
}
|
||||
ctx.state = {
|
||||
...ctx.state,
|
||||
token,
|
||||
tokenUser,
|
||||
};
|
||||
return {
|
||||
code: 200,
|
||||
data: { tokenUser, token }
|
||||
}
|
||||
};
|
||||
14
assistant/src/module/client-auth/package.json
Normal file
14
assistant/src/module/client-auth/package.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "client-auth",
|
||||
"version": "0.0.1",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
|
||||
"license": "MIT",
|
||||
"packageManager": "pnpm@10.31.0",
|
||||
"type": "module"
|
||||
}
|
||||
@@ -5,10 +5,10 @@ import fs from 'node:fs';
|
||||
import glob from 'fast-glob';
|
||||
import { runCode } from './run.ts';
|
||||
const codeDemoId = '0e700dc8-90dd-41b7-91dd-336ea51de3d2'
|
||||
import { filter } from "@kevisual/js-filter";
|
||||
import { getHash, getStringHash } from '../file-hash.ts';
|
||||
import { AssistantConfig } from '@/lib.ts';
|
||||
import { assistantQuery } from '@/app.ts';
|
||||
import { logger } from '../logger.ts';
|
||||
|
||||
const codeDemo = `// 这是一个示例代码文件
|
||||
import {App} from '@kevisual/router';
|
||||
@@ -45,15 +45,19 @@ type LightCodeFile = {
|
||||
id?: string, code?: string, hash?: string, filepath: string
|
||||
}
|
||||
export const initLightCode = async (opts: Opts) => {
|
||||
const token = await assistantQuery.getToken();
|
||||
if (!token) {
|
||||
logger.error('[light-code] 当前未登录,无法初始化 light-code');
|
||||
return;
|
||||
}
|
||||
// 注册 light-code 路由
|
||||
console.log('初始化 light-code 路由');
|
||||
const config = opts.config as AssistantInit;
|
||||
const app = opts.router;
|
||||
const token = await assistantQuery.getToken();
|
||||
logger.log('[light-code] 初始化 light-code 路由');
|
||||
const query = config.query;
|
||||
const sync = opts.sync ?? 'remote';
|
||||
if (!config || !app) {
|
||||
console.error('[light-code] initLightCode 缺少必要参数, config 或 app');
|
||||
logger.error('[light-code] initLightCode 缺少必要参数, config 或 app');
|
||||
return;
|
||||
}
|
||||
const lightcodeDir = opts.rootPath;
|
||||
@@ -158,8 +162,8 @@ export const initLightCode = async (opts: Opts) => {
|
||||
metadata.source = 'light-code';
|
||||
metadata['light-code'] = {
|
||||
id: file.id
|
||||
}
|
||||
app.route({
|
||||
};
|
||||
(app as App).route({
|
||||
id: routerItem.id,
|
||||
path: `${routerItem.id}__${routerItem.path}`,
|
||||
key: routerItem.key,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kevisual/remote-app",
|
||||
"version": "0.0.4",
|
||||
"version": "0.0.7",
|
||||
"description": "",
|
||||
"main": "dist/app.js",
|
||||
"scripts": {
|
||||
@@ -19,10 +19,10 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"eventemitter3": "^5.0",
|
||||
"@kevisual/router": "^0.0.70"
|
||||
"@kevisual/router": "^0.0.90"
|
||||
},
|
||||
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
|
||||
"license": "MIT",
|
||||
"packageManager": "pnpm@10.28.2",
|
||||
"packageManager": "pnpm@10.31.0",
|
||||
"type": "module"
|
||||
}
|
||||
@@ -4,6 +4,7 @@ type RemoteAppOptions = {
|
||||
app?: App;
|
||||
url?: string;
|
||||
token?: string;
|
||||
username?: string;
|
||||
emitter?: EventEmitter;
|
||||
id?: string;
|
||||
/** 是否启用自动重连,默认 true */
|
||||
@@ -24,8 +25,10 @@ export class RemoteApp {
|
||||
mainApp: App;
|
||||
url: string;
|
||||
id: string;
|
||||
username: string;
|
||||
emitter: EventEmitter;
|
||||
isConnected: boolean;
|
||||
isVerified: boolean;
|
||||
ws: WebSocket;
|
||||
remoteIsConnected: boolean;
|
||||
isError: boolean = false;
|
||||
@@ -38,17 +41,24 @@ export class RemoteApp {
|
||||
reconnectAttempts: number = 0;
|
||||
reconnectTimer: NodeJS.Timeout | null = null;
|
||||
isManuallyClosed: boolean = false;
|
||||
isInitializing: boolean = false;
|
||||
private initId: number = 0;
|
||||
constructor(opts?: RemoteAppOptions) {
|
||||
this.mainApp = opts?.app;
|
||||
const token = opts.token;
|
||||
const url = opts.url;
|
||||
const url = opts.url || 'https://kevisual.cn/ws/proxy';
|
||||
const id = opts.id;
|
||||
const username = opts.username;
|
||||
this.username = username;
|
||||
this.emitter = opts?.emitter || new EventEmitter();
|
||||
const _url = new URL(url);
|
||||
if (token) {
|
||||
_url.searchParams.set('token', token);
|
||||
}
|
||||
_url.searchParams.set('id', id);
|
||||
if (!token && !username) {
|
||||
console.error(`[remote-app] 不存在用户名和token ${id}. 权限认证会失败。`);
|
||||
}
|
||||
this.url = _url.toString();
|
||||
this.id = id;
|
||||
// 初始化重连相关配置
|
||||
@@ -78,11 +88,25 @@ export class RemoteApp {
|
||||
clearTimeout(timeout);
|
||||
that.isConnected = true;
|
||||
that.remoteIsConnected = true;
|
||||
|
||||
resolve(true);
|
||||
};
|
||||
that.emitter.once('open', listenOnce);
|
||||
});
|
||||
}
|
||||
async waitVerify(): Promise<boolean> {
|
||||
if (this.isVerified) {
|
||||
return true;
|
||||
}
|
||||
// 等待验证成功
|
||||
return new Promise((resolve) => {
|
||||
const listenOnce = () => {
|
||||
this.isVerified = true;
|
||||
resolve(true);
|
||||
};
|
||||
this.emitter.once('verified', listenOnce);
|
||||
});
|
||||
}
|
||||
getWsURL(url: string) {
|
||||
const { protocol } = new URL(url);
|
||||
if (protocol.startsWith('ws')) {
|
||||
@@ -93,10 +117,18 @@ export class RemoteApp {
|
||||
return wsURL;
|
||||
}
|
||||
async init() {
|
||||
// 防止重复初始化
|
||||
if (this.isInitializing) {
|
||||
return;
|
||||
}
|
||||
this.isInitializing = true;
|
||||
const currentInitId = ++this.initId;
|
||||
if (!this.url) {
|
||||
this.isInitializing = false;
|
||||
throw new Error('No url provided for remote app');
|
||||
}
|
||||
if (!this.id) {
|
||||
this.isInitializing = false;
|
||||
throw new Error('No id provided for remote app');
|
||||
}
|
||||
this.isError = false;
|
||||
@@ -107,11 +139,22 @@ export class RemoteApp {
|
||||
const ws = new WebSocket(this.getWsURL(this.url));
|
||||
const that = this;
|
||||
ws.onopen = function () {
|
||||
// 检查是否是最新的连接
|
||||
if (currentInitId !== that.initId) {
|
||||
ws.close();
|
||||
return;
|
||||
}
|
||||
that.isConnected = true;
|
||||
that.isInitializing = false;
|
||||
that.onOpen();
|
||||
console.log('[remote-app] WebSocket connection opened');
|
||||
};
|
||||
ws.onclose = function () {
|
||||
// 检查是否是最新的连接
|
||||
if (currentInitId !== that.initId) {
|
||||
return;
|
||||
}
|
||||
that.isInitializing = false;
|
||||
that.isConnected = false;
|
||||
that.onClose();
|
||||
}
|
||||
@@ -119,6 +162,11 @@ export class RemoteApp {
|
||||
that.onMessage(event.data);
|
||||
}
|
||||
ws.onerror = function (error) {
|
||||
// 检查是否是最新的连接
|
||||
if (currentInitId !== that.initId) {
|
||||
return;
|
||||
}
|
||||
that.isInitializing = false;
|
||||
that.onError(error);
|
||||
}
|
||||
this.ws = ws;
|
||||
@@ -207,7 +255,7 @@ export class RemoteApp {
|
||||
this.emitter.emit('message', data);
|
||||
}
|
||||
onError(error: any) {
|
||||
console.error('远程应用错误:', this.id, error);
|
||||
console.error(`[remote-app] 远程应用错误: ${this.id}`, error);
|
||||
this.isError = true;
|
||||
this.emitter.emit('error', error);
|
||||
}
|
||||
@@ -223,6 +271,7 @@ export class RemoteApp {
|
||||
listenProxy() {
|
||||
const remoteApp = this;
|
||||
const app = this.mainApp;
|
||||
const username = this.username;
|
||||
const listenFn = async (event: any) => {
|
||||
try {
|
||||
const data = event.toString();
|
||||
@@ -231,11 +280,16 @@ export class RemoteApp {
|
||||
const message = bodyData?.message || {};
|
||||
const context = bodyData?.context || {};
|
||||
if (body?.code === 401) {
|
||||
console.error('远程应用认证失败,请检查 token 是否正确');
|
||||
console.error('[remote-app] 远程应用认证失败,请检查 token 是否正确');
|
||||
this.isError = true;
|
||||
return;
|
||||
}
|
||||
if (body?.type === 'verified') {
|
||||
remoteApp.emitter.emit('verified');
|
||||
return;
|
||||
}
|
||||
if (body?.type !== 'proxy') return;
|
||||
|
||||
if (!body.id) {
|
||||
remoteApp.json({
|
||||
id: body.id,
|
||||
@@ -257,13 +311,15 @@ export class RemoteApp {
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('处理远程代理请求出错:', error);
|
||||
console.error('[remote-app] 处理远程代理请求出错:', error);
|
||||
}
|
||||
};
|
||||
remoteApp.json({
|
||||
id: this.id,
|
||||
type: 'registryClient'
|
||||
type: 'registryClient',
|
||||
username: username,
|
||||
});
|
||||
console.log(`[remote-app] 远程应用 ${this.id} (${username}) 已注册到主应用,等待消息...`);
|
||||
remoteApp.emitter.on('message', listenFn);
|
||||
const closeMessage = () => {
|
||||
remoteApp.emitter.off('message', listenFn);
|
||||
|
||||
3
assistant/src/router.ts
Normal file
3
assistant/src/router.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import { parse } from '@kevisual/router/commander';
|
||||
import { app, program } from './server.ts';
|
||||
parse({ app: app as any, program: program as any })
|
||||
119
assistant/src/routes/auth.ts
Normal file
119
assistant/src/routes/auth.ts
Normal file
@@ -0,0 +1,119 @@
|
||||
import { app, assistantConfig } from '../app.ts';
|
||||
import { authCache } from '@/module/cache/auth.ts';
|
||||
|
||||
import { logger } from '@/module/logger.ts';
|
||||
const getTokenUser = async (token: string) => {
|
||||
const query = assistantConfig.query
|
||||
const res = await query.post({
|
||||
path: 'user',
|
||||
key: 'me',
|
||||
token: token,
|
||||
});
|
||||
return res;
|
||||
}
|
||||
export const getTokenUserCache = async (token: string) => {
|
||||
const tokenUser = await authCache.get(token);
|
||||
if (tokenUser) {
|
||||
return {
|
||||
code: 200,
|
||||
data: tokenUser,
|
||||
};
|
||||
}
|
||||
const res = await getTokenUser(token);
|
||||
if (res.code === 200) {
|
||||
authCache.set(token, res.data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
export const checkAuth = async (ctx: any, isAdmin = false) => {
|
||||
const config = assistantConfig.getConfig();
|
||||
const { auth = {} } = config;
|
||||
const token = ctx.query.token;
|
||||
logger.debug('checkAuth', ctx.query, { token });
|
||||
if (!token) {
|
||||
return {
|
||||
code: 401,
|
||||
message: '未登录',
|
||||
}
|
||||
}
|
||||
// 鉴权代理
|
||||
let tokenUser = await authCache.get(token);
|
||||
if (!tokenUser) {
|
||||
const tokenUserRes = await getTokenUser(token);
|
||||
if (tokenUserRes.code !== 200) {
|
||||
return {
|
||||
code: tokenUserRes.code,
|
||||
message: '验证失败' + tokenUserRes.message,
|
||||
}
|
||||
} else {
|
||||
tokenUser = tokenUserRes.data;
|
||||
}
|
||||
authCache.set(token, tokenUser);
|
||||
}
|
||||
ctx.state = {
|
||||
...ctx.state,
|
||||
token,
|
||||
tokenUser,
|
||||
};
|
||||
const { username } = tokenUser;
|
||||
if (!auth.username) {
|
||||
// 初始管理员账号
|
||||
auth.username = username;
|
||||
assistantConfig.setConfig({ auth });
|
||||
}
|
||||
if (isAdmin && auth.username) {
|
||||
const admins = config.auth?.admin || [];
|
||||
let isCheckAdmin = false;
|
||||
const admin = auth.username;
|
||||
if (admin === username) {
|
||||
isCheckAdmin = true;
|
||||
}
|
||||
if (!isCheckAdmin && admins.length > 0 && admins.includes(username)) {
|
||||
isCheckAdmin = true;
|
||||
}
|
||||
if (!isCheckAdmin) {
|
||||
return {
|
||||
code: 403,
|
||||
message: '非管理员用户',
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
code: 200,
|
||||
data: { tokenUser, token }
|
||||
}
|
||||
};
|
||||
app
|
||||
.route({
|
||||
path: 'auth',
|
||||
id: 'auth',
|
||||
description: '获取当前登录用户信息, 第一个登录的用户为管理员用户',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
if (!ctx.query?.token && ctx.appId === app.appId) {
|
||||
return;
|
||||
}
|
||||
const authResult = await checkAuth(ctx);
|
||||
if (authResult.code !== 200) {
|
||||
ctx.throw(authResult.code, authResult.message);
|
||||
}
|
||||
})
|
||||
.addTo(app);
|
||||
app
|
||||
.route({
|
||||
path: 'auth-admin',
|
||||
id: 'auth-admin',
|
||||
description: '管理员鉴权, 获取用户信息,并验证是否为管理员。',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
// logger.debug('query', ctx.query);
|
||||
if (!ctx.query?.token && ctx.appId === app.appId) {
|
||||
return;
|
||||
}
|
||||
ctx.state.isAdmin = true;
|
||||
const authResult = await checkAuth(ctx, true);
|
||||
if (authResult.code !== 200) {
|
||||
ctx.throw(authResult.code, authResult.message);
|
||||
}
|
||||
})
|
||||
.addTo(app);
|
||||
@@ -6,7 +6,7 @@ app.route({
|
||||
path: 'call',
|
||||
key: '',
|
||||
description: '调用',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
@@ -21,11 +21,11 @@ app.route({
|
||||
})
|
||||
},
|
||||
}).define(async (ctx) => {
|
||||
const { path, key = '' } = ctx.query;
|
||||
const { path, key = '' } = ctx.args;
|
||||
if (!path) {
|
||||
ctx.throw('路径path不能为空');
|
||||
}
|
||||
const res = await ctx.run({ path, key, payload: ctx.query.payload || {} }, {
|
||||
const res = await ctx.run({ path, key, payload: ctx.args.payload || {} }, {
|
||||
...ctx
|
||||
});
|
||||
ctx.forward(res);
|
||||
|
||||
@@ -33,7 +33,8 @@ app.route({
|
||||
title: '查看客户端 IP 地址',
|
||||
summary: '获取当前客户端的 IP 地址信息',
|
||||
})
|
||||
}
|
||||
},
|
||||
middleware: ['auth-admin']
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
const networkInterfaces = os.networkInterfaces();
|
||||
|
||||
@@ -76,10 +76,6 @@ app.route({
|
||||
message: '客户端重启命令已执行',
|
||||
};
|
||||
} catch (error) {
|
||||
ctx.status = 500;
|
||||
ctx.body = {
|
||||
message: '重启客户端失败',
|
||||
error: error.message,
|
||||
};
|
||||
ctx.throw(500, '重启客户端失败');
|
||||
}
|
||||
}).addTo(app);
|
||||
|
||||
424
assistant/src/routes/cnb-board/cnb-dev-env.ts
Normal file
424
assistant/src/routes/cnb-board/cnb-dev-env.ts
Normal file
@@ -0,0 +1,424 @@
|
||||
import { app } from '../../app.ts';
|
||||
import { useKey } from '@kevisual/context'
|
||||
import { getLiveMdContent } from './live/live-content.ts';
|
||||
import z from 'zod';
|
||||
const notCNBCheck = (ctx: any) => {
|
||||
const isCNB = useKey('CNB');
|
||||
if (!isCNB) {
|
||||
ctx.body = {
|
||||
title: '非 cnb-board 环境',
|
||||
list: []
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live',
|
||||
description: '获取cnb-board live的mdContent内容',
|
||||
middleware: ['auth-admin'],
|
||||
metadata: {
|
||||
args: {
|
||||
more: z.boolean().optional().describe('是否获取更多系统信息,默认false'),
|
||||
}
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const more = ctx.query?.more ?? false
|
||||
if (notCNBCheck(ctx)) return;
|
||||
const list = getLiveMdContent({ more: more });
|
||||
ctx.body = {
|
||||
title: '开发环境模式配置',
|
||||
list,
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live_repo_info',
|
||||
description: '获取cnb-board live的repo信息',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
const repoSlug = useKey('CNB_REPO_SLUG') || '';
|
||||
const repoName = useKey('CNB_REPO_NAME') || '';
|
||||
const repoId = useKey('CNB_REPO_ID') || '';
|
||||
const repoUrlHttps = useKey('CNB_REPO_UR if (notCNBCheck(ctx)) return;L_HTTPS') || '';
|
||||
if (notCNBCheck(ctx)) return;
|
||||
// 从 repoSlug 提取仓库名称
|
||||
const repoNameFromSlug = repoSlug.split('/').pop() || '';
|
||||
|
||||
const labels = [
|
||||
{
|
||||
title: 'CNB_REPO_SLUG',
|
||||
value: repoSlug,
|
||||
description: '目标仓库路径,格式为 group_slug / repo_name,group_slug / sub_gourp_slug /.../repo_name'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REPO_SLUG_LOWERCASE',
|
||||
value: repoSlug.toLowerCase(),
|
||||
description: '目标仓库路径小写格式'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REPO_NAME',
|
||||
value: repoName || repoNameFromSlug,
|
||||
description: '目标仓库名称'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REPO_NAME_LOWERCASE',
|
||||
value: (repoName || repoNameFromSlug).toLowerCase(),
|
||||
description: '目标仓库名称小写格式'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REPO_ID',
|
||||
value: repoId,
|
||||
description: '目标仓库的 id'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REPO_URL_HTTPS',
|
||||
value: repoUrlHttps,
|
||||
description: '目标仓库 https 地址'
|
||||
}
|
||||
]
|
||||
ctx.body = {
|
||||
title: 'CNB_BOARD_LIVE_REPO_INFO',
|
||||
list: labels
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
// 构建类变量
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live_build_info',
|
||||
description: '获取cnb-board live的构建信息',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
if (notCNBCheck(ctx)) return;
|
||||
const labels = [
|
||||
{
|
||||
title: 'CNB_BUILD_ID',
|
||||
value: useKey('CNB_BUILD_ID') || '',
|
||||
description: '当前构建的流水号,全局唯一'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_WEB_URL',
|
||||
value: useKey('CNB_BUILD_WEB_URL') || '',
|
||||
description: '当前构建的日志地址'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_START_TIME',
|
||||
value: useKey('CNB_BUILD_START_TIME') || '',
|
||||
description: '当前构建的开始时间,UTC 格式,示例 2025-08-21T09:13:45.803Z'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER',
|
||||
value: useKey('CNB_BUILD_USER') || '',
|
||||
description: '当前构建的触发者用户名'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER_NICKNAME',
|
||||
value: useKey('CNB_BUILD_USER_NICKNAME') || '',
|
||||
description: '当前构建的触发者昵称'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER_EMAIL',
|
||||
value: useKey('CNB_BUILD_USER_EMAIL') || '',
|
||||
description: '当前构建的触发者邮箱'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER_ID',
|
||||
value: useKey('CNB_BUILD_USER_ID') || '',
|
||||
description: '当前构建的触发者 id'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER_NPC_SLUG',
|
||||
value: useKey('CNB_BUILD_USER_NPC_SLUG') || '',
|
||||
description: '当前构建若为 NPC 触发,则为 NPC 所属仓库的路径'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_USER_NPC_NAME',
|
||||
value: useKey('CNB_BUILD_USER_NPC_NAME') || '',
|
||||
description: '当前构建若为 NPC 触发,则为 NPC 角色名'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_STAGE_NAME',
|
||||
value: useKey('CNB_BUILD_STAGE_NAME') || '',
|
||||
description: '当前构建的 stage 名称'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_JOB_NAME',
|
||||
value: useKey('CNB_BUILD_JOB_NAME') || '',
|
||||
description: '当前构建的 job 名称'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_JOB_KEY',
|
||||
value: useKey('CNB_BUILD_JOB_KEY') || '',
|
||||
description: '当前构建的 job key,同 stage 下唯一'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_WORKSPACE',
|
||||
value: useKey('CNB_BUILD_WORKSPACE') || '',
|
||||
description: '自定义 shell 脚本执行的工作空间根目录'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_FAILED_MSG',
|
||||
value: useKey('CNB_BUILD_FAILED_MSG') || '',
|
||||
description: '流水线构建失败的错误信息,可在 failStages 中使用'
|
||||
},
|
||||
{
|
||||
title: 'CNB_BUILD_FAILED_STAGE_NAME',
|
||||
value: useKey('CNB_BUILD_FAILED_STAGE_NAME') || '',
|
||||
description: '流水线构建失败的 stage 的名称,可在 failStages 中使用'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_NAME',
|
||||
value: useKey('CNB_PIPELINE_NAME') || '',
|
||||
description: '当前 pipeline 的 name,没声明时为空'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_KEY',
|
||||
value: useKey('CNB_PIPELINE_KEY') || '',
|
||||
description: '当前 pipeline 的索引 key,例如 pipeline-0'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_ID',
|
||||
value: useKey('CNB_PIPELINE_ID') || '',
|
||||
description: '当前 pipeline 的 id,全局唯一字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_DOCKER_IMAGE',
|
||||
value: useKey('CNB_PIPELINE_DOCKER_IMAGE') || '',
|
||||
description: '当前 pipeline 所使用的 docker image,如:alpine:latest'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_STATUS',
|
||||
value: useKey('CNB_PIPELINE_STATUS') || '',
|
||||
description: '当前流水线的构建状态,可在 endStages 中查看,其可能的值包括:success、error、cancel'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PIPELINE_MAX_RUN_TIME',
|
||||
value: useKey('CNB_PIPELINE_MAX_RUN_TIME') || '',
|
||||
description: '流水线最大运行时间,单位为毫秒'
|
||||
},
|
||||
{
|
||||
title: 'CNB_RUNNER_IP',
|
||||
value: useKey('CNB_RUNNER_IP') || '',
|
||||
description: '当前 pipeline 所在 Runner 的 ip'
|
||||
},
|
||||
{
|
||||
title: 'CNB_CPUS',
|
||||
value: useKey('CNB_CPUS') || '',
|
||||
description: '当前构建流水线可以使用的最大 CPU 核数'
|
||||
},
|
||||
{
|
||||
title: 'CNB_MEMORY',
|
||||
value: useKey('CNB_MEMORY') || '',
|
||||
description: '当前构建流水线可以使用的最大内存大小,单位为 GiB'
|
||||
},
|
||||
{
|
||||
title: 'CNB_IS_RETRY',
|
||||
value: useKey('CNB_IS_RETRY') || '',
|
||||
description: '当前构建是否由 rebuild 触发'
|
||||
},
|
||||
{
|
||||
title: 'HUSKY_SKIP_INSTALL',
|
||||
value: useKey('HUSKY_SKIP_INSTALL') || '',
|
||||
description: '兼容 ci 环境下 husky'
|
||||
}
|
||||
]
|
||||
ctx.body = {
|
||||
title: 'CNB_BOARD_LIVE_BUILD_INFO',
|
||||
list: labels
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
// PR/合并类变量
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live_pull_info',
|
||||
description: '获取cnb-board live的PR信息',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
const labels = [
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST',
|
||||
value: useKey('CNB_PULL_REQUEST') || '',
|
||||
description: '对于由 pull_request、pull_request.update、pull_request.target 触发的构建,值为 true,否则为 false'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_LIKE',
|
||||
value: useKey('CNB_PULL_REQUEST_LIKE') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为 true,否则为 false'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_PROPOSER',
|
||||
value: useKey('CNB_PULL_REQUEST_PROPOSER') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为提出 PR 者名称,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_TITLE',
|
||||
value: useKey('CNB_PULL_REQUEST_TITLE') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为提 PR 时候填写的标题,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_BRANCH',
|
||||
value: useKey('CNB_PULL_REQUEST_BRANCH') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为发起 PR 的源分支名称,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_SHA',
|
||||
value: useKey('CNB_PULL_REQUEST_SHA') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为当前 PR 源分支最新的提交 sha,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_TARGET_SHA',
|
||||
value: useKey('CNB_PULL_REQUEST_TARGET_SHA') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为当前 PR 目标分支最新的提交 sha,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_MERGE_SHA',
|
||||
value: useKey('CNB_PULL_REQUEST_MERGE_SHA') || '',
|
||||
description: '对于由 pull_request.merged 触发的构建,值为合并后的 sha;对于 pull_request 等触发的构建,值为预合并后的 sha,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_SLUG',
|
||||
value: useKey('CNB_PULL_REQUEST_SLUG') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为源仓库的仓库 slug,如 group_slug/repo_name,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_ACTION',
|
||||
value: useKey('CNB_PULL_REQUEST_ACTION') || '',
|
||||
description: '对于由 合并类事件 触发的构建,可能的值有:created(新建PR)、code_update(源分支push)、status_update(评审通过或CI状态变更),否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_ID',
|
||||
value: useKey('CNB_PULL_REQUEST_ID') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为当前或者关联 PR 的全局唯一 id,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_IID',
|
||||
value: useKey('CNB_PULL_REQUEST_IID') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为当前或者关联 PR 在仓库中的编号 iid,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_REVIEWERS',
|
||||
value: useKey('CNB_PULL_REQUEST_REVIEWERS') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为评审人列表,多个以 , 分隔,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_REVIEW_STATE',
|
||||
value: useKey('CNB_PULL_REQUEST_REVIEW_STATE') || '',
|
||||
description: '对于由 合并类事件 触发的构建,有评审者且有人通过评审为 approve,有评审者但无人通过评审为 unapprove,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REVIEW_REVIEWED_BY',
|
||||
value: useKey('CNB_REVIEW_REVIEWED_BY') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为同意评审的评审人列表,多个以 , 分隔,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REVIEW_LAST_REVIEWED_BY',
|
||||
value: useKey('CNB_REVIEW_LAST_REVIEWED_BY') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为最后一个同意评审的评审人,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_PULL_REQUEST_IS_WIP',
|
||||
value: useKey('CNB_PULL_REQUEST_IS_WIP') || '',
|
||||
description: '对于由 合并类事件 触发的构建,值为 true、false,表示 PR 是否被设置为 [WIP],否则为空字符串'
|
||||
}
|
||||
]
|
||||
ctx.body = {
|
||||
title: 'CNB_BOARD_LIVE_PULL_INFO',
|
||||
list: labels
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
// NPC 类变量
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live_npc_info',
|
||||
description: '获取cnb-board live的NPC信息',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
if (notCNBCheck(ctx)) return;
|
||||
const labels = [
|
||||
{
|
||||
title: 'CNB_NPC_SLUG',
|
||||
value: useKey('CNB_NPC_SLUG') || '',
|
||||
description: '对于 @ 知识库角色触发的 NPC 事件,值为 NPC 所属仓库路径,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_NPC_NAME',
|
||||
value: useKey('CNB_NPC_NAME') || '',
|
||||
description: '对于 NPC 事件触发的构建,值为 NPC 角色名,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_NPC_SHA',
|
||||
value: useKey('CNB_NPC_SHA') || '',
|
||||
description: '对于 @ 知识库角色触发的 NPC 事件,值为 NPC 所属仓库默认分支最新提交的 sha,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_NPC_PROMPT',
|
||||
value: useKey('CNB_NPC_PROMPT') || '',
|
||||
description: '对于 @ 知识库角色触发的 NPC 事件,值为 NPC 角色 Prompt,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_NPC_AVATAR',
|
||||
value: useKey('CNB_NPC_AVATAR') || '',
|
||||
description: '对于 @ 知识库角色触发的 NPC 事件,值为 NPC 角色头像,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_NPC_ENABLE_THINKING',
|
||||
value: useKey('CNB_NPC_ENABLE_THINKING') || '',
|
||||
description: '对于 @npc 事件触发的构建,值为 NPC 角色是否开启思考,否则为空字符串'
|
||||
}
|
||||
]
|
||||
ctx.body = {
|
||||
title: 'CNB_BOARD_LIVE_NPC_INFO',
|
||||
list: labels
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
// 评论类变量
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'live_comment_info',
|
||||
description: '获取cnb-board live的评论信息',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
if (notCNBCheck(ctx)) return;
|
||||
const labels = [
|
||||
{
|
||||
title: 'CNB_COMMENT_ID',
|
||||
value: useKey('CNB_COMMENT_ID') || '',
|
||||
description: '对于评论事件触发的构建,值为评论全局唯一 ID,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_COMMENT_BODY',
|
||||
value: useKey('CNB_COMMENT_BODY') || '',
|
||||
description: '对于评论事件触发的构建,值为评论内容,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_COMMENT_TYPE',
|
||||
value: useKey('CNB_COMMENT_TYPE') || '',
|
||||
description: '对于 PR 代码评审评论,值为 diff_note;对于 PR 非代码评审评论以及 Issue 评论,值为 note;否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_COMMENT_FILE_PATH',
|
||||
value: useKey('CNB_COMMENT_FILE_PATH') || '',
|
||||
description: '对于 PR 代码评审评论,值为评论所在文件,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_COMMENT_RANGE',
|
||||
value: useKey('CNB_COMMENT_RANGE') || '',
|
||||
description: '对于 PR 代码评审评论,值为评论所在代码行。如,单行为 L12,多行为 L13-L16,否则为空字符串'
|
||||
},
|
||||
{
|
||||
title: 'CNB_REVIEW_ID',
|
||||
value: useKey('CNB_REVIEW_ID') || '',
|
||||
description: '对于 PR 代码评审,值为评审 ID,否则为空字符串'
|
||||
}
|
||||
]
|
||||
ctx.body = {
|
||||
title: 'CNB_BOARD_LIVE_COMMENT_INFO',
|
||||
list: labels
|
||||
};
|
||||
}).addTo(app);
|
||||
0
assistant/src/routes/cnb-board/common.ts
Normal file
0
assistant/src/routes/cnb-board/common.ts
Normal file
29
assistant/src/routes/cnb-board/index.ts
Normal file
29
assistant/src/routes/cnb-board/index.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { app } from '../../app.ts';
|
||||
import './cnb-dev-env.ts';
|
||||
import { execCommand } from '@/module/npm-install.ts';
|
||||
import { useKey } from '@kevisual/context';
|
||||
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'is-cnb-board',
|
||||
description: '检查是否是 cnb-board 环境',
|
||||
middleware: ['auth-admin']
|
||||
}).define(async (ctx) => {
|
||||
const isCNB = useKey('CNB');
|
||||
ctx.body = {
|
||||
isCNB: !!isCNB,
|
||||
};
|
||||
}).addTo(app, { overwrite: false });
|
||||
|
||||
|
||||
|
||||
|
||||
app.route({
|
||||
path: 'cnb_board',
|
||||
key: 'exit',
|
||||
description: 'cnb的工作环境退出程序',
|
||||
middleware: ['auth-admin'],
|
||||
}).define(async (ctx) => {
|
||||
const cmd = 'kill 1';
|
||||
execCommand(cmd);
|
||||
}).addTo(app, { overwrite: false });
|
||||
341
assistant/src/routes/cnb-board/live/live-content.ts
Normal file
341
assistant/src/routes/cnb-board/live/live-content.ts
Normal file
@@ -0,0 +1,341 @@
|
||||
|
||||
import { useKey } from "@kevisual/context"
|
||||
import os from 'node:os';
|
||||
import { execSync } from 'node:child_process';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
export const getLiveMdContent = (opts?: { more?: boolean }) => {
|
||||
const more = opts?.more ?? false
|
||||
const url = useKey('CNB_VSCODE_PROXY_URI') || ''
|
||||
const token = useKey('CNB_TOKEN') || ''
|
||||
const openclawPort = useKey('OPENCLAW_PORT') || '80'
|
||||
const openclawUrl = url.replace('{{port}}', openclawPort)
|
||||
const openclawUrlSecret = openclawUrl + '/openclaw#token=' + token
|
||||
|
||||
const opencodePort = useKey('OPENCODE_PORT') || '100'
|
||||
const opencodeUrl = url.replace('{{port}}', opencodePort)
|
||||
// btoa('root:password'); //
|
||||
const _opencodeURL = new URL(opencodeUrl)
|
||||
_opencodeURL.username = 'root'
|
||||
_opencodeURL.password = token
|
||||
const opencodeUrlSecret = _opencodeURL.toString()
|
||||
|
||||
// console.log('btoa opencode auth: ', Buffer.from(`root:${token}`).toString('base64'))
|
||||
const kevisualUrl = url.replace('{{port}}', '51515')
|
||||
|
||||
const openWebUrl = url.replace('{{port}}', '200')
|
||||
|
||||
const vscodeWebUrl = useKey('CNB_VSCODE_WEB_URL') || ''
|
||||
|
||||
const TEMPLATE = `# 开发环境模式配置
|
||||
|
||||
### 服务访问地址
|
||||
#### nginx 反向代理访问(推荐)
|
||||
- OpenClaw: ${openclawUrl + '/openclaw'}
|
||||
- OpenCode: ${opencodeUrl}
|
||||
- VSCode Web: ${vscodeWebUrl}
|
||||
- OpenWebUI: ${openWebUrl}
|
||||
- Kevisual: ${kevisualUrl}
|
||||
|
||||
### 密码访问
|
||||
- OpenClaw: ${openclawUrlSecret}
|
||||
- OpenCode: ${opencodeUrlSecret}
|
||||
|
||||
### 环境变量
|
||||
- CNB_TOKEN: ${token}
|
||||
|
||||
### 其他说明
|
||||
|
||||
1. 保活说明
|
||||
使用插件访问vscode web获取wss进行保活,避免长时间不操作导致的自动断开连接。
|
||||
|
||||
方法1: 使用插件访问vscode web获取wss进行保活,避免长时间不操作导致的自动断开连接。
|
||||
|
||||
1. 安装插件[CNB LIVE](https://chromewebstore.google.com/detail/cnb-live/iajpiophkcdghonpijkcgpjafbcjhkko?pli=1)
|
||||
2. 打开vscode web获取,点击插件,获取json数据,替换keep.json中的数据,保持在线状态。
|
||||
3. keep.json中的数据结构说明:
|
||||
- wss: vscode web的websocket地址
|
||||
- cookie: vscode web的cookie,保持和浏览器一致
|
||||
- url: vscode web的访问地址,可以直接访问vscode web
|
||||
4. 运行cli命令,ev cnb live -c /workspace/live/keep.json.(直接对话opencode或者openclaw调用cnb-live技能即可)
|
||||
|
||||
方法2:环境变量设置CNB_COOKIE,直接opencode或者openclaw的ui界面对话说,cnb-keep-live保活,他会自动调用保活,同时不需要点cnb-lie插件获取配置。
|
||||
|
||||
2. Opencode web访问说明
|
||||
Opencode打开web地址,需要在浏览器输入用户名和密码,用户名固定为root,密码为CNB_TOKEN的值. 纯连接打开包含账号密码,第一次点击后,需要把账号密码清理掉才能访问,opencode的bug导致的。
|
||||
`
|
||||
const labels = [
|
||||
{
|
||||
key: 'vscodeWebUrl',
|
||||
title: 'VSCode Web 地址',
|
||||
value: vscodeWebUrl,
|
||||
description: 'VSCode Web 的访问地址'
|
||||
},
|
||||
{
|
||||
key: 'kevisualUrl',
|
||||
title: 'Kevisual 地址',
|
||||
value: kevisualUrl,
|
||||
description: 'Kevisual 的访问地址,可以通过该地址访问 Kevisual 服务'
|
||||
},
|
||||
{
|
||||
key: 'cnbTempToken',
|
||||
title: 'CNB Token',
|
||||
value: token,
|
||||
description: 'CNB 临时 Token,保持和环境变量 CNB_TOKEN 一致'
|
||||
},
|
||||
{
|
||||
key: 'openWebUrl',
|
||||
title: 'OpenWebUI 地址',
|
||||
value: openWebUrl,
|
||||
description: 'OpenWebUI 的访问地址,可以通过该地址访问 OpenWebUI 服务'
|
||||
},
|
||||
{
|
||||
key: 'openclawUrl',
|
||||
title: 'OpenClaw 地址',
|
||||
value: openclawUrl + '/openclaw',
|
||||
description: 'OpenClaw 的访问地址,可以通过该地址访问 OpenClaw 服务'
|
||||
},
|
||||
{
|
||||
key: 'openclawUrlSecret',
|
||||
title: 'OpenClaw 访问地址(含 Token)',
|
||||
value: openclawUrlSecret,
|
||||
description: 'OpenClaw 的访问地址,包含 token 参数,可以直接访问 OpenClaw 服务'
|
||||
},
|
||||
{
|
||||
key: 'opencodeUrl',
|
||||
title: 'OpenCode 地址',
|
||||
value: opencodeUrl,
|
||||
description: 'OpenCode 的访问地址,可以通过该地址访问 OpenCode 服务'
|
||||
},
|
||||
{
|
||||
key: 'opencodeUrlSecret',
|
||||
title: 'OpenCode 访问地址(含 Token)',
|
||||
value: opencodeUrlSecret,
|
||||
description: 'OpenCode 的访问地址,包含 token 参数,可以直接访问 OpenCode 服务'
|
||||
},
|
||||
{
|
||||
key: 'docs',
|
||||
title: '配置说明文档',
|
||||
value: TEMPLATE,
|
||||
description: '开发环境模式配置说明文档'
|
||||
}
|
||||
]
|
||||
|
||||
const osInfoList = createOSInfo(more)
|
||||
labels.push(...osInfoList)
|
||||
return labels
|
||||
}
|
||||
|
||||
const createOSInfo = (more = false) => {
|
||||
const labels: Array<{ key: string; title: string; value: string | number; description: string }> = []
|
||||
const startTimer = useKey('CNB_BUILD_START_TIME') || ''
|
||||
|
||||
// CPU 使用率
|
||||
const cpus = os.cpus()
|
||||
let totalIdle = 0
|
||||
let totalTick = 0
|
||||
cpus.forEach((cpu) => {
|
||||
for (const type in cpu.times) {
|
||||
totalTick += cpu.times[type as keyof typeof cpu.times]
|
||||
}
|
||||
totalIdle += cpu.times.idle
|
||||
})
|
||||
const cpuUsage = ((1 - totalIdle / totalTick) * 100).toFixed(2)
|
||||
|
||||
// 内存使用情况 (使用 free 命令)
|
||||
let memUsed = 0
|
||||
let memTotal = 0
|
||||
let memFree = 0
|
||||
try {
|
||||
const freeOutput = execSync('free -b', { encoding: 'utf-8' })
|
||||
const lines = freeOutput.trim().split('\n')
|
||||
const memLine = lines.find(line => line.startsWith('Mem:'))
|
||||
if (memLine) {
|
||||
const parts = memLine.split(/\s+/)
|
||||
memTotal = parseInt(parts[1])
|
||||
memUsed = parseInt(parts[2])
|
||||
memFree = parseInt(parts[3])
|
||||
}
|
||||
} catch (e) {
|
||||
// 如果 free 命令失败,使用 os 模块
|
||||
memTotal = os.totalmem()
|
||||
memFree = os.freemem()
|
||||
memUsed = memTotal - memFree
|
||||
}
|
||||
const memUsage = memTotal > 0 ? ((memUsed / memTotal) * 100).toFixed(2) : '0.00'
|
||||
|
||||
// 格式化字节为人类可读格式
|
||||
const formatBytes = (bytes: number) => {
|
||||
const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
|
||||
if (bytes === 0) return '0 B'
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(1024))
|
||||
return (bytes / Math.pow(1024, i)).toFixed(2) + ' ' + sizes[i]
|
||||
}
|
||||
|
||||
// 运行时间格式化
|
||||
const formatUptime = (seconds: number) => {
|
||||
const days = Math.floor(seconds / 86400)
|
||||
const hours = Math.floor((seconds % 86400) / 3600)
|
||||
const minutes = Math.floor((seconds % 3600) / 60)
|
||||
const secs = Math.floor(seconds % 60)
|
||||
let uptimeStr = ''
|
||||
if (days > 0) uptimeStr += `${days}天 `
|
||||
if (hours > 0) uptimeStr += `${hours}小时 `
|
||||
if (minutes > 0) uptimeStr += `${minutes}分钟 `
|
||||
return `${uptimeStr}${secs}秒`
|
||||
}
|
||||
|
||||
// 磁盘使用情况 (使用 du 命令,获取当前目录)
|
||||
let diskUsage = ''
|
||||
try {
|
||||
const duOutput = execSync('du -sh .', { encoding: 'utf-8' })
|
||||
diskUsage = duOutput.trim().split('\t')[0]
|
||||
} catch (e) {
|
||||
diskUsage = '获取失败'
|
||||
}
|
||||
|
||||
labels.push(
|
||||
{
|
||||
key: 'cpuUsage',
|
||||
title: 'CPU 使用率',
|
||||
value: `${cpuUsage}%`,
|
||||
description: 'CPU 使用率'
|
||||
},
|
||||
{
|
||||
key: 'cpuCores',
|
||||
title: 'CPU 核心数',
|
||||
value: cpus.length,
|
||||
description: 'CPU 核心数'
|
||||
},
|
||||
{
|
||||
key: 'memoryUsed',
|
||||
title: '已使用内存',
|
||||
value: formatBytes(memUsed),
|
||||
description: '已使用内存'
|
||||
},
|
||||
{
|
||||
key: 'memoryTotal',
|
||||
title: '总内存',
|
||||
value: formatBytes(memTotal),
|
||||
description: '总内存'
|
||||
},
|
||||
{
|
||||
key: 'memoryFree',
|
||||
title: '空闲内存',
|
||||
value: formatBytes(memFree),
|
||||
description: '空闲内存'
|
||||
},
|
||||
{
|
||||
key: 'memoryUsage',
|
||||
title: '内存使用率',
|
||||
value: `${memUsage}%`,
|
||||
description: '内存使用率'
|
||||
},
|
||||
{
|
||||
key: 'diskUsage',
|
||||
title: '磁盘使用',
|
||||
value: diskUsage,
|
||||
description: '当前目录磁盘使用情况'
|
||||
},
|
||||
)
|
||||
|
||||
// 如果有 CNB_BUILD_START_TIME,添加构建启动时间
|
||||
if (startTimer) {
|
||||
// startTimer 是日期字符串格式
|
||||
const buildStartTime = dayjs(startTimer as string).format('YYYY-MM-DD HH:mm:ss')
|
||||
const buildStartTimestamp = dayjs(startTimer as string).valueOf()
|
||||
const buildUptime = Date.now() - buildStartTimestamp
|
||||
const buildUptimeStr = formatUptime(Math.floor(buildUptime / 1000))
|
||||
const maxRunTime = useKey('CNB_PIPELINE_MAX_RUN_TIME') || 0 // 毫秒
|
||||
|
||||
labels.push(
|
||||
{
|
||||
key: 'buildStartTime',
|
||||
title: '构建启动时间',
|
||||
value: buildStartTime,
|
||||
description: '构建启动时间'
|
||||
},
|
||||
{
|
||||
key: 'buildUptime',
|
||||
title: '构建已运行时间',
|
||||
value: buildUptime,
|
||||
description: `构建已运行时间: ${buildUptimeStr}`
|
||||
}
|
||||
)
|
||||
if (maxRunTime > 0) {
|
||||
// 计算到达4点的倒计时
|
||||
const now = dayjs()
|
||||
const today4am = now.hour(4).minute(0).second(0).millisecond(0)
|
||||
let timeTo4 = today4am.valueOf() - now.valueOf()
|
||||
if (timeTo4 < 0) {
|
||||
// 如果已经过了4点,计算到明天4点
|
||||
timeTo4 = today4am.add(1, 'day').valueOf() - now.valueOf()
|
||||
}
|
||||
const timeTo4Str = `[距离晚上4点重启时间: ${formatUptime(Math.floor(timeTo4 / 1000))}]`
|
||||
|
||||
labels.push({
|
||||
key: 'buildMaxRunTime',
|
||||
title: '最大运行时间',
|
||||
value: formatUptime(Math.floor(maxRunTime / 1000)),
|
||||
description: '构建最大运行时间(限制时间)'
|
||||
})
|
||||
labels.unshift({
|
||||
key: 'remainingTime',
|
||||
title: '剩余时间',
|
||||
value: maxRunTime - buildUptime,
|
||||
description: '构建剩余时间' + formatUptime(Math.floor((maxRunTime - buildUptime) / 1000)) + ' ' + timeTo4Str
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// more 为 true 时添加更多系统信息
|
||||
if (more) {
|
||||
const loadavg = os.loadavg()
|
||||
labels.push(
|
||||
{
|
||||
key: 'hostname',
|
||||
title: '主机名',
|
||||
value: os.hostname(),
|
||||
description: '主机名'
|
||||
},
|
||||
{
|
||||
key: 'platform',
|
||||
title: '运行平台',
|
||||
value: os.platform(),
|
||||
description: '运行平台'
|
||||
},
|
||||
{
|
||||
key: 'arch',
|
||||
title: '系统架构',
|
||||
value: os.arch(),
|
||||
description: '系统架构'
|
||||
},
|
||||
{
|
||||
key: 'osType',
|
||||
title: '操作系统类型',
|
||||
value: os.type(),
|
||||
description: '操作系统类型'
|
||||
},
|
||||
{
|
||||
key: 'loadavg1m',
|
||||
title: '系统负载 (1分钟)',
|
||||
value: loadavg[0].toFixed(2),
|
||||
description: '系统负载 (1分钟)'
|
||||
},
|
||||
{
|
||||
key: 'loadavg5m',
|
||||
title: '系统负载 (5分钟)',
|
||||
value: loadavg[1].toFixed(2),
|
||||
description: '系统负载 (5分钟)'
|
||||
},
|
||||
{
|
||||
key: 'loadavg15m',
|
||||
title: '系统负载 (15分钟)',
|
||||
value: loadavg[2].toFixed(2),
|
||||
description: '系统负载 (15分钟)'
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
return labels
|
||||
}
|
||||
1
assistant/src/routes/cnb-board/modules/index.ts
Normal file
1
assistant/src/routes/cnb-board/modules/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export * from './is-cnb.ts';
|
||||
6
assistant/src/routes/cnb-board/modules/is-cnb.ts
Normal file
6
assistant/src/routes/cnb-board/modules/is-cnb.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { useKey } from "@kevisual/context";
|
||||
|
||||
export const isCnb = () => {
|
||||
const CNB = useKey('CNB');
|
||||
return !!CNB;
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
import { app, assistantConfig } from '@/app.ts';
|
||||
import { reload } from '../../module/reload-server.ts';
|
||||
import { useKey } from '@kevisual/context';
|
||||
import { getCNBUrl } from '@/lib.ts';
|
||||
|
||||
app
|
||||
.route({
|
||||
@@ -28,9 +30,16 @@ app
|
||||
|
||||
app.route({
|
||||
path: 'config',
|
||||
key: 'getId'
|
||||
key: 'getId',
|
||||
description: '获取appId和访问地址',
|
||||
|
||||
}).define(async (ctx) => {
|
||||
const config = assistantConfig.getCacheAssistantConfig();
|
||||
ctx.body = config?.app?.id || null;
|
||||
|
||||
}).addTo(app);
|
||||
const appId = config?.app?.id || null;
|
||||
let kevisualUrl = getCNBUrl() || 'https://kevisual.cn';
|
||||
ctx.body = {
|
||||
id: appId,
|
||||
url: kevisualUrl,
|
||||
}
|
||||
|
||||
}).addTo(app);
|
||||
|
||||
@@ -1,135 +1,18 @@
|
||||
import { app, assistantConfig } from '../app.ts';
|
||||
|
||||
import './config/index.ts';
|
||||
import './client/index.ts';
|
||||
import './shop-install/index.ts';
|
||||
import './ai/index.ts';
|
||||
// import './ai/index.ts';
|
||||
import './user/index.ts';
|
||||
import './call/index.ts'
|
||||
|
||||
import './opencode/index.ts';
|
||||
import './remote/index.ts';
|
||||
// import './kevisual/index.ts'
|
||||
import './cnb-board/index.ts';
|
||||
|
||||
import { authCache } from '@/module/cache/auth.ts';
|
||||
import './auth.ts';
|
||||
|
||||
import { getTokenUserCache, checkAuth } from './auth.ts';
|
||||
export { getTokenUserCache, checkAuth }
|
||||
|
||||
import { logger } from '@/module/logger.ts';
|
||||
const getTokenUser = async (token: string) => {
|
||||
const query = assistantConfig.query
|
||||
const res = await query.post({
|
||||
path: 'user',
|
||||
key: 'me',
|
||||
token: token,
|
||||
});
|
||||
return res;
|
||||
}
|
||||
export const getTokenUserCache = async (token: string) => {
|
||||
const tokenUser = await authCache.get(token);
|
||||
if (tokenUser) {
|
||||
return {
|
||||
code: 200,
|
||||
data: tokenUser,
|
||||
};
|
||||
}
|
||||
const res = await getTokenUser(token);
|
||||
if (res.code === 200) {
|
||||
authCache.set(token, res.data);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
export const checkAuth = async (ctx: any, isAdmin = false) => {
|
||||
const config = assistantConfig.getConfig();
|
||||
const { auth = {} } = config;
|
||||
const token = ctx.query.token;
|
||||
logger.debug('checkAuth', ctx.query, { token });
|
||||
if (!token) {
|
||||
return {
|
||||
code: 401,
|
||||
message: '未登录',
|
||||
}
|
||||
}
|
||||
// 鉴权代理
|
||||
let tokenUser = await authCache.get(token);
|
||||
if (!tokenUser) {
|
||||
const tokenUserRes = await getTokenUser(token);
|
||||
if (tokenUserRes.code !== 200) {
|
||||
return {
|
||||
code: tokenUserRes.code,
|
||||
message: '验证失败' + tokenUserRes.message,
|
||||
}
|
||||
} else {
|
||||
tokenUser = tokenUserRes.data;
|
||||
}
|
||||
authCache.set(token, tokenUser);
|
||||
}
|
||||
ctx.state = {
|
||||
...ctx.state,
|
||||
token,
|
||||
tokenUser,
|
||||
};
|
||||
const { username } = tokenUser;
|
||||
if (!auth.username) {
|
||||
// 初始管理员账号
|
||||
auth.username = username;
|
||||
assistantConfig.setConfig({ auth, token: token });
|
||||
}
|
||||
if (isAdmin && auth.username) {
|
||||
const admins = config.auth?.admin || [];
|
||||
let isCheckAdmin = false;
|
||||
const admin = auth.username;
|
||||
if (admin === username) {
|
||||
isCheckAdmin = true;
|
||||
const _token = config.token;
|
||||
if (!_token) {
|
||||
assistantConfig.setConfig({ token: token });
|
||||
} else if (_token && _token.startsWith('st-') && _token !== token) {
|
||||
assistantConfig.setConfig({ token: token });
|
||||
}
|
||||
}
|
||||
if (!isCheckAdmin && admins.length > 0 && admins.includes(username)) {
|
||||
isCheckAdmin = true;
|
||||
}
|
||||
if (!isCheckAdmin) {
|
||||
return {
|
||||
code: 403,
|
||||
message: '非管理员用户',
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
code: 200,
|
||||
data: { tokenUser, token }
|
||||
}
|
||||
};
|
||||
app
|
||||
.route({
|
||||
path: 'auth',
|
||||
id: 'auth',
|
||||
description: '获取当前登录用户信息, 第一个登录的用户为管理员用户',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
if (!ctx.query?.token && ctx.appId === app.appId) {
|
||||
return;
|
||||
}
|
||||
const authResult = await checkAuth(ctx);
|
||||
if (authResult.code !== 200) {
|
||||
ctx.throw(authResult.code, authResult.message);
|
||||
}
|
||||
})
|
||||
.addTo(app);
|
||||
app
|
||||
.route({
|
||||
path: 'auth-admin',
|
||||
id: 'auth-admin',
|
||||
description: '管理员鉴权, 获取用户信息,并验证是否为管理员。',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
// logger.debug('query', ctx.query);
|
||||
if (!ctx.query?.token && ctx.appId === app.appId) {
|
||||
return;
|
||||
}
|
||||
const authResult = await checkAuth(ctx, true);
|
||||
if (authResult.code !== 200) {
|
||||
ctx.throw(authResult.code, authResult.message);
|
||||
}
|
||||
})
|
||||
.addTo(app);
|
||||
|
||||
124
assistant/src/routes/opencode/cnb.ts
Normal file
124
assistant/src/routes/opencode/cnb.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
import { app } from '@/app.ts'
|
||||
import { z } from 'zod';
|
||||
import { getClient } from './module/client.ts';
|
||||
import dayjs from 'dayjs';
|
||||
import { Session } from '@opencode-ai/sdk';
|
||||
|
||||
app.route({
|
||||
path: 'opencode-cnb',
|
||||
key: 'models',
|
||||
middleware: ['auth-admin'],
|
||||
description: '获取 OpenCode 可用模型列表,返回 providerID 和 modelID',
|
||||
metadata: {
|
||||
args: {
|
||||
baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'),
|
||||
}
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { baseUrl } = ctx.query;
|
||||
const client = await getClient({ baseUrl });
|
||||
if (!client) {
|
||||
ctx.body = { content: '获取 OpenCode 客户端失败' };
|
||||
return;
|
||||
}
|
||||
const res = await client.provider.list();
|
||||
const providerData = (res as any)?.data ?? res;
|
||||
const all: any[] = providerData?.all ?? [];
|
||||
const connected: string[] = providerData?.connected ?? [];
|
||||
const defaultModels: Record<string, string> = providerData?.default ?? {};
|
||||
|
||||
const models: Array<{ providerID: string; providerName: string; modelID: string; modelName: string; isDefault: boolean; isConnected: boolean }> = [];
|
||||
for (const provider of all) {
|
||||
const isConnected = connected.includes(provider.id);
|
||||
for (const [modelKey, model] of Object.entries<any>(provider.models ?? {})) {
|
||||
models.push({
|
||||
providerID: provider.id,
|
||||
providerName: provider.name,
|
||||
modelID: modelKey,
|
||||
modelName: model.name ?? modelKey,
|
||||
isDefault: defaultModels[provider.id] === modelKey,
|
||||
isConnected,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ctx.body = {
|
||||
content: `共 ${models.length} 个模型,已连接提供商: ${connected.join(', ') || '无'}`,
|
||||
data: { models, connected, default: defaultModels },
|
||||
};
|
||||
}).addTo(app);
|
||||
|
||||
app.route({
|
||||
path: 'opencode-cnb',
|
||||
key: 'question',
|
||||
middleware: ['auth-admin'],
|
||||
description: '创建 OpenCode 客户端',
|
||||
metadata: {
|
||||
args: {
|
||||
question: z.string().describe('问题'),
|
||||
baseUrl: z.string().optional().describe('OpenCode 服务地址,默认为 http://localhost:4096'),
|
||||
directory: z.string().optional().describe('运行目录,默认为根目录'),
|
||||
messageId: z.string().optional().describe('消息 ID,选填'),
|
||||
sessionId: z.string().optional().describe('会话 ID,选填'),
|
||||
providerId: z.string().optional().describe('指定使用的提供商 ID,默认为空,表示使用默认提供商'),
|
||||
modelId: z.string().optional().describe('指定使用的模型 ID,默认为空,表示使用默认模型'),
|
||||
parts: z.array(z.any()).optional().describe('消息内容的分块,优先于 question 参数'),
|
||||
awaitAnswer: z.boolean().optional().describe('是否等待回答完成,默认为 false,开启后会在回答完成后返回完整回答内容')
|
||||
}
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { question, baseUrl, directory = '/workspace', messageId, sessionId, parts, awaitAnswer = false, providerId, modelId } = ctx.query;
|
||||
const client = await getClient({ baseUrl: baseUrl });
|
||||
if (!client) {
|
||||
ctx.body = { content: `OpenCode 客户端获取失败` };
|
||||
return;
|
||||
}
|
||||
if (!question) {
|
||||
ctx.body = { content: `问题不能为空` };
|
||||
return;
|
||||
}
|
||||
let session: Session | null = null;
|
||||
if (sessionId) {
|
||||
try {
|
||||
const getSession = await client.session.get({ path: { id: sessionId } });
|
||||
session = getSession.data;
|
||||
} catch (error) {
|
||||
// 无法获取会话,继续往下走创建会话的逻辑
|
||||
}
|
||||
}
|
||||
if (!session) {
|
||||
const createSession = await client.session.create({
|
||||
query: {
|
||||
directory,
|
||||
},
|
||||
})
|
||||
session = createSession.data;
|
||||
}
|
||||
let _parts: any[] = parts ?? [{ type: "text", text: question }];
|
||||
let data: any = null;
|
||||
let model = null;
|
||||
if (providerId && modelId) {
|
||||
model = { providerID: providerId, modelID: modelId };
|
||||
}
|
||||
const promptPromise = client.session.prompt({
|
||||
body: {
|
||||
messageID: messageId,
|
||||
parts: _parts,
|
||||
...model ? { model } : {},
|
||||
},
|
||||
path: {
|
||||
id: sessionId || session.id,
|
||||
},
|
||||
})
|
||||
if (awaitAnswer) {
|
||||
const message = await promptPromise;
|
||||
data = message.data;
|
||||
} else {
|
||||
promptPromise.then(res => {
|
||||
console.log(`Prompt completed with response:`, res.data.info.id);
|
||||
}).catch(() => {
|
||||
// 忽略错误
|
||||
})
|
||||
}
|
||||
ctx.body = { content: awaitAnswer ? `已经完成` : `运行中`, data, sessionId: session.id };
|
||||
}).addTo(app);
|
||||
@@ -1 +1,3 @@
|
||||
import './ls.ts'
|
||||
import './ls.ts'
|
||||
import './cnb.ts'
|
||||
import './session/index.ts'
|
||||
@@ -7,7 +7,7 @@ import { useKey } from '@kevisual/use-config';
|
||||
app.route({
|
||||
path: 'opencode',
|
||||
key: 'create',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
description: '创建 OpenCode 客户端',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
@@ -16,7 +16,7 @@ app.route({
|
||||
title: '创建 OpenCode 客户端',
|
||||
summary: '创建 OpenCode 客户端,如果存在则复用',
|
||||
args: {
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000')
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096')
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -25,11 +25,11 @@ app.route({
|
||||
ctx.body = { content: `${opencodeManager.url} OpenCode 客户端已就绪` };
|
||||
}).addTo(app);
|
||||
|
||||
// 关闭 opencode 客户端 5000
|
||||
// 关闭 opencode 客户端 4096
|
||||
app.route({
|
||||
path: 'opencode',
|
||||
key: 'close',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
description: '关闭 OpenCode 客户端',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
@@ -38,7 +38,7 @@ app.route({
|
||||
title: '关闭 OpenCode 客户端',
|
||||
summary: '关闭 OpenCode 客户端, 未提供端口则关闭默认端口',
|
||||
args: {
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000')
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096')
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -51,7 +51,7 @@ app.route({
|
||||
app.route({
|
||||
path: 'opencode',
|
||||
key: 'restart',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
description: '重启 OpenCode 客户端',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
@@ -60,7 +60,7 @@ app.route({
|
||||
title: '重启 OpenCode 客户端',
|
||||
summary: '重启 OpenCode 客户端',
|
||||
args: {
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000')
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096')
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -73,7 +73,7 @@ app.route({
|
||||
app.route({
|
||||
path: 'opencode',
|
||||
key: 'getUrl',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
description: '获取 OpenCode 服务 URL',
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
@@ -82,7 +82,7 @@ app.route({
|
||||
title: '获取 OpenCode 服务 URL',
|
||||
summary: '获取当前 OpenCode 服务的 URL 地址',
|
||||
args: {
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 5000')
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096')
|
||||
}
|
||||
})
|
||||
},
|
||||
@@ -91,7 +91,7 @@ app.route({
|
||||
const cnbURL = useKey('CNB_VSCODE_PROXY_URI') as string | undefined;
|
||||
let content = `本地访问地址: ${url}`
|
||||
if (cnbURL) {
|
||||
content += `\n云端访问地址: ${cnbURL.replace('{{port}}', '5000')}`;
|
||||
content += `\n云端访问地址: ${cnbURL.replace('{{port}}', '4096')}`;
|
||||
}
|
||||
ctx.body = { content };
|
||||
}).addTo(app);
|
||||
@@ -114,7 +114,7 @@ app.route({
|
||||
app.route({
|
||||
path: 'opencode',
|
||||
key: 'runProject',
|
||||
middleware: ['auth'],
|
||||
middleware: ['auth-admin'],
|
||||
metadata: {
|
||||
tags: ['opencode'],
|
||||
...createSkill({
|
||||
|
||||
8
assistant/src/routes/opencode/module/client.ts
Normal file
8
assistant/src/routes/opencode/module/client.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { createOpencodeClient } from "@opencode-ai/sdk"
|
||||
|
||||
export const getClient = async (opts?: { baseUrl?: string }) => {
|
||||
const client = await createOpencodeClient({
|
||||
baseUrl: opts?.baseUrl ?? "http://localhost:4096",
|
||||
})
|
||||
return client;
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import getPort from "get-port";
|
||||
import os from "node:os";
|
||||
import { execSync } from "node:child_process";
|
||||
|
||||
const DEFAULT_PORT = 5000;
|
||||
const DEFAULT_PORT = 4096;
|
||||
|
||||
export class OpencodeManager {
|
||||
private static instance: OpencodeManager | null = null;
|
||||
@@ -57,7 +57,7 @@ export class OpencodeManager {
|
||||
|
||||
async createOpencodeProject({
|
||||
directory,
|
||||
port = 5000
|
||||
port = DEFAULT_PORT
|
||||
}: { directory?: string, port?: number }): Promise<OpencodeClient> {
|
||||
const client = createOpencodeClient({
|
||||
baseUrl: `http://localhost:${port}`,
|
||||
|
||||
282
assistant/src/routes/opencode/session/index.ts
Normal file
282
assistant/src/routes/opencode/session/index.ts
Normal file
@@ -0,0 +1,282 @@
|
||||
import { app } from '@/app.ts'
|
||||
import { createSkill, tool } from '@kevisual/router';
|
||||
import { opencodeManager } from '../module/open.ts';
|
||||
|
||||
// 查询 - 列出所有 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'list',
|
||||
middleware: ['auth-admin'],
|
||||
description: '列出所有 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'list-opencode-sessions',
|
||||
title: '列出所有 Session',
|
||||
summary: '列出 OpenCode 中的所有会话,可按目录过滤',
|
||||
args: {
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { port } = ctx.query;
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.list();
|
||||
ctx.body = { data: result.data, content: `共 ${(result.data as any[])?.length ?? 0} 个 Session` };
|
||||
}).addTo(app);
|
||||
|
||||
// 查询 - 获取单个 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'get',
|
||||
middleware: ['auth-admin'],
|
||||
description: '获取指定 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'get-opencode-session',
|
||||
title: '获取 Session',
|
||||
summary: '根据 ID 获取指定的 OpenCode 会话信息',
|
||||
args: {
|
||||
id: tool.schema.string().describe('Session ID'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { id, port } = ctx.query;
|
||||
if (!id) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.get({ path: { id } });
|
||||
ctx.body = { data: result.data, content: `已获取 Session: ${id}` };
|
||||
}).addTo(app);
|
||||
|
||||
// 查询 - 获取 session 状态
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'status',
|
||||
middleware: ['auth-admin'],
|
||||
description: '获取 OpenCode Session 状态',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'get-opencode-session-status',
|
||||
title: '获取 Session 状态',
|
||||
summary: '获取当前 OpenCode 会话的运行状态,可按目录过滤',
|
||||
args: {
|
||||
directory: tool.schema.string().optional().describe('工作目录'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { directory, port } = ctx.query;
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.status(directory ? { query: { directory } } : undefined);
|
||||
ctx.body = { data: result.data, content: `Session 状态已获取` };
|
||||
}).addTo(app);
|
||||
|
||||
// 查询 - 列出 session 消息
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'messages',
|
||||
middleware: ['auth-admin'],
|
||||
description: '列出 OpenCode Session 消息',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'list-opencode-session-messages',
|
||||
title: '列出 Session 消息',
|
||||
summary: '列出指定 OpenCode 会话的所有消息记录',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, port } = ctx.query;
|
||||
if (!sessionId) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.messages({ path: { id: sessionId } });
|
||||
ctx.body = { data: result.data, content: `Session ${sessionId} 共 ${(result.data as any[])?.length ?? 0} 条消息` };
|
||||
}).addTo(app);
|
||||
|
||||
// 新增 - 创建 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'create',
|
||||
middleware: ['auth-admin'],
|
||||
description: '创建 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'create-opencode-session',
|
||||
title: '创建 Session',
|
||||
summary: '在指定目录创建一个新的 OpenCode 会话',
|
||||
args: {
|
||||
directory: tool.schema.string().optional().describe('工作目录,默认为 /workspace'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { directory = '/workspace', port } = ctx.query;
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.create({ query: { directory } });
|
||||
ctx.body = { data: result.data, content: `Session 已创建,ID: ${(result.data as any)?.id}` };
|
||||
}).addTo(app);
|
||||
|
||||
// 修改 - 更新 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'update',
|
||||
middleware: ['auth-admin'],
|
||||
description: '更新 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'update-opencode-session',
|
||||
title: '更新 Session',
|
||||
summary: '更新指定 OpenCode 会话的属性,如标题',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
title: tool.schema.string().optional().describe('新的会话标题'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, title, port } = ctx.query;
|
||||
if (!sessionId) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.update({ path: { id: sessionId }, body: { title } });
|
||||
ctx.body = { data: result.data, content: `Session ${sessionId} 已更新` };
|
||||
}).addTo(app);
|
||||
|
||||
// 删除 - 删除 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'delete',
|
||||
middleware: ['auth-admin'],
|
||||
description: '删除 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'delete-opencode-session',
|
||||
title: '删除 Session',
|
||||
summary: '根据 ID 删除指定的 OpenCode 会话及其所有数据',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, port } = ctx.query;
|
||||
if (!sessionId) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
await client.session.delete({ path: { id: sessionId } });
|
||||
ctx.body = { content: `Session ${sessionId} 已删除` };
|
||||
}).addTo(app);
|
||||
|
||||
// 操作 - 中止 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'abort',
|
||||
middleware: ['auth-admin'],
|
||||
description: '中止 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'abort-opencode-session',
|
||||
title: '中止 Session',
|
||||
summary: '中止正在运行的 OpenCode 会话',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, port } = ctx.query;
|
||||
if (!sessionId) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
await client.session.abort({ path: { id: sessionId } });
|
||||
ctx.body = { content: `Session ${sessionId} 已中止` };
|
||||
}).addTo(app);
|
||||
|
||||
// 操作 - Fork session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'fork',
|
||||
middleware: ['auth-admin'],
|
||||
description: 'Fork OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'fork-opencode-session',
|
||||
title: 'Fork Session',
|
||||
summary: '从指定消息处 Fork 一个 OpenCode 会话',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
messageId: tool.schema.string().describe('从该消息处开始 Fork'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, messageId, port } = ctx.query;
|
||||
if (!sessionId || !messageId) {
|
||||
ctx.throw(400, 'Session ID 和 messageId 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.fork({ path: { id: sessionId }, body: { messageID: messageId } });
|
||||
ctx.body = { data: result.data, content: `Session ${sessionId} 已从消息 ${messageId} Fork` };
|
||||
}).addTo(app);
|
||||
|
||||
// 操作 - 总结 session
|
||||
app.route({
|
||||
path: 'opencode-session',
|
||||
key: 'summarize',
|
||||
middleware: ['auth-admin'],
|
||||
description: '总结 OpenCode Session',
|
||||
metadata: {
|
||||
tags: ['session'],
|
||||
...createSkill({
|
||||
skill: 'summarize-opencode-session',
|
||||
title: '总结 Session',
|
||||
summary: '对指定的 OpenCode 会话进行内容总结',
|
||||
args: {
|
||||
sessionId: tool.schema.string().describe('Session ID'),
|
||||
port: tool.schema.number().optional().describe('OpenCode 服务端口,默认为 4096'),
|
||||
}
|
||||
})
|
||||
}
|
||||
}).define(async (ctx) => {
|
||||
const { sessionId, port } = ctx.query;
|
||||
if (!sessionId) {
|
||||
ctx.throw(400, 'Session ID 不能为空');
|
||||
return;
|
||||
}
|
||||
const client = await opencodeManager.getClient({ port });
|
||||
const result = await client.session.summarize({ path: { id: sessionId } });
|
||||
ctx.body = { data: result.data, content: `Session ${sessionId} 总结完成` };
|
||||
}).addTo(app);
|
||||
9
assistant/src/routes/opencode/test/common.ts
Normal file
9
assistant/src/routes/opencode/test/common.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { app } from '@/app.ts';
|
||||
import '../cnb.ts'
|
||||
import "@/routes/auth.ts"
|
||||
import util from "node:util"
|
||||
export { app }
|
||||
|
||||
export const showMore = (data: any) => {
|
||||
return util.inspect(data, { depth: null, colors: true })
|
||||
}
|
||||
14
assistant/src/routes/opencode/test/list.ts
Normal file
14
assistant/src/routes/opencode/test/list.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { app, showMore } from './common.ts';
|
||||
|
||||
const main = async () => {
|
||||
const res = await app.run({
|
||||
path: 'opencode-cnb',
|
||||
key: 'question',
|
||||
payload: {
|
||||
question: '当前的projects目录下有哪些文件?',
|
||||
}
|
||||
}, { appId: app.appId });
|
||||
console.log('res', showMore(res));
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -48,14 +48,7 @@ export const runServer = async (port: number = 51515, listenPath = '127.0.0.1')
|
||||
]);
|
||||
const manager = useContextKey('manager', new AssistantApp(assistantConfig, app));
|
||||
setTimeout(async () => {
|
||||
await manager.load({ runtime: 'client' });
|
||||
console.log('Assistant App Loaded');
|
||||
await manager.checkLocalUser()
|
||||
await manager.initRemoteApp();
|
||||
await manager.initRouterApp();
|
||||
if (runtime.isServer) {
|
||||
await manager.initRoutes();
|
||||
}
|
||||
manager.init({ isServer: runtime.isServer });
|
||||
}, 1000);
|
||||
|
||||
return {
|
||||
@@ -171,3 +164,5 @@ export const runParser = async (argv: string[]) => {
|
||||
console.error('执行错误:', error.message);
|
||||
}
|
||||
};
|
||||
|
||||
export { app, program };
|
||||
|
||||
@@ -1,38 +1,41 @@
|
||||
export const configJson = `{
|
||||
"name": "assistant-app",
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.4",
|
||||
"description": "assistant-app package pnpm, node pkgs projects",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "pm2 start apps/code-center/dist/app.mjs --name code-center",
|
||||
"proxy": "pm2 start apps/page-proxy/dist/app.mjs --name page-proxy",
|
||||
"preview": "pnpm i && ASSISTANT_CONFIG_DIR=/workspace/kevisual asst server -s"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.990.0",
|
||||
"@kevisual/oss": "^0.0.19",
|
||||
"@kevisual/query": "^0.0.40",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"@kevisual/router": "^0.0.70",
|
||||
"@aws-sdk/client-s3": "^3.1011.0",
|
||||
"@kevisual/cnb": "^0.0.53",
|
||||
"@kevisual/oss": "^0.0.20",
|
||||
"@kevisual/project-search": "^0.0.12",
|
||||
"@kevisual/query": "^0.0.53",
|
||||
"@kevisual/router": "^0.1.5",
|
||||
"@kevisual/use-config": "^1.0.30",
|
||||
"ioredis": "^5.9.3",
|
||||
"pg": "^8.18.0",
|
||||
"pm2": "^6.0.14",
|
||||
"@parcel/watcher": "^2.5.6",
|
||||
"crypto-js": "^4.2.0",
|
||||
"unstorage": "^1.17.4",
|
||||
"dayjs": "^1.11.19",
|
||||
"es-toolkit": "^1.44.0",
|
||||
"node-cron": "^4.2.1",
|
||||
"dotenv": "^17.3.1"
|
||||
"dayjs": "^1.11.20",
|
||||
"dotenv": "^17.3.1",
|
||||
"es-toolkit": "^1.45.1",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"ioredis": "^5.10.0",
|
||||
"cron": "^4.4.0",
|
||||
"pg": "^8.20.0",
|
||||
"pm2": "^6.0.14",
|
||||
"unstorage": "^1.17.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@kevisual/types": "^0.0.12",
|
||||
"@types/bun": "^1.3.9",
|
||||
"@types/bun": "^1.3.10",
|
||||
"@types/crypto-js": "^4.2.2",
|
||||
"@types/node": "^25.2.3"
|
||||
"@types/node": "^25.5.0",
|
||||
"semver": "^7.7.4"
|
||||
}
|
||||
}
|
||||
`
|
||||
@@ -113,6 +113,10 @@ export class AssistantInit extends AssistantConfig {
|
||||
`packages:
|
||||
- 'apps/**/*'
|
||||
- 'pages/**/*'
|
||||
- 'skills/**/*'
|
||||
allowBuilds:
|
||||
'@parcel/watcher': true
|
||||
|
||||
`,
|
||||
);
|
||||
console.log(chalk.green('助手 pnpm-workspace.yaml 文件创建成功'));
|
||||
|
||||
@@ -1,36 +1,40 @@
|
||||
{
|
||||
"name": "assistant-app",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"description": "assistant-app package pnpm, node pkgs projects",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "pm2 start apps/code-center/dist/app.mjs --name code-center",
|
||||
"proxy": "pm2 start apps/page-proxy/dist/app.mjs --name page-proxy",
|
||||
"preview": "pnpm i && ASSISTANT_CONFIG_DIR=/workspace/kevisual asst server -s"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.994.0",
|
||||
"@kevisual/oss": "^0.0.19",
|
||||
"@kevisual/query": "^0.0.49",
|
||||
"@kevisual/router": "^0.0.83",
|
||||
"@aws-sdk/client-s3": "^3.1011.0",
|
||||
"@kevisual/cnb": "^0.0.53",
|
||||
"@kevisual/oss": "^0.0.20",
|
||||
"@kevisual/project-search": "^0.0.12",
|
||||
"@kevisual/query": "^0.0.53",
|
||||
"@kevisual/router": "^0.1.5",
|
||||
"@kevisual/use-config": "^1.0.30",
|
||||
"dayjs": "^1.11.19",
|
||||
"@parcel/watcher": "^2.5.6",
|
||||
"crypto-js": "^4.2.0",
|
||||
"dayjs": "^1.11.20",
|
||||
"dotenv": "^17.3.1",
|
||||
"es-toolkit": "^1.44.0",
|
||||
"es-toolkit": "^1.45.1",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"ioredis": "^5.9.3",
|
||||
"node-cron": "^4.2.1",
|
||||
"pg": "^8.18.0",
|
||||
"ioredis": "^5.10.0",
|
||||
"cron": "^4.4.0",
|
||||
"pg": "^8.20.0",
|
||||
"pm2": "^6.0.14",
|
||||
"unstorage": "^1.17.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@kevisual/types": "^0.0.12",
|
||||
"@types/bun": "^1.3.9",
|
||||
"@types/node": "^25.3.0",
|
||||
"@types/bun": "^1.3.10",
|
||||
"@types/crypto-js": "^4.2.2",
|
||||
"@types/node": "^25.5.0",
|
||||
"semver": "^7.7.4"
|
||||
}
|
||||
}
|
||||
@@ -9,11 +9,12 @@ import type { WebSocketListenerFun } from "@kevisual/router";
|
||||
import WebSocket from 'ws';
|
||||
import { renderNoAuthAndLogin } from '@/module/assistant/html/login.ts';
|
||||
import { LiveCode } from '@/module/livecode/index.ts';
|
||||
import { isCnb } from '@/routes/cnb-board/modules/is-cnb.ts';
|
||||
const localProxy = new LocalProxy({});
|
||||
localProxy.initFromAssistantConfig(assistantConfig);
|
||||
|
||||
const isOpenPath = (pathname: string): boolean => {
|
||||
const openPaths = ['/root/home', '/root/cli', '/root/login'];
|
||||
const openPaths = ['/root/home', '/root/cli', '/root/login', '/root/cli-center'];
|
||||
for (const openPath of openPaths) {
|
||||
if (pathname.startsWith(openPath)) {
|
||||
return true;
|
||||
@@ -81,12 +82,24 @@ const authFilter = async (req: http.IncomingMessage, res: http.ServerResponse) =
|
||||
}
|
||||
export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResponse) => {
|
||||
const _assistantConfig = assistantConfig.getCacheAssistantConfig();
|
||||
const home = _assistantConfig?.home || '/root/home';
|
||||
let home = _assistantConfig?.home
|
||||
const auth = _assistantConfig?.auth || {};
|
||||
// 没有管理员,需要去登陆
|
||||
let noAdmin = !auth.username;
|
||||
if (!home) {
|
||||
if (isCnb()) {
|
||||
home = '/root/cli-center/cnb-board'
|
||||
} else {
|
||||
home = '/root/cli-center/';
|
||||
}
|
||||
} else {
|
||||
if (!home.startsWith('/')) {
|
||||
home = '/' + home;
|
||||
}
|
||||
}
|
||||
|
||||
const toSetting = () => {
|
||||
res.writeHead(302, { Location: `/root/cli-center/` });
|
||||
const toLogin = (redirect?: string) => {
|
||||
res.writeHead(302, { Location: `/root/login/` + (redirect ? `?redirect=${encodeURIComponent(redirect)}` : '') });
|
||||
res.end();
|
||||
return true;
|
||||
}
|
||||
@@ -94,10 +107,11 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp
|
||||
const pathname = decodeURIComponent(url.pathname);
|
||||
if (pathname === '/') {
|
||||
if (noAdmin) {
|
||||
return toSetting();
|
||||
return toLogin(home + '/');
|
||||
}
|
||||
res.writeHead(302, { Location: `${home}/` });
|
||||
return res.end();
|
||||
res.writeHead(302, { Location: home });
|
||||
res.end();
|
||||
return
|
||||
}
|
||||
if (pathname.startsWith('/favicon.ico')) {
|
||||
res.statusCode = 404;
|
||||
@@ -162,8 +176,9 @@ export const proxyRoute = async (req: http.IncomingMessage, res: http.ServerResp
|
||||
}
|
||||
const isOpen = isOpenPath(pathname)
|
||||
logger.debug('proxyRoute', { _user, _app, pathname, noAdmin, isOpen });
|
||||
// 没有管理员,且不是开放路径,去登录
|
||||
if (noAdmin && !isOpen) {
|
||||
return toSetting();
|
||||
return toLogin();
|
||||
}
|
||||
if (_app && urls.length === 3) {
|
||||
// 重定向到
|
||||
|
||||
40
assistant/src/test/cnb.ts
Normal file
40
assistant/src/test/cnb.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { CNB } from '@kevisual/cnb'
|
||||
import { useKey } from '@kevisual/context'
|
||||
import { QueryLoginNode } from '@kevisual/api/query-login-node'
|
||||
import { Query } from '@kevisual/query'
|
||||
const queryLogin = new QueryLoginNode({
|
||||
query: new Query({ url: 'https://kevisual.cn/api/router' })
|
||||
})
|
||||
await queryLogin.cacheStore.init()
|
||||
const cnb = new CNB({
|
||||
token: useKey('CNB_TOKEN'),
|
||||
})
|
||||
// export const cnbLogin = async () => {
|
||||
// const userInfo = await cnb.user.getUser()
|
||||
// console.log('CNB用户信息', userInfo);
|
||||
// }
|
||||
// cnbLogin()
|
||||
|
||||
const testCnbLogin = async () => {
|
||||
const res = await queryLogin.loginByCnb({
|
||||
cnbToken: useKey('CNB_TOKEN') || '',
|
||||
})
|
||||
console.log('CNB登录结果', res);
|
||||
if (res.code === 200) {
|
||||
const userInfo = await queryLogin.checkLocalUser()
|
||||
console.log('CNB登录成功,用户信息', userInfo);
|
||||
} else {
|
||||
console.log('CNB登录失败', res);
|
||||
}
|
||||
}
|
||||
|
||||
// testCnbLogin()
|
||||
|
||||
const getCNBLocalUser = async () => {
|
||||
const res = await queryLogin.checkLocalUser()
|
||||
console.log('查询本地用户信息', res);
|
||||
const token = await queryLogin.getToken()
|
||||
console.log('检查token是否过期', token);
|
||||
}
|
||||
|
||||
getCNBLocalUser()
|
||||
1890
cli-center-docs/bun.lock
Normal file
1890
cli-center-docs/bun.lock
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
# envision-cli
|
||||
|
||||
## 上传文件
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"wss": "wss://cnb-pf8-1jhgvbrkm-001.cnb.space:443/stable-3c0b449c6e6e37b44a8a7938c0d8a3049926a64c?reconnectionToken=3d90027f-b2b1-4c60-a3b4-f061b75ec073&reconnection=false&skipWebSocketFrames=false",
|
||||
"cookie": "orange:workspace:cookie-session:cnb-pf8-1jhgvbrkm-001=9cc870da-d3d5-44ee-afdc-7498e1111186",
|
||||
"url": "https://cnb-pf8-1jhgvbrkm-001.cnb.space/?folder=/workspace"
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
{
|
||||
"metadata": {
|
||||
"name": "kevisual",
|
||||
"share": "public"
|
||||
},
|
||||
"checkDir": {
|
||||
"./build/tools/kevisual-sync": {
|
||||
"url": "https://kevisual.xiongxiao.me/root/ai/kevisual/tools/kevisual-sync/",
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
"syncDirectory": [
|
||||
{
|
||||
"files": [
|
||||
"build/**/*"
|
||||
],
|
||||
"ignore": [
|
||||
"build/ignore.md"
|
||||
],
|
||||
"registry": "https://kevisual.xiongxiao.me/root/ai/kevisual",
|
||||
"replace": {
|
||||
"build/": ""
|
||||
}
|
||||
}
|
||||
],
|
||||
"sync": {
|
||||
"./build/01-summary.md": {
|
||||
"url": "https://kevisual.xiongxiao.me/root/ai/kevisual/01-summary.md",
|
||||
"meta": {
|
||||
"share": "public"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
package.json
31
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kevisual/cli",
|
||||
"version": "0.1.8",
|
||||
"version": "0.1.29",
|
||||
"description": "envision 命令行工具",
|
||||
"type": "module",
|
||||
"basename": "/root/cli",
|
||||
@@ -41,35 +41,37 @@
|
||||
],
|
||||
"author": "abearxiong",
|
||||
"dependencies": {
|
||||
"@inquirer/prompts": "^8.2.1",
|
||||
"@inquirer/prompts": "^8.3.2",
|
||||
"@kevisual/app": "^0.0.2",
|
||||
"@kevisual/auth": "^2.0.3",
|
||||
"@kevisual/context": "^0.0.8",
|
||||
"@kevisual/router": "^0.1.5",
|
||||
"@kevisual/use-config": "^1.0.30",
|
||||
"@opencode-ai/sdk": "^1.2.10",
|
||||
"@opencode-ai/sdk": "^1.2.27",
|
||||
"@types/busboy": "^1.5.4",
|
||||
"busboy": "^1.6.0",
|
||||
"eventemitter3": "^5.0.4",
|
||||
"jose": "^6.1.3",
|
||||
"jose": "^6.2.1",
|
||||
"lowdb": "^7.0.1",
|
||||
"lru-cache": "^11.2.6",
|
||||
"lru-cache": "^11.2.7",
|
||||
"micromatch": "^4.0.8",
|
||||
"nanoid": "^5.1.7",
|
||||
"pm2": "latest",
|
||||
"semver": "^7.7.4",
|
||||
"unstorage": "^1.17.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@kevisual/api": "^0.0.58",
|
||||
"@kevisual/cnb": "^0.0.28",
|
||||
"@kevisual/api": "^0.0.64",
|
||||
"@kevisual/cnb": "^0.0.53",
|
||||
"@kevisual/dts": "^0.0.4",
|
||||
"@kevisual/load": "^0.0.6",
|
||||
"@kevisual/logger": "^0.0.4",
|
||||
"@kevisual/query": "0.0.49",
|
||||
"@types/bun": "^1.3.9",
|
||||
"@kevisual/query": "0.0.53",
|
||||
"@types/bun": "^1.3.10",
|
||||
"@types/crypto-js": "^4.2.2",
|
||||
"@types/jsonwebtoken": "^9.0.10",
|
||||
"@types/micromatch": "^4.0.10",
|
||||
"@types/node": "^25.3.0",
|
||||
"@types/node": "^25.5.0",
|
||||
"@types/semver": "^7.7.1",
|
||||
"chalk": "^5.6.2",
|
||||
"commander": "^14.0.3",
|
||||
@@ -80,13 +82,16 @@
|
||||
"ignore": "^7.0.5",
|
||||
"jsonwebtoken": "^9.0.3",
|
||||
"pm2": "^6.0.14",
|
||||
"tar": "^7.5.9",
|
||||
"zustand": "^5.0.11"
|
||||
"tar": "^7.5.11",
|
||||
"zustand": "^5.0.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=22.0.0"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
}
|
||||
},
|
||||
"workspaces": [
|
||||
"assistant"
|
||||
]
|
||||
}
|
||||
9219
pnpm-lock.yaml
generated
9219
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,5 @@
|
||||
packages:
|
||||
- assistant
|
||||
- cli-center-docs
|
||||
- center
|
||||
- packages
|
||||
|
||||
onlyBuiltDependencies:
|
||||
- esbuild
|
||||
|
||||
@@ -16,10 +16,10 @@ const changeMinimax = (token?: string) => {
|
||||
"env": {
|
||||
"ANTHROPIC_AUTH_TOKEN": auth_token,
|
||||
"ANTHROPIC_BASE_URL": "https://api.minimaxi.com/anthropic",
|
||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "MiniMax-M2.1",
|
||||
"ANTHROPIC_DEFAULT_OPUS_MODEL": "MiniMax-M2.1",
|
||||
"ANTHROPIC_DEFAULT_SONNET_MODEL": "MiniMax-M2.1",
|
||||
"ANTHROPIC_MODEL": "MiniMax-M2.1",
|
||||
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "MiniMax-M2.5",
|
||||
"ANTHROPIC_DEFAULT_OPUS_MODEL": "MiniMax-M2.5",
|
||||
"ANTHROPIC_DEFAULT_SONNET_MODEL": "MiniMax-M2.5",
|
||||
"ANTHROPIC_MODEL": "MiniMax-M2.5",
|
||||
"API_TIMEOUT_MS": "3000000",
|
||||
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1
|
||||
}
|
||||
|
||||
@@ -4,13 +4,15 @@ import path from 'path';
|
||||
import fs from 'fs';
|
||||
import FormData from 'form-data';
|
||||
import { getBaseURL, query, storage } from '@/module/query.ts';
|
||||
import { input, confirm } from '@inquirer/prompts';
|
||||
import { confirm } from '@inquirer/prompts';
|
||||
import chalk from 'chalk';
|
||||
import { upload } from '@/module/download/upload.ts';
|
||||
import { getBufferHash, getHash } from '@/uitls/hash.ts';
|
||||
import { getHash } from '@/uitls/hash.ts';
|
||||
import { queryAppVersion } from '@/query/app-manager/query-app.ts';
|
||||
import { logger } from '@/module/logger.ts';
|
||||
import { getUsername } from './login.ts';
|
||||
import { customAlphabet } from 'nanoid';
|
||||
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz', 8);
|
||||
/**
|
||||
* 获取package.json 中的 basename, version, user, appKey
|
||||
* @returns
|
||||
@@ -23,7 +25,7 @@ export const getPackageJson = (opts?: { version?: string; appKey?: string }) =>
|
||||
try {
|
||||
const packageJson = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
||||
const basename = packageJson.basename || '';
|
||||
const version = packageJson.version || '';
|
||||
const version = packageJson.version || '1.0.0';
|
||||
const app = packageJson.app;
|
||||
const userAppArry = basename.split('/');
|
||||
if (userAppArry.length <= 2 && !opts?.appKey) {
|
||||
@@ -41,33 +43,29 @@ const command = new Command('deploy')
|
||||
.argument('<filePath>', 'Path to the file to be uploaded, filepath or directory') // 定义文件路径参数
|
||||
.option('-v, --version <version>', 'verbose')
|
||||
.option('-k, --key <key>', 'key')
|
||||
.option('-y, --yes <yes>', 'yes')
|
||||
.option('-y, --yes <yes>', 'yes 已经去除')
|
||||
.option('-o, --org <org>', 'org')
|
||||
.option('-u, --update', 'load current app. set current version in product。 redis 缓存更新')
|
||||
.option('-s, --showBackend', 'show backend url, 部署的后端应用,显示执行的cli命令')
|
||||
.option('-d, --dot', '是否上传隐藏文件')
|
||||
.option('--dir, --directory <directory>', '上传的默认路径')
|
||||
.option('--dir, --directory <directory>', '上传的prefix路径,默认为空,例如设置为static,则会上传到/${username}/resources/${key}/${version}/static/路径下')
|
||||
.action(async (filePath, options) => {
|
||||
try {
|
||||
let { version, key, yes, update, org, showBackend } = options;
|
||||
let { version, key, update, org, showBackend } = options;
|
||||
const dot = !!options.dot;
|
||||
const pkgInfo = getPackageJson({ version, appKey: key });
|
||||
if (!version && pkgInfo?.version) {
|
||||
version = pkgInfo?.version || '';
|
||||
version = pkgInfo?.version || '1.0.0';
|
||||
}
|
||||
if (!key && pkgInfo?.appKey) {
|
||||
key = pkgInfo?.appKey || '';
|
||||
}
|
||||
logger.debug('start deploy');
|
||||
if (!version) {
|
||||
version = await input({
|
||||
message: 'Enter your version:',
|
||||
});
|
||||
version = '1.0.0';
|
||||
}
|
||||
if (!key) {
|
||||
key = await input({
|
||||
message: 'Enter your key:',
|
||||
});
|
||||
key = nanoid(8);
|
||||
}
|
||||
const pwd = process.cwd();
|
||||
const directory = path.join(pwd, filePath);
|
||||
@@ -99,15 +97,6 @@ const command = new Command('deploy')
|
||||
}
|
||||
logger.debug('upload Files', _relativeFiles);
|
||||
logger.debug('upload Files Key', key, version);
|
||||
if (!yes) {
|
||||
// 确认是否上传
|
||||
const confirmed = await confirm({
|
||||
message: 'Do you want to upload these files?',
|
||||
});
|
||||
if (!confirmed) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
let username = '';
|
||||
if (pkgInfo?.user) {
|
||||
username = pkgInfo.user;
|
||||
@@ -169,7 +158,7 @@ type UploadFileOptions = {
|
||||
};
|
||||
|
||||
export const uploadFilesV2 = async (files: string[], directory: string, opts: UploadFileOptions): Promise<any> => {
|
||||
const { key, version, username } = opts || {};
|
||||
const { key, version, username, directory: prefix } = opts || {};
|
||||
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
const file = files[i];
|
||||
@@ -184,7 +173,7 @@ export const uploadFilesV2 = async (files: string[], directory: string, opts: Up
|
||||
filepath: file,
|
||||
});
|
||||
const _baseURL = getBaseURL();
|
||||
const url = new URL(`/${username}/resources/${key}/${version}/${file}`, _baseURL);
|
||||
const url = new URL(`/${username}/resources/${key}/${version}/${prefix ? prefix + '/' : ''}${file}`, _baseURL);
|
||||
// console.log('upload file', file, filePath);
|
||||
const token = await storage.getItem('token');
|
||||
const check = () => {
|
||||
|
||||
123
src/command/download.ts
Normal file
123
src/command/download.ts
Normal file
@@ -0,0 +1,123 @@
|
||||
/**
|
||||
* download 命令模块
|
||||
* 用于从 Kevisual 平台下载项目文件
|
||||
*/
|
||||
import path from 'path';
|
||||
import fs from 'fs';
|
||||
import { queryLogin } from '@/module/query.ts';
|
||||
import { program, Command } from '@/program.ts';
|
||||
import { fetchLink } from '@/module/download/install.ts';
|
||||
import { chalk } from '@/module/chalk.ts';
|
||||
|
||||
/**
|
||||
* 文件项类型定义
|
||||
* 代表从 Kevisual 平台获取的文件元信息
|
||||
*/
|
||||
export type FileItem = {
|
||||
/** 文件名称,包含完整路径 */
|
||||
name: string;
|
||||
/** 文件大小(字节) */
|
||||
size: number;
|
||||
/** 最后修改时间 */
|
||||
lastModified: string;
|
||||
/** 文件 ETag 值,用于缓存验证 */
|
||||
etag: string;
|
||||
/** 相对路径 */
|
||||
path: string;
|
||||
/** 完整路径名 */
|
||||
pathname: string;
|
||||
/** 文件下载 URL */
|
||||
url: string;
|
||||
};
|
||||
|
||||
const downloadCmd = new Command('download')
|
||||
.description('下载项目')
|
||||
.option('-l, --link <link>', '下载链接')
|
||||
.option('-d, --directory <directory>', '下载目录', process.cwd())
|
||||
.action(async (opts) => {
|
||||
let link = opts.link || '';
|
||||
if (!link) {
|
||||
console.log('请提供下载链接');
|
||||
return;
|
||||
}
|
||||
let url = new URL(link);
|
||||
if (!url.pathname.endsWith('/')) {
|
||||
url.pathname += '/';
|
||||
}
|
||||
url.searchParams.set('recursive', 'true');
|
||||
const directory = opts.directory || process.cwd();
|
||||
const token = await queryLogin.getToken();
|
||||
|
||||
const res = await queryLogin.query.fetchText({
|
||||
url: url.toString(),
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`
|
||||
}
|
||||
});
|
||||
|
||||
if (res.code === 200 && res.data) {
|
||||
const files = res.data as FileItem[];
|
||||
console.log(`获取到 ${files.length} 个文件`);
|
||||
await downloadFiles(files, { directory });
|
||||
} else {
|
||||
console.log(chalk.red('获取文件列表失败:'), res.message || '未知错误');
|
||||
}
|
||||
});
|
||||
|
||||
program.addCommand(downloadCmd);
|
||||
|
||||
/**
|
||||
* 下载文件列表
|
||||
* @param files 文件列表
|
||||
* @param opts 下载选项
|
||||
* @param opts.directory 下载目录,默认为当前目录
|
||||
*/
|
||||
export const downloadFiles = async (files: FileItem[], opts?: { directory?: string }) => {
|
||||
const directory = opts?.directory || process.cwd();
|
||||
let successCount = 0;
|
||||
let failCount = 0;
|
||||
|
||||
for (const file of files) {
|
||||
try {
|
||||
const downloadPath = path.join(directory, file.path);
|
||||
const dir = path.dirname(downloadPath);
|
||||
|
||||
// 创建目录
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
// 下载文件
|
||||
console.log(`下载中: ${file.name}`);
|
||||
const { blob, type } = await fetchLink(file.url);
|
||||
|
||||
// 检查是否为错误响应
|
||||
if (type.includes('text/html')) {
|
||||
const text = await blob.text();
|
||||
if (text === 'fetchRes is error') {
|
||||
console.log(chalk.red('下载失败:'), file.name);
|
||||
failCount++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// 写入文件
|
||||
fs.writeFileSync(downloadPath, Buffer.from(await blob.arrayBuffer()));
|
||||
successCount++;
|
||||
console.log(chalk.green('下载成功:'), file.name);
|
||||
} catch (error) {
|
||||
failCount++;
|
||||
console.log(chalk.red('下载失败:'), file.name, error);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(chalk.blue('下载完成'));
|
||||
console.log(chalk.green(`成功: ${successCount}`));
|
||||
console.log(chalk.red(`失败: ${failCount}`));
|
||||
|
||||
return {
|
||||
successCount,
|
||||
failCount,
|
||||
};
|
||||
};
|
||||
@@ -2,7 +2,8 @@ import { program as app, Command } from '@/program.ts';
|
||||
import { getConfig, getEnvToken, writeConfig } from '@/module/index.ts';
|
||||
import { queryLogin, storage } from '@/module/query.ts';
|
||||
import { input } from '@inquirer/prompts';
|
||||
import util from 'util';
|
||||
import { Kevisual } from '@/module/kevisual.ts';
|
||||
import { showMore } from '@/uitls/show-more.ts';
|
||||
function isNumeric(str: string) {
|
||||
return /^-?\d+\.?\d*$/.test(str);
|
||||
}
|
||||
@@ -38,7 +39,24 @@ const tokenList = new Command('list')
|
||||
console.log(queryLogin.cacheStore.cacheData);
|
||||
// console.log(util.inspect(res, { colors: true, depth: 4 }));
|
||||
});
|
||||
|
||||
token.addCommand(tokenList);
|
||||
|
||||
const createToken = new Command('create')
|
||||
.description('create jwks token')
|
||||
.action(async (opts) => {
|
||||
const kevisual = new Kevisual();
|
||||
const res = await kevisual.getAdminToken();
|
||||
if (res.code === 200) {
|
||||
const jwtToken = res.data?.accessToken;
|
||||
console.log('============jwt token============\n\n');
|
||||
console.log(jwtToken);
|
||||
} else {
|
||||
console.log('create token failed', showMore(res));
|
||||
}
|
||||
});
|
||||
|
||||
token.addCommand(createToken);
|
||||
app.addCommand(token);
|
||||
|
||||
const baseURL = new Command('baseURL')
|
||||
|
||||
@@ -14,11 +14,79 @@ const parseIfJson = (str: string) => {
|
||||
return {};
|
||||
}
|
||||
};
|
||||
const publishRegistry = (options: { execPath: string, registry: string, tag?: string, config: any, env: any }) => {
|
||||
const packageJson = path.resolve(options.execPath, 'package.json');
|
||||
let cmd = '';
|
||||
const config = options.config || {};
|
||||
const execPath = options.execPath;
|
||||
const registry = options.registry;
|
||||
const setEnv = options.env || {};
|
||||
switch (registry) {
|
||||
case 'npm':
|
||||
cmd = 'npm publish -s --registry https://registry.npmjs.org';
|
||||
break;
|
||||
case 'cnb':
|
||||
cmd = 'npm publish -s --registry https://npm.cnb.cool/kevisual/registry/-/packages/';
|
||||
break;
|
||||
default:
|
||||
cmd = 'npm publish -s --registry https://registry.npmjs.org';
|
||||
break;
|
||||
}
|
||||
if (fileIsExist(packageJson)) {
|
||||
const keys = Object.keys(config).filter((key) => key.includes('NPM_TOKEN'));
|
||||
const tokenEnv = keys.reduce((prev, key) => {
|
||||
return {
|
||||
...prev,
|
||||
[key]: config[key],
|
||||
};
|
||||
}, {});
|
||||
const pkg = fs.readFileSync(packageJson, 'utf-8');
|
||||
const pkgJson = parseIfJson(pkg);
|
||||
const version = pkgJson?.version as string;
|
||||
if (version && options?.tag) {
|
||||
let tag = String(version).split('-')[1] || '';
|
||||
if (tag) {
|
||||
if (tag.includes('.')) {
|
||||
tag = tag.split('.')[0];
|
||||
}
|
||||
cmd = `${cmd} --tag ${tag}`;
|
||||
}
|
||||
}
|
||||
console.log(chalk.green(cmd));
|
||||
|
||||
const child = spawn(cmd, {
|
||||
shell: true,
|
||||
cwd: execPath,
|
||||
env: {
|
||||
...process.env, // 保留当前环境变量
|
||||
...tokenEnv,
|
||||
...setEnv,
|
||||
},
|
||||
});
|
||||
child.stdout.on('data', (data) => {
|
||||
console.log(chalk.green(`${data}`));
|
||||
});
|
||||
child.stderr.on('data', (data) => {
|
||||
// 过滤掉 'npm notice' 或者其他信息
|
||||
if (data.toString().includes('npm notice')) {
|
||||
console.log(chalk.yellow(`notice: ${data}`));
|
||||
} else {
|
||||
console.error(`stderr: ${data}`);
|
||||
}
|
||||
});
|
||||
child.on('close', (code) => {
|
||||
// console.log(`child process exited with code ${code}`);
|
||||
});
|
||||
} else {
|
||||
console.error(chalk.red('package.json not found'));
|
||||
}
|
||||
}
|
||||
const command = new Command('npm').description('npm command show publish and set .npmrc').action(async (options) => { });
|
||||
const publish = new Command('publish')
|
||||
.argument('[registry]')
|
||||
.option('-p --proxy', 'proxy')
|
||||
.option('-t, --tag', 'tag')
|
||||
.option('-u, --update', 'update new version')
|
||||
.description('publish npm')
|
||||
.action(async (registry, options) => {
|
||||
if (!registry) {
|
||||
@@ -26,8 +94,8 @@ const publish = new Command('publish')
|
||||
message: 'Select the registry to publish',
|
||||
choices: [
|
||||
{
|
||||
name: 'me',
|
||||
value: 'me',
|
||||
name: 'all',
|
||||
value: 'all',
|
||||
},
|
||||
{
|
||||
name: 'npm',
|
||||
@@ -41,7 +109,6 @@ const publish = new Command('publish')
|
||||
});
|
||||
}
|
||||
const config = getConfig();
|
||||
let cmd = '';
|
||||
const execPath = process.cwd();
|
||||
let setEnv = {};
|
||||
const proxyEnv = {
|
||||
@@ -55,70 +122,15 @@ const publish = new Command('publish')
|
||||
...proxyEnv,
|
||||
};
|
||||
}
|
||||
if (registry) {
|
||||
const packageJson = path.resolve(execPath, 'package.json');
|
||||
switch (registry) {
|
||||
case 'me':
|
||||
cmd = 'npm publish --registry https://npm.xiongxiao.me';
|
||||
break;
|
||||
case 'npm':
|
||||
cmd = 'npm publish --registry https://registry.npmjs.org';
|
||||
break;
|
||||
case 'cnb':
|
||||
cmd = 'npm publish --registry https://npm.cnb.cool/kevisual/registry/-/packages/';
|
||||
break;
|
||||
default:
|
||||
cmd = 'npm publish --registry https://npm.xiongxiao.me';
|
||||
break;
|
||||
}
|
||||
if (fileIsExist(packageJson)) {
|
||||
const keys = Object.keys(config).filter((key) => key.includes('NPM_TOKEN'));
|
||||
const tokenEnv = keys.reduce((prev, key) => {
|
||||
return {
|
||||
...prev,
|
||||
[key]: config[key],
|
||||
};
|
||||
}, {});
|
||||
const pkg = fs.readFileSync(packageJson, 'utf-8');
|
||||
const pkgJson = parseIfJson(pkg);
|
||||
const version = pkgJson?.version as string;
|
||||
if (version && options?.tag) {
|
||||
let tag = String(version).split('-')[1] || '';
|
||||
if (tag) {
|
||||
if (tag.includes('.')) {
|
||||
tag = tag.split('.')[0];
|
||||
}
|
||||
cmd = `${cmd} --tag ${tag}`;
|
||||
}
|
||||
}
|
||||
console.log(chalk.green(cmd));
|
||||
if (options?.update) {
|
||||
patchFunc({ directory: execPath });
|
||||
}
|
||||
|
||||
const child = spawn(cmd, {
|
||||
shell: true,
|
||||
cwd: execPath,
|
||||
env: {
|
||||
...process.env, // 保留当前环境变量
|
||||
...tokenEnv,
|
||||
...setEnv,
|
||||
},
|
||||
});
|
||||
child.stdout.on('data', (data) => {
|
||||
console.log(chalk.green(`${data}`));
|
||||
});
|
||||
child.stderr.on('data', (data) => {
|
||||
// 过滤掉 'npm notice' 或者其他信息
|
||||
if (data.toString().includes('npm notice')) {
|
||||
console.log(chalk.yellow(`notice: ${data}`));
|
||||
} else {
|
||||
console.error(`stderr: ${data}`);
|
||||
}
|
||||
});
|
||||
child.on('close', (code) => {
|
||||
// console.log(`child process exited with code ${code}`);
|
||||
});
|
||||
} else {
|
||||
console.error(chalk.red('package.json not found'));
|
||||
}
|
||||
if (registry === 'all') {
|
||||
publishRegistry({ execPath, registry: 'npm', config, env: setEnv });
|
||||
publishRegistry({ execPath, registry: 'cnb', config, env: setEnv });
|
||||
} else {
|
||||
publishRegistry({ execPath, registry, tag: options?.tag, config, env: setEnv });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -142,8 +154,7 @@ const npmrc = new Command('set')
|
||||
const config = getConfig();
|
||||
const npmrcContent =
|
||||
config?.npmrc ||
|
||||
`//npm.xiongxiao.me/:_authToken=\${ME_NPM_TOKEN}
|
||||
//npm.cnb.cool/kevisual/registry/-/packages/:_authToken=\${CNB_API_KEY}
|
||||
`/npm.cnb.cool/kevisual/registry/-/packages/:_authToken=\${CNB_API_KEY}
|
||||
//registry.npmjs.org/:_authToken=\${NPM_TOKEN}
|
||||
`;
|
||||
const execPath = process.cwd();
|
||||
@@ -210,9 +221,8 @@ const install = new Command('install')
|
||||
});
|
||||
command.addCommand(install);
|
||||
|
||||
// npm patch
|
||||
const patch = new Command('patch').description('npm patch 发布补丁版本').action(async () => {
|
||||
const cwd = process.cwd();
|
||||
const patchFunc = (opts?: { directory?: string }) => {
|
||||
const cwd = opts?.directory || process.cwd();
|
||||
const packageJson = path.resolve(cwd, 'package.json');
|
||||
if (fileIsExist(packageJson)) {
|
||||
const pkg = fs.readFileSync(packageJson, 'utf-8');
|
||||
@@ -229,6 +239,10 @@ const patch = new Command('patch').description('npm patch 发布补丁版本').a
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// npm patch
|
||||
const patch = new Command('patch').description('npm patch 发布补丁版本').action(async () => {
|
||||
patchFunc();
|
||||
});
|
||||
command.addCommand(patch);
|
||||
|
||||
|
||||
@@ -19,7 +19,15 @@ const checkAuth = (value: string = '', baseURL: string = '') => {
|
||||
return false;
|
||||
};
|
||||
|
||||
const DEFAULT_IGNORE = ['node_modules/**', '.git/**', '.next/**', '.astro/**', '.pack-dist/**'];
|
||||
const DEFAULT_IGNORE = [
|
||||
'node_modules/**',
|
||||
'.git/**',
|
||||
'.next/**',
|
||||
'.astro/**',
|
||||
'.pack-dist/**',
|
||||
"dist/**",
|
||||
".swc/**"
|
||||
];
|
||||
export class SyncBase {
|
||||
config: Config;
|
||||
#filename: string;
|
||||
@@ -101,17 +109,23 @@ export class SyncBase {
|
||||
* @param opts.getFile 是否检测文件是否存在
|
||||
* @returns
|
||||
*/
|
||||
async getSyncList(opts?: { getFile?: boolean }): Promise<SyncList[]> {
|
||||
async getSyncList(opts?: { getFile?: boolean, getLocalFile?: boolean }): Promise<SyncList[]> {
|
||||
const config = this.config!;
|
||||
let sync = config?.sync || {};
|
||||
const local = opts?.getLocalFile ?? true;
|
||||
const syncDirectory = await this.getSyncDirectoryList();
|
||||
sync = this.getMergeSync(sync, syncDirectory.sync);
|
||||
if (local) {
|
||||
sync = this.getMergeSync(sync, syncDirectory.sync);
|
||||
}
|
||||
const syncKeys = Object.keys(sync);
|
||||
const baseURL = this.baseURL;
|
||||
const syncList = syncKeys.map((key) => {
|
||||
const value = sync[key];
|
||||
const filepath = path.join(this.#dir, key); // 文件的路径
|
||||
if (filepath.includes('node_modules') || filepath.includes('.git')) {
|
||||
const dirs = path.dirname(filepath).split(path.sep);
|
||||
const hasGit = dirs.includes('.git');
|
||||
const hasNodeModules = dirs.includes('node_modules');
|
||||
if (hasGit || hasNodeModules) {
|
||||
return null;
|
||||
}
|
||||
if (typeof value === 'string') {
|
||||
|
||||
@@ -20,9 +20,11 @@ const syncUpload = new Command('upload')
|
||||
.option('-d --dir <dir>', '配置目录')
|
||||
.option('-c --config <config>', '配置文件的名字', 'kevisual.json')
|
||||
.option('-f --file <file>', '操作的对应的文件名')
|
||||
.option('-l --list', '显示上传列表,不上传文件')
|
||||
.description('上传项目, 上传需要和registry的地址同步。')
|
||||
.action(async (opts) => {
|
||||
console.log('上传项目');
|
||||
const isUpload = opts.list ? false : true;
|
||||
const sync = new SyncBase({ dir: opts.dir, baseURL: baseURL, configFilename: opts.config });
|
||||
const syncList = await sync.getSyncList({ getFile: true });
|
||||
logger.debug(syncList);
|
||||
@@ -58,6 +60,10 @@ const syncUpload = new Command('upload')
|
||||
if (filepath && item.filepath !== filepath.absolute) {
|
||||
continue;
|
||||
}
|
||||
if (!isUpload) {
|
||||
console.log('上传列表', item.key, chalk.green(item.url));
|
||||
continue
|
||||
}
|
||||
const res = await upload({
|
||||
token,
|
||||
file: fs.readFileSync(item.filepath),
|
||||
@@ -127,10 +133,12 @@ const syncList = new Command('list')
|
||||
.option('-d --dir <dir>', '配置目录')
|
||||
.option('-c --config <config>', '配置文件的名字', 'kevisual.json')
|
||||
.option('-a --all', '显示所有的文件')
|
||||
.option('-l --local', '显示本地的文件列表')
|
||||
.description('列出同步列表')
|
||||
.action(async (opts) => {
|
||||
const sync = new SyncBase({ dir: opts.dir, baseURL: baseURL, configFilename: opts.config });
|
||||
const syncList = await sync.getSyncList();
|
||||
let getLocalFile = opts?.local ? true : false;
|
||||
const syncList = await sync.getSyncList({ getFile: true, getLocalFile });
|
||||
logger.debug(syncList);
|
||||
logger.info('同步列表\n');
|
||||
syncList.forEach((item) => {
|
||||
@@ -172,11 +180,16 @@ const clone = new Command('clone')
|
||||
.option('-d --dir <dir>', '配置目录')
|
||||
.option('-c --config <config>', '配置文件的名字', 'kevisual.json')
|
||||
.option('-i --link <link>', '克隆链接, 比 kevisual.json 优先级更高')
|
||||
.option('-l --local', '值对sync的列表进行clone处理,只对sync列表处理')
|
||||
.description('检查目录')
|
||||
.action(async (opts) => {
|
||||
const link = opts.link || '';
|
||||
let link = opts.link || '';
|
||||
const local = opts.local || false;
|
||||
const sync = new SyncBase({ dir: opts.dir, baseURL: baseURL, configFilename: opts.config });
|
||||
if (link) {
|
||||
if (!link.endsWith('.json')) {
|
||||
link = link + (link.endsWith('/') ? '' : '/') + 'kevisual.json';
|
||||
}
|
||||
const res = await query.fetchText(link);
|
||||
if (res.code === 200) {
|
||||
fs.writeFileSync(sync.configPath, JSON.stringify(res.data, null, 2));
|
||||
@@ -186,7 +199,7 @@ const clone = new Command('clone')
|
||||
}
|
||||
await sync.init()
|
||||
}
|
||||
const syncList = await sync.getSyncList();
|
||||
const syncList = await sync.getSyncList({ getLocalFile: !local });
|
||||
logger.debug(syncList);
|
||||
logger.info('检查目录\n');
|
||||
const checkList = await sync.getCheckList();
|
||||
@@ -211,24 +224,23 @@ const clone = new Command('clone')
|
||||
const matchList = matchObjectList
|
||||
.map((item2) => {
|
||||
const rp = sync.getRelativePath(item2.pathname);
|
||||
|
||||
if (!rp) return false;
|
||||
if (rp.absolute.endsWith('gitignore.txt')) {
|
||||
// 修改为 .gitignore
|
||||
const newPath = rp.absolute.replace('gitignore.txt', '.gitignore');
|
||||
rp.absolute = newPath;
|
||||
rp.relative = path.relative(sync.dir, newPath);
|
||||
} else if (rp.absolute.endsWith('.dot')) {
|
||||
const filename = path.basename(rp.absolute, '.dot');
|
||||
const newPath = path.join(path.dirname(rp.absolute), `.${filename}`);
|
||||
rp.absolute = newPath;
|
||||
rp.relative = path.relative(sync.dir, newPath);
|
||||
}
|
||||
return { ...item2, relative: rp.relative, absolute: rp.absolute };
|
||||
})
|
||||
.filter((i) => i);
|
||||
for (const matchItem of matchList) {
|
||||
if (!matchItem) continue;
|
||||
if (local) {
|
||||
const some = syncList.some((syncItem) => {
|
||||
if (syncItem.url === matchItem.url) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (!some) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
let needDownload = true;
|
||||
let hash = '';
|
||||
await sync.getDir(matchItem.absolute, true);
|
||||
|
||||
@@ -23,6 +23,7 @@ import './command/docker.ts';
|
||||
import './command/jwks.ts';
|
||||
|
||||
import './command/cnb/index.ts';
|
||||
import './command/download.ts';
|
||||
|
||||
// program.parse(process.argv);
|
||||
|
||||
|
||||
19
src/module/kevisual.ts
Normal file
19
src/module/kevisual.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { query } from './query.ts';
|
||||
import { Query } from '@kevisual/query';
|
||||
|
||||
export class Kevisual {
|
||||
query: Query;
|
||||
constructor() {
|
||||
this.query = query;
|
||||
}
|
||||
getAdminToken() {
|
||||
const res = this.query.post({
|
||||
path: 'user',
|
||||
key: 'token-create',
|
||||
payload: {
|
||||
loginType: 'jwks',
|
||||
}
|
||||
})
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ export const getBaseURL = () => {
|
||||
return baseURL;
|
||||
};
|
||||
export const query = new Query({
|
||||
baseURL: getBaseURL(),
|
||||
url: `${getBaseURL()}/api/router`,
|
||||
});
|
||||
export const getHeader = async () => {
|
||||
|
||||
4
temp.md
4
temp.md
@@ -1,4 +0,0 @@
|
||||
"@nut-tree-fork/nut-js": "^4.2.6",
|
||||
"@kevisual/hot-api": "^0.0.3",
|
||||
|
||||
KEVISUAL_TOKEN="" LOG_LEVEL=DEBUG pnpm dev deploy ./cli-center/dist -k cli -v 0.0.4 -u -y y
|
||||
@@ -26,7 +26,7 @@
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.ts"
|
||||
],
|
||||
"exclude": [],
|
||||
}
|
||||
Reference in New Issue
Block a user