@roll-agent/smart-reply-agent 0.0.2

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 (133) hide show
  1. package/SKILL.md +44 -0
  2. package/data/brand-config.sample.json +72 -0
  3. package/data/reply-policy.json +153 -0
  4. package/dist/ai/model-registry.d.ts +104 -0
  5. package/dist/ai/model-registry.d.ts.map +1 -0
  6. package/dist/ai/model-registry.js +205 -0
  7. package/dist/ai/model-registry.js.map +1 -0
  8. package/dist/ai/structured-output.d.ts +50 -0
  9. package/dist/ai/structured-output.d.ts.map +1 -0
  10. package/dist/ai/structured-output.js +78 -0
  11. package/dist/ai/structured-output.js.map +1 -0
  12. package/dist/errors/app-error.d.ts +43 -0
  13. package/dist/errors/app-error.d.ts.map +1 -0
  14. package/dist/errors/app-error.js +95 -0
  15. package/dist/errors/app-error.js.map +1 -0
  16. package/dist/errors/error-codes.d.ts +49 -0
  17. package/dist/errors/error-codes.d.ts.map +1 -0
  18. package/dist/errors/error-codes.js +115 -0
  19. package/dist/errors/error-codes.js.map +1 -0
  20. package/dist/errors/error-factory.d.ts +31 -0
  21. package/dist/errors/error-factory.d.ts.map +1 -0
  22. package/dist/errors/error-factory.js +86 -0
  23. package/dist/errors/error-factory.js.map +1 -0
  24. package/dist/errors/error-utils.d.ts +40 -0
  25. package/dist/errors/error-utils.d.ts.map +1 -0
  26. package/dist/errors/error-utils.js +188 -0
  27. package/dist/errors/error-utils.js.map +1 -0
  28. package/dist/errors/index.d.ts +9 -0
  29. package/dist/errors/index.d.ts.map +1 -0
  30. package/dist/errors/index.js +5 -0
  31. package/dist/errors/index.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +12 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/log-control.d.ts +3 -0
  37. package/dist/log-control.d.ts.map +1 -0
  38. package/dist/log-control.js +15 -0
  39. package/dist/log-control.js.map +1 -0
  40. package/dist/pipeline/age-eligibility.d.ts +26 -0
  41. package/dist/pipeline/age-eligibility.d.ts.map +1 -0
  42. package/dist/pipeline/age-eligibility.js +176 -0
  43. package/dist/pipeline/age-eligibility.js.map +1 -0
  44. package/dist/pipeline/candidate-context.d.ts +9 -0
  45. package/dist/pipeline/candidate-context.d.ts.map +1 -0
  46. package/dist/pipeline/candidate-context.js +31 -0
  47. package/dist/pipeline/candidate-context.js.map +1 -0
  48. package/dist/pipeline/candidate-utils.d.ts +6 -0
  49. package/dist/pipeline/candidate-utils.d.ts.map +1 -0
  50. package/dist/pipeline/candidate-utils.js +33 -0
  51. package/dist/pipeline/candidate-utils.js.map +1 -0
  52. package/dist/pipeline/classification.d.ts +13 -0
  53. package/dist/pipeline/classification.d.ts.map +1 -0
  54. package/dist/pipeline/classification.js +206 -0
  55. package/dist/pipeline/classification.js.map +1 -0
  56. package/dist/pipeline/context-builder.d.ts +22 -0
  57. package/dist/pipeline/context-builder.d.ts.map +1 -0
  58. package/dist/pipeline/context-builder.js +404 -0
  59. package/dist/pipeline/context-builder.js.map +1 -0
  60. package/dist/pipeline/pipeline-progress.d.ts +10 -0
  61. package/dist/pipeline/pipeline-progress.d.ts.map +1 -0
  62. package/dist/pipeline/pipeline-progress.js +33 -0
  63. package/dist/pipeline/pipeline-progress.js.map +1 -0
  64. package/dist/pipeline/reply-gate.d.ts +20 -0
  65. package/dist/pipeline/reply-gate.d.ts.map +1 -0
  66. package/dist/pipeline/reply-gate.js +139 -0
  67. package/dist/pipeline/reply-gate.js.map +1 -0
  68. package/dist/pipeline/smart-reply.d.ts +64 -0
  69. package/dist/pipeline/smart-reply.d.ts.map +1 -0
  70. package/dist/pipeline/smart-reply.js +418 -0
  71. package/dist/pipeline/smart-reply.js.map +1 -0
  72. package/dist/pipeline.d.ts +21 -0
  73. package/dist/pipeline.d.ts.map +1 -0
  74. package/dist/pipeline.js +12 -0
  75. package/dist/pipeline.js.map +1 -0
  76. package/dist/services/brand-alias.d.ts +5 -0
  77. package/dist/services/brand-alias.d.ts.map +1 -0
  78. package/dist/services/brand-alias.js +184 -0
  79. package/dist/services/brand-alias.js.map +1 -0
  80. package/dist/services/brand-config-selectors.d.ts +8 -0
  81. package/dist/services/brand-config-selectors.d.ts.map +1 -0
  82. package/dist/services/brand-config-selectors.js +30 -0
  83. package/dist/services/brand-config-selectors.js.map +1 -0
  84. package/dist/services/config-loader.d.ts +7 -0
  85. package/dist/services/config-loader.d.ts.map +1 -0
  86. package/dist/services/config-loader.js +45 -0
  87. package/dist/services/config-loader.js.map +1 -0
  88. package/dist/services/duliday-api.d.ts +31 -0
  89. package/dist/services/duliday-api.d.ts.map +1 -0
  90. package/dist/services/duliday-api.js +160 -0
  91. package/dist/services/duliday-api.js.map +1 -0
  92. package/dist/services/duliday-mapper.d.ts +46 -0
  93. package/dist/services/duliday-mapper.d.ts.map +1 -0
  94. package/dist/services/duliday-mapper.js +536 -0
  95. package/dist/services/duliday-mapper.js.map +1 -0
  96. package/dist/tools/generate-reply.d.ts +73 -0
  97. package/dist/tools/generate-reply.d.ts.map +1 -0
  98. package/dist/tools/generate-reply.js +132 -0
  99. package/dist/tools/generate-reply.js.map +1 -0
  100. package/dist/tools/sync-brand-data.d.ts +12 -0
  101. package/dist/tools/sync-brand-data.d.ts.map +1 -0
  102. package/dist/tools/sync-brand-data.js +114 -0
  103. package/dist/tools/sync-brand-data.js.map +1 -0
  104. package/dist/types/brand-resolution.d.ts +84 -0
  105. package/dist/types/brand-resolution.d.ts.map +1 -0
  106. package/dist/types/brand-resolution.js +37 -0
  107. package/dist/types/brand-resolution.js.map +1 -0
  108. package/dist/types/classification.d.ts +182 -0
  109. package/dist/types/classification.d.ts.map +1 -0
  110. package/dist/types/classification.js +30 -0
  111. package/dist/types/classification.js.map +1 -0
  112. package/dist/types/config.d.ts +4 -0
  113. package/dist/types/config.d.ts.map +1 -0
  114. package/dist/types/config.js +7 -0
  115. package/dist/types/config.js.map +1 -0
  116. package/dist/types/duliday-api.d.ts +6729 -0
  117. package/dist/types/duliday-api.d.ts.map +1 -0
  118. package/dist/types/duliday-api.js +235 -0
  119. package/dist/types/duliday-api.js.map +1 -0
  120. package/dist/types/geocoding.d.ts +24 -0
  121. package/dist/types/geocoding.d.ts.map +1 -0
  122. package/dist/types/geocoding.js +12 -0
  123. package/dist/types/geocoding.js.map +1 -0
  124. package/dist/types/reply-policy.d.ts +1391 -0
  125. package/dist/types/reply-policy.d.ts.map +1 -0
  126. package/dist/types/reply-policy.js +332 -0
  127. package/dist/types/reply-policy.js.map +1 -0
  128. package/dist/types/zhipin.d.ts +2201 -0
  129. package/dist/types/zhipin.d.ts.map +1 -0
  130. package/dist/types/zhipin.js +123 -0
  131. package/dist/types/zhipin.js.map +1 -0
  132. package/package.json +70 -0
  133. package/references/env.yaml +27 -0
