kevlar-4u 1.0.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.
- package/README.md +357 -0
- package/config/mcp-config.json +9 -0
- package/dist/__tests__/configureWizard.test.d.ts +2 -0
- package/dist/__tests__/configureWizard.test.d.ts.map +1 -0
- package/dist/__tests__/configureWizard.test.js +89 -0
- package/dist/__tests__/configureWizard.test.js.map +1 -0
- package/dist/__tests__/createPersonaTool.test.d.ts +2 -0
- package/dist/__tests__/createPersonaTool.test.d.ts.map +1 -0
- package/dist/__tests__/createPersonaTool.test.js +292 -0
- package/dist/__tests__/createPersonaTool.test.js.map +1 -0
- package/dist/__tests__/createPersonaWizard.test.d.ts +2 -0
- package/dist/__tests__/createPersonaWizard.test.d.ts.map +1 -0
- package/dist/__tests__/createPersonaWizard.test.js +138 -0
- package/dist/__tests__/createPersonaWizard.test.js.map +1 -0
- package/dist/__tests__/deletePersonaWizard.test.d.ts +2 -0
- package/dist/__tests__/deletePersonaWizard.test.d.ts.map +1 -0
- package/dist/__tests__/deletePersonaWizard.test.js +78 -0
- package/dist/__tests__/deletePersonaWizard.test.js.map +1 -0
- package/dist/__tests__/e2e.test.d.ts +2 -0
- package/dist/__tests__/e2e.test.d.ts.map +1 -0
- package/dist/__tests__/e2e.test.js +121 -0
- package/dist/__tests__/e2e.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +86 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/execution.test.d.ts +2 -0
- package/dist/__tests__/execution.test.d.ts.map +1 -0
- package/dist/__tests__/execution.test.js +792 -0
- package/dist/__tests__/execution.test.js.map +1 -0
- package/dist/__tests__/getModesTool.test.d.ts +2 -0
- package/dist/__tests__/getModesTool.test.d.ts.map +1 -0
- package/dist/__tests__/getModesTool.test.js +47 -0
- package/dist/__tests__/getModesTool.test.js.map +1 -0
- package/dist/__tests__/helpTool.test.d.ts +2 -0
- package/dist/__tests__/helpTool.test.d.ts.map +1 -0
- package/dist/__tests__/helpTool.test.js +18 -0
- package/dist/__tests__/helpTool.test.js.map +1 -0
- package/dist/__tests__/listPersonasTool.test.d.ts +2 -0
- package/dist/__tests__/listPersonasTool.test.d.ts.map +1 -0
- package/dist/__tests__/listPersonasTool.test.js +110 -0
- package/dist/__tests__/listPersonasTool.test.js.map +1 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +56 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/observability.test.d.ts +2 -0
- package/dist/__tests__/observability.test.d.ts.map +1 -0
- package/dist/__tests__/observability.test.js +60 -0
- package/dist/__tests__/observability.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +2 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +259 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- package/dist/__tests__/persona_creation_debug.test.d.ts +2 -0
- package/dist/__tests__/persona_creation_debug.test.d.ts.map +1 -0
- package/dist/__tests__/persona_creation_debug.test.js +56 -0
- package/dist/__tests__/persona_creation_debug.test.js.map +1 -0
- package/dist/__tests__/resetPersonasWizard.test.d.ts +2 -0
- package/dist/__tests__/resetPersonasWizard.test.d.ts.map +1 -0
- package/dist/__tests__/resetPersonasWizard.test.js +74 -0
- package/dist/__tests__/resetPersonasWizard.test.js.map +1 -0
- package/dist/__tests__/reviewContentWizard.test.d.ts +2 -0
- package/dist/__tests__/reviewContentWizard.test.d.ts.map +1 -0
- package/dist/__tests__/reviewContentWizard.test.js +148 -0
- package/dist/__tests__/reviewContentWizard.test.js.map +1 -0
- package/dist/__tests__/sanitize.test.d.ts +2 -0
- package/dist/__tests__/sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/sanitize.test.js +138 -0
- package/dist/__tests__/sanitize.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +49 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/execution/aggregator.d.ts +43 -0
- package/dist/execution/aggregator.d.ts.map +1 -0
- package/dist/execution/aggregator.js +132 -0
- package/dist/execution/aggregator.js.map +1 -0
- package/dist/execution/base.d.ts +62 -0
- package/dist/execution/base.d.ts.map +1 -0
- package/dist/execution/base.js +5 -0
- package/dist/execution/base.js.map +1 -0
- package/dist/execution/client.d.ts +9 -0
- package/dist/execution/client.d.ts.map +1 -0
- package/dist/execution/client.js +30 -0
- package/dist/execution/client.js.map +1 -0
- package/dist/execution/config.d.ts +30 -0
- package/dist/execution/config.d.ts.map +1 -0
- package/dist/execution/config.js +95 -0
- package/dist/execution/config.js.map +1 -0
- package/dist/execution/index.d.ts +19 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +151 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/limiter.d.ts +32 -0
- package/dist/execution/limiter.d.ts.map +1 -0
- package/dist/execution/limiter.js +147 -0
- package/dist/execution/limiter.js.map +1 -0
- package/dist/execution/lock.d.ts +17 -0
- package/dist/execution/lock.d.ts.map +1 -0
- package/dist/execution/lock.js +37 -0
- package/dist/execution/lock.js.map +1 -0
- package/dist/execution/modes/direct_api.d.ts +11 -0
- package/dist/execution/modes/direct_api.d.ts.map +1 -0
- package/dist/execution/modes/direct_api.js +213 -0
- package/dist/execution/modes/direct_api.js.map +1 -0
- package/dist/execution/modes/index.d.ts +7 -0
- package/dist/execution/modes/index.d.ts.map +1 -0
- package/dist/execution/modes/index.js +7 -0
- package/dist/execution/modes/index.js.map +1 -0
- package/dist/execution/modes/orchestration.d.ts +11 -0
- package/dist/execution/modes/orchestration.d.ts.map +1 -0
- package/dist/execution/modes/orchestration.js +110 -0
- package/dist/execution/modes/orchestration.js.map +1 -0
- package/dist/execution/modes/sampling.d.ts +9 -0
- package/dist/execution/modes/sampling.d.ts.map +1 -0
- package/dist/execution/modes/sampling.js +66 -0
- package/dist/execution/modes/sampling.js.map +1 -0
- package/dist/execution/parallel.d.ts +16 -0
- package/dist/execution/parallel.d.ts.map +1 -0
- package/dist/execution/parallel.js +90 -0
- package/dist/execution/parallel.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/reviewDispatcherPrompt.d.ts +2 -0
- package/dist/prompts/reviewDispatcherPrompt.d.ts.map +1 -0
- package/dist/prompts/reviewDispatcherPrompt.js +67 -0
- package/dist/prompts/reviewDispatcherPrompt.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +156 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/configureTool.d.ts +17 -0
- package/dist/tools/configureTool.d.ts.map +1 -0
- package/dist/tools/configureTool.js +104 -0
- package/dist/tools/configureTool.js.map +1 -0
- package/dist/tools/configureWizardTool.d.ts +11 -0
- package/dist/tools/configureWizardTool.d.ts.map +1 -0
- package/dist/tools/configureWizardTool.js +205 -0
- package/dist/tools/configureWizardTool.js.map +1 -0
- package/dist/tools/createPersonaTool.d.ts +37 -0
- package/dist/tools/createPersonaTool.d.ts.map +1 -0
- package/dist/tools/createPersonaTool.js +353 -0
- package/dist/tools/createPersonaTool.js.map +1 -0
- package/dist/tools/createPersonaWizardTool.d.ts +13 -0
- package/dist/tools/createPersonaWizardTool.d.ts.map +1 -0
- package/dist/tools/createPersonaWizardTool.js +713 -0
- package/dist/tools/createPersonaWizardTool.js.map +1 -0
- package/dist/tools/deletePersonaTool.d.ts +10 -0
- package/dist/tools/deletePersonaTool.d.ts.map +1 -0
- package/dist/tools/deletePersonaTool.js +75 -0
- package/dist/tools/deletePersonaTool.js.map +1 -0
- package/dist/tools/deletePersonaWizardTool.d.ts +11 -0
- package/dist/tools/deletePersonaWizardTool.d.ts.map +1 -0
- package/dist/tools/deletePersonaWizardTool.js +184 -0
- package/dist/tools/deletePersonaWizardTool.js.map +1 -0
- package/dist/tools/getModesTool.d.ts +12 -0
- package/dist/tools/getModesTool.d.ts.map +1 -0
- package/dist/tools/getModesTool.js +78 -0
- package/dist/tools/getModesTool.js.map +1 -0
- package/dist/tools/helpTool.d.ts +7 -0
- package/dist/tools/helpTool.d.ts.map +1 -0
- package/dist/tools/helpTool.js +65 -0
- package/dist/tools/helpTool.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +30 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listPersonasTool.d.ts +7 -0
- package/dist/tools/listPersonasTool.d.ts.map +1 -0
- package/dist/tools/listPersonasTool.js +118 -0
- package/dist/tools/listPersonasTool.js.map +1 -0
- package/dist/tools/resetPersonasTool.d.ts +7 -0
- package/dist/tools/resetPersonasTool.d.ts.map +1 -0
- package/dist/tools/resetPersonasTool.js +447 -0
- package/dist/tools/resetPersonasTool.js.map +1 -0
- package/dist/tools/resetPersonasWizardTool.d.ts +9 -0
- package/dist/tools/resetPersonasWizardTool.d.ts.map +1 -0
- package/dist/tools/resetPersonasWizardTool.js +125 -0
- package/dist/tools/resetPersonasWizardTool.js.map +1 -0
- package/dist/tools/reviewContentWizardTool.d.ts +13 -0
- package/dist/tools/reviewContentWizardTool.d.ts.map +1 -0
- package/dist/tools/reviewContentWizardTool.js +411 -0
- package/dist/tools/reviewContentWizardTool.js.map +1 -0
- package/dist/tools/reviewTool.d.ts +10 -0
- package/dist/tools/reviewTool.d.ts.map +1 -0
- package/dist/tools/reviewTool.js +133 -0
- package/dist/tools/reviewTool.js.map +1 -0
- package/dist/tools/types.d.ts +14 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/errors.d.ts +30 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +47 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/observability.d.ts +61 -0
- package/dist/utils/observability.d.ts.map +1 -0
- package/dist/utils/observability.js +69 -0
- package/dist/utils/observability.js.map +1 -0
- package/dist/utils/parser.d.ts +27 -0
- package/dist/utils/parser.d.ts.map +1 -0
- package/dist/utils/parser.js +178 -0
- package/dist/utils/parser.js.map +1 -0
- package/dist/utils/personaIdMaps.d.ts +7 -0
- package/dist/utils/personaIdMaps.d.ts.map +1 -0
- package/dist/utils/personaIdMaps.js +51 -0
- package/dist/utils/personaIdMaps.js.map +1 -0
- package/dist/utils/sanitize.d.ts +4 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +49 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/types.d.ts +8 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +42 -0
- package/skills/_template.md +66 -0
- package/skills/tmp/wizard-create-cwzrrpim_draft.json +26 -0
- package/skills/tmp/wizard-create-cwzrrpim_wizard.json +26 -0
- package/skills/tmp/wizard-create-d81intme_draft.json +26 -0
- package/skills/tmp/wizard-create-d81intme_wizard.json +26 -0
- package/skills/tmp/wizard-create-g50jqzmh_draft.json +8 -0
- package/skills/tmp/wizard-create-g50jqzmh_wizard.json +8 -0
- package/skills/tmp/wizard-create-onupu9wb_draft.json +8 -0
- package/skills/tmp/wizard-create-onupu9wb_wizard.json +8 -0
- package/skills/tmp/wizard-review-fwbxe3d2_review_wizard.json +9 -0
- package/skills/tmp/wizard-review-sypg5e9d_review_wizard.json +9 -0
- package/skills/wechat_official/wechat_official.md +26 -0
- package/skills/wechat_official/wechat_official_1.md +31 -0
- package/skills/xiaohongshu/xiaohongshu.md +26 -0
- package/skills/xiaohongshu/xiaohongshu_1.md +29 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { promises as fsp, readdirSync } from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import { logger, getErrorInfo } from "./observability.js";
|
|
5
|
+
// ── Cache for loadAllPersonas ────────────────────────────────────────────────
|
|
6
|
+
let personasCache = null;
|
|
7
|
+
export function invalidatePersonasCache() {
|
|
8
|
+
personasCache = null;
|
|
9
|
+
}
|
|
10
|
+
// ── Path validation ──────────────────────────────────────────────────────────
|
|
11
|
+
export function validateWritePath(filePath, baseDir) {
|
|
12
|
+
const resolvedPath = path.resolve(filePath);
|
|
13
|
+
const resolvedBase = path.resolve(baseDir);
|
|
14
|
+
const relative = path.relative(resolvedBase, resolvedPath);
|
|
15
|
+
// Relative must not start with '..' (which means it escaped baseDir)
|
|
16
|
+
// and must not be empty (which means filePath === baseDir itself)
|
|
17
|
+
return !relative.startsWith("..") && relative !== "";
|
|
18
|
+
}
|
|
19
|
+
// ── Persona parsing ─────────────────────────────────────────────────────────
|
|
20
|
+
export async function parsePersonaFile(filePath) {
|
|
21
|
+
const fileName = path.basename(filePath);
|
|
22
|
+
if (fileName.startsWith("_")) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
let raw;
|
|
26
|
+
try {
|
|
27
|
+
raw = await fsp.readFile(filePath, "utf-8");
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
logger.warn("Failed to read persona file", { event: "file_read_error", path: filePath });
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = matter(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
logger.warn("Failed to parse persona file", {
|
|
39
|
+
event: "parse_error",
|
|
40
|
+
path: filePath,
|
|
41
|
+
error: getErrorInfo(err).code,
|
|
42
|
+
message: getErrorInfo(err).message,
|
|
43
|
+
});
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const data = parsed.data;
|
|
47
|
+
if (!data.id || !data.name) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const meta = {
|
|
51
|
+
id: String(data.id),
|
|
52
|
+
name: String(data.name || ""),
|
|
53
|
+
name_en: String(data.name_en || ""),
|
|
54
|
+
version: String(data.version || "1.0.0"),
|
|
55
|
+
author: String(data.author || "unknown"),
|
|
56
|
+
tags: Array.isArray(data.tags) ? data.tags.map(String) : [],
|
|
57
|
+
description: String(data.description || ""),
|
|
58
|
+
culturalContext: data.culturalContext ? String(data.culturalContext) : undefined,
|
|
59
|
+
authorRelation: data.authorRelation ? String(data.authorRelation) : undefined,
|
|
60
|
+
stance: data.stance ? String(data.stance) : undefined,
|
|
61
|
+
blindSpot: data.blindSpot ? String(data.blindSpot) : undefined,
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
meta,
|
|
65
|
+
systemPrompt: parsed.content.trim(),
|
|
66
|
+
filePath,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ── Directory existence check (async) ──────────────────────────────────────
|
|
70
|
+
async function ensureDirExists(dirPath) {
|
|
71
|
+
try {
|
|
72
|
+
await fsp.access(dirPath);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ── Loading personas ─────────────────────────────────────────────────────────
|
|
80
|
+
export async function loadAllPersonas(skillsDir) {
|
|
81
|
+
const dirExists = await ensureDirExists(skillsDir);
|
|
82
|
+
if (!dirExists) {
|
|
83
|
+
logger.debug("Skills directory does not exist", { event: "dir_not_found", path: skillsDir });
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
let stat;
|
|
87
|
+
try {
|
|
88
|
+
stat = await fsp.stat(skillsDir);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
logger.error("Failed to stat skills directory", {
|
|
92
|
+
event: "stat_error",
|
|
93
|
+
path: skillsDir,
|
|
94
|
+
error: getErrorInfo(err).code,
|
|
95
|
+
message: getErrorInfo(err).message,
|
|
96
|
+
});
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
const currentMtime = stat.mtimeMs;
|
|
100
|
+
if (personasCache && personasCache.mtime === currentMtime) {
|
|
101
|
+
logger.debug("Returning cached personas", {
|
|
102
|
+
event: "cache_hit",
|
|
103
|
+
count: personasCache.personas.length,
|
|
104
|
+
});
|
|
105
|
+
return personasCache.personas;
|
|
106
|
+
}
|
|
107
|
+
let files;
|
|
108
|
+
try {
|
|
109
|
+
files = readdirSync(skillsDir, { recursive: true })
|
|
110
|
+
.filter((f) => typeof f === "string" && f.endsWith(".md"));
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
logger.error("Failed to read skills directory", {
|
|
114
|
+
event: "readdir_error",
|
|
115
|
+
path: skillsDir,
|
|
116
|
+
error: getErrorInfo(err).code,
|
|
117
|
+
message: getErrorInfo(err).message,
|
|
118
|
+
});
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
logger.debug("Loading personas from directory", { event: "loading_personas", count: files.length });
|
|
122
|
+
const personas = [];
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
const fullPath = path.join(skillsDir, file);
|
|
125
|
+
const persona = await parsePersonaFile(fullPath);
|
|
126
|
+
if (persona) {
|
|
127
|
+
personas.push(persona);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
personasCache = { personas, mtime: currentMtime };
|
|
131
|
+
logger.info("Personas loaded", { event: "personas_loaded", count: personas.length });
|
|
132
|
+
return personas;
|
|
133
|
+
}
|
|
134
|
+
export async function loadPersonaById(skillsDir, id) {
|
|
135
|
+
const sanitizedId = id.replace(/[^a-z0-9_]/gi, "");
|
|
136
|
+
if (!sanitizedId || sanitizedId !== id) {
|
|
137
|
+
logger.warn("Invalid persona ID format", { event: "invalid_id", id });
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const all = await loadAllPersonas(skillsDir);
|
|
141
|
+
return all.find((p) => p.meta.id === id) || null;
|
|
142
|
+
}
|
|
143
|
+
export async function loadPersonasByIds(skillsDir, ids) {
|
|
144
|
+
const results = await Promise.all(ids.map((id) => loadPersonaById(skillsDir, id)));
|
|
145
|
+
return results.filter((p) => p !== null);
|
|
146
|
+
}
|
|
147
|
+
// ── Writing personas ─────────────────────────────────────────────────────────
|
|
148
|
+
export async function writePersonaFile(skillsDir, meta, personaDescription, subDir) {
|
|
149
|
+
const fileName = `${meta.id}.md`;
|
|
150
|
+
const filePath = subDir
|
|
151
|
+
? path.join(skillsDir, subDir, fileName)
|
|
152
|
+
: path.join(skillsDir, fileName);
|
|
153
|
+
if (!validateWritePath(filePath, skillsDir)) {
|
|
154
|
+
logger.warn("Path traversal attempt in writePersonaFile", {
|
|
155
|
+
event: "path_traversal",
|
|
156
|
+
path: filePath,
|
|
157
|
+
});
|
|
158
|
+
throw new Error("Invalid file path: path traversal detected");
|
|
159
|
+
}
|
|
160
|
+
const frontmatter = matter.stringify(personaDescription, meta);
|
|
161
|
+
try {
|
|
162
|
+
await fsp.mkdir(subDir ? path.join(skillsDir, subDir) : skillsDir, { recursive: true });
|
|
163
|
+
await fsp.writeFile(filePath, frontmatter, "utf-8");
|
|
164
|
+
logger.info("Persona file written", { event: "file_written", path: filePath, id: meta.id });
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
logger.error("Failed to write persona file", {
|
|
168
|
+
event: "write_error",
|
|
169
|
+
path: filePath,
|
|
170
|
+
error: getErrorInfo(err).code,
|
|
171
|
+
message: getErrorInfo(err).message,
|
|
172
|
+
});
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
invalidatePersonasCache();
|
|
176
|
+
return filePath;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const TRAIT_SHORT_TO_EN: Record<string, string>;
|
|
2
|
+
export declare const PLATFORM_TO_EN: Record<string, string>;
|
|
3
|
+
export declare function extractShortTrait(traitFull: string): string;
|
|
4
|
+
export declare function mapTraitToKey(traitShort: string): string | undefined;
|
|
5
|
+
export declare function mapPlatformToKey(platform: string): string | undefined;
|
|
6
|
+
export declare function slugify(input: string): string;
|
|
7
|
+
//# sourceMappingURL=personaIdMaps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaIdMaps.d.ts","sourceRoot":"","sources":["../../src/utils/personaIdMaps.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBpD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAejD,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export const TRAIT_SHORT_TO_EN = {
|
|
2
|
+
"理性分析型": "analytical",
|
|
3
|
+
"理性分析": "analytical",
|
|
4
|
+
"感性跟风型": "trend_follower",
|
|
5
|
+
"感性跟风": "trend_follower",
|
|
6
|
+
"毒舌批评型": "critical",
|
|
7
|
+
"毒舌批评": "critical",
|
|
8
|
+
"实用主义型": "pragmatic",
|
|
9
|
+
"实用主义": "pragmatic",
|
|
10
|
+
"乐观积极型": "optimistic",
|
|
11
|
+
"乐观积极": "optimistic",
|
|
12
|
+
"严谨挑剔型": "meticulous",
|
|
13
|
+
"严谨挑剔": "meticulous",
|
|
14
|
+
"技术导向型": "tech_oriented",
|
|
15
|
+
"技术导向": "tech_oriented",
|
|
16
|
+
"创意灵感型": "creative",
|
|
17
|
+
"创意灵感": "creative",
|
|
18
|
+
};
|
|
19
|
+
export const PLATFORM_TO_EN = {
|
|
20
|
+
"小红书": "xiaohongshu",
|
|
21
|
+
"抖音": "douyin",
|
|
22
|
+
"微博": "weibo",
|
|
23
|
+
"B站": "bilibili",
|
|
24
|
+
"Bilibili": "bilibili",
|
|
25
|
+
"知乎": "zhihu",
|
|
26
|
+
"Twitter": "twitter",
|
|
27
|
+
"X": "x",
|
|
28
|
+
"微信": "wechat",
|
|
29
|
+
"微信公众号": "wechat_official",
|
|
30
|
+
"通用": "general",
|
|
31
|
+
"Instagram": "instagram",
|
|
32
|
+
"Reddit": "reddit",
|
|
33
|
+
"YouTube": "youtube",
|
|
34
|
+
};
|
|
35
|
+
export function extractShortTrait(traitFull) {
|
|
36
|
+
const idx = traitFull.indexOf("→");
|
|
37
|
+
return idx > 0 ? traitFull.substring(0, idx).trim() : traitFull.trim();
|
|
38
|
+
}
|
|
39
|
+
export function mapTraitToKey(traitShort) {
|
|
40
|
+
return TRAIT_SHORT_TO_EN[traitShort];
|
|
41
|
+
}
|
|
42
|
+
export function mapPlatformToKey(platform) {
|
|
43
|
+
return PLATFORM_TO_EN[platform];
|
|
44
|
+
}
|
|
45
|
+
export function slugify(input) {
|
|
46
|
+
return input
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[^a-z0-9]+/g, "_")
|
|
49
|
+
.replace(/^_|_$/g, "");
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=personaIdMaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personaIdMaps.js","sourceRoot":"","sources":["../../src/utils/personaIdMaps.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,gBAAgB;IACzB,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,UAAU;IACtB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,SAAS;IACpB,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,iBAAiB;IAC1B,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,WAAW;IACxB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,SAAS;CACrB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWzD;AAgBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAY,GAAG,MAAM,CAMpE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const KEY_PATTERNS = [
|
|
2
|
+
/sk-ant-[a-zA-Z0-9]{10,}/g,
|
|
3
|
+
/sk-[a-zA-Z0-9]{20,}/g,
|
|
4
|
+
/(?:api|secret|private|token|key)[-_]?[a-zA-Z0-9]{16,}/gi,
|
|
5
|
+
/AIza[0-9A-Za-z_-]{35}/g,
|
|
6
|
+
/ghp_[a-zA-Z0-9]{36}/g,
|
|
7
|
+
/gho_[a-zA-Z0-9]{36}/g,
|
|
8
|
+
/xox[bpras]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24,}/g,
|
|
9
|
+
];
|
|
10
|
+
export function scanForCredentials(text) {
|
|
11
|
+
const found = [];
|
|
12
|
+
for (const pattern of KEY_PATTERNS) {
|
|
13
|
+
const matches = text.match(pattern);
|
|
14
|
+
if (matches) {
|
|
15
|
+
for (const match of matches) {
|
|
16
|
+
found.push(match.slice(0, 8) + "****");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return [...new Set(found)];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Patterns that match the orchestration template's structural markers.
|
|
24
|
+
* Injected content containing these could break out of the persona block.
|
|
25
|
+
*/
|
|
26
|
+
const ORCHESTRATION_BOUNDARIES = [
|
|
27
|
+
/\*\*指令\*\*/g,
|
|
28
|
+
/\*\*角色描述\*\*/g,
|
|
29
|
+
/\*\*待评审内容\*\*/g,
|
|
30
|
+
/\*\*发布平台\s*[&&]\s*目标受众背景\*\*/g,
|
|
31
|
+
/请严格按照该人设要求的输出格式作答[。.]?/g,
|
|
32
|
+
/^#{1,6}\s/gm,
|
|
33
|
+
/^-{3,}\s*$/gm,
|
|
34
|
+
];
|
|
35
|
+
export function stripPromptBoundaries(text) {
|
|
36
|
+
let result = text;
|
|
37
|
+
for (const pattern of ORCHESTRATION_BOUNDARIES) {
|
|
38
|
+
result = result.replace(pattern, "");
|
|
39
|
+
}
|
|
40
|
+
return result.trim();
|
|
41
|
+
}
|
|
42
|
+
export function wrapContent(content, tag = "content") {
|
|
43
|
+
const suffix = Math.random().toString(36).substring(2, 8);
|
|
44
|
+
const openTag = `<${tag}_${suffix}>`;
|
|
45
|
+
const closeTag = `</${tag}_${suffix}>`;
|
|
46
|
+
const escaped = content.replace(new RegExp(`</?${tag}_?[a-z0-9]*>`, "gi"), "");
|
|
47
|
+
return `${openTag}\n${escaped}\n${closeTag}`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG;IACnB,0BAA0B;IAC1B,sBAAsB;IACtB,yDAAyD;IACzD,wBAAwB;IACxB,sBAAsB;IACtB,sBAAsB;IACtB,wDAAwD;CACzD,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,wBAAwB,GAAG;IAC/B,aAAa;IACb,eAAe;IACf,gBAAgB;IAChB,+BAA+B;IAC/B,yBAAyB;IACzB,aAAa;IACb,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,wBAAwB,EAAE,CAAC;QAC/C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,GAAG,GAAG,SAAS;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,MAAM,GAAG,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,MAAM,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,GAAG,OAAO,KAAK,OAAO,KAAK,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kevlar-4u",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Kevlar: A Local-first, MCP-compliant Multi-Agent armor to stress-test your content before the internet does.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"kevlar": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsx src/index.ts",
|
|
12
|
+
"start": "node dist/index.js",
|
|
13
|
+
"setup": "tsx scripts/setup.ts",
|
|
14
|
+
"kevlar-mcp": "tsx scripts/cli.ts",
|
|
15
|
+
"test": "tsx --test src/__tests__/**/*.test.ts",
|
|
16
|
+
"test:watch": "tsx --test --watch src/__tests__/**/*.test.ts"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"skills/",
|
|
21
|
+
"config/"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=20"
|
|
25
|
+
},
|
|
26
|
+
"keywords": ["mcp", "multi-agent", "content-review", "ai"],
|
|
27
|
+
"author": "",
|
|
28
|
+
"license": "ISC",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@inquirer/prompts": "^7.5.2",
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
33
|
+
"chalk": "^5.4.1",
|
|
34
|
+
"dotenv": "^17.4.2",
|
|
35
|
+
"gray-matter": "^4.0.3"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/node": "^25.8.0",
|
|
39
|
+
"tsx": "^4.22.1",
|
|
40
|
+
"typescript": "^6.0.3"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: your_unique_persona_id
|
|
3
|
+
name: "你的人设名称(中文)"
|
|
4
|
+
name_en: "Your Persona Name (English)"
|
|
5
|
+
version: "1.0.0"
|
|
6
|
+
author: "your-github-handle"
|
|
7
|
+
tags:
|
|
8
|
+
- tag1
|
|
9
|
+
- tag2
|
|
10
|
+
description: "用一句话描述这个人设的核心特质和阅读视角"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# 系统提示词 (System Prompt)
|
|
14
|
+
|
|
15
|
+
## 你的身份
|
|
16
|
+
|
|
17
|
+
你是「**{在这里写角色名}**」。
|
|
18
|
+
|
|
19
|
+
(在这里写2-3句话,描述这个角色的核心身份:职业/背景/年龄段/社交媒体使用习惯等)
|
|
20
|
+
|
|
21
|
+
## 你的性格特质
|
|
22
|
+
|
|
23
|
+
- **特质一**:描述这个特质如何影响你阅读内容的方式
|
|
24
|
+
- **特质二**:描述这个特质
|
|
25
|
+
- **特质三**:描述这个特质
|
|
26
|
+
|
|
27
|
+
## 你的阅读习惯与反应模式
|
|
28
|
+
|
|
29
|
+
(描述这个角色如何浏览内容:第一眼看什么?什么会让他/她立刻关掉?什么会让他/她停下来认真看?)
|
|
30
|
+
|
|
31
|
+
## 你的批判视角
|
|
32
|
+
|
|
33
|
+
当你阅读内容时,你特别会注意:
|
|
34
|
+
|
|
35
|
+
1. **关注点一**:(具体说明)
|
|
36
|
+
2. **关注点二**:(具体说明)
|
|
37
|
+
3. **关注点三**:(具体说明)
|
|
38
|
+
|
|
39
|
+
## 输出格式要求
|
|
40
|
+
|
|
41
|
+
请严格按照以下格式输出你的反应:
|
|
42
|
+
|
|
43
|
+
### {你的角色名} · 评论
|
|
44
|
+
|
|
45
|
+
**第一印象(前3秒)**
|
|
46
|
+
(描述你看到内容后的第一反应,用第一人称,口语化)
|
|
47
|
+
|
|
48
|
+
**深度阅读后的感受**
|
|
49
|
+
(继续阅读后的反应,可以是正面或负面)
|
|
50
|
+
|
|
51
|
+
**具体槽点 / 赞点**
|
|
52
|
+
- 🔴 槽点:(如果有)
|
|
53
|
+
- 🟢 亮点:(如果有)
|
|
54
|
+
|
|
55
|
+
**最终判定**
|
|
56
|
+
(你会转发/点赞/忽略/差评?给出你的最终行动和一句话总结)
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
<!--
|
|
60
|
+
贡献指南:
|
|
61
|
+
1. 将此文件复制为 skills/your_platform/your_persona_id.md
|
|
62
|
+
2. 填写所有 YAML Frontmatter 字段
|
|
63
|
+
3. 替换系统提示词中的所有占位符
|
|
64
|
+
4. 确保角色有鲜明的个性,避免平淡泛化
|
|
65
|
+
5. 提交 PR 时请附上一个用你的人设测试过的内容样例
|
|
66
|
+
-->
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessionId": "wizard-create-cwzrrpim",
|
|
3
|
+
"createdAt": 1779585460205,
|
|
4
|
+
"step": 6,
|
|
5
|
+
"fields": {
|
|
6
|
+
"ageRange": "25-30岁",
|
|
7
|
+
"interests": [
|
|
8
|
+
"科技",
|
|
9
|
+
"时尚",
|
|
10
|
+
"美食"
|
|
11
|
+
],
|
|
12
|
+
"traits": [
|
|
13
|
+
"容易跟风 → 因此在相关内容判断中会表现出这一倾向",
|
|
14
|
+
"对价格敏感 → 因此在相关内容判断中会表现出这一倾向",
|
|
15
|
+
"喜欢对比评测 → 因此在相关内容判断中会表现出这一倾向",
|
|
16
|
+
"说话直接 → 因此在相关内容判断中会表现出这一倾向"
|
|
17
|
+
],
|
|
18
|
+
"platform": "小红书",
|
|
19
|
+
"authorRelation": "已关注",
|
|
20
|
+
"culturalContext": "中国大陆互联网文化语境",
|
|
21
|
+
"stance": "默认质疑",
|
|
22
|
+
"blindSpot": "无特定盲区",
|
|
23
|
+
"personaName": "小红书科技评论员",
|
|
24
|
+
"gender": "未指定"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessionId": "wizard-create-cwzrrpim",
|
|
3
|
+
"createdAt": 1779585460205,
|
|
4
|
+
"step": "finalConfirm",
|
|
5
|
+
"fields": {
|
|
6
|
+
"ageRange": "25-30岁",
|
|
7
|
+
"interests": [
|
|
8
|
+
"科技",
|
|
9
|
+
"时尚",
|
|
10
|
+
"美食"
|
|
11
|
+
],
|
|
12
|
+
"traits": [
|
|
13
|
+
"容易跟风 → 因此在相关内容判断中会表现出这一倾向",
|
|
14
|
+
"对价格敏感 → 因此在相关内容判断中会表现出这一倾向",
|
|
15
|
+
"喜欢对比评测 → 因此在相关内容判断中会表现出这一倾向",
|
|
16
|
+
"说话直接 → 因此在相关内容判断中会表现出这一倾向"
|
|
17
|
+
],
|
|
18
|
+
"platform": "小红书",
|
|
19
|
+
"authorRelation": "已关注",
|
|
20
|
+
"culturalContext": "中国大陆互联网文化语境",
|
|
21
|
+
"stance": "默认质疑",
|
|
22
|
+
"blindSpot": "无特定盲区",
|
|
23
|
+
"personaName": "小红书科技评论员",
|
|
24
|
+
"gender": "未指定"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessionId": "wizard-create-d81intme",
|
|
3
|
+
"createdAt": 1779584948763,
|
|
4
|
+
"step": 6,
|
|
5
|
+
"fields": {
|
|
6
|
+
"ageRange": "25-30岁",
|
|
7
|
+
"interests": [
|
|
8
|
+
"美食探店",
|
|
9
|
+
"旅行攻略",
|
|
10
|
+
"生活方式"
|
|
11
|
+
],
|
|
12
|
+
"traits": [
|
|
13
|
+
"喜欢对比评测 → 因此在相关内容判断中会表现出这一倾向",
|
|
14
|
+
"注重性价比 → 因此在相关内容判断中会表现出这一倾向",
|
|
15
|
+
"追求品质生活 → 因此在相关内容判断中会表现出这一倾向",
|
|
16
|
+
"愿意为体验买单 → 因此在相关内容判断中会表现出这一倾向"
|
|
17
|
+
],
|
|
18
|
+
"platform": "微信公众号",
|
|
19
|
+
"authorRelation": "未关注",
|
|
20
|
+
"culturalContext": "中国大陆互联网文化语境",
|
|
21
|
+
"stance": "默认质疑",
|
|
22
|
+
"blindSpot": "无特定盲区",
|
|
23
|
+
"personaName": "微信公众号美食探店评论员",
|
|
24
|
+
"gender": "未指定"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessionId": "wizard-create-d81intme",
|
|
3
|
+
"createdAt": 1779584948763,
|
|
4
|
+
"step": "finalConfirm",
|
|
5
|
+
"fields": {
|
|
6
|
+
"ageRange": "25-30岁",
|
|
7
|
+
"interests": [
|
|
8
|
+
"美食探店",
|
|
9
|
+
"旅行攻略",
|
|
10
|
+
"生活方式"
|
|
11
|
+
],
|
|
12
|
+
"traits": [
|
|
13
|
+
"喜欢对比评测 → 因此在相关内容判断中会表现出这一倾向",
|
|
14
|
+
"注重性价比 → 因此在相关内容判断中会表现出这一倾向",
|
|
15
|
+
"追求品质生活 → 因此在相关内容判断中会表现出这一倾向",
|
|
16
|
+
"愿意为体验买单 → 因此在相关内容判断中会表现出这一倾向"
|
|
17
|
+
],
|
|
18
|
+
"platform": "微信公众号",
|
|
19
|
+
"authorRelation": "未关注",
|
|
20
|
+
"culturalContext": "中国大陆互联网文化语境",
|
|
21
|
+
"stance": "默认质疑",
|
|
22
|
+
"blindSpot": "无特定盲区",
|
|
23
|
+
"personaName": "微信公众号美食探店评论员",
|
|
24
|
+
"gender": "未指定"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sessionId": "wizard-review-fwbxe3d2",
|
|
3
|
+
"createdAt": 1779590017810,
|
|
4
|
+
"step": "collectPlatforms",
|
|
5
|
+
"content": "AI 对话运行时 生命周期:AI 决定何时唤起 → AI 决定何时销毁 这里,我觉得\"AI 决定何时销毁\"是不是应该再仔细考虑一下。总感觉AI觉得不合理。",
|
|
6
|
+
"targetPlatforms": [],
|
|
7
|
+
"selectedPersonaIds": [],
|
|
8
|
+
"remainingPersonaIds": []
|
|
9
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: wechat_official
|
|
3
|
+
name: 微信公众号旅行评论员
|
|
4
|
+
name_en: ''
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
author: ai-generated
|
|
7
|
+
tags:
|
|
8
|
+
- 微信公众号
|
|
9
|
+
- 旅行
|
|
10
|
+
- 科技
|
|
11
|
+
- 育儿
|
|
12
|
+
description: 一个主要活跃在【微信公众号】平台,兴趣在于【旅行、科技、育儿】,性格特质为【理性务实 → 因此在相关内容判断中会表现出这一倾向】的评论员角色。
|
|
13
|
+
culturalContext: 中国大陆互联网文化语境
|
|
14
|
+
authorRelation: 未关注
|
|
15
|
+
stance: 默认质疑
|
|
16
|
+
blindSpot: 无特定盲区
|
|
17
|
+
---
|
|
18
|
+
年龄段:25-30岁
|
|
19
|
+
兴趣方向:旅行、科技、育儿
|
|
20
|
+
常用平台:微信公众号
|
|
21
|
+
性格特质:
|
|
22
|
+
- 理性务实 → 因此在相关内容判断中会表现出这一倾向
|
|
23
|
+
文化背景:中国大陆互联网文化语境
|
|
24
|
+
与作者的关系:未关注
|
|
25
|
+
立场:默认质疑
|
|
26
|
+
盲区:无特定盲区
|