@contractspec/lib.support-bot 1.56.1 → 1.58.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 (216) hide show
  1. package/dist/bot/auto-responder.d.ts +19 -23
  2. package/dist/bot/auto-responder.d.ts.map +1 -1
  3. package/dist/bot/auto-responder.js +86 -68
  4. package/dist/bot/feedback-loop.d.ts +13 -17
  5. package/dist/bot/feedback-loop.d.ts.map +1 -1
  6. package/dist/bot/feedback-loop.js +38 -34
  7. package/dist/bot/index.d.ts +4 -4
  8. package/dist/bot/index.d.ts.map +1 -0
  9. package/dist/bot/index.js +268 -4
  10. package/dist/bot/tools.d.ts +9 -13
  11. package/dist/bot/tools.d.ts.map +1 -1
  12. package/dist/bot/tools.js +118 -123
  13. package/dist/browser/bot/auto-responder.js +101 -0
  14. package/dist/browser/bot/feedback-loop.js +38 -0
  15. package/dist/browser/bot/index.js +268 -0
  16. package/dist/browser/bot/tools.js +131 -0
  17. package/dist/browser/index.js +517 -0
  18. package/dist/browser/rag/index.js +65 -0
  19. package/dist/browser/rag/ticket-resolver.js +65 -0
  20. package/dist/browser/spec.js +33 -0
  21. package/dist/browser/tickets/classifier.js +156 -0
  22. package/dist/browser/tickets/index.js +156 -0
  23. package/dist/browser/types.js +0 -0
  24. package/dist/index.d.ts +6 -11
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +518 -9
  27. package/dist/node/bot/auto-responder.js +101 -0
  28. package/dist/node/bot/feedback-loop.js +38 -0
  29. package/dist/node/bot/index.js +268 -0
  30. package/dist/node/bot/tools.js +131 -0
  31. package/dist/node/index.js +517 -0
  32. package/dist/node/rag/index.js +65 -0
  33. package/dist/node/rag/ticket-resolver.js +65 -0
  34. package/dist/node/spec.js +33 -0
  35. package/dist/node/tickets/classifier.js +156 -0
  36. package/dist/node/tickets/index.js +156 -0
  37. package/dist/node/types.js +0 -0
  38. package/dist/rag/index.d.ts +2 -2
  39. package/dist/rag/index.d.ts.map +1 -0
  40. package/dist/rag/index.js +66 -3
  41. package/dist/rag/ticket-resolver.d.ts +17 -21
  42. package/dist/rag/ticket-resolver.d.ts.map +1 -1
  43. package/dist/rag/ticket-resolver.js +65 -63
  44. package/dist/spec.d.ts +7 -12
  45. package/dist/spec.d.ts.map +1 -1
  46. package/dist/spec.js +31 -32
  47. package/dist/tickets/classifier.d.ts +18 -22
  48. package/dist/tickets/classifier.d.ts.map +1 -1
  49. package/dist/tickets/classifier.js +153 -195
  50. package/dist/tickets/index.d.ts +2 -2
  51. package/dist/tickets/index.d.ts.map +1 -0
  52. package/dist/tickets/index.js +156 -2
  53. package/dist/types.d.ts +62 -67
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/types.js +1 -0
  56. package/package.json +127 -38
  57. package/dist/ai-agent/src/agent/contract-spec-agent.d.ts +0 -5
  58. package/dist/ai-agent/src/agent/index.d.ts +0 -2
  59. package/dist/ai-agent/src/agent/unified-agent.d.ts +0 -3
  60. package/dist/ai-agent/src/approval/index.d.ts +0 -1
  61. package/dist/ai-agent/src/approval/workflow.d.ts +0 -1
  62. package/dist/ai-agent/src/exporters/claude-agent-exporter.d.ts +0 -2
  63. package/dist/ai-agent/src/exporters/index.d.ts +0 -3
  64. package/dist/ai-agent/src/exporters/opencode-exporter.d.ts +0 -2
  65. package/dist/ai-agent/src/exporters/types.d.ts +0 -2
  66. package/dist/ai-agent/src/index.d.ts +0 -14
  67. package/dist/ai-agent/src/interop/index.d.ts +0 -3
  68. package/dist/ai-agent/src/interop/spec-consumer.d.ts +0 -2
  69. package/dist/ai-agent/src/interop/tool-consumer.d.ts +0 -3
  70. package/dist/ai-agent/src/interop/types.d.ts +0 -2
  71. package/dist/ai-agent/src/knowledge/index.d.ts +0 -1
  72. package/dist/ai-agent/src/knowledge/injector.d.ts +0 -1
  73. package/dist/ai-agent/src/providers/claude-agent-sdk/adapter.d.ts +0 -2
  74. package/dist/ai-agent/src/providers/claude-agent-sdk/index.d.ts +0 -3
  75. package/dist/ai-agent/src/providers/claude-agent-sdk/session-bridge.d.ts +0 -1
  76. package/dist/ai-agent/src/providers/claude-agent-sdk/tool-bridge.d.ts +0 -3
  77. package/dist/ai-agent/src/providers/index.d.ts +0 -4
  78. package/dist/ai-agent/src/providers/opencode-sdk/adapter.d.ts +0 -2
  79. package/dist/ai-agent/src/providers/opencode-sdk/agent-bridge.d.ts +0 -3
  80. package/dist/ai-agent/src/providers/opencode-sdk/index.d.ts +0 -3
  81. package/dist/ai-agent/src/providers/opencode-sdk/tool-bridge.d.ts +0 -3
  82. package/dist/ai-agent/src/providers/registry.d.ts +0 -1
  83. package/dist/ai-agent/src/providers/types.d.ts +0 -3
  84. package/dist/ai-agent/src/schema/index.d.ts +0 -2
  85. package/dist/ai-agent/src/schema/json-schema-to-zod.d.ts +0 -1
  86. package/dist/ai-agent/src/schema/schema-output.d.ts +0 -2
  87. package/dist/ai-agent/src/session/index.d.ts +0 -1
  88. package/dist/ai-agent/src/session/store.d.ts +0 -2
  89. package/dist/ai-agent/src/spec/index.d.ts +0 -2
  90. package/dist/ai-agent/src/spec/registry.d.ts +0 -2
  91. package/dist/ai-agent/src/spec/spec.d.ts +0 -115
  92. package/dist/ai-agent/src/spec/spec.d.ts.map +0 -1
  93. package/dist/ai-agent/src/telemetry/adapter.d.ts +0 -1
  94. package/dist/ai-agent/src/telemetry/index.d.ts +0 -1
  95. package/dist/ai-agent/src/tools/index.d.ts +0 -4
  96. package/dist/ai-agent/src/tools/knowledge-tool.d.ts +0 -2
  97. package/dist/ai-agent/src/tools/mcp-client.d.ts +0 -1
  98. package/dist/ai-agent/src/tools/mcp-server.d.ts +0 -3
  99. package/dist/ai-agent/src/tools/tool-adapter.d.ts +0 -3
  100. package/dist/ai-agent/src/types.d.ts +0 -1
  101. package/dist/bot/auto-responder.js.map +0 -1
  102. package/dist/bot/feedback-loop.js.map +0 -1
  103. package/dist/bot/tools.js.map +0 -1
  104. package/dist/contracts/src/app-config/lifecycle.d.ts +0 -1
  105. package/dist/contracts/src/app-config/runtime.d.ts +0 -13
  106. package/dist/contracts/src/app-config/spec.d.ts +0 -9
  107. package/dist/contracts/src/capabilities/capabilities.d.ts +0 -1
  108. package/dist/contracts/src/capabilities/context.d.ts +0 -1
  109. package/dist/contracts/src/capabilities/guards.d.ts +0 -4
  110. package/dist/contracts/src/capabilities/index.d.ts +0 -5
  111. package/dist/contracts/src/capabilities/openbanking.d.ts +0 -1
  112. package/dist/contracts/src/capabilities/validation.d.ts +0 -4
  113. package/dist/contracts/src/data-views/index.d.ts +0 -3
  114. package/dist/contracts/src/data-views/registry.d.ts +0 -2
  115. package/dist/contracts/src/data-views/report/contractVerificationTable.d.ts +0 -1
  116. package/dist/contracts/src/data-views/spec.d.ts +0 -3
  117. package/dist/contracts/src/data-views/types.d.ts +0 -2
  118. package/dist/contracts/src/docs/accessibility_wcag_compliance_specs.docblock.d.ts +0 -1
  119. package/dist/contracts/src/docs/commands/docsGenerate.command.d.ts +0 -1
  120. package/dist/contracts/src/docs/commands/docsPublish.command.d.ts +0 -1
  121. package/dist/contracts/src/docs/commands/index.d.ts +0 -2
  122. package/dist/contracts/src/docs/contracts.d.ts +0 -6
  123. package/dist/contracts/src/docs/events/docsGenerated.event.d.ts +0 -1
  124. package/dist/contracts/src/docs/events/docsPublished.event.d.ts +0 -1
  125. package/dist/contracts/src/docs/events/index.d.ts +0 -2
  126. package/dist/contracts/src/docs/forms/docsSearch.form.d.ts +0 -1
  127. package/dist/contracts/src/docs/forms/index.d.ts +0 -1
  128. package/dist/contracts/src/docs/index.d.ts +0 -30
  129. package/dist/contracts/src/docs/presentations.d.ts +0 -2
  130. package/dist/contracts/src/docs/queries/contractReference.query.d.ts +0 -1
  131. package/dist/contracts/src/docs/queries/docsIndex.query.d.ts +0 -1
  132. package/dist/contracts/src/docs/queries/index.d.ts +0 -2
  133. package/dist/contracts/src/docs/registry.d.ts +0 -10
  134. package/dist/contracts/src/docs/registry.d.ts.map +0 -1
  135. package/dist/contracts/src/docs/tech/auth/better-auth-nextjs.docblock.d.ts +0 -1
  136. package/dist/contracts/src/docs/tech/contracts/README.docblock.d.ts +0 -1
  137. package/dist/contracts/src/docs/tech/contracts/openapi-export.docblock.d.ts +0 -1
  138. package/dist/contracts/src/docs/tech/contracts/openapi-import.docblock.d.ts +0 -1
  139. package/dist/contracts/src/docs/tech/lifecycle-stage-system.docblock.d.ts +0 -1
  140. package/dist/contracts/src/docs/tech/llm/llm-integration.docblock.d.ts +0 -1
  141. package/dist/contracts/src/docs/tech/mcp-endpoints.docblock.d.ts +0 -1
  142. package/dist/contracts/src/docs/tech/presentation-runtime.docblock.d.ts +0 -1
  143. package/dist/contracts/src/docs/tech/schema/README.docblock.d.ts +0 -1
  144. package/dist/contracts/src/docs/tech/studio/learning-events.docblock.d.ts +0 -1
  145. package/dist/contracts/src/docs/tech/studio/learning-journeys.docblock.d.ts +0 -1
  146. package/dist/contracts/src/docs/tech/studio/platform-admin-panel.docblock.d.ts +0 -1
  147. package/dist/contracts/src/docs/tech/studio/project-access-teams.docblock.d.ts +0 -1
  148. package/dist/contracts/src/docs/tech/studio/project-routing.docblock.d.ts +0 -1
  149. package/dist/contracts/src/docs/tech/studio/sandbox-unlogged.docblock.d.ts +0 -1
  150. package/dist/contracts/src/docs/tech/studio/team-invitations.docblock.d.ts +0 -1
  151. package/dist/contracts/src/docs/tech/studio/workspace-ops.docblock.d.ts +0 -1
  152. package/dist/contracts/src/docs/tech/studio/workspaces.docblock.d.ts +0 -1
  153. package/dist/contracts/src/docs/tech/telemetry-ingest.docblock.d.ts +0 -1
  154. package/dist/contracts/src/docs/tech/vscode-extension.docblock.d.ts +0 -1
  155. package/dist/contracts/src/events.d.ts +0 -5
  156. package/dist/contracts/src/experiments/spec-resolver.d.ts +0 -4
  157. package/dist/contracts/src/experiments/spec.d.ts +0 -4
  158. package/dist/contracts/src/features/index.d.ts +0 -4
  159. package/dist/contracts/src/features/install.d.ts +0 -6
  160. package/dist/contracts/src/features/registry.d.ts +0 -2
  161. package/dist/contracts/src/features/types.d.ts +0 -5
  162. package/dist/contracts/src/features/validation.d.ts +0 -2
  163. package/dist/contracts/src/forms/forms.d.ts +0 -3
  164. package/dist/contracts/src/forms/index.d.ts +0 -1
  165. package/dist/contracts/src/install.d.ts +0 -7
  166. package/dist/contracts/src/integrations/connection.d.ts +0 -1
  167. package/dist/contracts/src/integrations/providers/llm.d.ts +0 -83
  168. package/dist/contracts/src/integrations/providers/llm.d.ts.map +0 -1
  169. package/dist/contracts/src/integrations/spec.d.ts +0 -3
  170. package/dist/contracts/src/knowledge/spec.d.ts +0 -9
  171. package/dist/contracts/src/knowledge/spec.d.ts.map +0 -1
  172. package/dist/contracts/src/operations/index.d.ts +0 -3
  173. package/dist/contracts/src/operations/operation.d.ts +0 -7
  174. package/dist/contracts/src/operations/registry.d.ts +0 -6
  175. package/dist/contracts/src/operations/report/getContractVerificationStatus.d.ts +0 -3
  176. package/dist/contracts/src/operations/report/index.d.ts +0 -4
  177. package/dist/contracts/src/ownership.d.ts +0 -164
  178. package/dist/contracts/src/ownership.d.ts.map +0 -1
  179. package/dist/contracts/src/policy/registry.d.ts +0 -2
  180. package/dist/contracts/src/policy/spec.d.ts +0 -13
  181. package/dist/contracts/src/policy/spec.d.ts.map +0 -1
  182. package/dist/contracts/src/presentations/index.d.ts +0 -3
  183. package/dist/contracts/src/presentations/presentations.d.ts +0 -3
  184. package/dist/contracts/src/presentations/registry.d.ts +0 -2
  185. package/dist/contracts/src/presentations/transform-engine.d.ts +0 -2
  186. package/dist/contracts/src/registry-utils.d.ts +0 -1
  187. package/dist/contracts/src/registry.d.ts +0 -3
  188. package/dist/contracts/src/resources.d.ts +0 -2
  189. package/dist/contracts/src/telemetry/anomaly.d.ts +0 -2
  190. package/dist/contracts/src/telemetry/index.d.ts +0 -3
  191. package/dist/contracts/src/telemetry/spec.d.ts +0 -2
  192. package/dist/contracts/src/telemetry/tracker.d.ts +0 -3
  193. package/dist/contracts/src/tests/spec.d.ts +0 -1
  194. package/dist/contracts/src/themes.d.ts +0 -2
  195. package/dist/contracts/src/types.d.ts +0 -5
  196. package/dist/contracts/src/versioning/refs.d.ts +0 -28
  197. package/dist/contracts/src/versioning/refs.d.ts.map +0 -1
  198. package/dist/contracts/src/workflow/overview.docblock.d.ts +0 -1
  199. package/dist/contracts/src/workflow/spec.d.ts +0 -5
  200. package/dist/contracts/src/workspace-config/workspace-config.docblock.d.ts +0 -1
  201. package/dist/rag/ticket-resolver.js.map +0 -1
  202. package/dist/schema/src/EnumType.d.ts +0 -2
  203. package/dist/schema/src/FieldType.d.ts +0 -2
  204. package/dist/schema/src/GraphQLSchemaType.d.ts +0 -2
  205. package/dist/schema/src/JsonSchemaType.d.ts +0 -2
  206. package/dist/schema/src/ScalarTypeEnum.d.ts +0 -1
  207. package/dist/schema/src/SchemaModel.d.ts +0 -4
  208. package/dist/schema/src/SchemaModelType.d.ts +0 -1
  209. package/dist/schema/src/ZodSchemaType.d.ts +0 -2
  210. package/dist/schema/src/entity/defineEntity.d.ts +0 -1
  211. package/dist/schema/src/entity/generator.d.ts +0 -1
  212. package/dist/schema/src/entity/index.d.ts +0 -3
  213. package/dist/schema/src/entity/types.d.ts +0 -1
  214. package/dist/schema/src/index.d.ts +0 -9
  215. package/dist/spec.js.map +0 -1
  216. package/dist/tickets/classifier.js.map +0 -1
