open-index/open-npm huggingface dataset:
npm package: @kevisual/api
Description: 对 kevisual 相关的query router 的模块整理
Author: abearxiong
Latest version: 0.0.67

# @kevisual/api

对 kevisual 相关的query router 的模块整理

包含的模块：

## query-config - 配置管理模块

提供配置的增删改查功能，支持默认配置项管理。

**主要功能：**
- 配置的获取、更新、删除
- 上传配置管理
- 默认配置项支持（upload.json, workspace.json, ai.json, user.json, life.json）
- 配置检测功能

**使用示例：**
```typescript
import { QueryConfig } from './query-config/query-config';

const config = new QueryConfig();
await config.getConfig({ key: 'upload.json' });
await config.updateConfig({ key: 'config.json', data: { setting: true } });
```

## query-secret - 密钥管理模块

用于管理敏感信息和密钥的存储与检索。

**主要功能：**
- 密钥的存储和获取
- 支持按ID或key检索
- 密钥列表管理

## query-proxy - 代理路由模块

提供动态路由代理功能，可以将请求转发到不同的后端服务。

**主要功能：**
- 动态路由注册
- 请求转发代理
- 路由列表管理
- Token认证支持

**使用示例：**
```typescript
import { QueryProxy } from './query-proxy/index';

const proxy = new QueryProxy({
  query: new Query(),
  token: 'your-token'
});
await proxy.init(); // 初始化路由
const result = await proxy.run({ path: 'api', key: 'getData' });
```

## query-upload - 文件上传模块

功能完整的文件上传解决方案，支持多种上传方式。

**主要功能：**
- 普通文件上传
- 分片上传（大文件）
- 上传进度跟踪
- 文件过滤工具
- 文件格式转换

**核心组件：**
- `uploadFiles` - 基础文件上传
- `uploadFileChunked` - 分片上传
- `UploadProgress` - 进度管理
- `filterFiles` - 文件过滤
- `toFile` - 格式转换

**使用示例：**
```typescript
import { uploadFiles, UploadProgress } from './query-upload/query-upload';

const progress = new UploadProgress();
await uploadFiles(files, {
  onProgress: (loaded, total) => {
    console.log(`上传进度: ${loaded}/${total}`);
  }
});
```

## query-app - 应用管理模块

管理应用的注册、获取和列表功能。

**主要功能：**
- 获取应用列表
- 获取公开应用
- 获取私有应用
- 应用定义管理

## query-shop - 应用商店模块

应用商店功能，处理应用的安装和获取。

**主要功能：**
- 应用安装
- 商店应用管理

## query-ai - AI对话模块

集成AI聊天功能，支持多种模型和对话管理。

**主要功能：**
- AI对话（支持GPT等模型）
- 模型列表获取
- 聊天使用统计
- 缓存管理
- 使用限制管理

**使用示例：**
```typescript
import { QueryAI } from './query-ai/query-ai';

const ai = new QueryAI({ query: new Query() });
const models = await ai.getModelList();
const response = await ai.chat(
  { message: '你好' },
  { username: 'user', model: 'gpt-3.5', group: 'default' }
);
```

## query-login - 登录认证模块

完整的登录认证解决方案，支持token管理和缓存。

**主要功能：**
- 用户登录认证
- Token管理（access/refresh token）
- 登录状态缓存
- 浏览器/Node.js环境支持
- 自动token刷新

**核心组件：**
- `QueryLogin` - 主登录类
- `LoginCacheStore` - 登录缓存
- `Cache` - 通用缓存接口

## query-resources - 资源管理模块

管理用户资源的访问和获取。

**主要功能：**
- 资源文件获取
- 资源列表管理
- 用户认证支持
- 文件预览功能

**使用示例：**
```typescript
import { QueryResources } from './query-resources/index';

const resources = new QueryResources({ username: 'user' });
const fileList = await resources.getList('images/');
const fileContent = await resources.fetchFile('document.pdf');
```

## 架构特点

- **模块化设计**：每个模块职责单一，可独立使用
- **统一接口**：基于 `@kevisual/query` 的统一查询接口
- **环境兼容**：支持浏览器和Node.js环境
- **类型安全**：完整的TypeScript类型定义
- **扩展性**：易于扩展和自定义
npm package: @kevisual/app
Description: 用户只保留当前自己系统的 auth token。
Author: abearxiong
Latest version: 0.0.2

# 应用层应用

## 整个应用的逻辑

用户只保留当前自己系统的 auth token。

当调用外部系统的时候，通过 auth token 去获取自己的对应的外部系统的 token，然后再调用外部系统的接口。

## 举个例子，我要用 qwen 的接口

qwen 在我的系统中的存储的配置是 qwen.json

目的是纯前端快速访问页面, 因为要快速生成页面

