@hjsy/vue-ai-assistant-badge 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  本文件遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 与
4
4
  [Semantic Versioning](https://semver.org/lang/zh-CN/)。
5
5
 
6
+ ## [Unreleased]
7
+
8
+ ### Added
9
+
10
+ - 子路径导出 `@hjsy/vue-ai-assistant-badge/vite`:`aiAssistantProxy()` Vite 插件把 `/v1` 开发态代理
11
+ 打包进组件,宿主只需在 vite.config.ts 加一行并指定服务地址(target → `VITE_AI_API_URL` → 内置兜底
12
+ 三级解析,兜底时终端提醒改地址;宿主已配同前缀代理时自动让位)。
13
+ - `postinstall` 接入提示:安装后自动打印两步指引(bootstrap.ts 典型位置 + 要粘贴的代码;
14
+ 代理插件用法);CI 静默,pnpm 10+ 需 `pnpm approve-builds` 批准。
15
+ - `vite` 声明为可选 peerDependency(仅使用 `/vite` 子路径时需要)。
16
+ - 单测覆盖代理插件的前缀注入、地址优先级、宿主让位与兜底提示。
17
+
6
18
  ## 0.1.0
7
19
 
8
20
  ### Added
package/README.md CHANGED
@@ -34,6 +34,7 @@
34
34
  - 🔐 **权限双校验**:跳转前校验菜单归属,触发按钮前再校验按钮权限码
35
35
  - 🎨 **样式自带**:CSS 以运行时注入方式内置,可覆盖 CSS 变量换肤,无需宿主配 Tailwind
36
36
  - 🧩 **可插拔适配层**:`@hjsy/vue-ai-assistant-badge/adapters/vben` 提供 vben 工程的一行接入
37
+ - 🚇 **开发代理内置**:`@hjsy/vue-ai-assistant-badge/vite` 导出 Vite 插件,`/v1` 代理不用再手写,只需给服务地址
37
38
 
38
39
  ## 安装
39
40
 
@@ -45,6 +46,25 @@ pnpm add @hjsy/vue-ai-assistant-badge
45
46
 
46
47
  要求:Node ≥ 18,Vue ≥ 3.4。
47
48
 
49
+ 安装完成后,终端会自动打印接入提示(bootstrap.ts 的典型位置、要粘贴的代码、代理插件用法)。
50
+ 若用 pnpm 10+ 且没看到提示,先批准构建脚本:`pnpm approve-builds`,
51
+ 或在根 `pnpm-workspace.yaml` 的 `allowBuilds` 加 `"@hjsy/vue-ai-assistant-badge": true`。
52
+
53
+ ### 开发态代理:一行接入,只改地址
54
+
55
+ `/v1 → AI 判定服务` 的反向代理已打包成 Vite 插件(子路径 `/vite`,仅 dev server 生效):
56
+
57
+ ```ts
58
+ // 应用的 vite.config.ts(vben 工程放返回值的 vite.plugins;标准工程放顶层 plugins)
59
+ import { aiAssistantProxy } from '@hjsy/vue-ai-assistant-badge/vite';
60
+
61
+ plugins: [aiAssistantProxy({ target: 'http://你的AI服务地址:48080' })];
62
+ ```
63
+
64
+ `target` 也可省略:插件会读 `.env.*` / 环境变量里的 `VITE_AI_API_URL`;
65
+ 都读不到时用内置兜底地址并在终端提醒改地址。前缀可用 `prefix` 改(需与 `ask` 的 `baseUrl` 一致);
66
+ 宿主已手写同前缀代理时插件自动让位。
67
+
48
68
  ## 快速开始
49
69
 
50
70
  最小可用示例(自带 fetch 请求客户端 + mock 权限源):
@@ -56,7 +76,7 @@ import { createAiAssistantPlugin, createFetchAskClient } from '@hjsy/vue-ai-assi
56
76
  import App from './app.vue';
57
77
 
58
78
  const ask = createFetchAskClient({
59
- baseUrl: '/v1', // 结构化判定服务前缀,开发态交给 devServer 代理
79
+ baseUrl: '/v1', // 结构化判定服务前缀,开发态由上方 aiAssistantProxy 内置代理
60
80
  getHeaders: () => ({ Authorization: `Bearer ${getToken()}` }),
61
81
  });
62
82
 
@@ -262,6 +282,7 @@ npm run release:beta # 打 beta tag:npm i @hjsy/vue-ai-assistant-badge@be
262
282
  | `registerAiAction` / `dispatchAiAction` / `AI_ACTION_EVENT` | 按钮动作注册与派发 |
263
283
  | `useDraggableBadge` / `useTypewriter` | 拖拽与打字机逻辑,供自定义渲染复用 |
264
284
  | `AI_ASSISTANT_CSS` / `ensureStyles` | 内置样式(SSR 可自行内联) |
285
+ | `aiAssistantProxy`(子路径 `/vite`) | 内置 `/v1` 开发态代理的 Vite 插件,宿主只改服务地址 |
265
286
  | `showToast` / `toast` | 内置轻提示 |
266
287
 
267
288
  ## 常见问题
package/dist/vite.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { Plugin } from "vite";
2
+ /** 默认代理前缀(与 createFetchAskClient 的 baseUrl 默认值一致) */
3
+ declare const DEFAULT_AI_PROXY_PREFIX = "/v1";
4
+ /** 默认环境变量名(.env.development 等文件中配置服务地址) */
5
+ declare const DEFAULT_AI_PROXY_ENV_VAR = "VITE_AI_API_URL";
6
+ /** 未配置任何地址时的兜底目标(仅开发联调用,终端会给出改地址提示) */
7
+ declare const DEFAULT_AI_PROXY_TARGET = "http://192.168.1.10:48080";
8
+ interface AiAssistantProxyOptions {
9
+ /** 代理前缀,默认 /v1;需与 ask 客户端的 baseUrl 保持一致 */
10
+ prefix?: string;
11
+ /** AI 判定服务地址;不传则读 envVar,仍无则用 fallbackTarget 并给出提示 */
12
+ target?: string;
13
+ /** 读取服务地址的环境变量名,默认 VITE_AI_API_URL */
14
+ envVar?: string;
15
+ /** 兜底服务地址,默认 DEFAULT_AI_PROXY_TARGET */
16
+ fallbackTarget?: string;
17
+ /** 是否转发 WebSocket,默认 true */
18
+ ws?: boolean;
19
+ /** 是否改写请求头中的 Host 为目标地址,默认 true */
20
+ changeOrigin?: boolean;
21
+ }
22
+ declare function aiAssistantProxy(options?: AiAssistantProxyOptions): Plugin;
23
+ export { AiAssistantProxyOptions, DEFAULT_AI_PROXY_ENV_VAR, DEFAULT_AI_PROXY_PREFIX, DEFAULT_AI_PROXY_TARGET, aiAssistantProxy };
package/dist/vite.mjs ADDED
@@ -0,0 +1,53 @@
1
+ import { loadEnv } from "vite";
2
+ // src/vite.ts
3
+ /**
4
+ * 内置开发态反向代理插件:把 systemone AI 判定服务的 /v1 代理打包进组件,
5
+ * 宿主只需在 vite.config.ts 的 plugins 里加一行,最多改一个服务地址。
6
+ *
7
+ * 用法(vben 工程的 vite.config.ts 返回结构中):
8
+ * ```ts
9
+ * import { aiAssistantProxy } from '@hjsy/vue-ai-assistant-badge/vite';
10
+ *
11
+ * return {
12
+ * application: {},
13
+ * vite: { plugins: [aiAssistantProxy()] },
14
+ * };
15
+ * ```
16
+ *
17
+ * 地址解析优先级:
18
+ * 1. 显式传入的 `target`
19
+ * 2. .env.* / 环境变量里的 `envVar`(默认 VITE_AI_API_URL)
20
+ * 3. 内置兜底 `fallbackTarget`(会在终端提示用户改成自己的地址)
21
+ *
22
+ * 宿主若已自行配置了同前缀代理,本插件自动让位、不覆盖。
23
+ */
24
+ /** 默认代理前缀(与 createFetchAskClient 的 baseUrl 默认值一致) */
25
+ const DEFAULT_AI_PROXY_PREFIX = "/v1";
26
+ /** 默认环境变量名(.env.development 等文件中配置服务地址) */
27
+ const DEFAULT_AI_PROXY_ENV_VAR = "VITE_AI_API_URL";
28
+ /** 未配置任何地址时的兜底目标(仅开发联调用,终端会给出改地址提示) */
29
+ const DEFAULT_AI_PROXY_TARGET = "http://192.168.1.10:48080";
30
+ function aiAssistantProxy(options = {}) {
31
+ const { prefix = "/v1", envVar = DEFAULT_AI_PROXY_ENV_VAR, fallbackTarget = DEFAULT_AI_PROXY_TARGET, changeOrigin = true, ws = true, target } = options;
32
+ let usedFallback = false;
33
+ return {
34
+ name: "hjsy-ai-assistant-proxy",
35
+ apply: "serve",
36
+ config(config, { mode }) {
37
+ if ((config?.server?.proxy ?? {})[prefix]) return;
38
+ const env = loadEnv(mode ?? "development", process.cwd());
39
+ const resolved = target || env[envVar] || process.env[envVar] || "";
40
+ usedFallback = !resolved;
41
+ const proxy = {
42
+ changeOrigin,
43
+ target: resolved || fallbackTarget,
44
+ ws
45
+ };
46
+ return { server: { proxy: { [prefix]: proxy } } };
47
+ },
48
+ configResolved(config) {
49
+ if (usedFallback) config.logger.warn(`[aiAssistantProxy] 未检测到 AI 服务地址,暂使用内置默认 ${fallbackTarget};请在 .env 配置 ${envVar}=http://你的服务地址,或传 aiAssistantProxy({ target })`);
50
+ }
51
+ };
52
+ }
53
+ export { DEFAULT_AI_PROXY_ENV_VAR, DEFAULT_AI_PROXY_PREFIX, DEFAULT_AI_PROXY_TARGET, aiAssistantProxy };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hjsy/vue-ai-assistant-badge",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "可拖拽的全局 AI 助手角标组件(Vue 3):自然语言识别菜单与按钮权限意图,自动跳转页面并触发按钮动作",
5
5
  "keywords": [
6
6
  "vue",
@@ -35,10 +35,15 @@
35
35
  "types": "./dist/adapters/vben.d.ts",
36
36
  "default": "./dist/adapters/vben.mjs"
37
37
  },
38
+ "./vite": {
39
+ "types": "./dist/vite.d.ts",
40
+ "default": "./dist/vite.mjs"
41
+ },
38
42
  "./package.json": "./package.json"
39
43
  },
