@docyrus/ui-pro-ai-assistant 0.2.4 → 0.2.6
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/README.md +85 -1
- package/dist/components/agent-trigger-widget/agent-carousel.d.ts +8 -0
- package/dist/components/agent-trigger-widget/agent-trigger-prompt.d.ts +18 -0
- package/dist/components/agent-trigger-widget/index.d.ts +8 -0
- package/dist/docy-assistant.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/use-agents-data.d.ts +19 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +716 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/plate-editor/editor/plugins/block-menu-kit.d.ts +8 -8
- package/dist/internal/plate-editor/editor/plugins/block-selection-kit.d.ts +8 -8
- package/dist/stub.d.ts +7 -0
- package/dist/stub.js +10 -0
- package/dist/stub.js.map +1 -0
- package/dist/styles.css +194 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/vite.js +165 -1
- package/dist/vite.js.map +1 -1
- package/dist/worker.js +163 -1
- package/dist/worker.js.map +1 -1
- package/package.json +3 -1
- package/dist/chunk-VSTHZ22Q.js +0 -165
- package/dist/chunk-VSTHZ22Q.js.map +0 -1
package/dist/vite.js
CHANGED
|
@@ -1,6 +1,170 @@
|
|
|
1
|
-
import { handleAiCommand, handleAiCopilot } from './chunk-VSTHZ22Q.js';
|
|
2
1
|
import { loadEnv } from 'vite';
|
|
3
2
|
|
|
3
|
+
// src/vite.ts
|
|
4
|
+
|
|
5
|
+
// src/worker.ts
|
|
6
|
+
var COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.
|
|
7
|
+
|
|
8
|
+
Rules:
|
|
9
|
+
- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).
|
|
10
|
+
- Maintain style and tone. Don't repeat given text.
|
|
11
|
+
- For unclear context, provide the most likely continuation.
|
|
12
|
+
- Handle code snippets, lists, or structured text if needed.
|
|
13
|
+
- Don't include """ in your response.
|
|
14
|
+
- CRITICAL: Always end with a punctuation mark.
|
|
15
|
+
- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.
|
|
16
|
+
- If no context is provided or you can't generate a continuation, return "0" without explanation.`;
|
|
17
|
+
function getApiBaseUrl(env) {
|
|
18
|
+
return env.VITE_DOCYRUS_API_URL;
|
|
19
|
+
}
|
|
20
|
+
function getAgentId(env) {
|
|
21
|
+
return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;
|
|
22
|
+
}
|
|
23
|
+
function getAuthToken(request) {
|
|
24
|
+
const authHeader = request.headers.get("authorization");
|
|
25
|
+
return authHeader?.replace("Bearer ", "") || void 0;
|
|
26
|
+
}
|
|
27
|
+
async function handleAiCommand(request, env) {
|
|
28
|
+
if (request.method !== "POST") {
|
|
29
|
+
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
30
|
+
status: 405,
|
|
31
|
+
headers: { "Content-Type": "application/json" }
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const body = await request.json();
|
|
36
|
+
const token = getAuthToken(request);
|
|
37
|
+
if (!token) {
|
|
38
|
+
return new Response(
|
|
39
|
+
JSON.stringify({ error: "Unauthorized", message: "No authentication token found. Please log in." }),
|
|
40
|
+
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
const apiBaseUrl = getApiBaseUrl(env);
|
|
44
|
+
if (!apiBaseUrl) {
|
|
45
|
+
return new Response(
|
|
46
|
+
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
47
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
const agentId = getAgentId(env);
|
|
51
|
+
if (!agentId) {
|
|
52
|
+
return new Response(
|
|
53
|
+
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
54
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const { messages, ctx } = body;
|
|
58
|
+
let editorContext;
|
|
59
|
+
if (ctx) {
|
|
60
|
+
const contextData = { toolName: ctx.toolName };
|
|
61
|
+
if (ctx.selection) contextData.selection = ctx.selection;
|
|
62
|
+
if (ctx.children) contextData.children = ctx.children;
|
|
63
|
+
editorContext = JSON.stringify(contextData);
|
|
64
|
+
}
|
|
65
|
+
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
66
|
+
method: "POST",
|
|
67
|
+
headers: {
|
|
68
|
+
"Content-Type": "application/json",
|
|
69
|
+
Authorization: `Bearer ${token}`
|
|
70
|
+
},
|
|
71
|
+
body: JSON.stringify({
|
|
72
|
+
agentId,
|
|
73
|
+
messages: messages ?? [],
|
|
74
|
+
mode: "agent",
|
|
75
|
+
stream: true,
|
|
76
|
+
additionalContext: editorContext
|
|
77
|
+
})
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
const errorText = await response.text();
|
|
81
|
+
return new Response(
|
|
82
|
+
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
83
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return new Response(response.body, {
|
|
87
|
+
headers: {
|
|
88
|
+
"Content-Type": "text/event-stream",
|
|
89
|
+
"Cache-Control": "no-cache",
|
|
90
|
+
Connection: "keep-alive"
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error("[AI Command] Error:", error);
|
|
95
|
+
return new Response(
|
|
96
|
+
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
97
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function handleAiCopilot(request, env) {
|
|
102
|
+
if (request.method !== "POST") {
|
|
103
|
+
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
104
|
+
status: 405,
|
|
105
|
+
headers: { "Content-Type": "application/json" }
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const body = await request.json();
|
|
110
|
+
const token = getAuthToken(request);
|
|
111
|
+
if (!token) {
|
|
112
|
+
return new Response(
|
|
113
|
+
JSON.stringify({ error: "Unauthorized" }),
|
|
114
|
+
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
const apiBaseUrl = getApiBaseUrl(env);
|
|
118
|
+
if (!apiBaseUrl) {
|
|
119
|
+
return new Response(
|
|
120
|
+
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
121
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const agentId = getAgentId(env);
|
|
125
|
+
if (!agentId) {
|
|
126
|
+
return new Response(
|
|
127
|
+
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
128
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
132
|
+
method: "POST",
|
|
133
|
+
headers: {
|
|
134
|
+
"Content-Type": "application/json",
|
|
135
|
+
Authorization: `Bearer ${token}`
|
|
136
|
+
},
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
agentId,
|
|
139
|
+
messages: [{ role: "system", content: COPILOT_SYSTEM_PROMPT }, { role: "user", content: body.prompt }],
|
|
140
|
+
mode: "agent",
|
|
141
|
+
stream: true
|
|
142
|
+
})
|
|
143
|
+
});
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
const errorText = await response.text();
|
|
146
|
+
return new Response(
|
|
147
|
+
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
148
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return new Response(response.body, {
|
|
152
|
+
headers: {
|
|
153
|
+
"Content-Type": "text/event-stream",
|
|
154
|
+
"Cache-Control": "no-cache",
|
|
155
|
+
Connection: "keep-alive"
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error("[AI Copilot] Error:", error);
|
|
160
|
+
return new Response(
|
|
161
|
+
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
162
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// src/vite.ts
|
|
4
168
|
function readBody(req) {
|
|
5
169
|
return new Promise((resolve, reject) => {
|
|
6
170
|
const chunks = [];
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vite.ts"],"names":[],"mappings":";;;AAMA,SAAS,SAAS,GAAA,EAAuC;AACvD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,GAAA,CAAI,GAAG,MAAA,EAAQ,CAAC,UAAkB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM,OAAA,CAAQ,OAAO,MAAA,CAAO,MAAM,CAAC,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI,GAAA;AAEJ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,eAAe,MAAA,EAAQ;AACrB,MAAA,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,MAAM,EAAE,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,gBAAgB,MAAA,EAAQ;AACtB,MAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,EAAK,KAAK,IAAA,KAAS;AAC/C,QAAA,IAAI,GAAA,CAAI,GAAA,KAAQ,iBAAA,IAAqB,GAAA,CAAI,QAAQ,iBAAA,EAAmB;AAClE,UAAA,OAAO,IAAA,EAAK;AAAA,QACd;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,QAAA,MAAM,UAAU,IAAI,OAAA,CAAQ,CAAA,gBAAA,EAAmB,GAAA,CAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UACxD,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,MAAM,IAAA,CAAK,MAAA,GAAS,IAAI,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI;AAAA,SAChD,CAAA;AAED,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,KAAQ,iBAAA,GAAoB,MAAM,eAAA,CAAgB,OAAA,EAAS,GAAG,CAAA,GAAI,MAAM,eAAA,CAAgB,OAAA,EAAS,GAAG,CAAA;AAEzH,QAAA,GAAA,CAAI,aAAa,QAAA,CAAS,MAAA;AAC1B,QAAA,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAC,KAAA,EAAO,QAAQ,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,KAAK,CAAC,CAAA;AAElE,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,UAAA,MAAM,OAAO,YAA2B;AACtC,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,GAAA,CAAI,GAAA,EAAI;AAER,cAAA;AAAA,YACF;AACA,YAAA,GAAA,CAAI,MAAM,KAAK,CAAA;AACf,YAAA,MAAM,IAAA,EAAK;AAAA,UACb,CAAA;AAEA,UAAA,MAAM,IAAA,EAAK;AAAA,QACb,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,GAAA,EAAI;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF","file":"vite.js","sourcesContent":["import { type IncomingMessage } from 'node:http';\n\nimport { type Plugin, loadEnv } from 'vite';\n\nimport { handleAiCommand, handleAiCopilot } from './worker';\n\nfunction readBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks)));\n req.on('error', reject);\n });\n}\n\nexport function plateEditorPlugin(): Plugin {\n let env: Record<string, string>;\n\n return {\n name: 'plate-editor-ai',\n configResolved(config) {\n env = loadEnv(config.mode, config.root, '');\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url !== '/api/ai/command' && req.url !== '/api/ai/copilot') {\n return next();\n }\n\n const body = await readBody(req);\n const request = new Request(`http://localhost${req.url}`, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: body.length > 0 ? new Uint8Array(body) : undefined\n });\n\n const response = req.url === '/api/ai/command' ? await handleAiCommand(request, env) : await handleAiCopilot(request, env);\n\n res.statusCode = response.status;\n response.headers.forEach((value, key) => res.setHeader(key, value));\n\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n\n if (done) {\n res.end();\n\n return;\n }\n res.write(value);\n await pump();\n };\n\n await pump();\n } else {\n res.end();\n }\n });\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/worker.ts","../src/vite.ts"],"names":[],"mappings":"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","file":"vite.js","sourcesContent":["const COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.\n\nRules:\n- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).\n- Maintain style and tone. Don't repeat given text.\n- For unclear context, provide the most likely continuation.\n- Handle code snippets, lists, or structured text if needed.\n- Don't include \"\"\" in your response.\n- CRITICAL: Always end with a punctuation mark.\n- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.\n- If no context is provided or you can't generate a continuation, return \"0\" without explanation.`;\n\nfunction getApiBaseUrl(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_API_URL;\n}\n\nfunction getAgentId(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;\n}\n\nfunction getAuthToken(request: Request): string | undefined {\n const authHeader = request.headers.get('authorization');\n\n return authHeader?.replace('Bearer ', '') || undefined;\n}\n\nexport async function handleAiCommand(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as {\n messages?: unknown[];\n ctx?: { selection?: unknown; children?: unknown; toolName?: string };\n };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized', message: 'No authentication token found. Please log in.' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const { messages, ctx } = body;\n\n let editorContext: string | undefined;\n\n if (ctx) {\n const contextData: Record<string, unknown> = { toolName: ctx.toolName };\n\n if (ctx.selection) contextData.selection = ctx.selection;\n if (ctx.children) contextData.children = ctx.children;\n editorContext = JSON.stringify(contextData);\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: messages ?? [],\n mode: 'agent',\n stream: true,\n additionalContext: editorContext\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Command] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n\nexport async function handleAiCopilot(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as { prompt?: string };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: [{ role: 'system', content: COPILOT_SYSTEM_PROMPT }, { role: 'user', content: body.prompt }],\n mode: 'agent',\n stream: true\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Copilot] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n","import { type IncomingMessage } from 'node:http';\n\nimport { type Plugin, loadEnv } from 'vite';\n\nimport { handleAiCommand, handleAiCopilot } from './worker';\n\nfunction readBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => resolve(Buffer.concat(chunks)));\n req.on('error', reject);\n });\n}\n\nexport function plateEditorPlugin(): Plugin {\n let env: Record<string, string>;\n\n return {\n name: 'plate-editor-ai',\n configResolved(config) {\n env = loadEnv(config.mode, config.root, '');\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n if (req.url !== '/api/ai/command' && req.url !== '/api/ai/copilot') {\n return next();\n }\n\n const body = await readBody(req);\n const request = new Request(`http://localhost${req.url}`, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: body.length > 0 ? new Uint8Array(body) : undefined\n });\n\n const response = req.url === '/api/ai/command' ? await handleAiCommand(request, env) : await handleAiCopilot(request, env);\n\n res.statusCode = response.status;\n response.headers.forEach((value, key) => res.setHeader(key, value));\n\n if (response.body) {\n const reader = response.body.getReader();\n const pump = async (): Promise<void> => {\n const { done, value } = await reader.read();\n\n if (done) {\n res.end();\n\n return;\n }\n res.write(value);\n await pump();\n };\n\n await pump();\n } else {\n res.end();\n }\n });\n }\n };\n}\n"]}
|
package/dist/worker.js
CHANGED
|
@@ -1,3 +1,165 @@
|
|
|
1
|
-
|
|
1
|
+
// src/worker.ts
|
|
2
|
+
var COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.
|
|
3
|
+
|
|
4
|
+
Rules:
|
|
5
|
+
- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).
|
|
6
|
+
- Maintain style and tone. Don't repeat given text.
|
|
7
|
+
- For unclear context, provide the most likely continuation.
|
|
8
|
+
- Handle code snippets, lists, or structured text if needed.
|
|
9
|
+
- Don't include """ in your response.
|
|
10
|
+
- CRITICAL: Always end with a punctuation mark.
|
|
11
|
+
- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.
|
|
12
|
+
- If no context is provided or you can't generate a continuation, return "0" without explanation.`;
|
|
13
|
+
function getApiBaseUrl(env) {
|
|
14
|
+
return env.VITE_DOCYRUS_API_URL;
|
|
15
|
+
}
|
|
16
|
+
function getAgentId(env) {
|
|
17
|
+
return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;
|
|
18
|
+
}
|
|
19
|
+
function getAuthToken(request) {
|
|
20
|
+
const authHeader = request.headers.get("authorization");
|
|
21
|
+
return authHeader?.replace("Bearer ", "") || void 0;
|
|
22
|
+
}
|
|
23
|
+
async function handleAiCommand(request, env) {
|
|
24
|
+
if (request.method !== "POST") {
|
|
25
|
+
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
26
|
+
status: 405,
|
|
27
|
+
headers: { "Content-Type": "application/json" }
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const body = await request.json();
|
|
32
|
+
const token = getAuthToken(request);
|
|
33
|
+
if (!token) {
|
|
34
|
+
return new Response(
|
|
35
|
+
JSON.stringify({ error: "Unauthorized", message: "No authentication token found. Please log in." }),
|
|
36
|
+
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
const apiBaseUrl = getApiBaseUrl(env);
|
|
40
|
+
if (!apiBaseUrl) {
|
|
41
|
+
return new Response(
|
|
42
|
+
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
43
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const agentId = getAgentId(env);
|
|
47
|
+
if (!agentId) {
|
|
48
|
+
return new Response(
|
|
49
|
+
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
50
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
const { messages, ctx } = body;
|
|
54
|
+
let editorContext;
|
|
55
|
+
if (ctx) {
|
|
56
|
+
const contextData = { toolName: ctx.toolName };
|
|
57
|
+
if (ctx.selection) contextData.selection = ctx.selection;
|
|
58
|
+
if (ctx.children) contextData.children = ctx.children;
|
|
59
|
+
editorContext = JSON.stringify(contextData);
|
|
60
|
+
}
|
|
61
|
+
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
Authorization: `Bearer ${token}`
|
|
66
|
+
},
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
agentId,
|
|
69
|
+
messages: messages ?? [],
|
|
70
|
+
mode: "agent",
|
|
71
|
+
stream: true,
|
|
72
|
+
additionalContext: editorContext
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
const errorText = await response.text();
|
|
77
|
+
return new Response(
|
|
78
|
+
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
79
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
return new Response(response.body, {
|
|
83
|
+
headers: {
|
|
84
|
+
"Content-Type": "text/event-stream",
|
|
85
|
+
"Cache-Control": "no-cache",
|
|
86
|
+
Connection: "keep-alive"
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error("[AI Command] Error:", error);
|
|
91
|
+
return new Response(
|
|
92
|
+
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
93
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function handleAiCopilot(request, env) {
|
|
98
|
+
if (request.method !== "POST") {
|
|
99
|
+
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
100
|
+
status: 405,
|
|
101
|
+
headers: { "Content-Type": "application/json" }
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const body = await request.json();
|
|
106
|
+
const token = getAuthToken(request);
|
|
107
|
+
if (!token) {
|
|
108
|
+
return new Response(
|
|
109
|
+
JSON.stringify({ error: "Unauthorized" }),
|
|
110
|
+
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
const apiBaseUrl = getApiBaseUrl(env);
|
|
114
|
+
if (!apiBaseUrl) {
|
|
115
|
+
return new Response(
|
|
116
|
+
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
117
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
const agentId = getAgentId(env);
|
|
121
|
+
if (!agentId) {
|
|
122
|
+
return new Response(
|
|
123
|
+
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
124
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: {
|
|
130
|
+
"Content-Type": "application/json",
|
|
131
|
+
Authorization: `Bearer ${token}`
|
|
132
|
+
},
|
|
133
|
+
body: JSON.stringify({
|
|
134
|
+
agentId,
|
|
135
|
+
messages: [{ role: "system", content: COPILOT_SYSTEM_PROMPT }, { role: "user", content: body.prompt }],
|
|
136
|
+
mode: "agent",
|
|
137
|
+
stream: true
|
|
138
|
+
})
|
|
139
|
+
});
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorText = await response.text();
|
|
142
|
+
return new Response(
|
|
143
|
+
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
144
|
+
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return new Response(response.body, {
|
|
148
|
+
headers: {
|
|
149
|
+
"Content-Type": "text/event-stream",
|
|
150
|
+
"Cache-Control": "no-cache",
|
|
151
|
+
Connection: "keep-alive"
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
} catch (error) {
|
|
155
|
+
console.error("[AI Copilot] Error:", error);
|
|
156
|
+
return new Response(
|
|
157
|
+
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
158
|
+
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { handleAiCommand, handleAiCopilot };
|
|
2
164
|
//# sourceMappingURL=worker.js.map
|
|
3
165
|
//# sourceMappingURL=worker.js.map
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"worker.js"}
|
|
1
|
+
{"version":3,"sources":["../src/worker.ts"],"names":[],"mappings":"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","file":"worker.js","sourcesContent":["const COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.\n\nRules:\n- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).\n- Maintain style and tone. Don't repeat given text.\n- For unclear context, provide the most likely continuation.\n- Handle code snippets, lists, or structured text if needed.\n- Don't include \"\"\" in your response.\n- CRITICAL: Always end with a punctuation mark.\n- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.\n- If no context is provided or you can't generate a continuation, return \"0\" without explanation.`;\n\nfunction getApiBaseUrl(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_API_URL;\n}\n\nfunction getAgentId(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;\n}\n\nfunction getAuthToken(request: Request): string | undefined {\n const authHeader = request.headers.get('authorization');\n\n return authHeader?.replace('Bearer ', '') || undefined;\n}\n\nexport async function handleAiCommand(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as {\n messages?: unknown[];\n ctx?: { selection?: unknown; children?: unknown; toolName?: string };\n };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized', message: 'No authentication token found. Please log in.' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const { messages, ctx } = body;\n\n let editorContext: string | undefined;\n\n if (ctx) {\n const contextData: Record<string, unknown> = { toolName: ctx.toolName };\n\n if (ctx.selection) contextData.selection = ctx.selection;\n if (ctx.children) contextData.children = ctx.children;\n editorContext = JSON.stringify(contextData);\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: messages ?? [],\n mode: 'agent',\n stream: true,\n additionalContext: editorContext\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Command] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n\nexport async function handleAiCopilot(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as { prompt?: string };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: [{ role: 'system', content: COPILOT_SYSTEM_PROMPT }, { role: 'user', content: body.prompt }],\n mode: 'agent',\n stream: true\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Copilot] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docyrus/ui-pro-ai-assistant",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "Docyrus AI Assistant component — full-featured chat UI with canvas, projects, and i18n support.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
+
"workerd": "./dist/stub.js",
|
|
12
|
+
"edge-light": "./dist/stub.js",
|
|
11
13
|
"import": {
|
|
12
14
|
"types": "./dist/index.d.ts",
|
|
13
15
|
"default": "./dist/index.js"
|
package/dist/chunk-VSTHZ22Q.js
DELETED
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
// src/worker.ts
|
|
2
|
-
var COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.
|
|
3
|
-
|
|
4
|
-
Rules:
|
|
5
|
-
- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).
|
|
6
|
-
- Maintain style and tone. Don't repeat given text.
|
|
7
|
-
- For unclear context, provide the most likely continuation.
|
|
8
|
-
- Handle code snippets, lists, or structured text if needed.
|
|
9
|
-
- Don't include """ in your response.
|
|
10
|
-
- CRITICAL: Always end with a punctuation mark.
|
|
11
|
-
- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.
|
|
12
|
-
- If no context is provided or you can't generate a continuation, return "0" without explanation.`;
|
|
13
|
-
function getApiBaseUrl(env) {
|
|
14
|
-
return env.VITE_DOCYRUS_API_URL;
|
|
15
|
-
}
|
|
16
|
-
function getAgentId(env) {
|
|
17
|
-
return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;
|
|
18
|
-
}
|
|
19
|
-
function getAuthToken(request) {
|
|
20
|
-
const authHeader = request.headers.get("authorization");
|
|
21
|
-
return authHeader?.replace("Bearer ", "") || void 0;
|
|
22
|
-
}
|
|
23
|
-
async function handleAiCommand(request, env) {
|
|
24
|
-
if (request.method !== "POST") {
|
|
25
|
-
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
26
|
-
status: 405,
|
|
27
|
-
headers: { "Content-Type": "application/json" }
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
try {
|
|
31
|
-
const body = await request.json();
|
|
32
|
-
const token = getAuthToken(request);
|
|
33
|
-
if (!token) {
|
|
34
|
-
return new Response(
|
|
35
|
-
JSON.stringify({ error: "Unauthorized", message: "No authentication token found. Please log in." }),
|
|
36
|
-
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
const apiBaseUrl = getApiBaseUrl(env);
|
|
40
|
-
if (!apiBaseUrl) {
|
|
41
|
-
return new Response(
|
|
42
|
-
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
43
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
const agentId = getAgentId(env);
|
|
47
|
-
if (!agentId) {
|
|
48
|
-
return new Response(
|
|
49
|
-
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
50
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
const { messages, ctx } = body;
|
|
54
|
-
let editorContext;
|
|
55
|
-
if (ctx) {
|
|
56
|
-
const contextData = { toolName: ctx.toolName };
|
|
57
|
-
if (ctx.selection) contextData.selection = ctx.selection;
|
|
58
|
-
if (ctx.children) contextData.children = ctx.children;
|
|
59
|
-
editorContext = JSON.stringify(contextData);
|
|
60
|
-
}
|
|
61
|
-
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
62
|
-
method: "POST",
|
|
63
|
-
headers: {
|
|
64
|
-
"Content-Type": "application/json",
|
|
65
|
-
Authorization: `Bearer ${token}`
|
|
66
|
-
},
|
|
67
|
-
body: JSON.stringify({
|
|
68
|
-
agentId,
|
|
69
|
-
messages: messages ?? [],
|
|
70
|
-
mode: "agent",
|
|
71
|
-
stream: true,
|
|
72
|
-
additionalContext: editorContext
|
|
73
|
-
})
|
|
74
|
-
});
|
|
75
|
-
if (!response.ok) {
|
|
76
|
-
const errorText = await response.text();
|
|
77
|
-
return new Response(
|
|
78
|
-
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
79
|
-
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
return new Response(response.body, {
|
|
83
|
-
headers: {
|
|
84
|
-
"Content-Type": "text/event-stream",
|
|
85
|
-
"Cache-Control": "no-cache",
|
|
86
|
-
Connection: "keep-alive"
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
} catch (error) {
|
|
90
|
-
console.error("[AI Command] Error:", error);
|
|
91
|
-
return new Response(
|
|
92
|
-
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
93
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
async function handleAiCopilot(request, env) {
|
|
98
|
-
if (request.method !== "POST") {
|
|
99
|
-
return new Response(JSON.stringify({ error: "Method not allowed" }), {
|
|
100
|
-
status: 405,
|
|
101
|
-
headers: { "Content-Type": "application/json" }
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
try {
|
|
105
|
-
const body = await request.json();
|
|
106
|
-
const token = getAuthToken(request);
|
|
107
|
-
if (!token) {
|
|
108
|
-
return new Response(
|
|
109
|
-
JSON.stringify({ error: "Unauthorized" }),
|
|
110
|
-
{ status: 401, headers: { "Content-Type": "application/json" } }
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
const apiBaseUrl = getApiBaseUrl(env);
|
|
114
|
-
if (!apiBaseUrl) {
|
|
115
|
-
return new Response(
|
|
116
|
-
JSON.stringify({ error: "VITE_DOCYRUS_API_URL is not configured" }),
|
|
117
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
const agentId = getAgentId(env);
|
|
121
|
-
if (!agentId) {
|
|
122
|
-
return new Response(
|
|
123
|
-
JSON.stringify({ error: "VITE_DOCYRUS_AGENT_ID is not configured" }),
|
|
124
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {
|
|
128
|
-
method: "POST",
|
|
129
|
-
headers: {
|
|
130
|
-
"Content-Type": "application/json",
|
|
131
|
-
Authorization: `Bearer ${token}`
|
|
132
|
-
},
|
|
133
|
-
body: JSON.stringify({
|
|
134
|
-
agentId,
|
|
135
|
-
messages: [{ role: "system", content: COPILOT_SYSTEM_PROMPT }, { role: "user", content: body.prompt }],
|
|
136
|
-
mode: "agent",
|
|
137
|
-
stream: true
|
|
138
|
-
})
|
|
139
|
-
});
|
|
140
|
-
if (!response.ok) {
|
|
141
|
-
const errorText = await response.text();
|
|
142
|
-
return new Response(
|
|
143
|
-
errorText || JSON.stringify({ error: "Backend API error" }),
|
|
144
|
-
{ status: response.status, headers: { "Content-Type": "application/json" } }
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
return new Response(response.body, {
|
|
148
|
-
headers: {
|
|
149
|
-
"Content-Type": "text/event-stream",
|
|
150
|
-
"Cache-Control": "no-cache",
|
|
151
|
-
Connection: "keep-alive"
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
} catch (error) {
|
|
155
|
-
console.error("[AI Copilot] Error:", error);
|
|
156
|
-
return new Response(
|
|
157
|
-
JSON.stringify({ error: "Internal server error", message: error instanceof Error ? error.message : "Unknown error" }),
|
|
158
|
-
{ status: 500, headers: { "Content-Type": "application/json" } }
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export { handleAiCommand, handleAiCopilot };
|
|
164
|
-
//# sourceMappingURL=chunk-VSTHZ22Q.js.map
|
|
165
|
-
//# sourceMappingURL=chunk-VSTHZ22Q.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/worker.ts"],"names":[],"mappings":"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","file":"chunk-VSTHZ22Q.js","sourcesContent":["const COPILOT_SYSTEM_PROMPT = `You are an advanced AI writing assistant, similar to VSCode Copilot but for general text. Your task is to predict and generate the next part of the text based on the given context.\n\nRules:\n- Continue the text naturally up to the next punctuation mark (., ,, ;, :, ?, or !).\n- Maintain style and tone. Don't repeat given text.\n- For unclear context, provide the most likely continuation.\n- Handle code snippets, lists, or structured text if needed.\n- Don't include \"\"\" in your response.\n- CRITICAL: Always end with a punctuation mark.\n- CRITICAL: Avoid starting a new block. Do not use block formatting like >, #, 1., 2., -, etc. The suggestion should continue in the same block as the context.\n- If no context is provided or you can't generate a continuation, return \"0\" without explanation.`;\n\nfunction getApiBaseUrl(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_API_URL;\n}\n\nfunction getAgentId(env: Record<string, string>): string | undefined {\n return env.VITE_DOCYRUS_EDITOR_AGENT_ID || env.VITE_DOCYRUS_AGENT_ID;\n}\n\nfunction getAuthToken(request: Request): string | undefined {\n const authHeader = request.headers.get('authorization');\n\n return authHeader?.replace('Bearer ', '') || undefined;\n}\n\nexport async function handleAiCommand(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as {\n messages?: unknown[];\n ctx?: { selection?: unknown; children?: unknown; toolName?: string };\n };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized', message: 'No authentication token found. Please log in.' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const { messages, ctx } = body;\n\n let editorContext: string | undefined;\n\n if (ctx) {\n const contextData: Record<string, unknown> = { toolName: ctx.toolName };\n\n if (ctx.selection) contextData.selection = ctx.selection;\n if (ctx.children) contextData.children = ctx.children;\n editorContext = JSON.stringify(contextData);\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: messages ?? [],\n mode: 'agent',\n stream: true,\n additionalContext: editorContext\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Command] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n\nexport async function handleAiCopilot(\n request: Request,\n env: Record<string, string>\n): Promise<Response> {\n if (request.method !== 'POST') {\n return new Response(JSON.stringify({ error: 'Method not allowed' }), {\n status: 405,\n headers: { 'Content-Type': 'application/json' }\n });\n }\n\n try {\n const body = await request.json() as { prompt?: string };\n\n const token = getAuthToken(request);\n\n if (!token) {\n return new Response(\n JSON.stringify({ error: 'Unauthorized' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const apiBaseUrl = getApiBaseUrl(env);\n\n if (!apiBaseUrl) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_API_URL is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const agentId = getAgentId(env);\n\n if (!agentId) {\n return new Response(\n JSON.stringify({ error: 'VITE_DOCYRUS_AGENT_ID is not configured' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n const response = await fetch(`${apiBaseUrl}/v1/ai/agents/${agentId}/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({\n agentId,\n messages: [{ role: 'system', content: COPILOT_SYSTEM_PROMPT }, { role: 'user', content: body.prompt }],\n mode: 'agent',\n stream: true\n })\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n return new Response(\n errorText || JSON.stringify({ error: 'Backend API error' }),\n { status: response.status, headers: { 'Content-Type': 'application/json' } }\n );\n }\n\n return new Response(response.body, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive'\n }\n });\n } catch (error) {\n console.error('[AI Copilot] Error:', error);\n\n return new Response(\n JSON.stringify({ error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } }\n );\n }\n}\n"]}
|