agentxl 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +409 -0
  2. package/bin/agentxl.js +377 -0
  3. package/dist/agent/auth.d.ts +2 -0
  4. package/dist/agent/auth.d.ts.map +1 -0
  5. package/dist/agent/auth.js +2 -0
  6. package/dist/agent/auth.js.map +1 -0
  7. package/dist/agent/models.d.ts +21 -0
  8. package/dist/agent/models.d.ts.map +1 -0
  9. package/dist/agent/models.js +46 -0
  10. package/dist/agent/models.js.map +1 -0
  11. package/dist/agent/provider/azure-provider.d.ts +2 -0
  12. package/dist/agent/provider/azure-provider.d.ts.map +1 -0
  13. package/dist/agent/provider/azure-provider.js +2 -0
  14. package/dist/agent/provider/azure-provider.js.map +1 -0
  15. package/dist/agent/session.d.ts +43 -0
  16. package/dist/agent/session.d.ts.map +1 -0
  17. package/dist/agent/session.js +145 -0
  18. package/dist/agent/session.js.map +1 -0
  19. package/dist/agent/tools/excel-tools.d.ts +2 -0
  20. package/dist/agent/tools/excel-tools.d.ts.map +1 -0
  21. package/dist/agent/tools/excel-tools.js +2 -0
  22. package/dist/agent/tools/excel-tools.js.map +1 -0
  23. package/dist/server/certs.d.ts +17 -0
  24. package/dist/server/certs.d.ts.map +1 -0
  25. package/dist/server/certs.js +38 -0
  26. package/dist/server/certs.js.map +1 -0
  27. package/dist/server/index.d.ts +15 -0
  28. package/dist/server/index.d.ts.map +1 -0
  29. package/dist/server/index.js +376 -0
  30. package/dist/server/index.js.map +1 -0
  31. package/manifest/.gitkeep +0 -0
  32. package/manifest/manifest.xml +99 -0
  33. package/package.json +82 -0
  34. package/taskpane/dist/assets/icon-16.png +0 -0
  35. package/taskpane/dist/assets/icon-32.png +0 -0
  36. package/taskpane/dist/assets/icon-64.png +0 -0
  37. package/taskpane/dist/assets/icon-80.png +0 -0
  38. package/taskpane/dist/assets/index-6sMpIYxE.css +1 -0
  39. package/taskpane/dist/assets/index-DyLrQ3Aa.js +164 -0
  40. package/taskpane/dist/index.html +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agent/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=excel-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-tools.d.ts","sourceRoot":"","sources":["../../../src/agent/tools/excel-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=excel-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excel-tools.js","sourceRoot":"","sources":["../../../src/agent/tools/excel-tools.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ export interface CertPair {
2
+ key: string;
3
+ cert: string;
4
+ }
5
+ /**
6
+ * Ensure trusted HTTPS certificates exist for localhost.
7
+ *
8
+ * Uses Microsoft's `office-addin-dev-certs` package which:
9
+ * 1. Generates a localhost CA + server certificate
10
+ * 2. Installs the CA into the OS trust store (Windows + Mac)
11
+ * 3. Chrome, Edge, Excel all trust it — no manual steps
12
+ *
13
+ * On first run, the user may see an OS prompt to trust the certificate.
14
+ * Subsequent runs reuse the existing trusted certs.
15
+ */
16
+ export declare function ensureCerts(): Promise<CertPair>;
17
+ //# sourceMappingURL=certs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/server/certs.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CA+BrD"}
@@ -0,0 +1,38 @@
1
+ import { readFileSync } from "fs";
2
+ /**
3
+ * Ensure trusted HTTPS certificates exist for localhost.
4
+ *
5
+ * Uses Microsoft's `office-addin-dev-certs` package which:
6
+ * 1. Generates a localhost CA + server certificate
7
+ * 2. Installs the CA into the OS trust store (Windows + Mac)
8
+ * 3. Chrome, Edge, Excel all trust it — no manual steps
9
+ *
10
+ * On first run, the user may see an OS prompt to trust the certificate.
11
+ * Subsequent runs reuse the existing trusted certs.
12
+ */
13
+ export async function ensureCerts() {
14
+ try {
15
+ // Dynamic require — office-addin-dev-certs is CJS
16
+ const devCerts = await import("office-addin-dev-certs");
17
+ // This generates certs if needed AND installs the CA into the OS trust store.
18
+ // Returns { key: string, cert: string } paths or buffer.
19
+ const httpsOptions = await devCerts.getHttpsServerOptions();
20
+ const key = typeof httpsOptions.key === "string"
21
+ ? httpsOptions.key
22
+ : Buffer.isBuffer(httpsOptions.key)
23
+ ? httpsOptions.key.toString("utf-8")
24
+ : readFileSync(httpsOptions.key, "utf-8");
25
+ const cert = typeof httpsOptions.cert === "string"
26
+ ? httpsOptions.cert
27
+ : Buffer.isBuffer(httpsOptions.cert)
28
+ ? httpsOptions.cert.toString("utf-8")
29
+ : readFileSync(httpsOptions.cert, "utf-8");
30
+ return { key, cert };
31
+ }
32
+ catch (error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ throw new Error(`Failed to generate HTTPS certificates: ${message}\n` +
35
+ ` Try running: npx office-addin-dev-certs install`);
36
+ }
37
+ }
38
+ //# sourceMappingURL=certs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/server/certs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAOlC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,kDAAkD;QAClD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAExD,8EAA8E;QAC9E,yDAAyD;QACzD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QAE5D,MAAM,GAAG,GACP,OAAO,YAAY,CAAC,GAAG,KAAK,QAAQ;YAClC,CAAC,CAAC,YAAY,CAAC,GAAG;YAClB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC;gBACjC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACpC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,GAAU,EAAE,OAAO,CAAC,CAAC;QAEvD,MAAM,IAAI,GACR,OAAO,YAAY,CAAC,IAAI,KAAK,QAAQ;YACnC,CAAC,CAAC,YAAY,CAAC,IAAI;YACnB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;gBAClC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,IAAW,EAAE,OAAO,CAAC,CAAC;QAExD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CACb,0CAA0C,OAAO,IAAI;YACnD,oDAAoD,CACvD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type CertPair } from "./certs.js";
2
+ /** Enable or disable request logging. */
3
+ export declare function setVerbose(enabled: boolean): void;
4
+ /**
5
+ * Start the HTTPS server.
6
+ *
7
+ * @param port - Port to listen on (default: 3001)
8
+ * @param certs - Optional pre-loaded certificates. If not provided, will call ensureCerts().
9
+ */
10
+ export declare function startServer(port?: number, certs?: CertPair): Promise<void>;
11
+ /**
12
+ * Stop the HTTPS server gracefully.
13
+ */
14
+ export declare function stopServer(): Promise<void>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAsYxD,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,IAAI,GAAE,MAAa,EACnB,KAAK,CAAC,EAAE,QAAQ,GACf,OAAO,CAAC,IAAI,CAAC,CA0Cf;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAWhD"}
@@ -0,0 +1,376 @@
1
+ import { createServer } from "https";
2
+ import { readFileSync, existsSync } from "fs";
3
+ import { join, extname, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { ensureCerts } from "./certs.js";
6
+ import { isAuthenticated, getAuthProvider, getSession, abortSession, } from "../agent/session.js";
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ // ---------------------------------------------------------------------------
10
+ // MIME types for static file serving
11
+ // ---------------------------------------------------------------------------
12
+ const MIME_TYPES = {
13
+ ".html": "text/html; charset=utf-8",
14
+ ".js": "application/javascript; charset=utf-8",
15
+ ".mjs": "application/javascript; charset=utf-8",
16
+ ".css": "text/css; charset=utf-8",
17
+ ".json": "application/json; charset=utf-8",
18
+ ".png": "image/png",
19
+ ".svg": "image/svg+xml",
20
+ ".ico": "image/x-icon",
21
+ ".webp": "image/webp",
22
+ ".woff": "font/woff",
23
+ ".woff2": "font/woff2",
24
+ ".map": "application/json",
25
+ };
26
+ // ---------------------------------------------------------------------------
27
+ // Helpers
28
+ // ---------------------------------------------------------------------------
29
+ /** Read the full request body as a string. */
30
+ function readBody(req) {
31
+ return new Promise((resolve, reject) => {
32
+ const chunks = [];
33
+ req.on("data", (chunk) => chunks.push(chunk));
34
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
35
+ req.on("error", reject);
36
+ });
37
+ }
38
+ /** Parse JSON body, returning null on failure. */
39
+ async function parseJsonBody(req) {
40
+ try {
41
+ const raw = await readBody(req);
42
+ return raw.length > 0 ? JSON.parse(raw) : null;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ /** Send a JSON response. */
49
+ function sendJson(res, status, body) {
50
+ const payload = JSON.stringify(body);
51
+ res.writeHead(status, {
52
+ "Content-Type": "application/json; charset=utf-8",
53
+ "Access-Control-Allow-Origin": "*",
54
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
55
+ "Access-Control-Allow-Headers": "Content-Type",
56
+ "Content-Length": Buffer.byteLength(payload),
57
+ });
58
+ res.end(payload);
59
+ }
60
+ /** Send a plain-text error. */
61
+ function sendError(res, status, message) {
62
+ sendJson(res, status, { error: message });
63
+ }
64
+ /** Get package version from package.json. */
65
+ function getVersion() {
66
+ try {
67
+ // Walk up from dist/server/ or src/server/ to find package.json
68
+ const candidates = [
69
+ join(__dirname, "..", "..", "package.json"), // dist/server -> root
70
+ join(__dirname, "..", "..", "..", "package.json"),
71
+ ];
72
+ for (const p of candidates) {
73
+ if (existsSync(p)) {
74
+ const pkg = JSON.parse(readFileSync(p, "utf-8"));
75
+ return pkg.version ?? "0.0.0";
76
+ }
77
+ }
78
+ return "0.0.0";
79
+ }
80
+ catch {
81
+ return "0.0.0";
82
+ }
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Route: GET /taskpane/* — static file serving
86
+ // ---------------------------------------------------------------------------
87
+ function resolveTaskpaneRoot() {
88
+ // From dist/server/ → ../../taskpane/dist
89
+ const candidates = [
90
+ join(__dirname, "..", "..", "taskpane", "dist"),
91
+ join(__dirname, "..", "..", "..", "taskpane", "dist"),
92
+ ];
93
+ for (const c of candidates) {
94
+ if (existsSync(c))
95
+ return c;
96
+ }
97
+ // Fallback — may not exist yet
98
+ return join(__dirname, "..", "..", "taskpane", "dist");
99
+ }
100
+ function handleTaskpane(req, res, taskpaneRoot) {
101
+ const url = req.url ?? "/";
102
+ // Strip /taskpane prefix to get relative path
103
+ let relativePath = url.replace(/^\/taskpane\/?/, "");
104
+ // Remove query string
105
+ relativePath = relativePath.split("?")[0];
106
+ // Default to index.html
107
+ if (relativePath === "" || relativePath === "/") {
108
+ relativePath = "index.html";
109
+ }
110
+ const filePath = join(taskpaneRoot, relativePath);
111
+ // Security: ensure resolved path is within taskpaneRoot
112
+ if (!filePath.startsWith(taskpaneRoot)) {
113
+ sendError(res, 403, "Forbidden");
114
+ return;
115
+ }
116
+ if (!existsSync(filePath)) {
117
+ // SPA fallback: serve index.html for non-file paths
118
+ const indexPath = join(taskpaneRoot, "index.html");
119
+ if (existsSync(indexPath) && !extname(relativePath)) {
120
+ const content = readFileSync(indexPath);
121
+ res.writeHead(200, {
122
+ "Content-Type": "text/html; charset=utf-8",
123
+ "Content-Length": content.length,
124
+ "Access-Control-Allow-Origin": "*",
125
+ });
126
+ res.end(content);
127
+ return;
128
+ }
129
+ sendError(res, 404, "Not found");
130
+ return;
131
+ }
132
+ const ext = extname(filePath).toLowerCase();
133
+ const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
134
+ const content = readFileSync(filePath);
135
+ res.writeHead(200, {
136
+ "Content-Type": contentType,
137
+ "Content-Length": content.length,
138
+ "Access-Control-Allow-Origin": "*",
139
+ "Cache-Control": ext === ".html" ? "no-cache" : "public, max-age=31536000",
140
+ });
141
+ res.end(content);
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Route: GET /api/version
145
+ // ---------------------------------------------------------------------------
146
+ function handleVersion(_req, res) {
147
+ sendJson(res, 200, { version: getVersion() });
148
+ }
149
+ // ---------------------------------------------------------------------------
150
+ // Route: POST /api/agent — SSE streaming via Pi SDK session
151
+ // ---------------------------------------------------------------------------
152
+ async function handleAgent(req, res) {
153
+ const body = await parseJsonBody(req);
154
+ // Strict validation: message must be a non-empty string
155
+ if (!body ||
156
+ typeof body.message !== "string" ||
157
+ body.message.trim().length === 0) {
158
+ sendError(res, 400, "Missing 'message' in request body");
159
+ return;
160
+ }
161
+ // Auth check
162
+ if (!isAuthenticated()) {
163
+ sendError(res, 401, "Not authenticated. Run 'agentxl login' to set up credentials.");
164
+ return;
165
+ }
166
+ // Build message with optional Excel context
167
+ const context = body.context;
168
+ const message = body.message.trim();
169
+ let fullMessage = message;
170
+ if (context && (context.activeSheet || context.selectedRange)) {
171
+ const parts = [];
172
+ if (context.activeSheet)
173
+ parts.push(`Active sheet: ${context.activeSheet}`);
174
+ if (context.selectedRange)
175
+ parts.push(`Selected range: ${context.selectedRange}`);
176
+ fullMessage = `[Context: ${parts.join(", ")}]\n\n${message}`;
177
+ }
178
+ // SSE headers
179
+ res.writeHead(200, {
180
+ "Content-Type": "text/event-stream; charset=utf-8",
181
+ "Cache-Control": "no-cache",
182
+ Connection: "keep-alive",
183
+ "Access-Control-Allow-Origin": "*",
184
+ });
185
+ /** Write an SSE event to the response stream. */
186
+ const sendSSE = (data) => {
187
+ if (!res.writableEnded) {
188
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
189
+ }
190
+ };
191
+ let unsubscribe = null;
192
+ let completed = false;
193
+ /** Clean up subscription. */
194
+ const cleanup = () => {
195
+ if (unsubscribe) {
196
+ unsubscribe();
197
+ unsubscribe = null;
198
+ }
199
+ };
200
+ try {
201
+ const session = await getSession();
202
+ // Subscribe to session events and stream them as SSE
203
+ unsubscribe = session.subscribe((event) => {
204
+ // Forward all events to the client
205
+ sendSSE(event);
206
+ // Close the stream when the agent finishes
207
+ if (event.type === "agent_end") {
208
+ completed = true;
209
+ cleanup();
210
+ if (!res.writableEnded) {
211
+ res.end();
212
+ }
213
+ }
214
+ });
215
+ // Handle client disconnect mid-stream.
216
+ // `close` fires on any request lifecycle end — only abort if the
217
+ // prompt hasn't completed normally yet.
218
+ req.on("close", () => {
219
+ if (!completed) {
220
+ cleanup();
221
+ // Abort the in-flight LLM call to stop wasting tokens
222
+ abortSession();
223
+ }
224
+ });
225
+ // Send the prompt
226
+ await session.prompt(fullMessage);
227
+ }
228
+ catch (err) {
229
+ completed = true;
230
+ cleanup();
231
+ const errMessage = err instanceof Error ? err.message : String(err);
232
+ sendSSE({ type: "error", error: errMessage });
233
+ if (!res.writableEnded) {
234
+ res.end();
235
+ }
236
+ }
237
+ }
238
+ // ---------------------------------------------------------------------------
239
+ // Route: GET /api/config/status
240
+ // ---------------------------------------------------------------------------
241
+ function handleConfigStatus(_req, res) {
242
+ sendJson(res, 200, {
243
+ authenticated: isAuthenticated(),
244
+ provider: getAuthProvider(),
245
+ version: getVersion(),
246
+ });
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // Known API routes (for 405 detection)
250
+ // ---------------------------------------------------------------------------
251
+ const API_ROUTES = {
252
+ "/api/version": "GET",
253
+ "/api/agent": "POST",
254
+ "/api/config/status": "GET",
255
+ };
256
+ // ---------------------------------------------------------------------------
257
+ // Request router
258
+ // ---------------------------------------------------------------------------
259
+ async function handleRequest(req, res, taskpaneRoot) {
260
+ const method = req.method ?? "GET";
261
+ const rawUrl = req.url ?? "/";
262
+ // Strip query string for route matching
263
+ const url = rawUrl.split("?")[0];
264
+ // Handle CORS preflight
265
+ if (method === "OPTIONS") {
266
+ res.writeHead(204, {
267
+ "Access-Control-Allow-Origin": "*",
268
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
269
+ "Access-Control-Allow-Headers": "Content-Type",
270
+ "Access-Control-Max-Age": "86400",
271
+ });
272
+ res.end();
273
+ return;
274
+ }
275
+ // Route matching
276
+ if (url.startsWith("/taskpane")) {
277
+ handleTaskpane(req, res, taskpaneRoot);
278
+ return;
279
+ }
280
+ if (url === "/api/version" && method === "GET") {
281
+ handleVersion(req, res);
282
+ return;
283
+ }
284
+ if (url === "/api/agent" && method === "POST") {
285
+ await handleAgent(req, res);
286
+ return;
287
+ }
288
+ if (url === "/api/config/status" && method === "GET") {
289
+ handleConfigStatus(req, res);
290
+ return;
291
+ }
292
+ // 405 Method Not Allowed for known routes with wrong method
293
+ if (url in API_ROUTES) {
294
+ res.writeHead(405, {
295
+ "Content-Type": "application/json; charset=utf-8",
296
+ "Access-Control-Allow-Origin": "*",
297
+ Allow: API_ROUTES[url],
298
+ });
299
+ res.end(JSON.stringify({ error: `Method ${method} not allowed. Use ${API_ROUTES[url]}.` }));
300
+ return;
301
+ }
302
+ // Root redirect to taskpane
303
+ if (url === "/" || url === "") {
304
+ res.writeHead(302, { Location: "/taskpane/" });
305
+ res.end();
306
+ return;
307
+ }
308
+ sendError(res, 404, "Not found");
309
+ }
310
+ // ---------------------------------------------------------------------------
311
+ // Server lifecycle
312
+ // ---------------------------------------------------------------------------
313
+ let serverInstance = null;
314
+ let verbose = false;
315
+ /** Enable or disable request logging. */
316
+ export function setVerbose(enabled) {
317
+ verbose = enabled;
318
+ }
319
+ /**
320
+ * Start the HTTPS server.
321
+ *
322
+ * @param port - Port to listen on (default: 3001)
323
+ * @param certs - Optional pre-loaded certificates. If not provided, will call ensureCerts().
324
+ */
325
+ export async function startServer(port = 3001, certs) {
326
+ const { key, cert } = certs ?? (await ensureCerts());
327
+ const taskpaneRoot = resolveTaskpaneRoot();
328
+ const server = createServer({ key, cert }, (req, res) => {
329
+ const start = Date.now();
330
+ handleRequest(req, res, taskpaneRoot)
331
+ .then(() => {
332
+ if (verbose) {
333
+ const ms = Date.now() - start;
334
+ console.log(`${req.method} ${req.url} → ${res.statusCode} (${ms}ms)`);
335
+ }
336
+ })
337
+ .catch((err) => {
338
+ console.error("Unhandled request error:", err);
339
+ if (!res.headersSent) {
340
+ sendError(res, 500, "Internal server error");
341
+ }
342
+ });
343
+ });
344
+ serverInstance = server;
345
+ return new Promise((resolve, reject) => {
346
+ server.on("error", (err) => {
347
+ if (err.code === "EADDRINUSE") {
348
+ reject(new Error(`Port ${port} is already in use. ` +
349
+ `Is another instance of AgentXL running?\n` +
350
+ ` Try: agentxl start --port ${port + 1}`));
351
+ }
352
+ else {
353
+ reject(err);
354
+ }
355
+ });
356
+ server.listen(port, "127.0.0.1", () => {
357
+ resolve();
358
+ });
359
+ });
360
+ }
361
+ /**
362
+ * Stop the HTTPS server gracefully.
363
+ */
364
+ export async function stopServer() {
365
+ return new Promise((resolve) => {
366
+ if (!serverInstance) {
367
+ resolve();
368
+ return;
369
+ }
370
+ serverInstance.close(() => {
371
+ serverInstance = null;
372
+ resolve();
373
+ });
374
+ });
375
+ }
376
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,99 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <OfficeApp
3
+ xmlns="http://schemas.microsoft.com/office/appforoffice/1.1"
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"
6
+ xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides"
7
+ xsi:type="TaskPaneApp">
8
+
9
+ <!-- Unique add-in ID -->
10
+ <Id>a1b2c3d4-e5f6-7890-abcd-ef1234567890</Id>
11
+ <Version>1.0.0</Version>
12
+ <ProviderName>DeltaXY</ProviderName>
13
+ <DefaultLocale>en-US</DefaultLocale>
14
+ <DisplayName DefaultValue="AgentXL" />
15
+ <Description DefaultValue="AI-powered Excel assistant. Chat with AI to read data, write formulas, create charts, and more." />
16
+ <SupportUrl DefaultValue="https://github.com/deltaxy-ai/agentxl" />
17
+
18
+ <!-- Icon -->
19
+ <IconUrl DefaultValue="https://localhost:3001/taskpane/assets/icon-32.png" />
20
+ <HighResolutionIconUrl DefaultValue="https://localhost:3001/taskpane/assets/icon-64.png" />
21
+
22
+ <!-- Excel only -->
23
+ <Hosts>
24
+ <Host Name="Workbook" />
25
+ </Hosts>
26
+
27
+ <!-- Permissions -->
28
+ <DefaultSettings>
29
+ <SourceLocation DefaultValue="https://localhost:3001/taskpane/" />
30
+ </DefaultSettings>
31
+ <Permissions>ReadWriteDocument</Permissions>
32
+
33
+ <!-- Ribbon button -->
34
+ <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0">
35
+ <Hosts>
36
+ <Host xsi:type="Workbook">
37
+ <DesktopFormFactor>
38
+ <GetStarted>
39
+ <Title resid="getStartedTitle" />
40
+ <Description resid="getStartedDescription" />
41
+ <LearnMoreUrl resid="learnMoreUrl" />
42
+ </GetStarted>
43
+
44
+ <!-- Ribbon extension -->
45
+ <ExtensionPoint xsi:type="PrimaryCommandSurface">
46
+ <OfficeTab id="TabHome">
47
+ <Group id="AgentXLGroup">
48
+ <Label resid="groupLabel" />
49
+ <Icon>
50
+ <bt:Image size="16" resid="icon16" />
51
+ <bt:Image size="32" resid="icon32" />
52
+ <bt:Image size="80" resid="icon80" />
53
+ </Icon>
54
+ <Control xsi:type="Button" id="AgentXLButton">
55
+ <Label resid="buttonLabel" />
56
+ <Supertip>
57
+ <Title resid="buttonLabel" />
58
+ <Description resid="buttonTooltip" />
59
+ </Supertip>
60
+ <Icon>
61
+ <bt:Image size="16" resid="icon16" />
62
+ <bt:Image size="32" resid="icon32" />
63
+ <bt:Image size="80" resid="icon80" />
64
+ </Icon>
65
+ <Action xsi:type="ShowTaskpane">
66
+ <TaskpaneId>AgentXLPane</TaskpaneId>
67
+ <SourceLocation resid="taskpaneUrl" />
68
+ </Action>
69
+ </Control>
70
+ </Group>
71
+ </OfficeTab>
72
+ </ExtensionPoint>
73
+ </DesktopFormFactor>
74
+ </Host>
75
+ </Hosts>
76
+
77
+ <!-- Resources -->
78
+ <Resources>
79
+ <bt:Images>
80
+ <bt:Image id="icon16" DefaultValue="https://localhost:3001/taskpane/assets/icon-16.png" />
81
+ <bt:Image id="icon32" DefaultValue="https://localhost:3001/taskpane/assets/icon-32.png" />
82
+ <bt:Image id="icon80" DefaultValue="https://localhost:3001/taskpane/assets/icon-80.png" />
83
+ </bt:Images>
84
+ <bt:Urls>
85
+ <bt:Url id="taskpaneUrl" DefaultValue="https://localhost:3001/taskpane/" />
86
+ <bt:Url id="learnMoreUrl" DefaultValue="https://github.com/deltaxy-ai/agentxl" />
87
+ </bt:Urls>
88
+ <bt:ShortStrings>
89
+ <bt:String id="groupLabel" DefaultValue="AgentXL" />
90
+ <bt:String id="buttonLabel" DefaultValue="AgentXL" />
91
+ <bt:String id="getStartedTitle" DefaultValue="AgentXL is ready!" />
92
+ </bt:ShortStrings>
93
+ <bt:LongStrings>
94
+ <bt:String id="buttonTooltip" DefaultValue="Open the AgentXL AI assistant panel" />
95
+ <bt:String id="getStartedDescription" DefaultValue="Click the AgentXL button on the Home tab to start chatting with your AI assistant." />
96
+ </bt:LongStrings>
97
+ </Resources>
98
+ </VersionOverrides>
99
+ </OfficeApp>