40
44
  "files": [
41
45
  "dist",
46
+ "scripts/postinstall.mjs",
42
47
  "README.md",
43
48
  "CHANGELOG.md",
44
49
  "LICENSE"
@@ -48,6 +53,7 @@
48
53
  },
49
54
  "scripts": {
50
55
  "dev": "vite",
56
+ "postinstall": "node scripts/postinstall.mjs",
51
57
  "build": "tsdown",
52
58
  "preview": "vite preview",
53
59
  "typecheck": "vue-tsc --noEmit",
@@ -64,8 +70,14 @@
64
70
  "prepublishOnly": "npm run pack:check"
65
71
  },
66
72
  "peerDependencies": {
73
+ "vite": ">=5",
67
74
  "vue": "^3.4.0"
68
75
  },
76
+ "peerDependenciesMeta": {
77
+ "vite": {
78
+ "optional": true
79
+ }
80
+ },
69
81
  "devDependencies": {
70
82
  "@types/node": "^24.0.0",
71
83
  "@vitejs/plugin-vue": "^6.0.0",
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * postinstall:安装完成后打印接入指引。
4
+ * 内容只有两步——改代理地址(内置 Vite 插件)、粘 bootstrap 代码(给出文件位置)。
5
+ * CI 环境静默跳过;pnpm 10+ 需先批准构建脚本才会执行(见 README「安装」)。
6
+ */
7
+ import { exit } from 'node:process';
8
+
9
+ if (process.env.CI) {
10
+ exit(0);
11
+ }
12
+
13
+ const BOLD = '\u001B[1m';
14
+ const CYAN = '\u001B[36m';
15
+ const DIM = '\u001B[2m';
16
+ const RESET = '\u001B[0m';
17
+
18
+ const bootstrapSnippet = [
19
+ '// bootstrap.ts 中,app.use(router) 之后',
20
+ "import { createAiAssistantPlugin, createFetchAskClient } from '@hjsy/vue-ai-assistant-badge';",
21
+ "import { useAccessStore } from '@vben/stores';",
22
+ "import { router } from './router';",
23
+ '',
24
+ 'const accessStore = useAccessStore();',
25
+ '',
26
+ 'const ask = createFetchAskClient({',
27
+ " baseUrl: '/v1', // 与内置代理前缀一致,地址由 aiAssistantProxy / VITE_AI_API_URL 决定",
28
+ ' getHeaders: () => ({',
29
+ ' Authorization: accessStore.accessToken ? `Bearer ${accessStore.accessToken}` : \'\',',
30
+ ' }),',
31
+ '});',
32
+ '',
33
+ 'app.use(',
34
+ ' createAiAssistantPlugin({',
35
+ ' ask,',
36
+ ' loadPermissionInfo: async () => ({',
37
+ ' // 登录时已由 fetchUserInfo() 拉取并存入 accessStore,这里直接读',
38
+ ' menus: accessStore.accessMenus,',
39
+ ' permissions: accessStore.accessCodes,',
40
+ ' }),',
41
+ ' hasPermission: (code) => accessStore.accessCodes.includes(code),',
42
+ ' navigate: (path) => router.push(path),',
43
+ ' }),',
44
+ ');',
45
+ ].join('\n');
46
+
47
+ console.log(`
48
+ ${BOLD}@hjsy/vue-ai-assistant-badge${RESET}${DIM} 安装完成,接入只差两步:${RESET}
49
+
50
+ ${BOLD}1. 开发代理已内置,只需指定服务地址${RESET}${DIM}(应用目录下的 vite.config.ts,如 apps/web-antdv-next/vite.config.ts)${RESET}
51
+ ${CYAN} import { aiAssistantProxy } from '@hjsy/vue-ai-assistant-badge/vite';${RESET}
52
+ ${CYAN} // vben 工程放进返回值的 vite.plugins;标准工程放进顶层 plugins${RESET}
53
+ ${CYAN} vite: { plugins: [aiAssistantProxy({ target: 'http://你的AI服务地址:48080' })] }${RESET}
54
+ ${DIM} (target 也可省略,改在 .env.development 配置 VITE_AI_API_URL;默认前缀 /v1、不 rewrite)${RESET}
55
+
56
+ ${BOLD}2. 注册插件${RESET}${DIM}(bootstrap.ts 通常位于应用目录的 src 下,如 apps/web-antdv-next/src/bootstrap.ts)${RESET}
57
+ ${DIM} 把下面代码粘贴到 app.use(router) 之后:${RESET}
58
+ ${bootstrapSnippet.replaceAll('\n', '\n ')}
59
+
60
+ ${DIM}更完整的写法(复用宿主 requestClient / 适配层一行接入)见 docs/VBEN_INTEGRATION.md;${RESET}
61
+ ${DIM}pnpm 10+ 若未看到本提示,先执行 pnpm approve-builds 批准构建脚本。${RESET}
62
+ `);