@vite-plugin-opencode-assistant/opencode 1.0.63 → 1.0.65
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.js +1 -0
- package/es/plugins/page-context.js +97 -74
- package/es/plugins/service-logs.js +46 -158
- package/es/plugins/vite-logs.js +90 -67
- package/es/{web.mjs → web.js} +1 -1
- package/lib/{index.cjs → index.js} +2 -2
- package/lib/{web.cjs → web.js} +1 -1
- package/package.json +7 -7
- package/es/index.mjs +0 -1
- package/es/plugins/logger.js +0 -255
- package/es/plugins/page-context.mjs +0 -151
- package/es/plugins/service-logs.mjs +0 -113
- package/es/plugins/vite-logs.mjs +0 -123
- /package/lib/plugins/{page-context.cjs → page-context.js} +0 -0
- /package/lib/plugins/{service-logs.cjs → service-logs.js} +0 -0
- /package/lib/plugins/{vite-logs.cjs → vite-logs.js} +0 -0
|
@@ -1,151 +0,0 @@
|
|
|
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\u7981\u6B62\u4F9D\u8D56\u4F1A\u8BDD\u5386\u53F2\u8BB0\u5F55\u6216\u5176\u4ED6\u4E0A\u4E0B\u6587\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
|
-
|
|
64
|
-
**\u8FD9\u91CC\u7684\u4E0A\u4E0B\u6587\u4E3A\u6700\u9AD8\u4F18\u5148\u7EA7\uFF0C\u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u4E0D\u80FD\u88AB\u8986\u76D6**
|
|
65
|
-
|
|
66
|
-
- **\u9875\u9762 URL**: ${(pageContext == null ? void 0 : pageContext.url) || "\u672A\u77E5"}
|
|
67
|
-
- **\u9875\u9762\u6807\u9898**: ${(pageContext == null ? void 0 : pageContext.title) || "\u672A\u77E5"}
|
|
68
|
-
|
|
69
|
-
**\u7406\u89E3\u95EE\u9898\u7684\u4F18\u5148\u7EA7\u987A\u5E8F\uFF1A**
|
|
70
|
-
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
|
|
71
|
-
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
|
|
72
|
-
3. **\u7528\u6237\u5F53\u524D\u8F93\u5165** - \u7528\u6237\u672C\u6B21\u53D1\u9001\u7684\u5177\u4F53\u95EE\u9898\u5185\u5BB9
|
|
73
|
-
4. **\u4F1A\u8BDD\u5386\u53F2**\uFF08\u6700\u4F4E\u4F18\u5148\u7EA7\uFF09 - \u4EC5\u4F5C\u4E3A\u8F85\u52A9\u53C2\u8003\uFF0C\u7EDD\u4E0D\u80FD\u4F18\u5148\u4E8E\u5F53\u524D\u9875\u9762\u4E0A\u4E0B\u6587
|
|
74
|
-
|
|
75
|
-
## \u4F60\u7684\u5DE5\u4F5C\u73AF\u5883
|
|
76
|
-
|
|
77
|
-
### \u67B6\u6784\u8BF4\u660E
|
|
78
|
-
|
|
79
|
-
\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
|
|
80
|
-
|
|
81
|
-
\`\`\`
|
|
82
|
-
\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
|
|
83
|
-
\u2502 \u7528\u6237\u6B63\u5728\u5F00\u53D1\u7684\u7F51\u9875 (\u8FD0\u884C\u5728 Vite Dev Server) \u2502
|
|
84
|
-
\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
|
|
85
|
-
\u2502 \u2502 \u9875\u9762\u5185\u5BB9 \u2502 \u2502
|
|
86
|
-
\u2502 \u2502 \u2502 \u2502
|
|
87
|
-
\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
|
|
88
|
-
\u2502 \u2502 \u2502 OpenCode iframe (\u4F60\u7684\u754C\u9762) \u2502 \u2190 \u6D6E\u52A8\u804A\u5929\u7A97\u53E3 \u2502 \u2502
|
|
89
|
-
\u2502 \u2502 \u2502 \u7528\u6237\u5728\u8FD9\u91CC\u4E0E\u4F60\u5BF9\u8BDD \u2502 \u2502 \u2502
|
|
90
|
-
\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
|
|
91
|
-
\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
|
|
92
|
-
\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
|
|
93
|
-
\`\`\`
|
|
94
|
-
|
|
95
|
-
## \u5DE5\u4F5C\u6D41\u7A0B
|
|
96
|
-
|
|
97
|
-
\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B\u987A\u5E8F\u5904\u7406\u7528\u6237\u8BF7\u6C42\uFF1A
|
|
98
|
-
|
|
99
|
-
### 1. \u5B9A\u4F4D\u8282\u70B9\u4F4D\u7F6E\uFF08\u5F3A\u5236\uFF09
|
|
100
|
-
|
|
101
|
-
\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
|
|
102
|
-
|
|
103
|
-
- \`filePath\`: \u8282\u70B9\u5BF9\u5E94\u7684\u6E90\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u80FD\u4E3A\u7A7A\uFF09
|
|
104
|
-
- \`line\` / \`column\`: \u8282\u70B9\u5728\u6E90\u6587\u4EF6\u4E2D\u7684\u4F4D\u7F6E\uFF08\u53EF\u80FD\u4E3A\u7A7A\uFF09
|
|
105
|
-
- \`innerText\`: \u8282\u70B9\u7684\u6587\u672C\u5185\u5BB9
|
|
106
|
-
- \`description\`: \u8282\u70B9\u63CF\u8FF0\uFF08\u6807\u7B7E\u540D+\u9009\u62E9\u5668\uFF09
|
|
107
|
-
|
|
108
|
-
**\u5B9A\u4F4D\u6B65\u9AA4\uFF08\u6309\u4F18\u5148\u7EA7\uFF09\uFF1A**
|
|
109
|
-
|
|
110
|
-
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
|
|
111
|
-
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
|
|
112
|
-
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
|
|
113
|
-
|
|
114
|
-
\u5728\u660E\u786E\u77E5\u9053\u8282\u70B9\u4F4D\u7F6E\u540E\uFF0C\u518D\u5904\u7406\u7528\u6237\u8BF7\u6C42\u3002
|
|
115
|
-
|
|
116
|
-
### 2. \u7406\u89E3\u4E0A\u4E0B\u6587
|
|
117
|
-
|
|
118
|
-
\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
|
|
119
|
-
|
|
120
|
-
### 3. \u76F4\u63A5\u884C\u52A8
|
|
121
|
-
|
|
122
|
-
\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
|
|
123
|
-
|
|
124
|
-
## \u5DE5\u5177\u4F7F\u7528\u6307\u5357
|
|
125
|
-
|
|
126
|
-
### Chrome DevTools Mcp
|
|
127
|
-
|
|
128
|
-
1. **\u786E\u4FDD\u64CD\u4F5C\u6B63\u786E\u9875\u9762\uFF08\u5F3A\u5236\uFF09**
|
|
129
|
-
\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
|
|
130
|
-
|
|
131
|
-
2. **\u5FEB\u7167\u83B7\u53D6\uFF08\u5F3A\u5236\uFF09**
|
|
132
|
-
\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
|
|
133
|
-
|
|
134
|
-
3. **\u5355\u9875\u5E94\u7528\uFF08SPA\uFF09\u7279\u6027**
|
|
135
|
-
\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
|
|
136
|
-
|
|
137
|
-
4. **HTTP \u8BF7\u6C42\u6210\u529F\u5224\u65AD\uFF08\u5F3A\u5236\uFF09**
|
|
138
|
-
\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
|
|
139
|
-
|
|
140
|
-
5. **\u5DE5\u5177\u4F7F\u7528\u4F18\u5148\u7EA7\uFF08\u5F3A\u5236\uFF09**
|
|
141
|
-
\u5728\u4F7F\u7528 Chrome DevTools MCP \u5DE5\u5177\u65F6\uFF0C\`chrome-devtools_evaluate_script\` \u5DE5\u5177\u7684\u4F7F\u7528\u4F18\u5148\u7EA7\u6700\u4F4E\u3002\u53EA\u6709\u5728\u5176\u4ED6\u5DE5\u5177\u65E0\u6CD5\u6EE1\u8DB3\u9700\u6C42\u65F6\uFF0C\u624D\u8003\u8651\u4F7F\u7528\u8BE5\u5DE5\u5177
|
|
142
|
-
`.trim();
|
|
143
|
-
output.system.push(systemPrompt);
|
|
144
|
-
})
|
|
145
|
-
};
|
|
146
|
-
});
|
|
147
|
-
var page_context_default = PageContextPlugin;
|
|
148
|
-
export {
|
|
149
|
-
PageContextPlugin,
|
|
150
|
-
page_context_default as default
|
|
151
|
-
};
|
|
@@ -1,113 +0,0 @@
|
|
|
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 { readLogFileTail, createLogger } from "@vite-plugin-opencode-assistant/shared";
|
|
23
|
-
const log = createLogger("ServiceLogsPlugin");
|
|
24
|
-
const ServiceLogsPlugin = () => __async(null, null, function* () {
|
|
25
|
-
log.debug("ServiceLogsPlugin loading...");
|
|
26
|
-
const logFilesJson = process.env.OPENCODE_LOG_FILES_JSON;
|
|
27
|
-
log.debug("Log files JSON from env:", { logFilesJson: logFilesJson ? "set" : "not set" });
|
|
28
|
-
if (!logFilesJson) {
|
|
29
|
-
log.debug("OPENCODE_LOG_FILES_JSON is not set, service logs plugin will not register tools");
|
|
30
|
-
return {};
|
|
31
|
-
}
|
|
32
|
-
let logFiles;
|
|
33
|
-
try {
|
|
34
|
-
logFiles = JSON.parse(logFilesJson);
|
|
35
|
-
log.debug("Parsed log files config", { count: logFiles.length });
|
|
36
|
-
} catch (e) {
|
|
37
|
-
log.error("Failed to parse OPENCODE_LOG_FILES_JSON", { error: e });
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
|
-
if (!logFiles || logFiles.length === 0) {
|
|
41
|
-
log.debug("No log files configured, plugin will not register any tools");
|
|
42
|
-
return {};
|
|
43
|
-
}
|
|
44
|
-
const tools = {};
|
|
45
|
-
for (const logFileConfig of logFiles) {
|
|
46
|
-
let _a;
|
|
47
|
-
const toolName = `get_${logFileConfig.name}_logs`;
|
|
48
|
-
const description = `\u83B7\u53D6 ${logFileConfig.name} \u7684\u65E5\u5FD7\u3002
|
|
49
|
-
|
|
50
|
-
**\u4F55\u65F6\u4F7F\u7528\u6B64\u5DE5\u5177**\uFF1A
|
|
51
|
-
${logFileConfig.description}
|
|
52
|
-
|
|
53
|
-
**\u65E5\u5FD7\u5185\u5BB9**\uFF1A
|
|
54
|
-
- \u6765\u81EA\u65E5\u5FD7\u6587\u4EF6 ${logFileConfig.path} \u7684\u5B9E\u65F6\u65E5\u5FD7
|
|
55
|
-
- \u9ED8\u8BA4\u8FD4\u56DE\u6700\u8FD1 200 \u884C\u65E5\u5FD7`;
|
|
56
|
-
const getLogsTool = tool({
|
|
57
|
-
description,
|
|
58
|
-
args: {
|
|
59
|
-
level: tool.schema.string().optional().describe(
|
|
60
|
-
"\u65E5\u5FD7\u7EA7\u522B\u8FC7\u6EE4\uFF1Aerror(\u9519\u8BEF)\u3001warn(\u8B66\u544A)\u3001info(\u4FE1\u606F)\u3002\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694\uFF0C\u5982 'error,warn'"
|
|
61
|
-
),
|
|
62
|
-
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"),
|
|
63
|
-
since: tool.schema.string().optional().describe("\u8D77\u59CB\u65F6\u95F4\uFF08ISO \u683C\u5F0F\uFF09\uFF0C\u83B7\u53D6\u6B64\u65F6\u95F4\u4E4B\u540E\u7684\u65E5\u5FD7")
|
|
64
|
-
},
|
|
65
|
-
execute(args, context) {
|
|
66
|
-
return __async(this, null, function* () {
|
|
67
|
-
const { level, limit, since } = args;
|
|
68
|
-
log.debug(`${toolName} called`, {
|
|
69
|
-
args,
|
|
70
|
-
sessionID: context.sessionID,
|
|
71
|
-
directory: context.directory
|
|
72
|
-
});
|
|
73
|
-
const requestedLimit = limit != null ? limit : 50;
|
|
74
|
-
const entries = yield readLogFileTail({
|
|
75
|
-
name: logFileConfig.name,
|
|
76
|
-
filePath: logFileConfig.path,
|
|
77
|
-
projectRoot: process.cwd(),
|
|
78
|
-
lines: Math.max(requestedLimit * 3, 500),
|
|
79
|
-
level: level ? level.split(",").map((l) => l.trim()) : void 0,
|
|
80
|
-
since,
|
|
81
|
-
limit: requestedLimit
|
|
82
|
-
});
|
|
83
|
-
if (entries.length === 0) {
|
|
84
|
-
return `\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u65E5\u5FD7\u3002
|
|
85
|
-
|
|
86
|
-
\u5EFA\u8BAE\uFF1A
|
|
87
|
-
- \u4E0D\u6307\u5B9A\u53C2\u6570\u83B7\u53D6\u6240\u6709\u65E5\u5FD7
|
|
88
|
-
- \u4F7F\u7528 level=error,warn \u83B7\u53D6\u9519\u8BEF\u548C\u8B66\u544A`;
|
|
89
|
-
}
|
|
90
|
-
const formattedLogs = entries.map((entry) => {
|
|
91
|
-
const time = new Date(entry.timestamp).toLocaleTimeString();
|
|
92
|
-
const levelIcon = entry.level === "error" ? "\u274C" : entry.level === "warn" ? "\u26A0\uFE0F" : "\u2139\uFE0F";
|
|
93
|
-
return `${time} ${levelIcon} ${entry.message}`;
|
|
94
|
-
}).join("\n");
|
|
95
|
-
return `${logFileConfig.name} \u65E5\u5FD7\uFF08${entries.length} \u6761\uFF09\uFF1A
|
|
96
|
-
|
|
97
|
-
${formattedLogs}`;
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
tools[toolName] = getLogsTool;
|
|
102
|
-
log.debug(`Registered tool: ${toolName}`);
|
|
103
|
-
}
|
|
104
|
-
log.debug(`Plugin initialized with ${Object.keys(tools).length} log tools`);
|
|
105
|
-
return {
|
|
106
|
-
tool: tools
|
|
107
|
-
};
|
|
108
|
-
});
|
|
109
|
-
var service_logs_default = ServiceLogsPlugin;
|
|
110
|
-
export {
|
|
111
|
-
ServiceLogsPlugin,
|
|
112
|
-
service_logs_default as default
|
|
113
|
-
};
|
package/es/plugins/vite-logs.mjs
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
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
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|