@@ -1,25 +1,21 @@
1
- import { LLMProvider } from "../contracts/src/integrations/providers/llm.js";
2
- import { SupportTicket, TicketCategory, TicketClassification } from "../types.js";
3
-
4
- //#region src/tickets/classifier.d.ts
5
- interface TicketClassifierOptions {
6
- keywords?: Partial<Record<TicketCategory, string[]>>;
7
- llm?: LLMProvider;
8
- llmModel?: string;
1
+ import type { LLMProvider } from '@contractspec/lib.contracts/integrations/providers/llm';
2
+ import type { SupportTicket, TicketCategory, TicketClassification } from '../types';
3
+ export interface TicketClassifierOptions {
4
+ keywords?: Partial<Record<TicketCategory, string[]>>;
5
+ llm?: LLMProvider;
6
+ llmModel?: string;
9
7
  }
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;
8
+ export declare class TicketClassifier {
9
+ private readonly keywords;
10
+ private readonly llm?;
11
+ private readonly llmModel?;
12
+ constructor(options?: TicketClassifierOptions);
13
+ classify(ticket: SupportTicket): Promise<TicketClassification>;
14
+ private heuristicClassification;
15
+ private detectCategory;
16
+ private detectPriority;
17
+ private detectSentiment;
18
+ private extractIntents;
19
+ private estimateConfidence;
22
20
  }
23
- //#endregion
24
- export { TicketClassifier, TicketClassifierOptions };
25
21
  //# sourceMappingURL=classifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"classifier.d.ts","names":[],"sources":["../../src/tickets/classifier.ts"],"sourcesContent":[],"mappings":";;;;UAgCiB,uBAAA;aACJ,QAAQ,OAAO;EADX,GAAA,CAAA,EAET,WAFS;EACW,QAAA,CAAA,EAAA,MAAA;;AAAf,cAKA,gBAAA,CALA;EACL,iBAAA,QAAA;EAAW,iBAAA,GAAA;EAIN,iBAAA,QAAgB;EAKL,WAAA,CAAA,OAAA,CAAA,EAAA,uBAAA;EASC,QAAA,CAAA,MAAA,EAAA,aAAA,CAAA,EAAgB,OAAhB,CAAwB,oBAAxB,CAAA;EAAwB,QAAA,uBAAA;EAAR,QAAA,cAAA;EAAO,QAAA,cAAA"}
1
+ {"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../src/tickets/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wDAAwD,CAAC;AAC1F,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAGd,oBAAoB,EACrB,MAAM,UAAU,CAAC;AAyBlB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;gBAEvB,OAAO,CAAC,EAAE,uBAAuB;IASvC,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiDpE,OAAO,CAAC,uBAAuB;IAqB/B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,kBAAkB;CAW3B"}
@@ -1,199 +1,157 @@
1
- //#region src/tickets/classifier.ts
2
- const CATEGORY_KEYWORDS = {
3
- billing: [
4
- "invoice",
5
- "payout",
6
- "refund",
7
- "charge",
8
- "billing",
9
- "payment"
10
- ],
11
- technical: [
12
- "bug",
13
- "error",
14
- "crash",
15
- "issue",
16
- "failed",
17
- "timeout"
18
- ],
19
- product: [
20
- "feature",
21
- "roadmap",
22
- "idea",
23
- "request",
24
- "feedback"
25
- ],
26
- account: [
27
- "login",
28
- "password",
29
- "2fa",
30
- "account",
31
- "profile",
32
- "email change"
33
- ],
34
- compliance: [
35
- "kyc",
36
- "aml",
37
- "compliance",
38
- "regulation",
39
- "gdpr"
40
- ],
41
- other: []
1
+ // @bun
2
+ // src/tickets/classifier.ts
3
+ var CATEGORY_KEYWORDS = {
4
+ billing: ["invoice", "payout", "refund", "charge", "billing", "payment"],
5
+ technical: ["bug", "error", "crash", "issue", "failed", "timeout"],
6
+ product: ["feature", "roadmap", "idea", "request", "feedback"],
7
+ account: ["login", "password", "2fa", "account", "profile", "email change"],
8
+ compliance: ["kyc", "aml", "compliance", "regulation", "gdpr"],
9
+ other: []
42
10
  };
43
- const PRIORITY_HINTS = {
44
- urgent: [
45
- "urgent",
46
- "asap",
47
- "immediately",
48
- "today",
49
- "right away"
50
- ],
51
- high: [
52
- "high priority",
53
- "blocking",
54
- "major",
55
- "critical"
56
- ],
57
- medium: ["soon", "next few days"],
58
- low: [
59
- "nice to have",
60
- "when possible",
61
- "later"
62
- ]
11
+ var PRIORITY_HINTS = {
12
+ urgent: ["urgent", "asap", "immediately", "today", "right away"],
13
+ high: ["high priority", "blocking", "major", "critical"],
14
+ medium: ["soon", "next few days"],
15
+ low: ["nice to have", "when possible", "later"]
63
16
  };
64
- const SENTIMENT_HINTS = {
65
- positive: [
66
- "love",
67
- "great",
68
- "awesome",
69
- "thank you"
70
- ],
71
- neutral: [
72
- "question",
73
- "wonder",
74
- "curious"
75
- ],
76
- negative: [
77
- "unhappy",
78
- "bad",
79
- "terrible",
80
- "awful",
81
- "angry"
82
- ],
83
- frustrated: [
84
- "furious",
85
- "frustrated",
86
- "fed up",
87
- "ridiculous"
88
- ]
89
- };
90
- var TicketClassifier = class {
91
- keywords;
92
- llm;
93
- llmModel;
94
- constructor(options) {
95
- this.keywords = {
96
- ...CATEGORY_KEYWORDS,
97
- ...options?.keywords ?? {}
98
- };
99
- this.llm = options?.llm;
100
- this.llmModel = options?.llmModel;
101
- }
102
- async classify(ticket) {
103
- const heuristics = this.heuristicClassification(ticket);
104
- if (!this.llm) return heuristics;
105
- try {
106
- const content = (await this.llm.chat([{
107
- role: "system",
108
- content: [{
109
- type: "text",
110
- text: "Classify the support ticket."
111
- }]
112
- }, {
113
- role: "user",
114
- content: [{
115
- type: "text",
116
- text: JSON.stringify({
117
- subject: ticket.subject,
118
- body: ticket.body,
119
- channel: ticket.channel
120
- })
121
- }]
122
- }], {
123
- responseFormat: "json",
124
- model: this.llmModel
125
- })).message.content.find((part) => "text" in part);
126
- if (content && "text" in content) {
127
- const parsed = JSON.parse(content.text);
128
- return {
129
- ...heuristics,
130
- ...parsed,
131
- intents: parsed.intents ?? heuristics.intents,
132
- tags: parsed.tags ?? heuristics.tags
133
- };
134
- }
135
- } catch {}
136
- return heuristics;
137
- }
138
- heuristicClassification(ticket) {
139
- const text = `${ticket.subject}\n${ticket.body}`.toLowerCase();
140
- const category = this.detectCategory(text);
141
- const priority = this.detectPriority(text);
142
- const sentiment = this.detectSentiment(text);
143
- const intents = this.extractIntents(text);
144
- const tags = intents.slice(0, 3);
145
- const confidence = this.estimateConfidence(category, priority, sentiment);
146
- return {
147
- ticketId: ticket.id,
148
- category,
149
- priority,
150
- sentiment,
151
- intents,
152
- tags,
153
- confidence,
154
- escalationRequired: priority === "urgent" || category === "compliance"
155
- };
156
- }
157
- detectCategory(text) {
158
- for (const [category, keywords] of Object.entries(this.keywords)) if (keywords.some((keyword) => text.includes(keyword))) return category;
159
- return "other";
160
- }
161
- detectPriority(text) {
162
- for (const priority of [
163
- "urgent",
164
- "high",
165
- "medium",
166
- "low"
167
- ]) if (PRIORITY_HINTS[priority].some((word) => text.includes(word))) return priority;
168
- return "medium";
169
- }
170
- detectSentiment(text) {
171
- for (const sentiment of [
172
- "frustrated",
173
- "negative",
174
- "neutral",
175
- "positive"
176
- ]) if (SENTIMENT_HINTS[sentiment].some((word) => text.includes(word))) return sentiment;
177
- return "neutral";
178
- }
179
- extractIntents(text) {
180
- const intents = [];
181
- if (text.includes("refund") || text.includes("chargeback")) intents.push("refund");
182
- if (text.includes("payout")) intents.push("payout");
183
- if (text.includes("login")) intents.push("login-help");
184
- if (text.includes("feature")) intents.push("feature-request");
185
- if (text.includes("bug") || text.includes("error")) intents.push("bug-report");
186
- return intents.length ? intents : ["general"];
187
- }
188
- estimateConfidence(category, priority, sentiment) {
189
- let base = .6;
190
- if (category !== "other") base += .1;
191
- if (priority === "urgent" || priority === "low") base += .05;
192
- if (sentiment === "frustrated") base -= .05;
193
- return Math.min(.95, Math.max(.4, Number(base.toFixed(2))));
194
- }
17
+ var SENTIMENT_HINTS = {
18
+ positive: ["love", "great", "awesome", "thank you"],
19
+ neutral: ["question", "wonder", "curious"],
20
+ negative: ["unhappy", "bad", "terrible", "awful", "angry"],
21
+ frustrated: ["furious", "frustrated", "fed up", "ridiculous"]
195
22
  };
196
23
 
197
- //#endregion
198
- export { TicketClassifier };
199
- //# sourceMappingURL=classifier.js.map
24
+ class TicketClassifier {
25
+ keywords;
26
+ llm;
27
+ llmModel;
28
+ constructor(options) {
29
+ this.keywords = {
30
+ ...CATEGORY_KEYWORDS,
31
+ ...options?.keywords ?? {}
32
+ };
33
+ this.llm = options?.llm;
34
+ this.llmModel = options?.llmModel;
35
+ }
36
+ async classify(ticket) {
37
+ const heuristics = this.heuristicClassification(ticket);
38
+ if (!this.llm)
39
+ return heuristics;
40
+ try {
41
+ const llmResult = await this.llm.chat([
42
+ {
43
+ role: "system",
44
+ content: [{ type: "text", text: "Classify the support ticket." }]
45
+ },
46
+ {
47
+ role: "user",
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: JSON.stringify({
52
+ subject: ticket.subject,
53
+ body: ticket.body,
54
+ channel: ticket.channel
55
+ })
56
+ }
57
+ ]
58
+ }
59
+ ], {
60
+ responseFormat: "json",
61
+ model: this.llmModel
62
+ });
63
+ const content = llmResult.message.content.find((part) => ("text" in part));
64
+ if (content && "text" in content) {
65
+ const parsed = JSON.parse(content.text);
66
+ return {
67
+ ...heuristics,
68
+ ...parsed,
69
+ intents: parsed.intents ?? heuristics.intents,
70
+ tags: parsed.tags ?? heuristics.tags
71
+ };
72
+ }
73
+ } catch {}
74
+ return heuristics;
75
+ }
76
+ heuristicClassification(ticket) {
77
+ const text = `${ticket.subject}
78
+ ${ticket.body}`.toLowerCase();
79
+ const category = this.detectCategory(text);
80
+ const priority = this.detectPriority(text);
81
+ const sentiment = this.detectSentiment(text);
82
+ const intents = this.extractIntents(text);
83
+ const tags = intents.slice(0, 3);
84
+ const confidence = this.estimateConfidence(category, priority, sentiment);
85
+ return {
86
+ ticketId: ticket.id,
87
+ category,
88
+ priority,
89
+ sentiment,
90
+ intents,
91
+ tags,
92
+ confidence,
93
+ escalationRequired: priority === "urgent" || category === "compliance"
94
+ };
95
+ }
96
+ detectCategory(text) {
97
+ for (const [category, keywords] of Object.entries(this.keywords)) {
98
+ if (keywords.some((keyword) => text.includes(keyword))) {
99
+ return category;
100
+ }
101
+ }
102
+ return "other";
103
+ }
104
+ detectPriority(text) {
105
+ for (const priority of [
106
+ "urgent",
107
+ "high",
108
+ "medium",
109
+ "low"
110
+ ]) {
111
+ if (PRIORITY_HINTS[priority].some((word) => text.includes(word))) {
112
+ return priority;
113
+ }
114
+ }
115
+ return "medium";
116
+ }
117
+ detectSentiment(text) {
118
+ for (const sentiment of [
119
+ "frustrated",
120
+ "negative",
121
+ "neutral",
122
+ "positive"
123
+ ]) {
124
+ if (SENTIMENT_HINTS[sentiment].some((word) => text.includes(word))) {
125
+ return sentiment;
126
+ }
127
+ }
128
+ return "neutral";
129
+ }
130
+ extractIntents(text) {
131
+ const intents = [];
132
+ if (text.includes("refund") || text.includes("chargeback"))
133
+ intents.push("refund");
134
+ if (text.includes("payout"))
135
+ intents.push("payout");
136
+ if (text.includes("login"))
137
+ intents.push("login-help");
138
+ if (text.includes("feature"))
139
+ intents.push("feature-request");
140
+ if (text.includes("bug") || text.includes("error"))
141
+ intents.push("bug-report");
142
+ return intents.length ? intents : ["general"];
143
+ }
144
+ estimateConfidence(category, priority, sentiment) {
145
+ let base = 0.6;
146
+ if (category !== "other")
147
+ base += 0.1;
148
+ if (priority === "urgent" || priority === "low")
149
+ base += 0.05;
150
+ if (sentiment === "frustrated")
151
+ base -= 0.05;
152
+ return Math.min(0.95, Math.max(0.4, Number(base.toFixed(2))));
153
+ }
154
+ }
155
+ export {
156
+ TicketClassifier
157
+ };
@@ -1,2 +1,2 @@
1
- import { TicketClassifier, TicketClassifierOptions } from "./classifier.js";
2
- export { TicketClassifier, TicketClassifierOptions };
1
+ export * from './classifier';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tickets/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -1,3 +1,157 @@
1
- import { TicketClassifier } from "./classifier.js";
1
+ // @bun
2
+ // src/tickets/classifier.ts
3
+ var CATEGORY_KEYWORDS = {
4
+ billing: ["invoice", "payout", "refund", "charge", "billing", "payment"],
5
+ technical: ["bug", "error", "crash", "issue", "failed", "timeout"],
6
+ product: ["feature", "roadmap", "idea", "request", "feedback"],
7
+ account: ["login", "password", "2fa", "account", "profile", "email change"],
8
+ compliance: ["kyc", "aml", "compliance", "regulation", "gdpr"],
9
+ other: []
10
+ };
11
+ var PRIORITY_HINTS = {
12
+ urgent: ["urgent", "asap", "immediately", "today", "right away"],
13
+ high: ["high priority", "blocking", "major", "critical"],
14
+ medium: ["soon", "next few days"],
15
+ low: ["nice to have", "when possible", "later"]
16
+ };
17
+ var SENTIMENT_HINTS = {
18
+ positive: ["love", "great", "awesome", "thank you"],
19
+ neutral: ["question", "wonder", "curious"],
20
+ negative: ["unhappy", "bad", "terrible", "awful", "angry"],
21
+ frustrated: ["furious", "frustrated", "fed up", "ridiculous"]
22
+ };
2
23
 
3
- export { TicketClassifier };
24
+ class TicketClassifier {
25
+ keywords;
26
+ llm;
27
+ llmModel;
28
+ constructor(options) {
29
+ this.keywords = {
30
+ ...CATEGORY_KEYWORDS,
31
+ ...options?.keywords ?? {}
32
+ };
33
+ this.llm = options?.llm;
34
+ this.llmModel = options?.llmModel;
35
+ }
36
+ async classify(ticket) {
37
+ const heuristics = this.heuristicClassification(ticket);
38
+ if (!this.llm)
39
+ return heuristics;
40
+ try {
41
+ const llmResult = await this.llm.chat([
42
+ {
43
+ role: "system",
44
+ content: [{ type: "text", text: "Classify the support ticket." }]
45
+ },
46
+ {
47
+ role: "user",
48
+ content: [
49
+ {
50
+ type: "text",
51
+ text: JSON.stringify({
52
+ subject: ticket.subject,
53
+ body: ticket.body,
54
+ channel: ticket.channel
55
+ })
56
+ }
57
+ ]
58
+ }
59
+ ], {
60
+ responseFormat: "json",
61
+ model: this.llmModel
62
+ });
63
+ const content = llmResult.message.content.find((part) => ("text" in part));
64
+ if (content && "text" in content) {
65
+ const parsed = JSON.parse(content.text);
66
+ return {
67
+ ...heuristics,
68
+ ...parsed,
69
+ intents: parsed.intents ?? heuristics.intents,
70
+ tags: parsed.tags ?? heuristics.tags
71
+ };
72
+ }
73
+ } catch {}
74
+ return heuristics;
75
+ }
76
+ heuristicClassification(ticket) {
77
+ const text = `${ticket.subject}
78
+ ${ticket.body}`.toLowerCase();
79
+ const category = this.detectCategory(text);
80
+ const priority = this.detectPriority(text);
81
+ const sentiment = this.detectSentiment(text);
82
+ const intents = this.extractIntents(text);
83
+ const tags = intents.slice(0, 3);
84
+ const confidence = this.estimateConfidence(category, priority, sentiment);
85
+ return {
86
+ ticketId: ticket.id,
87
+ category,
88
+ priority,
89
+ sentiment,
90
+ intents,
91
+ tags,
92
+ confidence,
93
+ escalationRequired: priority === "urgent" || category === "compliance"
94
+ };
95
+ }
96
+ detectCategory(text) {
97
+ for (const [category, keywords] of Object.entries(this.keywords)) {
98
+ if (keywords.some((keyword) => text.includes(keyword))) {
99
+ return category;
100
+ }
101
+ }
102
+ return "other";
103
+ }
104
+ detectPriority(text) {
105
+ for (const priority of [
106
+ "urgent",
107
+ "high",
108
+ "medium",
109
+ "low"
110
+ ]) {
111
+ if (PRIORITY_HINTS[priority].some((word) => text.includes(word))) {
112
+ return priority;
113
+ }
114
+ }
115
+ return "medium";
116
+ }
117
+ detectSentiment(text) {
118
+ for (const sentiment of [
119
+ "frustrated",
120
+ "negative",
121
+ "neutral",
122
+ "positive"
123
+ ]) {
124
+ if (SENTIMENT_HINTS[sentiment].some((word) => text.includes(word))) {
125
+ return sentiment;
126
+ }
127
+ }
128
+ return "neutral";
129
+ }
130
+ extractIntents(text) {
131
+ const intents = [];
132
+ if (text.includes("refund") || text.includes("chargeback"))
133
+ intents.push("refund");
134
+ if (text.includes("payout"))
135
+ intents.push("payout");
136
+ if (text.includes("login"))
137
+ intents.push("login-help");
138
+ if (text.includes("feature"))
139
+ intents.push("feature-request");
140
+ if (text.includes("bug") || text.includes("error"))
141
+ intents.push("bug-report");
142
+ return intents.length ? intents : ["general"];
143
+ }
144
+ estimateConfidence(category, priority, sentiment) {
145
+ let base = 0.6;
146
+ if (category !== "other")
147
+ base += 0.1;
148
+ if (priority === "urgent" || priority === "low")
149
+ base += 0.05;
150
+ if (sentiment === "frustrated")
151
+ base -= 0.05;
152
+ return Math.min(0.95, Math.max(0.4, Number(base.toFixed(2))));
153
+ }
154
+ }
155
+ export {
156
+ TicketClassifier
157
+ };