2026-08-31 09:40:52 +08:00
|
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 将唐用户智趣体验通道更新为推荐配置(103 生产库)
|
|
|
|
|
|
* 默认 dry-run;--apply 才写入 h5_wechat_cursor_executor_config
|
|
|
|
|
|
*
|
|
|
|
|
|
* Usage:
|
|
|
|
|
|
* node scripts/apply-tang-cursor-config-103.mjs
|
|
|
|
|
|
* node scripts/apply-tang-cursor-config-103.mjs --apply
|
2026-08-31 09:55:06 +08:00
|
|
|
|
* node scripts/apply-tang-cursor-config-103.mjs --apply --enable-chat-bridge
|
2026-08-31 09:40:52 +08:00
|
|
|
|
*/
|
|
|
|
|
|
import process from 'node:process';
|
|
|
|
|
|
import { execSync } from 'node:child_process';
|
|
|
|
|
|
import mysql from 'mysql2/promise';
|
|
|
|
|
|
import {
|
|
|
|
|
|
CURSOR_CHANNEL_FEATURES,
|
|
|
|
|
|
defaultCursorChannelFeatures,
|
|
|
|
|
|
intentAllowlistFromFeatures,
|
|
|
|
|
|
} from '../cursor-channel-features.mjs';
|
|
|
|
|
|
|
|
|
|
|
|
const TANG = 'a70ff537-8908-486e-9b6c-042e07cc25db';
|
|
|
|
|
|
|
|
|
|
|
|
const RECOMMENDED = {
|
|
|
|
|
|
enabled: true,
|
|
|
|
|
|
userAllowlist: [TANG],
|
|
|
|
|
|
channelAllowlist: ['h5', 'wechat_mp'],
|
|
|
|
|
|
features: {
|
|
|
|
|
|
...defaultCursorChannelFeatures(),
|
|
|
|
|
|
[CURSOR_CHANNEL_FEATURES.PAGE_GENERATE]: { enabled: true },
|
|
|
|
|
|
[CURSOR_CHANNEL_FEATURES.PAGE_DATA]: { enabled: true },
|
|
|
|
|
|
[CURSOR_CHANNEL_FEATURES.EXCEL_ANALYSIS]: { enabled: false },
|
|
|
|
|
|
[CURSOR_CHANNEL_FEATURES.CHAT_BRIDGE]: { enabled: false },
|
|
|
|
|
|
[CURSOR_CHANNEL_FEATURES.SCHEDULED_TASKS]: { enabled: true },
|
|
|
|
|
|
},
|
|
|
|
|
|
fallbackToDeepseek: true,
|
|
|
|
|
|
meta: { notes: '唐用户 Cursor 灰度 — 页面+问卷+定时任务' },
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
RECOMMENDED.intentAllowlist = intentAllowlistFromFeatures(RECOMMENDED.features);
|
|
|
|
|
|
|
|
|
|
|
|
async function main() {
|
|
|
|
|
|
const apply = process.argv.includes('--apply');
|
2026-08-31 09:55:06 +08:00
|
|
|
|
const enableChatBridge = process.argv.includes('--enable-chat-bridge');
|
2026-08-31 09:40:52 +08:00
|
|
|
|
const databaseUrl = execSync(
|
|
|
|
|
|
"ssh -o BatchMode=yes -o ConnectTimeout=8 john@58.38.22.103 \"grep '^DATABASE_URL=' /Users/john/Project/Memind/.env | cut -d= -f2-\"",
|
|
|
|
|
|
{ encoding: 'utf8' },
|
|
|
|
|
|
).trim();
|
|
|
|
|
|
const pool = mysql.createPool({ uri: databaseUrl, connectionLimit: 2 });
|
|
|
|
|
|
const now = Date.now();
|
|
|
|
|
|
|
|
|
|
|
|
const [before] = await pool.query(
|
|
|
|
|
|
'SELECT config_json FROM h5_wechat_cursor_executor_config WHERE config_scope = ? LIMIT 1',
|
|
|
|
|
|
['global'],
|
|
|
|
|
|
);
|
2026-08-31 09:55:06 +08:00
|
|
|
|
const target = {
|
|
|
|
|
|
...RECOMMENDED,
|
|
|
|
|
|
features: {
|
|
|
|
|
|
...RECOMMENDED.features,
|
|
|
|
|
|
...(enableChatBridge
|
|
|
|
|
|
? { [CURSOR_CHANNEL_FEATURES.CHAT_BRIDGE]: { enabled: true } }
|
|
|
|
|
|
: {}),
|
|
|
|
|
|
},
|
|
|
|
|
|
};
|
|
|
|
|
|
target.intentAllowlist = intentAllowlistFromFeatures(target.features);
|
|
|
|
|
|
if (enableChatBridge) {
|
|
|
|
|
|
target.meta = { ...target.meta, notes: '唐用户 Cursor 灰度 — 页面+问卷+定时任务+聊天 Bridge' };
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-31 09:40:52 +08:00
|
|
|
|
console.log('--- before ---');
|
|
|
|
|
|
console.log(JSON.stringify(before[0]?.config_json ?? null, null, 2));
|
|
|
|
|
|
console.log('--- target ---');
|
2026-08-31 09:55:06 +08:00
|
|
|
|
console.log(JSON.stringify(target, null, 2));
|
2026-08-31 09:40:52 +08:00
|
|
|
|
|
|
|
|
|
|
if (!apply) {
|
|
|
|
|
|
console.log('\n(dry-run) 追加 --apply 写入生产库');
|
|
|
|
|
|
await pool.end();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
await pool.query(
|
|
|
|
|
|
`INSERT INTO h5_wechat_cursor_executor_config
|
|
|
|
|
|
(config_scope, config_json, updated_by, updated_at)
|
|
|
|
|
|
VALUES ('global', ?, NULL, ?)
|
|
|
|
|
|
ON DUPLICATE KEY UPDATE
|
|
|
|
|
|
config_json = VALUES(config_json),
|
|
|
|
|
|
updated_at = VALUES(updated_at)`,
|
2026-08-31 09:55:06 +08:00
|
|
|
|
[JSON.stringify(target), now],
|
2026-08-31 09:40:52 +08:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const [after] = await pool.query(
|
|
|
|
|
|
'SELECT config_json, updated_at FROM h5_wechat_cursor_executor_config WHERE config_scope = ? LIMIT 1',
|
|
|
|
|
|
['global'],
|
|
|
|
|
|
);
|
|
|
|
|
|
console.log('\n--- applied ---');
|
|
|
|
|
|
console.log(JSON.stringify(after[0] ?? null, null, 2));
|
|
|
|
|
|
await pool.end();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main().catch((err) => {
|
|
|
|
|
|
console.error(err);
|
|
|
|
|
|
process.exit(1);
|
|
|
|
|
|
});
|