@diegoaltoworks/chatter 0.16.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +3 -0
  2. package/dist/auth/apikeys.d.ts +0 -1
  3. package/dist/auth/apikeys.d.ts.map +1 -1
  4. package/dist/bin/create-apikey.js +1 -3
  5. package/dist/client/__tests__/markdown.test.d.ts +5 -0
  6. package/dist/client/__tests__/markdown.test.d.ts.map +1 -0
  7. package/dist/client/src/Chat.d.ts +1 -0
  8. package/dist/client/src/Chat.d.ts.map +1 -1
  9. package/dist/client/src/ChatBot.d.ts.map +1 -1
  10. package/dist/client/src/ChatButton.d.ts.map +1 -1
  11. package/dist/client/src/markdown.d.ts +20 -0
  12. package/dist/client/src/markdown.d.ts.map +1 -0
  13. package/dist/core/llm.d.ts +6 -3
  14. package/dist/core/llm.d.ts.map +1 -1
  15. package/dist/core/pipeline.d.ts +33 -0
  16. package/dist/core/pipeline.d.ts.map +1 -0
  17. package/dist/core/prompts.d.ts.map +1 -1
  18. package/dist/core/retrieval.d.ts.map +1 -1
  19. package/dist/index.d.ts +4 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +12251 -1975
  22. package/dist/index.mjs +12248 -1975
  23. package/dist/mcp-server/cost-tracker.d.ts.map +1 -1
  24. package/dist/mcp-server/logger.d.ts.map +1 -1
  25. package/dist/mcp-server/rate-limiter.d.ts.map +1 -1
  26. package/dist/mcp-server.d.ts.map +1 -1
  27. package/dist/mcp-server.js +4 -2
  28. package/dist/mcp-server.mjs +4 -2
  29. package/dist/middleware/auth.d.ts.map +1 -1
  30. package/dist/middleware/cors.d.ts.map +1 -1
  31. package/dist/middleware/jwt.d.ts.map +1 -1
  32. package/dist/middleware/ratelimit.d.ts.map +1 -1
  33. package/dist/middleware/referrer.d.ts.map +1 -1
  34. package/dist/middleware/session.d.ts.map +1 -1
  35. package/dist/routes/openai.d.ts +34 -0
  36. package/dist/routes/openai.d.ts.map +1 -0
  37. package/dist/routes/openai.test.d.ts +8 -0
  38. package/dist/routes/openai.test.d.ts.map +1 -0
  39. package/dist/routes/private.d.ts.map +1 -1
  40. package/dist/routes/public.d.ts.map +1 -1
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/static/chatter.css +121 -0
  43. package/dist/static/chatter.js +8 -2
  44. package/dist/types.d.ts +13 -1
  45. package/dist/types.d.ts.map +1 -1
  46. package/package.json +23 -16
