@morphllm/subagents 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @morphllm/subagents
1
+ # subagents
2
2
 
3
3
  Modular AI subagents for document processing. Built for use with OpenAI-compatible APIs.
4
4
 
@@ -38,7 +38,7 @@ The main agent handles orchestration and planning. When it encounters a speciali
38
38
  ## Installation
39
39
 
40
40
  ```bash
41
- npm install @morphllm/subagents
41
+ npm install subagents
42
42
  ```
43
43
 
44
44
  ## Available Subagents
@@ -53,7 +53,7 @@ npm install @morphllm/subagents
53
53
  ### DOCX Client (Direct API Access)
54
54
 
55
55
  ```typescript
56
- import { DocxClient } from '@morphllm/subagents/docx';
56
+ import { DocxClient } from 'subagents/docx';
57
57
 
58
58
  const client = new DocxClient();
59
59
 
@@ -77,19 +77,15 @@ const blob = await client.download(doc.doc_id);
77
77
 
78
78
  ```typescript
79
79
  import OpenAI from 'openai';
80
- import { DocxClient, DocxAgent } from '@morphllm/subagents/docx';
80
+ import { DocxAgent } from 'subagents/docx';
81
81
 
82
- const openai = new OpenAI();
83
- const client = new DocxClient();
84
-
85
- // Upload a document first
86
- const file = new File([documentBuffer], 'contract.docx');
87
- const { doc_id } = await client.upload(file);
82
+ const openai = new OpenAI({
83
+ apiKey: process.env.OPENAI_API_KEY,
84
+ });
88
85
 
89
- // Create agent with the document
90
86
  const agent = new DocxAgent({
91
87
  openai,
92
- documentId: doc_id,
88
+ documentId: 'your-doc-id',
93
89
  });
94
90
 
95
91
  // Run with natural language
@@ -97,13 +93,7 @@ const result = await agent.run('Review this contract and flag any issues');
97
93
  console.log(result.response);
98
94
  console.log(result.toolCalls);
99
95
 
