@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 +15 -25
- package/dist/docx/index.d.mts +3 -3
- package/dist/docx/index.d.ts +3 -3
- package/dist/docx/index.js +3 -3
- package/dist/docx/index.js.map +1 -1
- package/dist/docx/index.mjs +3 -3
- package/dist/docx/index.mjs.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/pdf/index.d.mts +1 -1
- package/dist/pdf/index.d.ts +1 -1
- package/dist/pdf/index.js.map +1 -1
- package/dist/pdf/index.mjs.map +1 -1
- package/package.json +4 -3
- package/src/core/index.ts +1 -1
- package/src/docx/agent.ts +3 -3
- package/src/docx/client.ts +1 -1
- package/src/docx/index.ts +1 -1
- package/src/docx/types.ts +1 -1
- package/src/index.ts +3 -3
- package/src/pdf/index.ts +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
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
|
|
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 '
|
|
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 {
|
|
80
|
+
import { DocxAgent } from 'subagents/docx';
|
|
81
81
|
|
|
82
|
-
const openai = new OpenAI(
|
|
83
|
-
|
|
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:
|
|
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
|
-
//
|
|
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 '
|
|
110
|
+
import { DocxClient, DocxAgent, BaseClient } from 'subagents';
|
|
121
111
|
|
|
122
112
|
// Import specific modules
|
|
123
|
-
import { DocxClient, DocxAgent } from '
|
|
124
|
-
import { BaseClient, BaseAgent } from '
|
|
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 '
|
|
133
|
-
import type { Tool } from '
|
|
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 |
|
|
158
|
+
| `DOCX_API_URL` | DOCX service URL | Railway deployment |
|
|
169
159
|
|
|
170
160
|
## License
|
|
171
161
|
|
package/dist/docx/index.d.mts
CHANGED
|
@@ -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.
|
|
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.
|
|
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 '
|
|
275
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
276
276
|
*
|
|
277
277
|
* const agent = new DocxAgent();
|
|
278
278
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/dist/docx/index.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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 '
|
|
275
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
276
276
|
*
|
|
277
277
|
* const agent = new DocxAgent();
|
|
278
278
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/dist/docx/index.js
CHANGED
|
@@ -69,7 +69,7 @@ var BaseClient = class {
|
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
// src/docx/client.ts
|
|
72
|
-
var DEFAULT_API_URL = "https://subagents.
|
|
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.
|
|
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 '
|
|
284
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
285
285
|
*
|
|
286
286
|
* const agent = new DocxAgent();
|
|
287
287
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/dist/docx/index.js.map
CHANGED
|
@@ -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"]}
|
package/dist/docx/index.mjs
CHANGED
|
@@ -67,7 +67,7 @@ var BaseClient = class {
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
// src/docx/client.ts
|
|
70
|
-
var DEFAULT_API_URL = "https://subagents.
|
|
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.
|
|
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 '
|
|
282
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
283
283
|
*
|
|
284
284
|
* const agent = new DocxAgent();
|
|
285
285
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/dist/docx/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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 '
|
|
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.
|
|
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.
|
|
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 '
|
|
429
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
430
430
|
*
|
|
431
431
|
* const agent = new DocxAgent();
|
|
432
432
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/dist/index.mjs.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.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"]}
|
package/dist/pdf/index.d.mts
CHANGED
package/dist/pdf/index.d.ts
CHANGED
package/dist/pdf/index.js.map
CHANGED
|
@@ -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 *
|
|
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"]}
|
package/dist/pdf/index.mjs.map
CHANGED
|
@@ -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 *
|
|
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.
|
|
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
|
-
"
|
|
50
|
+
"llm"
|
|
51
51
|
],
|
|
52
|
-
"author": "
|
|
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
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.
|
|
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.
|
|
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 '
|
|
154
|
+
* import { DocxAgent } from 'subagents/docx';
|
|
155
155
|
*
|
|
156
156
|
* const agent = new DocxAgent();
|
|
157
157
|
* const openai = new OpenAI(agent.getOpenAIConfig());
|
package/src/docx/client.ts
CHANGED
|
@@ -16,7 +16,7 @@ import type {
|
|
|
16
16
|
DocumentInfoResponse,
|
|
17
17
|
} from './types';
|
|
18
18
|
|
|
19
|
-
const DEFAULT_API_URL = 'https://subagents.
|
|
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
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.
|
|
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
|
-
*
|
|
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 '
|
|
13
|
+
* import { DocxClient, DocxAgent } from 'subagents/docx';
|
|
14
14
|
*
|
|
15
15
|
* // Or import everything
|
|
16
|
-
* import { DocxClient, DocxAgent } from '
|
|
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