```ts
const app = new App({token});
const config = await app.getConfig('qwen.json');

const qwen = new Qwen({token: config.token});
const response = await qwen.chat({messages: [...]});
console.log(response);
```
npm package: @kevisual/assistant-cli
Description: ```bash npm i -g @kevisual/cli --registry=https://npm.cnb.cool/kevisual/registry/-/packages/ ``` ## 环境变量配置项
Author: abearxiong
Latest version: 0.0.7

# assistant cli

## 安装

```bash
npm i -g @kevisual/cli --registry=https://npm.cnb.cool/kevisual/registry/-/packages/
```
## 环境变量配置项

- ASSISTANT_CONFIG_DIR
  - 说明：指定 assistant 的配置文件目录
  - 示例：`export ASSISTANT_CONFIG_DIR=/path/to/your/config/dir`


## 启动命令

```bash
asst server -s -p 8686
```
npm package: @kevisual/auth
Description: issuer: https://convex.kevisual.cn   applicationID: convex-app
Author: abearxiong
Latest version: 2.0.3

## JWT Configuration

### Convex auth.config.ts

issuer: https://convex.kevisual.cn  
applicationID: convex-app

issuer必须与JWT中的iss字段匹配，applicationID必须与aud字段匹配。

```ts
import { AuthConfig } from 'convex/server';

export default {
  providers: [
    {
      type: 'customJwt',
      applicationID: 'convex-app',
      issuer: 'https://convex.kevisual.cn',
      jwks: 'https://api-convex.kevisual.cn/root/convex/jwks.json',
      algorithm: 'RS256',
    },
  ],
};
```

### Payload 例子

header必须包含kid字段以匹配jwks中的密钥ID。

```ts
import * as jose from "jose";
// 加载测试私钥
const keys = JSON.parse(await Bun.file("./jwt/privateKey.json").text());
const privateKey = await jose.importJWK(keys, "RS256");

// 生成 RS256 JWT
const payload = {
  iss: "https://convex.kevisual.cn",
  sub: "user:8fa2be73c2229e85",
  aud: "convex-app",
  exp: Math.floor(Date.now() / 1000) + 3600,
  name: "Test User AA",
  email: "test@example.com",
};
const token = await new jose.SignJWT(payload)
  .setProtectedHeader({
    "alg": "RS256",
    "typ": "JWT",
    "kid": "kid-key-1"
  })
  .setIssuedAt()
  .sign(privateKey);
```
npm package: @kevisual/cnb
Description: 所有的代码仓库，只基于一个准则 `group/repo`
Author: abearxiong
Latest version: 0.0.75

# cnb.cool 能做什么

所有的代码仓库，只基于一个准则 `group/repo`

## 环境变量

```sh
CNB_API_KEY
CNB_COOKIE
```
## 简介

纯粹调用api的模式去使用cnb.cool，自动化方案。

## workspace

工作区快速打开，编辑代码，然后运行和执行

## 代码仓库

快速创建代码仓库，然后打开工作区，然后运行

## kevisual assistant app

借用模块进行开发项目
npm package: @kevisual/code-builder
Description: 使用方式 ```bash npx @kevisual/code-builder build  ```
Author: abearxiong
Latest version: 0.0.7

# 对bun的build命令进行封装


## npx
使用方式
```bash
npx @kevisual/code-builder build 
```

## global安装
```bash
npm install -g @kevisual/code-builder
code-builder build
```

## 作为库使用

```ts
import { buildWithBun } from '@kevisual/code-builder'

await buildWithBun({ meta: import.meta, dts: true })

await buildWithBun({ naming: 'app', entry: 'src/index.ts' });
```
npm package: @kevisual/context
Description: 上下文 的node或则浏览器当中，如果global中不存在context，则赋值到global，如果存在，则获取对应的。
Author: abearxiong
Latest version: 0.0.10

# 环境变量 context

上下文 的node或则浏览器当中，如果global中不存在context，则赋值到global，如果存在，则获取对应的。

```ts
import { useContextKey } from '@kevisual/context';

const v = useContextKey('a', () => '123'); // 如果是第一次初始化，返回123，否则返回之前初始化的值
```