100
- // Download the edited document
101
- const editedDoc = await client.download(doc_id);
102
- ```
103
-
104
- ### Streaming Responses
105
-
106
- ```typescript
96
+ // Or stream for real-time UI
107
97
  for await (const event of agent.runStream('Add comments to unclear sections')) {
108
98
  if (event.type === 'content_delta') {
109
99
  process.stdout.write(event.delta.text);
@@ -117,11 +107,11 @@ for await (const event of agent.runStream('Add comments to unclear sections')) {
117
107
 
118
108
  ```typescript
119
109
  // Import everything
120
- import { DocxClient, DocxAgent, BaseClient } from '@morphllm/subagents';
110
+ import { DocxClient, DocxAgent, BaseClient } from 'subagents';
121
111
 
122
112
  // Import specific modules
123
- import { DocxClient, DocxAgent } from '@morphllm/subagents/docx';
124
- import { BaseClient, BaseAgent } from '@morphllm/subagents/core';
113
+ import { DocxClient, DocxAgent } from 'subagents/docx';
114
+ import { BaseClient, BaseAgent } from 'subagents/core';
125
115
  ```
126
116
 
127
117
  ## Building Custom Subagents
@@ -129,8 +119,8 @@ import { BaseClient, BaseAgent } from '@morphllm/subagents/core';
129
119
  Extend the base classes to create your own subagents:
130
120
 
131
121
  ```typescript
132
- import { BaseClient, BaseAgent } from '@morphllm/subagents/core';
133
- import type { Tool } from '@morphllm/subagents/core';
122
+ import { BaseClient, BaseAgent } from 'subagents/core';
123
+ import type { Tool } from 'subagents/core';
134
124
 
135
125
  class MyClient extends BaseClient {
136
126
  protected getDefaultApiUrl() {
@@ -165,7 +155,7 @@ class MyAgent extends BaseAgent<MyClient> {
165
155
 
166
156
  | Variable | Description | Default |
167
157
  |----------|-------------|---------|
168
- | `DOCX_API_URL` | DOCX service URL | https://docx.morphllm.com |
158
+ | `DOCX_API_URL` | DOCX service URL | Railway deployment |
169
159
 
170
160
  ## License
171
161
 
@@ -104,7 +104,7 @@ interface DocxClientOptions extends BaseClientOptions {
104
104
  }
105
105
  /** DOCX agent options */
106
106
  interface DocxAgentOptions {
107
- /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */
107
+ /** Base URL for the API. Defaults to api.subagents.com/v1 */
108
108
  baseUrl?: string;
109
109
  /** API key (optional, not required for public endpoints) */
110
110
  apiKey?: string;
@@ -239,7 +239,7 @@ declare class DocxClient extends BaseClient {
239
239
  * DocxAgent - AI agent for DOCX document editing
240
240
  *
241
241
  * OpenAI Agents SDK compatible client for morph-docx.
242
- * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx".
242
+ * Talks to api.subagents.com/v1/chat/completions with model "morph-docx".
243
243
  */
244
244
 
245
245
  declare class DocxAgent {
@@ -272,7 +272,7 @@ declare class DocxAgent {
272
272
  * @example
273
273
  * ```typescript
274
274
  * import OpenAI from 'openai';
275
- * import { DocxAgent } from '@morphllm/subagents/docx';
275
+ * import { DocxAgent } from 'subagents/docx';
276
276
  *
277
277
  * const agent = new DocxAgent();
278
278
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -104,7 +104,7 @@ interface DocxClientOptions extends BaseClientOptions {
104
104
  }
105
105
  /** DOCX agent options */
106
106
  interface DocxAgentOptions {
107
- /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */
107
+ /** Base URL for the API. Defaults to api.subagents.com/v1 */
108
108
  baseUrl?: string;
109
109
  /** API key (optional, not required for public endpoints) */
110
110
  apiKey?: string;
@@ -239,7 +239,7 @@ declare class DocxClient extends BaseClient {
239
239
  * DocxAgent - AI agent for DOCX document editing
240
240
  *
241
241
  * OpenAI Agents SDK compatible client for morph-docx.
242
- * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx".
242
+ * Talks to api.subagents.com/v1/chat/completions with model "morph-docx".
243
243
  */
244
244
 
245
245
  declare class DocxAgent {
@@ -272,7 +272,7 @@ declare class DocxAgent {
272
272
  * @example
273
273
  * ```typescript
274
274
  * import OpenAI from 'openai';
275
- * import { DocxAgent } from '@morphllm/subagents/docx';
275
+ * import { DocxAgent } from 'subagents/docx';
276
276
  *
277
277
  * const agent = new DocxAgent();
278
278
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -69,7 +69,7 @@ var BaseClient = class {
69
69
  };
70
70
 
71
71
  // src/docx/client.ts
72
- var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx";
72
+ var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx";
73
73
  var DocxClient = class extends BaseClient {
74
74
  constructor(options = {}) {
75
75
  super(options);
@@ -162,7 +162,7 @@ var DocxClient = class extends BaseClient {
162
162
  };
163
163
 
164
164
  // src/docx/agent.ts
165
- var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1";
165
+ var DEFAULT_BASE_URL = "https://api.subagents.com/v1";
166
166
  var DocxAgent = class {
167
167
  constructor(options = {}) {
168
168
  this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;
@@ -281,7 +281,7 @@ ${m.content}`
281
281
  * @example
282
282
  * ```typescript
283
283
  * import OpenAI from 'openai';
284
- * import { DocxAgent } from '@morphllm/subagents/docx';
284
+ * import { DocxAgent } from 'subagents/docx';
285
285
  *
286
286
  * const agent = new DocxAgent();
287
287
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/base-client.ts","../../src/docx/client.ts","../../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to subagents.morphllm.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from '@morphllm/subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/base-client.ts","../../src/docx/client.ts","../../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to api.subagents.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.subagents.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from 'subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
@@ -67,7 +67,7 @@ var BaseClient = class {
67
67
  };
68
68
 
69
69
  // src/docx/client.ts
70
- var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx";
70
+ var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx";
71
71
  var DocxClient = class extends BaseClient {
72
72
  constructor(options = {}) {
73
73
  super(options);
@@ -160,7 +160,7 @@ var DocxClient = class extends BaseClient {
160
160
  };
161
161
 
162
162
  // src/docx/agent.ts
163
- var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1";
163
+ var DEFAULT_BASE_URL = "https://api.subagents.com/v1";
164
164
  var DocxAgent = class {
165
165
  constructor(options = {}) {
166
166
  this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;
@@ -279,7 +279,7 @@ ${m.content}`
279
279
  * @example
280
280
  * ```typescript
281
281
  * import OpenAI from 'openai';
282
- * import { DocxAgent } from '@morphllm/subagents/docx';
282
+ * import { DocxAgent } from 'subagents/docx';
283
283
  *
284
284
  * const agent = new DocxAgent();
285
285
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/base-client.ts","../../src/docx/client.ts","../../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to subagents.morphllm.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from '@morphllm/subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/base-client.ts","../../src/docx/client.ts","../../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to api.subagents.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.subagents.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from 'subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -216,7 +216,7 @@ var BaseAgent = class {
216
216
  };
217
217
 
218
218
  // src/docx/client.ts
219
- var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx";
219
+ var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx";
220
220
  var DocxClient = class extends BaseClient {
221
221
  constructor(options = {}) {
222
222
  super(options);
@@ -309,7 +309,7 @@ var DocxClient = class extends BaseClient {
309
309
  };
310
310
 
311
311
  // src/docx/agent.ts
312
- var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1";
312
+ var DEFAULT_BASE_URL = "https://api.subagents.com/v1";
313
313
  var DocxAgent = class {
314
314
  constructor(options = {}) {
315
315
  this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;
@@ -428,7 +428,7 @@ ${m.content}`
428
428
  * @example
429
429
  * ```typescript
430
430
  * import OpenAI from 'openai';
431
- * import { DocxAgent } from '@morphllm/subagents/docx';
431
+ * import { DocxAgent } from 'subagents/docx';
432
432
  *
433
433
  * const agent = new DocxAgent();
434
434
  * const openai = new OpenAI(agent.getOpenAIConfig());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/base-client.ts","../src/core/base-agent.ts","../src/docx/client.ts","../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * BaseAgent - Abstract base class for AI subagents\n *\n * Provides common functionality for tool-using agents with\n * OpenAI-compatible API support.\n */\n\nimport type {\n Tool,\n ChatMessage,\n ToolCall,\n StreamEvent,\n AgentRunResult,\n BaseAgentOptions,\n} from './types';\n\nexport abstract class BaseAgent<TClient> {\n protected openai: any;\n protected model: string;\n protected instructions: string;\n protected client: TClient;\n\n constructor(options: BaseAgentOptions & { client: TClient }) {\n this.openai = options.openai;\n this.model = options.model || this.getDefaultModel();\n this.instructions = options.instructions || this.getDefaultInstructions();\n this.client = options.client;\n }\n\n /** Get the underlying client */\n getClient(): TClient {\n return this.client;\n }\n\n /** Override to provide default model */\n protected abstract getDefaultModel(): string;\n\n /** Override to provide default instructions */\n protected abstract getDefaultInstructions(): string;\n\n /** Override to provide tool definitions */\n protected abstract getTools(): Tool[];\n\n /** Override to execute a tool call */\n protected abstract executeTool(name: string, args: Record<string, unknown>): Promise<string>;\n\n /**\n * Run the agent with a user message.\n * Returns the final response and all tool calls made.\n */\n async run(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): Promise<AgentRunResult> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.run(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const toolCalls: ToolCall[] = [];\n let response = '';\n const tools = this.getTools();\n\n // Agent loop - keep running until no more tool calls\n while (true) {\n const completion = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n });\n\n const assistantMessage = completion.choices[0].message;\n\n // Check if there are tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n // Add assistant message with tool calls\n messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n });\n\n // Execute each tool call\n for (const tc of assistantMessage.tool_calls) {\n const fn = (tc as any).function;\n const args = JSON.parse(fn.arguments);\n\n const toolCall: ToolCall = {\n id: tc.id,\n name: fn.name,\n arguments: args,\n status: 'running',\n };\n toolCalls.push(toolCall);\n\n // Execute the tool\n const result = await this.executeTool(fn.name, args);\n\n // Update tool call status\n if (result.startsWith('Error:')) {\n toolCall.error = result;\n toolCall.status = 'error';\n } else {\n toolCall.result = result;\n toolCall.status = 'completed';\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: tc.id,\n });\n }\n } else {\n // No more tool calls - return the final response\n response = assistantMessage.content || '';\n break;\n }\n }\n\n return { response, toolCalls };\n }\n\n /**\n * Run the agent with streaming output.\n * Yields events for real-time UI updates.\n */\n async *runStream(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): AsyncGenerator<StreamEvent> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.runStream(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const tools = this.getTools();\n\n // Agent loop\n while (true) {\n yield { type: 'message_start', message: { role: 'assistant' } };\n\n const stream = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n stream: true,\n });\n\n let contentBuffer = '';\n const toolCallBuffers: Map<number, { id: string; name: string; arguments: string }> =\n new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n contentBuffer += delta.content;\n yield { type: 'content_delta', delta: { text: delta.content } };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallBuffers.has(idx)) {\n toolCallBuffers.set(idx, { id: '', name: '', arguments: '' });\n }\n\n const buffer = toolCallBuffers.get(idx)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) buffer.arguments += tc.function.arguments;\n }\n }\n }\n\n // Process tool calls if any\n if (toolCallBuffers.size > 0) {\n // Add assistant message to history\n messages.push({\n role: 'assistant',\n content: contentBuffer,\n });\n\n for (const [_, buffer] of toolCallBuffers) {\n const args = JSON.parse(buffer.arguments);\n\n yield {\n type: 'tool_start',\n tool: { id: buffer.id, name: buffer.name, arguments: args },\n };\n\n // Execute the tool\n const result = await this.executeTool(buffer.name, args);\n\n if (result.startsWith('Error:')) {\n yield { type: 'tool_end', tool: { id: buffer.id, error: result } };\n } else {\n yield { type: 'tool_end', tool: { id: buffer.id, result } };\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: buffer.id,\n });\n }\n } else {\n // No more tool calls - done\n yield { type: 'message_end' };\n break;\n }\n }\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to subagents.morphllm.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from '@morphllm/subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/base-client.ts","../src/core/base-agent.ts","../src/docx/client.ts","../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * BaseAgent - Abstract base class for AI subagents\n *\n * Provides common functionality for tool-using agents with\n * OpenAI-compatible API support.\n */\n\nimport type {\n Tool,\n ChatMessage,\n ToolCall,\n StreamEvent,\n AgentRunResult,\n BaseAgentOptions,\n} from './types';\n\nexport abstract class BaseAgent<TClient> {\n protected openai: any;\n protected model: string;\n protected instructions: string;\n protected client: TClient;\n\n constructor(options: BaseAgentOptions & { client: TClient }) {\n this.openai = options.openai;\n this.model = options.model || this.getDefaultModel();\n this.instructions = options.instructions || this.getDefaultInstructions();\n this.client = options.client;\n }\n\n /** Get the underlying client */\n getClient(): TClient {\n return this.client;\n }\n\n /** Override to provide default model */\n protected abstract getDefaultModel(): string;\n\n /** Override to provide default instructions */\n protected abstract getDefaultInstructions(): string;\n\n /** Override to provide tool definitions */\n protected abstract getTools(): Tool[];\n\n /** Override to execute a tool call */\n protected abstract executeTool(name: string, args: Record<string, unknown>): Promise<string>;\n\n /**\n * Run the agent with a user message.\n * Returns the final response and all tool calls made.\n */\n async run(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): Promise<AgentRunResult> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.run(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const toolCalls: ToolCall[] = [];\n let response = '';\n const tools = this.getTools();\n\n // Agent loop - keep running until no more tool calls\n while (true) {\n const completion = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n });\n\n const assistantMessage = completion.choices[0].message;\n\n // Check if there are tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n // Add assistant message with tool calls\n messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n });\n\n // Execute each tool call\n for (const tc of assistantMessage.tool_calls) {\n const fn = (tc as any).function;\n const args = JSON.parse(fn.arguments);\n\n const toolCall: ToolCall = {\n id: tc.id,\n name: fn.name,\n arguments: args,\n status: 'running',\n };\n toolCalls.push(toolCall);\n\n // Execute the tool\n const result = await this.executeTool(fn.name, args);\n\n // Update tool call status\n if (result.startsWith('Error:')) {\n toolCall.error = result;\n toolCall.status = 'error';\n } else {\n toolCall.result = result;\n toolCall.status = 'completed';\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: tc.id,\n });\n }\n } else {\n // No more tool calls - return the final response\n response = assistantMessage.content || '';\n break;\n }\n }\n\n return { response, toolCalls };\n }\n\n /**\n * Run the agent with streaming output.\n * Yields events for real-time UI updates.\n */\n async *runStream(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): AsyncGenerator<StreamEvent> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.runStream(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const tools = this.getTools();\n\n // Agent loop\n while (true) {\n yield { type: 'message_start', message: { role: 'assistant' } };\n\n const stream = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n stream: true,\n });\n\n let contentBuffer = '';\n const toolCallBuffers: Map<number, { id: string; name: string; arguments: string }> =\n new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n contentBuffer += delta.content;\n yield { type: 'content_delta', delta: { text: delta.content } };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallBuffers.has(idx)) {\n toolCallBuffers.set(idx, { id: '', name: '', arguments: '' });\n }\n\n const buffer = toolCallBuffers.get(idx)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) buffer.arguments += tc.function.arguments;\n }\n }\n }\n\n // Process tool calls if any\n if (toolCallBuffers.size > 0) {\n // Add assistant message to history\n messages.push({\n role: 'assistant',\n content: contentBuffer,\n });\n\n for (const [_, buffer] of toolCallBuffers) {\n const args = JSON.parse(buffer.arguments);\n\n yield {\n type: 'tool_start',\n tool: { id: buffer.id, name: buffer.name, arguments: args },\n };\n\n // Execute the tool\n const result = await this.executeTool(buffer.name, args);\n\n if (result.startsWith('Error:')) {\n yield { type: 'tool_end', tool: { id: buffer.id, error: result } };\n } else {\n yield { type: 'tool_end', tool: { id: buffer.id, result } };\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: buffer.id,\n });\n }\n } else {\n // No more tool calls - done\n yield { type: 'message_end' };\n break;\n }\n }\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to api.subagents.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.subagents.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from 'subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -214,7 +214,7 @@ var BaseAgent = class {
214
214
  };
215
215
 
216
216
  // src/docx/client.ts
217
- var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx";
217
+ var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx";
218
218
  var DocxClient = class extends BaseClient {
219
219
  constructor(options = {}) {
220
220
  super(options);
@@ -307,7 +307,7 @@ var DocxClient = class extends BaseClient {
307
307
  };
308
308
 
309
309
  // src/docx/agent.ts
310
- var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1";
310
+ var DEFAULT_BASE_URL = "https://api.subagents.com/v1";
311
311
  var DocxAgent = class {
312
312
  constructor(options = {}) {
313
313
  this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;
@@ -426,7 +426,7 @@ ${m.content}`
426
426
  * @example
427
427
  * ```typescript
428
428
  * import OpenAI from 'openai';
429
- * import { DocxAgent } from '@morphllm/subagents/docx';
429
+ * import { DocxAgent } from 'subagents/docx';
430
430
  *
431
431
  * const agent = new DocxAgent();
432
432
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/base-client.ts","../src/core/base-agent.ts","../src/docx/client.ts","../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * BaseAgent - Abstract base class for AI subagents\n *\n * Provides common functionality for tool-using agents with\n * OpenAI-compatible API support.\n */\n\nimport type {\n Tool,\n ChatMessage,\n ToolCall,\n StreamEvent,\n AgentRunResult,\n BaseAgentOptions,\n} from './types';\n\nexport abstract class BaseAgent<TClient> {\n protected openai: any;\n protected model: string;\n protected instructions: string;\n protected client: TClient;\n\n constructor(options: BaseAgentOptions & { client: TClient }) {\n this.openai = options.openai;\n this.model = options.model || this.getDefaultModel();\n this.instructions = options.instructions || this.getDefaultInstructions();\n this.client = options.client;\n }\n\n /** Get the underlying client */\n getClient(): TClient {\n return this.client;\n }\n\n /** Override to provide default model */\n protected abstract getDefaultModel(): string;\n\n /** Override to provide default instructions */\n protected abstract getDefaultInstructions(): string;\n\n /** Override to provide tool definitions */\n protected abstract getTools(): Tool[];\n\n /** Override to execute a tool call */\n protected abstract executeTool(name: string, args: Record<string, unknown>): Promise<string>;\n\n /**\n * Run the agent with a user message.\n * Returns the final response and all tool calls made.\n */\n async run(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): Promise<AgentRunResult> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.run(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const toolCalls: ToolCall[] = [];\n let response = '';\n const tools = this.getTools();\n\n // Agent loop - keep running until no more tool calls\n while (true) {\n const completion = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n });\n\n const assistantMessage = completion.choices[0].message;\n\n // Check if there are tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n // Add assistant message with tool calls\n messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n });\n\n // Execute each tool call\n for (const tc of assistantMessage.tool_calls) {\n const fn = (tc as any).function;\n const args = JSON.parse(fn.arguments);\n\n const toolCall: ToolCall = {\n id: tc.id,\n name: fn.name,\n arguments: args,\n status: 'running',\n };\n toolCalls.push(toolCall);\n\n // Execute the tool\n const result = await this.executeTool(fn.name, args);\n\n // Update tool call status\n if (result.startsWith('Error:')) {\n toolCall.error = result;\n toolCall.status = 'error';\n } else {\n toolCall.result = result;\n toolCall.status = 'completed';\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: tc.id,\n });\n }\n } else {\n // No more tool calls - return the final response\n response = assistantMessage.content || '';\n break;\n }\n }\n\n return { response, toolCalls };\n }\n\n /**\n * Run the agent with streaming output.\n * Yields events for real-time UI updates.\n */\n async *runStream(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): AsyncGenerator<StreamEvent> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.runStream(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const tools = this.getTools();\n\n // Agent loop\n while (true) {\n yield { type: 'message_start', message: { role: 'assistant' } };\n\n const stream = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n stream: true,\n });\n\n let contentBuffer = '';\n const toolCallBuffers: Map<number, { id: string; name: string; arguments: string }> =\n new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n contentBuffer += delta.content;\n yield { type: 'content_delta', delta: { text: delta.content } };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallBuffers.has(idx)) {\n toolCallBuffers.set(idx, { id: '', name: '', arguments: '' });\n }\n\n const buffer = toolCallBuffers.get(idx)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) buffer.arguments += tc.function.arguments;\n }\n }\n }\n\n // Process tool calls if any\n if (toolCallBuffers.size > 0) {\n // Add assistant message to history\n messages.push({\n role: 'assistant',\n content: contentBuffer,\n });\n\n for (const [_, buffer] of toolCallBuffers) {\n const args = JSON.parse(buffer.arguments);\n\n yield {\n type: 'tool_start',\n tool: { id: buffer.id, name: buffer.name, arguments: args },\n };\n\n // Execute the tool\n const result = await this.executeTool(buffer.name, args);\n\n if (result.startsWith('Error:')) {\n yield { type: 'tool_end', tool: { id: buffer.id, error: result } };\n } else {\n yield { type: 'tool_end', tool: { id: buffer.id, result } };\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: buffer.id,\n });\n }\n } else {\n // No more tool calls - done\n yield { type: 'message_end' };\n break;\n }\n }\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to subagents.morphllm.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from '@morphllm/subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/base-client.ts","../src/core/base-agent.ts","../src/docx/client.ts","../src/docx/agent.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BaseClient - Abstract HTTP client for subagent APIs\n */\n\nimport type { BaseClientOptions } from './types';\n\nexport abstract class BaseClient {\n protected apiUrl: string;\n protected timeout: number;\n\n constructor(options: BaseClientOptions = {}) {\n this.apiUrl = options.apiUrl || this.getDefaultApiUrl();\n this.timeout = options.timeout || 60000;\n }\n\n /** Override in subclasses to provide default API URL */\n protected abstract getDefaultApiUrl(): string;\n\n /** Make a GET request */\n protected async get<T>(path: string): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'GET',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`GET ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with JSON body */\n protected async post<T>(path: string, body?: unknown): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n headers: body ? { 'Content-Type': 'application/json' } : undefined,\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a POST request with FormData */\n protected async postFormData<T>(path: string, formData: FormData): Promise<T> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'POST',\n body: formData,\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`POST ${path} failed: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n /** Make a DELETE request */\n protected async delete(path: string): Promise<void> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n method: 'DELETE',\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`DELETE ${path} failed: ${response.statusText}`);\n }\n }\n\n /** Download a file as Blob */\n protected async downloadBlob(path: string): Promise<Blob> {\n const response = await fetch(`${this.apiUrl}${path}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new Error(`Download ${path} failed: ${response.statusText}`);\n }\n\n return response.blob();\n }\n\n /** Health check */\n async health(): Promise<{ status: string; service: string }> {\n return this.get('/health');\n }\n}\n","/**\n * BaseAgent - Abstract base class for AI subagents\n *\n * Provides common functionality for tool-using agents with\n * OpenAI-compatible API support.\n */\n\nimport type {\n Tool,\n ChatMessage,\n ToolCall,\n StreamEvent,\n AgentRunResult,\n BaseAgentOptions,\n} from './types';\n\nexport abstract class BaseAgent<TClient> {\n protected openai: any;\n protected model: string;\n protected instructions: string;\n protected client: TClient;\n\n constructor(options: BaseAgentOptions & { client: TClient }) {\n this.openai = options.openai;\n this.model = options.model || this.getDefaultModel();\n this.instructions = options.instructions || this.getDefaultInstructions();\n this.client = options.client;\n }\n\n /** Get the underlying client */\n getClient(): TClient {\n return this.client;\n }\n\n /** Override to provide default model */\n protected abstract getDefaultModel(): string;\n\n /** Override to provide default instructions */\n protected abstract getDefaultInstructions(): string;\n\n /** Override to provide tool definitions */\n protected abstract getTools(): Tool[];\n\n /** Override to execute a tool call */\n protected abstract executeTool(name: string, args: Record<string, unknown>): Promise<string>;\n\n /**\n * Run the agent with a user message.\n * Returns the final response and all tool calls made.\n */\n async run(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): Promise<AgentRunResult> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.run(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const toolCalls: ToolCall[] = [];\n let response = '';\n const tools = this.getTools();\n\n // Agent loop - keep running until no more tool calls\n while (true) {\n const completion = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n });\n\n const assistantMessage = completion.choices[0].message;\n\n // Check if there are tool calls\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {\n // Add assistant message with tool calls\n messages.push({\n role: 'assistant',\n content: assistantMessage.content || '',\n });\n\n // Execute each tool call\n for (const tc of assistantMessage.tool_calls) {\n const fn = (tc as any).function;\n const args = JSON.parse(fn.arguments);\n\n const toolCall: ToolCall = {\n id: tc.id,\n name: fn.name,\n arguments: args,\n status: 'running',\n };\n toolCalls.push(toolCall);\n\n // Execute the tool\n const result = await this.executeTool(fn.name, args);\n\n // Update tool call status\n if (result.startsWith('Error:')) {\n toolCall.error = result;\n toolCall.status = 'error';\n } else {\n toolCall.result = result;\n toolCall.status = 'completed';\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: tc.id,\n });\n }\n } else {\n // No more tool calls - return the final response\n response = assistantMessage.content || '';\n break;\n }\n }\n\n return { response, toolCalls };\n }\n\n /**\n * Run the agent with streaming output.\n * Yields events for real-time UI updates.\n */\n async *runStream(\n userMessage: string,\n conversationHistory: ChatMessage[] = []\n ): AsyncGenerator<StreamEvent> {\n if (!this.openai) {\n throw new Error('OpenAI client is required for agent.runStream(). Pass it in the constructor options.');\n }\n\n const messages: ChatMessage[] = [\n { role: 'system', content: this.instructions },\n ...conversationHistory,\n { role: 'user', content: userMessage },\n ];\n\n const tools = this.getTools();\n\n // Agent loop\n while (true) {\n yield { type: 'message_start', message: { role: 'assistant' } };\n\n const stream = await this.openai.chat.completions.create({\n model: this.model,\n messages: messages as any,\n tools: tools as any,\n tool_choice: 'auto',\n stream: true,\n });\n\n let contentBuffer = '';\n const toolCallBuffers: Map<number, { id: string; name: string; arguments: string }> =\n new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n contentBuffer += delta.content;\n yield { type: 'content_delta', delta: { text: delta.content } };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n if (!toolCallBuffers.has(idx)) {\n toolCallBuffers.set(idx, { id: '', name: '', arguments: '' });\n }\n\n const buffer = toolCallBuffers.get(idx)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) buffer.arguments += tc.function.arguments;\n }\n }\n }\n\n // Process tool calls if any\n if (toolCallBuffers.size > 0) {\n // Add assistant message to history\n messages.push({\n role: 'assistant',\n content: contentBuffer,\n });\n\n for (const [_, buffer] of toolCallBuffers) {\n const args = JSON.parse(buffer.arguments);\n\n yield {\n type: 'tool_start',\n tool: { id: buffer.id, name: buffer.name, arguments: args },\n };\n\n // Execute the tool\n const result = await this.executeTool(buffer.name, args);\n\n if (result.startsWith('Error:')) {\n yield { type: 'tool_end', tool: { id: buffer.id, error: result } };\n } else {\n yield { type: 'tool_end', tool: { id: buffer.id, result } };\n }\n\n // Add tool result to messages\n messages.push({\n role: 'tool',\n content: result,\n tool_call_id: buffer.id,\n });\n }\n } else {\n // No more tool calls - done\n yield { type: 'message_end' };\n break;\n }\n }\n }\n}\n","/**\n * DocxClient - HTTP client for DOCX document API\n */\n\nimport { BaseClient } from '../core/base-client';\nimport type {\n DocxClientOptions,\n DocumentInfo,\n ReadResponse,\n EditOperation,\n EditResponse,\n ValidateResponse,\n BuildOperation,\n BuildResponse,\n CreateResponse,\n DocumentInfoResponse,\n} from './types';\n\nconst DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx';\n\nexport class DocxClient extends BaseClient {\n constructor(options: DocxClientOptions = {}) {\n super(options);\n }\n\n protected getDefaultApiUrl(): string {\n return process.env.DOCX_API_URL || DEFAULT_API_URL;\n }\n\n /**\n * Upload a DOCX document.\n */\n async upload(file: File | Blob, filename?: string): Promise<DocumentInfo> {\n const formData = new FormData();\n formData.append('file', file, filename || 'document.docx');\n return this.postFormData('/documents/upload', formData);\n }\n\n /**\n * Download a DOCX document.\n */\n async download(docId: string): Promise<Blob> {\n return this.downloadBlob(`/documents/${docId}`);\n }\n\n /**\n * Read document content as plain text.\n */\n async read(docId: string): Promise<ReadResponse> {\n return this.post(`/documents/${docId}/read`);\n }\n\n /**\n * Execute edit operations on a document.\n */\n async edit(docId: string, operations: EditOperation[]): Promise<EditResponse> {\n return this.post(`/documents/${docId}/edit`, { operations });\n }\n\n /**\n * Validate document structure.\n */\n async validate(docId: string): Promise<ValidateResponse> {\n return this.post(`/documents/${docId}/validate`);\n }\n\n /**\n * Delete a document from storage.\n */\n async deleteDocument(docId: string): Promise<void> {\n return this.delete(`/documents/${docId}`);\n }\n\n // --- Creation Operations ---\n\n /**\n * Create a new empty DOCX document.\n */\n async create(title?: string): Promise<CreateResponse> {\n return this.post('/documents/create', { title });\n }\n\n /**\n * Execute build operations on a document (add content).\n */\n async build(docId: string, operations: BuildOperation[]): Promise<BuildResponse> {\n return this.post(`/documents/${docId}/build`, { operations });\n }\n\n /**\n * Get document information.\n */\n async getInfo(docId: string): Promise<DocumentInfoResponse> {\n return this.get(`/documents/${docId}/info`);\n }\n\n // --- Convenience Methods ---\n\n /**\n * Add a heading to the document.\n */\n async addHeading(docId: string, text: string, level = 1): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_heading', text, level }]);\n }\n\n /**\n * Add a paragraph to the document.\n */\n async addParagraph(docId: string, text: string, options?: Partial<BuildOperation>): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_paragraph', text, ...options }]);\n }\n\n /**\n * Add a table to the document.\n */\n async addTable(docId: string, headers: string[], rows: string[][]): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_table', headers, rows }]);\n }\n\n /**\n * Add page numbers to the document.\n */\n async addPageNumbers(docId: string, format = 'Page {PAGE} of {NUMPAGES}'): Promise<BuildResponse> {\n return this.build(docId, [{ type: 'add_page_numbers', format_string: format }]);\n }\n}\n","/**\n * DocxAgent - AI agent for DOCX document editing\n *\n * OpenAI Agents SDK compatible client for morph-docx.\n * Talks to api.subagents.com/v1/chat/completions with model \"morph-docx\".\n */\n\nimport type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.subagents.com/v1';\n\nexport class DocxAgent {\n private baseUrl: string;\n private apiKey: string;\n private documentId?: string;\n\n constructor(options: DocxAgentOptions = {}) {\n this.baseUrl = options.baseUrl || process.env.MORPH_API_URL || DEFAULT_BASE_URL;\n this.apiKey = options.apiKey || process.env.MORPH_API_KEY || '';\n this.documentId = options.documentId;\n }\n\n /** Set the current document ID */\n setDocument(docId: string) {\n this.documentId = docId;\n }\n\n /** Get current document ID */\n getDocumentId(): string | undefined {\n return this.documentId;\n }\n\n /**\n * Send a chat completion request (non-streaming).\n * This runs the full agent loop on the server and returns the final response.\n */\n async chat(messages: Message[]): Promise<ChatCompletionResponse> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n return response.json();\n }\n\n /**\n * Send a streaming chat completion request.\n * Returns an async generator that yields chunks as they arrive.\n */\n async *chatStream(messages: Message[]): AsyncGenerator<StreamChunk> {\n // Add document context to user message if we have a document ID\n const contextMessages = this.documentId\n ? messages.map((m, i) => {\n if (i === messages.length - 1 && m.role === 'user') {\n return {\n ...m,\n content: `[Document ID: ${this.documentId}]\\n\\n${m.content}`,\n };\n }\n return m;\n })\n : messages;\n\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey && { Authorization: `Bearer ${this.apiKey}` }),\n },\n body: JSON.stringify({\n model: 'morph-docx',\n messages: contextMessages,\n stream: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API error: ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n const data = line.slice(6).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data);\n yield chunk;\n } catch {\n // Skip malformed JSON\n }\n }\n }\n }\n\n /**\n * Helper: Simple completion that returns just the content string.\n */\n async complete(userMessage: string): Promise<string> {\n const response = await this.chat([{ role: 'user', content: userMessage }]);\n return response.choices[0]?.message?.content || '';\n }\n\n /**\n * Create an OpenAI-compatible client configuration.\n * Use this with the OpenAI SDK or OpenAI Agents SDK.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import { DocxAgent } from 'subagents/docx';\n *\n * const agent = new DocxAgent();\n * const openai = new OpenAI(agent.getOpenAIConfig());\n *\n * const response = await openai.chat.completions.create({\n * model: 'morph-docx',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n * ```\n */\n getOpenAIConfig() {\n return {\n baseURL: this.baseUrl,\n apiKey: this.apiKey || 'not-required',\n };\n }\n}\n"]}
@@ -2,7 +2,7 @@ export { F as FillOperation, a as FillResponse, b as FormField, P as PdfAgentOpt
2
2
  import '../types-D9rS2MQq.mjs';
3
3
 
4
4
  /**
5
- * @morphllm/subagents/pdf
5
+ * subagents/pdf
6
6
  *
7
7
  * PDF form filling subagent (coming soon).
8
8
  *
@@ -2,7 +2,7 @@ export { F as FillOperation, a as FillResponse, b as FormField, P as PdfAgentOpt
2
2
  import '../types-D9rS2MQq.js';
3
3
 
4
4
  /**
5
- * @morphllm/subagents/pdf
5
+ * subagents/pdf
6
6
  *
7
7
  * PDF form filling subagent (coming soon).
8
8
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.js","sourcesContent":["/**\n * @morphllm/subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]}
1
+ {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.js","sourcesContent":["/**\n * subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.mjs","sourcesContent":["/**\n * @morphllm/subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]}
1
+ {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.mjs","sourcesContent":["/**\n * subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morphllm/subagents",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Modular AI subagents for document processing - DOCX editing, PDF filling, and more",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -47,9 +47,10 @@
47
47
  "document",
48
48
  "editing",
49
49
  "openai",
50
- "morphllm"
50
+ "llm"
51
51
  ],
52
- "author": "MorphLLM",
52
+ "author": "Subagents",
53
+ "homepage": "https://subagents.com",
53
54
  "license": "MIT",
54
55
  "repository": {
55
56
  "type": "git",
package/src/core/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @morphllm/subagents/core
2
+ * subagents/core
3
3
  *
4
4
  * Core utilities and base classes for building subagents.
5
5
  */
package/src/docx/agent.ts CHANGED
@@ -2,12 +2,12 @@
2
2
  * DocxAgent - AI agent for DOCX document editing
3
3
  *
4
4
  * OpenAI Agents SDK compatible client for morph-docx.
5
- * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx".
5
+ * Talks to api.subagents.com/v1/chat/completions with model "morph-docx".
6
6
  */
7
7
 
8
8
  import type { DocxAgentOptions, Message, ChatCompletionResponse, StreamChunk } from './types';
9
9
 
10
- const DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1';
10
+ const DEFAULT_BASE_URL = 'https://api.subagents.com/v1';
11
11
 
12
12
  export class DocxAgent {
13
13
  private baseUrl: string;
@@ -151,7 +151,7 @@ export class DocxAgent {
151
151
  * @example
152
152
  * ```typescript
153
153
  * import OpenAI from 'openai';
154
- * import { DocxAgent } from '@morphllm/subagents/docx';
154
+ * import { DocxAgent } from 'subagents/docx';
155
155
  *
156
156
  * const agent = new DocxAgent();
157
157
  * const openai = new OpenAI(agent.getOpenAIConfig());
@@ -16,7 +16,7 @@ import type {
16
16
  DocumentInfoResponse,
17
17
  } from './types';
18
18
 
19
- const DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx';
19
+ const DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx';
20
20
 
21
21
  export class DocxClient extends BaseClient {
22
22
  constructor(options: DocxClientOptions = {}) {
package/src/docx/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @morphllm/subagents/docx
2
+ * subagents/docx
3
3
  *
4
4
  * DOCX document editing subagent for track changes, comments, and more.
5
5
  */
package/src/docx/types.ts CHANGED
@@ -137,7 +137,7 @@ export interface DocxClientOptions extends BaseClientOptions {
137
137
 
138
138
  /** DOCX agent options */
139
139
  export interface DocxAgentOptions {
140
- /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */
140
+ /** Base URL for the API. Defaults to api.subagents.com/v1 */
141
141
  baseUrl?: string;
142
142
  /** API key (optional, not required for public endpoints) */
143
143
  apiKey?: string;
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @morphllm/subagents
2
+ * subagents
3
3
  *
4
4
  * Modular AI subagents for document processing.
5
5
  *
@@ -10,10 +10,10 @@
10
10
  * @example
11
11
  * ```typescript
12
12
  * // Import specific subagent
13
- * import { DocxClient, DocxAgent } from '@morphllm/subagents/docx';
13
+ * import { DocxClient, DocxAgent } from 'subagents/docx';
14
14
  *
15
15
  * // Or import everything
16
- * import { DocxClient, DocxAgent } from '@morphllm/subagents';
16
+ * import { DocxClient, DocxAgent } from 'subagents';
17
17
  *
18
18
  * // Use the client directly
19
19
  * const client = new DocxClient();
package/src/pdf/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @morphllm/subagents/pdf
2
+ * subagents/pdf
3
3
  *
4
4
  * PDF form filling subagent (coming soon).
5
5
  *