@playcraft/common 0.0.19 → 0.0.21

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/dist/index.d.ts CHANGED
@@ -12,4 +12,5 @@ export * from './utils/index.js';
12
12
  export * from './agent-tools/index.js';
13
13
  export * from './prefab/index.js';
14
14
  export * from './search/index.js';
15
+ export * from './recommend/index.js';
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -12,4 +12,5 @@ export * from './utils/index.js';
12
12
  export * from './agent-tools/index.js';
13
13
  export * from './prefab/index.js';
14
14
  export * from './search/index.js';
15
+ export * from './recommend/index.js';
15
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -1,3 +1,3 @@
1
- export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, EXECUTOR_SPECIAL_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
1
+ export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
2
2
  export type { McpToolDefinition } from './tools.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, EXECUTOR_SPECIAL_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
1
+ export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -48,6 +48,18 @@ export declare class MessengerServer {
48
48
  constructor(options?: MessengerServerOptions);
49
49
  attach(server: http.Server): void;
50
50
  close(): void;
51
+ /**
52
+ * 对本进程内连接的 WebSocket 客户端进行广播(按 projectId 过滤)。
53
+ *
54
+ * 注意:在多副本 messenger 部署中,如果客户端连接到的是不同的 pod,此方法不会跨 pod。
55
+ * 跨 pod 分发请使用 {@link createEmitHandler} 的 `onEmit` 钩子,
56
+ * 由上层(如 Redis Pub/Sub)fan-out 后,每个 pod 再在订阅端调用本方法。
57
+ */
58
+ broadcastLocal(name: string, data: any, projectId?: string | number): void;
59
+ /**
60
+ * 兼容旧调用的 broadcast 方法,内部等价于 {@link broadcastLocal}。
61
+ * 新代码建议直接调用 `broadcastLocal`,以明确"仅本进程"的语义。
62
+ */
51
63
  broadcast(name: string, data: any, projectId?: string | number): void;
52
64
  send(ws: WebSocket, name: string, data: any, projectId?: string | number): void;
53
65
  /**
@@ -57,8 +69,16 @@ export declare class MessengerServer {
57
69
  /**
58
70
  * 创建一个兼容现有 messenger 的 /emit HTTP handler(给 backend 内部调用)。
59
71
  * 认证头:使用 HEADERS.INTERNAL_SECRET 常量
72
+ *
73
+ * @param emitSecret 内部服务鉴权密钥(与 backend EMIT_SECRET 一致)
74
+ * @param onEmit 可选钩子:收到合法 emit 后调用。用于接入 Redis Pub/Sub 实现跨 pod 广播。
75
+ * 未提供时回退为 `broadcastLocal`,仅对本进程内的客户端广播(单副本或 CLI 模式)。
60
76
  */
61
- createEmitHandler(emitSecret: string): (req: http.IncomingMessage, res: http.ServerResponse) => void;
77
+ createEmitHandler(emitSecret: string, onEmit?: (msg: {
78
+ name: string;
79
+ data: any;
80
+ projectId?: string | number;
81
+ }) => void | Promise<void>): (req: http.IncomingMessage, res: http.ServerResponse) => void;
62
82
  private handleConnection;
63
83
  private getDefaultPermissions;
64
84
  private parseInbound;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;IACtH,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,oBAAoB;;;;;;;;CAQvB,CAAC;AA4BX,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,6BAA6B;IAC7B,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7E,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AASF,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,OAAO,GAAE,sBAA2B;IAMhD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAM1B,KAAK;IAIL,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAc9D,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAMxE;;OAEG;IACH,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;IAmBpF;;;OAGG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,IAC1B,KAAK,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,cAAc;IAiC7D,OAAO,CAAC,gBAAgB;IA8FxB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,YAAY;CAgCrB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;IACtH,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,oBAAoB;;;;;;;;CAQvB,CAAC;AA4BX,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,6BAA6B;IAC7B,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7E,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AASF,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,OAAO,GAAE,sBAA2B;IAMhD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAM1B,KAAK;IAIL;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAcnE;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAI9D,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAMxE;;OAEG;IACH,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;IAmBpF;;;;;;;OAOG;IACH,iBAAiB,CACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAExF,KAAK,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,cAAc;IAwC7D,OAAO,CAAC,gBAAgB;IA8FxB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,YAAY;CAgCrB"}
@@ -55,7 +55,14 @@ export class MessengerServer {
55
55
  close() {
56
56
  this.wss?.close();
57
57
  }
58
- broadcast(name, data, projectId) {
58
+ /**
59
+ * 对本进程内连接的 WebSocket 客户端进行广播(按 projectId 过滤)。
60
+ *
61
+ * 注意:在多副本 messenger 部署中,如果客户端连接到的是不同的 pod,此方法不会跨 pod。
62
+ * 跨 pod 分发请使用 {@link createEmitHandler} 的 `onEmit` 钩子,
63
+ * 由上层(如 Redis Pub/Sub)fan-out 后,每个 pod 再在订阅端调用本方法。
64
+ */
65
+ broadcastLocal(name, data, projectId) {
59
66
  const pid = Number(projectId) || 1;
60
67
  const json = MessengerProtocol.serialize(MessengerProtocol.createMessage(name, data, pid));
61
68
  let sentCount = 0;
@@ -67,7 +74,14 @@ export class MessengerServer {
67
74
  client.send(json);
68
75
  sentCount++;
69
76
  }
70
- console.log(`[MessengerServer] Broadcast '${name}' to ${sentCount} clients (projectId: ${projectId})`);
77
+ console.log(`[MessengerServer] Broadcast(local) '${name}' to ${sentCount} clients (projectId: ${projectId})`);
78
+ }
79
+ /**
80
+ * 兼容旧调用的 broadcast 方法,内部等价于 {@link broadcastLocal}。
81
+ * 新代码建议直接调用 `broadcastLocal`,以明确"仅本进程"的语义。
82
+ */
83
+ broadcast(name, data, projectId) {
84
+ this.broadcastLocal(name, data, projectId);
71
85
  }
72
86
  send(ws, name, data, projectId) {
73
87
  if (ws.readyState !== WebSocket.OPEN)
@@ -99,8 +113,12 @@ export class MessengerServer {
99
113
  /**
100
114
  * 创建一个兼容现有 messenger 的 /emit HTTP handler(给 backend 内部调用)。
101
115
  * 认证头:使用 HEADERS.INTERNAL_SECRET 常量
116
+ *
117
+ * @param emitSecret 内部服务鉴权密钥(与 backend EMIT_SECRET 一致)
118
+ * @param onEmit 可选钩子:收到合法 emit 后调用。用于接入 Redis Pub/Sub 实现跨 pod 广播。
119
+ * 未提供时回退为 `broadcastLocal`,仅对本进程内的客户端广播(单副本或 CLI 模式)。
102
120
  */
103
- createEmitHandler(emitSecret) {
121
+ createEmitHandler(emitSecret, onEmit) {
104
122
  return (req, res) => {
105
123
  if (req.method !== 'POST' || req.url !== '/emit') {
106
124
  res.statusCode = 404;
@@ -119,8 +137,16 @@ export class MessengerServer {
119
137
  try {
120
138
  const msg = JSON.parse(body || '{}');
121
139
  console.log('[MessengerServer] Emit received:', msg.name, 'to project:', msg.projectId, 'data:', JSON.stringify(msg.data || {}).substring(0, 150));
122
- this.broadcast(msg.name, msg.data, msg.projectId);
123
- console.log('[MessengerServer] Broadcast completed for:', msg.name);
140
+ if (onEmit) {
141
+ Promise.resolve(onEmit(msg)).catch((err) => {
142
+ console.error('[MessengerServer] onEmit hook failed, falling back to local broadcast:', err);
143
+ this.broadcastLocal(msg.name, msg.data, msg.projectId);
144
+ });
145
+ }
146
+ else {
147
+ this.broadcastLocal(msg.name, msg.data, msg.projectId);
148
+ }
149
+ console.log('[MessengerServer] Emit dispatched:', msg.name);
124
150
  res.statusCode = 200;
125
151
  res.end('ok');
126
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Recommend 模块的纯算法层。
3
+ *
4
+ * 本文件由 packages/frontend/src/lib/recommend/engine.ts 整体迁移而来,
5
+ * 仅修改 import 路径(改用本包 ./types),其余逻辑/数值/排序行为保持 1:1。
6
+ *
7
+ * 设计约束:
8
+ * - 全部为无副作用的纯函数,可被 backend / cli / frontend / worker 直接调用
9
+ * - 不引入新依赖,不读环境变量,不做 IO
10
+ * - 任何修改都必须配套更新 algorithms.test.ts 中的 fixture 校验
11
+ */
12
+ import { type Creative, type ImprovementSuggestion, type KnnResult, type Metric, type OptimalCombination, type RecommendData, type SimilarCreativeItem } from './types.js';
13
+ export declare function uniformHamming(a: Record<string, string | null>, b: Record<string, string | null>, cols?: readonly string[]): number;
14
+ export declare function weightedHamming(a: Record<string, string | null>, b: Record<string, string | null>, weights: Record<string, number>, cols?: readonly string[]): number;
15
+ export declare function knnPredict(targetTags: Record<string, string | null>, channel: string, data: RecommendData, metric?: Metric, k?: number): KnnResult | null;
16
+ export declare function getImprovements(creative: Creative, channel: string, data: RecommendData, metric?: Metric): ImprovementSuggestion[];
17
+ export declare function tagToAtom(tags: Record<string, string | null>, data: RecommendData): Record<string, string | number>;
18
+ /**
19
+ * 对每个 mappable 维度从枚举值均匀随机取一个。
20
+ *
21
+ * @param data 数据快照
22
+ * @param rng 可选的 0~1 随机数生成器,默认为 Math.random;CLI 需要可复现时传入种子化 RNG
23
+ */
24
+ export declare function randomTags(data: RecommendData, rng?: () => number): Record<string, string | null>;
25
+ export declare function findSimilarCreatives(tags: Record<string, string | null>, channel: string, data: RecommendData, metric?: Metric, topN?: number): SimilarCreativeItem[];
26
+ export declare function generateOptimalCombinations(channel: string, data: RecommendData, metric: Metric, topK?: number): OptimalCombination[];
27
+ //# sourceMappingURL=algorithms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.d.ts","sourceRoot":"","sources":["../../src/recommend/algorithms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAEd,KAAK,MAAM,EACX,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,IAAI,GAAE,SAAS,MAAM,EAAkB,GACtC,MAAM,CAWR;AAED,wBAAgB,eAAe,CAC7B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,GAAE,SAAS,MAAM,EAAkB,GACtC,MAAM,CAYR;AAID,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,EACtB,CAAC,SAAI,GACJ,SAAS,GAAG,IAAI,CAiClB;AAID,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,GACrB,qBAAqB,EAAE,CAmDzB;AAID,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACnC,IAAI,EAAE,aAAa,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAkDjC;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,aAAa,EACnB,GAAG,GAAE,MAAM,MAAoB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAQ/B;AAID,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,EACtB,IAAI,SAAI,GACP,mBAAmB,EAAE,CAevB;AAID,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,GACP,kBAAkB,EAAE,CAwEtB"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Recommend 模块的纯算法层。
3
+ *
4
+ * 本文件由 packages/frontend/src/lib/recommend/engine.ts 整体迁移而来,
5
+ * 仅修改 import 路径(改用本包 ./types),其余逻辑/数值/排序行为保持 1:1。
6
+ *
7
+ * 设计约束:
8
+ * - 全部为无副作用的纯函数,可被 backend / cli / frontend / worker 直接调用
9
+ * - 不引入新依赖,不读环境变量,不做 IO
10
+ * - 任何修改都必须配套更新 algorithms.test.ts 中的 fixture 校验
11
+ */
12
+ import { MAPPABLE_TAGS, METRIC_CONFIG, } from './types.js';
13
+ // ─── 内部辅助函数 ─────────────────────────────────────────────────────────
14
+ function getMetricValue(c, metric) {
15
+ return c[METRIC_CONFIG[metric].field] ?? 0;
16
+ }
17
+ function getStatValue(s, metric) {
18
+ return s[METRIC_CONFIG[metric].statField] ?? 0;
19
+ }
20
+ function getWeights(data, channel, metric) {
21
+ return data.channelWeights[channel]?.[metric] ?? {};
22
+ }
23
+ // ─── 距离函数 ─────────────────────────────────────────────────────────────
24
+ export function uniformHamming(a, b, cols = MAPPABLE_TAGS) {
25
+ let dist = 0;
26
+ let compared = 0;
27
+ for (const c of cols) {
28
+ const va = a[c];
29
+ const vb = b[c];
30
+ if (va == null && vb == null)
31
+ continue;
32
+ compared++;
33
+ if (va !== vb)
34
+ dist++;
35
+ }
36
+ return compared > 0 ? dist / compared : 0;
37
+ }
38
+ export function weightedHamming(a, b, weights, cols = MAPPABLE_TAGS) {
39
+ let dist = 0;
40
+ let wSum = 0;
41
+ for (const c of cols) {
42
+ const va = a[c];
43
+ const vb = b[c];
44
+ if (va == null && vb == null)
45
+ continue;
46
+ const w = weights[c] ?? 0;
47
+ wSum += w;
48
+ if (va !== vb)
49
+ dist += w;
50
+ }
51
+ return wSum > 0 ? dist / wSum : 0;
52
+ }
53
+ // ─── KNN 预估 ─────────────────────────────────────────────────────────────
54
+ export function knnPredict(targetTags, channel, data, metric = 'ctr', k = 5) {
55
+ const weights = getWeights(data, channel, metric);
56
+ const items = data.creatives.filter((c) => c.tags['投放渠道'] === channel);
57
+ if (!items.length || !Object.keys(weights).length)
58
+ return null;
59
+ const dists = items.map((c) => ({
60
+ creative: c,
61
+ distance: weightedHamming(targetTags, c.tags, weights),
62
+ }));
63
+ dists.sort((a, b) => a.distance - b.distance);
64
+ const neighbors = dists.slice(0, k);
65
+ if (!neighbors.length)
66
+ return null;
67
+ const predicted = neighbors.reduce((sum, n) => sum + getMetricValue(n.creative, metric), 0) / neighbors.length;
68
+ // Leave-one-out 风格的 rank 计算:对每条素材都做一次 KNN(排除自身),
69
+ // 得到全体预测分布,再看 neighbor[0] 在分布里的位置作为相对排名信号。
70
+ const allPredictions = items.map((item) => {
71
+ const others = items.filter((o) => o !== item);
72
+ const d = others.map((o) => ({
73
+ dist: weightedHamming(item.tags, o.tags, weights),
74
+ val: getMetricValue(o, metric),
75
+ }));
76
+ d.sort((a, b) => a.dist - b.dist);
77
+ return d.slice(0, k).reduce((s, x) => s + x.val, 0) / k;
78
+ });
79
+ const higherIsBetter = METRIC_CONFIG[metric].higherIsBetter;
80
+ const sortedPreds = [...allPredictions].sort((a, b) => (higherIsBetter ? b - a : a - b));
81
+ const rank = sortedPreds.indexOf(allPredictions[items.indexOf(neighbors[0]?.creative)]) + 1;
82
+ return { predicted: Math.round(predicted * 100) / 100, neighbors, rank };
83
+ }
84
+ // ─── 改进建议(R1 单维优化) ────────────────────────────────────────────────
85
+ export function getImprovements(creative, channel, data, metric = 'ctr') {
86
+ const weights = getWeights(data, channel, metric);
87
+ const dimStats = data.dimValueStats[channel];
88
+ if (!Object.keys(weights).length || !dimStats)
89
+ return [];
90
+ const higherIsBetter = METRIC_CONFIG[metric].higherIsBetter;
91
+ const suggestions = [];
92
+ for (const dim of MAPPABLE_TAGS) {
93
+ const currentVal = creative.tags[dim];
94
+ const stats = dimStats[dim];
95
+ if (!stats)
96
+ continue;
97
+ const currentAvg = currentVal && stats[currentVal] ? getStatValue(stats[currentVal], metric) : getMetricValue(creative, metric);
98
+ const currentN = currentVal && stats[currentVal] ? stats[currentVal].count : 0;
99
+ let bestVal = '';
100
+ let bestAvg = higherIsBetter ? -Infinity : Infinity;
101
+ let bestN = 0;
102
+ for (const [val, s] of Object.entries(stats)) {
103
+ if (val === currentVal)
104
+ continue;
105
+ const v = getStatValue(s, metric);
106
+ const isBetter = higherIsBetter ? v > bestAvg : v < bestAvg;
107
+ if (isBetter) {
108
+ bestAvg = v;
109
+ bestVal = val;
110
+ bestN = s.count;
111
+ }
112
+ }
113
+ const improved = higherIsBetter ? bestAvg > currentAvg : bestAvg < currentAvg;
114
+ if (!bestVal || !improved)
115
+ continue;
116
+ suggestions.push({
117
+ dimension: dim,
118
+ currentValue: currentVal,
119
+ suggestedValue: bestVal,
120
+ omega2: weights[dim] ?? 0,
121
+ currentAvg,
122
+ suggestedAvg: bestAvg,
123
+ delta: Math.round((bestAvg - currentAvg) * 100) / 100,
124
+ sampleSize: { from: currentN, to: bestN },
125
+ });
126
+ }
127
+ suggestions.sort((a, b) => {
128
+ const scoreA = a.omega2 * Math.abs(a.delta);
129
+ const scoreB = b.omega2 * Math.abs(b.delta);
130
+ return scoreB - scoreA;
131
+ });
132
+ return suggestions;
133
+ }
134
+ // ─── Tag → Atom 映射 ──────────────────────────────────────────────────────
135
+ export function tagToAtom(tags, data) {
136
+ const atoms = {};
137
+ const slotMap = {
138
+ 玩法类型: 'gameplay_type',
139
+ 布局造型: 'layout_preset',
140
+ 包装方式: 'packaging',
141
+ 情感元素: 'emotion_elements',
142
+ 计分方式: 'scoring_mode',
143
+ 限时机制: 'time_limit',
144
+ };
145
+ for (const [tagDim, slotId] of Object.entries(slotMap)) {
146
+ const val = tags[tagDim];
147
+ if (val)
148
+ atoms[slotId] = val;
149
+ }
150
+ const bgMap = {
151
+ 公园: 'A lush park scene with benches and trees',
152
+ 咖啡厅: 'A cozy coffee shop interior',
153
+ 社区: 'A friendly community neighborhood',
154
+ 野餐: 'An outdoor picnic in a meadow',
155
+ 庭院: 'A peaceful courtyard garden',
156
+ 爆金币特效: 'Gold coin burst explosion effect',
157
+ };
158
+ if (tags['背景场景'] && bgMap[tags['背景场景']]) {
159
+ atoms['background'] = bgMap[tags['背景场景']];
160
+ }
161
+ const tileMap = {
162
+ 默认: 'Classic clean default tile style',
163
+ 卡通休闲: 'Cartoon casual cute tile design',
164
+ 暗黑: 'Dark gothic shadow tile style',
165
+ 金块: 'Golden nugget tile texture',
166
+ 花色: 'Floral flower pattern tile',
167
+ 原皮: 'Original raw skin tile',
168
+ };
169
+ if (tags['牌面风格'] && tileMap[tags['牌面风格']]) {
170
+ atoms['tiles'] = tileMap[tags['牌面风格']];
171
+ }
172
+ for (const slot of data.atomSlots) {
173
+ if (slot.kind === 'parametric' && slot.range && !atoms[slot.id]) {
174
+ atoms[slot.id] = Math.round((slot.range.min + slot.range.max) / 2 / slot.range.step) * slot.range.step;
175
+ }
176
+ if (slot.kind === 'fixed' && slot.options && !atoms[slot.id]) {
177
+ atoms[slot.id] = slot.options[0];
178
+ }
179
+ }
180
+ return atoms;
181
+ }
182
+ // ─── 随机 Tag 组合 ────────────────────────────────────────────────────────
183
+ /**
184
+ * 对每个 mappable 维度从枚举值均匀随机取一个。
185
+ *
186
+ * @param data 数据快照
187
+ * @param rng 可选的 0~1 随机数生成器,默认为 Math.random;CLI 需要可复现时传入种子化 RNG
188
+ */
189
+ export function randomTags(data, rng = Math.random) {
190
+ const tags = {};
191
+ for (const dim of data.tagDimensions) {
192
+ if (!dim.mappable)
193
+ continue;
194
+ const vals = dim.values;
195
+ tags[dim.id] = vals[Math.floor(rng() * vals.length)].id;
196
+ }
197
+ return tags;
198
+ }
199
+ // ─── 相似 Creative 检索 ───────────────────────────────────────────────────
200
+ export function findSimilarCreatives(tags, channel, data, metric = 'ctr', topN = 5) {
201
+ const weights = getWeights(data, channel, metric);
202
+ const items = data.creatives.filter((c) => c.tags['投放渠道'] === channel);
203
+ if (!items.length)
204
+ return [];
205
+ return items
206
+ .map((c) => {
207
+ const distance = Object.keys(weights).length
208
+ ? weightedHamming(tags, c.tags, weights)
209
+ : uniformHamming(tags, c.tags);
210
+ const matchingDims = MAPPABLE_TAGS.filter((d) => tags[d] === c.tags[d] && tags[d] != null);
211
+ return { creative: c, distance, matchingDims };
212
+ })
213
+ .sort((a, b) => a.distance - b.distance)
214
+ .slice(0, topN);
215
+ }
216
+ // ─── 理论最优组合(堆扩展) ────────────────────────────────────────────────
217
+ export function generateOptimalCombinations(channel, data, metric, topK = 5) {
218
+ const weights = getWeights(data, channel, metric);
219
+ const dimStats = data.dimValueStats[channel];
220
+ if (!dimStats)
221
+ return [];
222
+ const cfg = METRIC_CONFIG[metric];
223
+ const statField = cfg.statField;
224
+ const higherIsBetter = cfg.higherIsBetter;
225
+ const dimRanked = {};
226
+ for (const dim of MAPPABLE_TAGS) {
227
+ const stats = dimStats[dim];
228
+ if (!stats)
229
+ continue;
230
+ dimRanked[dim] = Object.entries(stats)
231
+ .map(([val, s]) => ({ value: val, avg: s[statField] ?? 0 }))
232
+ .filter((e) => e.avg !== 0 || Object.keys(stats).length <= 1)
233
+ .sort((a, b) => (higherIsBetter ? b.avg - a.avg : a.avg - b.avg));
234
+ }
235
+ const dims = MAPPABLE_TAGS.filter((d) => dimRanked[d]?.length > 0);
236
+ if (!dims.length)
237
+ return [];
238
+ const score = (tags) => {
239
+ let s = 0;
240
+ for (const d of dims) {
241
+ const w = weights[d] ?? 0.01;
242
+ const entry = dimRanked[d].find((e) => e.value === tags[d]);
243
+ if (entry)
244
+ s += w * entry.avg;
245
+ }
246
+ return s;
247
+ };
248
+ const key = (tags) => dims.map((d) => tags[d] ?? '').join('|');
249
+ const seen = new Set();
250
+ const heap = [];
251
+ const results = [];
252
+ const best = {};
253
+ for (const d of dims)
254
+ best[d] = dimRanked[d][0].value;
255
+ const bestKey = key(best);
256
+ seen.add(bestKey);
257
+ heap.push({ tags: best, score: score(best) });
258
+ while (results.length < topK && heap.length > 0) {
259
+ heap.sort((a, b) => (higherIsBetter ? b.score - a.score : a.score - b.score));
260
+ const top = heap.shift();
261
+ results.push({
262
+ tags: top.tags,
263
+ score: top.score,
264
+ perDim: dims.map((d) => ({
265
+ dim: d,
266
+ value: top.tags[d],
267
+ metricAvg: dimRanked[d].find((e) => e.value === top.tags[d])?.avg ?? 0,
268
+ omega2: weights[d] ?? 0,
269
+ })),
270
+ });
271
+ for (const d of dims) {
272
+ const curIdx = dimRanked[d].findIndex((e) => e.value === top.tags[d]);
273
+ if (curIdx >= 0 && curIdx < dimRanked[d].length - 1) {
274
+ const next = { ...top.tags, [d]: dimRanked[d][curIdx + 1].value };
275
+ const k = key(next);
276
+ if (!seen.has(k)) {
277
+ seen.add(k);
278
+ heap.push({ tags: next, score: score(next) });
279
+ }
280
+ }
281
+ }
282
+ }
283
+ return results;
284
+ }
285
+ //# sourceMappingURL=algorithms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../src/recommend/algorithms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Recommend HTTP API 的 Request / Response 协议定义。
3
+ *
4
+ * 同一组接口同时挂在两个路径前缀上(实现见 backend RecommendModule):
5
+ * - /api/recommend/* (UI 用,session 鉴权)
6
+ * - /api/agent/tools/recommend-* (CLI/Agent 用,sandbox token 鉴权)
7
+ *
8
+ * 两套路径共享本文件定义的 DTO,以保证前后端 + CLI 三方协议一致。
9
+ */
10
+ import type { AtomSlot, Channel, Creative, ImprovementSuggestion, KnnResult, MappingRule, Metric, OptimalCombination, RecommendData, SimilarCreativeItem, TagDimension } from './types.js';
11
+ /**
12
+ * 返回完整推荐数据快照。前端首屏一次性拉取,本地内存缓存。
13
+ *
14
+ * 响应结构与 RecommendData 完全一致,加 `version` 便于前端判断是否需要刷新。
15
+ */
16
+ export type GetRecommendDataResponse = RecommendData & {
17
+ /** 数据版本号,目前为 backend 启动时计算的 hash;数据不变时保持稳定 */
18
+ version: string;
19
+ };
20
+ export type SimilarRequest = {
21
+ channel: Channel;
22
+ metric: Metric;
23
+ /** 二选一:从 creativeId 取 tags,或直接传 tags */
24
+ creativeId?: string;
25
+ tags?: Record<string, string | null>;
26
+ /** Top-N 相似 Creative,默认 5 */
27
+ topN?: number;
28
+ /** KNN 的 k,默认 5 */
29
+ k?: number;
30
+ /** 是否返回 KNN 预估,默认 true */
31
+ includeKnn?: boolean;
32
+ /** 是否对每个相似项算 atoms,默认 false (省 payload) */
33
+ includeAtoms?: boolean;
34
+ };
35
+ export type SimilarResponseItem = SimilarCreativeItem & {
36
+ atoms?: Record<string, string | number>;
37
+ };
38
+ export type SimilarResponse = {
39
+ similar: SimilarResponseItem[];
40
+ knn: KnnResult | null;
41
+ };
42
+ export type ImprovementsRequest = {
43
+ channel: Channel;
44
+ metric: Metric;
45
+ /** 必填:被分析的素材 id */
46
+ r1Id: string;
47
+ /** 可选:对照标杆素材 id;提供时响应里加 `tagDiffs` 字段 */
48
+ r2Id?: string;
49
+ };
50
+ export type TagDiffEntry = {
51
+ dim: string;
52
+ from: string | null;
53
+ to: string | null;
54
+ changed: boolean;
55
+ };
56
+ export type ImprovementsResponse = {
57
+ r1: Creative;
58
+ r2: Creative | null;
59
+ /** 仅当 r2Id 提供时返回 */
60
+ tagDiffs: TagDiffEntry[] | null;
61
+ /** R1 的逐维改进建议(从 dimValueStats 推导,与 r2 无关) */
62
+ improvements: ImprovementSuggestion[];
63
+ };
64
+ export type RandomRequest = {
65
+ channel: Channel;
66
+ metric: Metric;
67
+ /** 批量数量,默认 10,上限 100 */
68
+ batchSize?: number;
69
+ /** 每条结果附带的相似 Creative 数量,默认 5 */
70
+ similarTopN?: number;
71
+ /** 是否对每条结果算 atoms,默认 true */
72
+ includeAtoms?: boolean;
73
+ /** 随机种子(可选);提供时结果可复现 */
74
+ seed?: number;
75
+ };
76
+ export type RandomComboItem = {
77
+ tags: Record<string, string | null>;
78
+ atoms?: Record<string, string | number>;
79
+ knn: KnnResult | null;
80
+ similar: SimilarCreativeItem[];
81
+ };
82
+ export type RandomResponse = {
83
+ /** 已按预估指标排序(higherIsBetter=true 时降序) */
84
+ combos: RandomComboItem[];
85
+ };
86
+ export type OptimalRequest = {
87
+ channel: Channel;
88
+ metric: Metric;
89
+ /** Top-K 理论最优组合,默认 5 */
90
+ topK?: number;
91
+ /** 是否对每条结果附带 atoms 配置(避免前端逐条往返调 tag-to-atom),默认 false */
92
+ includeAtoms?: boolean;
93
+ };
94
+ export type OptimalCombinationItem = OptimalCombination & {
95
+ atoms?: Record<string, string | number>;
96
+ };
97
+ export type OptimalResponse = {
98
+ optimal: OptimalCombinationItem[];
99
+ };
100
+ export type TagToAtomRequest = {
101
+ tags: Record<string, string | null>;
102
+ };
103
+ export type TagToAtomResponse = {
104
+ atoms: Record<string, string | number>;
105
+ };
106
+ /**
107
+ * 列出当前数据快照里包含的渠道 / 指标 / 标签维度,
108
+ * 便于 CLI 在不下载完整数据时也能做参数补全。
109
+ */
110
+ export type RecommendMetaResponse = {
111
+ version: string;
112
+ channels: Channel[];
113
+ metrics: Metric[];
114
+ tagDimensions: TagDimension[];
115
+ atomSlots: AtomSlot[];
116
+ mappingRules: MappingRule[];
117
+ creativeCount: number;
118
+ };
119
+ //# sourceMappingURL=api-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../../src/recommend/api-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Recommend HTTP API 的 Request / Response 协议定义。
3
+ *
4
+ * 同一组接口同时挂在两个路径前缀上(实现见 backend RecommendModule):
5
+ * - /api/recommend/* (UI 用,session 鉴权)
6
+ * - /api/agent/tools/recommend-* (CLI/Agent 用,sandbox token 鉴权)
7
+ *
8
+ * 两套路径共享本文件定义的 DTO,以保证前后端 + CLI 三方协议一致。
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=api-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-types.js","sourceRoot":"","sources":["../../src/recommend/api-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './api-types.js';
3
+ export * from './algorithms.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recommend/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export * from './api-types.js';
3
+ export * from './algorithms.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recommend/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Recommend 模块共享数据 schema。
3
+ *
4
+ * 本文件由 packages/frontend/src/lib/recommend/types.ts 整体迁移而来,
5
+ * 作为前端 / 后端 / CLI 三方共享的唯一定义来源。
6
+ *
7
+ * 任何字段调整必须同步评审三个调用方:
8
+ * - packages/backend/src/features/recommend/*
9
+ * - packages/frontend/src/app/(dashboard)/recommend/*
10
+ * - packages/cli/src/commands/recommend.ts
11
+ */
12
+ export type AtomSlot = {
13
+ id: string;
14
+ label: {
15
+ zh: string;
16
+ en: string;
17
+ };
18
+ kind: 'fixed' | 'parametric' | 'generative';
19
+ options?: string[];
20
+ range?: {
21
+ min: number;
22
+ max: number;
23
+ step: number;
24
+ };
25
+ assetKind?: string;
26
+ constraints?: {
27
+ width: number;
28
+ height: number;
29
+ };
30
+ };
31
+ export type TagValue = {
32
+ id: string;
33
+ label: {
34
+ zh: string;
35
+ en: string;
36
+ };
37
+ };
38
+ export type TagDimension = {
39
+ id: string;
40
+ label: {
41
+ zh: string;
42
+ en: string;
43
+ };
44
+ cardinality: string;
45
+ mappable: boolean;
46
+ values: TagValue[];
47
+ };
48
+ export type MappingRule = {
49
+ id: string;
50
+ slot: string;
51
+ when: string;
52
+ mapping?: {
53
+ dimension: string;
54
+ passthrough: boolean;
55
+ };
56
+ containsAny?: {
57
+ tokens: string[];
58
+ tag: {
59
+ dimension: string;
60
+ value: string;
61
+ };
62
+ }[];
63
+ };
64
+ export type Creative = {
65
+ id: string;
66
+ ctr: number;
67
+ cvr: number;
68
+ cpi: number;
69
+ ipm: number;
70
+ cost: number;
71
+ installs: number;
72
+ impressions: number;
73
+ clicks: number;
74
+ tags: Record<string, string | null>;
75
+ };
76
+ export type DimValueStat = {
77
+ count: number;
78
+ avgCtr: number;
79
+ avgCvr: number;
80
+ avgCpi: number;
81
+ avgIpm: number;
82
+ avgCost: number;
83
+ avgInstalls: number;
84
+ };
85
+ export type ChannelStats = {
86
+ count: number;
87
+ avgCtr: number;
88
+ medianCtr: number;
89
+ avgCvr: number;
90
+ avgCpi: number;
91
+ avgIpm: number;
92
+ avgCost: number;
93
+ avgInstalls: number;
94
+ };
95
+ export type RecommendData = {
96
+ atomSlots: AtomSlot[];
97
+ tagDimensions: TagDimension[];
98
+ mappingRules: MappingRule[];
99
+ creatives: Creative[];
100
+ channelWeights: Record<string, Record<string, Record<string, number>>>;
101
+ channelStats: Record<string, ChannelStats>;
102
+ dimValueStats: Record<string, Record<string, Record<string, DimValueStat>>>;
103
+ };
104
+ export declare const MAPPABLE_TAGS: readonly ["玩法类型", "布局造型", "包装方式", "背景场景", "情感元素", "计分方式", "限时机制", "牌面风格"];
105
+ export type MappableTag = (typeof MAPPABLE_TAGS)[number];
106
+ export declare const CHANNELS: readonly ["Applovin", "Facebook", "Google", "Moloco", "Unity"];
107
+ export type Channel = (typeof CHANNELS)[number];
108
+ export declare const METRICS: readonly ["ctr", "cvr", "cpi", "ipm", "cost", "installs"];
109
+ export type Metric = (typeof METRICS)[number];
110
+ export declare const METRIC_CONFIG: Record<Metric, {
111
+ label: string;
112
+ unit: string;
113
+ higherIsBetter: boolean;
114
+ field: keyof Creative;
115
+ statField: keyof DimValueStat;
116
+ }>;
117
+ export declare function formatMetricValue(value: number | undefined | null, metric: Metric): string;
118
+ export type KnnResult = {
119
+ predicted: number;
120
+ neighbors: {
121
+ creative: Creative;
122
+ distance: number;
123
+ }[];
124
+ rank: number;
125
+ };
126
+ export type ImprovementSuggestion = {
127
+ dimension: MappableTag;
128
+ currentValue: string | null;
129
+ suggestedValue: string;
130
+ omega2: number;
131
+ currentAvg: number;
132
+ suggestedAvg: number;
133
+ delta: number;
134
+ sampleSize: {
135
+ from: number;
136
+ to: number;
137
+ };
138
+ };
139
+ export type SimilarCreativeItem = {
140
+ creative: Creative;
141
+ distance: number;
142
+ matchingDims: string[];
143
+ };
144
+ export type OptimalCombination = {
145
+ tags: Record<string, string>;
146
+ score: number;
147
+ perDim: {
148
+ dim: string;
149
+ value: string;
150
+ metricAvg: number;
151
+ omega2: number;
152
+ }[];
153
+ };
154
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/recommend/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Recommend 模块共享数据 schema。
3
+ *
4
+ * 本文件由 packages/frontend/src/lib/recommend/types.ts 整体迁移而来,
5
+ * 作为前端 / 后端 / CLI 三方共享的唯一定义来源。
6
+ *
7
+ * 任何字段调整必须同步评审三个调用方:
8
+ * - packages/backend/src/features/recommend/*
9
+ * - packages/frontend/src/app/(dashboard)/recommend/*
10
+ * - packages/cli/src/commands/recommend.ts
11
+ */
12
+ export const MAPPABLE_TAGS = [
13
+ '玩法类型',
14
+ '布局造型',
15
+ '包装方式',
16
+ '背景场景',
17
+ '情感元素',
18
+ '计分方式',
19
+ '限时机制',
20
+ '牌面风格',
21
+ ];
22
+ export const CHANNELS = ['Applovin', 'Facebook', 'Google', 'Moloco', 'Unity'];
23
+ export const METRICS = ['ctr', 'cvr', 'cpi', 'ipm', 'cost', 'installs'];
24
+ export const METRIC_CONFIG = {
25
+ ctr: { label: 'CTR', unit: '%', higherIsBetter: true, field: 'ctr', statField: 'avgCtr' },
26
+ cvr: { label: 'CVR', unit: '%', higherIsBetter: true, field: 'cvr', statField: 'avgCvr' },
27
+ cpi: { label: 'CPI', unit: '$', higherIsBetter: false, field: 'cpi', statField: 'avgCpi' },
28
+ ipm: { label: 'IPM', unit: '', higherIsBetter: true, field: 'ipm', statField: 'avgIpm' },
29
+ cost: { label: 'Cost', unit: '$', higherIsBetter: false, field: 'cost', statField: 'avgCost' },
30
+ installs: { label: 'Installs', unit: '', higherIsBetter: true, field: 'installs', statField: 'avgInstalls' },
31
+ };
32
+ export function formatMetricValue(value, metric) {
33
+ const v = value ?? 0;
34
+ const cfg = METRIC_CONFIG[metric];
35
+ if (cfg.unit === '$')
36
+ return `$${v.toFixed(2)}`;
37
+ if (cfg.unit === '%')
38
+ return `${v.toFixed(1)}%`;
39
+ if (Math.abs(v) >= 1000)
40
+ return `${(v / 1000).toFixed(1)}k`;
41
+ return v.toFixed(1);
42
+ }
43
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recommend/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6EH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAGvF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAGjF,MAAM,CAAC,MAAM,aAAa,GAStB;IACF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACzF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACzF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC1F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACxF,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE;IAC9F,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE;CAC7G,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,KAAgC,EAAE,MAAc;IAChF,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/common",
3
- "version": "0.0.19",
3
+ "version": "0.0.21",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -64,6 +64,10 @@
64
64
  "./search": {
65
65
  "types": "./dist/search/index.d.ts",
66
66
  "default": "./dist/search/index.js"
67
+ },
68
+ "./recommend": {
69
+ "types": "./dist/recommend/index.d.ts",
70
+ "default": "./dist/recommend/index.js"
67
71
  }
68
72
  },
69
73
  "files": [