@docyrus/ui-pro-ai-assistant 0.2.3 → 0.2.5

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/dist/stub.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare const DocyAssistant: null;
2
+ export declare const AssistantProvider: null;
3
+ export declare const AssistantI18nProvider: null;
4
+ export declare const useAssistantConfig: null;
5
+ export declare const useAssistantTranslation: null;
6
+ export type { AssistantConfig, AssistantUser } from './lib/assistant-config';
7
+ export type { Project, Work, WorkTypes } from './types';
package/dist/stub.js ADDED
@@ -0,0 +1,10 @@
1
+ // src/stub.ts
2
+ var DocyAssistant = null;
3
+ var AssistantProvider = null;
4
+ var AssistantI18nProvider = null;
5
+ var useAssistantConfig = null;
6
+ var useAssistantTranslation = null;
7
+
8
+ export { AssistantI18nProvider, AssistantProvider, DocyAssistant, useAssistantConfig, useAssistantTranslation };
9
+ //# sourceMappingURL=stub.js.map
10
+ //# sourceMappingURL=stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stub.ts"],"names":[],"mappings":";AAOO,IAAM,aAAA,GAAgB;AACtB,IAAM,iBAAA,GAAoB;AAC1B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,kBAAA,GAAqB;AAC3B,IAAM,uBAAA,GAA0B","file":"stub.js","sourcesContent":["/*\n * Cloudflare Workers / edge-light stub for @docyrus/ui-pro-ai-assistant.\n * Served automatically via the \"workerd\" / \"edge-light\" export conditions.\n * The main entry imports browser-only packages (mermaid, @univerjs/engine-render,\n * @visactor/*, etc.) that cannot run in the Workers runtime.\n */\n\nexport const DocyAssistant = null;\nexport const AssistantProvider = null;\nexport const AssistantI18nProvider = null;\nexport const useAssistantConfig = null;\nexport const useAssistantTranslation = null;\n\nexport type { AssistantConfig, AssistantUser } from './lib/assistant-config';\nexport type { Project, Work, WorkTypes } from './types';\n"]}
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
- export { handleAiCommand, handleAiCopilot } from './chunk-VSTHZ22Q.js';
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
@@ -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",
3
+ "version": "0.2.5",
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"
@@ -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"]}