This commit is contained in:
熊潇 2025-06-18 15:30:31 +08:00
parent eff66be037
commit 33f70e0564
12 changed files with 246 additions and 1 deletions

View File

@ -1,5 +1,7 @@
在 shadcn/ui 中,`Neutral``Gray``Zinc``Stone``Slate` 都是预设的灰色调色板neutral color palettes但它们的色调倾向和适用场景略有不同。以下是它们的区别和特点 在 shadcn/ui 中,`Neutral``Gray``Zinc``Stone``Slate` 都是预设的灰色调色板neutral color palettes但它们的色调倾向和适用场景略有不同。以下是它们的区别和特点
```md
--- ---
### 1. **`Neutral`** ### 1. **`Neutral`**
@ -47,5 +49,5 @@
### 对比图(从冷到暖): ### 对比图(从冷到暖):
`Slate``Gray``Neutral``Zinc``Stone` `Slate``Gray``Neutral``Zinc``Stone`
```
如果需要更直观的对比,可以在 [shadcn/ui 官网](https://ui.shadcn.com/docs) 或 [Tailwind 调色板](https://tailwindcss.com/docs/customizing-colors) 查看色值示例。 如果需要更直观的对比,可以在 [shadcn/ui 官网](https://ui.shadcn.com/docs) 或 [Tailwind 调色板](https://tailwindcss.com/docs/customizing-colors) 查看色值示例。

View File

@ -0,0 +1,46 @@
# viz 的思考
对于任何用户都能够展示的各自自己的页面。
用户只需要配置要的窗口的内容,和初始化的位置信息。
**超级副屏**
> 实时统计
使用点:
1. 实时获取语音的信息展示,生成的文本内容
2. 任务管理ToDo
3. ai对话生成结果记录比较重要的agent的消息。多端的糅合如果手机端的对话可以实时同步到电脑端
4. 听歌,页面,操作。
## 定义最基本的框架数据类型
**显示内容相关的数据**
类型:页面类型 html的cssobject或者原本的threejs渲染的内容。
### html的相关信息信息
宽度,大小,位置
隐藏或显示
刷新
### 原本的threejs渲染类型
## think
我第一步关注点在于,页面的内容的显示
-- iframe 内嵌(类似于内置浏览器)
-- render by router 路由渲染
-- 代码 执行代码
-- 控制面板,跟随用户的面板
## 多终端交互同步
所有的内容语音知识库调度任务调度都需要汇集在viz中心可以观看。

View File

@ -0,0 +1,9 @@
# 直觉
智能编程,自然语言转为代码。首要的条件是理解函数的执行过程,运行顺序。
执行的过程,程序是按顺序运行的,也就如果直觉下,知晓对应的线性关系,代码能够被更智能和更有效的生成。
## 顺序
代码的执行,在编程语言当中,是有关键字来确定要做什么。自然语言去生成,就需要通过描述和定义去定义形成的方案,同时借用已有的示例的内容去实现代码,去适配已有的代码库和风格。

View File

@ -0,0 +1,41 @@
# 任务
## minio 的事件的监听
### 初始化
删除所有的 db 的数据,列出 minio 的所有文件,同步内容到 db 数据库
### 监听任务
minio 的事件,更新,删除,修改文件,触发同步事件。
## 关于实现 client 服务
gitea 的 token实时获取 我的 可共享的内容。
`https://kevisual.xiongxiao.me/root/me/`
## 关于 assistant 的 storage 的模块的数据的存储
```sh
npm i @kevisual/storage
```
1. 类名为 AssistantStorage
2. opts 对象类型 可选configPath 为字符串
可选 app 为字符串
3. 结构体 定义configPath如果不存在则为process.cwd(); app不存在为 名称 app
dir为 path.join(configPath, app);
4. getData(name='data.json'), 先检测 dir,不存在则创建。
然后获取data.json的内容如果不存在则创建文件 切返回{}
5. setData(name='data.json', data opts) , 获取 getData并merge数据opts有参数 overwrite的时候不merge直接覆盖。
configPath 默认为 `path.join(process.cwd(), 'storage', '__user_app__')`

View File

@ -0,0 +1,27 @@
# minio 文件监听
昨天提及minio 的内容的监听为什么要有这个文件的监听是因为minio 不支持高级搜索,过滤的搜索内容。只能基于 prefix 和 maxKey 和 ContinuationToken 去拆页面获取。不够灵活,所以需要把目录的信息同步到数据库 postgres 当中。
为了同步数据到数据库当中,要实现文件创建和删除的监听。
为了避免同一个文件多次修改任务的处理一般要延迟运行创建了一个文件debounce 延迟 2 分钟录入到数据库,检测和刷新。因为数据可能一直在修改。
其中也有一个原因是因为,本地数据 kevisual.json 的数据同步到服务器当中,会出现一个问题,要知道那些内容未更新,更新了的文件才上传,没有更新的文件就不需要再次上传了。
## 如何实现
minio 的 listen 的服务的内容是依据,事件监听,监听其中的 createObject 和 removeObeject 俩个事件。
触发动作后,把需要操作的事情 push 到 router 当中router 当中,把请求 push 打哦 bullmq 当中bullmq 进行队列执行
**第一次运行**
监测是否是第一次运行
如果是第一次运行,同步所有的 minio 当中的数据到数据库当中
## 定时器
需要有一个定时的任务,任务的主要的功能模块是,检测数据库一个月以前的数据,如果其中在 minio 中的数据不一致了,那么进行同步数据库的内容,更新 check因为数据是同步来自 minio所以具有不确定性把不确定性的东西实现变得更加的稳定。
这里介绍一下不稳定的地方minio 是一个数组,数据是一个数组,这两个中的数据要一致的话,需要 a 的列表和 b 的列表都遍历一次才能知道,如果出了 minio 中文件不存在,而数据库存在,就有问题。

View File

@ -0,0 +1,34 @@
# 监听实时的声音
实时对话,然后进行实现一些辅助功能。
## 大概的可能的功能模块
小小是智能助手的名称。
### 单句话
如果以小小开头的一段话,那吗是开启记录的事件内容,同时把生成的那一条数据记录下来。说的下一句话,不做记录。
### 多句话
如果是小小,记录事件,这是开启记录的事件的语音指令,其他的任何行为都是记录事件,时刻保持监听。
暂停和继续的指令
退出指令:并在触发退出的音频是 退出,停止,关闭等语音指令进行关闭。
### 自定义的指令模块
其他的额外的可能附加的指令。
## 因为功能的局限性
具体只需要实现的功能,单句话。把内容传递到服务器的 logger-list 的数据当中。
logger-list 可以操作一些额外的事件。
## 获取ai的storage的today的数据
每次推送一端文字?

View File

@ -0,0 +1 @@
你要多想想自己,服务亮点是什么,有没有特殊的优势,考虑的够不够周全。

View File

@ -0,0 +1,7 @@
## 需要一个库
获取 ai 下的资源的 json 的数据的内容。然后保存。
## 通过api
使用html的页面的代码直接实现获取页面的内容。

View File

@ -0,0 +1,27 @@
# ai-editor 创建项目
在打开文件夹的时候,显示一个操作弹窗。
创建一个前或者后端项目,直接生成保存代码内容。根据提示词生成。
例外的思考需要后端的。创建 kevisual.json如果是 node 端的程序,可以下载到本地的助手的开发环境下,自己手动运行。
纯前端的页面的内容,部署方式,前端的开发预览。
## ai
要做什么,等于是插件式的功能
AI属于应用插件。
## 构思一个开发的一个流程过程
web上开发同时进行部署。预览使用开源的项目
web上开发就是页面打开这个文件夹然后触发 `deploy``ai` 动作.

View File

@ -0,0 +1,11 @@
# kevisual 命名
两级命名,在寻常的开发过程,路由的使用的时候我推荐 route 使用两级命名,但是我在开发 editor 编辑器的过程中,实际发现,在日常的时候也有效果。
在系统的文件夹管理当中,当一个目录的文件夹过多,是比较难去找到自己想要找到的目录,除非是通过搜索目录。人能够很简单的找到,量不多的时候,有记忆,我大概位置,那么对整个文件的掌控性是非常强的。能够通过直觉知道这个目录在哪里。
一般情况下,一个目录中最多 100 个子的目录,每一个子目录也是。所有的目录的包函的内容,就能够包函 10000 个。每一个目录等于是一个标签,在查询方面,更加的迅速。
## 延伸能做的一个
可以开发一个图的结构的文件夹模式。然后创建文件和创建文件夹,然后对内容进行操作更加的便捷。

View File

@ -0,0 +1,20 @@
# 代码
当前的 ai 因为是弱智能的,所以要生成的代码都需要先人为的固定生成的模式,才能继续去生成。
## 关联
如何把 ai 关联到开发的项目当中。
## 在浏览器当中
通过 import-map直接实现在页面能够直接跑代码
比如设定提示词,直接能够在页面中使用。
```ts
const propmts = {
role: 'assistant',
content: '你是一个前端开发',
};
```

View File

@ -163,6 +163,10 @@ export class QueryLogin extends BaseQuery {
return this.post( return this.post(
{ key: 'refreshToken', data }, { key: 'refreshToken', data },
{ {
noStop: true,
beforeRequest: async (config) => {
return config;
},
afterResponse: async (response, ctx) => { afterResponse: async (response, ctx) => {
setBaseResponse(response); setBaseResponse(response);
return response as any; return response as any;
@ -239,6 +243,7 @@ export class QueryLogin extends BaseQuery {
) { ) {
const that = this; const that = this;
const refetch = opts?.refetch ?? false; const refetch = opts?.refetch ?? false;
if (response?.code === 401) { if (response?.code === 401) {
if (that.query.stop === true) { if (that.query.stop === true) {
return { code: 500, success: false, message: 'refresh token loading...' }; return { code: 500, success: false, message: 'refresh token loading...' };
@ -266,6 +271,7 @@ export class QueryLogin extends BaseQuery {
return that.post( return that.post(
{ key: 'me' }, { key: 'me' },
{ {
noStop: true,
beforeRequest: async (config) => { beforeRequest: async (config) => {
if (config.headers) { if (config.headers) {
config.headers['Authorization'] = `Bearer ${_token}`; config.headers['Authorization'] = `Bearer ${_token}`;
@ -397,6 +403,20 @@ export class QueryLogin extends BaseQuery {
}, },
); );
} }
async getLoginUser() {
const that = this;
const userInfo = await that.checkLocalUser();
const token = await that.getToken();
if (userInfo) {
return userInfo;
} else if (token) {
const userinfo = await that.getLoginUserByToken(token);
if (userinfo) {
return userinfo;
}
}
return null;
}
async getLoginUserByToken(token: string): Promise<User | null> { async getLoginUserByToken(token: string): Promise<User | null> {
const me = await this.getMe(token, false); const me = await this.getMe(token, false);
if (me.code === 200) { if (me.code === 200) {