### types
```ts
type GlobalContext<T = SimpleObject> = {
    name?: string;
    [key: string]: any;
} & T;
type InitFn<T> = () => T | Promise<T>;
type Init<T> = T | InitFn<T> | null;
type AsyncResult<T, ASYNC extends boolean = false> = ASYNC extends true ? Promise<T> : T;
type SimpleObject = Record<string, any>;
declare const useContext: <T = SimpleObject>(initContext?: GlobalContext<T>, isOverwrite?: boolean) => Required<GlobalContext<T>>;
declare const useContextKey: <T = any, ASYNC extends boolean = false>(key: string, init?: Init<T>, isNew?: boolean) => AsyncResult<T, ASYNC>;
declare const use: <T = any, ASYNC extends boolean = false>(key: string, init?: Init<T>, isNew?: boolean) => AsyncResult<T, ASYNC>;
declare const useConfig: <T = SimpleObject>(initConfig?: Partial<GlobalContext<T>>, isOverwrite?: boolean) => Required<GlobalContext<Partial<GlobalContext<T>>>>;
declare const useConfigKey: <T = any, ASYNC extends boolean = false>(key: string, init?: Init<T>, isNew?: boolean) => AsyncResult<T, ASYNC>;
/**
 * 从环境变量获取
 * @param envKey
 * @param initKey
 * @returns
 */
declare const useKey: <T = string>(envKey: T, initKey?: string) => any;

export { use, useConfig, useConfigKey, useContext, useContextKey, useKey };


```
npm package: @kevisual/convex
Description: ```json {   "@kevisual/convex":"git+https://cnb.cool/kevisual/convex" } ```
Author: abearxiong
Latest version: 0.0.6

# 基于convex做一些小玩具

## 安装

```json
{
  "@kevisual/convex":"git+https://cnb.cool/kevisual/convex"
}
```
npm package: @kevisual/ha-api
Description: ```bash asst plugins install @kevisual/ha-api/routes ```
Author: abearxiong
Latest version: 0.0.10

# install

```bash
asst plugins install @kevisual/ha-api/routes
```

## 灯光管理

该模块提供对Home Assistant中灯光设备的管理功能，包括获取灯光列表、搜索特定灯光设备以及控制灯光的开关状态。

```ts
import { haLight }  from '@kevisual/ha-api';

const light = new haLight({
  host: 'http://your-home-assistant:8123',
  token: 'your-long-lived-access-token',
});
// 获取所有灯光设备
const lights = await light.getLights();
console.log(lights);

const searchResult = await light.searchLight('living room');
console.log(searchResult);

if(searchResult.hasMore) {
  console.log('多个灯光设备匹配该关键词，请进一步筛选。');
} else if(searchResult.id) {
  console.log(`唯一匹配的灯光设备ID为: ${searchResult.id}`);
  light.toggleLight({ entity_id: searchResult.id, service: 'turn_on' });
} else {
  console.log('没有找到匹配的灯光设备。');
}
```

## 音箱管理

该模块提供对Home Assistant中音箱设备的管理功能，执行文本指令等。

```ts
import { TextHA }  from '@kevisual/ha-api';

const tts = new TextHA({
  host: 'http://your-home-assistant:8123',
  token: 'your-long-lived-access-token',
});
// 获取所有音箱设备
const entities = await text.getSpeakerEntities();
// 执行文本指令
const res2 = await text.executeTextDirective('text.xiaomi_lx06_9e08_execute_text_directive', '关闭阳台灯');
console.log(res2);
```
npm package: @kevisual/js-filter
Description: 用于 JavaScript 数组的 SQL LIKE 过滤器函数
Author: abearxiong
Latest version: 0.0.6

# JS Filter

轻量、易读、可解析、可执行的类 SQL 过滤语法，用于 JavaScript 数组过滤。

## 语法特性

- **WHERE**: 条件过滤
- **ORDER BY**: 排序
- **LIMIT**: 限制结果数量
- **操作符**: `=`, `!=`, `>`, `<`, `>=`, `<=`, `IN`, `CONTAINS`, `LIKE`, `NOT LIKE`, `IS NULL`, `IS NOT NULL`
- **逻辑**: `AND`, `OR`

## 语法示例

```javascript
// 基础过滤
filter(users, "WHERE metadata.type = 'user'");

// 多条件
filter(users, "WHERE metadata.tags CONTAINS 'premium' AND metadata.region = 'beijing'");

// 排序
filter(users, "WHERE metadata.type = 'user' ORDER BY metadata.created_at DESC");

// 限制数量
filter(users, "WHERE metadata.type = 'user' ORDER BY metadata.created_at DESC LIMIT 10");

// IN 操作
filter(users, "WHERE metadata.region IN ['beijing', 'shanghai']");

// LIKE 操作 (支持 % 匹配任意字符，_ 匹配单个字符)
filter(products, "WHERE name LIKE '%Apple%'");
filter(products, "WHERE name LIKE 'Apple%'");
filter(products, "WHERE name LIKE '%Phone'");

// NOT LIKE 操作 (排除匹配模式的项)
filter(products, "WHERE name NOT LIKE '%Apple%'");

// IS NULL 操作 (匹配 null 或 undefined 的值)
filter(users, "WHERE email IS NULL");

// IS NOT NULL 操作 (匹配非 null 且非 undefined 的值)
filter(users, "WHERE email IS NOT NULL");
```

## 使用方法

