@lssm/lib.support-bot 0.4.1 → 1.41.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,4 +43,4 @@ const outcome = await runner.run({
43
43
  });
44
44
  ```
45
45
 
46
- See `/packages/contractspec/examples/ai-support-bot` for an end-to-end integration with ticket ingestion, review queues, and analytics.
46
+ See `/packages/examples/ai-support-bot` for an end-to-end integration with ticket ingestion, review queues, and analytics.
package/dist/bot/tools.js CHANGED
@@ -1 +1 @@
1
- function e(e){return[{definition:{name:`support_classify_ticket`,description:`Classify a ticket for priority, sentiment, and category`,inputSchema:{type:`object`,required:[`ticket`],properties:{ticket:t}}},handler:async t=>{let r=n(t),i=await e.classifier.classify(r);return{content:JSON.stringify(i),metadata:{ticketId:r.id}}}},{definition:{name:`support_resolve_ticket`,description:`Generate a knowledge-grounded resolution for a ticket`,inputSchema:{type:`object`,required:[`ticket`],properties:{ticket:t}}},handler:async t=>{let r=n(t),i=await e.resolver.resolve(r);return{content:JSON.stringify(i),metadata:{ticketId:r.id}}}},{definition:{name:`support_draft_response`,description:`Draft a user-facing reply based on resolution + classification`,inputSchema:{type:`object`,required:[`ticket`,`resolution`,`classification`],properties:{ticket:t,resolution:{type:`object`},classification:{type:`object`}}}},handler:async t=>{let a=n(t),o=r(t),s=i(t);if(!o||!s)throw Error(`resolution and classification are required`);let c=await e.responder.draft(a,o,s);return{content:JSON.stringify(c),metadata:{ticketId:a.id}}}}]}const t={type:`object`,required:[`id`,`subject`,`body`,`channel`],properties:{id:{type:`string`},subject:{type:`string`},body:{type:`string`},channel:{type:`string`,enum:[`email`,`chat`,`phone`,`portal`]},customerName:{type:`string`},customerEmail:{type:`string`},metadata:{type:`object`}}};function n(e){if(!e||typeof e!=`object`||!(`ticket`in e))throw Error(`Input must include ticket`);let t=e.ticket;if(!t?.id)throw Error(`Ticket is missing id`);return t}function r(e){if(!(!e||typeof e!=`object`||!(`resolution`in e)))return e.resolution}function i(e){if(!(!e||typeof e!=`object`||!(`classification`in e)))return e.classification}export{e as createSupportTools};
1
+ import{_enum as e,array as t,boolean as n,number as r,object as i,record as a,string as o}from"../node_modules/zod/v4/classic/schemas.js";const s=i({id:o(),subject:o(),body:o(),channel:e([`email`,`chat`,`phone`,`portal`]),customerName:o().optional(),customerEmail:o().optional(),metadata:i().optional()}),c=i({label:o(),url:o().optional(),snippet:o().optional(),score:r().optional()}),l=i({type:e([`respond`,`escalate`,`refund`,`manual`]),label:o(),payload:a(o(),o())}),u=i({ticketId:o(),answer:o(),confidence:r(),citations:c.array(),actions:l.array(),escalationReason:o().optional(),knowledgeUpdates:t(o()).optional()}),d=i({ticketId:o(),category:e([`billing`,`technical`,`product`,`account`,`compliance`,`other`]),priority:e([`urgent`,`high`,`medium`,`low`]),sentiment:e([`positive`,`neutral`,`negative`,`frustrated`]),intents:t(o()),tags:t(o()),confidence:r(),escalationRequired:n().optional()});function f(e){if(!e||typeof e!=`object`||!(`ticket`in e))throw Error(`Input must include ticket`);let t=e.ticket;if(!t?.id)throw Error(`Ticket is missing id`);return t}function p(e){if(!(!e||typeof e!=`object`||!(`resolution`in e)))return e.resolution}function m(e){if(!(!e||typeof e!=`object`||!(`classification`in e)))return e.classification}function h(e){return[{title:`support_classify_ticket`,description:`Classify a ticket for priority, sentiment, and category`,inputSchema:i({ticket:s}),execute:async t=>{let n=f(t),r=await e.classifier.classify(n);return{content:JSON.stringify(r),metadata:{ticketId:n.id}}}},{title:`support_resolve_ticket`,description:`Generate a knowledge-grounded resolution for a ticket`,inputSchema:i({ticket:s}),execute:async t=>{let n=f(t),r=await e.resolver.resolve(n);return{content:JSON.stringify(r),metadata:{ticketId:n.id}}}},{title:`support_draft_response`,description:`Draft a user-facing reply based on resolution + classification`,inputSchema:i({ticket:s,resolution:u,classification:d}),execute:async t=>{let n=f(t),r=p(t),i=m(t);if(!r||!i)throw Error(`resolution and classification are required`);let a=await e.responder.draft(n,r,i);return{content:JSON.stringify(a),metadata:{ticketId:n.id}}}}]}export{h as createSupportTools};
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{defineSupportBot as e}from"./spec.js";import{TicketResolver as t}from"./rag/ticket-resolver.js";import{TicketClassifier as n}from"./tickets/classifier.js";import{AutoResponder as r}from"./bot/auto-responder.js";import{SupportFeedbackLoop as i}from"./bot/feedback-loop.js";import{createSupportTools as a}from"./bot/tools.js";export{r as AutoResponder,i as SupportFeedbackLoop,n as TicketClassifier,t as TicketResolver,a as createSupportTools,e as defineSupportBot};
1
+ import{defineSupportBot as e}from"./spec.js";import{TicketResolver as t}from"./rag/ticket-resolver.js";import{TicketClassifier as n}from"./tickets/classifier.js";import{AutoResponder as r}from"./bot/auto-responder.js";import{SupportFeedbackLoop as i}from"./bot/feedback-loop.js";import{createSupportTools as a}from"./bot/tools.js";import"./bot/index.js";export{r as AutoResponder,i as SupportFeedbackLoop,n as TicketClassifier,t as TicketResolver,a as createSupportTools,e as defineSupportBot};
package/dist/spec.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./ai-agent/dist/spec.js";import"./ai-agent/dist/index.js";function t(t){return{...e({...t.base,policy:{...t.base.policy,confidence:{min:t.base.policy?.confidence?.min??.7,default:t.base.policy?.confidence?.default??.6},escalation:{confidenceThreshold:t.autoEscalateThreshold??t.base.policy?.escalation?.confidenceThreshold??t.base.policy?.confidence?.min??.7,...t.base.policy?.escalation}},memory:t.base.memory??{maxEntries:120,ttlMinutes:120},tools:t.tools??t.base.tools,instructions:`${t.base.instructions}\n\nAlways cite support knowledge sources and flag compliance/billing issues for human review when unsure.`}),thresholds:{autoResolveMinConfidence:t.autoEscalateThreshold??.75,maxIterations:6}}}export{t as defineSupportBot};
1
+ import{defineAgent as e}from"@lssm/lib.ai-agent";function t(t){return{...e({...t.base,policy:{...t.base.policy,confidence:{min:t.base.policy?.confidence?.min??.7,default:t.base.policy?.confidence?.default??.6},escalation:{confidenceThreshold:t.autoEscalateThreshold??t.base.policy?.escalation?.confidenceThreshold??t.base.policy?.confidence?.min??.7,...t.base.policy?.escalation}},memory:t.base.memory??{maxEntries:120,ttlMinutes:120},tools:t.tools??t.base.tools,instructions:`${t.base.instructions}\n\nAlways cite support knowledge sources and flag compliance/billing issues for human review when unsure.`}),thresholds:{autoResolveMinConfidence:t.autoEscalateThreshold??.75,maxIterations:6}}}export{t as defineSupportBot};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lssm/lib.support-bot",
3
- "version": "0.4.1",
3
+ "version": "1.41.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -11,6 +11,7 @@
11
11
  ],
12
12
  "scripts": {
13
13
  "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
14
+ "publish:pkg:canary": "bun publish:pkg --tag canary",
14
15
  "build": "bun build:bundle && bun build:types",
15
16
  "build:bundle": "tsdown",
16
17
  "build:types": "tsc --noEmit",
@@ -22,30 +23,44 @@
22
23
  "test": "bun run"
23
24
  },
24
25
  "dependencies": {
25
- "@lssm/lib.ai-agent": "^0.4.1",
26
- "@lssm/lib.contracts": "^1.11.1"
26
+ "@lssm/lib.ai-agent": "1.41.1",
27
+ "@lssm/lib.contracts": "1.41.1"
27
28
  },
28
29
  "devDependencies": {
29
- "@lssm/tool.tsdown": "0.12.1",
30
- "@lssm/tool.typescript": "0.11.1",
31
- "tsdown": "^0.16.6",
30
+ "@lssm/tool.tsdown": "1.41.1",
31
+ "@lssm/tool.typescript": "1.41.1",
32
+ "tsdown": "^0.17.4",
32
33
  "typescript": "^5.9.3"
33
34
  },
34
35
  "exports": {
35
- ".": "./dist/index.js",
36
- "./bot": "./dist/bot/index.js",
37
- "./bot/auto-responder": "./dist/bot/auto-responder.js",
38
- "./bot/feedback-loop": "./dist/bot/feedback-loop.js",
39
- "./bot/tools": "./dist/bot/tools.js",
40
- "./rag": "./dist/rag/index.js",
41
- "./rag/ticket-resolver": "./dist/rag/ticket-resolver.js",
42
- "./spec": "./dist/spec.js",
43
- "./tickets": "./dist/tickets/index.js",
44
- "./tickets/classifier": "./dist/tickets/classifier.js",
45
- "./types": "./dist/types.js",
36
+ ".": "./src/index.ts",
37
+ "./bot": "./src/bot/index.ts",
38
+ "./bot/auto-responder": "./src/bot/auto-responder.ts",
39
+ "./bot/feedback-loop": "./src/bot/feedback-loop.ts",
40
+ "./bot/tools": "./src/bot/tools.ts",
41
+ "./rag": "./src/rag/index.ts",
42
+ "./rag/ticket-resolver": "./src/rag/ticket-resolver.ts",
43
+ "./spec": "./src/spec.ts",
44
+ "./tickets": "./src/tickets/index.ts",
45
+ "./tickets/classifier": "./src/tickets/classifier.ts",
46
+ "./types": "./src/types.ts",
46
47
  "./*": "./*"
47
48
  },
48
49
  "publishConfig": {
49
- "access": "public"
50
+ "access": "public",
51
+ "exports": {
52
+ ".": "./dist/index.js",
53
+ "./bot": "./dist/bot/index.js",
54
+ "./bot/auto-responder": "./dist/bot/auto-responder.js",
55
+ "./bot/feedback-loop": "./dist/bot/feedback-loop.js",
56
+ "./bot/tools": "./dist/bot/tools.js",
57
+ "./rag": "./dist/rag/index.js",
58
+ "./rag/ticket-resolver": "./dist/rag/ticket-resolver.js",
59
+ "./spec": "./dist/spec.js",
60
+ "./tickets": "./dist/tickets/index.js",
61
+ "./tickets/classifier": "./dist/tickets/classifier.js",
62
+ "./types": "./dist/types.js",
63
+ "./*": "./*"
64
+ }
50
65
  }
51
66
  }
@@ -1 +0,0 @@
1
- import"./workflow.js";
@@ -1 +0,0 @@
1
- import"node:crypto";
@@ -1 +0,0 @@
1
- import{t as e}from"./spec.js";import"./tools/executor.js";import"./memory/manager.js";import"./runner.js";import"./memory/in-memory.js";import"./memory/index.js";import"./tools/index.js";import"./approval/workflow.js";import"./approval/index.js";
@@ -1 +0,0 @@
1
- import"./manager.js";
@@ -1 +0,0 @@
1
- import"./manager.js";import"./in-memory.js";
@@ -1 +0,0 @@
1
- import"node:crypto";
@@ -1 +0,0 @@
1
- import"./tools/executor.js";import"./memory/manager.js";import"node:crypto";
@@ -1 +0,0 @@
1
- function e(e){if(!e.meta?.name)throw Error(`Agent name is required`);if(!Number.isFinite(e.meta.version))throw Error(`Agent ${e.meta.name} is missing a numeric version`);if(!e.instructions?.trim())throw Error(`Agent ${e.meta.name} requires instructions`);if(!e.tools?.length)throw Error(`Agent ${e.meta.name} must expose at least one tool`);return Object.freeze(e)}export{e as t};
@@ -1 +0,0 @@
1
- import"node:timers/promises";
@@ -1 +0,0 @@
1
- import"./executor.js";
@@ -1,25 +0,0 @@
1
- import { SupportResolution, SupportResponseDraft, SupportTicket, TicketClassification } from "../types.js";
2
- import { LLMProvider } from "@lssm/lib.contracts/integrations/providers/llm";
3
-
4
- //#region src/bot/auto-responder.d.ts
5
- interface AutoResponderOptions {
6
- llm?: LLMProvider;
7
- model?: string;
8
- tone?: 'friendly' | 'formal';
9
- closing?: string;
10
- }
11
- declare class AutoResponder {
12
- private readonly llm?;
13
- private readonly model?;
14
- private readonly tone;
15
- private readonly closing;
16
- constructor(options?: AutoResponderOptions);
17
- draft(ticket: SupportTicket, resolution: SupportResolution, classification: TicketClassification): Promise<SupportResponseDraft>;
18
- private generateWithLLM;
19
- private generateTemplate;
20
- private buildDraft;
21
- private renderCategoryIntro;
22
- private renderCitations;
23
- }
24
- //#endregion
25
- export { AutoResponder, AutoResponderOptions };
@@ -1,19 +0,0 @@
1
- import { ResolutionResultPayload } from "../types.js";
2
-
3
- //#region src/bot/feedback-loop.d.ts
4
- interface FeedbackMetrics {
5
- totalTickets: number;
6
- autoResolved: number;
7
- escalated: number;
8
- avgConfidence: number;
9
- avgResponseTimeMs: number;
10
- }
11
- declare class SupportFeedbackLoop {
12
- private readonly history;
13
- private readonly responseTimes;
14
- recordResolution(payload: ResolutionResultPayload, responseTimeMs?: number): void;
15
- metrics(): FeedbackMetrics;
16
- feedbackSummary(limit?: number): string;
17
- }
18
- //#endregion
19
- export { FeedbackMetrics, SupportFeedbackLoop };
@@ -1,4 +0,0 @@
1
- import { AutoResponder, AutoResponderOptions } from "./auto-responder.js";
2
- import { FeedbackMetrics, SupportFeedbackLoop } from "./feedback-loop.js";
3
- import { SupportToolsetOptions, createSupportTools } from "./tools.js";
4
- export { AutoResponder, AutoResponderOptions, FeedbackMetrics, SupportFeedbackLoop, SupportToolsetOptions, createSupportTools };
@@ -1,14 +0,0 @@
1
- import { AutoResponder } from "./auto-responder.js";
2
- import { TicketResolver } from "../rag/ticket-resolver.js";
3
- import { TicketClassifier } from "../tickets/classifier.js";
4
- import { AgentToolDefinitionWithHandler } from "@lssm/lib.ai-agent";
5
-
6
- //#region src/bot/tools.d.ts
7
- interface SupportToolsetOptions {
8
- resolver: TicketResolver;
9
- classifier: TicketClassifier;
10
- responder: AutoResponder;
11
- }
12
- declare function createSupportTools(options: SupportToolsetOptions): AgentToolDefinitionWithHandler[];
13
- //#endregion
14
- export { SupportToolsetOptions, createSupportTools };
package/dist/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import { ClassificationResultPayload, ResolutionResultPayload, SupportAction, SupportBotSpec, SupportCitation, SupportResolution, SupportResponseDraft, SupportTicket, TicketCategory, TicketChannel, TicketClassification, TicketPriority, TicketSentiment } from "./types.js";
2
- import { AutoResponder, AutoResponderOptions } from "./bot/auto-responder.js";
3
- import { FeedbackMetrics, SupportFeedbackLoop } from "./bot/feedback-loop.js";
4
- import { KnowledgeRetriever, TicketResolver, TicketResolverOptions } from "./rag/ticket-resolver.js";
5
- import { TicketClassifier, TicketClassifierOptions } from "./tickets/classifier.js";
6
- import { SupportToolsetOptions, createSupportTools } from "./bot/tools.js";
7
- import { SupportBotDefinition, defineSupportBot } from "./spec.js";
8
- export { AutoResponder, AutoResponderOptions, ClassificationResultPayload, FeedbackMetrics, KnowledgeRetriever, ResolutionResultPayload, SupportAction, SupportBotDefinition, SupportBotSpec, SupportCitation, SupportFeedbackLoop, SupportResolution, SupportResponseDraft, SupportTicket, SupportToolsetOptions, TicketCategory, TicketChannel, TicketClassification, TicketClassifier, TicketClassifierOptions, TicketPriority, TicketResolver, TicketResolverOptions, TicketSentiment, createSupportTools, defineSupportBot };
@@ -1,2 +0,0 @@
1
- import { KnowledgeRetriever, TicketResolver, TicketResolverOptions } from "./ticket-resolver.js";
2
- export { KnowledgeRetriever, TicketResolver, TicketResolverOptions };
@@ -1,24 +0,0 @@
1
- import { SupportResolution, SupportTicket } from "../types.js";
2
- import { KnowledgeAnswer } from "@lssm/lib.contracts/knowledge/query/service";
3
-
4
- //#region src/rag/ticket-resolver.d.ts
5
- interface KnowledgeRetriever {
6
- query(question: string): Promise<KnowledgeAnswer>;
7
- }
8
- interface TicketResolverOptions {
9
- knowledge: KnowledgeRetriever;
10
- minConfidence?: number;
11
- prependPrompt?: string;
12
- }
13
- declare class TicketResolver {
14
- private readonly knowledge;
15
- private readonly minConfidence;
16
- private readonly prependPrompt?;
17
- constructor(options: TicketResolverOptions);
18
- resolve(ticket: SupportTicket): Promise<SupportResolution>;
19
- private buildQuestion;
20
- private toResolution;
21
- private deriveConfidence;
22
- }
23
- //#endregion
24
- export { KnowledgeRetriever, TicketResolver, TicketResolverOptions };
package/dist/spec.d.ts DELETED
@@ -1,12 +0,0 @@
1
- import { SupportBotSpec } from "./types.js";
2
- import { AgentSpec, AgentToolConfig } from "@lssm/lib.ai-agent";
3
-
4
- //#region src/spec.d.ts
5
- interface SupportBotDefinition {
6
- base: AgentSpec;
7
- tools?: AgentToolConfig[];
8
- autoEscalateThreshold?: number;
9
- }
10
- declare function defineSupportBot(definition: SupportBotDefinition): SupportBotSpec;
11
- //#endregion
12
- export { SupportBotDefinition, defineSupportBot };
@@ -1,24 +0,0 @@
1
- import { SupportTicket, TicketCategory, TicketClassification } from "../types.js";
2
- import { LLMProvider } from "@lssm/lib.contracts/integrations/providers/llm";
3
-
4
- //#region src/tickets/classifier.d.ts
5
- interface TicketClassifierOptions {
6
- keywords?: Partial<Record<TicketCategory, string[]>>;
7
- llm?: LLMProvider;
8
- llmModel?: string;
9
- }
10
- declare class TicketClassifier {
11
- private readonly keywords;
12
- private readonly llm?;
13
- private readonly llmModel?;
14
- constructor(options?: TicketClassifierOptions);
15
- classify(ticket: SupportTicket): Promise<TicketClassification>;
16
- private heuristicClassification;
17
- private detectCategory;
18
- private detectPriority;
19
- private detectSentiment;
20
- private extractIntents;
21
- private estimateConfidence;
22
- }
23
- //#endregion
24
- export { TicketClassifier, TicketClassifierOptions };
@@ -1,2 +0,0 @@
1
- import { TicketClassifier, TicketClassifierOptions } from "./classifier.js";
2
- export { TicketClassifier, TicketClassifierOptions };
package/dist/types.d.ts DELETED
@@ -1,75 +0,0 @@
1
- import { AgentSpec } from "@lssm/lib.ai-agent";
2
-
3
- //#region src/types.d.ts
4
- type TicketPriority = 'low' | 'medium' | 'high' | 'urgent';
5
- type TicketCategory = 'billing' | 'technical' | 'product' | 'account' | 'compliance' | 'other';
6
- type TicketChannel = 'email' | 'chat' | 'phone' | 'portal';
7
- type TicketSentiment = 'positive' | 'neutral' | 'negative' | 'frustrated';
8
- interface SupportTicket {
9
- id: string;
10
- subject: string;
11
- body: string;
12
- channel: TicketChannel;
13
- locale?: string;
14
- customerEmail?: string;
15
- customerName?: string;
16
- metadata?: Record<string, string>;
17
- }
18
- interface TicketClassification {
19
- ticketId: string;
20
- category: TicketCategory;
21
- priority: TicketPriority;
22
- sentiment: TicketSentiment;
23
- intents: string[];
24
- tags: string[];
25
- confidence: number;
26
- escalationRequired?: boolean;
27
- }
28
- interface SupportCitation {
29
- label: string;
30
- url?: string;
31
- snippet?: string;
32
- score?: number;
33
- }
34
- interface SupportAction {
35
- type: 'respond' | 'escalate' | 'refund' | 'manual';
36
- label: string;
37
- payload?: Record<string, string>;
38
- }
39
- interface SupportResolution {
40
- ticketId: string;
41
- answer: string;
42
- confidence: number;
43
- citations: SupportCitation[];
44
- actions: SupportAction[];
45
- escalationReason?: string;
46
- knowledgeUpdates?: string[];
47
- }
48
- interface SupportResponseDraft {
49
- ticketId: string;
50
- subject: string;
51
- body: string;
52
- confidence: number;
53
- requiresEscalation: boolean;
54
- citations: SupportCitation[];
55
- }
56
- interface SupportBotSpec extends AgentSpec {
57
- thresholds?: {
58
- autoResolveMinConfidence?: number;
59
- maxIterations?: number;
60
- };
61
- review?: {
62
- queueName?: string;
63
- approvalWorkflow?: string;
64
- };
65
- }
66
- interface ClassificationResultPayload {
67
- ticket: SupportTicket;
68
- classification: TicketClassification;
69
- }
70
- interface ResolutionResultPayload extends ClassificationResultPayload {
71
- resolution: SupportResolution;
72
- draft: SupportResponseDraft;
73
- }
74
- //#endregion
75
- export { ClassificationResultPayload, ResolutionResultPayload, SupportAction, SupportBotSpec, SupportCitation, SupportResolution, SupportResponseDraft, SupportTicket, TicketCategory, TicketChannel, TicketClassification, TicketPriority, TicketSentiment };