@supyagent/sdk 0.1.39 → 0.2.1

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/index.js CHANGED
@@ -25,7 +25,7 @@ var TTLCache = class {
25
25
  import { tool, jsonSchema } from "ai";
26
26
 
27
27
  // src/core/http-executor.ts
28
- function createExecutor(metadata, baseUrl, apiKey) {
28
+ function createExecutor(metadata, baseUrl, apiKey, accountId) {
29
29
  return async (args) => {
30
30
  const { method, path, bodyDefaults } = metadata;
31
31
  const remainingArgs = { ...args };
@@ -64,7 +64,8 @@ function createExecutor(metadata, baseUrl, apiKey) {
64
64
  method,
65
65
  headers: {
66
66
  Authorization: `Bearer ${apiKey}`,
67
- "Content-Type": "application/json"
67
+ "Content-Type": "application/json",
68
+ ...accountId ? { "X-Account-Id": accountId } : {}
68
69
  }
69
70
  };
70
71
  if (method === "GET" || method === "DELETE") {
@@ -87,7 +88,7 @@ function createExecutor(metadata, baseUrl, apiKey) {
87
88
  }
88
89
 
89
90
  // src/core/tool-converter.ts
90
- function convertTools(tools, baseUrl, apiKey) {
91
+ function convertTools(tools, baseUrl, apiKey, accountId) {
91
92
  const result = {};
92
93
  for (const t of tools) {
93
94
  const { name, description, parameters } = t.function;
@@ -95,7 +96,7 @@ function convertTools(tools, baseUrl, apiKey) {
95
96
  result[name] = tool({
96
97
  description,
97
98
  inputSchema: jsonSchema(parameters),
98
- execute: async (args) => createExecutor(metadata, baseUrl, apiKey)(args)
99
+ execute: async (args) => createExecutor(metadata, baseUrl, apiKey, accountId)(args)
99
100
  });
100
101
  }
101
102
  return result;
@@ -219,7 +220,7 @@ function createLoadSkillTool(skills) {
219
220
  });
220
221
  }
221
222
  var VALID_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "PATCH", "DELETE"]);
222
- function createApiCallTool(baseUrl, apiKey) {
223
+ function createApiCallTool(baseUrl, apiKey, accountId) {
223
224
  return tool2({
224
225
  description: "Make an authenticated HTTP request to the Supyagent API. Use loadSkill first to understand available endpoints. The authorization header and base URL are handled automatically \u2014 only provide the path (e.g., /api/v1/google/gmail/messages).",
225
226
  inputSchema: jsonSchema2({
@@ -276,7 +277,8 @@ function createApiCallTool(baseUrl, apiKey) {
276
277
  method,
277
278
  headers: {
278
279
  Authorization: `Bearer ${apiKey}`,
279
- "Content-Type": "application/json"
280
+ "Content-Type": "application/json",
281
+ ...accountId ? { "X-Account-Id": accountId } : {}
280
282
  }
281
283
  };
282
284
  if (body && method !== "GET" && method !== "DELETE") {
@@ -301,32 +303,41 @@ function createApiCallTool(baseUrl, apiKey) {
301
303
  // src/core/client.ts
302
304
  var DEFAULT_BASE_URL = "https://app.supyagent.com";
303
305
  var CACHE_KEY = "tools";
304
- function supyagent(options) {
305
- const { apiKey, baseUrl = DEFAULT_BASE_URL } = options;
306
- const cache = new TTLCache();
306
+ function createFetcher(baseUrl, apiKey, accountId) {
307
+ return async function fetcher(path, init) {
308
+ const res = await fetch(`${baseUrl}${path}`, {
309
+ ...init,
310
+ headers: {
311
+ Authorization: `Bearer ${apiKey}`,
312
+ ...accountId ? { "X-Account-Id": accountId } : {},
313
+ ...init?.headers ?? {}
314
+ }
315
+ });
316
+ if (!res.ok) {
317
+ const text = await res.text();
318
+ throw new Error(`Supyagent API error (${res.status}): ${text}`);
319
+ }
320
+ return res;
321
+ };
322
+ }
323
+ function createDataPlane(fetcher, baseUrl, apiKey, accountId) {
324
+ const toolsCache = new TTLCache();
307
325
  const skillsCache = new TTLCache();
308
326
  const meCache = new TTLCache();
309
327
  return {
310
328
  async tools(filterOptions) {
311
329
  const cacheTTL = resolveCacheTTL(filterOptions?.cache);
312
- let response = cacheTTL > 0 ? cache.get(CACHE_KEY) : void 0;
330
+ let response = cacheTTL > 0 ? toolsCache.get(CACHE_KEY) : void 0;
313
331
  if (!response) {
314
- const res = await fetch(`${baseUrl}/api/v1/tools`, {
332
+ const res = await fetcher("/api/v1/tools", {
315
333
  headers: {
316
- Authorization: `Bearer ${apiKey}`,
317
334
  "Content-Type": "application/json"
318
335
  }
319
336
  });
320
- if (!res.ok) {
321
- const error = await res.text();
322
- throw new Error(
323
- `Supyagent API error (${res.status}): ${error}`
324
- );
325
- }
326
337
  const json = await res.json();
327
338
  response = json.data ?? json;
328
339
  if (cacheTTL > 0) {
329
- cache.set(CACHE_KEY, response, cacheTTL);
340
+ toolsCache.set(CACHE_KEY, response, cacheTTL);
330
341
  }
331
342
  }
332
343
  const toolBaseUrl = response.base_url || baseUrl;
@@ -335,23 +346,13 @@ function supyagent(options) {
335
346
  only: filterOptions?.only,
336
347
  except: filterOptions?.except
337
348
  });
338
- return convertTools(filtered, toolBaseUrl, apiKey);
349
+ return convertTools(filtered, toolBaseUrl, apiKey, accountId);
339
350
  },
340
- async skills(options2) {
341
- const cacheTTL = resolveCacheTTL(options2?.cache);
351
+ async skills(options) {
352
+ const cacheTTL = resolveCacheTTL(options?.cache);
342
353
  let parsed = cacheTTL > 0 ? skillsCache.get("skills") : void 0;
343
354
  if (!parsed) {
344
- const res = await fetch(`${baseUrl}/api/v1/skills`, {
345
- headers: {
346
- Authorization: `Bearer ${apiKey}`
347
- }
348
- });
349
- if (!res.ok) {
350
- const error = await res.text();
351
- throw new Error(
352
- `Supyagent API error (${res.status}): ${error}`
353
- );
354
- }
355
+ const res = await fetcher("/api/v1/skills");
355
356
  parsed = parseSkillsMarkdown(await res.text());
356
357
  if (cacheTTL > 0) {
357
358
  skillsCache.set("skills", parsed, cacheTTL);
@@ -361,25 +362,15 @@ function supyagent(options) {
361
362
  systemPrompt: buildSkillsSystemPrompt(parsed),
362
363
  tools: {
363
364
  loadSkill: createLoadSkillTool(parsed.skills),
364
- apiCall: createApiCallTool(baseUrl, apiKey)
365
+ apiCall: createApiCallTool(baseUrl, apiKey, accountId)
365
366
  }
366
367
  };
367
368
  },
368
- async me(options2) {
369
- const cacheTTL = resolveCacheTTL(options2?.cache);
369
+ async me(options) {
370
+ const cacheTTL = resolveCacheTTL(options?.cache);
370
371
  let response = cacheTTL > 0 ? meCache.get("me") : void 0;
371
372
  if (!response) {
372
- const res = await fetch(`${baseUrl}/api/v1/me`, {
373
- headers: {
374
- Authorization: `Bearer ${apiKey}`
375
- }
376
- });
377
- if (!res.ok) {
378
- const error = await res.text();
379
- throw new Error(
380
- `Supyagent API error (${res.status}): ${error}`
381
- );
382
- }
373
+ const res = await fetcher("/api/v1/me");
383
374
  const json = await res.json();
384
375
  response = json.data ?? json;
385
376
  if (cacheTTL > 0) {
@@ -387,6 +378,177 @@ function supyagent(options) {
387
378
  }
388
379
  }
389
380
  return response;
381
+ },
382
+ async searchTools(query) {
383
+ const res = await fetcher(`/api/v1/tools/search/${encodeURIComponent(query)}`);
384
+ const json = await res.json();
385
+ const data = json.data ?? json;
386
+ return {
387
+ tools: Array.isArray(data.tools) ? data.tools : [],
388
+ total: data.total ?? 0
389
+ };
390
+ },
391
+ async toolsByProvider(provider) {
392
+ const res = await fetcher(`/api/v1/tools/provider/${encodeURIComponent(provider)}`);
393
+ const json = await res.json();
394
+ const data = json.data ?? json;
395
+ return {
396
+ tools: Array.isArray(data.tools) ? data.tools : [],
397
+ total: data.total ?? 0
398
+ };
399
+ },
400
+ async toolsByService(service) {
401
+ const res = await fetcher(`/api/v1/tools/service/${encodeURIComponent(service)}`);
402
+ const json = await res.json();
403
+ const data = json.data ?? json;
404
+ return {
405
+ tools: Array.isArray(data.tools) ? data.tools : [],
406
+ total: data.total ?? 0
407
+ };
408
+ }
409
+ };
410
+ }
411
+ function supyagent(options) {
412
+ const { apiKey, baseUrl = DEFAULT_BASE_URL } = options;
413
+ const fetcher = createFetcher(baseUrl, apiKey);
414
+ const dataPlane = createDataPlane(fetcher, baseUrl, apiKey);
415
+ async function apiCall(method, path, body) {
416
+ const res = await fetcher(path, {
417
+ method,
418
+ ...body ? { headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) } : {}
419
+ });
420
+ const json = await res.json();
421
+ return json.data ?? json;
422
+ }
423
+ return {
424
+ ...dataPlane,
425
+ accounts: createAccountsClient(apiCall),
426
+ asAccount(externalId) {
427
+ const scopedFetcher = createFetcher(baseUrl, apiKey, externalId);
428
+ const scopedDataPlane = createDataPlane(scopedFetcher, baseUrl, apiKey, externalId);
429
+ return {
430
+ accountId: externalId,
431
+ ...scopedDataPlane
432
+ };
433
+ }
434
+ };
435
+ }
436
+ function createAccountsClient(apiCall) {
437
+ function toAccount(raw) {
438
+ return {
439
+ id: raw.id,
440
+ externalId: raw.external_id,
441
+ displayName: raw.display_name ?? null,
442
+ metadata: raw.metadata ?? {},
443
+ createdAt: raw.created_at
444
+ };
445
+ }
446
+ function toIntegration(raw) {
447
+ return {
448
+ id: raw.id,
449
+ provider: raw.provider,
450
+ status: raw.status,
451
+ connectedAt: raw.connected_at
452
+ };
453
+ }
454
+ function toIntegrationDetail(raw) {
455
+ const services = raw.enabled_services ?? [];
456
+ return {
457
+ ...toIntegration(raw),
458
+ enabledServices: services.map((s) => ({
459
+ serviceName: s.service_name,
460
+ isEnabled: s.is_enabled
461
+ }))
462
+ };
463
+ }
464
+ return {
465
+ async create(opts) {
466
+ const raw = await apiCall("POST", "/api/v1/accounts", {
467
+ external_id: opts.externalId,
468
+ ...opts.displayName != null ? { display_name: opts.displayName } : {},
469
+ ...opts.metadata != null ? { metadata: opts.metadata } : {}
470
+ });
471
+ return toAccount(raw);
472
+ },
473
+ async list(opts) {
474
+ const params = new URLSearchParams();
475
+ if (opts?.limit != null) params.set("limit", String(opts.limit));
476
+ if (opts?.offset != null) params.set("offset", String(opts.offset));
477
+ const qs = params.toString();
478
+ const raw = await apiCall(
479
+ "GET",
480
+ `/api/v1/accounts${qs ? `?${qs}` : ""}`
481
+ );
482
+ return {
483
+ accounts: (raw.accounts ?? []).map(toAccount),
484
+ total: raw.total,
485
+ limit: raw.limit,
486
+ offset: raw.offset
487
+ };
488
+ },
489
+ async get(id) {
490
+ const raw = await apiCall("GET", `/api/v1/accounts/${id}`);
491
+ return {
492
+ ...toAccount(raw),
493
+ integrations: (raw.integrations ?? []).map(
494
+ toIntegration
495
+ )
496
+ };
497
+ },
498
+ async update(id, opts) {
499
+ const body = {};
500
+ if (opts.displayName !== void 0) body.display_name = opts.displayName;
501
+ if (opts.metadata !== void 0) body.metadata = opts.metadata;
502
+ const raw = await apiCall("PATCH", `/api/v1/accounts/${id}`, body);
503
+ return toAccount(raw);
504
+ },
505
+ async delete(id) {
506
+ return apiCall("DELETE", `/api/v1/accounts/${id}`);
507
+ },
508
+ async connect(id, opts) {
509
+ const raw = await apiCall(
510
+ "POST",
511
+ `/api/v1/accounts/${id}/connect`,
512
+ {
513
+ provider: opts.provider,
514
+ redirect_url: opts.redirectUrl,
515
+ ...opts.scopes ? { scopes: opts.scopes } : {}
516
+ }
517
+ );
518
+ return {
519
+ connectUrl: raw.connect_url,
520
+ sessionId: raw.session_id,
521
+ expiresAt: raw.expires_at
522
+ };
523
+ },
524
+ async getSession(id, sessionId) {
525
+ const raw = await apiCall(
526
+ "GET",
527
+ `/api/v1/accounts/${id}/connect/${sessionId}`
528
+ );
529
+ return {
530
+ sessionId: raw.session_id,
531
+ provider: raw.provider,
532
+ status: raw.status,
533
+ ...raw.error ? { error: raw.error } : {},
534
+ createdAt: raw.created_at,
535
+ expiresAt: raw.expires_at
536
+ };
537
+ },
538
+ async integrations(id) {
539
+ const raw = await apiCall(
540
+ "GET",
541
+ `/api/v1/accounts/${id}/integrations`
542
+ );
543
+ return (raw.integrations ?? []).map(
544
+ toIntegrationDetail
545
+ );
546
+ },
547
+ async disconnect(id, provider) {
548
+ return apiCall(
549
+ "DELETE",
550
+ `/api/v1/accounts/${id}/integrations/${provider}`
551
+ );
390
552
  }
391
553
  };
392
554
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/cache.ts","../src/core/tool-converter.ts","../src/core/http-executor.ts","../src/core/skill-parser.ts","../src/tools/skills.ts","../src/core/client.ts","../src/tools/bash.ts","../src/tools/view-image.ts"],"sourcesContent":["interface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\nexport class TTLCache<T> {\n private store = new Map<string, CacheEntry<T>>();\n\n get(key: string): T | undefined {\n const entry = this.store.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n return entry.data;\n }\n\n set(key: string, data: T, ttlSeconds: number): void {\n this.store.set(key, {\n data,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","import { tool, jsonSchema } from \"ai\";\nimport type { OpenAITool } from \"./types.js\";\nimport { createExecutor } from \"./http-executor.js\";\n\n/**\n * Converts an array of OpenAI-format tools from the supyagent API\n * into a Record of AI SDK tool() instances ready for streamText/generateText.\n */\nexport function convertTools(\n tools: OpenAITool[],\n baseUrl: string,\n apiKey: string\n): Record<string, import(\"ai\").Tool> {\n const result: Record<string, import(\"ai\").Tool> = {};\n\n for (const t of tools) {\n const { name, description, parameters } = t.function;\n const metadata = t.metadata;\n\n result[name] = tool({\n description,\n inputSchema: jsonSchema(parameters as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => createExecutor(metadata, baseUrl, apiKey)(args as Record<string, unknown>),\n });\n }\n\n return result;\n}\n\n/**\n * Filter tools by provider, service, or tool name.\n */\nexport function filterTools(\n tools: OpenAITool[],\n options: { only?: string[]; except?: string[] }\n): OpenAITool[] {\n let filtered = tools;\n\n if (options.only && options.only.length > 0) {\n const onlySet = new Set(options.only.map((s) => s.toLowerCase()));\n filtered = filtered.filter((t) => {\n const name = t.function.name.toLowerCase();\n const provider = t.metadata.provider.toLowerCase();\n const service = t.metadata.service.toLowerCase();\n return onlySet.has(name) || onlySet.has(provider) || onlySet.has(service);\n });\n }\n\n if (options.except && options.except.length > 0) {\n const exceptSet = new Set(options.except.map((s) => s.toLowerCase()));\n filtered = filtered.filter((t) => {\n const name = t.function.name.toLowerCase();\n const provider = t.metadata.provider.toLowerCase();\n const service = t.metadata.service.toLowerCase();\n return (\n !exceptSet.has(name) &&\n !exceptSet.has(provider) &&\n !exceptSet.has(service)\n );\n });\n }\n\n return filtered;\n}\n","import type { ToolMetadata } from \"./types.js\";\n\n/**\n * Creates an execute function for a tool that calls the supyagent API.\n *\n * Handles:\n * - Path parameter substitution (e.g., {messageId} in /api/v1/gmail/messages/{messageId})\n * - GET/DELETE: remaining args → query string\n * - POST/PUT/PATCH: merge bodyDefaults + remaining args → JSON body\n */\nexport function createExecutor(\n metadata: ToolMetadata,\n baseUrl: string,\n apiKey: string\n): (args: Record<string, unknown>) => Promise<unknown> {\n return async (args: Record<string, unknown>) => {\n const { method, path, bodyDefaults } = metadata;\n\n // Extract path parameters and substitute into the path\n const remainingArgs = { ...args };\n let resolvedPath = path;\n\n const pathParams = path.match(/\\{(\\w+)\\}/g);\n if (pathParams) {\n for (const param of pathParams) {\n const paramName = param.slice(1, -1);\n if (paramName in remainingArgs) {\n resolvedPath = resolvedPath.replace(\n param,\n encodeURIComponent(String(remainingArgs[paramName]))\n );\n delete remainingArgs[paramName];\n }\n }\n\n // Fallback: LLMs often send { id } instead of { messageId }, { eventId }, etc.\n // because list responses return objects with an `id` field.\n // For any unresolved {fooId} param, try `id` from the args (once only).\n if (\"id\" in remainingArgs && resolvedPath.includes(\"{\")) {\n const unresolved = resolvedPath.match(/\\{(\\w+)\\}/g);\n if (unresolved) {\n for (const param of unresolved) {\n const paramName = param.slice(1, -1);\n if (paramName.toLowerCase().endsWith(\"id\")) {\n resolvedPath = resolvedPath.replace(\n param,\n encodeURIComponent(String(remainingArgs.id))\n );\n delete remainingArgs.id;\n break; // consume `id` only once\n }\n }\n }\n }\n }\n\n let url = `${baseUrl}${resolvedPath}`;\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n };\n\n if (method === \"GET\" || method === \"DELETE\") {\n // Remaining args go as query parameters\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(remainingArgs)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n } else {\n // POST/PUT/PATCH: merge bodyDefaults with remaining args\n const body = { ...bodyDefaults, ...remainingArgs };\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n const data = await response.json();\n return data;\n };\n}\n","import type { ParsedSkill, ParsedSkillsDocument } from \"./types.js\";\n\n/**\n * Parse YAML frontmatter from the beginning of a markdown document.\n */\nfunction parseFrontmatter(markdown: string): {\n frontmatter: { name: string; description: string };\n body: string;\n} {\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return {\n frontmatter: { name: \"supyagent-skills\", description: \"\" },\n body: markdown,\n };\n }\n\n const [, yamlBlock, body] = match;\n const fields: Record<string, string> = {};\n for (const line of yamlBlock!.split(\"\\n\")) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n fields[key] = value;\n }\n }\n\n return {\n frontmatter: {\n name: fields.name || \"supyagent-skills\",\n description: fields.description || \"\",\n },\n body: body!,\n };\n}\n\n/**\n * Extract the skill name from a section starting with `# Name`.\n */\nfunction extractSkillName(section: string): string {\n const match = section.match(/^#\\s+(.+)/m);\n return match ? match[1].trim() : \"Unknown\";\n}\n\n/**\n * Parse the aggregated skills markdown into structured sections.\n */\nexport function parseSkillsMarkdown(markdown: string): ParsedSkillsDocument {\n const { frontmatter, body } = parseFrontmatter(markdown);\n\n // Split body on \\n---\\n (the section separator)\n const parts = body.split(/\\n---\\n/);\n\n // First part is the preamble (general header info)\n const preamble = (parts[0] || \"\").trim();\n\n // Remaining parts are individual skill sections\n const skills: ParsedSkill[] = [];\n for (let i = 1; i < parts.length; i++) {\n const content = parts[i]!.trim();\n if (!content) continue;\n const name = extractSkillName(content);\n skills.push({ name, content });\n }\n\n return { frontmatter, preamble, skills };\n}\n\n/**\n * Build a concise system prompt from parsed skills.\n * Lists available skills with one-line summaries, not full docs.\n */\nexport function buildSkillsSystemPrompt(\n doc: ParsedSkillsDocument,\n): string {\n if (doc.skills.length === 0) {\n return \"No skills are currently available. The user has no connected integrations.\";\n }\n\n const skillList = doc.skills.map((s) => `- **${s.name}**`).join(\"\\n\");\n\n return `You have access to the following skills via Supyagent:\n\n${skillList}\n\nTo use a skill:\n1. Call \\`loadSkill\\` with the skill name to get detailed API documentation\n2. Call \\`apiCall\\` to make authenticated HTTP requests to the API endpoints described in the skill docs\n\nAvailable skill names: ${doc.skills.map((s) => s.name).join(\", \")}`;\n}\n\n/**\n * Find a skill by name (case-insensitive).\n */\nexport function findSkill(\n skills: ParsedSkill[],\n name: string,\n): ParsedSkill | null {\n const normalized = name.toLowerCase().trim();\n return (\n skills.find((s) => s.name.toLowerCase() === normalized) ??\n skills.find((s) => s.name.toLowerCase().includes(normalized)) ??\n null\n );\n}\n","import { tool, jsonSchema } from \"ai\";\nimport type { ParsedSkill } from \"../core/types.js\";\nimport { findSkill } from \"../core/skill-parser.js\";\n\n/**\n * Create the loadSkill tool.\n * Returns detailed documentation for a specific skill.\n */\nexport function createLoadSkillTool(skills: ParsedSkill[]) {\n const availableNames = skills.map((s) => s.name).join(\", \");\n\n return tool({\n description: `Load detailed API documentation for a specific skill. Available skills: ${availableNames}. Call this before using apiCall to understand the available endpoints, parameters, and examples.`,\n inputSchema: jsonSchema({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: `The skill name to load. Available: ${availableNames}`,\n },\n },\n required: [\"name\"],\n } as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => {\n const { name } = args as { name: string };\n const skill = findSkill(skills, name);\n\n if (!skill) {\n return {\n error: `Skill \"${name}\" not found. Available skills: ${availableNames}`,\n };\n }\n\n return {\n name: skill.name,\n documentation: skill.content,\n };\n },\n });\n}\n\nconst VALID_METHODS = new Set([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\n\n/**\n * Create the apiCall tool.\n * Makes authenticated HTTP requests to the Supyagent API.\n */\nexport function createApiCallTool(baseUrl: string, apiKey: string) {\n return tool({\n description:\n \"Make an authenticated HTTP request to the Supyagent API. Use loadSkill first to understand available endpoints. The authorization header and base URL are handled automatically — only provide the path (e.g., /api/v1/google/gmail/messages).\",\n inputSchema: jsonSchema({\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n description: \"HTTP method\",\n },\n path: {\n type: \"string\",\n description:\n 'API path starting with /api/v1/ (e.g., \"/api/v1/google/gmail/messages\")',\n },\n body: {\n type: \"object\",\n description: \"Request body for POST/PUT/PATCH requests\",\n additionalProperties: true,\n },\n params: {\n type: \"object\",\n description: \"Query parameters\",\n additionalProperties: true,\n },\n },\n required: [\"method\", \"path\"],\n } as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => {\n const {\n method: rawMethod,\n path,\n body,\n params,\n } = args as {\n method: string;\n path: string;\n body?: Record<string, unknown>;\n params?: Record<string, unknown>;\n };\n\n const method = rawMethod.toUpperCase();\n\n if (!VALID_METHODS.has(method)) {\n return { error: `Invalid HTTP method: ${method}` };\n }\n\n if (!path.startsWith(\"/api/v1/\")) {\n return { error: `Path must start with /api/v1/. Got: ${path}` };\n }\n\n let url = `${baseUrl}${path}`;\n\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n };\n\n if (body && method !== \"GET\" && method !== \"DELETE\") {\n fetchOptions.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, fetchOptions);\n const data = await response.json();\n\n if (!response.ok) {\n return { error: `API returned ${response.status}`, details: data };\n }\n\n return data;\n } catch (err) {\n return {\n error: `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n },\n });\n}\n","import type {\n SupyagentOptions,\n SupyagentClient,\n ToolFilterOptions,\n ToolsResponse,\n SkillsOptions,\n SkillsResult,\n ParsedSkillsDocument,\n MeOptions,\n MeResponse,\n} from \"./types.js\";\nimport { TTLCache } from \"./cache.js\";\nimport { convertTools, filterTools } from \"./tool-converter.js\";\nimport { parseSkillsMarkdown, buildSkillsSystemPrompt } from \"./skill-parser.js\";\nimport { createLoadSkillTool, createApiCallTool } from \"../tools/skills.js\";\n\nconst DEFAULT_BASE_URL = \"https://app.supyagent.com\";\nconst CACHE_KEY = \"tools\";\n\n/**\n * Create a supyagent client for fetching and converting tools.\n *\n * @example\n * ```ts\n * import { supyagent } from '@supyagent/sdk';\n *\n * const client = supyagent({ apiKey: process.env.SUPYAGENT_API_KEY! });\n * const tools = await client.tools({ cache: 300 });\n * ```\n */\nexport function supyagent(options: SupyagentOptions): SupyagentClient {\n const { apiKey, baseUrl = DEFAULT_BASE_URL } = options;\n const cache = new TTLCache<ToolsResponse>();\n const skillsCache = new TTLCache<ParsedSkillsDocument>();\n const meCache = new TTLCache<MeResponse>();\n\n return {\n async tools(filterOptions?: ToolFilterOptions) {\n const cacheTTL = resolveCacheTTL(filterOptions?.cache);\n\n // Check cache\n let response = cacheTTL > 0 ? cache.get(CACHE_KEY) : undefined;\n\n if (!response) {\n // Fetch from API\n const res = await fetch(`${baseUrl}/api/v1/tools`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(\n `Supyagent API error (${res.status}): ${error}`\n );\n }\n\n const json = await res.json();\n // API wraps response in { ok, data: { tools, base_url, total } }\n response = (json.data ?? json) as ToolsResponse;\n\n // Store in cache if TTL > 0\n if (cacheTTL > 0) {\n cache.set(CACHE_KEY, response, cacheTTL);\n }\n }\n\n // Use API-reported base_url for tool execution\n const toolBaseUrl = response.base_url || baseUrl;\n\n // Guard against non-array tools (e.g., API returns empty or unexpected shape)\n const toolsArray = Array.isArray(response.tools) ? response.tools : [];\n\n // Filter\n const filtered = filterTools(toolsArray, {\n only: filterOptions?.only,\n except: filterOptions?.except,\n });\n\n // Convert to AI SDK tools\n return convertTools(filtered, toolBaseUrl, apiKey);\n },\n\n async skills(options?: SkillsOptions): Promise<SkillsResult> {\n const cacheTTL = resolveCacheTTL(options?.cache);\n\n let parsed = cacheTTL > 0 ? skillsCache.get(\"skills\") : undefined;\n\n if (!parsed) {\n const res = await fetch(`${baseUrl}/api/v1/skills`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(\n `Supyagent API error (${res.status}): ${error}`\n );\n }\n\n parsed = parseSkillsMarkdown(await res.text());\n\n if (cacheTTL > 0) {\n skillsCache.set(\"skills\", parsed, cacheTTL);\n }\n }\n\n return {\n systemPrompt: buildSkillsSystemPrompt(parsed),\n tools: {\n loadSkill: createLoadSkillTool(parsed.skills),\n apiCall: createApiCallTool(baseUrl, apiKey),\n },\n };\n },\n\n async me(options?: MeOptions): Promise<MeResponse> {\n const cacheTTL = resolveCacheTTL(options?.cache);\n\n let response = cacheTTL > 0 ? meCache.get(\"me\") : undefined;\n\n if (!response) {\n const res = await fetch(`${baseUrl}/api/v1/me`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n });\n\n if (!res.ok) {\n const error = await res.text();\n throw new Error(\n `Supyagent API error (${res.status}): ${error}`\n );\n }\n\n const json = await res.json();\n response = (json.data ?? json) as MeResponse;\n\n if (cacheTTL > 0) {\n meCache.set(\"me\", response, cacheTTL);\n }\n }\n\n return response;\n },\n };\n}\n\nfunction resolveCacheTTL(cache?: boolean | number): number {\n if (cache === true) return 60;\n if (typeof cache === \"number\") return cache;\n return 0;\n}\n","import { tool, jsonSchema } from \"ai\";\nimport { exec, type ExecException } from \"node:child_process\";\n\nconst MAX_OUTPUT = 30_000;\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n// ── Environment sanitization ────────────────────────────────────────────────\n\nconst SECRET_PATTERNS = [\n /key/i, /secret/i, /token/i, /password/i, /credential/i,\n /auth/i, /private/i, /api_key/i, /apikey/i,\n /^AWS_/i, /^AZURE_/i, /^GCP_/i, /^GITHUB_/i,\n /^DATABASE_URL$/i, /^ENCRYPTION_/i, /^SUPABASE_/i,\n];\n\nconst SAFE_VARS = new Set([\n \"PATH\", \"HOME\", \"USER\", \"SHELL\", \"LANG\", \"LC_ALL\", \"LC_CTYPE\",\n \"TERM\", \"EDITOR\", \"VISUAL\", \"TMPDIR\", \"TMP\", \"TEMP\",\n \"NODE_ENV\", \"NODE_PATH\", \"NODE_OPTIONS\",\n \"NPM_CONFIG_PREFIX\", \"NVM_DIR\", \"NVM_BIN\", \"NVM_INC\",\n \"XDG_CONFIG_HOME\", \"XDG_DATA_HOME\", \"XDG_CACHE_HOME\",\n \"COLORTERM\", \"FORCE_COLOR\", \"NO_COLOR\",\n \"COLUMNS\", \"LINES\", \"SHLVL\", \"PWD\", \"OLDPWD\", \"LOGNAME\",\n \"HOSTNAME\", \"HOSTTYPE\", \"OSTYPE\", \"MACHTYPE\",\n]);\n\nfunction sanitizeEnv(\n env: NodeJS.ProcessEnv,\n opts?: { include?: string[]; exclude?: string[] }\n): Record<string, string> {\n const result: Record<string, string> = {};\n const includeSet = opts?.include ? new Set(opts.include) : null;\n const excludeSet = opts?.exclude ? new Set(opts.exclude) : null;\n\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue;\n if (excludeSet?.has(key)) continue;\n if (includeSet?.has(key)) { result[key] = value; continue; }\n if (SAFE_VARS.has(key)) { result[key] = value; continue; }\n if (SECRET_PATTERNS.some(p => p.test(key))) continue;\n result[key] = value;\n }\n\n result.TERM = \"dumb\";\n return result;\n}\n\nfunction buildEnv(\n policy: BashToolOptions[\"env\"],\n opts?: BashToolOptions\n): Record<string, string> {\n if (typeof policy === \"object\" && policy !== null) {\n return { ...policy, TERM: \"dumb\" };\n }\n switch (policy) {\n case \"inherit\":\n return { ...process.env, TERM: \"dumb\" } as Record<string, string>;\n case \"none\":\n return {\n PATH: process.env.PATH ?? \"/usr/local/bin:/usr/bin:/bin\",\n HOME: process.env.HOME ?? \"/tmp\",\n TERM: \"dumb\",\n };\n case \"safe\":\n default:\n return sanitizeEnv(process.env, {\n include: opts?.envInclude,\n exclude: opts?.envExclude,\n });\n }\n}\n\n// ── Command safety ──────────────────────────────────────────────────────────\n\ntype CommandSafety = \"safe\" | \"dangerous\" | \"unknown\";\n\nconst SAFE_COMMANDS = new Set([\n \"cat\", \"cd\", \"cut\", \"echo\", \"expr\", \"false\", \"grep\", \"egrep\", \"fgrep\",\n \"head\", \"id\", \"ls\", \"nl\", \"paste\", \"pwd\", \"rev\", \"seq\", \"stat\",\n \"tail\", \"tr\", \"true\", \"uname\", \"uniq\", \"wc\", \"which\", \"whoami\",\n \"date\", \"env\", \"printenv\", \"hostname\", \"df\", \"du\", \"file\",\n \"find\", \"rg\", \"tree\", \"less\", \"more\", \"sort\",\n \"diff\", \"md5sum\", \"sha256sum\", \"base64\", \"xxd\", \"hexdump\",\n \"man\", \"help\", \"type\", \"command\", \"test\", \"basename\", \"dirname\",\n \"realpath\", \"readlink\", \"tee\", \"xargs\", \"jq\", \"yq\",\n]);\n\nconst SAFE_GIT_SUBCOMMANDS = new Set([\n \"status\", \"log\", \"diff\", \"show\", \"branch\", \"tag\", \"remote\",\n \"stash\", \"describe\", \"shortlog\", \"blame\", \"reflog\", \"rev-parse\",\n \"ls-files\", \"ls-tree\", \"cat-file\", \"rev-list\", \"name-rev\",\n]);\n\nconst DANGEROUS_PATTERNS = [\n /rm\\s+(-[^\\s]*f|-[^\\s]*r|--force|--recursive).*\\//,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};:/,\n />\\s*\\/dev\\/sd/,\n /mkfs\\./,\n /dd\\s+.*of=\\/dev\\//,\n /shutdown|reboot|halt|poweroff/,\n /chmod\\s+777\\s+\\//,\n /curl.*\\|\\s*(ba)?sh/,\n /wget.*\\|\\s*(ba)?sh/,\n];\n\nfunction classifyCommand(\n command: string,\n extraSafe?: Set<string>,\n extraDeny?: RegExp[],\n): CommandSafety {\n const trimmed = command.trim();\n\n // Check dangerous patterns first\n if (DANGEROUS_PATTERNS.some(p => p.test(trimmed))) return \"dangerous\";\n if (extraDeny?.some(p => p.test(trimmed))) return \"dangerous\";\n\n // Extract base command (strip leading env var assignments)\n const stripped = trimmed.replace(/^(\\w+=\\S+\\s+)*/, \"\");\n const parts = stripped.split(/\\s+/);\n const base = parts[0]?.replace(/^.*\\//, \"\"); // strip path prefix\n\n if (!base) return \"unknown\";\n\n // Check git subcommands\n if (base === \"git\") {\n const sub = parts[1];\n if (sub && SAFE_GIT_SUBCOMMANDS.has(sub)) return \"safe\";\n return \"unknown\";\n }\n\n if (SAFE_COMMANDS.has(base)) return \"safe\";\n if (extraSafe?.has(base)) return \"safe\";\n\n return \"unknown\";\n}\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface BashToolOptions {\n /** Working directory for commands. Defaults to `process.cwd()`. */\n cwd?: string;\n /** Command timeout in milliseconds. Defaults to 30000 (30s). Max 600000 (10m). */\n timeout?: number;\n /** Maximum output length in characters. Defaults to 30000. */\n maxOutput?: number;\n\n /**\n * Command approval policy. Default: \"auto\".\n * - `\"auto\"`: Safe read-only commands (ls, cat, grep...) auto-execute; others require user approval\n * - `\"always\"`: Every command requires user approval before execution\n * - `\"never\"`: No approval required (use only in trusted environments)\n * - `function`: Custom approval logic — return `true` to require approval\n */\n approval?: \"auto\" | \"always\" | \"never\" | ((command: string) => boolean | Promise<boolean>);\n\n /**\n * Environment variable policy. Default: \"safe\".\n * - `\"safe\"`: Strip vars matching secret patterns (KEY, TOKEN, SECRET, PASSWORD, etc.)\n * - `\"inherit\"`: Pass full process.env (NOT recommended for production)\n * - `\"none\"`: Minimal env (PATH, HOME, TERM only)\n * - `Record<string,string>`: Explicit env vars to use\n */\n env?: \"safe\" | \"inherit\" | \"none\" | Record<string, string>;\n\n /** Extra env vars to include even if they match secret patterns. Only used with `env: \"safe\"`. */\n envInclude?: string[];\n /** Extra env vars to exclude beyond default secret patterns. Only used with `env: \"safe\"`. */\n envExclude?: string[];\n\n /** Additional commands to treat as safe (auto-execute without approval in \"auto\" mode). */\n allowCommands?: string[];\n /** Additional patterns to block (never execute, even if approved). */\n denyPatterns?: RegExp[];\n}\n\nexport interface BashToolResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n timedOut?: boolean;\n}\n\n// ── Tool factory ────────────────────────────────────────────────────────────\n\n/**\n * Create a bash tool that executes shell commands on the server.\n *\n * By default, uses \"auto\" approval (safe commands run immediately, others\n * require user approval) and \"safe\" env isolation (strips secret-like\n * environment variables).\n *\n * @example\n * ```ts\n * import { supyagent, createBashTool } from '@supyagent/sdk';\n *\n * const client = supyagent({ apiKey: process.env.SUPYAGENT_API_KEY! });\n * const supyagentTools = await client.tools({ cache: 300 });\n *\n * const tools = {\n * ...supyagentTools,\n * bash: createBashTool({ cwd: '/path/to/project' }),\n * };\n * ```\n */\nexport function createBashTool(options?: BashToolOptions) {\n const cwd = options?.cwd ?? process.cwd();\n const timeout = Math.min(options?.timeout ?? DEFAULT_TIMEOUT, 600_000);\n const maxOutput = options?.maxOutput ?? MAX_OUTPUT;\n const approvalPolicy = options?.approval ?? \"auto\";\n\n const extraSafe = options?.allowCommands ? new Set(options.allowCommands) : undefined;\n const extraDeny = options?.denyPatterns;\n\n const execEnv = buildEnv(options?.env ?? \"safe\", options);\n\n const schema = {\n type: \"object\" as const,\n properties: {\n command: {\n type: \"string\",\n description: \"The bash command to execute\",\n },\n },\n required: [\"command\"],\n };\n\n // Resolve needsApproval based on policy\n const needsApproval =\n approvalPolicy === \"always\"\n ? true\n : approvalPolicy === \"never\"\n ? false\n : async (args: unknown) => {\n const { command } = args as { command: string };\n if (typeof approvalPolicy === \"function\") {\n return approvalPolicy(command);\n }\n // \"auto\" mode — safe commands pass, everything else needs approval\n const safety = classifyCommand(command, extraSafe, extraDeny);\n return safety !== \"safe\";\n };\n\n return tool({\n description:\n \"Execute a bash command on the server. Use this for running shell commands, scripts, package managers, git operations, file manipulation, and system tasks. Returns stdout, stderr, and exit code.\",\n inputSchema: jsonSchema(schema as Parameters<typeof jsonSchema>[0]),\n needsApproval,\n execute: async (args): Promise<BashToolResult> => {\n const { command } = args as { command: string };\n\n // Block dangerous commands even if somehow approved\n if (\n DANGEROUS_PATTERNS.some(p => p.test(command)) ||\n extraDeny?.some(p => p.test(command))\n ) {\n return {\n stdout: \"\",\n stderr: \"Command blocked by safety policy\",\n exitCode: 126,\n durationMs: 0,\n };\n }\n\n const start = Date.now();\n\n return new Promise<BashToolResult>((resolve) => {\n const child = exec(\n command,\n {\n cwd,\n timeout,\n shell: \"/bin/bash\",\n maxBuffer: 10 * 1024 * 1024,\n env: execEnv,\n },\n (error: ExecException | null, stdout: string, stderr: string) => {\n const durationMs = Date.now() - start;\n const timedOut = error?.killed === true;\n const exitCode = timedOut\n ? 124\n : typeof error?.code === \"number\"\n ? error.code\n : error\n ? 1\n : 0;\n\n resolve({\n stdout: truncate(stdout, maxOutput),\n stderr: truncate(stderr, maxOutput),\n exitCode,\n durationMs,\n ...(timedOut ? { timedOut: true } : {}),\n });\n }\n );\n\n child.on(\"error\", () => {\n resolve({\n stdout: \"\",\n stderr: \"Failed to start process\",\n exitCode: 127,\n durationMs: Date.now() - start,\n });\n });\n });\n },\n });\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor(max / 2) - 50;\n return (\n str.slice(0, half) +\n `\\n\\n... (${str.length - max} characters truncated) ...\\n\\n` +\n str.slice(-half)\n );\n}\n","import { tool, jsonSchema } from \"ai\";\n\nexport interface ViewImageToolOptions {\n /**\n * Custom description for the tool.\n * @default \"Display an image in the chat. Use this when you want to show the user an image from a URL.\"\n */\n description?: string;\n}\n\nexport interface ViewImageToolResult {\n url: string;\n displayed: true;\n}\n\n/**\n * Create a viewImage tool that the agent can call to display an image in the chat.\n *\n * On the client side, pair this with the `useViewImageEffect` hook (or equivalent logic)\n * to inject the image as a `FileUIPart` into the conversation. This ensures the image\n * is visible to both the user (rendered as `<img>`) and the model (via `convertToModelMessages`).\n */\nexport function createViewImageTool(options?: ViewImageToolOptions) {\n const schema = {\n type: \"object\" as const,\n properties: {\n url: {\n type: \"string\",\n description: \"The URL of the image to display\",\n },\n },\n required: [\"url\"],\n };\n\n return tool({\n description:\n options?.description ??\n \"Display an image in the chat. Use this when you want to show the user an image from a URL.\",\n inputSchema: jsonSchema(schema as Parameters<typeof jsonSchema>[0]),\n execute: async (args): Promise<ViewImageToolResult> => {\n const { url } = args as { url: string };\n return { url, displayed: true };\n },\n });\n}\n"],"mappings":"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","names":["tool","jsonSchema","tool","jsonSchema","options","tool","jsonSchema","tool","jsonSchema"]}
1
+ {"version":3,"sources":["../src/core/cache.ts","../src/core/tool-converter.ts","../src/core/http-executor.ts","../src/core/skill-parser.ts","../src/tools/skills.ts","../src/core/client.ts","../src/tools/bash.ts","../src/tools/view-image.ts"],"sourcesContent":["interface CacheEntry<T> {\n data: T;\n expiresAt: number;\n}\n\nexport class TTLCache<T> {\n private store = new Map<string, CacheEntry<T>>();\n\n get(key: string): T | undefined {\n const entry = this.store.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n return entry.data;\n }\n\n set(key: string, data: T, ttlSeconds: number): void {\n this.store.set(key, {\n data,\n expiresAt: Date.now() + ttlSeconds * 1000,\n });\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","import { tool, jsonSchema } from \"ai\";\nimport type { OpenAITool } from \"./types.js\";\nimport { createExecutor } from \"./http-executor.js\";\n\n/**\n * Converts an array of OpenAI-format tools from the supyagent API\n * into a Record of AI SDK tool() instances ready for streamText/generateText.\n */\nexport function convertTools(\n tools: OpenAITool[],\n baseUrl: string,\n apiKey: string,\n accountId?: string,\n): Record<string, import(\"ai\").Tool> {\n const result: Record<string, import(\"ai\").Tool> = {};\n\n for (const t of tools) {\n const { name, description, parameters } = t.function;\n const metadata = t.metadata;\n\n result[name] = tool({\n description,\n inputSchema: jsonSchema(parameters as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => createExecutor(metadata, baseUrl, apiKey, accountId)(args as Record<string, unknown>),\n });\n }\n\n return result;\n}\n\n/**\n * Filter tools by provider, service, or tool name.\n */\nexport function filterTools(\n tools: OpenAITool[],\n options: { only?: string[]; except?: string[] }\n): OpenAITool[] {\n let filtered = tools;\n\n if (options.only && options.only.length > 0) {\n const onlySet = new Set(options.only.map((s) => s.toLowerCase()));\n filtered = filtered.filter((t) => {\n const name = t.function.name.toLowerCase();\n const provider = t.metadata.provider.toLowerCase();\n const service = t.metadata.service.toLowerCase();\n return onlySet.has(name) || onlySet.has(provider) || onlySet.has(service);\n });\n }\n\n if (options.except && options.except.length > 0) {\n const exceptSet = new Set(options.except.map((s) => s.toLowerCase()));\n filtered = filtered.filter((t) => {\n const name = t.function.name.toLowerCase();\n const provider = t.metadata.provider.toLowerCase();\n const service = t.metadata.service.toLowerCase();\n return (\n !exceptSet.has(name) &&\n !exceptSet.has(provider) &&\n !exceptSet.has(service)\n );\n });\n }\n\n return filtered;\n}\n","import type { ToolMetadata } from \"./types.js\";\n\n/**\n * Creates an execute function for a tool that calls the supyagent API.\n *\n * Handles:\n * - Path parameter substitution (e.g., {messageId} in /api/v1/gmail/messages/{messageId})\n * - GET/DELETE: remaining args → query string\n * - POST/PUT/PATCH: merge bodyDefaults + remaining args → JSON body\n */\nexport function createExecutor(\n metadata: ToolMetadata,\n baseUrl: string,\n apiKey: string,\n accountId?: string,\n): (args: Record<string, unknown>) => Promise<unknown> {\n return async (args: Record<string, unknown>) => {\n const { method, path, bodyDefaults } = metadata;\n\n // Extract path parameters and substitute into the path\n const remainingArgs = { ...args };\n let resolvedPath = path;\n\n const pathParams = path.match(/\\{(\\w+)\\}/g);\n if (pathParams) {\n for (const param of pathParams) {\n const paramName = param.slice(1, -1);\n if (paramName in remainingArgs) {\n resolvedPath = resolvedPath.replace(\n param,\n encodeURIComponent(String(remainingArgs[paramName]))\n );\n delete remainingArgs[paramName];\n }\n }\n\n // Fallback: LLMs often send { id } instead of { messageId }, { eventId }, etc.\n // because list responses return objects with an `id` field.\n // For any unresolved {fooId} param, try `id` from the args (once only).\n if (\"id\" in remainingArgs && resolvedPath.includes(\"{\")) {\n const unresolved = resolvedPath.match(/\\{(\\w+)\\}/g);\n if (unresolved) {\n for (const param of unresolved) {\n const paramName = param.slice(1, -1);\n if (paramName.toLowerCase().endsWith(\"id\")) {\n resolvedPath = resolvedPath.replace(\n param,\n encodeURIComponent(String(remainingArgs.id))\n );\n delete remainingArgs.id;\n break; // consume `id` only once\n }\n }\n }\n }\n }\n\n let url = `${baseUrl}${resolvedPath}`;\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(accountId ? { \"X-Account-Id\": accountId } : {}),\n },\n };\n\n if (method === \"GET\" || method === \"DELETE\") {\n // Remaining args go as query parameters\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(remainingArgs)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) url += `?${qs}`;\n } else {\n // POST/PUT/PATCH: merge bodyDefaults with remaining args\n const body = { ...bodyDefaults, ...remainingArgs };\n fetchOptions.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n const data = await response.json();\n return data;\n };\n}\n","import type { ParsedSkill, ParsedSkillsDocument } from \"./types.js\";\n\n/**\n * Parse YAML frontmatter from the beginning of a markdown document.\n */\nfunction parseFrontmatter(markdown: string): {\n frontmatter: { name: string; description: string };\n body: string;\n} {\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return {\n frontmatter: { name: \"supyagent-skills\", description: \"\" },\n body: markdown,\n };\n }\n\n const [, yamlBlock, body] = match;\n const fields: Record<string, string> = {};\n for (const line of yamlBlock!.split(\"\\n\")) {\n const colonIndex = line.indexOf(\":\");\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n fields[key] = value;\n }\n }\n\n return {\n frontmatter: {\n name: fields.name || \"supyagent-skills\",\n description: fields.description || \"\",\n },\n body: body!,\n };\n}\n\n/**\n * Extract the skill name from a section starting with `# Name`.\n */\nfunction extractSkillName(section: string): string {\n const match = section.match(/^#\\s+(.+)/m);\n return match ? match[1].trim() : \"Unknown\";\n}\n\n/**\n * Parse the aggregated skills markdown into structured sections.\n */\nexport function parseSkillsMarkdown(markdown: string): ParsedSkillsDocument {\n const { frontmatter, body } = parseFrontmatter(markdown);\n\n // Split body on \\n---\\n (the section separator)\n const parts = body.split(/\\n---\\n/);\n\n // First part is the preamble (general header info)\n const preamble = (parts[0] || \"\").trim();\n\n // Remaining parts are individual skill sections\n const skills: ParsedSkill[] = [];\n for (let i = 1; i < parts.length; i++) {\n const content = parts[i]!.trim();\n if (!content) continue;\n const name = extractSkillName(content);\n skills.push({ name, content });\n }\n\n return { frontmatter, preamble, skills };\n}\n\n/**\n * Build a concise system prompt from parsed skills.\n * Lists available skills with one-line summaries, not full docs.\n */\nexport function buildSkillsSystemPrompt(\n doc: ParsedSkillsDocument,\n): string {\n if (doc.skills.length === 0) {\n return \"No skills are currently available. The user has no connected integrations.\";\n }\n\n const skillList = doc.skills.map((s) => `- **${s.name}**`).join(\"\\n\");\n\n return `You have access to the following skills via Supyagent:\n\n${skillList}\n\nTo use a skill:\n1. Call \\`loadSkill\\` with the skill name to get detailed API documentation\n2. Call \\`apiCall\\` to make authenticated HTTP requests to the API endpoints described in the skill docs\n\nAvailable skill names: ${doc.skills.map((s) => s.name).join(\", \")}`;\n}\n\n/**\n * Find a skill by name (case-insensitive).\n */\nexport function findSkill(\n skills: ParsedSkill[],\n name: string,\n): ParsedSkill | null {\n const normalized = name.toLowerCase().trim();\n return (\n skills.find((s) => s.name.toLowerCase() === normalized) ??\n skills.find((s) => s.name.toLowerCase().includes(normalized)) ??\n null\n );\n}\n","import { tool, jsonSchema } from \"ai\";\nimport type { ParsedSkill } from \"../core/types.js\";\nimport { findSkill } from \"../core/skill-parser.js\";\n\n/**\n * Create the loadSkill tool.\n * Returns detailed documentation for a specific skill.\n */\nexport function createLoadSkillTool(skills: ParsedSkill[]) {\n const availableNames = skills.map((s) => s.name).join(\", \");\n\n return tool({\n description: `Load detailed API documentation for a specific skill. Available skills: ${availableNames}. Call this before using apiCall to understand the available endpoints, parameters, and examples.`,\n inputSchema: jsonSchema({\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: `The skill name to load. Available: ${availableNames}`,\n },\n },\n required: [\"name\"],\n } as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => {\n const { name } = args as { name: string };\n const skill = findSkill(skills, name);\n\n if (!skill) {\n return {\n error: `Skill \"${name}\" not found. Available skills: ${availableNames}`,\n };\n }\n\n return {\n name: skill.name,\n documentation: skill.content,\n };\n },\n });\n}\n\nconst VALID_METHODS = new Set([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"]);\n\n/**\n * Create the apiCall tool.\n * Makes authenticated HTTP requests to the Supyagent API.\n */\nexport function createApiCallTool(baseUrl: string, apiKey: string, accountId?: string) {\n return tool({\n description:\n \"Make an authenticated HTTP request to the Supyagent API. Use loadSkill first to understand available endpoints. The authorization header and base URL are handled automatically — only provide the path (e.g., /api/v1/google/gmail/messages).\",\n inputSchema: jsonSchema({\n type: \"object\",\n properties: {\n method: {\n type: \"string\",\n enum: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"],\n description: \"HTTP method\",\n },\n path: {\n type: \"string\",\n description:\n 'API path starting with /api/v1/ (e.g., \"/api/v1/google/gmail/messages\")',\n },\n body: {\n type: \"object\",\n description: \"Request body for POST/PUT/PATCH requests\",\n additionalProperties: true,\n },\n params: {\n type: \"object\",\n description: \"Query parameters\",\n additionalProperties: true,\n },\n },\n required: [\"method\", \"path\"],\n } as Parameters<typeof jsonSchema>[0]),\n execute: async (args) => {\n const {\n method: rawMethod,\n path,\n body,\n params,\n } = args as {\n method: string;\n path: string;\n body?: Record<string, unknown>;\n params?: Record<string, unknown>;\n };\n\n const method = rawMethod.toUpperCase();\n\n if (!VALID_METHODS.has(method)) {\n return { error: `Invalid HTTP method: ${method}` };\n }\n\n if (!path.startsWith(\"/api/v1/\")) {\n return { error: `Path must start with /api/v1/. Got: ${path}` };\n }\n\n let url = `${baseUrl}${path}`;\n\n if (params && Object.keys(params).length > 0) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n const qs = searchParams.toString();\n if (qs) url += `?${qs}`;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n ...(accountId ? { \"X-Account-Id\": accountId } : {}),\n },\n };\n\n if (body && method !== \"GET\" && method !== \"DELETE\") {\n fetchOptions.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, fetchOptions);\n const data = await response.json();\n\n if (!response.ok) {\n return { error: `API returned ${response.status}`, details: data };\n }\n\n return data;\n } catch (err) {\n return {\n error: `Request failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n },\n });\n}\n","import type {\n SupyagentOptions,\n SupyagentClient,\n ScopedClient,\n ToolFilterOptions,\n ToolsResponse,\n ToolSearchResponse,\n ToolListResponse,\n SkillsOptions,\n SkillsResult,\n ParsedSkillsDocument,\n MeOptions,\n MeResponse,\n AccountsClient,\n ConnectedAccount,\n ConnectedAccountWithIntegrations,\n ListAccountsResponse,\n ConnectSession,\n ConnectSessionStatus,\n AccountIntegrationDetail,\n CreateAccountOptions,\n UpdateAccountOptions,\n ListAccountsOptions,\n ConnectOptions,\n} from \"./types.js\";\nimport { TTLCache } from \"./cache.js\";\nimport { convertTools, filterTools } from \"./tool-converter.js\";\nimport { parseSkillsMarkdown, buildSkillsSystemPrompt } from \"./skill-parser.js\";\nimport { createLoadSkillTool, createApiCallTool } from \"../tools/skills.js\";\n\nconst DEFAULT_BASE_URL = \"https://app.supyagent.com\";\nconst CACHE_KEY = \"tools\";\n\ntype Fetcher = (path: string, init?: RequestInit) => Promise<Response>;\n\nfunction createFetcher(baseUrl: string, apiKey: string, accountId?: string): Fetcher {\n return async function fetcher(path: string, init?: RequestInit) {\n const res = await fetch(`${baseUrl}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n ...(accountId ? { \"X-Account-Id\": accountId } : {}),\n ...((init?.headers as Record<string, string>) ?? {}),\n },\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Supyagent API error (${res.status}): ${text}`);\n }\n return res;\n };\n}\n\nfunction createDataPlane(\n fetcher: Fetcher,\n baseUrl: string,\n apiKey: string,\n accountId?: string,\n) {\n const toolsCache = new TTLCache<ToolsResponse>();\n const skillsCache = new TTLCache<ParsedSkillsDocument>();\n const meCache = new TTLCache<MeResponse>();\n\n return {\n async tools(filterOptions?: ToolFilterOptions) {\n const cacheTTL = resolveCacheTTL(filterOptions?.cache);\n\n // Check cache\n let response = cacheTTL > 0 ? toolsCache.get(CACHE_KEY) : undefined;\n\n if (!response) {\n // Fetch from API\n const res = await fetcher(\"/api/v1/tools\", {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n\n const json = await res.json();\n // API wraps response in { ok, data: { tools, base_url, total } }\n response = (json.data ?? json) as ToolsResponse;\n\n // Store in cache if TTL > 0\n if (cacheTTL > 0) {\n toolsCache.set(CACHE_KEY, response, cacheTTL);\n }\n }\n\n // Use API-reported base_url for tool execution\n const toolBaseUrl = response.base_url || baseUrl;\n\n // Guard against non-array tools (e.g., API returns empty or unexpected shape)\n const toolsArray = Array.isArray(response.tools) ? response.tools : [];\n\n // Filter\n const filtered = filterTools(toolsArray, {\n only: filterOptions?.only,\n except: filterOptions?.except,\n });\n\n // Convert to AI SDK tools\n return convertTools(filtered, toolBaseUrl, apiKey, accountId);\n },\n\n async skills(options?: SkillsOptions): Promise<SkillsResult> {\n const cacheTTL = resolveCacheTTL(options?.cache);\n\n let parsed = cacheTTL > 0 ? skillsCache.get(\"skills\") : undefined;\n\n if (!parsed) {\n const res = await fetcher(\"/api/v1/skills\");\n\n parsed = parseSkillsMarkdown(await res.text());\n\n if (cacheTTL > 0) {\n skillsCache.set(\"skills\", parsed, cacheTTL);\n }\n }\n\n return {\n systemPrompt: buildSkillsSystemPrompt(parsed),\n tools: {\n loadSkill: createLoadSkillTool(parsed.skills),\n apiCall: createApiCallTool(baseUrl, apiKey, accountId),\n },\n };\n },\n\n async me(options?: MeOptions): Promise<MeResponse> {\n const cacheTTL = resolveCacheTTL(options?.cache);\n\n let response = cacheTTL > 0 ? meCache.get(\"me\") : undefined;\n\n if (!response) {\n const res = await fetcher(\"/api/v1/me\");\n\n const json = await res.json();\n response = (json.data ?? json) as MeResponse;\n\n if (cacheTTL > 0) {\n meCache.set(\"me\", response, cacheTTL);\n }\n }\n\n return response;\n },\n\n async searchTools(query: string): Promise<ToolSearchResponse> {\n const res = await fetcher(`/api/v1/tools/search/${encodeURIComponent(query)}`);\n const json = await res.json();\n const data = (json.data ?? json) as ToolSearchResponse;\n return {\n tools: Array.isArray(data.tools) ? data.tools : [],\n total: data.total ?? 0,\n };\n },\n\n async toolsByProvider(provider: string): Promise<ToolListResponse> {\n const res = await fetcher(`/api/v1/tools/provider/${encodeURIComponent(provider)}`);\n const json = await res.json();\n const data = (json.data ?? json) as ToolListResponse;\n return {\n tools: Array.isArray(data.tools) ? data.tools : [],\n total: data.total ?? 0,\n };\n },\n\n async toolsByService(service: string): Promise<ToolListResponse> {\n const res = await fetcher(`/api/v1/tools/service/${encodeURIComponent(service)}`);\n const json = await res.json();\n const data = (json.data ?? json) as ToolListResponse;\n return {\n tools: Array.isArray(data.tools) ? data.tools : [],\n total: data.total ?? 0,\n };\n },\n };\n}\n\n/**\n * Create a supyagent client for fetching and converting tools.\n *\n * @example\n * ```ts\n * import { supyagent } from '@supyagent/sdk';\n *\n * const client = supyagent({ apiKey: process.env.SUPYAGENT_API_KEY! });\n * const tools = await client.tools({ cache: 300 });\n * ```\n */\nexport function supyagent(options: SupyagentOptions): SupyagentClient {\n const { apiKey, baseUrl = DEFAULT_BASE_URL } = options;\n\n const fetcher = createFetcher(baseUrl, apiKey);\n const dataPlane = createDataPlane(fetcher, baseUrl, apiKey);\n\n async function apiCall<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const res = await fetcher(path, {\n method,\n ...(body ? { headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) } : {}),\n });\n\n const json = await res.json();\n return (json.data ?? json) as T;\n }\n\n return {\n ...dataPlane,\n accounts: createAccountsClient(apiCall),\n asAccount(externalId: string): ScopedClient {\n const scopedFetcher = createFetcher(baseUrl, apiKey, externalId);\n const scopedDataPlane = createDataPlane(scopedFetcher, baseUrl, apiKey, externalId);\n return {\n accountId: externalId,\n ...scopedDataPlane,\n };\n },\n };\n}\n\nfunction createAccountsClient(\n apiCall: <T>(method: string, path: string, body?: Record<string, unknown>) => Promise<T>,\n): AccountsClient {\n function toAccount(raw: Record<string, unknown>): ConnectedAccount {\n return {\n id: raw.id as string,\n externalId: raw.external_id as string,\n displayName: (raw.display_name as string | null) ?? null,\n metadata: (raw.metadata as Record<string, unknown>) ?? {},\n createdAt: raw.created_at as string,\n };\n }\n\n function toIntegration(raw: Record<string, unknown>): {\n id: string;\n provider: string;\n status: string;\n connectedAt: string;\n } {\n return {\n id: raw.id as string,\n provider: raw.provider as string,\n status: raw.status as string,\n connectedAt: raw.connected_at as string,\n };\n }\n\n function toIntegrationDetail(raw: Record<string, unknown>): AccountIntegrationDetail {\n const services = (raw.enabled_services as Array<Record<string, unknown>>) ?? [];\n return {\n ...toIntegration(raw),\n enabledServices: services.map((s) => ({\n serviceName: s.service_name as string,\n isEnabled: s.is_enabled as boolean,\n })),\n };\n }\n\n return {\n async create(opts: CreateAccountOptions): Promise<ConnectedAccount> {\n const raw = await apiCall<Record<string, unknown>>(\"POST\", \"/api/v1/accounts\", {\n external_id: opts.externalId,\n ...(opts.displayName != null ? { display_name: opts.displayName } : {}),\n ...(opts.metadata != null ? { metadata: opts.metadata } : {}),\n });\n return toAccount(raw);\n },\n\n async list(opts?: ListAccountsOptions): Promise<ListAccountsResponse> {\n const params = new URLSearchParams();\n if (opts?.limit != null) params.set(\"limit\", String(opts.limit));\n if (opts?.offset != null) params.set(\"offset\", String(opts.offset));\n const qs = params.toString();\n const raw = await apiCall<Record<string, unknown>>(\n \"GET\",\n `/api/v1/accounts${qs ? `?${qs}` : \"\"}`,\n );\n return {\n accounts: ((raw.accounts as Array<Record<string, unknown>>) ?? []).map(toAccount),\n total: raw.total as number,\n limit: raw.limit as number,\n offset: raw.offset as number,\n };\n },\n\n async get(id: string): Promise<ConnectedAccountWithIntegrations> {\n const raw = await apiCall<Record<string, unknown>>(\"GET\", `/api/v1/accounts/${id}`);\n return {\n ...toAccount(raw),\n integrations: ((raw.integrations as Array<Record<string, unknown>>) ?? []).map(\n toIntegration,\n ),\n };\n },\n\n async update(id: string, opts: UpdateAccountOptions): Promise<ConnectedAccount> {\n const body: Record<string, unknown> = {};\n if (opts.displayName !== undefined) body.display_name = opts.displayName;\n if (opts.metadata !== undefined) body.metadata = opts.metadata;\n const raw = await apiCall<Record<string, unknown>>(\"PATCH\", `/api/v1/accounts/${id}`, body);\n return toAccount(raw);\n },\n\n async delete(id: string): Promise<{ deleted: true }> {\n return apiCall<{ deleted: true }>(\"DELETE\", `/api/v1/accounts/${id}`);\n },\n\n async connect(id: string, opts: ConnectOptions): Promise<ConnectSession> {\n const raw = await apiCall<Record<string, unknown>>(\n \"POST\",\n `/api/v1/accounts/${id}/connect`,\n {\n provider: opts.provider,\n redirect_url: opts.redirectUrl,\n ...(opts.scopes ? { scopes: opts.scopes } : {}),\n },\n );\n return {\n connectUrl: raw.connect_url as string,\n sessionId: raw.session_id as string,\n expiresAt: raw.expires_at as string,\n };\n },\n\n async getSession(id: string, sessionId: string): Promise<ConnectSessionStatus> {\n const raw = await apiCall<Record<string, unknown>>(\n \"GET\",\n `/api/v1/accounts/${id}/connect/${sessionId}`,\n );\n return {\n sessionId: raw.session_id as string,\n provider: raw.provider as string,\n status: raw.status as string,\n ...(raw.error ? { error: raw.error as string } : {}),\n createdAt: raw.created_at as string,\n expiresAt: raw.expires_at as string,\n };\n },\n\n async integrations(id: string): Promise<AccountIntegrationDetail[]> {\n const raw = await apiCall<Record<string, unknown>>(\n \"GET\",\n `/api/v1/accounts/${id}/integrations`,\n );\n return ((raw.integrations as Array<Record<string, unknown>>) ?? []).map(\n toIntegrationDetail,\n );\n },\n\n async disconnect(id: string, provider: string): Promise<{ deleted: true; provider: string }> {\n return apiCall<{ deleted: true; provider: string }>(\n \"DELETE\",\n `/api/v1/accounts/${id}/integrations/${provider}`,\n );\n },\n };\n}\n\nfunction resolveCacheTTL(cache?: boolean | number): number {\n if (cache === true) return 60;\n if (typeof cache === \"number\") return cache;\n return 0;\n}\n","import { tool, jsonSchema } from \"ai\";\nimport { exec, type ExecException } from \"node:child_process\";\n\nconst MAX_OUTPUT = 30_000;\nconst DEFAULT_TIMEOUT = 30_000; // 30 seconds\n\n// ── Environment sanitization ────────────────────────────────────────────────\n\nconst SECRET_PATTERNS = [\n /key/i, /secret/i, /token/i, /password/i, /credential/i,\n /auth/i, /private/i, /api_key/i, /apikey/i,\n /^AWS_/i, /^AZURE_/i, /^GCP_/i, /^GITHUB_/i,\n /^DATABASE_URL$/i, /^ENCRYPTION_/i, /^SUPABASE_/i,\n];\n\nconst SAFE_VARS = new Set([\n \"PATH\", \"HOME\", \"USER\", \"SHELL\", \"LANG\", \"LC_ALL\", \"LC_CTYPE\",\n \"TERM\", \"EDITOR\", \"VISUAL\", \"TMPDIR\", \"TMP\", \"TEMP\",\n \"NODE_ENV\", \"NODE_PATH\", \"NODE_OPTIONS\",\n \"NPM_CONFIG_PREFIX\", \"NVM_DIR\", \"NVM_BIN\", \"NVM_INC\",\n \"XDG_CONFIG_HOME\", \"XDG_DATA_HOME\", \"XDG_CACHE_HOME\",\n \"COLORTERM\", \"FORCE_COLOR\", \"NO_COLOR\",\n \"COLUMNS\", \"LINES\", \"SHLVL\", \"PWD\", \"OLDPWD\", \"LOGNAME\",\n \"HOSTNAME\", \"HOSTTYPE\", \"OSTYPE\", \"MACHTYPE\",\n]);\n\nfunction sanitizeEnv(\n env: NodeJS.ProcessEnv,\n opts?: { include?: string[]; exclude?: string[] }\n): Record<string, string> {\n const result: Record<string, string> = {};\n const includeSet = opts?.include ? new Set(opts.include) : null;\n const excludeSet = opts?.exclude ? new Set(opts.exclude) : null;\n\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue;\n if (excludeSet?.has(key)) continue;\n if (includeSet?.has(key)) { result[key] = value; continue; }\n if (SAFE_VARS.has(key)) { result[key] = value; continue; }\n if (SECRET_PATTERNS.some(p => p.test(key))) continue;\n result[key] = value;\n }\n\n result.TERM = \"dumb\";\n return result;\n}\n\nfunction buildEnv(\n policy: BashToolOptions[\"env\"],\n opts?: BashToolOptions\n): Record<string, string> {\n if (typeof policy === \"object\" && policy !== null) {\n return { ...policy, TERM: \"dumb\" };\n }\n switch (policy) {\n case \"inherit\":\n return { ...process.env, TERM: \"dumb\" } as Record<string, string>;\n case \"none\":\n return {\n PATH: process.env.PATH ?? \"/usr/local/bin:/usr/bin:/bin\",\n HOME: process.env.HOME ?? \"/tmp\",\n TERM: \"dumb\",\n };\n case \"safe\":\n default:\n return sanitizeEnv(process.env, {\n include: opts?.envInclude,\n exclude: opts?.envExclude,\n });\n }\n}\n\n// ── Command safety ──────────────────────────────────────────────────────────\n\ntype CommandSafety = \"safe\" | \"dangerous\" | \"unknown\";\n\nconst SAFE_COMMANDS = new Set([\n \"cat\", \"cd\", \"cut\", \"echo\", \"expr\", \"false\", \"grep\", \"egrep\", \"fgrep\",\n \"head\", \"id\", \"ls\", \"nl\", \"paste\", \"pwd\", \"rev\", \"seq\", \"stat\",\n \"tail\", \"tr\", \"true\", \"uname\", \"uniq\", \"wc\", \"which\", \"whoami\",\n \"date\", \"env\", \"printenv\", \"hostname\", \"df\", \"du\", \"file\",\n \"find\", \"rg\", \"tree\", \"less\", \"more\", \"sort\",\n \"diff\", \"md5sum\", \"sha256sum\", \"base64\", \"xxd\", \"hexdump\",\n \"man\", \"help\", \"type\", \"command\", \"test\", \"basename\", \"dirname\",\n \"realpath\", \"readlink\", \"tee\", \"xargs\", \"jq\", \"yq\",\n]);\n\nconst SAFE_GIT_SUBCOMMANDS = new Set([\n \"status\", \"log\", \"diff\", \"show\", \"branch\", \"tag\", \"remote\",\n \"stash\", \"describe\", \"shortlog\", \"blame\", \"reflog\", \"rev-parse\",\n \"ls-files\", \"ls-tree\", \"cat-file\", \"rev-list\", \"name-rev\",\n]);\n\nconst DANGEROUS_PATTERNS = [\n /rm\\s+(-[^\\s]*f|-[^\\s]*r|--force|--recursive).*\\//,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};:/,\n />\\s*\\/dev\\/sd/,\n /mkfs\\./,\n /dd\\s+.*of=\\/dev\\//,\n /shutdown|reboot|halt|poweroff/,\n /chmod\\s+777\\s+\\//,\n /curl.*\\|\\s*(ba)?sh/,\n /wget.*\\|\\s*(ba)?sh/,\n];\n\nfunction classifyCommand(\n command: string,\n extraSafe?: Set<string>,\n extraDeny?: RegExp[],\n): CommandSafety {\n const trimmed = command.trim();\n\n // Check dangerous patterns first\n if (DANGEROUS_PATTERNS.some(p => p.test(trimmed))) return \"dangerous\";\n if (extraDeny?.some(p => p.test(trimmed))) return \"dangerous\";\n\n // Extract base command (strip leading env var assignments)\n const stripped = trimmed.replace(/^(\\w+=\\S+\\s+)*/, \"\");\n const parts = stripped.split(/\\s+/);\n const base = parts[0]?.replace(/^.*\\//, \"\"); // strip path prefix\n\n if (!base) return \"unknown\";\n\n // Check git subcommands\n if (base === \"git\") {\n const sub = parts[1];\n if (sub && SAFE_GIT_SUBCOMMANDS.has(sub)) return \"safe\";\n return \"unknown\";\n }\n\n if (SAFE_COMMANDS.has(base)) return \"safe\";\n if (extraSafe?.has(base)) return \"safe\";\n\n return \"unknown\";\n}\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface BashToolOptions {\n /** Working directory for commands. Defaults to `process.cwd()`. */\n cwd?: string;\n /** Command timeout in milliseconds. Defaults to 30000 (30s). Max 600000 (10m). */\n timeout?: number;\n /** Maximum output length in characters. Defaults to 30000. */\n maxOutput?: number;\n\n /**\n * Command approval policy. Default: \"auto\".\n * - `\"auto\"`: Safe read-only commands (ls, cat, grep...) auto-execute; others require user approval\n * - `\"always\"`: Every command requires user approval before execution\n * - `\"never\"`: No approval required (use only in trusted environments)\n * - `function`: Custom approval logic — return `true` to require approval\n */\n approval?: \"auto\" | \"always\" | \"never\" | ((command: string) => boolean | Promise<boolean>);\n\n /**\n * Environment variable policy. Default: \"safe\".\n * - `\"safe\"`: Strip vars matching secret patterns (KEY, TOKEN, SECRET, PASSWORD, etc.)\n * - `\"inherit\"`: Pass full process.env (NOT recommended for production)\n * - `\"none\"`: Minimal env (PATH, HOME, TERM only)\n * - `Record<string,string>`: Explicit env vars to use\n */\n env?: \"safe\" | \"inherit\" | \"none\" | Record<string, string>;\n\n /** Extra env vars to include even if they match secret patterns. Only used with `env: \"safe\"`. */\n envInclude?: string[];\n /** Extra env vars to exclude beyond default secret patterns. Only used with `env: \"safe\"`. */\n envExclude?: string[];\n\n /** Additional commands to treat as safe (auto-execute without approval in \"auto\" mode). */\n allowCommands?: string[];\n /** Additional patterns to block (never execute, even if approved). */\n denyPatterns?: RegExp[];\n}\n\nexport interface BashToolResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs: number;\n timedOut?: boolean;\n}\n\n// ── Tool factory ────────────────────────────────────────────────────────────\n\n/**\n * Create a bash tool that executes shell commands on the server.\n *\n * By default, uses \"auto\" approval (safe commands run immediately, others\n * require user approval) and \"safe\" env isolation (strips secret-like\n * environment variables).\n *\n * @example\n * ```ts\n * import { supyagent, createBashTool } from '@supyagent/sdk';\n *\n * const client = supyagent({ apiKey: process.env.SUPYAGENT_API_KEY! });\n * const supyagentTools = await client.tools({ cache: 300 });\n *\n * const tools = {\n * ...supyagentTools,\n * bash: createBashTool({ cwd: '/path/to/project' }),\n * };\n * ```\n */\nexport function createBashTool(options?: BashToolOptions) {\n const cwd = options?.cwd ?? process.cwd();\n const timeout = Math.min(options?.timeout ?? DEFAULT_TIMEOUT, 600_000);\n const maxOutput = options?.maxOutput ?? MAX_OUTPUT;\n const approvalPolicy = options?.approval ?? \"auto\";\n\n const extraSafe = options?.allowCommands ? new Set(options.allowCommands) : undefined;\n const extraDeny = options?.denyPatterns;\n\n const execEnv = buildEnv(options?.env ?? \"safe\", options);\n\n const schema = {\n type: \"object\" as const,\n properties: {\n command: {\n type: \"string\",\n description: \"The bash command to execute\",\n },\n },\n required: [\"command\"],\n };\n\n // Resolve needsApproval based on policy\n const needsApproval =\n approvalPolicy === \"always\"\n ? true\n : approvalPolicy === \"never\"\n ? false\n : async (args: unknown) => {\n const { command } = args as { command: string };\n if (typeof approvalPolicy === \"function\") {\n return approvalPolicy(command);\n }\n // \"auto\" mode — safe commands pass, everything else needs approval\n const safety = classifyCommand(command, extraSafe, extraDeny);\n return safety !== \"safe\";\n };\n\n return tool({\n description:\n \"Execute a bash command on the server. Use this for running shell commands, scripts, package managers, git operations, file manipulation, and system tasks. Returns stdout, stderr, and exit code.\",\n inputSchema: jsonSchema(schema as Parameters<typeof jsonSchema>[0]),\n needsApproval,\n execute: async (args): Promise<BashToolResult> => {\n const { command } = args as { command: string };\n\n // Block dangerous commands even if somehow approved\n if (\n DANGEROUS_PATTERNS.some(p => p.test(command)) ||\n extraDeny?.some(p => p.test(command))\n ) {\n return {\n stdout: \"\",\n stderr: \"Command blocked by safety policy\",\n exitCode: 126,\n durationMs: 0,\n };\n }\n\n const start = Date.now();\n\n return new Promise<BashToolResult>((resolve) => {\n const child = exec(\n command,\n {\n cwd,\n timeout,\n shell: \"/bin/bash\",\n maxBuffer: 10 * 1024 * 1024,\n env: execEnv,\n },\n (error: ExecException | null, stdout: string, stderr: string) => {\n const durationMs = Date.now() - start;\n const timedOut = error?.killed === true;\n const exitCode = timedOut\n ? 124\n : typeof error?.code === \"number\"\n ? error.code\n : error\n ? 1\n : 0;\n\n resolve({\n stdout: truncate(stdout, maxOutput),\n stderr: truncate(stderr, maxOutput),\n exitCode,\n durationMs,\n ...(timedOut ? { timedOut: true } : {}),\n });\n }\n );\n\n child.on(\"error\", () => {\n resolve({\n stdout: \"\",\n stderr: \"Failed to start process\",\n exitCode: 127,\n durationMs: Date.now() - start,\n });\n });\n });\n },\n });\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor(max / 2) - 50;\n return (\n str.slice(0, half) +\n `\\n\\n... (${str.length - max} characters truncated) ...\\n\\n` +\n str.slice(-half)\n );\n}\n","import { tool, jsonSchema } from \"ai\";\n\nexport interface ViewImageToolOptions {\n /**\n * Custom description for the tool.\n * @default \"Display an image in the chat. Use this when you want to show the user an image from a URL.\"\n */\n description?: string;\n}\n\nexport interface ViewImageToolResult {\n url: string;\n displayed: true;\n}\n\n/**\n * Create a viewImage tool that the agent can call to display an image in the chat.\n *\n * On the client side, pair this with the `useViewImageEffect` hook (or equivalent logic)\n * to inject the image as a `FileUIPart` into the conversation. This ensures the image\n * is visible to both the user (rendered as `<img>`) and the model (via `convertToModelMessages`).\n */\nexport function createViewImageTool(options?: ViewImageToolOptions) {\n const schema = {\n type: \"object\" as const,\n properties: {\n url: {\n type: \"string\",\n description: \"The URL of the image to display\",\n },\n },\n required: [\"url\"],\n };\n\n return tool({\n description:\n options?.description ??\n \"Display an image in the chat. Use this when you want to show the user an image from a URL.\",\n inputSchema: jsonSchema(schema as Parameters<typeof jsonSchema>[0]),\n execute: async (args): Promise<ViewImageToolResult> => {\n const { url } = args as { url: string };\n return { url, displayed: true };\n },\n });\n}\n"],"mappings":"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","names":["tool","jsonSchema","tool","jsonSchema","tool","jsonSchema","tool","jsonSchema"]}