@morphllm/subagents
Advanced tools
@@ -107,3 +107,3 @@ import { B as BaseClient } from '../base-client-B7fgl_Wg.mjs'; | ||
| interface DocxAgentOptions { | ||
| /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */ | ||
| /** Base URL for the API. Defaults to api.subagents.com/v1 */ | ||
| baseUrl?: string; | ||
@@ -243,3 +243,3 @@ /** API key (optional, not required for public endpoints) */ | ||
| * OpenAI Agents SDK compatible client for morph-docx. | ||
| * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx". | ||
| * Talks to api.subagents.com/v1/chat/completions with model "morph-docx". | ||
| */ | ||
@@ -277,3 +277,3 @@ | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -280,0 +280,0 @@ * const agent = new DocxAgent(); |
@@ -107,3 +107,3 @@ import { B as BaseClient } from '../base-client-C6pbtqLX.js'; | ||
| interface DocxAgentOptions { | ||
| /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */ | ||
| /** Base URL for the API. Defaults to api.subagents.com/v1 */ | ||
| baseUrl?: string; | ||
@@ -243,3 +243,3 @@ /** API key (optional, not required for public endpoints) */ | ||
| * OpenAI Agents SDK compatible client for morph-docx. | ||
| * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx". | ||
| * Talks to api.subagents.com/v1/chat/completions with model "morph-docx". | ||
| */ | ||
@@ -277,3 +277,3 @@ | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -280,0 +280,0 @@ * const agent = new DocxAgent(); |
@@ -72,3 +72,3 @@ 'use strict'; | ||
| // src/docx/client.ts | ||
| var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx"; | ||
| var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx"; | ||
| var DocxClient = class extends BaseClient { | ||
@@ -166,3 +166,3 @@ constructor(options = {}) { | ||
| // src/docx/agent.ts | ||
| var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1"; | ||
| var DEFAULT_BASE_URL = "https://api.subagents.com/v1"; | ||
| var DocxAgent = class { | ||
@@ -286,3 +286,3 @@ constructor(options = {}) { | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -289,0 +289,0 @@ * const agent = new DocxAgent(); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../src/core/base-client.ts","../../src/docx/client.ts","../../src/docx/agent.ts"],"names":[],"mappings":";;;AAMO,IAAe,aAAf,MAA0B;AAAA,EAI/B,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,gBAAA,EAAiB;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAAA,EACpC;AAAA;AAAA,EAMA,MAAgB,IAAO,IAAA,EAA0B;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,IAAI,CAAA,SAAA,EAAY,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA,EAGA,MAAgB,IAAA,CAAQ,IAAA,EAAc,IAAA,EAA4B;AAChE,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,IAAA,GAAO,EAAE,cAAA,EAAgB,oBAAmB,GAAI,MAAA;AAAA,MACzD,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,MAAA;AAAA,MACpC,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA,EAGA,MAAgB,YAAA,CAAgB,IAAA,EAAc,QAAA,EAAgC;AAC5E,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,SAAA,EAAY,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA,EAGA,MAAgB,OAAO,IAAA,EAA6B;AAClD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,SAAA,EAAY,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAGA,MAAgB,aAAa,IAAA,EAA6B;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MACpD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,SAAA,EAAY,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA,EAGA,MAAM,MAAA,GAAuD;AAC3D,IAAA,OAAO,IAAA,CAAK,IAAI,SAAS,CAAA;AAAA,EAC3B;AACF,CAAA;;;AC1EA,IAAM,eAAA,GAAkB,8CAAA;AAEjB,IAAM,UAAA,GAAN,cAAyB,UAAA,CAAW;AAAA,EACzC,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,KAAA,CAAM,OAAO,CAAA;AAAA,EACf;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,OAAA,CAAQ,IAAI,YAAA,IAAgB,eAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,IAAA,EAAmB,QAAA,EAA0C;AACxE,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,QAAA,IAAY,eAAe,CAAA;AACzD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,mBAAA,EAAqB,QAAQ,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAA8B;AAC3C,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,KAAA,EAAsC;AAC/C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,KAAA,EAAe,UAAA,EAAoD;AAC5E,IAAA,OAAO,KAAK,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,KAAA,CAAA,EAAS,EAAE,YAAY,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,KAAA,EAA0C;AACvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,SAAA,CAAW,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,KAAA,EAAyC;AACpD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,EAAE,OAAO,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,KAAA,EAAe,UAAA,EAAsD;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,CAAA,WAAA,EAAc,KAAK,CAAA,MAAA,CAAA,EAAU,EAAE,YAAY,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,KAAA,EAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,WAAA,EAAc,KAAK,CAAA,KAAA,CAAO,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,QAAQ,CAAA,EAA2B;AAC/E,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,EAAE,MAAM,aAAA,EAAe,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,KAAA,EAAe,IAAA,EAAc,OAAA,EAA2D;AACzG,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,GAAG,OAAA,EAAS,CAAC,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,EAAe,OAAA,EAAmB,IAAA,EAA0C;AACzF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,MAAA,GAAS,2BAAA,EAAqD;AAChG,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,EAAE,MAAM,kBAAA,EAAoB,aAAA,EAAe,MAAA,EAAQ,CAAC,CAAA;AAAA,EAChF;AACF;;;ACpHA,IAAM,gBAAA,GAAmB,mCAAA;AAElB,IAAM,YAAN,MAAgB;AAAA,EAKrB,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,IAAI,aAAA,IAAiB,gBAAA;AAC/D,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,IAAI,aAAA,IAAiB,EAAA;AAC7D,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,YAAY,KAAA,EAAe;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA;AAAA,EAGA,aAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAK,QAAA,EAAsD;AAE/D,IAAA,MAAM,kBAAkB,IAAA,CAAK,UAAA,GACzB,SAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACrB,MAAA,IAAI,MAAM,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,SAAS,MAAA,EAAQ;AAClD,QAAA,OAAO;AAAA,UACL,GAAG,CAAA;AAAA,UACH,OAAA,EAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,UAAU,CAAA;;AAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,SAC5D;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA,GACD,QAAA;AAEJ,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,KAAK,MAAA,IAAU,EAAE,eAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAG,OAC9D;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,eAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,WAAW,QAAA,EAAkD;AAElE,IAAA,MAAM,kBAAkB,IAAA,CAAK,UAAA,GACzB,SAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACrB,MAAA,IAAI,MAAM,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,SAAS,MAAA,EAAQ;AAClD,QAAA,OAAO;AAAA,UACL,GAAG,CAAA;AAAA,UACH,OAAA,EAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,UAAU,CAAA;;AAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,SAC5D;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA,GACD,QAAA;AAEJ,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,KAAK,MAAA,IAAU,EAAE,eAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAG,OAC9D;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,eAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,QAAA,IAAI,SAAS,QAAA,EAAU;AAEvB,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,WAAA,EAAsC;AACnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,CAAC,CAAA;AACzE,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,eAAA,GAAkB;AAChB,IAAA,OAAO;AAAA,MACL,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,KACzB;AAAA,EACF;AACF","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"]} | ||
| {"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"]} |
@@ -70,3 +70,3 @@ // src/core/base-client.ts | ||
| // src/docx/client.ts | ||
| var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx"; | ||
| var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx"; | ||
| var DocxClient = class extends BaseClient { | ||
@@ -164,3 +164,3 @@ constructor(options = {}) { | ||
| // src/docx/agent.ts | ||
| var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1"; | ||
| var DEFAULT_BASE_URL = "https://api.subagents.com/v1"; | ||
| var DocxAgent = class { | ||
@@ -284,3 +284,3 @@ constructor(options = {}) { | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -287,0 +287,0 @@ * const agent = new DocxAgent(); |
@@ -1,1 +0,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"]} | ||
| {"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"]} |
+3
-3
@@ -219,3 +219,3 @@ 'use strict'; | ||
| // src/docx/client.ts | ||
| var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx"; | ||
| var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx"; | ||
| var DocxClient = class extends BaseClient { | ||
@@ -313,3 +313,3 @@ constructor(options = {}) { | ||
| // src/docx/agent.ts | ||
| var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1"; | ||
| var DEFAULT_BASE_URL = "https://api.subagents.com/v1"; | ||
| var DocxAgent = class { | ||
@@ -433,3 +433,3 @@ constructor(options = {}) { | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -436,0 +436,0 @@ * const agent = new DocxAgent(); |
@@ -1,1 +0,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"]} | ||
| {"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"]} |
+3
-3
@@ -217,3 +217,3 @@ // src/core/base-client.ts | ||
| // src/docx/client.ts | ||
| var DEFAULT_API_URL = "https://subagents.morphllm.com/v1/morph-docx"; | ||
| var DEFAULT_API_URL = "https://api.subagents.com/v1/morph-docx"; | ||
| var DocxClient = class extends BaseClient { | ||
@@ -311,3 +311,3 @@ constructor(options = {}) { | ||
| // src/docx/agent.ts | ||
| var DEFAULT_BASE_URL = "https://subagents.morphllm.com/v1"; | ||
| var DEFAULT_BASE_URL = "https://api.subagents.com/v1"; | ||
| var DocxAgent = class { | ||
@@ -431,3 +431,3 @@ constructor(options = {}) { | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -434,0 +434,0 @@ * const agent = new DocxAgent(); |
@@ -1,1 +0,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"]} | ||
| {"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"]} |
@@ -5,3 +5,3 @@ export { F as FillOperation, a as FillResponse, b as FormField, P as PdfAgentOptions, c as PdfClientOptions, d as PdfDocumentInfo, R as ReadFieldsResponse } from '../types-DBtV_NyH.mjs'; | ||
| /** | ||
| * @morphllm/subagents/pdf | ||
| * subagents/pdf | ||
| * | ||
@@ -8,0 +8,0 @@ * PDF form filling subagent (coming soon). |
@@ -5,3 +5,3 @@ export { F as FillOperation, a as FillResponse, b as FormField, P as PdfAgentOptions, c as PdfClientOptions, d as PdfDocumentInfo, R as ReadFieldsResponse } from '../types-BEtL6Wum.js'; | ||
| /** | ||
| * @morphllm/subagents/pdf | ||
| * subagents/pdf | ||
| * | ||
@@ -8,0 +8,0 @@ * PDF form filling subagent (coming soon). |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.js","sourcesContent":["/**\n * @morphllm/subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]} | ||
| {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.js","sourcesContent":["/**\n * subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../../src/pdf/index.ts"],"names":[],"mappings":";AAqBO,IAAM,SAAA,GAAY;AAClB,IAAM,QAAA,GAAW","file":"index.mjs","sourcesContent":["/**\n * @morphllm/subagents/pdf\n *\n * PDF form filling subagent (coming soon).\n *\n * This module will provide:\n * - PdfClient: HTTP client for PDF form API\n * - PdfAgent: AI agent for filling PDF forms\n */\n\nexport type {\n PdfDocumentInfo,\n FormField,\n ReadFieldsResponse,\n FillOperation,\n FillResponse,\n PdfClientOptions,\n PdfAgentOptions,\n} from './types';\n\n// Placeholder exports - will be implemented when PDF service is ready\nexport const PdfClient = null;\nexport const PdfAgent = null;\n"]} | ||
| {"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"]} |
+4
-3
| { | ||
| "name": "@morphllm/subagents", | ||
| "version": "0.1.4", | ||
| "version": "0.1.5", | ||
| "description": "Modular AI subagents for document processing - DOCX editing, PDF filling, and more", | ||
@@ -50,5 +50,6 @@ "main": "./dist/index.js", | ||
| "openai", | ||
| "morphllm" | ||
| "llm" | ||
| ], | ||
| "author": "MorphLLM", | ||
| "author": "Subagents", | ||
| "homepage": "https://subagents.com", | ||
| "license": "MIT", | ||
@@ -55,0 +56,0 @@ "repository": { |
+15
-25
@@ -1,2 +0,2 @@ | ||
| # @morphllm/subagents | ||
| # subagents | ||
@@ -41,3 +41,3 @@ Modular AI subagents for document processing. Built for use with OpenAI-compatible APIs. | ||
| ```bash | ||
| npm install @morphllm/subagents | ||
| npm install subagents | ||
| ``` | ||
@@ -57,3 +57,3 @@ | ||
| ```typescript | ||
| import { DocxClient } from '@morphllm/subagents/docx'; | ||
| import { DocxClient } from 'subagents/docx'; | ||
@@ -82,15 +82,11 @@ const client = new DocxClient(); | ||
| import OpenAI from 'openai'; | ||
| import { DocxClient, DocxAgent } from '@morphllm/subagents/docx'; | ||
| import { DocxAgent } from 'subagents/docx'; | ||
| const openai = new OpenAI(); | ||
| const client = new DocxClient(); | ||
| const openai = new OpenAI({ | ||
| apiKey: process.env.OPENAI_API_KEY, | ||
| }); | ||
| // Upload a document first | ||
| const file = new File([documentBuffer], 'contract.docx'); | ||
| const { doc_id } = await client.upload(file); | ||
| // Create agent with the document | ||
| const agent = new DocxAgent({ | ||
| openai, | ||
| documentId: doc_id, | ||
| documentId: 'your-doc-id', | ||
| }); | ||
@@ -103,9 +99,3 @@ | ||
| // Download the edited document | ||
| const editedDoc = await client.download(doc_id); | ||
| ``` | ||
| ### Streaming Responses | ||
| ```typescript | ||
| // Or stream for real-time UI | ||
| for await (const event of agent.runStream('Add comments to unclear sections')) { | ||
@@ -124,7 +114,7 @@ if (event.type === 'content_delta') { | ||
| // Import everything | ||
| import { DocxClient, DocxAgent, BaseClient } from '@morphllm/subagents'; | ||
| import { DocxClient, DocxAgent, BaseClient } from 'subagents'; | ||
| // Import specific modules | ||
| import { DocxClient, DocxAgent } from '@morphllm/subagents/docx'; | ||
| import { BaseClient, BaseAgent } from '@morphllm/subagents/core'; | ||
| import { DocxClient, DocxAgent } from 'subagents/docx'; | ||
| import { BaseClient, BaseAgent } from 'subagents/core'; | ||
| ``` | ||
@@ -137,4 +127,4 @@ | ||
| ```typescript | ||
| import { BaseClient, BaseAgent } from '@morphllm/subagents/core'; | ||
| import type { Tool } from '@morphllm/subagents/core'; | ||
| import { BaseClient, BaseAgent } from 'subagents/core'; | ||
| import type { Tool } from 'subagents/core'; | ||
@@ -174,3 +164,3 @@ class MyClient extends BaseClient { | ||
| |----------|-------------|---------| | ||
| | `DOCX_API_URL` | DOCX service URL | https://docx.morphllm.com | | ||
| | `DOCX_API_URL` | DOCX service URL | Railway deployment | | ||
@@ -177,0 +167,0 @@ ## License |
| /** | ||
| * @morphllm/subagents/core | ||
| * subagents/core | ||
| * | ||
@@ -4,0 +4,0 @@ * Core utilities and base classes for building subagents. |
@@ -5,3 +5,3 @@ /** | ||
| * OpenAI Agents SDK compatible client for morph-docx. | ||
| * Talks to subagents.morphllm.com/v1/chat/completions with model "morph-docx". | ||
| * Talks to api.subagents.com/v1/chat/completions with model "morph-docx". | ||
| */ | ||
@@ -11,3 +11,3 @@ | ||
| const DEFAULT_BASE_URL = 'https://subagents.morphllm.com/v1'; | ||
| const DEFAULT_BASE_URL = 'https://api.subagents.com/v1'; | ||
@@ -156,3 +156,3 @@ export class DocxAgent { | ||
| * import OpenAI from 'openai'; | ||
| * import { DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxAgent } from 'subagents/docx'; | ||
| * | ||
@@ -159,0 +159,0 @@ * const agent = new DocxAgent(); |
@@ -19,3 +19,3 @@ /** | ||
| const DEFAULT_API_URL = 'https://subagents.morphllm.com/v1/morph-docx'; | ||
| const DEFAULT_API_URL = 'https://api.subagents.com/v1/morph-docx'; | ||
@@ -22,0 +22,0 @@ export class DocxClient extends BaseClient { |
| /** | ||
| * @morphllm/subagents/docx | ||
| * subagents/docx | ||
| * | ||
@@ -4,0 +4,0 @@ * DOCX document editing subagent for track changes, comments, and more. |
@@ -140,3 +140,3 @@ /** | ||
| export interface DocxAgentOptions { | ||
| /** Base URL for the API. Defaults to subagents.morphllm.com/v1 */ | ||
| /** Base URL for the API. Defaults to api.subagents.com/v1 */ | ||
| baseUrl?: string; | ||
@@ -143,0 +143,0 @@ /** API key (optional, not required for public endpoints) */ |
+3
-3
| /** | ||
| * @morphllm/subagents | ||
| * subagents | ||
| * | ||
@@ -13,6 +13,6 @@ * Modular AI subagents for document processing. | ||
| * // Import specific subagent | ||
| * import { DocxClient, DocxAgent } from '@morphllm/subagents/docx'; | ||
| * import { DocxClient, DocxAgent } from 'subagents/docx'; | ||
| * | ||
| * // Or import everything | ||
| * import { DocxClient, DocxAgent } from '@morphllm/subagents'; | ||
| * import { DocxClient, DocxAgent } from 'subagents'; | ||
| * | ||
@@ -19,0 +19,0 @@ * // Use the client directly |
+1
-1
| /** | ||
| * @morphllm/subagents/pdf | ||
| * subagents/pdf | ||
| * | ||
@@ -4,0 +4,0 @@ * PDF form filling subagent (coming soon). |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
1
-50%259959
-0.26%163
-5.78%