@sahab-platform/agents 0.0.6 → 0.0.7

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.cjs CHANGED
@@ -135,7 +135,7 @@ var AgentsResource = class {
135
135
  this.http = http;
136
136
  this.options = options;
137
137
  }
138
- async initialize(mode = "dev") {
138
+ async initialize(mode = "start") {
139
139
  const livekitConfig = await getConfig(this.http);
140
140
  setOptions(this.options);
141
141
  const __dirname = path__namespace.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));
@@ -145,6 +145,9 @@ var AgentsResource = class {
145
145
  if (!hasCommand) {
146
146
  process.argv.splice(2, 0, mode);
147
147
  }
148
+ process.env.LIVEKIT_URL = livekitConfig.url;
149
+ process.env.LIVEKIT_API_KEY = livekitConfig.apiKey;
150
+ process.env.LIVEKIT_API_SECRET = livekitConfig.apiSecret;
148
151
  agents.cli.runApp(
149
152
  new agents.ServerOptions({
150
153
  agent: agentPath,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path","fileURLToPath","cli","ServerOptions"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(mode: \"dev\" | \"start\" | \"connect\" = \"dev\"): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n const knownCommands = [\"dev\", \"start\", \"connect\"];\n const hasCommand = process.argv\n .slice(2)\n .some((arg) => knownCommands.includes(arg));\n if (!hasCommand) {\n process.argv.splice(2, 0, mode);\n }\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path","fileURLToPath","cli","ServerOptions"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(mode: \"dev\" | \"start\" | \"connect\" = \"start\"): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n const knownCommands = [\"dev\", \"start\", \"connect\"];\n const hasCommand = process.argv\n .slice(2)\n .some((arg) => knownCommands.includes(arg));\n if (!hasCommand) {\n process.argv.splice(2, 0, mode);\n }\n\n // Inject credentials fetched from Sahab API into env so the livekit CLI\n // commander picks them up — the user never needs to set these manually.\n process.env.LIVEKIT_URL = livekitConfig.url;\n process.env.LIVEKIT_API_KEY = livekitConfig.apiKey;\n process.env.LIVEKIT_API_SECRET = livekitConfig.apiSecret;\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ var AgentsResource = class {
112
112
  this.http = http;
113
113
  this.options = options;
114
114
  }
115
- async initialize(mode = "dev") {
115
+ async initialize(mode = "start") {
116
116
  const livekitConfig = await getConfig(this.http);
117
117
  setOptions(this.options);
118
118
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -122,6 +122,9 @@ var AgentsResource = class {
122
122
  if (!hasCommand) {
123
123
  process.argv.splice(2, 0, mode);
124
124
  }
125
+ process.env.LIVEKIT_URL = livekitConfig.url;
126
+ process.env.LIVEKIT_API_KEY = livekitConfig.apiKey;
127
+ process.env.LIVEKIT_API_SECRET = livekitConfig.apiSecret;
125
128
  cli.runApp(
126
129
  new ServerOptions({
127
130
  agent: agentPath,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(mode: \"dev\" | \"start\" | \"connect\" = \"dev\"): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n const knownCommands = [\"dev\", \"start\", \"connect\"];\n const hasCommand = process.argv\n .slice(2)\n .some((arg) => knownCommands.includes(arg));\n if (!hasCommand) {\n process.argv.splice(2, 0, mode);\n }\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(mode: \"dev\" | \"start\" | \"connect\" = \"start\"): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n const knownCommands = [\"dev\", \"start\", \"connect\"];\n const hasCommand = process.argv\n .slice(2)\n .some((arg) => knownCommands.includes(arg));\n if (!hasCommand) {\n process.argv.splice(2, 0, mode);\n }\n\n // Inject credentials fetched from Sahab API into env so the livekit CLI\n // commander picks them up — the user never needs to set these manually.\n process.env.LIVEKIT_URL = livekitConfig.url;\n process.env.LIVEKIT_API_KEY = livekitConfig.apiKey;\n process.env.LIVEKIT_API_SECRET = livekitConfig.apiSecret;\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sahab-platform/agents",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "TypeScript SDK for the Sahab Agents API",
5
5
  "author": "",
6
6
  "license": "MIT",