@@ -0,0 +1,132 @@
1
+ import { defineTool } from "@roll-agent/sdk";
2
+ import { z } from "zod";
3
+ import { CandidateInfoSchema } from "../types/zhipin.js";
4
+ import { loadBrandConfig, loadReplyPolicy } from "../services/config-loader.js";
5
+ import { generateSmartReply } from "../pipeline/smart-reply.js";
6
+ import { AGE_ELIGIBILITY_STATUSES } from "../pipeline/age-eligibility.js";
7
+ import { ChannelTypeSchema, EffectiveDisclosureModeSchema, FunnelStageSchema, ReplyNeedSchema, RiskFlagSchema, } from "../types/reply-policy.js";
8
+ import { REPLY_GATE_VIOLATION_CODES } from "../pipeline/reply-gate.js";
9
+ import { ModelConfigSchema } from "../types/classification.js";
10
+ const ReplyGateViolationCodeSchema = z.enum(REPLY_GATE_VIOLATION_CODES);
11
+ const AgeEligibilityStatusSchema = z.enum(AGE_ELIGIBILITY_STATUSES);
12
+ export const generateReply = defineTool({
13
+ name: "generate_reply",
14
+ description: "根据候选人消息、对话历史和品牌数据生成智能招聘回复。内部流程:回合规划 → primaryNeed 驱动上下文构建 → 年龄资格校验 → 策略化回复生成 → FactGate/ReplyGate 校验。",
15
+ input: z.object({
16
+ candidateMessage: z.string().describe("候选人发送的消息"),
17
+ conversationHistory: z.array(z.string()).optional().describe("对话历史(最近几轮)"),
18
+ candidateInfo: CandidateInfoSchema.optional().describe("候选人基本信息"),
19
+ preferredBrand: z.string().optional().describe("偏好品牌"),
20
+ channelType: ChannelTypeSchema.optional().describe("渠道类型: public(BOSS直聘) 或 private(微信)"),
21
+ defaultWechatId: z.string().optional().describe("默认微信号"),
22
+ industryVoiceId: z.string().optional().describe("行业语调ID"),
23
+ turnIndex: z.number().int().min(1).optional().describe("当前会话回复轮次"),
24
+ modelConfig: ModelConfigSchema.optional().describe("模型配置覆盖"),
25
+ }),
26
+ output: z.object({
27
+ suggestedReply: z.string(),
28
+ confidence: z.number(),
29
+ stage: FunnelStageSchema,
30
+ latencyMs: z.number().optional(),
31
+ shouldExchangeWechat: z.boolean().optional(),
32
+ error: z.string().optional(),
33
+ diagnostics: z
34
+ .object({
35
+ subGoals: z.array(z.string()),
36
+ needs: z.array(ReplyNeedSchema),
37
+ primaryNeed: ReplyNeedSchema,
38
+ riskFlags: z.array(RiskFlagSchema),
39
+ reasoningText: z.string(),
40
+ extractedInfo: z.object({
41
+ mentionedBrand: z.string().nullable(),
42
+ city: z.string().nullable(),
43
+ specificAge: z.number().nullable(),
44
+ hasUrgency: z.boolean().nullable(),
45
+ preferredSchedule: z.string().nullable(),
46
+ }),
47
+ ageGate: z.object({
48
+ enabled: z.boolean(),
49
+ status: AgeEligibilityStatusSchema,
50
+ strategy: z.string(),
51
+ }),
52
+ resolvedBrand: z.string(),
53
+ storeCount: z.number(),
54
+ detailLevel: EffectiveDisclosureModeSchema,
55
+ turnIndex: z.number(),
56
+ effectiveDisclosureMode: EffectiveDisclosureModeSchema,
57
+ replyGateRewritten: z.boolean(),
58
+ gateViolations: z.array(ReplyGateViolationCodeSchema),
59
+ factGateRewritten: z.boolean(),
60
+ })
61
+ .optional(),
62
+ }),
63
+ execute: async (input, ctx) => {
64
+ ctx.logger.info(`Processing message: ${input.candidateMessage.slice(0, 50)}...`);
65
+ let configData;
66
+ try {
67
+ configData = loadBrandConfig();
68
+ }
69
+ catch {
70
+ return {
71
+ suggestedReply: "",
72
+ confidence: 0,
73
+ stage: "trust_building",
74
+ error: "品牌数据未配置,请先调用 sync_brand_data 写入数据",
75
+ };
76
+ }
77
+ const replyPolicy = loadReplyPolicy();
78
+ const result = await generateSmartReply({
79
+ candidateMessage: input.candidateMessage,
80
+ conversationHistory: input.conversationHistory,
81
+ candidateInfo: input.candidateInfo,
82
+ preferredBrand: input.preferredBrand,
83
+ channelType: input.channelType,
84
+ defaultWechatId: input.defaultWechatId,
85
+ industryVoiceId: input.industryVoiceId,
86
+ turnIndex: input.turnIndex,
87
+ modelConfig: input.modelConfig,
88
+ configData,
89
+ replyPolicy,
90
+ });
91
+ ctx.logger.info(`Reply generated. Stage: ${result.turnPlan.stage}, Confidence: ${result.confidence}`);
92
+ const debug = result.debugInfo;
93
+ return {
94
+ suggestedReply: result.suggestedReply,
95
+ confidence: result.confidence,
96
+ stage: result.turnPlan.stage,
97
+ latencyMs: result.latencyMs,
98
+ shouldExchangeWechat: result.shouldExchangeWechat,
99
+ error: result.error?.userMessage,
100
+ diagnostics: debug
101
+ ? {
102
+ subGoals: result.turnPlan.subGoals,
103
+ needs: result.turnPlan.needs,
104
+ primaryNeed: result.turnPlan.primaryNeed,
105
+ riskFlags: result.turnPlan.riskFlags,
106
+ reasoningText: result.turnPlan.reasoningText,
107
+ extractedInfo: {
108
+ mentionedBrand: result.turnPlan.extractedInfo.mentionedBrand ?? null,
109
+ city: result.turnPlan.extractedInfo.city ?? null,
110
+ specificAge: result.turnPlan.extractedInfo.specificAge ?? null,
111
+ hasUrgency: result.turnPlan.extractedInfo.hasUrgency ?? null,
112
+ preferredSchedule: result.turnPlan.extractedInfo.preferredSchedule ?? null,
113
+ },
114
+ ageGate: {
115
+ enabled: debug.appliedStrategy.enabled,
116
+ status: debug.gateStatus,
117
+ strategy: debug.appliedStrategy.strategy,
118
+ },
119
+ resolvedBrand: debug.resolvedBrand,
120
+ storeCount: debug.storeCount,
121
+ detailLevel: debug.detailLevel,
122
+ turnIndex: debug.turnIndex,
123
+ effectiveDisclosureMode: debug.effectiveDisclosureMode,
124
+ replyGateRewritten: result.replyGateRewritten,
125
+ gateViolations: result.gateViolations,
126
+ factGateRewritten: result.factGateRewritten,
127
+ }
128
+ : undefined,
129
+ };
130
+ },
131
+ });
132
+ //# sourceMappingURL=generate-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-reply.js","sourceRoot":"","sources":["../../src/tools/generate-reply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const syncBrandData: import("@roll-agent/sdk").ToolDefinition<{
2
+ cityName: string;
3
+ brandAlias?: string | undefined;
4
+ }, {
5
+ success: boolean;
6
+ brandsCount: number;
7
+ storesCount: number;
8
+ positionsCount: number;
9
+ updatedAt: string;
10
+ error?: string | undefined;
11
+ }>;
12
+ //# sourceMappingURL=sync-brand-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-brand-data.d.ts","sourceRoot":"","sources":["../../src/tools/sync-brand-data.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa;;;;;;;;;;EAmGxB,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { defineTool } from "@roll-agent/sdk";
2
+ import { z } from "zod";
3
+ import { getDulidayToken, getDulidayJobListEndpoint, fetchAllJobListPages, FULL_INCLUDE_OPTIONS, } from "../services/duliday-api.js";
4
+ import { getSharedBrandAliasMap } from "../services/brand-alias.js";
5
+ import { convertPositionsToZhipinData } from "../services/duliday-mapper.js";
6
+ import { saveBrandConfig } from "../services/config-loader.js";
7
+ export const syncBrandData = defineTool({
8
+ name: "sync_brand_data",
9
+ description: "从 Duliday API 拉取并同步品牌配置数据(门店、岗位、薪资等)到本地。可选传入品牌别名和城市名称作为过滤条件。",
10
+ input: z.object({
11
+ brandAlias: z.string().optional().describe("品牌别名(可选,配合 cityName 使用可按品牌过滤)"),
12
+ cityName: z
13
+ .string()
14
+ .describe('城市名称(必填,Duliday API 要求至少提供城市作为筛选条件,如 "上海市")'),
15
+ }),
16
+ output: z.object({
17
+ success: z.boolean(),
18
+ brandsCount: z.number(),
19
+ storesCount: z.number(),
20
+ positionsCount: z.number(),
21
+ updatedAt: z.string(),
22
+ error: z.string().optional(),
23
+ }),
24
+ execute: async (input, ctx) => {
25
+ const token = getDulidayToken();
26
+ const endpoint = getDulidayJobListEndpoint();
27
+ if (!token || !endpoint) {
28
+ return {
29
+ success: false,
30
+ brandsCount: 0,
31
+ storesCount: 0,
32
+ positionsCount: 0,
33
+ updatedAt: new Date().toISOString(),
34
+ error: `缺少环境变量: ${[!token && "DULIDAY_TOKEN", !endpoint && "DULIDAY_JOB_LIST_URL"].filter(Boolean).join(", ")}`,
35
+ };
36
+ }
37
+ if (!input.cityName) {
38
+ return {
39
+ success: false,
40
+ brandsCount: 0,
41
+ storesCount: 0,
42
+ positionsCount: 0,
43
+ updatedAt: new Date().toISOString(),
44
+ error: 'cityName 为必填项,Duliday API 要求至少提供城市作为筛选条件(如 "上海市")',
45
+ };
46
+ }
47
+ try {
48
+ ctx.logger.info("Fetching all job list pages from Duliday API...");
49
+ const { items } = await fetchAllJobListPages(token, endpoint, {
50
+ brandAlias: input.brandAlias ?? null,
51
+ cityName: input.cityName ?? null,
52
+ include: FULL_INCLUDE_OPTIONS,
53
+ });
54
+ let preferredDefaultBrandName = resolveFirstBrandName(items);
55
+ if (!preferredDefaultBrandName && input.brandAlias) {
56
+ preferredDefaultBrandName = await reverseLookupBrand(input.brandAlias, token);
57
+ }
58
+ if (!preferredDefaultBrandName && input.brandAlias) {
59
+ preferredDefaultBrandName = input.brandAlias;
60
+ }
61
+ ctx.logger.info(`Resolved default brand: ${preferredDefaultBrandName ?? "自动推断"}, converting ${items.length} positions...`);
62
+ const zhipinData = convertPositionsToZhipinData(items, preferredDefaultBrandName, input.cityName);
63
+ saveBrandConfig(zhipinData);
64
+ ctx.logger.info(`Brand config saved: ${zhipinData.brands.length} brands, ${zhipinData.brands.reduce((sum, brand) => sum + brand.stores.length, 0)} stores`);
65
+ const storesCount = zhipinData.brands.reduce((sum, brand) => sum + brand.stores.length, 0);
66
+ const positionsCount = zhipinData.brands.reduce((sum, brand) => sum + brand.stores.reduce((inner, store) => inner + store.positions.length, 0), 0);
67
+ return {
68
+ success: true,
69
+ brandsCount: zhipinData.brands.length,
70
+ storesCount,
71
+ positionsCount,
72
+ updatedAt: new Date().toISOString(),
73
+ };
74
+ }
75
+ catch (err) {
76
+ return {
77
+ success: false,
78
+ brandsCount: 0,
79
+ storesCount: 0,
80
+ positionsCount: 0,
81
+ updatedAt: new Date().toISOString(),
82
+ error: err instanceof Error ? err.message : String(err),
83
+ };
84
+ }
85
+ },
86
+ });
87
+ function isRecord(value) {
88
+ return value !== null && typeof value === "object" && !Array.isArray(value);
89
+ }
90
+ function resolveFirstBrandName(items) {
91
+ for (const item of items) {
92
+ if (!isRecord(item))
93
+ continue;
94
+ const basicInfo = isRecord(item.basicInfo) ? item.basicInfo : null;
95
+ if (basicInfo && typeof basicInfo.brandName === "string" && basicInfo.brandName) {
96
+ return basicInfo.brandName;
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ async function reverseLookupBrand(alias, dulidayToken) {
102
+ try {
103
+ const aliasMap = await getSharedBrandAliasMap(dulidayToken);
104
+ const key = alias
105
+ .trim()
106
+ .toLowerCase()
107
+ .replace(/[\s._-]+/g, "");
108
+ return aliasMap.get(key);
109
+ }
110
+ catch {
111
+ return undefined;
112
+ }
113
+ }
114
+ //# sourceMappingURL=sync-brand-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-brand-data.js","sourceRoot":"","sources":["../../src/tools/sync-brand-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ import type { BrandPriorityStrategy } from "./config.ts";
3
+ export declare const BrandResolutionInputSchema: z.ZodObject<{
4
+ uiSelectedBrand: z.ZodOptional<z.ZodString>;
5
+ configDefaultBrand: z.ZodOptional<z.ZodString>;
6
+ conversationBrand: z.ZodOptional<z.ZodString>;
7
+ availableBrands: z.ZodArray<z.ZodString, "many">;
8
+ strategy: z.ZodEnum<["user-selected", "conversation-extracted", "smart"]>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ availableBrands: string[];
11
+ strategy: "user-selected" | "conversation-extracted" | "smart";
12
+ uiSelectedBrand?: string | undefined;
13
+ configDefaultBrand?: string | undefined;
14
+ conversationBrand?: string | undefined;
15
+ }, {
16
+ availableBrands: string[];
17
+ strategy: "user-selected" | "conversation-extracted" | "smart";
18
+ uiSelectedBrand?: string | undefined;
19
+ configDefaultBrand?: string | undefined;
20
+ conversationBrand?: string | undefined;
21
+ }>;
22
+ export type BrandResolutionInput = z.infer<typeof BrandResolutionInputSchema> & {
23
+ aliasMap?: Map<string, string> | undefined;
24
+ };
25
+ export declare const BrandMatchTypeSchema: z.ZodEnum<["exact", "fuzzy", "fallback"]>;
26
+ export type BrandMatchType = z.infer<typeof BrandMatchTypeSchema>;
27
+ export declare const BrandSourceSchema: z.ZodEnum<["ui", "conversation", "config", "default"]>;
28
+ export type BrandSource = z.infer<typeof BrandSourceSchema>;
29
+ export declare const BrandResolutionOutputSchema: z.ZodObject<{
30
+ resolvedBrand: z.ZodString;
31
+ matchType: z.ZodEnum<["exact", "fuzzy", "fallback"]>;
32
+ source: z.ZodEnum<["ui", "conversation", "config", "default"]>;
33
+ reason: z.ZodString;
34
+ originalInput: z.ZodOptional<z.ZodString>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ source: "default" | "config" | "ui" | "conversation";
37
+ resolvedBrand: string;
38
+ matchType: "exact" | "fuzzy" | "fallback";
39
+ reason: string;
40
+ originalInput?: string | undefined;
41
+ }, {
42
+ source: "default" | "config" | "ui" | "conversation";
43
+ resolvedBrand: string;
44
+ matchType: "exact" | "fuzzy" | "fallback";
45
+ reason: string;
46
+ originalInput?: string | undefined;
47
+ }>;
48
+ export type BrandResolutionOutput = z.infer<typeof BrandResolutionOutputSchema>;
49
+ export declare const FuzzyMatchResultSchema: z.ZodObject<{
50
+ brand: z.ZodString;
51
+ isExact: z.ZodBoolean;
52
+ originalInput: z.ZodString;
53
+ }, "strip", z.ZodTypeAny, {
54
+ brand: string;
55
+ originalInput: string;
56
+ isExact: boolean;
57
+ }, {
58
+ brand: string;
59
+ originalInput: string;
60
+ isExact: boolean;
61
+ }>;
62
+ export type FuzzyMatchResult = z.infer<typeof FuzzyMatchResultSchema>;
63
+ export declare const BRAND_RESOLUTION_PRIORITY: {
64
+ readonly "user-selected": readonly ["uiSelectedBrand", "configDefaultBrand", "firstAvailable"];
65
+ readonly "conversation-extracted": readonly ["conversationBrand", "uiSelectedBrand", "configDefaultBrand", "firstAvailable"];
66
+ readonly smart: readonly ["conversationBrand", "uiSelectedBrand", "configDefaultBrand", "firstAvailable"];
67
+ };
68
+ export declare function isBrandPriorityStrategy(value: unknown): value is BrandPriorityStrategy;
69
+ export interface BrandResolutionContext {
70
+ sources: {
71
+ ui?: string;
72
+ conversation?: string;
73
+ config?: string;
74
+ };
75
+ availableBrands: string[];
76
+ strategy: BrandPriorityStrategy;
77
+ attempts: Array<{
78
+ source: string;
79
+ value: string | undefined;
80
+ matched: boolean;
81
+ reason: string;
82
+ }>;
83
+ }
84
+ //# sourceMappingURL=brand-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-resolution.d.ts","sourceRoot":"","sources":["../../src/types/brand-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;EAMrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,GAAG;IAC9E,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,oBAAoB,2CAAyC,CAAC;AAC3E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,iBAAiB,wDAAsD,CAAC;AACrF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;EAMtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,yBAAyB;;;;CAS5B,CAAC;AAEX,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB,CAEtF;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,QAAQ,EAAE,KAAK,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ import { BrandPriorityStrategySchema } from "./config.js";
3
+ export const BrandResolutionInputSchema = z.object({
4
+ uiSelectedBrand: z.string().optional(),
5
+ configDefaultBrand: z.string().optional(),
6
+ conversationBrand: z.string().optional(),
7
+ availableBrands: z.array(z.string()),
8
+ strategy: BrandPriorityStrategySchema,
9
+ });
10
+ export const BrandMatchTypeSchema = z.enum(["exact", "fuzzy", "fallback"]);
11
+ export const BrandSourceSchema = z.enum(["ui", "conversation", "config", "default"]);
12
+ export const BrandResolutionOutputSchema = z.object({
13
+ resolvedBrand: z.string(),
14
+ matchType: BrandMatchTypeSchema,
15
+ source: BrandSourceSchema,
16
+ reason: z.string(),
17
+ originalInput: z.string().optional(),
18
+ });
19
+ export const FuzzyMatchResultSchema = z.object({
20
+ brand: z.string(),
21
+ isExact: z.boolean(),
22
+ originalInput: z.string(),
23
+ });
24
+ export const BRAND_RESOLUTION_PRIORITY = {
25
+ "user-selected": ["uiSelectedBrand", "configDefaultBrand", "firstAvailable"],
26
+ "conversation-extracted": [
27
+ "conversationBrand",
28
+ "uiSelectedBrand",
29
+ "configDefaultBrand",
30
+ "firstAvailable",
31
+ ],
32
+ smart: ["conversationBrand", "uiSelectedBrand", "configDefaultBrand", "firstAvailable"],
33
+ };
34
+ export function isBrandPriorityStrategy(value) {
35
+ return BrandPriorityStrategySchema.safeParse(value).success;
36
+ }
37
+ //# sourceMappingURL=brand-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brand-resolution.js","sourceRoot":"","sources":["../../src/types/brand-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,QAAQ,EAAE,2BAA2B;CACtC,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAG3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAGrF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,SAAS,EAAE,oBAAoB;IAC/B,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,eAAe,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,CAAU;IACrF,wBAAwB,EAAE;QACxB,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,gBAAgB;KACR;IACV,KAAK,EAAE,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,CAAU;CACxF,CAAC;AAEX,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,OAAO,2BAA2B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,182 @@
1
+ import { z } from "zod";
2
+ export declare const ProviderConfigSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ baseURL: z.ZodString;
5
+ description: z.ZodString;
6
+ }, "strip", z.ZodTypeAny, {
7
+ description: string;
8
+ name: string;
9
+ baseURL: string;
10
+ }, {
11
+ description: string;
12
+ name: string;
13
+ baseURL: string;
14
+ }>;
15
+ export declare const ProviderConfigsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ name: z.ZodString;
17
+ baseURL: z.ZodString;
18
+ description: z.ZodString;
19
+ }, "strip", z.ZodTypeAny, {
20
+ description: string;
21
+ name: string;
22
+ baseURL: string;
23
+ }, {
24
+ description: string;
25
+ name: string;
26
+ baseURL: string;
27
+ }>>;
28
+ export declare const ModelConfigSchema: z.ZodObject<{
29
+ chatModel: z.ZodOptional<z.ZodString>;
30
+ classifyModel: z.ZodOptional<z.ZodString>;
31
+ replyModel: z.ZodOptional<z.ZodString>;
32
+ providerConfigs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
33
+ name: z.ZodString;
34
+ baseURL: z.ZodString;
35
+ description: z.ZodString;
36
+ }, "strip", z.ZodTypeAny, {
37
+ description: string;
38
+ name: string;
39
+ baseURL: string;
40
+ }, {
41
+ description: string;
42
+ name: string;
43
+ baseURL: string;
44
+ }>>>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ chatModel?: string | undefined;
47
+ classifyModel?: string | undefined;
48
+ replyModel?: string | undefined;
49
+ providerConfigs?: Record<string, {
50
+ description: string;
51
+ name: string;
52
+ baseURL: string;
53
+ }> | undefined;
54
+ }, {
55
+ chatModel?: string | undefined;
56
+ classifyModel?: string | undefined;
57
+ replyModel?: string | undefined;
58
+ providerConfigs?: Record<string, {
59
+ description: string;
60
+ name: string;
61
+ baseURL: string;
62
+ }> | undefined;
63
+ }>;
64
+ export declare const BrandDataSchema: z.ZodObject<{
65
+ city: z.ZodOptional<z.ZodString>;
66
+ defaultBrand: z.ZodString;
67
+ availableBrands: z.ZodArray<z.ZodString, "many">;
68
+ storeCount: z.ZodNumber;
69
+ }, "strip", z.ZodTypeAny, {
70
+ defaultBrand: string;
71
+ availableBrands: string[];
72
+ storeCount: number;
73
+ city?: string | undefined;
74
+ }, {
75
+ defaultBrand: string;
76
+ availableBrands: string[];
77
+ storeCount: number;
78
+ city?: string | undefined;
79
+ }>;
80
+ export declare const ClassificationOptionsSchema: z.ZodObject<{
81
+ modelConfig: z.ZodObject<{
82
+ chatModel: z.ZodOptional<z.ZodString>;
83
+ classifyModel: z.ZodOptional<z.ZodString>;
84
+ replyModel: z.ZodOptional<z.ZodString>;
85
+ providerConfigs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
86
+ name: z.ZodString;
87
+ baseURL: z.ZodString;
88
+ description: z.ZodString;
89
+ }, "strip", z.ZodTypeAny, {
90
+ description: string;
91
+ name: string;
92
+ baseURL: string;
93
+ }, {
94
+ description: string;
95
+ name: string;
96
+ baseURL: string;
97
+ }>>>;
98
+ }, "strip", z.ZodTypeAny, {
99
+ chatModel?: string | undefined;
100
+ classifyModel?: string | undefined;
101
+ replyModel?: string | undefined;
102
+ providerConfigs?: Record<string, {
103
+ description: string;
104
+ name: string;
105
+ baseURL: string;
106
+ }> | undefined;
107
+ }, {
108
+ chatModel?: string | undefined;
109
+ classifyModel?: string | undefined;
110
+ replyModel?: string | undefined;
111
+ providerConfigs?: Record<string, {
112
+ description: string;
113
+ name: string;
114
+ baseURL: string;
115
+ }> | undefined;
116
+ }>;
117
+ candidateMessage: z.ZodString;
118
+ conversationHistory: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
119
+ brandData: z.ZodOptional<z.ZodObject<{
120
+ city: z.ZodOptional<z.ZodString>;
121
+ defaultBrand: z.ZodString;
122
+ availableBrands: z.ZodArray<z.ZodString, "many">;
123
+ storeCount: z.ZodNumber;
124
+ }, "strip", z.ZodTypeAny, {
125
+ defaultBrand: string;
126
+ availableBrands: string[];
127
+ storeCount: number;
128
+ city?: string | undefined;
129
+ }, {
130
+ defaultBrand: string;
131
+ availableBrands: string[];
132
+ storeCount: number;
133
+ city?: string | undefined;
134
+ }>>;
135
+ channelType: z.ZodOptional<z.ZodEnum<["public", "private"]>>;
136
+ }, "strip", z.ZodTypeAny, {
137
+ modelConfig: {
138
+ chatModel?: string | undefined;
139
+ classifyModel?: string | undefined;
140
+ replyModel?: string | undefined;
141
+ providerConfigs?: Record<string, {
142
+ description: string;
143
+ name: string;
144
+ baseURL: string;
145
+ }> | undefined;
146
+ };
147
+ candidateMessage: string;
148
+ conversationHistory: string[];
149
+ brandData?: {
150
+ defaultBrand: string;
151
+ availableBrands: string[];
152
+ storeCount: number;
153
+ city?: string | undefined;
154
+ } | undefined;
155
+ channelType?: "public" | "private" | undefined;
156
+ }, {
157
+ modelConfig: {
158
+ chatModel?: string | undefined;
159
+ classifyModel?: string | undefined;
160
+ replyModel?: string | undefined;
161
+ providerConfigs?: Record<string, {
162
+ description: string;
163
+ name: string;
164
+ baseURL: string;
165
+ }> | undefined;
166
+ };
167
+ candidateMessage: string;
168
+ conversationHistory?: string[] | undefined;
169
+ brandData?: {
170
+ defaultBrand: string;
171
+ availableBrands: string[];
172
+ storeCount: number;
173
+ city?: string | undefined;
174
+ } | undefined;
175
+ channelType?: "public" | "private" | undefined;
176
+ }>;
177
+ export type ProviderConfig = z.infer<typeof ProviderConfigSchema>;
178
+ export type ModelConfig = z.infer<typeof ModelConfigSchema>;
179
+ export type ProviderConfigs = z.infer<typeof ProviderConfigsSchema>;
180
+ export type BrandData = z.infer<typeof BrandDataSchema>;
181
+ export type ClassificationOptions = z.infer<typeof ClassificationOptionsSchema>;
182
+ //# sourceMappingURL=classification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification.d.ts","sourceRoot":"","sources":["../../src/types/classification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;GAA6C,CAAC;AAEhF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK5B,CAAC;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMtC,CAAC;AAGH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { ChannelTypeSchema } from "./reply-policy.js";
3
+ // ========== Provider / Model Config Schemas ==========
4
+ export const ProviderConfigSchema = z.object({
5
+ name: z.string(),
6
+ baseURL: z.string(),
7
+ description: z.string(),
8
+ });
9
+ export const ProviderConfigsSchema = z.record(z.string(), ProviderConfigSchema);
10
+ export const ModelConfigSchema = z.object({
11
+ chatModel: z.string().optional(),
12
+ classifyModel: z.string().optional(),
13
+ replyModel: z.string().optional(),
14
+ providerConfigs: ProviderConfigsSchema.optional(),
15
+ });
16
+ // ========== Classification Agent Schema ==========
17
+ export const BrandDataSchema = z.object({
18
+ city: z.string().optional(),
19
+ defaultBrand: z.string(),
20
+ availableBrands: z.array(z.string()),
21
+ storeCount: z.number(),
22
+ });
23
+ export const ClassificationOptionsSchema = z.object({
24
+ modelConfig: ModelConfigSchema,
25
+ candidateMessage: z.string(),
26
+ conversationHistory: z.array(z.string()).default([]),
27
+ brandData: BrandDataSchema.optional(),
28
+ channelType: ChannelTypeSchema.optional(),
29
+ });
30
+ //# sourceMappingURL=classification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification.js","sourceRoot":"","sources":["../../src/types/classification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wDAAwD;AAExD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,eAAe,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAEH,oDAAoD;AAEpD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,WAAW,EAAE,iBAAiB;IAC9B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,SAAS,EAAE,eAAe,CAAC,QAAQ,EAAE;IACrC,WAAW,EAAE,iBAAiB,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const BrandPriorityStrategySchema: z.ZodEnum<["user-selected", "conversation-extracted", "smart"]>;
3
+ export type BrandPriorityStrategy = z.infer<typeof BrandPriorityStrategySchema>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,2BAA2B,iEAItC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ export const BrandPriorityStrategySchema = z.enum([
3
+ "user-selected",
4
+ "conversation-extracted",
5
+ "smart",
6
+ ]);
7
+ //# sourceMappingURL=config.js.map