```javascript
import { filter } from '@kevisual/js-filter';

const users = [
  {
    metadata: {
      tags: ['premium', 'active'],
      type: 'user',
      region: 'beijing',
      created_at: '2024-03-15T10:00:00Z',
    },
  },
  {
    metadata: {
      tags: ['free'],
      type: 'admin',
      region: 'shanghai',
      created_at: '2024-01-10T09:00:00Z',
    },
  },
  {
    metadata: {
      tags: ['enterprise', 'premium'],
      type: 'user',
      region: 'guangzhou',
      created_at: '2024-04-05T12:00:00Z',
    },
  },
];

// 查找 premium 用户
const premiumUsers = filter(users, "WHERE metadata.tags CONTAINS 'premium'");

// 查找北京的用户，按创建时间倒序
const beijingUsers = filter(users, "WHERE metadata.region = 'beijing' ORDER BY metadata.created_at DESC");
```

## 新增操作符说明

### NOT LIKE
排除匹配指定模式的数据项。

```javascript
// 查找不包含 "Apple" 的产品
const nonAppleProducts = filter(products, "WHERE name NOT LIKE '%Apple%'");
```

### IS NULL / IS NOT NULL
检查字段值是否为 `null` 或 `undefined`。

```javascript
const usersWithNullEmail = [
  { name: 'Alice', email: 'alice@example.com', age: 25 },
  { name: 'Bob', email: null, age: 30 },
  { name: 'Charlie', email: undefined, age: 35 },
];

// 查找 email 为 null 或 undefined 的用户
const usersWithoutEmail = filter(usersWithNullEmail, "WHERE email IS NULL");

// 查找 email 不为 null 且不为 undefined 的用户  
const usersWithEmail = filter(usersWithNullEmail, "WHERE email IS NOT NULL");
```

**注意**: `IS NULL` 和 `IS NOT NULL` 会同时检查 JavaScript 的 `null` 和 `undefined` 值。
npm package: @kevisual/kv-code
Description: ```html
Author: abearxiong
Latest version: 0.0.4

# kv-code

```html

<kv-code-json value='{"key": "value"}' style="height: 300px;"/>
<script type="module">
  import 'https://esm.sh/@kevisual/kv-code/dist/kv-code.js';
</script>
```
npm package: @kevisual/kv-md
Description: 这是一个使用 Vite 构建的简单 Lit 项目模板。您可以使用此模板快速启动一个新的 Lit 项目，并利用 AI 助手生成代码片段以加速开发过程。少用git。
Author: abearxiong
Latest version: 0.0.1

# simple-lit-vite

这是一个使用 Vite 构建的简单 Lit 项目模板。您可以使用此模板快速启动一个新的 Lit 项目，并利用 AI 助手生成代码片段以加速开发过程。少用git。

## cli

```sh
ev sync clone -i https://kevisual.cn/root/ai/kevisual/frontend/simple-lit-vite/kevisual.json
```

## 同步命令
```sh
ev sync list
ev sync upload
```
npm package: @kevisual/load
Description: 主要作用为加载模块，并时刻监测，当检测到已经加载，执行某一个功能。主要的检测是通过`hasLoaded`
Author: abearxiong
Latest version: 0.0.6

# load fn 

主要作用为加载模块，并时刻监测，当检测到已经加载，执行某一个功能。主要的检测是通过`hasLoaded`

```ts
import { BaseLoad } from '@kevisual/load';

const load = new BaseLoad();

load
  .load(
    async () => {
      return {
        a: 1,
        b: 2,
      };
    },
    { key: 'test' },
  )
  .then((res) => {
    console.log('test-load:', res);
  });
console.log('test-loading:', load.loading);
load.hasLoaded('test', { isExist: true }).then((res) => {
  console.log('test-load:has load', res);
});

```
npm package: @kevisual/local-proxy
Description: ```ts import { proxyRoute, initProxy } from '@kevisual/local-proxy/proxy.ts'; initProxy({   pagesDir: './demo',   watch: true, }); import { App } from '../app.ts'; const app = new App();
Author: abearxiong
Latest version: 0.0.8

```ts
import { proxyRoute, initProxy } from '@kevisual/local-proxy/proxy.ts';
initProxy({
  pagesDir: './demo',
  watch: true,
});
import { App } from '../app.ts';
const app = new App();

app.listen(2233, () => {
  console.log('Server is running on http://localhost:2233');
});

app.onServerRequest(proxyRoute);
```
npm package: @kevisual/logger
Description: ai generate
Author: abearxiong
Latest version: 0.0.4

## logger

ai generate 

```ts
// import { Logger } from '@kevisual/logger';
import { Logger } from '@kevisual/logger/node';
const logger = new Logger({
  // level: 'debug',
  level: 'error',
  showTime: true,
});

logger.debug('hello world debug');

logger.info('hello world info');

logger.warn('hello world warn');

logger.error('hello world error');

```