@vite-plugin-opencode-assistant/opencode 1.0.50 → 1.0.52

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/es/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from "./web.js";
1
+ export * from "./web";
package/es/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export * from "./web.mjs";
@@ -1,36 +1,41 @@
1
- import { c as a } from "./logger.js";
2
- const e = a("OpenCodePluginPageContext");
3
- async function c(n) {
1
+ import { c as s } from "./logger.js";
2
+ const e = s("OpenCodePluginPageContext");
3
+ async function a(o) {
4
4
  try {
5
- const t = await fetch(n, {
5
+ const n = await fetch(o, {
6
6
  method: "GET",
7
7
  headers: { "Content-Type": "application/json" }
8
8
  });
9
- return t.ok ? await t.json() : (e.debug("Failed to fetch page context", { status: t.status }), null);
10
- } catch (t) {
11
- return e.debug("Error fetching page context", { error: t }), null;
9
+ return n.ok ? await n.json() : (e.debug("Failed to fetch page context", { status: n.status }), null);
10
+ } catch (n) {
11
+ return e.debug("Error fetching page context", { error: n }), null;
12
12
  }
13
13
  }
14
- const u = async () => {
14
+ const l = async () => {
15
15
  e.info("PageContextPlugin loading...");
16
- const n = process.env.OPENCODE_CONTEXT_API_URL;
17
- return e.debug("Context API URL:", { contextApiUrl: n }), n ? (e.info("Plugin initialized successfully"), {
18
- "experimental.chat.system.transform": async (t, i) => {
16
+ const o = process.env.OPENCODE_CONTEXT_API_URL;
17
+ return e.debug("Context API URL:", { contextApiUrl: o }), o ? (e.info("Plugin initialized successfully"), {
18
+ "experimental.chat.system.transform": async (n, r) => {
19
19
  e.debug("System transform hook called");
20
- const o = await c(n);
21
- e.debug("Page context fetched", { pageContext: o });
22
- let r = "";
23
- o && (r = `
24
- ## 用户当前浏览的页面
25
-
26
- **这里的上下文为最高优先级,任何情况下都不能被覆盖**
27
-
28
- - **页面 URL**: ${o.url || "未知"}
29
- - **页面标题**: ${o.title || "未知"}
30
- `);
31
- const s = `
20
+ const t = await a(o);
21
+ e.debug("Page context fetched", { pageContext: t });
22
+ const i = `
32
23
  你是一个专业的前端开发助手,运行在 **OpenCode** 平台中,并通过 **vite-plugin-opencode-assistant** 插件集成到用户的 Vite 开发环境。
33
- ${r}
24
+
25
+ ## ⚠️ 重要:页面上下文优先级规则
26
+
27
+ **当用户在不同页面提问时,你必须优先根据用户当前浏览页面的上下文来理解问题,而不是依赖会话历史记录。**
28
+
29
+ 用户可能在不同页面之间切换,每次提问都应该基于当前页面上下文:
30
+ - **页面 URL**: ${(t == null ? void 0 : t.url) || "未知"}
31
+ - **页面标题**: ${(t == null ? void 0 : t.title) || "未知"}
32
+
33
+ **理解问题的优先级顺序:**
34
+ 1. **当前页面上下文**(最高优先级) - 根据用户当前所在页面的 URL 和标题理解问题背景
35
+ 2. **用户选中的元素** - 如果用户选中了页面元素,这些元素信息是理解问题的关键
36
+ 3. **用户当前输入** - 用户本次发送的具体问题内容
37
+ 4. **会话历史**(最低优先级) - 仅作为辅助参考,不应优先于当前页面上下文
38
+
34
39
  ## 你的工作环境
35
40
 
36
41
  ### 架构说明
@@ -96,11 +101,11 @@ ${r}
96
101
  4. **HTTP 请求成功判断(强制)**
97
102
  判断请求成功时,不要只看 HTTP 状态码!HTTP 状态码 200 并不代表业务逻辑成功。必须获取接口的详细响应内容,检查响应体中的业务状态码或错误信息。在确认请求成功之前,始终解析并检查响应体的完整内容
98
103
  `.trim();
99
- i.system.push(s);
104
+ r.system.push(i);
100
105
  }
101
106
  }) : (e.warn("OPENCODE_CONTEXT_API_URL is not set, page context plugin will not work"), {});
102
107
  };
103
108
  export {
104
- u as PageContextPlugin,
105
- u as default
109
+ l as PageContextPlugin,
110
+ l as default
106
111
  };
@@ -0,0 +1,145 @@
1
+ var __async = (__this, __arguments, generator) => {
2
+ return new Promise((resolve, reject) => {
3
+ var fulfilled = (value) => {
4
+ try {
5
+ step(generator.next(value));
6
+ } catch (e) {
7
+ reject(e);
8
+ }
9
+ };
10
+ var rejected = (value) => {
11
+ try {
12
+ step(generator.throw(value));
13
+ } catch (e) {
14
+ reject(e);
15
+ }
16
+ };
17
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
+ step((generator = generator.apply(__this, __arguments)).next());
19
+ });
20
+ };
21
+ import { createLogger } from "@vite-plugin-opencode-assistant/shared";
22
+ const log = createLogger("OpenCodePluginPageContext");
23
+ function fetchPageContext(contextApiUrl) {
24
+ return __async(this, null, function* () {
25
+ try {
26
+ const response = yield fetch(contextApiUrl, {
27
+ method: "GET",
28
+ headers: { "Content-Type": "application/json" }
29
+ });
30
+ if (!response.ok) {
31
+ log.debug("Failed to fetch page context", { status: response.status });
32
+ return null;
33
+ }
34
+ return yield response.json();
35
+ } catch (error) {
36
+ log.debug("Error fetching page context", { error });
37
+ return null;
38
+ }
39
+ });
40
+ }
41
+ const PageContextPlugin = () => __async(null, null, function* () {
42
+ log.info("PageContextPlugin loading...");
43
+ const contextApiUrl = process.env.OPENCODE_CONTEXT_API_URL;
44
+ log.debug("Context API URL:", { contextApiUrl });
45
+ if (!contextApiUrl) {
46
+ log.warn("OPENCODE_CONTEXT_API_URL is not set, page context plugin will not work");
47
+ return {};
48
+ }
49
+ log.info("Plugin initialized successfully");
50
+ return {
51
+ "experimental.chat.system.transform": (_input, output) => __async(null, null, function* () {
52
+ log.debug("System transform hook called");
53
+ const pageContext = yield fetchPageContext(contextApiUrl);
54
+ log.debug("Page context fetched", { pageContext });
55
+ const systemPrompt = `
56
+ \u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u524D\u7AEF\u5F00\u53D1\u52A9\u624B\uFF0C\u8FD0\u884C\u5728 **OpenCode** \u5E73\u53F0\u4E2D\uFF0C\u5E76\u901A\u8FC7 **vite-plugin-opencode-assistant** \u63D2\u4EF6\u96C6\u6210\u5230\u7528\u6237\u7684 Vite \u5F00\u53D1\u73AF\u5883\u3002
57
+
58
+ ## \u26A0\uFE0F \u91CD\u8981\uFF1A\u9875\u9762\u4E0A\u4E0B\u6587\u4F18\u5148\u7EA7\u89C4\u5219
59
+
60
+ **\u5F53\u7528\u6237\u5728\u4E0D\u540C\u9875\u9762\u63D0\u95EE\u65F6\uFF0C\u4F60\u5FC5\u987B\u4F18\u5148\u6839\u636E\u7528\u6237\u5F53\u524D\u6D4F\u89C8\u9875\u9762\u7684\u4E0A\u4E0B\u6587\u6765\u7406\u89E3\u95EE\u9898\uFF0C\u800C\u4E0D\u662F\u4F9D\u8D56\u4F1A\u8BDD\u5386\u53F2\u8BB0\u5F55\u3002**
61
+
62
+ \u7528\u6237\u53EF\u80FD\u5728\u4E0D\u540C\u9875\u9762\u4E4B\u95F4\u5207\u6362\uFF0C\u6BCF\u6B21\u63D0\u95EE\u90FD\u5E94\u8BE5\u57FA\u4E8E\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587\uFF1A
63
+ - **\u9875\u9762 URL**: ${(pageContext == null ? void 0 : pageContext.url) || "\u672A\u77E5"}
64
+ - **\u9875\u9762\u6807\u9898**: ${(pageContext == null ? void 0 : pageContext.title) || "\u672A\u77E5"}
65
+
66
+ **\u7406\u89E3\u95EE\u9898\u7684\u4F18\u5148\u7EA7\u987A\u5E8F\uFF1A**
67
+ 1. **\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587**\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\uFF09 - \u6839\u636E\u7528\u6237\u5F53\u524D\u6240\u5728\u9875\u9762\u7684 URL \u548C\u6807\u9898\u7406\u89E3\u95EE\u9898\u80CC\u666F
68
+ 2. **\u7528\u6237\u9009\u4E2D\u7684\u5143\u7D20** - \u5982\u679C\u7528\u6237\u9009\u4E2D\u4E86\u9875\u9762\u5143\u7D20\uFF0C\u8FD9\u4E9B\u5143\u7D20\u4FE1\u606F\u662F\u7406\u89E3\u95EE\u9898\u7684\u5173\u952E
69
+ 3. **\u7528\u6237\u5F53\u524D\u8F93\u5165** - \u7528\u6237\u672C\u6B21\u53D1\u9001\u7684\u5177\u4F53\u95EE\u9898\u5185\u5BB9
70
+ 4. **\u4F1A\u8BDD\u5386\u53F2**\uFF08\u6700\u4F4E\u4F18\u5148\u7EA7\uFF09 - \u4EC5\u4F5C\u4E3A\u8F85\u52A9\u53C2\u8003\uFF0C\u4E0D\u5E94\u4F18\u5148\u4E8E\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587
71
+
72
+ ## \u4F60\u7684\u5DE5\u4F5C\u73AF\u5883
73
+
74
+ ### \u67B6\u6784\u8BF4\u660E
75
+
76
+ \u4F60\u8FD0\u884C\u5728 OpenCode \u670D\u52A1\u7AEF\uFF0C\u4F46\u901A\u8FC7 **iframe \u5D4C\u5165**\u7684\u65B9\u5F0F\u51FA\u73B0\u5728\u7528\u6237\u6B63\u5728\u5F00\u53D1\u7684\u7F51\u9875\u4E0A\uFF1A
77
+
78
+ \`\`\`
79
+ \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
80
+ \u2502 \u7528\u6237\u6B63\u5728\u5F00\u53D1\u7684\u7F51\u9875 (\u8FD0\u884C\u5728 Vite Dev Server) \u2502
81
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502
82
+ \u2502 \u2502 \u9875\u9762\u5185\u5BB9 \u2502 \u2502
83
+ \u2502 \u2502 \u2502 \u2502
84
+ \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502
85
+ \u2502 \u2502 \u2502 OpenCode iframe (\u4F60\u7684\u754C\u9762) \u2502 \u2190 \u6D6E\u52A8\u804A\u5929\u7A97\u53E3 \u2502 \u2502
86
+ \u2502 \u2502 \u2502 \u7528\u6237\u5728\u8FD9\u91CC\u4E0E\u4F60\u5BF9\u8BDD \u2502 \u2502 \u2502
87
+ \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502
88
+ \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502
89
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
90
+ \`\`\`
91
+
92
+ ## \u5DE5\u4F5C\u6D41\u7A0B
93
+
94
+ \u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B\u987A\u5E8F\u5904\u7406\u7528\u6237\u8BF7\u6C42\uFF1A
95
+
96
+ ### 1. \u5B9A\u4F4D\u8282\u70B9\u4F4D\u7F6E\uFF08\u5F3A\u5236\uFF09
97
+
98
+ \u5F53\u7528\u6237\u9009\u4E2D\u4E86\u9875\u9762\u8282\u70B9\u65F6\uFF0C**\u5728\u5904\u7406\u7528\u6237\u8BF7\u6C42\u4E4B\u524D**\uFF0C\u4F60\u5FC5\u987B\u5148\u786E\u8BA4\u8FD9\u4E9B\u8282\u70B9\u5728\u9879\u76EE\u4E2D\u7684\u4F4D\u7F6E\u3002\u9009\u4E2D\u7684\u8282\u70B9\u4FE1\u606F\u5305\u542B\u4EE5\u4E0B\u5B57\u6BB5\uFF1A
99
+
100
+ - \`filePath\`: \u8282\u70B9\u5BF9\u5E94\u7684\u6E90\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u80FD\u4E3A\u7A7A\uFF09
101
+ - \`line\` / \`column\`: \u8282\u70B9\u5728\u6E90\u6587\u4EF6\u4E2D\u7684\u4F4D\u7F6E\uFF08\u53EF\u80FD\u4E3A\u7A7A\uFF09
102
+ - \`innerText\`: \u8282\u70B9\u7684\u6587\u672C\u5185\u5BB9
103
+ - \`description\`: \u8282\u70B9\u63CF\u8FF0\uFF08\u6807\u7B7E\u540D+\u9009\u62E9\u5668\uFF09
104
+
105
+ **\u5B9A\u4F4D\u6B65\u9AA4\uFF08\u6309\u4F18\u5148\u7EA7\uFF09\uFF1A**
106
+
107
+ 1. **\u68C0\u67E5\u5DF2\u6709\u6587\u4EF6\u8DEF\u5F84**\uFF1A\u5982\u679C \`filePath\` \u5B58\u5728\uFF0C\u4F18\u5148\u4F7F\u7528\u8BE5\u8DEF\u5F84\u76F4\u63A5\u5B9A\u4F4D\u6587\u4EF6
108
+ 2. **\u4F7F\u7528 Chrome DevTools MCP**\uFF1A\u5982\u679C \`filePath\` \u4E3A\u7A7A\u6216\u9700\u8981\u66F4\u591A\u4FE1\u606F\uFF0C\u901A\u8FC7\u6D4F\u89C8\u5668\u5FEB\u7167\u83B7\u53D6\u8282\u70B9\u7684 DOM \u7ED3\u6784\u3001\u6837\u5F0F\u3001\u4E8B\u4EF6\u7ED1\u5B9A\u7B49\u8BE6\u7EC6\u4FE1\u606F
109
+ 3. **\u6587\u4EF6\u641C\u7D22\u8F85\u52A9**\uFF1A\u6839\u636E \`innerText\` \u6216 \`description\` \u5728\u9879\u76EE\u4E2D\u641C\u7D22\u5339\u914D\u7684\u7EC4\u4EF6/\u5143\u7D20
110
+
111
+ \u5728\u660E\u786E\u77E5\u9053\u8282\u70B9\u4F4D\u7F6E\u540E\uFF0C\u518D\u5904\u7406\u7528\u6237\u8BF7\u6C42\u3002
112
+
113
+ ### 2. \u7406\u89E3\u4E0A\u4E0B\u6587
114
+
115
+ \u5C06\u9875\u9762 URL\u3001\u6807\u9898\u548C\u9009\u4E2D\u8282\u70B9\u4FE1\u606F\u4F5C\u4E3A\u7528\u6237\u8BF7\u6C42\u7684\u80CC\u666F\uFF0C\u5E2E\u52A9\u7406\u89E3\u7528\u6237\u7684\u771F\u5B9E\u610F\u56FE\u3002
116
+
117
+ ### 3. \u76F4\u63A5\u884C\u52A8
118
+
119
+ \u5728\u660E\u786E\u8282\u70B9\u4F4D\u7F6E\u540E\uFF0C\u9488\u5BF9\u7528\u6237\u7684\u5B9E\u9645\u8BF7\u6C42\u7ED9\u51FA\u6E05\u6670\u3001\u53EF\u6267\u884C\u7684\u65B9\u6848\u3002
120
+
121
+ ## \u5DE5\u5177\u4F7F\u7528\u6307\u5357
122
+
123
+ ### Chrome DevTools Mcp
124
+
125
+ 1. **\u786E\u4FDD\u64CD\u4F5C\u6B63\u786E\u9875\u9762\uFF08\u5F3A\u5236\uFF09**
126
+ \u5728\u4F7F\u7528 Chrome DevTools Mcp \u6267\u884C\u4EFB\u4F55\u4E0E\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u76F8\u5173\u7684\u4EFB\u52A1\u4E4B\u524D\uFF0C\u5FC5\u987B\u5148\u786E\u8BA4\u5F53\u524D\u64CD\u4F5C\u7684\u9875\u9762\u5C31\u662F\u7528\u6237\u6B63\u5728\u6D4F\u89C8\u7684\u9875\u9762\u3002\u5982\u679C\u4E0D\u786E\u5B9A\uFF0C\u5E94\u5148\u83B7\u53D6\u5F53\u524D\u9875\u9762 URL \u5E76\u4E0E\u4E0A\u4E0B\u6587\u4E2D\u7684\u9875\u9762 URL \u8FDB\u884C\u6BD4\u5BF9\u3002
127
+
128
+ 2. **\u5FEB\u7167\u83B7\u53D6**
129
+ \u5728\u6CA1\u6709\u83B7\u53D6\u5230\u9700\u8981\u7684\u8282\u70B9\u4FE1\u606F\u65F6\uFF0C\u4F7F\u7528 verbose \u53C2\u6570\u6765\u83B7\u53D6\u66F4\u8BE6\u7EC6\u7684\u8282\u70B9\u4FE1\u606F\u3002\u5982\u679C\u8BBE\u7F6E\u4E86 verbose \u53C2\u6570\u8FD8\u662F\u6CA1\u6709\u83B7\u53D6\u5230\u8282\u70B9\u4FE1\u606F\uFF0C\u518D\u5C1D\u8BD5\u8003\u8651\u5176\u4ED6\u65B9\u6848\u3002
130
+
131
+ 3. **\u5355\u9875\u5E94\u7528\uFF08SPA\uFF09\u7279\u6027**
132
+ \u5982\u679C\u7528\u6237\u5F00\u53D1\u7684\u662F\u5355\u9875\u5E94\u7528\uFF08SPA\uFF09\uFF0C\u6267\u884C\u4EFB\u52A1\u5927\u90E8\u5206\u60C5\u51B5\u4E0B\u4E0D\u9700\u8981\u5237\u65B0\u9875\u9762\u3002
133
+
134
+ 4. **HTTP \u8BF7\u6C42\u6210\u529F\u5224\u65AD\uFF08\u5F3A\u5236\uFF09**
135
+ \u5224\u65AD\u8BF7\u6C42\u6210\u529F\u65F6\uFF0C\u4E0D\u8981\u53EA\u770B HTTP \u72B6\u6001\u7801\uFF01HTTP \u72B6\u6001\u7801 200 \u5E76\u4E0D\u4EE3\u8868\u4E1A\u52A1\u903B\u8F91\u6210\u529F\u3002\u5FC5\u987B\u83B7\u53D6\u63A5\u53E3\u7684\u8BE6\u7EC6\u54CD\u5E94\u5185\u5BB9\uFF0C\u68C0\u67E5\u54CD\u5E94\u4F53\u4E2D\u7684\u4E1A\u52A1\u72B6\u6001\u7801\u6216\u9519\u8BEF\u4FE1\u606F\u3002\u5728\u786E\u8BA4\u8BF7\u6C42\u6210\u529F\u4E4B\u524D\uFF0C\u59CB\u7EC8\u89E3\u6790\u5E76\u68C0\u67E5\u54CD\u5E94\u4F53\u7684\u5B8C\u6574\u5185\u5BB9
136
+ `.trim();
137
+ output.system.push(systemPrompt);
138
+ })
139
+ };
140
+ });
141
+ var page_context_default = PageContextPlugin;
142
+ export {
143
+ PageContextPlugin,
144
+ page_context_default as default
145
+ };
@@ -0,0 +1,123 @@
1
+ var __async = (__this, __arguments, generator) => {
2
+ return new Promise((resolve, reject) => {
3
+ var fulfilled = (value) => {
4
+ try {
5
+ step(generator.next(value));
6
+ } catch (e) {
7
+ reject(e);
8
+ }
9
+ };
10
+ var rejected = (value) => {
11
+ try {
12
+ step(generator.throw(value));
13
+ } catch (e) {
14
+ reject(e);
15
+ }
16
+ };
17
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
+ step((generator = generator.apply(__this, __arguments)).next());
19
+ });
20
+ };
21
+ import { tool } from "@opencode-ai/plugin";
22
+ import { createLogger } from "@vite-plugin-opencode-assistant/shared";
23
+ const log = createLogger("OpenCodePluginViteLogs");
24
+ const ViteLogsPlugin = () => __async(null, null, function* () {
25
+ log.info("ViteLogsPlugin loading...");
26
+ const logsApiUrl = process.env.OPENCODE_VITE_LOGS_API_URL;
27
+ log.debug("Vite Logs API URL:", { logsApiUrl });
28
+ if (!logsApiUrl) {
29
+ log.warn("OPENCODE_VITE_LOGS_API_URL is not set, vite logs plugin will not work");
30
+ return {};
31
+ }
32
+ log.info("Plugin initialized successfully");
33
+ const getViteDevLogsTool = tool({
34
+ description: `\u83B7\u53D6 Vite \u5F00\u53D1\u670D\u52A1\u5668\u7684\u8FD0\u884C\u65E5\u5FD7\u3002
35
+
36
+ **\u4F55\u65F6\u4F7F\u7528\u6B64\u5DE5\u5177**\uFF1A
37
+ - \u7528\u6237\u62A5\u544A"\u9875\u9762\u6CA1\u66F4\u65B0"\u3001"\u70ED\u66F4\u65B0\u4E0D\u5DE5\u4F5C"\u3001"HMR \u5931\u6548"\u65F6
38
+ - \u6784\u5EFA\u62A5\u9519\u6216\u7F16\u8BD1\u5931\u8D25\uFF0C\u9700\u8981\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F
39
+ - \u9875\u9762\u767D\u5C4F\u3001\u6837\u5F0F\u4E22\u5931\u3001\u6A21\u5757\u52A0\u8F7D\u5931\u8D25\u7B49\u5F00\u53D1\u95EE\u9898
40
+ - \u7528\u6237\u63D0\u5230"\u5F00\u53D1\u670D\u52A1\u5668\u6709\u95EE\u9898"\u3001"vite \u62A5\u9519"
41
+ - \u9700\u8981\u786E\u8BA4\u6700\u8FD1\u7684\u6587\u4EF6\u53D8\u66F4\u662F\u5426\u88AB Vite \u6B63\u786E\u5904\u7406
42
+
43
+ **\u65E5\u5FD7\u5185\u5BB9**\uFF1A
44
+ - Vite HMR \u70ED\u66F4\u65B0\u65E5\u5FD7\uFF08\u54EA\u4E9B\u6587\u4EF6\u88AB\u66F4\u65B0\u3001\u66F4\u65B0\u72B6\u6001\uFF09
45
+ - \u6784\u5EFA\u7F16\u8BD1\u65E5\u5FD7\uFF08\u9519\u8BEF\u3001\u8B66\u544A\u3001\u6210\u529F\u4FE1\u606F\uFF09
46
+ - OpenCode Web \u8FDB\u7A0B\u8F93\u51FA
47
+ - \u63D2\u4EF6\u8FD0\u884C\u65E5\u5FD7
48
+
49
+ \u65E5\u5FD7\u4FDD\u5B58\u5728\u5185\u5B58\u7F13\u51B2\u533A\uFF08\u6700\u8FD1 500 \u6761\uFF09\u3002`,
50
+ args: {
51
+ level: tool.schema.string().optional().describe(
52
+ "\u65E5\u5FD7\u7EA7\u522B\u8FC7\u6EE4\uFF1Aerror(\u9519\u8BEF)\u3001warn(\u8B66\u544A)\u3001info(\u4FE1\u606F)\u3001debug(\u8C03\u8BD5)\u3001log(\u666E\u901A)\u3002\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u5982 'error,warn'"
53
+ ),
54
+ limit: tool.schema.number().int().min(1).max(200).optional().default(50).describe("\u8FD4\u56DE\u6761\u6570\uFF0C\u9ED8\u8BA4 50\uFF0C\u6700\u5927 200"),
55
+ source: tool.schema.string().optional().describe("\u6765\u6E90\u8FC7\u6EE4\uFF1Aconsole(\u63A7\u5236\u53F0)\u3001opencode-stdout(\u670D\u52A1\u8F93\u51FA)\u3001opencode-stderr(\u670D\u52A1\u9519\u8BEF)")
56
+ },
57
+ execute(args, context) {
58
+ return __async(this, null, function* () {
59
+ const { level, limit, source } = args;
60
+ log.debug("get_vite_dev_logs called", {
61
+ args,
62
+ sessionID: context.sessionID,
63
+ directory: context.directory
64
+ });
65
+ try {
66
+ const url = new URL(logsApiUrl);
67
+ if (level) url.searchParams.set("level", level);
68
+ if (limit) url.searchParams.set("limit", String(limit));
69
+ if (source) url.searchParams.set("source", source);
70
+ log.debug("Fetching logs from", { url: url.toString() });
71
+ const response = yield fetch(url.toString(), {
72
+ method: "GET",
73
+ headers: { Accept: "application/json" },
74
+ signal: context.abort
75
+ });
76
+ if (!response.ok) {
77
+ const errorText = yield response.text();
78
+ log.error("Failed to fetch logs", { status: response.status, error: errorText });
79
+ return `\u83B7\u53D6\u65E5\u5FD7\u5931\u8D25: HTTP ${response.status} - ${errorText}`;
80
+ }
81
+ const data = yield response.json();
82
+ log.debug("Logs fetched successfully", {
83
+ count: data.logs.length,
84
+ total: data.meta.total
85
+ });
86
+ if (data.logs.length === 0) {
87
+ return `\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u65E5\u5FD7\uFF08\u7F13\u51B2\u533A\u5171 ${data.meta.total} \u6761\uFF09\u3002
88
+
89
+ \u5EFA\u8BAE\uFF1A
90
+ - \u4E0D\u6307\u5B9A\u53C2\u6570\u83B7\u53D6\u6240\u6709\u65E5\u5FD7
91
+ - \u4F7F\u7528 level=error,warn \u83B7\u53D6\u9519\u8BEF\u548C\u8B66\u544A`;
92
+ }
93
+ const formattedLogs = data.logs.map((entry) => {
94
+ const time = new Date(entry.timestamp).toLocaleTimeString();
95
+ const levelIcon = entry.level === "error" ? "\u274C" : entry.level === "warn" ? "\u26A0\uFE0F" : entry.level === "info" ? "\u2139\uFE0F" : "";
96
+ return `${time} ${levelIcon} ${entry.message}`;
97
+ }).join("\n");
98
+ return `Vite \u5F00\u53D1\u670D\u52A1\u5668\u65E5\u5FD7\uFF08${data.meta.returned}/${data.meta.total} \u6761\uFF09\uFF1A
99
+
100
+ ${formattedLogs}`;
101
+ } catch (error) {
102
+ const err = error;
103
+ if (context.abort.aborted) {
104
+ log.debug("Request aborted");
105
+ return "\u8BF7\u6C42\u5DF2\u53D6\u6D88";
106
+ }
107
+ log.error("Error fetching vite logs", { error: err });
108
+ return `\u83B7\u53D6\u65E5\u5FD7\u65F6\u53D1\u751F\u9519\u8BEF: ${err.message}`;
109
+ }
110
+ });
111
+ }
112
+ });
113
+ return {
114
+ tool: {
115
+ get_vite_dev_logs: getViteDevLogsTool
116
+ }
117
+ };
118
+ });
119
+ var vite_logs_default = ViteLogsPlugin;
120
+ export {
121
+ ViteLogsPlugin,
122
+ vite_logs_default as default
123
+ };
@@ -14,8 +14,8 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
  var lib_exports = {};
16
16
  module.exports = __toCommonJS(lib_exports);
17
- __reExport(lib_exports, require("./web.js"), module.exports);
17
+ __reExport(lib_exports, require("./web.cjs"), module.exports);
18
18
  // Annotate the CommonJS export names for ESM import in node:
19
19
  0 && (module.exports = {
20
- ...require("./web.js")
20
+ ...require("./web.cjs")
21
21
  });
package/lib/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from "./web.js";
1
+ export * from "./web";
@@ -75,20 +75,23 @@ const PageContextPlugin = () => __async(null, null, function* () {
75
75
  log.debug("System transform hook called");
76
76
  const pageContext = yield fetchPageContext(contextApiUrl);
77
77
  log.debug("Page context fetched", { pageContext });
78
- let currentPageSection = "";
79
- if (pageContext) {
80
- currentPageSection = `
81
- ## \u7528\u6237\u5F53\u524D\u6D4F\u89C8\u7684\u9875\u9762
82
-
83
- **\u8FD9\u91CC\u7684\u4E0A\u4E0B\u6587\u4E3A\u6700\u9AD8\u4F18\u5148\u7EA7\uFF0C\u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u4E0D\u80FD\u88AB\u8986\u76D6**
84
-
85
- - **\u9875\u9762 URL**: ${pageContext.url || "\u672A\u77E5"}
86
- - **\u9875\u9762\u6807\u9898**: ${pageContext.title || "\u672A\u77E5"}
87
- `;
88
- }
89
78
  const systemPrompt = `
90
79
  \u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u524D\u7AEF\u5F00\u53D1\u52A9\u624B\uFF0C\u8FD0\u884C\u5728 **OpenCode** \u5E73\u53F0\u4E2D\uFF0C\u5E76\u901A\u8FC7 **vite-plugin-opencode-assistant** \u63D2\u4EF6\u96C6\u6210\u5230\u7528\u6237\u7684 Vite \u5F00\u53D1\u73AF\u5883\u3002
91
- ${currentPageSection}
80
+
81
+ ## \u26A0\uFE0F \u91CD\u8981\uFF1A\u9875\u9762\u4E0A\u4E0B\u6587\u4F18\u5148\u7EA7\u89C4\u5219
82
+
83
+ **\u5F53\u7528\u6237\u5728\u4E0D\u540C\u9875\u9762\u63D0\u95EE\u65F6\uFF0C\u4F60\u5FC5\u987B\u4F18\u5148\u6839\u636E\u7528\u6237\u5F53\u524D\u6D4F\u89C8\u9875\u9762\u7684\u4E0A\u4E0B\u6587\u6765\u7406\u89E3\u95EE\u9898\uFF0C\u800C\u4E0D\u662F\u4F9D\u8D56\u4F1A\u8BDD\u5386\u53F2\u8BB0\u5F55\u3002**
84
+
85
+ \u7528\u6237\u53EF\u80FD\u5728\u4E0D\u540C\u9875\u9762\u4E4B\u95F4\u5207\u6362\uFF0C\u6BCF\u6B21\u63D0\u95EE\u90FD\u5E94\u8BE5\u57FA\u4E8E\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587\uFF1A
86
+ - **\u9875\u9762 URL**: ${(pageContext == null ? void 0 : pageContext.url) || "\u672A\u77E5"}
87
+ - **\u9875\u9762\u6807\u9898**: ${(pageContext == null ? void 0 : pageContext.title) || "\u672A\u77E5"}
88
+
89
+ **\u7406\u89E3\u95EE\u9898\u7684\u4F18\u5148\u7EA7\u987A\u5E8F\uFF1A**
90
+ 1. **\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587**\uFF08\u6700\u9AD8\u4F18\u5148\u7EA7\uFF09 - \u6839\u636E\u7528\u6237\u5F53\u524D\u6240\u5728\u9875\u9762\u7684 URL \u548C\u6807\u9898\u7406\u89E3\u95EE\u9898\u80CC\u666F
91
+ 2. **\u7528\u6237\u9009\u4E2D\u7684\u5143\u7D20** - \u5982\u679C\u7528\u6237\u9009\u4E2D\u4E86\u9875\u9762\u5143\u7D20\uFF0C\u8FD9\u4E9B\u5143\u7D20\u4FE1\u606F\u662F\u7406\u89E3\u95EE\u9898\u7684\u5173\u952E
92
+ 3. **\u7528\u6237\u5F53\u524D\u8F93\u5165** - \u7528\u6237\u672C\u6B21\u53D1\u9001\u7684\u5177\u4F53\u95EE\u9898\u5185\u5BB9
93
+ 4. **\u4F1A\u8BDD\u5386\u53F2**\uFF08\u6700\u4F4E\u4F18\u5148\u7EA7\uFF09 - \u4EC5\u4F5C\u4E3A\u8F85\u52A9\u53C2\u8003\uFF0C\u4E0D\u5E94\u4F18\u5148\u4E8E\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587
94
+
92
95
  ## \u4F60\u7684\u5DE5\u4F5C\u73AF\u5883
93
96
 
94
97
  ### \u67B6\u6784\u8BF4\u660E
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@vite-plugin-opencode-assistant/opencode",
3
- "version": "1.0.50",
3
+ "version": "1.0.52",
4
4
  "type": "module",
5
- "main": "lib/index.js",
6
- "module": "es/index.js",
5
+ "main": "lib/index.cjs",
6
+ "module": "es/index.mjs",
7
7
  "types": "es/index.d.ts",
8
8
  "files": [
9
9
  "es",
@@ -12,8 +12,8 @@
12
12
  "exports": {
13
13
  ".": {
14
14
  "types": "./es/index.d.ts",
15
- "import": "./es/index.js",
16
- "require": "./lib/index.js"
15
+ "import": "./es/index.mjs",
16
+ "require": "./lib/index.cjs"
17
17
  }
18
18
  },
19
19
  "publishConfig": {
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "execa": "^9.6.1",
25
- "@vite-plugin-opencode-assistant/shared": "1.0.50"
25
+ "@vite-plugin-opencode-assistant/shared": "1.0.52"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@opencode-ai/plugin": "^1.3.15",
package/es/index.js DELETED
@@ -1 +0,0 @@
1
- export * from "./web.js";
File without changes
File without changes
File without changes