@@ -1 +1 @@
1
- {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/mcp-server/cost-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,QAAQ,CAgBX;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ;;;;;;EAQ5C"}
1
+ {"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/mcp-server/cost-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,QAAQ,CAgBX;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ;IAEzC,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,gBAAgB;IAChB,SAAS;EAEZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/mcp-server/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAErE;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAiB;gBAEtB,aAAa,UAAO,EAAE,QAAQ,CAAC,EAAE,cAAc;IAK3D;;OAEG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,WAAW,EAAE,EACnC,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC;CAkCjB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,aAAa,UAAO,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,CAEvF"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/mcp-server/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAErE;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAElC,YAAY,aAAa,UAAO,EAAE,QAAQ,CAAC,EAAE,cAAc,EAG1D;IAED;;OAEG;IACG,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,WAAW,EAAE,EACnC,UAAU,EAAE,MAAM,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,IAAI,CAAC,CAiCf;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,aAAa,UAAO,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,CAEvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/mcp-server/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;;;OAKG;gBACS,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ;IAM3C;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAsB3B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAO7B;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAUvC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAQ,GAAG,WAAW,GAAG,IAAI,CAEjG"}
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/mcp-server/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;;;OAKG;IACH,YAAY,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAQ,EAI1C;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAoB1B;IAED;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK5B;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvB;IAED;;OAEG;IACH,QAAQ,IAAI,IAAI,CAEf;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASrC;CACF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAQ,GAAG,WAAW,GAAG,IAAI,CAEjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,YAAY,EACV,WAAW,EACX,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,sBAuS7D"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,YAAY,EACV,WAAW,EACX,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,sBAuS7D"}
@@ -53,14 +53,16 @@ function scrubOutput(text) {
53
53
  }
54
54
 
55
55
  // src/core/llm.ts
56
+ var DEFAULT_MODEL = "gpt-4o";
56
57
  async function completeOnce({
57
58
  client,
58
59
  system,
59
60
  messages,
60
- temperature = 0.2
61
+ temperature = 0.2,
62
+ model = DEFAULT_MODEL
61
63
  }) {
62
64
  const res = await client.chat.completions.create({
63
- model: "gpt-4o",
65
+ model,
64
66
  temperature,
65
67
  messages: [{ role: "system", content: system }, ...messages]
66
68
  });
@@ -19,14 +19,16 @@ function scrubOutput(text) {
19
19
  }
20
20
 
21
21
  // src/core/llm.ts
22
+ var DEFAULT_MODEL = "gpt-4o";
22
23
  async function completeOnce({
23
24
  client,
24
25
  system,
25
26
  messages,
26
- temperature = 0.2
27
+ temperature = 0.2,
28
+ model = DEFAULT_MODEL
27
29
  }) {
28
30
  const res = await client.chat.completions.create({
29
- model: "gpt-4o",
31
+ model,
30
32
  temperature,
31
33
  messages: [{ role: "system", content: system }, ...messages]
32
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,IAGpB,GAAG,OAAO,EAAE,MAAM,IAAI;;8BAuC9D"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,OAGjB,OAAO,QAAQ,IAAI;;8BAuC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK1C;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GAAI,iBAAiB,MAAM,EAAE,MAAY,GAAG,OAAO,EAAE,MAAM,IAAI,kCAyB/E,CAAC"}
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK1C;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,oBAAqB,MAAM,EAAE,SAAe,OAAO,QAAQ,IAAI,kCAyB/E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/middleware/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAO9C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,IAwBf,GAAG,OAAO,EAAE,MAAM,IAAI;;8BAa/D;AAGD,eAAO,MAAM,iBAAiB,MAhBe,OAAO,QAAQ,IAAI;;6BAgBS,CAAC"}
1
+ {"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/middleware/jwt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAO9C;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,OAwBZ,OAAO,QAAQ,IAAI;;8BAa/D;AAGD,eAAO,MAAM,iBAAiB,MAhBe,OAAO,QAAQ,IAAI;;6BAgBS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ratelimit.d.ts","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkB9C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa;oBAuBnC,GAAG,OAAO,EAAE,MAAM,IAAI;;;qBAyBtB,GAAG,OAAO,EAAE,MAAM,IAAI;;;EAQzC;AAID,eAAO,MAAM,WAAW,SArCJ,GAAG,OAAO,EAAE,MAAM,IAAI;;6BAqCW,CAAC;AACtD,eAAO,MAAM,YAAY,SAbL,GAAG,OAAO,EAAE,MAAM,IAAI;;6BAaa,CAAC"}
1
+ {"version":3,"file":"ratelimit.d.ts","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkB9C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa;IAsBnD,WAAW,QACQ,OAAO,QAAQ,IAAI;;;IAwBtC,YAAY,QACO,OAAO,QAAQ,IAAI;;;EAQzC;AAID,eAAO,MAAM,WAAW,YArCD,OAAO,QAAQ,IAAI;;6BAqCW,CAAC;AACtD,eAAO,MAAM,YAAY,YAbF,OAAO,QAAQ,IAAI;;6BAaa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../../src/middleware/referrer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,IACxC,GAAG,OAAO,EAAE,MAAM,IAAI;;8BA8CrC;AAGD,eAAO,MAAM,mBAAmB,wBAAkB,CAAC"}
1
+ {"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../../src/middleware/referrer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,OACrC,OAAO,QAAQ,IAAI;;8BA8CrC;AAGD,eAAO,MAAM,mBAAmB,wBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C;;;GAGG;AACH,wBAAgB,kBAAkB,KAClB,GAAG,OAAO,EAAE,MAAM,IAAI;;8BAkCrC;AAGD,eAAO,MAAM,uBAAuB,2BAAqB,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/middleware/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG1C;;;GAGG;AACH,wBAAgB,kBAAkB,QACf,OAAO,QAAQ,IAAI;;8BAkCrC;AAGD,eAAO,MAAM,uBAAuB,2BAAqB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * OpenAI-compatible chat completions routes.
3
+ *
4
+ * Exposes the RAG pipeline over the standard OpenAI wire format so any
5
+ * off-the-shelf chat UI or SDK (deep-chat, assistant-ui, the official
6
+ * OpenAI clients, Vercel AI SDK, ...) can talk to Chatter without a
7
+ * bespoke adapter:
8
+ *
9
+ * POST /v1/chat/completions → public pipeline (API key)
10
+ * POST /api/private/v1/chat/completions → private pipeline (JWT)
11
+ *
12
+ * Both support `stream: true` (SSE `chat.completion.chunk` events ending
13
+ * with `data: [DONE]`) and non-streaming JSON responses.
14
+ *
15
+ * Hardening notes:
16
+ * - The upstream model is always the server-configured one; a client's
17
+ * `model` field is accepted for wire compatibility but never used to
18
+ * pick the upstream model (callers must not control spend).
19
+ * - Incoming `system`/`tool` messages are dropped: the system prompt is
20
+ * owned by the server (guardrails + persona + retrieved context).
21
+ * - The public route requires a real JWT API key via `Authorization:
22
+ * Bearer` or `x-api-key`; widget-only session/demo keys are not valid.
23
+ */
24
+ import { Hono } from "hono";
25
+ import { type PipelineMessage } from "../core/pipeline";
26
+ import type { ServerDependencies } from "../types";
27
+ /**
28
+ * Normalize OpenAI-format messages to the pipeline format.
29
+ * Accepts string content and text content-part arrays; drops system/tool
30
+ * messages. Returns null when nothing usable remains.
31
+ */
32
+ export declare function normalizeMessages(raw: unknown): PipelineMessage[] | null;
33
+ export declare function openaiRoutes(deps: ServerDependencies): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
34
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/routes/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,kBAAkB,CAAC;AAGxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,GAAG,IAAI,CA8BxE;AASD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,8EAsHpD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OpenAI-compatible routes tests
3
+ *
4
+ * Uses faked dependencies (OpenAI client, vector store, prompts, API key
5
+ * manager) so the wire format can be verified without external services.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=openai.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.test.d.ts","sourceRoot":"","sources":["../../src/routes/openai.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1 +1 @@
1
- {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/routes/private.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,8EAyDrD"}
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/routes/private.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,8EAqDrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/routes/public.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,8EAkEpD"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/routes/public.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,8EA8DpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,uFAiJvD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAY5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,uFAwJvD"}
@@ -109,6 +109,127 @@
109
109
  color: #c33 !important;
110
110
  }
111
111
 
112
+ /* Markdown content (assistant messages) */
113
+ .chatter-ui-message-content > *:first-child {
114
+ margin-top: 0;
115
+ }
116
+
117
+ .chatter-ui-message-content > *:last-child {
118
+ margin-bottom: 0;
119
+ }
120
+
121
+ .chatter-ui-message-content p {
122
+ margin: 0 0 8px 0;
123
+ }
124
+
125
+ .chatter-ui-message-content h1,
126
+ .chatter-ui-message-content h2,
127
+ .chatter-ui-message-content h3,
128
+ .chatter-ui-message-content h4,
129
+ .chatter-ui-message-content h5,
130
+ .chatter-ui-message-content h6 {
131
+ margin: 12px 0 6px 0;
132
+ font-weight: 600;
133
+ line-height: 1.25;
134
+ }
135
+
136
+ .chatter-ui-message-content h1 {
137
+ font-size: 1.3em;
138
+ }
139
+ .chatter-ui-message-content h2 {
140
+ font-size: 1.2em;
141
+ }
142
+ .chatter-ui-message-content h3 {
143
+ font-size: 1.1em;
144
+ }
145
+ .chatter-ui-message-content h4,
146
+ .chatter-ui-message-content h5,
147
+ .chatter-ui-message-content h6 {
148
+ font-size: 1em;
149
+ }
150
+
151
+ .chatter-ui-message-content ul,
152
+ .chatter-ui-message-content ol {
153
+ margin: 0 0 8px 0;
154
+ padding-left: 22px;
155
+ }
156
+
157
+ .chatter-ui-message-content li {
158
+ margin: 2px 0;
159
+ }
160
+
161
+ .chatter-ui-message-content a {
162
+ color: inherit;
163
+ text-decoration: underline;
164
+ word-break: break-word;
165
+ }
166
+
167
+ .chatter-ui-message-user .chatter-ui-message-content a {
168
+ color: #ffffff;
169
+ }
170
+
171
+ .chatter-ui-message-content code {
172
+ font-family:
173
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
174
+ monospace;
175
+ font-size: 0.9em;
176
+ padding: 1px 5px;
177
+ background: rgba(0, 0, 0, 0.06);
178
+ border-radius: 4px;
179
+ }
180
+
181
+ .chatter-ui-message-user .chatter-ui-message-content code {
182
+ background: rgba(255, 255, 255, 0.18);
183
+ }
184
+
185
+ .chatter-ui-message-content pre {
186
+ margin: 8px 0;
187
+ padding: 10px 12px;
188
+ background: #0f1115;
189
+ color: #e6e6e6;
190
+ border-radius: 8px;
191
+ overflow-x: auto;
192
+ font-size: 0.9em;
193
+ line-height: 1.45;
194
+ }
195
+
196
+ .chatter-ui-message-content pre code {
197
+ padding: 0;
198
+ background: transparent;
199
+ color: inherit;
200
+ font-size: inherit;
201
+ border-radius: 0;
202
+ }
203
+
204
+ .chatter-ui-message-content blockquote {
205
+ margin: 8px 0;
206
+ padding: 4px 12px;
207
+ border-left: 3px solid rgba(0, 0, 0, 0.15);
208
+ color: rgba(0, 0, 0, 0.7);
209
+ background: rgba(0, 0, 0, 0.03);
210
+ border-radius: 0 6px 6px 0;
211
+ }
212
+
213
+ .chatter-ui-message-user .chatter-ui-message-content blockquote {
214
+ border-left-color: rgba(255, 255, 255, 0.4);
215
+ color: rgba(255, 255, 255, 0.85);
216
+ background: rgba(255, 255, 255, 0.08);
217
+ }
218
+
219
+ .chatter-ui-message-content hr {
220
+ border: none;
221
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
222
+ margin: 10px 0;
223
+ }
224
+
225
+ .chatter-ui-message-content strong {
226
+ font-weight: 600;
227
+ }
228
+
229
+ .chatter-ui-message-content em {
230
+ font-style: italic;
231
+ }
232
+
112
233
  /* Input Container */
113
234
  .chatter-ui-chat-input-container {
114
235
  display: flex;
@@ -1,2 +1,8 @@
1
- "use strict";var Chatter=(()=>{var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var M=(o,t)=>{for(var e in t)p(o,e,{get:t[e],enumerable:!0})},T=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of C(t))!w.call(o,s)&&s!==e&&p(o,s,{get:()=>t[s],enumerable:!(i=f(t,s))||i.enumerable});return o};var k=o=>T(p({},"__esModule",{value:!0}),o);var L={};M(L,{Chat:()=>h,ChatBot:()=>a,ChatButton:()=>l});var a=class{constructor(t){if(!t.host)throw new Error("host is required");if(!t.mode||!["public","private"].includes(t.mode))throw new Error('mode must be either "public" or "private"');if(!t.apiKey)throw new Error("apiKey is required");if(t.mode==="private"&&!t.token)throw new Error("token is required for private mode");let e=t.host.trim();!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`${e.startsWith("localhost")||e.startsWith("127.0.0.1")?"http://":"https://"}${e}`),this.baseUrl=e.replace(/\/$/,""),this.mode=t.mode,this.apiKey=t.apiKey,this.token=t.token,this.endpoint=`${this.baseUrl}/api/${this.mode}/chat`}getHeaders(t=!1){let e={"Content-Type":"application/json"};return this.apiKey&&(e["x-api-key"]=this.apiKey),this.mode==="private"&&this.token&&(e.Authorization=`Bearer ${this.token}`),t&&(e.Accept="text/event-stream"),e}async sendMessage(t){let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({message:t})});if(!e.ok){let s=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${s.error||e.statusText}`)}return(await e.json()).reply}async sendConversation(t){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({messages:t})});if(!e.ok){let s=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${s.error||e.statusText}`)}return(await e.json()).reply}async streamMessage(t,e){await this.stream({message:t},e)}async streamConversation(t,e){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");await this.stream({messages:t},e)}async stream(t,e){let{onChunk:i,onEnd:s,onError:r}=e;try{let n=await fetch(`${this.endpoint}?stream=1`,{method:"POST",headers:this.getHeaders(!0),body:JSON.stringify(t)});if(!n.ok){let d=await n.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${d.error||n.statusText}`)}if(!n.body)throw new Error("Response body is null");let g=n.body.getReader(),y=new TextDecoder,c="";for(;;){let{done:d,value:b}=await g.read();if(d)break;c+=y.decode(b,{stream:!0});let m=c.split(`
2
- `);c=m.pop()||"";for(let u of m)if(u.startsWith("data: ")){let E=u.slice(6);try{let v=JSON.parse(E);v.delta&&i(v.delta)}catch{}}else if(u.startsWith("event: end")){s&&s();return}}s&&s()}catch(n){if(r)r(n);else throw n}}};var h=class{constructor(t){this.messages=[];if(this.bot=new a({host:t.host,mode:t.mode,apiKey:t.apiKey,token:t.token}),typeof t.container=="string"){let e=document.querySelector(t.container);if(!e)throw new Error(`Container element not found: ${t.container}`);this.container=e}else this.container=t.container;this.placeholder=t.placeholder||"Type your message...",this.title=t.title||"Chat",this.subtitle=t.subtitle||"",this.messages=t.initialMessages||[],this.onClose=t.onClose,this.render(),this.attachEventListeners()}render(){this.container.innerHTML=`<div class="chatter-ui-chat"><div class="chatter-ui-chat-header"><button class="chatter-ui-chat-close" type="button" aria-label="Close chat">\xD7</button><div class="chatter-ui-chat-title">${this.title}</div>${this.subtitle?`<div class="chatter-ui-chat-subtitle">${this.subtitle}</div>`:""}</div><div class="chatter-ui-chat-messages"></div><div class="chatter-ui-chat-input-container"><textarea class="chatter-ui-chat-input" placeholder="${this.placeholder}" rows="1"></textarea><button class="chatter-ui-chat-send" type="button"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg></button></div></div>`;let t=this.container.querySelector(".chatter-ui-chat-messages"),e=this.container.querySelector(".chatter-ui-chat-input"),i=this.container.querySelector(".chatter-ui-chat-send");if(!t||!e||!i)throw new Error("Required chat elements not found in container");this.messagesContainer=t,this.inputElement=e,this.sendButton=i;for(let s of this.messages)this.addMessageToUI(s)}attachEventListeners(){let t=this.container.querySelector(".chatter-ui-chat-close");t&&this.onClose&&t.addEventListener("click",()=>{this.onClose?.()}),this.sendButton.addEventListener("click",()=>this.handleSend()),this.inputElement.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),this.handleSend())}),this.inputElement.addEventListener("input",()=>{this.inputElement.style.height="auto",this.inputElement.style.height=`${Math.min(this.inputElement.scrollHeight,120)}px`}),this.isMobile()&&(this.inputElement.addEventListener("focus",()=>{setTimeout(()=>{this.inputElement.scrollIntoView({behavior:"smooth",block:"nearest"})},300)}),this.sendButton.addEventListener("touchend",e=>{e.preventDefault(),this.handleSend()},{passive:!1}))}async handleSend(){let t=this.inputElement.value.trim();if(!t)return;let e={role:"user",content:t};this.messages.push(e),this.addMessageToUI(e),this.inputElement.value="",this.inputElement.style.height="auto",this.setInputEnabled(!1);try{let i={role:"assistant",content:""};this.messages.push(i);let r=this.addMessageToUI(i).querySelector(".chatter-ui-message-content");if(!r)throw new Error("Message content element not found");await this.bot.streamConversation(this.messages,{onChunk:n=>{i.content+=n,r.textContent=i.content,this.scrollToBottom()},onEnd:()=>{this.setInputEnabled(!0),this.isMobile()||this.inputElement.focus()},onError:n=>{console.error("Stream error:",n),i.content="Sorry, an error occurred. Please try again.",r.textContent=i.content,r.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}})}catch(i){console.error("Send error:",i);let s={role:"assistant",content:"Sorry, an error occurred. Please try again."};this.messages.push(s),this.addMessageToUI(s).querySelector(".chatter-ui-message-content")?.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}}addMessageToUI(t){let e=document.createElement("div");return e.className=`chatter-ui-message chatter-ui-message-${t.role}`,e.innerHTML=`<div class="chatter-ui-message-content">${t.content}</div>`,this.messagesContainer.appendChild(e),this.scrollToBottom(),e}setInputEnabled(t){this.inputElement.disabled=!t,this.sendButton.disabled=!t}scrollToBottom(){this.messagesContainer.scrollTop=this.messagesContainer.scrollHeight}clear(){this.messages=[],this.messagesContainer.innerHTML=""}getMessages(){return[...this.messages]}destroy(){this.container.innerHTML=""}isMobile(){return window.innerWidth<=768}};var l=class{constructor(t){this.chat=null;this.isOpen=!1;this.config={position:"bottom-right",label:"\u{1F4AC}",...t},this.render(),this.attachEventListeners()}render(){this.buttonElement=document.createElement("button"),this.buttonElement.className=`chatter-ui-chat-button chatter-ui-chat-button-${this.config.position}`,this.buttonElement.innerHTML=this.config.label||"\u{1F4AC}",this.buttonElement.setAttribute("aria-label","Open chat"),this.config.styles&&Object.assign(this.buttonElement.style,this.config.styles),this.chatContainer=document.createElement("div"),this.chatContainer.className=`chatter-ui-chat-popup chatter-ui-chat-popup-${this.config.position}`,this.chatContainer.style.display="none",document.body.appendChild(this.buttonElement),document.body.appendChild(this.chatContainer)}attachEventListeners(){this.buttonElement.addEventListener("click",()=>this.toggle()),document.addEventListener("keydown",t=>{t.key==="Escape"&&this.isOpen&&this.close()}),document.addEventListener("click",t=>{this.isOpen&&!this.chatContainer.contains(t.target)&&!this.buttonElement.contains(t.target)&&this.close()})}toggle(){this.isOpen?this.close():this.open()}open(){this.isOpen||(this.chat||(this.chat=new h({host:this.config.host,mode:this.config.mode,apiKey:this.config.apiKey,token:this.config.token,container:this.chatContainer,onClose:()=>this.close(),...this.config.chatConfig})),this.chatContainer.style.display="block",this.buttonElement.classList.add("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Close chat"),this.isOpen=!0,this.isMobile()&&(document.body.style.overflow="hidden",document.body.style.position="fixed",document.body.style.width="100%"),setTimeout(()=>{let t=this.chatContainer.querySelector(".chatter-ui-chat-input");t&&(t.focus(),this.isMobile()&&setTimeout(()=>{t.scrollIntoView({behavior:"smooth",block:"center"})},300))},this.isMobile()?300:100))}close(){this.isOpen&&(this.chatContainer.style.display="none",this.buttonElement.classList.remove("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Open chat"),this.isOpen=!1,this.isMobile()&&(document.body.style.overflow="",document.body.style.position="",document.body.style.width=""))}isMobile(){return window.innerWidth<=768}destroy(){this.chat?.destroy(),this.buttonElement.remove(),this.chatContainer.remove()}isOpened(){return this.isOpen}};typeof window<"u"&&(window.Chatter={ChatBot:a,Chat:h,ChatButton:l});return k(L);})();
1
+ "use strict";var Chatter=(()=>{var M=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var A=(n,t)=>{for(var e in t)M(n,e,{get:t[e],enumerable:!0})},_=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of O(t))!x.call(n,i)&&i!==e&&M(n,i,{get:()=>t[i],enumerable:!(s=B(t,i))||s.enumerable});return n};var P=n=>_(M({},"__esModule",{value:!0}),n);var U={};A(U,{Chat:()=>m,ChatBot:()=>p,ChatButton:()=>C});var p=class{constructor(t){if(!t.host)throw new Error("host is required");if(!t.mode||!["public","private"].includes(t.mode))throw new Error('mode must be either "public" or "private"');if(!t.apiKey)throw new Error("apiKey is required");if(t.mode==="private"&&!t.token)throw new Error("token is required for private mode");let e=t.host.trim();!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`${e.startsWith("localhost")||e.startsWith("127.0.0.1")?"http://":"https://"}${e}`),this.baseUrl=e.replace(/\/$/,""),this.mode=t.mode,this.apiKey=t.apiKey,this.token=t.token,this.endpoint=`${this.baseUrl}/api/${this.mode}/chat`}getHeaders(t=!1){let e={"Content-Type":"application/json"};return this.apiKey&&(e["x-api-key"]=this.apiKey),this.mode==="private"&&this.token&&(e.Authorization=`Bearer ${this.token}`),t&&(e.Accept="text/event-stream"),e}async sendMessage(t){let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({message:t})});if(!e.ok){let i=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${i.error||e.statusText}`)}return(await e.json()).reply}async sendConversation(t){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");let e=await fetch(this.endpoint,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({messages:t})});if(!e.ok){let i=await e.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${i.error||e.statusText}`)}return(await e.json()).reply}async streamMessage(t,e){await this.stream({message:t},e)}async streamConversation(t,e){if(!Array.isArray(t)||t.length===0)throw new Error("messages must be a non-empty array");await this.stream({messages:t},e)}async stream(t,e){let{onChunk:s,onEnd:i,onError:r}=e;try{let o=await fetch(`${this.endpoint}?stream=1`,{method:"POST",headers:this.getHeaders(!0),body:JSON.stringify(t)});if(!o.ok){let a=await o.json().catch(()=>({error:"Unknown error"}));throw new Error(`API Error: ${a.error||o.statusText}`)}if(!o.body)throw new Error("Response body is null");let h=o.body.getReader(),d=new TextDecoder,c="";for(;;){let{done:a,value:g}=await h.read();if(a)break;c+=d.decode(g,{stream:!0});let f=c.split(`
2
+ `);c=f.pop()||"";for(let v of f)if(v.startsWith("data: ")){let y=v.slice(6);try{let E=JSON.parse(y);E.delta&&s(E.delta)}catch{}}else if(v.startsWith("event: end")){i&&i();return}}i&&i()}catch(o){if(r)r(o);else throw o}}};var q=/^(https?:|mailto:|\/|#)/i,k="CODE",S="ENDCODE";function l(n){return n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function I(n){let t=n.trim();return q.test(t)?t:"#"}function L(n){let t=[],e=n.replace(/`([^`\n]+)`/g,(i,r)=>{let o=t.push(r)-1;return`${k}${o}${S}`});e=e.replace(/\[([^\]]+)\]\(([^)\s]+)(?:\s+&quot;([^&]*)&quot;)?\)/g,(i,r,o,h)=>{let d=I(o),c=h?` title="${h}"`:"";return`<a href="${d}" target="_blank" rel="noopener noreferrer"${c}>${r}</a>`}),e=e.replace(/(\*\*|__)(?=\S)([\s\S]+?)(?<=\S)\1/g,"<strong>$2</strong>"),e=e.replace(/(?<!\*)\*(?!\*)(?=\S)([\s\S]+?)(?<=\S)\*(?!\*)/g,"<em>$1</em>"),e=e.replace(/(?<![A-Za-z0-9_])_(?=\S)([\s\S]+?)(?<=\S)_(?![A-Za-z0-9_])/g,"<em>$1</em>");let s=new RegExp(`${k}(\\d+)${S}`,"g");return e=e.replace(s,(i,r)=>`<code>${t[Number(r)]??""}</code>`),e}function $(n,t){if(n.length===0)return;let e=n.join(`
3
+ `),s=L(l(e)).replace(/\n/g,"<br>");t.push(`<p>${s}</p>`),n.length=0}function w(n,t){if(!n)return null;let e=n.items.map(s=>`<li>${L(l(s))}</li>`).join("");return t.push(`<${n.type}>${e}</${n.type}>`),null}function H(n,t){if(n.length===0)return;let e=T(n.join(`
4
+ `));t.push(`<blockquote>${e}</blockquote>`),n.length=0}function T(n){if(!n)return"";let t=n.replace(/\r\n?/g,`
5
+ `).split(`
6
+ `),e=[],s=[],i=[],r=null,o=!1,h="",d=[],c=()=>{$(s,e),r=w(r,e),H(i,e)};for(let a of t){if(o){if(/^\s*```\s*$/.test(a)){let u=l(d.join(`
7
+ `)),b=h?` class="language-${l(h)}"`:"";e.push(`<pre><code${b}>${u}</code></pre>`),d=[],h="",o=!1}else d.push(a);continue}let g=a.match(/^\s*```\s*([\w+-]*)\s*$/);if(g){c(),o=!0,h=g[1]||"";continue}if(/^\s*$/.test(a)){c();continue}if(/^\s*(?:---|\*\*\*|___)\s*$/.test(a)&&s.length===0){c(),e.push("<hr>");continue}let f=a.match(/^(#{1,6})\s+(.*)$/);if(f){c();let u=f[1].length,b=L(l(f[2].trim()));e.push(`<h${u}>${b}</h${u}>`);continue}let v=a.match(/^\s*>\s?(.*)$/);if(v){$(s,e),r=w(r,e),i.push(v[1]);continue}i.length>0&&H(i,e);let y=a.match(/^\s*[-*+]\s+(.*)$/),E=a.match(/^\s*\d+\.\s+(.*)$/);if(y||E){$(s,e);let u=y?"ul":"ol",b=y?y[1]:E[1];(!r||r.type!==u)&&(r=w(r,e),r={type:u,items:[]}),r.items.push(b);continue}r&&(r=w(r,e)),s.push(a)}if(o){let a=l(d.join(`
8
+ `)),g=h?` class="language-${l(h)}"`:"";e.push(`<pre><code${g}>${a}</code></pre>`)}return c(),e.join("")}var m=class{constructor(t){this.messages=[];if(this.bot=new p({host:t.host,mode:t.mode,apiKey:t.apiKey,token:t.token}),typeof t.container=="string"){let e=document.querySelector(t.container);if(!e)throw new Error(`Container element not found: ${t.container}`);this.container=e}else this.container=t.container;this.placeholder=t.placeholder||"Type your message...",this.title=t.title||"Chat",this.subtitle=t.subtitle||"",this.messages=t.initialMessages||[],this.onClose=t.onClose,this.render(),this.attachEventListeners()}render(){this.container.innerHTML=`<div class="chatter-ui-chat"><div class="chatter-ui-chat-header"><button class="chatter-ui-chat-close" type="button" aria-label="Close chat">\xD7</button><div class="chatter-ui-chat-title">${this.title}</div>${this.subtitle?`<div class="chatter-ui-chat-subtitle">${this.subtitle}</div>`:""}</div><div class="chatter-ui-chat-messages"></div><div class="chatter-ui-chat-input-container"><textarea class="chatter-ui-chat-input" placeholder="${this.placeholder}" rows="1"></textarea><button class="chatter-ui-chat-send" type="button"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg></button></div></div>`;let t=this.container.querySelector(".chatter-ui-chat-messages"),e=this.container.querySelector(".chatter-ui-chat-input"),s=this.container.querySelector(".chatter-ui-chat-send");if(!t||!e||!s)throw new Error("Required chat elements not found in container");this.messagesContainer=t,this.inputElement=e,this.sendButton=s;for(let i of this.messages)this.addMessageToUI(i)}attachEventListeners(){let t=this.container.querySelector(".chatter-ui-chat-close");t&&this.onClose&&t.addEventListener("click",()=>{this.onClose?.()}),this.sendButton.addEventListener("click",()=>this.handleSend()),this.inputElement.addEventListener("keydown",e=>{e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),this.handleSend())}),this.inputElement.addEventListener("input",()=>{this.inputElement.style.height="auto",this.inputElement.style.height=`${Math.min(this.inputElement.scrollHeight,120)}px`}),this.isMobile()&&(this.inputElement.addEventListener("focus",()=>{setTimeout(()=>{this.inputElement.scrollIntoView({behavior:"smooth",block:"nearest"})},300)}),this.sendButton.addEventListener("touchend",e=>{e.preventDefault(),this.handleSend()},{passive:!1}))}async handleSend(){let t=this.inputElement.value.trim();if(!t)return;let e={role:"user",content:t};this.messages.push(e),this.addMessageToUI(e),this.inputElement.value="",this.inputElement.style.height="auto",this.setInputEnabled(!1);try{let s={role:"assistant",content:""};this.messages.push(s);let r=this.addMessageToUI(s).querySelector(".chatter-ui-message-content");if(!r)throw new Error("Message content element not found");await this.bot.streamConversation(this.messages,{onChunk:o=>{s.content+=o,this.renderMessageContent(r,s),this.scrollToBottom()},onEnd:()=>{this.renderMessageContent(r,s),this.setInputEnabled(!0),this.isMobile()||this.inputElement.focus()},onError:o=>{console.error("Stream error:",o),s.content="Sorry, an error occurred. Please try again.",r.textContent=s.content,r.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}})}catch(s){console.error("Send error:",s);let i={role:"assistant",content:"Sorry, an error occurred. Please try again."};this.messages.push(i),this.addMessageToUI(i).querySelector(".chatter-ui-message-content")?.classList.add("chatter-ui-message-error"),this.setInputEnabled(!0)}}addMessageToUI(t){let e=document.createElement("div");e.className=`chatter-ui-message chatter-ui-message-${t.role}`;let s=document.createElement("div");return s.className="chatter-ui-message-content",e.appendChild(s),this.renderMessageContent(s,t),this.messagesContainer.appendChild(e),this.scrollToBottom(),e}renderMessageContent(t,e){e.role==="assistant"?t.innerHTML=T(e.content):t.innerHTML=l(e.content).replace(/\n/g,"<br>")}setInputEnabled(t){this.inputElement.disabled=!t,this.sendButton.disabled=!t}scrollToBottom(){this.messagesContainer.scrollTop=this.messagesContainer.scrollHeight}clear(){this.messages=[],this.messagesContainer.innerHTML=""}getMessages(){return[...this.messages]}destroy(){this.container.innerHTML=""}isMobile(){return window.innerWidth<=768}};var C=class{constructor(t){this.chat=null;this.isOpen=!1;this.config={position:"bottom-right",label:"\u{1F4AC}",...t},this.render(),this.attachEventListeners()}render(){this.buttonElement=document.createElement("button"),this.buttonElement.className=`chatter-ui-chat-button chatter-ui-chat-button-${this.config.position}`,this.buttonElement.innerHTML=this.config.label||"\u{1F4AC}",this.buttonElement.setAttribute("aria-label","Open chat"),this.config.styles&&Object.assign(this.buttonElement.style,this.config.styles),this.chatContainer=document.createElement("div"),this.chatContainer.className=`chatter-ui-chat-popup chatter-ui-chat-popup-${this.config.position}`,this.chatContainer.style.display="none",document.body.appendChild(this.buttonElement),document.body.appendChild(this.chatContainer)}attachEventListeners(){this.buttonElement.addEventListener("click",()=>this.toggle()),document.addEventListener("keydown",t=>{t.key==="Escape"&&this.isOpen&&this.close()}),document.addEventListener("click",t=>{this.isOpen&&!this.chatContainer.contains(t.target)&&!this.buttonElement.contains(t.target)&&this.close()})}toggle(){this.isOpen?this.close():this.open()}open(){this.isOpen||(this.chat||(this.chat=new m({host:this.config.host,mode:this.config.mode,apiKey:this.config.apiKey,token:this.config.token,container:this.chatContainer,onClose:()=>this.close(),...this.config.chatConfig})),this.chatContainer.style.display="block",this.buttonElement.classList.add("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Close chat"),this.isOpen=!0,this.isMobile()&&(document.body.style.overflow="hidden",document.body.style.position="fixed",document.body.style.width="100%"),setTimeout(()=>{let t=this.chatContainer.querySelector(".chatter-ui-chat-input");t&&(t.focus(),this.isMobile()&&setTimeout(()=>{t.scrollIntoView({behavior:"smooth",block:"center"})},300))},this.isMobile()?300:100))}close(){this.isOpen&&(this.chatContainer.style.display="none",this.buttonElement.classList.remove("chatter-ui-chat-button-open"),this.buttonElement.setAttribute("aria-label","Open chat"),this.isOpen=!1,this.isMobile()&&(document.body.style.overflow="",document.body.style.position="",document.body.style.width=""))}isMobile(){return window.innerWidth<=768}destroy(){this.chat?.destroy(),this.buttonElement.remove(),this.chatContainer.remove()}isOpened(){return this.isOpen}};typeof window<"u"&&(window.Chatter={ChatBot:p,Chat:m,ChatButton:C});return P(U);})();
package/dist/types.d.ts CHANGED
@@ -63,7 +63,7 @@ export interface ChatterConfig {
63
63
  openai: {
64
64
  /** OpenAI API key */
65
65
  apiKey: string;
66
- /** Model to use. Default: gpt-4-turbo */
66
+ /** Model to use. Default: gpt-4o */
67
67
  model?: string;
68
68
  };
69
69
  database: {
@@ -109,6 +109,18 @@ export interface ChatterConfig {
109
109
  enablePrivateChat?: boolean;
110
110
  /** Enable demo routes (/demo/*). Default: false */
111
111
  enableDemoRoutes?: boolean;
112
+ /**
113
+ * Enable OpenAI-compatible endpoints (/v1/chat/completions and
114
+ * /api/private/v1/chat/completions) for third-party chat UIs and SDKs.
115
+ * Default: true
116
+ */
117
+ enableOpenAICompat?: boolean;
118
+ /**
119
+ * Run fully headless: skip serving the built-in widget assets
120
+ * (chatter.js/chatter.css) and all static/demo pages. API routes only.
121
+ * Default: false
122
+ */
123
+ headless?: boolean;
112
124
  };
113
125
  rateLimit?: {
114
126
  /** Requests per minute for public endpoint. Default: 60 */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diegoaltoworks/chatter",
3
- "version": "0.16.0",
3
+ "version": "0.19.0",
4
4
  "description": "Embeddable AI chatbot framework with RAG, authentication, and customizable widgets",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -88,27 +88,27 @@
88
88
  },
89
89
  "peerDependencies": {
90
90
  "@libsql/client": "^0.17.2",
91
- "@modelcontextprotocol/sdk": "^1.29.0",
91
+ "@modelcontextprotocol/sdk": "^1.30.0",
92
92
  "hono": "^4.12.14",
93
- "openai": "^6.34.0",
94
- "zod": "^3.25.76"
93
+ "openai": "^7.3.0",
94
+ "zod": "^3.25.76 || ^4.4.3"
95
95
  },
96
96
  "dependencies": {
97
- "jose": "6.2.2"
97
+ "jose": "6.2.3"
98
98
  },
99
99
  "devDependencies": {
100
- "@biomejs/biome": "2.4.12",
101
- "@libsql/client": "0.17.2",
102
- "@modelcontextprotocol/sdk": "1.29.0",
103
- "@types/bun": "1.3.12",
104
- "@types/node": "25.6.0",
105
- "esbuild": "0.28.0",
106
- "hono": "4.12.14",
100
+ "@biomejs/biome": "2.5.6",
101
+ "@libsql/client": "0.17.4",
102
+ "@modelcontextprotocol/sdk": "1.30.0",
103
+ "@types/bun": "1.3.14",
104
+ "@types/node": "26.1.2",
105
+ "esbuild": "0.28.1",
106
+ "hono": "4.12.34",
107
107
  "husky": "9.1.7",
108
- "lint-staged": "16.4.0",
109
- "openai": "6.34.0",
110
- "typescript": "6.0.3",
111
- "zod": "3.25.76"
108
+ "lint-staged": "17.3.0",
109
+ "openai": "7.3.0",
110
+ "typescript": "7.0.2",
111
+ "zod": "4.4.3"
112
112
  },
113
113
  "lint-staged": {
114
114
  "*.{ts,js,json,md}": [
@@ -117,5 +117,12 @@
117
117
  "*.ts": [
118
118
  "bash -c 'tsc --noEmit --skipLibCheck'"
119
119
  ]
120
+ },
121
+ "overrides": {
122
+ "qs": "^6.15.3",
123
+ "ws": "^8.21.1",
124
+ "@hono/node-server": "^2.0.5",
125
+ "fast-uri": "^3.1.3",
126
+ "ip-address": "^10.4.0"
120
127
  }
121
128
  }