Selaa lähdekoodia

feat(web):Vite+React 一页式前端,下线旧静态看板

acquisition/web/app/:以 query 为主体的一页,每条 query 挂「真实搜索结果」按钮 →
hash 路由进该 query 的视频详情(抖音/微信公众号分区展示,视频可播)。数据全走 /api
分页,数据量大也只渲染当前页。海外机不装 node,构建产物 dist/ 入库直接由 FastAPI 挂 /app,
/ 307 跳 /app/。删除旧静态看板(web/index.html 等)与旧 web 启动配置。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 3 viikkoa sitten
vanhempi
commit
faafe3c8fe

+ 4 - 4
.claude/launch.json

@@ -2,10 +2,10 @@
   "version": "0.0.1",
   "configurations": [
     {
-      "name": "web",
-      "runtimeExecutable": "python3",
-      "runtimeArgs": ["-m", "http.server", "8125", "--directory", "web"],
-      "port": 8125
+      "name": "api",
+      "runtimeExecutable": "bash",
+      "runtimeArgs": ["-c", "cd /Users/samlee/Documents/works/Create-knowledge-find-decode && PYTHONPATH=. CK_ENV_FILE=.env uv run uvicorn creation_knowledge.api:app --host 127.0.0.1 --port 8126"],
+      "port": 8126
     }
   ]
 }

+ 2 - 4
.gitignore

@@ -12,6 +12,8 @@ venv/
 # Node / web
 node_modules/
 dist/
+# 例外:海外机不装 node,前端构建产物入库直接托管
+!acquisition/web/app/dist/
 .next/
 .vite/
 
@@ -25,7 +27,3 @@ scope_trees/
 # 杂项
 .DS_Store
 *.log
-
-# 本地 preview 用的提示词真源软链(云端由 FastAPI 挂载)
-web/prompt-skill
-web/prompt-read

+ 4 - 0
acquisition/web/app/.gitignore

@@ -0,0 +1,4 @@
+node_modules/
+*.local
+.vite/
+# dist/ 要提交:海外机不装 node,直接托管构建产物

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 8 - 0
acquisition/web/app/dist/assets/index-BgWKcpoi.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
acquisition/web/app/dist/assets/index-_tFslJo8.css


+ 13 - 0
acquisition/web/app/dist/index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>创作知识 · 找帖子</title>
+    <script type="module" crossorigin src="/app/assets/index-BgWKcpoi.js"></script>
+    <link rel="stylesheet" crossorigin href="/app/assets/index-_tFslJo8.css">
+  </head>
+  <body>
+    <div id="root"></div>
+  </body>
+</html>

+ 12 - 0
acquisition/web/app/index.html

@@ -0,0 +1,12 @@
+<!doctype html>
+<html lang="zh-CN">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>创作知识 · 找帖子</title>
+  </head>
+  <body>
+    <div id="root"></div>
+    <script type="module" src="/src/main.jsx"></script>
+  </body>
+</html>

+ 1719 - 0
acquisition/web/app/package-lock.json

@@ -0,0 +1,1719 @@
+{
+  "name": "acquisition-web",
+  "version": "0.1.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "acquisition-web",
+      "version": "0.1.0",
+      "dependencies": {
+        "react": "^18.3.1",
+        "react-dom": "^18.3.1"
+      },
+      "devDependencies": {
+        "@vitejs/plugin-react": "^4.3.4",
+        "vite": "^5.4.11"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+      "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.29.7",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+      "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+      "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/generator": "^7.29.7",
+        "@babel/helper-compilation-targets": "^7.29.7",
+        "@babel/helper-module-transforms": "^7.29.7",
+        "@babel/helpers": "^7.29.7",
+        "@babel/parser": "^7.29.7",
+        "@babel/template": "^7.29.7",
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7",
+        "@jridgewell/remapping": "^2.3.5",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
+      "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.29.7",
+        "@babel/types": "^7.29.7",
+        "@jridgewell/gen-mapping": "^0.3.12",
+        "@jridgewell/trace-mapping": "^0.3.28",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+      "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.29.7",
+        "@babel/helper-validator-option": "^7.29.7",
+        "browserslist": "^4.24.0",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-globals": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+      "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+      "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+      "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7",
+        "@babel/traverse": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+      "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+      "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+      "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+      "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+      "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+      "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.29.7"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-self": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
+      "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-source": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
+      "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+      "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/parser": "^7.29.7",
+        "@babel/types": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
+      "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.29.7",
+        "@babel/generator": "^7.29.7",
+        "@babel/helper-globals": "^7.29.7",
+        "@babel/parser": "^7.29.7",
+        "@babel/template": "^7.29.7",
+        "@babel/types": "^7.29.7",
+        "debug": "^4.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.29.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+      "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.29.7",
+        "@babel/helper-validator-identifier": "^7.29.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.13",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+      "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/remapping": {
+      "version": "2.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+      "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.31",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+      "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@rolldown/pluginutils": {
+      "version": "1.0.0-beta.27",
+      "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+      "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
+      "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
+      "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
+      "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
+      "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
+      "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
+      "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
+      "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
+      "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
+      "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
+      "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
+      "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loong64-musl": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
+      "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
+      "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-ppc64-musl": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
+      "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
+      "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
+      "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
+      "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
+      "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "libc": [
+        "glibc"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
+      "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "libc": [
+        "musl"
+      ],
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-openbsd-x64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
+      "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-openharmony-arm64": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
+      "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openharmony"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
+      "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
+      "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-gnu": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
+      "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
+      "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/babel__core": {
+      "version": "7.20.5",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+      "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "node_modules/@types/babel__generator": {
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+      "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__template": {
+      "version": "7.4.4",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+      "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "node_modules/@types/babel__traverse": {
+      "version": "7.28.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+      "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.28.2"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+      "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vitejs/plugin-react": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+      "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.28.0",
+        "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+        "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+        "@rolldown/pluginutils": "1.0.0-beta.27",
+        "@types/babel__core": "^7.20.5",
+        "react-refresh": "^0.17.0"
+      },
+      "engines": {
+        "node": "^14.18.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+      }
+    },
+    "node_modules/baseline-browser-mapping": {
+      "version": "2.10.40",
+      "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz",
+      "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "bin": {
+        "baseline-browser-mapping": "dist/cli.cjs"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.28.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz",
+      "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "baseline-browser-mapping": "^2.10.38",
+        "caniuse-lite": "^1.0.30001799",
+        "electron-to-chromium": "^1.5.376",
+        "node-releases": "^2.0.48",
+        "update-browserslist-db": "^1.2.3"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001799",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz",
+      "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.380",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz",
+      "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/esbuild": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "license": "MIT"
+    },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.15",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
+      "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.50",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz",
+      "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "dev": true,
+      "license": "ISC"
+    },
+    "node_modules/postcss": {
+      "version": "8.5.15",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+      "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.12",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/react": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "scheduler": "^0.23.2"
+      },
+      "peerDependencies": {
+        "react": "^18.3.1"
+      }
+    },
+    "node_modules/react-refresh": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+      "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.62.2",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
+      "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.9"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.62.2",
+        "@rollup/rollup-android-arm64": "4.62.2",
+        "@rollup/rollup-darwin-arm64": "4.62.2",
+        "@rollup/rollup-darwin-x64": "4.62.2",
+        "@rollup/rollup-freebsd-arm64": "4.62.2",
+        "@rollup/rollup-freebsd-x64": "4.62.2",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
+        "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
+        "@rollup/rollup-linux-arm64-gnu": "4.62.2",
+        "@rollup/rollup-linux-arm64-musl": "4.62.2",
+        "@rollup/rollup-linux-loong64-gnu": "4.62.2",
+        "@rollup/rollup-linux-loong64-musl": "4.62.2",
+        "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
+        "@rollup/rollup-linux-ppc64-musl": "4.62.2",
+        "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
+        "@rollup/rollup-linux-riscv64-musl": "4.62.2",
+        "@rollup/rollup-linux-s390x-gnu": "4.62.2",
+        "@rollup/rollup-linux-x64-gnu": "4.62.2",
+        "@rollup/rollup-linux-x64-musl": "4.62.2",
+        "@rollup/rollup-openbsd-x64": "4.62.2",
+        "@rollup/rollup-openharmony-arm64": "4.62.2",
+        "@rollup/rollup-win32-arm64-msvc": "4.62.2",
+        "@rollup/rollup-win32-ia32-msvc": "4.62.2",
+        "@rollup/rollup-win32-x64-gnu": "4.62.2",
+        "@rollup/rollup-win32-x64-msvc": "4.62.2",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.23.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "dev": true,
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+      "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.4.21",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+      "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.43",
+        "rollup": "^4.20.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "license": "ISC"
+    }
+  }
+}

+ 20 - 0
acquisition/web/app/package.json

@@ -0,0 +1,20 @@
+{
+  "name": "acquisition-web",
+  "private": true,
+  "version": "0.1.0",
+  "type": "module",
+  "description": "找帖子阶段的可交互前端:query 生成结果 + 真实搜索结果,按 /api 分页筛选",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "react": "^18.3.1",
+    "react-dom": "^18.3.1"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-react": "^4.3.4",
+    "vite": "^5.4.11"
+  }
+}

+ 29 - 0
acquisition/web/app/src/App.jsx

@@ -0,0 +1,29 @@
+import React, { useEffect, useState } from 'react'
+import QueriesPage from './pages/QueriesPage.jsx'
+import QueryDetail from './pages/QueryDetail.jsx'
+
+// 一页式:主体是「生成的 query」列表,每条 query 后面挂它的真实搜索结果按钮。
+// 点按钮经 hash 路由「真实跳转」进该 query 的视频详情(#/q/<query>),浏览器后退可回列表。
+function parseHash() {
+  const m = (window.location.hash || '').match(/^#\/q\/(.+)$/)
+  return m ? { view: 'detail', query: decodeURIComponent(m[1]) } : { view: 'list' }
+}
+
+export default function App() {
+  const [route, setRoute] = useState(parseHash())
+  useEffect(() => {
+    const on = () => setRoute(parseHash())
+    window.addEventListener('hashchange', on)
+    return () => window.removeEventListener('hashchange', on)
+  }, [])
+
+  return (
+    <div className="wrap">
+      <h1>创作知识 · 找帖子</h1>
+      <div className="sub">每条生成的 query 直接挂它搜到的真实帖子/视频 · 数据走 /api(SQLite 分页)</div>
+      {route.view === 'detail'
+        ? <QueryDetail query={route.query} />
+        : <QueriesPage />}
+    </div>
+  )
+}

+ 40 - 0
acquisition/web/app/src/api.js

@@ -0,0 +1,40 @@
+// 后端取数:全部走 /api/*(dev 由 vite 代理到 uvicorn,线上同源)。
+// 失败不抛飞页面,返回空集,让 UI 显示「暂无数据」。
+
+async function getJSON(url) {
+  const r = await fetch(url)
+  if (!r.ok) throw new Error(`${r.status} ${url}`)
+  return r.json()
+}
+
+function qs(params) {
+  const p = new URLSearchParams()
+  for (const [k, v] of Object.entries(params)) {
+    if (v !== undefined && v !== null && v !== '') p.set(k, v)
+  }
+  const s = p.toString()
+  return s ? `?${s}` : ''
+}
+
+export async function fetchRuns() {
+  try { return (await getJSON('/api/runs')).runs || [] } catch { return [] }
+}
+
+export async function fetchMethods(table) {
+  try { return (await getJSON(`/api/methods${qs({ table })}`)).methods || [] } catch { return [] }
+}
+
+const EMPTY = { total: 0, page: 1, size: 30, items: [] }
+
+export async function fetchQueries({ method, run_id, page, size } = {}) {
+  try { return await getJSON(`/api/queries${qs({ method, run_id, page, size })}`) } catch { return EMPTY }
+}
+
+export async function fetchSearch({ platform, method, ok, run_id, query, page, size } = {}) {
+  try { return await getJSON(`/api/search${qs({ platform, method, ok, run_id, query, page, size })}`) } catch { return EMPTY }
+}
+
+// {query文本: {total, ok}} —— 列表页给每条 query 决定「搜索结果」按钮是否可点、显示几个
+export async function fetchSearchSummary() {
+  try { return (await getJSON('/api/search/summary')).summary || {} } catch { return {} }
+}

+ 14 - 0
acquisition/web/app/src/components/Pager.jsx

@@ -0,0 +1,14 @@
+import React from 'react'
+
+// 纯分页器:上一页/下一页 + 「第 x / 共 y 页(n 条)」。数据再大也只渲染当前页。
+export default function Pager({ page, size, total, onPage }) {
+  const pages = Math.max(1, Math.ceil(total / size))
+  if (total === 0) return null
+  return (
+    <div className="pager">
+      <button disabled={page <= 1} onClick={() => onPage(page - 1)}>‹ 上一页</button>
+      <span className="at">第 {page} / 共 {pages} 页 · {total} 条</span>
+      <button disabled={page >= pages} onClick={() => onPage(page + 1)}>下一页 ›</button>
+    </div>
+  )
+}

+ 6 - 0
acquisition/web/app/src/main.jsx

@@ -0,0 +1,6 @@
+import React from 'react'
+import { createRoot } from 'react-dom/client'
+import App from './App.jsx'
+import './styles.css'
+
+createRoot(document.getElementById('root')).render(<App />)

+ 65 - 0
acquisition/web/app/src/pages/QueriesPage.jsx

@@ -0,0 +1,65 @@
+import React, { useEffect, useState } from 'react'
+import { fetchMethods, fetchQueries, fetchSearchSummary } from '../api.js'
+import Pager from '../components/Pager.jsx'
+
+const SIZE = 30
+
+// 生成的 query 列表(按打法筛 + 分页)。每条 query 末列挂「真实搜索结果」按钮:
+// 搜到结果 → 可跳转进详情;搜过没结果 / 没搜过 → 灰色不可点,状态如实标注。
+export default function QueriesPage() {
+  const [methods, setMethods] = useState([])
+  const [method, setMethod] = useState('')
+  const [page, setPage] = useState(1)
+  const [data, setData] = useState({ total: 0, page: 1, size: SIZE, items: [] })
+  const [summary, setSummary] = useState({})
+
+  useEffect(() => { fetchMethods('queries').then(setMethods) }, [])
+  useEffect(() => { fetchSearchSummary().then(setSummary) }, [])
+  useEffect(() => { fetchQueries({ method, page, size: SIZE }).then(setData) }, [method, page])
+
+  const onMethod = (m) => { setMethod(m); setPage(1) }
+
+  return (
+    <div>
+      <div className="filters">
+        <select value={method} onChange={(e) => onMethod(e.target.value)}>
+          <option value="">全部打法</option>
+          {methods.map((m) => <option key={m} value={m}>{m}</option>)}
+        </select>
+        <span className="count">共 {data.total} 条 query</span>
+      </div>
+
+      {data.items.length === 0 ? (
+        <div className="empty">暂无数据。先跑 <code>scripts/build_query_demo.py</code> 再 <code>scripts/import_to_db.py</code></div>
+      ) : (
+        <table>
+          <thead>
+            <tr><th>打法</th><th>正交轴</th><th>query</th><th>真实搜索结果</th></tr>
+          </thead>
+          <tbody>
+            {data.items.map((it) => (
+              <tr key={it.id}>
+                <td><span className="tag">{it.method}</span></td>
+                <td>{Object.entries(it.axes || {}).map(([k, v]) => (
+                  <span className="tag k" key={k}>{k}:{v}</span>
+                ))}</td>
+                <td className="q">{it.query}</td>
+                <td><ResultBtn s={summary[it.query]} query={it.query} /></td>
+              </tr>
+            ))}
+          </tbody>
+        </table>
+      )}
+
+      <Pager page={data.page} size={data.size} total={data.total} onPage={setPage} />
+    </div>
+  )
+}
+
+function ResultBtn({ s, query }) {
+  if (s && s.ok > 0) {
+    return <a className="btn" href={`#/q/${encodeURIComponent(query)}`}>🔎 看 {s.ok} 个结果 ›</a>
+  }
+  if (s) return <span className="btn off">搜过 · 无结果</span>
+  return <span className="btn off">未搜索</span>
+}

+ 58 - 0
acquisition/web/app/src/pages/QueryDetail.jsx

@@ -0,0 +1,58 @@
+import React, { useEffect, useState } from 'react'
+import { fetchSearch } from '../api.js'
+
+// 渠道分区展示:抖音一组在前、微信公众号一组在后,各自成块,不混排。
+const PLATFORMS = [
+  { key: 'douyin', label: '抖音', cls: 'dy' },
+  { key: 'weixin', label: '微信公众号', cls: 'wx' },
+]
+
+// 单条 query 的真实搜索结果详情:进来即「点进该 query 生成的多个视频里」。
+export default function QueryDetail({ query }) {
+  const [data, setData] = useState({ total: 0, items: [] })
+  useEffect(() => { fetchSearch({ query, size: 100 }).then(setData) }, [query])
+
+  const hits = data.items.filter((r) => r.ok)
+
+  return (
+    <div>
+      <div className="detail-top"><a className="back" href="#/">← 返回 query 列表</a></div>
+      <h2 className="dq">🔎 {query}</h2>
+      <div className="sub">该 query 搜到的真实帖子/视频 · 共 {hits.length} 个</div>
+
+      {hits.length === 0 ? (
+        <div className="empty">这条 query 没搜到带媒体的结果。</div>
+      ) : (
+        PLATFORMS.map((p) => {
+          const list = hits.filter((r) => r.platform === p.key)
+          const fail = data.items.find((r) => r.platform === p.key && !r.ok)
+          return (
+            <section className="pgroup" key={p.key}>
+              <div className={`ghead ${p.cls}`}>{p.label}<span className="gn">{list.length}</span></div>
+              {list.length === 0 ? (
+                <div className="gnone">未搜到{fail?.extra?.error ? `(${fail.extra.error})` : ''}</div>
+              ) : (
+                <div className="grid">{list.map((r) => <Result key={r.id} r={r} cls={p.cls} />)}</div>
+              )}
+            </section>
+          )
+        })
+      )}
+    </div>
+  )
+}
+
+function Result({ r, cls }) {
+  return (
+    <div className={`lane ${cls}`}>
+      {r.video
+        ? <video className="sv" src={r.video} controls preload="metadata" poster={r.cover || undefined} />
+        : r.cover && <img className="cover" src={r.cover} alt="" />}
+      <div className="t">{r.title || '(无标题)'}</div>
+      <div className="meta">
+        {r.extra?.nick ? `${r.extra.nick} · ` : ''}
+        {r.url && <a href={r.url} target="_blank" rel="noreferrer">打开原帖 ↗</a>}
+      </div>
+    </div>
+  )
+}

+ 110 - 0
acquisition/web/app/src/styles.css

@@ -0,0 +1,110 @@
+:root {
+  --bg: #f7f7f8;
+  --card: #fff;
+  --ink: #1a1a1f;
+  --muted: #8a8a94;
+  --line: #e6e6ea;
+  --accent: #5b5bd6;
+  --accent-soft: #ececfb;
+  --ok: #15a36a;
+  --bad: #d04646;
+}
+* { box-sizing: border-box; }
+body {
+  margin: 0;
+  background: var(--bg);
+  color: var(--ink);
+  font: 14px/1.5 -apple-system, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
+}
+a { color: var(--accent); text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+.wrap { max-width: 1180px; margin: 0 auto; padding: 22px 18px 60px; }
+h1 { font-size: 22px; margin: 0 0 2px; letter-spacing: .5px; }
+.sub { color: var(--muted); font-size: 12.5px; margin-bottom: 18px; }
+
+/* 顶部主导航 */
+.nav { display: flex; gap: 8px; margin-bottom: 16px; }
+.nav button {
+  border: 1px solid var(--line); background: var(--card); color: var(--ink);
+  padding: 7px 16px; border-radius: 9px; cursor: pointer; font-size: 13.5px;
+}
+.nav button.on { background: var(--accent); border-color: var(--accent); color: #fff; }
+
+/* 筛选条 */
+.filters { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 14px; }
+.filters select, .filters .seg {
+  border: 1px solid var(--line); background: var(--card); border-radius: 8px;
+  padding: 6px 10px; font-size: 13px; color: var(--ink);
+}
+.seg { display: inline-flex; padding: 0; overflow: hidden; }
+.seg button {
+  border: 0; background: transparent; padding: 6px 12px; cursor: pointer; font-size: 13px;
+  color: var(--muted); border-right: 1px solid var(--line);
+}
+.seg button:last-child { border-right: 0; }
+.seg button.on { background: var(--accent-soft); color: var(--accent); font-weight: 600; }
+.count { color: var(--muted); font-size: 12.5px; margin-left: auto; }
+
+/* 表格(query 列表) */
+table { width: 100%; border-collapse: collapse; background: var(--card);
+  border: 1px solid var(--line); border-radius: 12px; overflow: hidden; }
+th, td { text-align: left; padding: 9px 12px; border-bottom: 1px solid var(--line); font-size: 13px; vertical-align: top; }
+th { background: #fafafb; color: var(--muted); font-weight: 600; white-space: nowrap; }
+tr:last-child td { border-bottom: 0; }
+td.q { font-weight: 600; }
+.tag { display: inline-block; background: var(--accent-soft); color: var(--accent);
+  border-radius: 6px; padding: 1px 7px; font-size: 12px; margin: 1px 3px 1px 0; white-space: nowrap; }
+.tag.k { background: #f0f0f3; color: #555; }
+
+/* 搜索结果卡 */
+.cards { display: grid; grid-template-columns: 1fr; gap: 12px; }
+.card { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; }
+.card .head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; }
+.card .head .q { font-weight: 700; font-size: 14.5px; }
+.card .head .m { color: var(--muted); font-size: 12px; }
+.lanes { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
+.lane { border: 1px solid var(--line); border-radius: 10px; padding: 10px; background: #fcfcfd; }
+.lane .pl { font-size: 12px; font-weight: 700; margin-bottom: 8px; }
+.lane .pl.dy { color: #111; }
+.lane .pl.wx { color: #15a36a; }
+.lane video, .lane img.cover { width: 100%; max-height: 260px; object-fit: cover; border-radius: 8px; background: #000; display: block; }
+.lane .t { font-size: 12.5px; margin: 7px 0 3px; line-height: 1.45; }
+.lane .meta { color: var(--muted); font-size: 11.5px; }
+.lane .fail { color: var(--bad); font-size: 12.5px; padding: 18px 4px; text-align: center; }
+
+/* 分页 */
+.pager { display: flex; gap: 6px; align-items: center; justify-content: center; margin-top: 18px; }
+.pager button { border: 1px solid var(--line); background: var(--card); border-radius: 8px;
+  padding: 6px 12px; cursor: pointer; font-size: 13px; }
+.pager button:disabled { opacity: .4; cursor: default; }
+.pager .at { color: var(--muted); font-size: 12.5px; padding: 0 6px; }
+
+.empty { text-align: center; color: var(--muted); padding: 48px 0; font-size: 13.5px; }
+
+/* 每条 query 的「真实搜索结果」按钮 */
+.btn { display: inline-block; background: var(--accent); color: #fff; border-radius: 8px;
+  padding: 5px 11px; font-size: 12.5px; white-space: nowrap; }
+.btn:hover { text-decoration: none; opacity: .9; }
+.btn.off { background: #f1f1f4; color: var(--muted); cursor: default; }
+
+/* query 详情页(点进该 query 的多个视频) */
+.detail-top { margin-bottom: 8px; }
+.back { font-size: 13px; }
+.dq { font-size: 18px; margin: 10px 0 2px; }
+.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
+
+/* 渠道分区:抖音一组、微信公众号一组,标题色区分 */
+.pgroup { margin-top: 22px; }
+.ghead { display: flex; align-items: center; gap: 8px; font-size: 14.5px; font-weight: 700;
+  padding-bottom: 8px; margin-bottom: 14px; border-bottom: 2px solid var(--line); }
+.ghead.dy { color: #111; border-bottom-color: #111; }
+.ghead.wx { color: var(--ok); border-bottom-color: var(--ok); }
+.ghead .gn { font-size: 11.5px; font-weight: 600; color: var(--muted);
+  background: #f0f0f3; border-radius: 10px; padding: 1px 8px; }
+.gnone { color: var(--muted); font-size: 12.5px; padding: 2px 0 6px; }
+/* 卡片左侧细色条,进一步区分渠道归属 */
+.lane.dy { border-left: 3px solid #111; }
+.lane.wx { border-left: 3px solid var(--ok); }
+
+@media (max-width: 720px) { .lanes { grid-template-columns: 1fr; } }

+ 18 - 0
acquisition/web/app/vite.config.js

@@ -0,0 +1,18 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// 构建产物挂在 FastAPI 的 /app/ 下(base 必须对齐),旧看板仍占 /。
+// dev 时把数据/媒体请求代理到本地 uvicorn(8126),省去跨域。
+export default defineConfig({
+  base: '/app/',
+  plugins: [react()],
+  build: { outDir: 'dist', emptyOutDir: true },
+  server: {
+    port: 5180,
+    proxy: {
+      '/api': 'http://127.0.0.1:8126',
+      '/data': 'http://127.0.0.1:8126',
+      '/frames': 'http://127.0.0.1:8126',
+    },
+  },
+})

+ 0 - 5903
web/frameworks.json

@@ -1,5903 +0,0 @@
-{
- "count": 9,
- "posts": [
-  {
-   "post_id": "699308fa0000000016009697",
-   "source_id": "xhs_699308fa0000000016009697",
-   "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp",
-     "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "真正能爆的选题往往是由于其不只是通过大脑审核,更是通过了情绪审核,作者在发布前会感到羞耻或犹豫。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "羞耻感是好选题的防伪标签。高信息密度但不带情绪的内容(如纯干货方法论)往往数据平平,而触碰真实、冒穿透公共痛点的情绪内容更容易爆发。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_3.webp"
-    },
-    {
-     "index": 4,
-     "content": "好选题的信号:写完后感觉“发出去别人会不会觉得我在装?”或“这样说会不会太直白了?”。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_4.webp"
-    },
-    {
-     "index": 5,
-     "content": "羞耻感本质:触碰到了真实但平时大家不敢说出口、被社交礼仪包裹的内容。冒犯感:是对某种“正确共识”的冒犯,踩到了大众的神经。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_5.webp"
-    },
-    {
-     "index": 6,
-     "content": "",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_6.webp"
-    },
-    {
-     "index": 7,
-     "content": "作者的安全感(无风险选题)等于观众的无感。没有情绪触发就没有转发,也就不可能爆。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_7.webp"
-    },
-    {
-     "index": 8,
-     "content": "爆款逻辑:从加固一个信念转向撕裂一个信念(圣经句)。圣经句指赛道里人人点头但没人真信的话(如自律即自由、内容为王)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_8.webp"
-    },
-    {
-     "index": 9,
-     "content": "选题机制:找到圣经句,找到它崩塌的场景,把裂缝撕开。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_9.webp"
-    },
-    {
-     "index": 10,
-     "content": "实操第一招:寻找正确共识的失灵瞬间。列出赛道大号反复讲的共识,问:什么情况下,一个人严格按这句话做,反而越做越差?(如:内容越好,死得越快)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_10.webp"
-    },
-    {
-     "index": 11,
-     "content": "实操第二招:去竞品评论区找“但是”。在竞品爆款视频下,找那些“道理我都懂,但是……”的评论,这个“但是”就是圣经句的裂缝。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_11.webp"
-    },
-    {
-     "index": 12,
-     "content": "创作认知:内容过剩时代,观众缺的不是正确答案,而是有人帮他们说出“这个正确答案在你身上根本不好使”。",
-     "image_url": "/data/demo/xiaohongshu/xhs_699308fa0000000016009697/image_12.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "how",
-     "role": "主",
-     "parent": null,
-     "title": "“撕裂圣经句”爆款选题法",
-     "purpose": "通过撕裂赛道圣经句,找到具有情感穿透力的裂缝选题",
-     "业务阶段": [
-      "选题"
-     ],
-     "steps": [
-      {
-       "id": "s1",
-       "input": "所属赛道的常规共识",
-       "directive": "列出赛道大号反复讲的、人人点头但没人真信的“圣经句”(如:自律即自由、内容为王)。",
-       "output": "待拆解的赛道圣经句清单",
-       "出处": [
-        "卡片8"
-       ],
-       "创作阶段": "定向",
-       "动作": "列出圣经句",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "赛道共识",
-         "candidate": "赛道共识",
-         "link": "新建",
-         "score": 0.5828,
-         "top": [
-          {
-           "name": "通用共识符号",
-           "score": 0.5828,
-           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
-          },
-          {
-           "name": "赛事竞技",
-           "score": 0.5451,
-           "path": "/表象/视觉/行为/日常活动/组织活动/赛事竞技"
-          },
-          {
-           "name": "认知思辨",
-           "score": 0.5382,
-           "path": "/理念/知识/思想/概念范畴/认知思辨"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "圣经句",
-         "candidate": "圣经句",
-         "link": "新建",
-         "score": 0.5811,
-         "top": [
-          {
-           "name": "人生哲理",
-           "score": 0.5811,
-           "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
-          },
-          {
-           "name": "谚语",
-           "score": 0.566,
-           "path": "/理念/知识/文化/语言文字/谚语"
-          },
-          {
-           "name": "俗语",
-           "score": 0.5636,
-           "path": "/理念/知识/文化/语言文字/俗语"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "素材",
-         "candidate": "素材",
-         "link": "新建",
-         "score": 0.5654,
-         "top": [
-          {
-           "name": "要素引入",
-           "score": 0.5654,
-           "path": "/结构/叙事推进/承接转换/要素引入"
-          },
-          {
-           "name": "情感铺垫",
-           "score": 0.558,
-           "path": "/结构/叙事推进/铺垫准备/情感铺垫"
-          },
-          {
-           "name": "场景描绘",
-           "score": 0.5486,
-           "path": "/表达/信息传达/传达深度/详细说明/展示呈现/场景描绘"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "确定选题",
-         "candidate": "确定选题",
-         "link": "新建",
-         "score": 0.4449,
-         "top": [
-          {
-           "name": "科普",
-           "score": 0.4449,
-           "path": "/信息传递/知识传递/科普"
-          },
-          {
-           "name": "事实呈现",
-           "score": 0.4255,
-           "path": "/信息传递/事实呈现"
-          },
-          {
-           "name": "分析",
-           "score": 0.4208,
-           "path": "/信息传递/知识传递/分析"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s2",
-       "input": "← s1 的〈待拆解的赛道圣经句清单〉",
-       "directive": "寻找正确共识失灵的瞬间。针对清单中的句子提问:“什么情况下,一个人严格按这句话做,反而越做越差?”或去竞品爆款视频下寻找包含“道理我都懂,但是……”的评论。例:『内容越好,死得越快』。",
-       "output": "圣经句的逻辑裂缝/失灵场景",
-       "出处": [
-        "卡片10",
-        "卡片11"
-       ],
-       "创作阶段": "构思",
-       "动作": "寻找失灵瞬间/提取评论“但是”",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "逻辑裂缝",
-         "candidate": "逻辑裂缝",
-         "link": "新建",
-         "score": 0.6986,
-         "top": [
-          {
-           "name": "逻辑异常",
-           "score": 0.6986,
-           "path": "/理念/知识/思想/逻辑原理/逻辑异常"
-          },
-          {
-           "name": "逻辑原理",
-           "score": 0.6662,
-           "path": "/理念/知识/思想/逻辑原理"
-          },
-          {
-           "name": "应用逻辑",
-           "score": 0.6102,
-           "path": "/理念/知识/思想/逻辑原理/应用逻辑"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "共识失灵场景",
-         "candidate": "共识失灵场景",
-         "link": "新建",
-         "score": 0.5923,
-         "top": [
-          {
-           "name": "使用场景",
-           "score": 0.5923,
-           "path": "/理念/知识/商业/产品服务/使用场景"
-          },
-          {
-           "name": "通用共识符号",
-           "score": 0.5892,
-           "path": "/表象/视觉/符号/图案符号/标识图案/通用共识符号"
-          },
-          {
-           "name": "场景感悟",
-           "score": 0.5638,
-           "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "冲突切入",
-         "candidate": "冲突切入",
-         "link": "新建",
-         "score": 0.7204,
-         "top": [
-          {
-           "name": "矛盾冲突",
-           "score": 0.7204,
-           "path": "/表达/论证说理/分析论证/对比反差/矛盾冲突"
-          },
-          {
-           "name": "叙事推进",
-           "score": 0.5802,
-           "path": "/结构/叙事推进"
-          },
-          {
-           "name": "人物引入",
-           "score": 0.5691,
-           "path": "/表达/形象塑造/人物引入"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "确定选题",
-         "candidate": "确定选题",
-         "link": "新建",
-         "score": 0.4449,
-         "top": [
-          {
-           "name": "科普",
-           "score": 0.4449,
-           "path": "/信息传递/知识传递/科普"
-          },
-          {
-           "name": "事实呈现",
-           "score": 0.4255,
-           "path": "/信息传递/事实呈现"
-          },
-          {
-           "name": "分析",
-           "score": 0.4208,
-           "path": "/信息传递/知识传递/分析"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s3",
-       "input": "← s2 的〈圣经句的逻辑裂缝/失灵场景〉",
-       "directive": "把裂缝撕开,将这种“越做越差”的真实逻辑转化为选题。判据:如果写完后感到羞耻(如“这样说会不会太直白?”)或极度犹豫,说明触碰到了真实痛点。",
-       "output": "具有羞耻感与冒犯感的爆款选题",
-       "出处": [
-        "卡片4",
-        "卡片9"
-       ],
-       "创作阶段": "构思",
-       "动作": "撕开裂缝成题",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "真实痛点",
-         "candidate": "真实痛点",
-         "link": "新建",
-         "score": 0.8114,
-         "top": [
-          {
-           "name": "痛点问题",
-           "score": 0.8114,
-           "path": "/理念/知识/商业/产品服务/痛点问题"
-          },
-          {
-           "name": "真实心声",
-           "score": 0.6243,
-           "path": "/理念/观念/个人观念/人生感悟/观点表达/真实心声"
-          },
-          {
-           "name": "消费体验",
-           "score": 0.529,
-           "path": "/理念/观念/个人观念/人生感悟/内心感受/消费体验"
-          }
-         ]
-        },
-        {
-         "scope_type": "feeling",
-         "value": "羞耻感",
-         "candidate": "羞耻感",
-         "link": "新建",
-         "score": 0.6268,
-         "top": [
-          {
-           "name": "情感",
-           "score": 0.6268,
-           "path": "/情感"
-          },
-          {
-           "name": "美感",
-           "score": 0.6123,
-           "path": "/情感/美感"
-          },
-          {
-           "name": "共情",
-           "score": 0.5855,
-           "path": "/情感/共情"
-          }
-         ]
-        },
-        {
-         "scope_type": "feeling",
-         "value": "冒犯感",
-         "candidate": "冒犯感",
-         "link": "新建",
-         "score": 0.5938,
-         "top": [
-          {
-           "name": "厌恶反感",
-           "score": 0.5938,
-           "path": "/情感/共情/厌恶反感"
-          },
-          {
-           "name": "情感",
-           "score": 0.5689,
-           "path": "/情感"
-          },
-          {
-           "name": "共情",
-           "score": 0.562,
-           "path": "/情感/共情"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "痛点",
-         "candidate": "痛点",
-         "link": "新建",
-         "score": 0.5791,
-         "top": [
-          {
-           "name": "核心点明",
-           "score": 0.5791,
-           "path": "/表达/信息传达/传达手法/强调突出/核心点明"
-          },
-          {
-           "name": "解决方案",
-           "score": 0.5599,
-           "path": "/表达/论证说理/解决方案"
-          },
-          {
-           "name": "情感共鸣",
-           "score": 0.5542,
-           "path": "/表达/互动引导/情感连接/情感共鸣"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "提升传播力",
-         "candidate": "提升传播力",
-         "link": "新建",
-         "score": 0.685,
-         "top": [
-          {
-           "name": "传播",
-           "score": 0.685,
-           "path": "/信息传递/信息扩散/传播"
-          },
-          {
-           "name": "信息扩散",
-           "score": 0.5821,
-           "path": "/信息传递/信息扩散"
-          },
-          {
-           "name": "商业推广",
-           "score": 0.5501,
-           "path": "/行为引导/商业推广"
-          }
-         ]
-        }
-       ]
-      }
-     ],
-     "dropped": []
-    },
-    {
-     "id": "k2",
-     "type": "why",
-     "role": "主",
-     "parent": null,
-     "title": "爆款选题的“羞耻感”防伪定律",
-     "业务阶段": [
-      "灵感",
-      "选题"
-     ],
-     "出处": [
-      "卡片1",
-      "卡片3",
-      "卡片5",
-      "卡片7",
-      "卡片12"
-     ],
-     "阐述": "真正能爆的选题往往由于其不仅通过了大脑审核,更通过了情绪审核。羞耻感是好选题的防伪标签,它本质上触碰到了社交礼仪包裹下、平时大家不敢说出口的真实内容。在内容过剩时代,观众需要的不是正确答案,而是有人帮他们说出“正确答案在特殊场景下不好使”的真相。没有情绪触发就没有转发,作者在发布前感到的安全感(无风险选题)通常等于观众的无感。冒犯感是对“正确共识”的挑战,这种撕裂感能产生更强的穿透力和爆发力。",
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "选题防伪定律",
-       "candidate": "选题防伪定律",
-       "link": "新建",
-       "score": 0.527,
-       "top": [
-        {
-         "name": "历史规律",
-         "score": 0.527,
-         "path": "/理念/知识/历史/历史议题/历史规律"
-        },
-        {
-         "name": "防诈反骗",
-         "score": 0.5139,
-         "path": "/理念/知识/公共管理/公共安全/防诈反骗"
-        },
-        {
-         "name": "逻辑原理",
-         "score": 0.5082,
-         "path": "/理念/知识/思想/逻辑原理"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "社交礼仪真相",
-       "candidate": "社交礼仪真相",
-       "link": "新建",
-       "score": 0.682,
-       "top": [
-        {
-         "name": "礼仪规范",
-         "score": 0.682,
-         "path": "/理念/知识/文化/礼仪习俗/礼仪规范"
-        },
-        {
-         "name": "礼仪习俗",
-         "score": 0.6529,
-         "path": "/理念/知识/文化/礼仪习俗"
-        },
-        {
-         "name": "礼仪仪式",
-         "score": 0.646,
-         "path": "/表象/视觉/行为/人际互动/关系行为/礼仪仪式"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "羞耻感",
-       "candidate": "羞耻感",
-       "link": "新建",
-       "score": 0.6268,
-       "top": [
-        {
-         "name": "情感",
-         "score": 0.6268,
-         "path": "/情感"
-        },
-        {
-         "name": "美感",
-         "score": 0.6123,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "共情",
-         "score": 0.5855,
-         "path": "/情感/共情"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "撕裂感",
-       "candidate": "撕裂感",
-       "link": "新建",
-       "score": 0.5438,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.5438,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "同感",
-         "score": 0.5285,
-         "path": "/情感/同感"
-        },
-        {
-         "name": "悲伤哀痛",
-         "score": 0.5242,
-         "path": "/情感/共情/悲伤哀痛"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "情绪触发",
-       "candidate": "情绪触发",
-       "link": "新建",
-       "score": 0.6725,
-       "top": [
-        {
-         "name": "情感共鸣",
-         "score": 0.6725,
-         "path": "/表达/互动引导/情感连接/情感共鸣"
-        },
-        {
-         "name": "情感表达",
-         "score": 0.6546,
-         "path": "/表达/情感表达"
-        },
-        {
-         "name": "情感动员",
-         "score": 0.6501,
-         "path": "/表达/互动引导/情感连接/情感动员"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "共识",
-       "candidate": "共识",
-       "link": "新建",
-       "score": 0.5708,
-       "top": [
-        {
-         "name": "情感共鸣",
-         "score": 0.5708,
-         "path": "/表达/互动引导/情感连接/情感共鸣"
-        },
-        {
-         "name": "解决方案",
-         "score": 0.5452,
-         "path": "/表达/论证说理/解决方案"
-        },
-        {
-         "name": "价值肯定",
-         "score": 0.5346,
-         "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "提升转发率",
-       "candidate": "提升转发率",
-       "link": "新建",
-       "score": 0.7499,
-       "top": [
-        {
-         "name": "转发",
-         "score": 0.7499,
-         "path": "/行为引导/传播/转发"
-        },
-        {
-         "name": "商业推广",
-         "score": 0.5861,
-         "path": "/行为引导/商业推广"
-        },
-        {
-         "name": "信息扩散",
-         "score": 0.5343,
-         "path": "/信息传递/信息扩散"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k3",
-     "type": "what",
-     "role": "组件",
-     "parent": {
-      "how_id": "k1",
-      "step": 1
-     },
-     "title": "赛道“圣经句”的特征",
-     "业务阶段": [
-      "选题"
-     ],
-     "出处": [
-      "卡片8"
-     ],
-     "概要": "指在特定赛道内虽然正确但容易引发审美疲劳的共识性话语。",
-     "kind": "多维关系",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "普遍认同性",
-       "item_desc": "赛道里人人都会点头,表面上表现为“正确答案”。",
-       "作用域": []
-      },
-      {
-       "item_name": "实际体感缺失",
-       "item_desc": "在实际执行中往往没人真信,或者在特定场景下会失效、让人感到“不好使”。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "赛道圣经句",
-       "candidate": "赛道圣经句",
-       "link": "新建",
-       "score": 0.5376,
-       "top": [
-        {
-         "name": "人生哲理",
-         "score": 0.5376,
-         "path": "/理念/观念/个人观念/人生感悟/观点表达/人生哲理"
-        },
-        {
-         "name": "因果报应",
-         "score": 0.5075,
-         "path": "/理念/观念/个人观念/处世智慧/道德伦理/因果报应"
-        },
-        {
-         "name": "谚语",
-         "score": 0.5073,
-         "path": "/理念/知识/文化/语言文字/谚语"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "审美疲劳",
-       "candidate": "审美疲劳",
-       "link": "新建",
-       "score": 0.649,
-       "top": [
-        {
-         "name": "审美时尚变迁",
-         "score": 0.649,
-         "path": "/理念/现象/社会趋势/社会变迁/审美时尚变迁"
-        },
-        {
-         "name": "美学风格",
-         "score": 0.5828,
-         "path": "/表象/视觉/画面/后期/美学风格"
-        },
-        {
-         "name": "心理认知偏差",
-         "score": 0.5632,
-         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "审美疲劳感",
-       "candidate": "审美疲劳感",
-       "link": "新建",
-       "score": 0.6709,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.6709,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "视觉美感",
-         "score": 0.6522,
-         "path": "/情感/美感/视觉美感"
-        },
-        {
-         "name": "风格美感",
-         "score": 0.6179,
-         "path": "/情感/美感/风格美感"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "定义特征",
-       "candidate": "定义特征",
-       "link": "新建",
-       "score": 0.6762,
-       "top": [
-        {
-         "name": "属性定义",
-         "score": 0.6762,
-         "path": "/表达/论证说理/提炼升华/定义定性/属性定义"
-        },
-        {
-         "name": "定义定性",
-         "score": 0.588,
-         "path": "/表达/论证说理/提炼升华/定义定性"
-        },
-        {
-         "name": "界定范畴",
-         "score": 0.5611,
-         "path": "/表达/论证说理/提炼升华/定义定性/界定范畴"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "科普",
-       "candidate": "科普",
-       "link": "复用",
-       "score": 0.9994,
-       "top": [
-        {
-         "name": "科普",
-         "score": 0.9994,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "种草推荐",
-         "score": 0.611,
-         "path": "/行为引导/商业推广/种草推荐"
-        },
-        {
-         "name": "解读",
-         "score": 0.6087,
-         "path": "/信息传递/知识传递/解读"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "698481e1000000000a02a7c1",
-   "source_id": "xhs_698481e1000000000a02a7c1",
-   "title": "7种编剧常用的叙事结构,写剧不用愁!",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/698481e1000000000a02a7c1",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_3.webp",
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_4.webp",
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_5.webp",
-     "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_6.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "1. 三幕式结构:最基础的线性叙事。第一幕(开端)交代背景、人设和冲突触发;第二幕(发展)核心冲突升级,主角遭遇阻碍,是人物成长和情节铺垫关键。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "续接三幕式:第三幕(高潮与结局)矛盾爆发并解决,情节收尾。介绍了英雄之旅结构:核心是“平凡人到英雄的蜕变”,分为启程(离开舒适区)、考验(挑战与社交、对抗反派)、归来(战胜危机获成长)三个阶段。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "3. 非线性结构:打破时间先后,通过闪回、插叙、倒叙、多视角切换推进,用于制造悬念和多维度理解人物。4. 环形结构:首尾呼应形成闭环,分为非循环类(场景台词呼应)和循环类(重复经历某段事件)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_3.webp"
-    },
-    {
-     "index": 4,
-     "content": "5. 多线叙事结构:多条独立故事线并行推进并在节点汇合。每条线有独立主角和冲突,通过切换提升剧情密度,展现核心事件全貌或共同主题(如阶级、人性)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_4.webp"
-    },
-    {
-     "index": 5,
-     "content": "6. 嵌套式结构:套层结构(戏中戏、梦中梦等),外层引出内层,内外层互为影响呼应。7. 反结构:无结构/碎片化结构,抛弃线性逻辑和核心冲突,注重氛围营造、情绪表达和人性探讨。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_5.webp"
-    },
-    {
-     "index": 6,
-     "content": "续接反结构:没有传统核心冲突、成长或完整结局,靠人物状态和细节描写。适配文艺片、实验性影片。",
-     "image_url": "/data/demo/xiaohongshu/xhs_698481e1000000000a02a7c1/image_6.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "7种常用叙事结构及其适用场景",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "图1",
-      "卡片1",
-      "卡片2",
-      "卡片3",
-      "卡片4",
-      "卡片5",
-      "卡片6"
-     ],
-     "概要": "编剧常用的7种叙事结构及其核心逻辑和适用题材。",
-     "kind": "子集",
-     "维度拆分规则": "类型枚举",
-     "body": [
-      {
-       "item_name": "三幕式结构",
-       "item_desc": "最基础的线性叙事,起承转合。分为:第一幕(开端)交代背景、人设和冲突触发;第二幕(发展)核心冲突升级,主角遭遇阻碍,是人物成长和情节铺垫关键;第三幕(高潮与结局)矛盾爆发并解决,情节收尾。",
-       "作用域": []
-      },
-      {
-       "item_name": "英雄之旅结构",
-       "item_desc": "核心是“平凡人到英雄的蜕变”,适合成长弧光设计。分为三个阶段:启程(离开舒适区)、考验(挑战与社交、对抗反派)、归来(战胜危机获成长)。",
-       "作用域": []
-      },
-      {
-       "item_name": "非线性结构",
-       "item_desc": "打破时间先后,通过时间拆解重组。常用手法包括闪回、插叙、倒叙、多视角切换。适用于制造悬念和多维度理解人物。",
-       "作用域": []
-      },
-      {
-       "item_name": "环形结构",
-       "item_desc": "首尾呼应形成闭环。包含非循环类(场景台词呼应)和循环类(重复经历某段事件,如无限循环或宿命感设定)。",
-       "作用域": []
-      },
-      {
-       "item_name": "多线叙事结构",
-       "item_desc": "多条独立故事线并行并在节点汇合。每条线有独立主角和冲突,通过切换提升剧情密度,适用于展现核心事件全貌或展现共同主题(如阶级、人性)。",
-       "作用域": []
-      },
-      {
-       "item_name": "嵌套式结构",
-       "item_desc": "层层递进的套层结构(如戏中戏、梦中梦)。外层引出内层,内外层互为影响呼应。",
-       "作用域": []
-      },
-      {
-       "item_name": "反结构",
-       "item_desc": "无结构或碎片化结构,抛弃线性逻辑和核心冲突。注重氛围营造、情绪表达和人性探讨,靠人物状态和细节描写。适配文艺片、实验性影片。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "叙事结构",
-       "candidate": "叙事结构",
-       "link": "新建",
-       "score": 0.7536,
-       "top": [
-        {
-         "name": "历史叙事",
-         "score": 0.7536,
-         "path": "/理念/知识/历史/历史知识形态/历史叙事"
-        },
-        {
-         "name": "社会结构",
-         "score": 0.7226,
-         "path": "/理念/知识/社会知识/社会结构"
-        },
-        {
-         "name": "关系结构",
-         "score": 0.6959,
-         "path": "/理念/知识/思想/概念范畴/关系结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "剧本",
-       "candidate": "剧本",
-       "link": "新建",
-       "score": 0.6348,
-       "top": [
-        {
-         "name": "字幕",
-         "score": 0.6348,
-         "path": "/表象/视觉/符号/文字符号/字幕"
-        },
-        {
-         "name": "歌词唱词",
-         "score": 0.5883,
-         "path": "/表象/视觉/符号/文字符号/正文/歌词唱词"
-        },
-        {
-         "name": "演出场景",
-         "score": 0.5881,
-         "path": "/表象/视觉/空间/空间场所/演艺场地/演出场景"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "情节设计",
-       "candidate": "情节设计",
-       "link": "新建",
-       "score": 0.6103,
-       "top": [
-        {
-         "name": "场景形象",
-         "score": 0.6103,
-         "path": "/表象/视觉/符号/图案符号/形象图案/场景形象"
-        },
-        {
-         "name": "概念构想",
-         "score": 0.607,
-         "path": "/理念/知识/思想/概念范畴/认知思辨/概念构想"
-        },
-        {
-         "name": "场景感悟",
-         "score": 0.5893,
-         "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "三幕式结构",
-       "candidate": "三幕式结构",
-       "link": "新建",
-       "score": 0.6665,
-       "top": [
-        {
-         "name": "对话结构",
-         "score": 0.6665,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        },
-        {
-         "name": "叙事逻辑",
-         "score": 0.6504,
-         "path": "/架构/逻辑/叙事逻辑"
-        },
-        {
-         "name": "叙事手法",
-         "score": 0.6219,
-         "path": "/呈现/听觉/语音/表达形式/风格化解说/叙事手法"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "英雄之旅",
-       "candidate": "英雄之旅",
-       "link": "新建",
-       "score": 0.6231,
-       "top": [
-        {
-         "name": "悲壮英雄",
-         "score": 0.6231,
-         "path": "/架构/叙事/叙事格调/宏大庄严/悲壮英雄"
-        },
-        {
-         "name": "叙事逻辑",
-         "score": 0.5875,
-         "path": "/架构/逻辑/叙事逻辑"
-        },
-        {
-         "name": "奇幻",
-         "score": 0.5851,
-         "path": "/呈现/视觉/视觉风格/视觉艺术风格/虚构风格/奇幻"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "非线性叙事",
-       "candidate": "非线性叙事",
-       "link": "新建",
-       "score": 0.7804,
-       "top": [
-        {
-         "name": "叙事手法",
-         "score": 0.7804,
-         "path": "/呈现/听觉/语音/表达形式/风格化解说/叙事手法"
-        },
-        {
-         "name": "叙事逻辑",
-         "score": 0.7794,
-         "path": "/架构/逻辑/叙事逻辑"
-        },
-        {
-         "name": "叙事视角",
-         "score": 0.7529,
-         "path": "/架构/叙事/叙事视角"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "环形结构",
-       "candidate": "环形结构",
-       "link": "新建",
-       "score": 0.6553,
-       "top": [
-        {
-         "name": "分段结构",
-         "score": 0.6553,
-         "path": "/架构/逻辑/信息编排逻辑/条目列举/分段结构"
-        },
-        {
-         "name": "结构变体",
-         "score": 0.6114,
-         "path": "/架构/修辞/修辞意象/句式辞格/排比句式/结构变体"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.6085,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "多线叙事",
-       "candidate": "多线叙事",
-       "link": "新建",
-       "score": 0.7514,
-       "top": [
-        {
-         "name": "叙事手法",
-         "score": 0.7514,
-         "path": "/呈现/听觉/语音/表达形式/风格化解说/叙事手法"
-        },
-        {
-         "name": "叙事视角",
-         "score": 0.7408,
-         "path": "/架构/叙事/叙事视角"
-        },
-        {
-         "name": "叙事逻辑",
-         "score": 0.7331,
-         "path": "/架构/逻辑/叙事逻辑"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "嵌套式结构",
-       "candidate": "嵌套式结构",
-       "link": "新建",
-       "score": 0.6968,
-       "top": [
-        {
-         "name": "分段结构",
-         "score": 0.6968,
-         "path": "/架构/逻辑/信息编排逻辑/条目列举/分段结构"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.6918,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        },
-        {
-         "name": "并列结构",
-         "score": 0.6792,
-         "path": "/架构/叙事/叙事技法/对照叙事/并列结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "反结构",
-       "candidate": "反结构",
-       "link": "新建",
-       "score": 0.6283,
-       "top": [
-        {
-         "name": "逻辑反讽",
-         "score": 0.6283,
-         "path": "/架构/修辞/语调风格/讽刺犀利/讽刺手法/逻辑反讽"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.6204,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        },
-        {
-         "name": "自嘲解构",
-         "score": 0.6176,
-         "path": "/架构/修辞/语调风格/幽默戏谑/自嘲解构"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "剧情节奏",
-       "candidate": "剧情节奏",
-       "link": "新建",
-       "score": 0.6882,
-       "top": [
-        {
-         "name": "推进节奏",
-         "score": 0.6882,
-         "path": "/结构/叙事推进/推进节奏"
-        },
-        {
-         "name": "叙事推进",
-         "score": 0.6826,
-         "path": "/结构/叙事推进"
-        },
-        {
-         "name": "叙事推进节点",
-         "score": 0.6589,
-         "path": "/结构/叙事推进/叙事推进节点"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "人物弧光",
-       "candidate": "人物弧光",
-       "link": "新建",
-       "score": 0.599,
-       "top": [
-        {
-         "name": "人物引入",
-         "score": 0.599,
-         "path": "/表达/形象塑造/人物引入"
-        },
-        {
-         "name": "叙事闭合",
-         "score": 0.5911,
-         "path": "/结构/叙事推进/收束归纳/闭环收束/叙事闭合"
-        },
-        {
-         "name": "行为刻画",
-         "score": 0.5708,
-         "path": "/表达/形象塑造/行为刻画"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "教学",
-       "candidate": "教学",
-       "link": "复用",
-       "score": 1.0,
-       "top": [
-        {
-         "name": "教学",
-         "score": 1.0,
-         "path": "/信息传递/知识传递/教学"
-        },
-        {
-         "name": "知识传递",
-         "score": 0.6253,
-         "path": "/信息传递/知识传递"
-        },
-        {
-         "name": "科普",
-         "score": 0.561,
-         "path": "/信息传递/知识传递/科普"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "67e2e39b0000000003028ff0",
-   "source_id": "xhs_67e2e39b0000000003028ff0",
-   "title": "剧本创作:理解前提、人物、冲突",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_3.webp",
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_4.webp",
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_5.webp",
-     "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_6.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "1. 前提的定义:指称主题、论题、基本思想等,指引剧本达到目标;\n2. 前提的内容构成:由『作者立场+人物+冲突+结论』构成,可通过结局倒推;\n3. 人物定义:生理、心理、社会三维度综合产物,重要性排序为生理>社会>心理。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "1. 人物三维度细分清单:生理(性别、年龄、外表以及遗传特征等)、社会(阶层、职业、教育、家庭、社交等)、心理(道德标准、志向、挫折、性格、态度等);\n2. 人物的发展:由于人物面对冲突的反应(决定)产生,决定互为因果推动剧情。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "1. 人物的意志力:剧作家需要赋予人物足够的信念和毅力将斗争进行到底;\n2. 情节与人物:创作情节前自问三个问题(我应该做什么?别人会做什么?什么应该被完成?);\n3. 主使人物(主角)与对立人物:主角是运动起因的主导者,由名誉、金钱、复仇等强烈需求促使行动;对立人物需与主角同样强大、无情。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_3.webp"
-    },
-    {
-     "index": 4,
-     "content": "1. 冲突的本质:由生活环境和社会状况构成,取决于人物的决断和意志;\n2. 冲突的四种类型:\n- 静态:人物无可见发展,缺乏创造升级冲突的能力;\n- 跳跃:强迫人物作出与其本性不相符的行动;\n- 缓慢升级:编剧不干预自然产生,对立统一的人物的共同结果;\n- 预示:即张力,是对冲突的允诺。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_4.webp"
-    },
-    {
-     "index": 5,
-     "content": "1. 发现冲突的方法:列举了大量具体的人物品质形容词,通过让对立的事物/形容词代表的人相遇来制造冲突;\n2. 冲突的模式:从『攻击与反击』开始,势均力敌的对手会导致冲突不断升级并走向高潮。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_5.webp"
-    },
-    {
-     "index": 6,
-     "content": "1. 过渡(小冲突):使人物从一种精神状态进入另一种,获得发展;\n2. 切入点:必须是决定点或准备做出决定的点,通常在导致危机或人生转折的点切入;\n3. 危机、高潮与结局:重大决定构成转折点,危机的产生本身就是高潮的预示,每个场景都应包含前提、人物、冲突、过渡、危机、高潮和结局。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e2e39b0000000003028ff0/image_6.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "剧本前提的构成公式",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片1"
-     ],
-     "概要": "定义剧本目标与核心思想的内容组成结构",
-     "kind": "多维关系",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "前提构成成分",
-       "item_desc": "由『作者立场+人物+冲突+结论』构成。其本质是指称主题、论题、基本思想等,指引剧本达到目标。可以通过结局倒推,且情感可以决定前提。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "剧本前提",
-       "candidate": "剧本前提",
-       "link": "新建",
-       "score": 0.5583,
-       "top": [
-        {
-         "name": "概念构想",
-         "score": 0.5583,
-         "path": "/理念/知识/思想/概念范畴/认知思辨/概念构想"
-        },
-        {
-         "name": "标题",
-         "score": 0.546,
-         "path": "/表象/视觉/符号/文字符号/标题"
-        },
-        {
-         "name": "场景感悟",
-         "score": 0.5445,
-         "path": "/理念/观念/个人观念/人生感悟/观点表达/场景感悟"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "创作立场",
-       "candidate": "创作立场",
-       "link": "新建",
-       "score": 0.6786,
-       "top": [
-        {
-         "name": "立场表达",
-         "score": 0.6786,
-         "path": "/理念/知识/政治/国际政治/外交立场/立场表达"
-        },
-        {
-         "name": "观念立场",
-         "score": 0.6655,
-         "path": "/理念/知识/思想/概念范畴/认知思辨/观念立场"
-        },
-        {
-         "name": "标题",
-         "score": 0.636,
-         "path": "/表象/视觉/符号/文字符号/标题"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "前提公式",
-       "candidate": "前提公式",
-       "link": "新建",
-       "score": 0.6453,
-       "top": [
-        {
-         "name": "假设逻辑",
-         "score": 0.6453,
-         "path": "/架构/逻辑/叙事逻辑/假设逻辑"
-        },
-        {
-         "name": "逻辑推论",
-         "score": 0.6239,
-         "path": "/架构/逻辑/信息编排逻辑/归纳论证/逻辑推论"
-        },
-        {
-         "name": "归纳论证",
-         "score": 0.5801,
-         "path": "/架构/逻辑/信息编排逻辑/归纳论证"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "主旨指引",
-       "candidate": "主旨指引",
-       "link": "新建",
-       "score": 0.6422,
-       "top": [
-        {
-         "name": "行动引导",
-         "score": 0.6422,
-         "path": "/表达/互动引导/行动引导"
-        },
-        {
-         "name": "互动引导",
-         "score": 0.6051,
-         "path": "/表达/互动引导"
-        },
-        {
-         "name": "传播引导",
-         "score": 0.5839,
-         "path": "/表达/互动引导/行动引导/传播引导"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "立意",
-       "candidate": "立意",
-       "link": "新建",
-       "score": 0.5408,
-       "top": [
-        {
-         "name": "解读",
-         "score": 0.5408,
-         "path": "/信息传递/知识传递/解读"
-        },
-        {
-         "name": "批判",
-         "score": 0.5194,
-         "path": "/情感联结/情感抒发/批判"
-        },
-        {
-         "name": "事实呈现",
-         "score": 0.5007,
-         "path": "/信息传递/事实呈现"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k2",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "人物构成的三维度模型",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片1",
-      "卡片2"
-     ],
-     "概要": "定义人物作为一个多维度综合产物的具体构成要素",
-     "kind": "多维关系",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "生理维度",
-       "item_desc": "包含性别、年龄、外表以及遗传特征等。在重要性排序中位列第一。",
-       "作用域": []
-      },
-      {
-       "item_name": "社会维度",
-       "item_desc": "包含阶层、职业、教育、家庭、社交等。在重要性排序中位列第二。",
-       "作用域": []
-      },
-      {
-       "item_name": "心理维度",
-       "item_desc": "包含道德标准、志向、挫折、性格、态度等。是生理与社会的产物,重要性排序第三。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "人物构成",
-       "candidate": "人物构成",
-       "link": "新建",
-       "score": 0.7388,
-       "top": [
-        {
-         "name": "人物",
-         "score": 0.7388,
-         "path": "/表象/视觉/实体/人物"
-        },
-        {
-         "name": "人物形象",
-         "score": 0.7144,
-         "path": "/表象/视觉/符号/图案符号/形象图案/人物形象"
-        },
-        {
-         "name": "人物特征",
-         "score": 0.6886,
-         "path": "/表象/视觉/实体/人物/人物特征"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "生理特征",
-       "candidate": "生理特征",
-       "link": "新建",
-       "score": 0.7457,
-       "top": [
-        {
-         "name": "人物特征",
-         "score": 0.7457,
-         "path": "/表象/视觉/实体/人物/人物特征"
-        },
-        {
-         "name": "生理机制",
-         "score": 0.7123,
-         "path": "/理念/知识/身心科学/健康养生/身体健康/生理机制"
-        },
-        {
-         "name": "形态特征",
-         "score": 0.6776,
-         "path": "/表象/视觉/画面/构图/形态特征"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "社会背景",
-       "candidate": "社会背景",
-       "link": "新建",
-       "score": 0.7181,
-       "top": [
-        {
-         "name": "社会结构",
-         "score": 0.7181,
-         "path": "/理念/知识/社会知识/社会结构"
-        },
-        {
-         "name": "社会阶层",
-         "score": 0.7108,
-         "path": "/理念/现象/社会问题/文化精神/社会风气/社会阶层"
-        },
-        {
-         "name": "社会阶层",
-         "score": 0.7099,
-         "path": "/理念/知识/社会知识/社会结构/社会阶层"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "心理特质",
-       "candidate": "心理特质",
-       "link": "新建",
-       "score": 0.7241,
-       "top": [
-        {
-         "name": "心理认知",
-         "score": 0.7241,
-         "path": "/理念/知识/身心科学/心理认知"
-        },
-        {
-         "name": "心理状态问题",
-         "score": 0.6625,
-         "path": "/理念/知识/身心科学/心理认知/心理状态问题"
-        },
-        {
-         "name": "心理认知偏差",
-         "score": 0.6507,
-         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理认知偏差"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "三维度模型",
-       "candidate": "三维度模型",
-       "link": "新建",
-       "score": 0.6837,
-       "top": [
-        {
-         "name": "三维建模合成",
-         "score": 0.6837,
-         "path": "/呈现/视觉/视觉制作/后期处理/图像合成处理/三维建模合成"
-        },
-        {
-         "name": "价值塑造",
-         "score": 0.5223,
-         "path": "/架构/策略/认知引导/话语影响/立场引导/价值塑造"
-        },
-        {
-         "name": "第三人称",
-         "score": 0.5195,
-         "path": "/架构/叙事/叙事视角/人称结构/第三人称"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "刻画人物",
-       "candidate": "刻画人物",
-       "link": "新建",
-       "score": 0.5034,
-       "top": [
-        {
-         "name": "解读",
-         "score": 0.5034,
-         "path": "/信息传递/知识传递/解读"
-        },
-        {
-         "name": "科普",
-         "score": 0.4989,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "情感抒发",
-         "score": 0.4974,
-         "path": "/情感联结/情感抒发"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k3",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "剧本冲突的四种类型",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片4"
-     ],
-     "概要": "基于人物发展与行动逻辑划分的四种冲突形态",
-     "kind": "子集",
-     "维度拆分规则": "冲突的演进特征",
-     "body": [
-      {
-       "item_name": "静态冲突",
-       "item_desc": "人物无可见发展,缺乏创造升级冲突的能力时会出现此类冲突。",
-       "作用域": []
-      },
-      {
-       "item_name": "跳跃冲突",
-       "item_desc": "当强迫人物作出与其本性不相符的行动时,冲突会产生不自然的跳跃。",
-       "作用域": []
-      },
-      {
-       "item_name": "缓慢升级冲突",
-       "item_desc": "编剧不干预自然产生,是对立统一的人物的共同结果,最为推荐。",
-       "作用域": []
-      },
-      {
-       "item_name": "预示冲突",
-       "item_desc": "即张力,是对冲突的允诺,用于维持观众吸引力。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "剧本冲突",
-       "candidate": "剧本冲突",
-       "link": "新建",
-       "score": 0.7396,
-       "top": [
-        {
-         "name": "冲突对抗",
-         "score": 0.7396,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "战争冲突",
-         "score": 0.6629,
-         "path": "/理念/事件/政治事件/战争冲突"
-        },
-        {
-         "name": "地缘冲突",
-         "score": 0.6193,
-         "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "冲突分类",
-       "candidate": "冲突分类",
-       "link": "新建",
-       "score": 0.8143,
-       "top": [
-        {
-         "name": "冲突",
-         "score": 0.8143,
-         "path": "/架构/叙事/叙事技法/戏剧张力/冲突"
-        },
-        {
-         "name": "冲突对立",
-         "score": 0.7514,
-         "path": "/架构/修辞/语调风格/强硬对抗/冲突对立"
-        },
-        {
-         "name": "价值冲突",
-         "score": 0.7441,
-         "path": "/架构/叙事/叙事技法/戏剧张力/冲突/价值冲突"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "张力构建",
-       "candidate": "张力构建",
-       "link": "新建",
-       "score": 0.7069,
-       "top": [
-        {
-         "name": "情感张力",
-         "score": 0.7069,
-         "path": "/表达/论证说理/分析论证/对比反差/情感张力"
-        },
-        {
-         "name": "高潮构建",
-         "score": 0.6591,
-         "path": "/结构/叙事推进/叙事推进节点/高潮构建"
-        },
-        {
-         "name": "价值建构",
-         "score": 0.5846,
-         "path": "/表达/论证说理/提炼升华/价值建构"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "吸引力",
-       "candidate": "吸引力",
-       "link": "新建",
-       "score": 0.6577,
-       "top": [
-        {
-         "name": "吸引关注",
-         "score": 0.6577,
-         "path": "/结构/叙事推进/开篇引入/策略引入/吸引关注"
-        },
-        {
-         "name": "吸引关注",
-         "score": 0.6565,
-         "path": "/表达/互动引导/吸引关注"
-        },
-        {
-         "name": "情感张力",
-         "score": 0.6122,
-         "path": "/表达/论证说理/分析论证/对比反差/情感张力"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "期待感",
-       "candidate": "期待感",
-       "link": "新建",
-       "score": 0.7309,
-       "top": [
-        {
-         "name": "悬念期待",
-         "score": 0.7309,
-         "path": "/认知/好奇/悬念期待"
-        },
-        {
-         "name": "美感",
-         "score": 0.595,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "情感",
-         "score": 0.5686,
-         "path": "/情感"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "诊断剧情",
-       "candidate": "诊断剧情",
-       "link": "新建",
-       "score": 0.5378,
-       "top": [
-        {
-         "name": "解读",
-         "score": 0.5378,
-         "path": "/信息传递/知识传递/解读"
-        },
-        {
-         "name": "科普",
-         "score": 0.5322,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "分析",
-         "score": 0.5172,
-         "path": "/信息传递/知识传递/分析"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k4",
-     "type": "why",
-     "role": "主",
-     "parent": null,
-     "title": "冲突升级的原理与动力",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片3",
-      "卡片5"
-     ],
-     "阐述": "冲突是行动的源泉,其本质由生活环境和社会状况构成。有效的冲突源于‘对立统一’:必须让具备强烈意志力(名誉、金钱、复仇等需求)的主使人物与同样强大且无情的对立人物相遇。冲突的推进模式是‘攻击—反击’,只有势均力敌的对手通过不断的决策(互为因果)产生反应,才能驱动冲突不断升级并自然走向高潮。",
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "冲突升级",
-       "candidate": "冲突升级",
-       "link": "新建",
-       "score": 0.7897,
-       "top": [
-        {
-         "name": "冲突对抗",
-         "score": 0.7897,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "战争冲突",
-         "score": 0.741,
-         "path": "/理念/事件/政治事件/战争冲突"
-        },
-        {
-         "name": "地缘冲突",
-         "score": 0.6708,
-         "path": "/理念/知识/政治/国际政治/地缘政治/地缘冲突"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "对立统一",
-       "candidate": "对立统一",
-       "link": "新建",
-       "score": 0.8069,
-       "top": [
-        {
-         "name": "对立关系",
-         "score": 0.8069,
-         "path": "/理念/知识/思想/概念范畴/关系结构/对立关系"
-        },
-        {
-         "name": "冲突对抗",
-         "score": 0.6019,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "历史规律",
-         "score": 0.5954,
-         "path": "/理念/知识/历史/历史议题/历史规律"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "人物意志力",
-       "candidate": "人物意志力",
-       "link": "新建",
-       "score": 0.703,
-       "top": [
-        {
-         "name": "人物",
-         "score": 0.703,
-         "path": "/表象/视觉/实体/人物"
-        },
-        {
-         "name": "人物形象",
-         "score": 0.6869,
-         "path": "/表象/视觉/符号/图案符号/形象图案/人物形象"
-        },
-        {
-         "name": "人物特征",
-         "score": 0.6681,
-         "path": "/表象/视觉/实体/人物/人物特征"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "情节",
-       "candidate": "情节",
-       "link": "新建",
-       "score": 0.6231,
-       "top": [
-        {
-         "name": "场景描绘",
-         "score": 0.6231,
-         "path": "/表达/信息传达/传达深度/详细说明/展示呈现/场景描绘"
-        },
-        {
-         "name": "悬念设置",
-         "score": 0.6121,
-         "path": "/结构/叙事推进/叙事推进节点/悬念设置"
-        },
-        {
-         "name": "情感铺垫",
-         "score": 0.5923,
-         "path": "/结构/叙事推进/铺垫准备/情感铺垫"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "攻击反击模式",
-       "candidate": "攻击反击模式",
-       "link": "新建",
-       "score": 0.5701,
-       "top": [
-        {
-         "name": "结构模式",
-         "score": 0.5701,
-         "path": "/结构/结构模式"
-        },
-        {
-         "name": "矛盾冲突",
-         "score": 0.5241,
-         "path": "/表达/论证说理/分析论证/对比反差/矛盾冲突"
-        },
-        {
-         "name": "属性效能",
-         "score": 0.5136,
-         "path": "/表达/信息传达/传达手法/强调突出/属性效能"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "强化戏剧性",
-       "candidate": "强化戏剧性",
-       "link": "新建",
-       "score": 0.4946,
-       "top": [
-        {
-         "name": "事实呈现",
-         "score": 0.4946,
-         "path": "/信息传递/事实呈现"
-        },
-        {
-         "name": "情感抒发",
-         "score": 0.4753,
-         "path": "/情感联结/情感抒发"
-        },
-        {
-         "name": "情感联结",
-         "score": 0.4643,
-         "path": "/情感联结"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k5",
-     "type": "how",
-     "role": "主",
-     "parent": null,
-     "title": "剧本切入与节奏构思法",
-     "purpose": "确定剧本的起始点并梳理剧情节奏点",
-     "业务阶段": [
-      "脚本"
-     ],
-     "steps": [
-      {
-       "id": "s1",
-       "input": "初步的故事创意或灵感",
-       "directive": "寻找切入点:必须选择一个‘决定点’或‘准备做出决定的点’。例:『通常在导致危机或人生转折的点切入』。",
-       "output": "剧本的切入位置(决定点)",
-       "出处": [
-        "卡片6"
-       ],
-       "创作阶段": "结构",
-       "动作": "确定切入点",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "切入点",
-         "candidate": "切入点",
-         "link": "新建",
-         "score": 0.5861,
-         "top": [
-          {
-           "name": "痛点问题",
-           "score": 0.5861,
-           "path": "/理念/知识/商业/产品服务/痛点问题"
-          },
-          {
-           "name": "标题",
-           "score": 0.551,
-           "path": "/表象/视觉/符号/文字符号/标题"
-          },
-          {
-           "name": "方法",
-           "score": 0.5435,
-           "path": "/理念/方法"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "危机时刻",
-         "candidate": "危机时刻",
-         "link": "新建",
-         "score": 0.6917,
-         "top": [
-          {
-           "name": "紧急救援",
-           "score": 0.6917,
-           "path": "/理念/事件/社会事件/慈善公益/紧急救援"
-          },
-          {
-           "name": "困境生存",
-           "score": 0.6228,
-           "path": "/理念/现象/生活状态/困境生存"
-          },
-          {
-           "name": "救援行动",
-           "score": 0.621,
-           "path": "/表象/视觉/行为/日常活动/组织活动/救援行动"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "情节起始",
-         "candidate": "情节起始",
-         "link": "新建",
-         "score": 0.6173,
-         "top": [
-          {
-           "name": "设定铺垫",
-           "score": 0.6173,
-           "path": "/结构/叙事推进/铺垫准备/设定铺垫"
-          },
-          {
-           "name": "开篇引入",
-           "score": 0.6101,
-           "path": "/结构/叙事推进/开篇引入"
-          },
-          {
-           "name": "视觉开篇",
-           "score": 0.6047,
-           "path": "/结构/叙事推进/开篇引入/直述开篇/视觉开篇"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "规划开篇",
-         "candidate": "规划开篇",
-         "link": "新建",
-         "score": 0.4821,
-         "top": [
-          {
-           "name": "事实呈现",
-           "score": 0.4821,
-           "path": "/信息传递/事实呈现"
-          },
-          {
-           "name": "行为引导",
-           "score": 0.4773,
-           "path": "/行为引导"
-          },
-          {
-           "name": "科普",
-           "score": 0.443,
-           "path": "/信息传递/知识传递/科普"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s2",
-       "input": "← s1 的剧本切入位置(决定点)",
-       "directive": "配置过渡与危机:使用过渡(小冲突)使人物从一种状态进入另一种;重大决定构成转折点,产生危机。",
-       "output": "含过渡与危机的剧情链条",
-       "出处": [
-        "卡片6"
-       ],
-       "创作阶段": "结构",
-       "动作": "节奏排布",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "剧情过渡",
-         "candidate": "剧情过渡",
-         "link": "新建",
-         "score": 0.5987,
-         "top": [
-          {
-           "name": "场景氛围",
-           "score": 0.5987,
-           "path": "/表象/视觉/画面/后期/情绪意境/场景氛围"
-          },
-          {
-           "name": "跨越时空",
-           "score": 0.5858,
-           "path": "/表象/视觉/时间/时段/时间跨度/跨越时空"
-          },
-          {
-           "name": "旁白解说",
-           "score": 0.5777,
-           "path": "/表象/声音/语音/配音/旁白解说"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "转折点",
-         "candidate": "转折点",
-         "link": "新建",
-         "score": 0.7112,
-         "top": [
-          {
-           "name": "历史转折",
-           "score": 0.7112,
-           "path": "/理念/知识/历史/历史议题/历史转折"
-          },
-          {
-           "name": "战略转型",
-           "score": 0.5871,
-           "path": "/理念/知识/商业/运营策略/战略转型"
-          },
-          {
-           "name": "重大变局",
-           "score": 0.5866,
-           "path": "/理念/事件/政治事件/外交事件/重大变局"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "节奏控制",
-         "candidate": "节奏控制",
-         "link": "新建",
-         "score": 0.7357,
-         "top": [
-          {
-           "name": "推进节奏",
-           "score": 0.7357,
-           "path": "/结构/叙事推进/推进节奏"
-          },
-          {
-           "name": "基调设定",
-           "score": 0.5636,
-           "path": "/结构/叙事推进/开篇引入/直述开篇/基调设定"
-          },
-          {
-           "name": "叙事推进",
-           "score": 0.5523,
-           "path": "/结构/叙事推进"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "状态转换",
-         "candidate": "状态转换",
-         "link": "新建",
-         "score": 0.6903,
-         "top": [
-          {
-           "name": "内容转换",
-           "score": 0.6903,
-           "path": "/结构/叙事推进/承接转换/内容转换"
-          },
-          {
-           "name": "承接转换",
-           "score": 0.6306,
-           "path": "/结构/叙事推进/承接转换"
-          },
-          {
-           "name": "视角转换",
-           "score": 0.6181,
-           "path": "/结构/叙事推进/承接转换/视角转换"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "连接剧情",
-         "candidate": "连接剧情",
-         "link": "新建",
-         "score": 0.543,
-         "top": [
-          {
-           "name": "情感联结",
-           "score": 0.543,
-           "path": "/情感联结"
-          },
-          {
-           "name": "科普",
-           "score": 0.4916,
-           "path": "/信息传递/知识传递/科普"
-          },
-          {
-           "name": "事实呈现",
-           "score": 0.477,
-           "path": "/信息传递/事实呈现"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s3",
-       "input": "← s2 的剧情链条",
-       "directive": "推向高潮与结局:由危机预示高潮,最终通过前提的逻辑得出结局。",
-       "output": "完整的剧情结构规划(含高潮与结局)",
-       "出处": [
-        "卡片6"
-       ],
-       "创作阶段": "结构",
-       "动作": "完成大纲",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "高潮",
-         "candidate": "高潮",
-         "link": "新建",
-         "score": 0.5535,
-         "top": [
-          {
-           "name": "情感",
-           "score": 0.5535,
-           "path": "/理念/情感"
-          },
-          {
-           "name": "标题",
-           "score": 0.5417,
-           "path": "/表象/视觉/符号/文字符号/标题"
-          },
-          {
-           "name": "情绪意境",
-           "score": 0.5296,
-           "path": "/表象/视觉/画面/后期/情绪意境"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "结局",
-         "candidate": "结局",
-         "link": "新建",
-         "score": 0.6385,
-         "top": [
-          {
-           "name": "生命终结",
-           "score": 0.6385,
-           "path": "/理念/现象/生活状态/个人境遇/身心状态/生命终结"
-          },
-          {
-           "name": "标题",
-           "score": 0.6069,
-           "path": "/表象/视觉/符号/文字符号/标题"
-          },
-          {
-           "name": "战局结果",
-           "score": 0.5973,
-           "path": "/理念/知识/政治/军事安全/军事行动/战局结果"
-          }
-         ]
-        },
-        {
-         "scope_type": "form",
-         "value": "剧情结构",
-         "candidate": "剧情结构",
-         "link": "新建",
-         "score": 0.7514,
-         "top": [
-          {
-           "name": "对话结构",
-           "score": 0.7514,
-           "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-          },
-          {
-           "name": "叙事逻辑",
-           "score": 0.7212,
-           "path": "/架构/逻辑/叙事逻辑"
-          },
-          {
-           "name": "结构编排",
-           "score": 0.69,
-           "path": "/架构/策略/互动方式/号召动员/呼吁号召/结构编排"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "情节收束",
-         "candidate": "情节收束",
-         "link": "新建",
-         "score": 0.7894,
-         "top": [
-          {
-           "name": "情感收束",
-           "score": 0.7894,
-           "path": "/结构/叙事推进/收束归纳/情感收束"
-          },
-          {
-           "name": "闭环收束",
-           "score": 0.7428,
-           "path": "/结构/叙事推进/收束归纳/闭环收束"
-          },
-          {
-           "name": "收束归纳",
-           "score": 0.738,
-           "path": "/结构/叙事推进/收束归纳"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "完成叙事",
-         "candidate": "完成叙事",
-         "link": "新建",
-         "score": 0.5056,
-         "top": [
-          {
-           "name": "事实呈现",
-           "score": 0.5056,
-           "path": "/信息传递/事实呈现"
-          },
-          {
-           "name": "解读",
-           "score": 0.454,
-           "path": "/信息传递/知识传递/解读"
-          },
-          {
-           "name": "知识传递",
-           "score": 0.4346,
-           "path": "/信息传递/知识传递"
-          }
-         ]
-        }
-       ]
-      }
-     ],
-     "dropped": []
-    }
-   ]
-  },
-  {
-   "post_id": "680659e8000000001a007a11",
-   "source_id": "xhs_680659e8000000001a007a11",
-   "title": "故事设计原理拆解学习",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_3.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_4.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_5.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_6.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_7.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_8.webp",
-     "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_9.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "故事五部分构成:阐述、激励事件(诱发事件)、进展纠葛(上升动作)、危机(情节突转)、高潮(问题解决)、结局(下降动作)。激励事件分为随机(巧合)和有因(抉择)两种,通常在故事前1/4时段内发生。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "激励事件的功能:打破平衡、激发欲望。故事构思模式:最坏的事如何变成最好(或反之)。进展纠葛指人物面对抗力时产生的冲突。冲突分为内心冲突、个人冲突、个人-外界冲突。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "冲突原则:无冲突无故事。宏观结构幕设计:一个三幕故事要求四个重大场景:开篇激励事件,以及三幕各自的高潮。次情节有其自身的幕结构。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_3.webp"
-    },
-    {
-     "index": 4,
-     "content": "场景设计要素:节拍构成场景。转折点的四重效果:惊奇、增强好奇心、见识和新方向。伏笔与分晓:伏笔是知识的层层铺好,分晓是将铺设的知识传达给观众。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_4.webp"
-    },
-    {
-     "index": 5,
-     "content": "情感转变:核心情感为快感与痛感。通过价值的转变(正面/负面)引发观众情感。回报递减定理:情感连续重复效果会减少,需动态交替。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_5.webp"
-    },
-    {
-     "index": 6,
-     "content": "选择的性质:真正的选择是两难之择(不可调和的两善取其一,或两恶取其轻)。三方框架:通过人物A、B、C的三角设计形成闭合式结局和丰富冲突。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_6.webp"
-    },
-    {
-     "index": 7,
-     "content": "场景分析五步程序:1.确定冲突(明确场景目标与对抗力量);2.标注开篇价值(正/负面);3.将场景分解为节拍(动作/反应的交流);4.标注结尾价值并与开篇比较;5.概述节拍并标注转折点位置。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_7.webp"
-    },
-    {
-     "index": 8,
-     "content": "危机设计:危机是危险中的机会,是故事中最高压、最紧张的决定时刻,必须是真正的两难之境。危机揭示人物深层性格。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_8.webp"
-    },
-    {
-     "index": 9,
-     "content": "高潮与结局:高潮必须充满意义,是价值从一面到另一面的剧变。结局的用途包括:为次情节提供高潮场景、展示高潮影响、表示对观众的尊重。",
-     "image_url": "/data/demo/xiaohongshu/xhs_680659e8000000001a007a11/image_9.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "how",
-     "role": "主",
-     "parent": null,
-     "title": "场景分析五步程序",
-     "purpose": "通过五个步骤对单个场景进行深度分析与定稿",
-     "业务阶段": [
-      "脚本"
-     ],
-     "steps": [
-      {
-       "id": "s1",
-       "input": "原始场景构思",
-       "directive": "明确该场景中人物的具体目标以及阻碍目标的对抗力量。",
-       "output": "场景冲突定义",
-       "出处": [
-        "卡片7"
-       ],
-       "创作阶段": "构思",
-       "动作": "确定冲突",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "人物目标",
-         "candidate": "人物目标",
-         "link": "新建",
-         "score": 0.7195,
-         "top": [
-          {
-           "name": "人物",
-           "score": 0.7195,
-           "path": "/表象/视觉/实体/人物"
-          },
-          {
-           "name": "人物形象",
-           "score": 0.6955,
-           "path": "/表象/视觉/符号/图案符号/形象图案/人物形象"
-          },
-          {
-           "name": "人物特征",
-           "score": 0.6954,
-           "path": "/表象/视觉/实体/人物/人物特征"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "对抗力量",
-         "candidate": "对抗力量",
-         "link": "新建",
-         "score": 0.741,
-         "top": [
-          {
-           "name": "力量对比",
-           "score": 0.741,
-           "path": "/理念/知识/政治/国际政治/国际博弈/力量对比"
-          },
-          {
-           "name": "冲突对抗",
-           "score": 0.7169,
-           "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-          },
-          {
-           "name": "威慑力量",
-           "score": 0.646,
-           "path": "/理念/知识/政治/军事安全/军事力量/威慑力量"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "冲突设置",
-         "candidate": "冲突设置",
-         "link": "新建",
-         "score": 0.6911,
-         "top": [
-          {
-           "name": "矛盾冲突",
-           "score": 0.6911,
-           "path": "/表达/论证说理/分析论证/对比反差/矛盾冲突"
-          },
-          {
-           "name": "悬念设置",
-           "score": 0.5635,
-           "path": "/结构/叙事推进/叙事推进节点/悬念设置"
-          },
-          {
-           "name": "基调设定",
-           "score": 0.5116,
-           "path": "/结构/叙事推进/开篇引入/直述开篇/基调设定"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "界定冲突",
-         "candidate": "界定冲突",
-         "link": "新建",
-         "score": 0.5064,
-         "top": [
-          {
-           "name": "解读",
-           "score": 0.5064,
-           "path": "/信息传递/知识传递/解读"
-          },
-          {
-           "name": "事实呈现",
-           "score": 0.4939,
-           "path": "/信息传递/事实呈现"
-          },
-          {
-           "name": "揭露",
-           "score": 0.4884,
-           "path": "/信息传递/事实呈现/揭露"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s2",
-       "input": "← s1 的场景冲突定义",
-       "directive": "识别并标注场景开始处的核心价值状态(如:生命/死亡、爱/恨等正负面状态)。",
-       "output": "开篇价值状态",
-       "出处": [
-        "卡片7"
-       ],
-       "创作阶段": "构思",
-       "动作": "标注开篇价值",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "核心价值状态",
-         "candidate": "核心价值状态",
-         "link": "新建",
-         "score": 0.6699,
-         "top": [
-          {
-           "name": "价值观念",
-           "score": 0.6699,
-           "path": "/理念/观念/个人观念/处世智慧/价值取向/价值观念"
-          },
-          {
-           "name": "价值导向",
-           "score": 0.6612,
-           "path": "/理念/观念/个人观念/处世智慧/品格修养/价值导向"
-          },
-          {
-           "name": "具体价值观",
-           "score": 0.6471,
-           "path": "/理念/观念/个人观念/人生感悟/人生态度/具体价值观"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "状态量化",
-         "candidate": "状态量化",
-         "link": "新建",
-         "score": 0.6112,
-         "top": [
-          {
-           "name": "困境状态",
-           "score": 0.6112,
-           "path": "/表达/论证说理/分析论证/揭示溯因/困境状态"
-          },
-          {
-           "name": "定性定格",
-           "score": 0.5271,
-           "path": "/表达/形象塑造/品质体现/形象整合/定性定格"
-          },
-          {
-           "name": "内容转换",
-           "score": 0.5263,
-           "path": "/结构/叙事推进/承接转换/内容转换"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "建立基准",
-         "candidate": "建立基准",
-         "link": "新建",
-         "score": 0.4801,
-         "top": [
-          {
-           "name": "行为引导",
-           "score": 0.4801,
-           "path": "/行为引导"
-          },
-          {
-           "name": "分析",
-           "score": 0.4521,
-           "path": "/信息传递/知识传递/分析"
-          },
-          {
-           "name": "关系维护",
-           "score": 0.4436,
-           "path": "/情感联结/关系维护"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s3",
-       "input": "← s2 的开篇价值状态",
-       "directive": "将场景细化为“动作/反应”的细微交流环节。",
-       "output": "场景节拍清单",
-       "出处": [
-        "卡片7"
-       ],
-       "创作阶段": "结构",
-       "动作": "分解节拍",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "动作反应",
-         "candidate": "动作反应",
-         "link": "新建",
-         "score": 0.7537,
-         "top": [
-          {
-           "name": "反应回应",
-           "score": 0.7537,
-           "path": "/表象/视觉/行为/人际互动/反应回应"
-          },
-          {
-           "name": "动作姿态",
-           "score": 0.6936,
-           "path": "/表象/视觉/行为/表演行为/舞蹈/动作姿态"
-          },
-          {
-           "name": "惊异反应",
-           "score": 0.6647,
-           "path": "/表象/视觉/行为/人际互动/反应回应/惊异反应"
-          }
-         ]
-        },
-        {
-         "scope_type": "form",
-         "value": "场景节拍",
-         "candidate": "场景节拍",
-         "link": "新建",
-         "score": 0.6859,
-         "top": [
-          {
-           "name": "场景描写",
-           "score": 0.6859,
-           "path": "/架构/修辞/描写刻画/细节描绘/场景描写"
-          },
-          {
-           "name": "场景取景",
-           "score": 0.6844,
-           "path": "/呈现/视觉/视觉制作/实景拍摄/拍摄取景/场景取景"
-          },
-          {
-           "name": "场景植入",
-           "score": 0.6617,
-           "path": "/架构/策略/认知引导/场景植入"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "颗粒度拆解",
-         "candidate": "颗粒度拆解",
-         "link": "新建",
-         "score": 0.691,
-         "top": [
-          {
-           "name": "拆解剖析",
-           "score": 0.691,
-           "path": "/表达/论证说理/分析论证/拆解剖析"
-          },
-          {
-           "name": "分析解构",
-           "score": 0.6653,
-           "path": "/表达/信息传达/传达深度/详细说明/分析解构"
-          },
-          {
-           "name": "因果解析",
-           "score": 0.5844,
-           "path": "/表达/论证说理/分析论证/揭示溯因/原因追溯/因果解析"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "细化过程",
-         "candidate": "细化过程",
-         "link": "新建",
-         "score": 0.5248,
-         "top": [
-          {
-           "name": "裂变",
-           "score": 0.5248,
-           "path": "/行为引导/裂变"
-          },
-          {
-           "name": "信息扩散",
-           "score": 0.4961,
-           "path": "/信息传递/信息扩散"
-          },
-          {
-           "name": "分析",
-           "score": 0.4919,
-           "path": "/信息传递/知识传递/分析"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s4",
-       "input": "← s3 的场景节拍清单",
-       "directive": "标注场景结束时的价值状态,并与开篇价值进行对比,确认是否发生了转变。",
-       "output": "结尾价值对比",
-       "出处": [
-        "卡片7"
-       ],
-       "创作阶段": "打磨",
-       "动作": "标注结尾价值",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "价值转变",
-         "candidate": "价值转变",
-         "link": "新建",
-         "score": 0.7388,
-         "top": [
-          {
-           "name": "价值观念",
-           "score": 0.7388,
-           "path": "/理念/观念/个人观念/处世智慧/价值取向/价值观念"
-          },
-          {
-           "name": "价值导向",
-           "score": 0.7287,
-           "path": "/理念/观念/个人观念/处世智慧/品格修养/价值导向"
-          },
-          {
-           "name": "价值观反思",
-           "score": 0.7104,
-           "path": "/理念/现象/社会问题/文化精神/价值观反思"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "对比分析",
-         "candidate": "对比分析",
-         "link": "新建",
-         "score": 0.7469,
-         "top": [
-          {
-           "name": "对比引入",
-           "score": 0.7469,
-           "path": "/结构/叙事推进/开篇引入/策略引入/对比引入"
-          },
-          {
-           "name": "对比衬托",
-           "score": 0.7089,
-           "path": "/表达/信息传达/传达手法/强调突出/对比衬托"
-          },
-          {
-           "name": "对比反差",
-           "score": 0.693,
-           "path": "/表达/论证说理/分析论证/对比反差"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "验证有效性",
-         "candidate": "验证有效性",
-         "link": "新建",
-         "score": 0.4196,
-         "top": [
-          {
-           "name": "分析",
-           "score": 0.4196,
-           "path": "/信息传递/知识传递/分析"
-          },
-          {
-           "name": "关系维护",
-           "score": 0.3861,
-           "path": "/情感联结/关系维护"
-          },
-          {
-           "name": "解读",
-           "score": 0.3856,
-           "path": "/信息传递/知识传递/解读"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s5",
-       "input": "← s4 的结尾价值对比",
-       "directive": "对所有节拍进行总结,并精准找出发生转折的点。",
-       "output": "场景分析总结与转折点定位",
-       "出处": [
-        "卡片7"
-       ],
-       "创作阶段": "打磨",
-       "动作": "概述节拍并标注转折点",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "转折点",
-         "candidate": "转折点",
-         "link": "新建",
-         "score": 0.7099,
-         "top": [
-          {
-           "name": "历史转折",
-           "score": 0.7099,
-           "path": "/理念/知识/历史/历史议题/历史转折"
-          },
-          {
-           "name": "重大变局",
-           "score": 0.5844,
-           "path": "/理念/事件/政治事件/外交事件/重大变局"
-          },
-          {
-           "name": "战略转型",
-           "score": 0.5842,
-           "path": "/理念/知识/商业/运营策略/战略转型"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "结构总结",
-         "candidate": "结构总结",
-         "link": "新建",
-         "score": 0.7903,
-         "top": [
-          {
-           "name": "结构",
-           "score": 0.7903,
-           "path": "/结构"
-          },
-          {
-           "name": "结构导航",
-           "score": 0.7233,
-           "path": "/结构/叙事推进/开篇引入/直述开篇/结构导航"
-          },
-          {
-           "name": "结构模式",
-           "score": 0.7116,
-           "path": "/结构/结构模式"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "定位核心",
-         "candidate": "定位核心",
-         "link": "新建",
-         "score": 0.4946,
-         "top": [
-          {
-           "name": "裂变",
-           "score": 0.4946,
-           "path": "/行为引导/裂变"
-          },
-          {
-           "name": "行为引导",
-           "score": 0.4924,
-           "path": "/行为引导"
-          },
-          {
-           "name": "解读",
-           "score": 0.4779,
-           "path": "/信息传递/知识传递/解读"
-          }
-         ]
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k2",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "故事五部分构成序列",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片1"
-     ],
-     "概要": "故事在时间维度上由五个核心部分线性排列而成。",
-     "kind": "序列",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "阐述",
-       "item_desc": "故事的背景交代部分。",
-       "作用域": []
-      },
-      {
-       "item_name": "激励事件",
-       "item_desc": "打破平衡、激发欲望的诱发事件。分为随机(巧合)和有因(抉择)两种,通常在故事前1/4发生。",
-       "作用域": []
-      },
-      {
-       "item_name": "进展纠葛",
-       "item_desc": "由于抗力产生的冲突(上升动作)。",
-       "作用域": []
-      },
-      {
-       "item_name": "危机/高潮",
-       "item_desc": "危机是情节突转,高潮是问题的最终解决。",
-       "作用域": []
-      },
-      {
-       "item_name": "结局",
-       "item_desc": "故事的下降动作与收尾。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "激励事件",
-       "candidate": "激励事件",
-       "link": "新建",
-       "score": 0.7084,
-       "top": [
-        {
-         "name": "事件",
-         "score": 0.7084,
-         "path": "/理念/事件"
-        },
-        {
-         "name": "事件评价",
-         "score": 0.6426,
-         "path": "/理念/观念/社会观念/时政评议/历史评价/事件评价"
-        },
-        {
-         "name": "社会事件",
-         "score": 0.637,
-         "path": "/理念/事件/社会事件"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "进展纠葛",
-       "candidate": "进展纠葛",
-       "link": "新建",
-       "score": 0.5904,
-       "top": [
-        {
-         "name": "利益关系",
-         "score": 0.5904,
-         "path": "/理念/知识/政治/国际政治/国际博弈/利益关系"
-        },
-        {
-         "name": "关系互动",
-         "score": 0.5276,
-         "path": "/表象/视觉/行为/人际互动/关系行为/关系互动"
-        },
-        {
-         "name": "冲突对抗",
-         "score": 0.526,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "危机高潮",
-       "candidate": "危机高潮",
-       "link": "新建",
-       "score": 0.5644,
-       "top": [
-        {
-         "name": "紧急救援",
-         "score": 0.5644,
-         "path": "/理念/事件/社会事件/慈善公益/紧急救援"
-        },
-        {
-         "name": "冲突对抗",
-         "score": 0.5619,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "生命终结",
-         "score": 0.5522,
-         "path": "/理念/现象/生活状态/个人境遇/身心状态/生命终结"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "五部分序列",
-       "candidate": "五部分序列",
-       "link": "新建",
-       "score": 0.5688,
-       "top": [
-        {
-         "name": "分段结构",
-         "score": 0.5688,
-         "path": "/架构/逻辑/信息编排逻辑/条目列举/分段结构"
-        },
-        {
-         "name": "时序变迁",
-         "score": 0.5316,
-         "path": "/架构/创意/对比反差/并置对比/时空对比/时序变迁"
-        },
-        {
-         "name": "并列结构",
-         "score": 0.5315,
-         "path": "/架构/叙事/叙事技法/对照叙事/并列结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "线性结构",
-       "candidate": "线性结构",
-       "link": "新建",
-       "score": 0.6542,
-       "top": [
-        {
-         "name": "并列结构",
-         "score": 0.6542,
-         "path": "/架构/叙事/叙事技法/对照叙事/并列结构"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.632,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        },
-        {
-         "name": "分段结构",
-         "score": 0.622,
-         "path": "/架构/逻辑/信息编排逻辑/条目列举/分段结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "情节铺排",
-       "candidate": "情节铺排",
-       "link": "新建",
-       "score": 0.68,
-       "top": [
-        {
-         "name": "情感铺垫",
-         "score": 0.68,
-         "path": "/结构/叙事推进/铺垫准备/情感铺垫"
-        },
-        {
-         "name": "设定铺垫",
-         "score": 0.6664,
-         "path": "/结构/叙事推进/铺垫准备/设定铺垫"
-        },
-        {
-         "name": "悬念设置",
-         "score": 0.6624,
-         "path": "/结构/叙事推进/叙事推进节点/悬念设置"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "构建剧作架构",
-       "candidate": "构建剧作架构",
-       "link": "新建",
-       "score": 0.4717,
-       "top": [
-        {
-         "name": "事实呈现",
-         "score": 0.4717,
-         "path": "/信息传递/事实呈现"
-        },
-        {
-         "name": "解读",
-         "score": 0.4593,
-         "path": "/信息传递/知识传递/解读"
-        },
-        {
-         "name": "裂变",
-         "score": 0.4589,
-         "path": "/行为引导/裂变"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k3",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "故事冲突的三种类型",
-     "业务阶段": [
-      "灵感",
-      "脚本"
-     ],
-     "出处": [
-      "卡片2"
-     ],
-     "概要": "按冲突发生的领域划分故事对抗力的来源。",
-     "kind": "子集",
-     "维度拆分规则": "冲突范围",
-     "body": [
-      {
-       "item_name": "内心冲突",
-       "item_desc": "人物自身内部的挣扎。",
-       "作用域": []
-      },
-      {
-       "item_name": "个人冲突",
-       "item_desc": "人与人之间的直接对抗。",
-       "作用域": []
-      },
-      {
-       "item_name": "个人-外界冲突",
-       "item_desc": "人与社会、自然或未知环境的冲突。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "内心冲突",
-       "candidate": "内心冲突",
-       "link": "新建",
-       "score": 0.7141,
-       "top": [
-        {
-         "name": "内心感受",
-         "score": 0.7141,
-         "path": "/理念/观念/个人观念/人生感悟/内心感受"
-        },
-        {
-         "name": "冲突对抗",
-         "score": 0.7057,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "战争冲突",
-         "score": 0.6503,
-         "path": "/理念/事件/政治事件/战争冲突"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "个人冲突",
-       "candidate": "个人冲突",
-       "link": "新建",
-       "score": 0.7294,
-       "top": [
-        {
-         "name": "冲突对抗",
-         "score": 0.7294,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "战争冲突",
-         "score": 0.6717,
-         "path": "/理念/事件/政治事件/战争冲突"
-        },
-        {
-         "name": "个人观念",
-         "score": 0.6297,
-         "path": "/理念/观念/个人观念"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "社会环境冲突",
-       "candidate": "社会环境冲突",
-       "link": "新建",
-       "score": 0.676,
-       "top": [
-        {
-         "name": "社会问题",
-         "score": 0.676,
-         "path": "/理念/现象/社会问题"
-        },
-        {
-         "name": "冲突对抗",
-         "score": 0.6741,
-         "path": "/表象/视觉/行为/人际互动/关系行为/冲突对抗"
-        },
-        {
-         "name": "社会事件",
-         "score": 0.6694,
-         "path": "/理念/事件/社会事件"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "对抗力分类",
-       "candidate": "对抗力分类",
-       "link": "新建",
-       "score": 0.5073,
-       "top": [
-        {
-         "name": "维度对比",
-         "score": 0.5073,
-         "path": "/表达/论证说理/分析论证/对比反差/维度对比"
-        },
-        {
-         "name": "性质定性",
-         "score": 0.4761,
-         "path": "/表达/论证说理/分析论证/论证评判/定性确立/性质定性"
-        },
-        {
-         "name": "论点加固",
-         "score": 0.4688,
-         "path": "/表达/信息传达/传达手法/强调突出/论点加固"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "拓展冲突维度",
-       "candidate": "拓展冲突维度",
-       "link": "新建",
-       "score": 0.5144,
-       "top": [
-        {
-         "name": "关系维护",
-         "score": 0.5144,
-         "path": "/情感联结/关系维护"
-        },
-        {
-         "name": "信息扩散",
-         "score": 0.5135,
-         "path": "/信息传递/信息扩散"
-        },
-        {
-         "name": "裂变",
-         "score": 0.4974,
-         "path": "/行为引导/裂变"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k4",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "转折点的四重效果",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片4"
-     ],
-     "概要": "场景中发生转折时应当带给观众的四种心理感受。",
-     "kind": "多维关系",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "惊奇",
-       "item_desc": "出乎意料的效果。",
-       "作用域": []
-      },
-      {
-       "item_name": "增强好奇心",
-       "item_desc": "引导观众对后续发展的探索欲。",
-       "作用域": []
-      },
-      {
-       "item_name": "见识",
-       "item_desc": "提供新的洞察。 ",
-       "作用域": []
-      },
-      {
-       "item_name": "新方向",
-       "item_desc": "改变故事的走向。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "feeling",
-       "value": "惊奇感",
-       "candidate": "惊奇感",
-       "link": "新建",
-       "score": 0.8329,
-       "top": [
-        {
-         "name": "惊奇",
-         "score": 0.8329,
-         "path": "/认知/惊奇"
-        },
-        {
-         "name": "美感",
-         "score": 0.6178,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "悬念期待",
-         "score": 0.5833,
-         "path": "/认知/好奇/悬念期待"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "好奇心",
-       "candidate": "好奇心",
-       "link": "新建",
-       "score": 0.8113,
-       "top": [
-        {
-         "name": "好奇",
-         "score": 0.8113,
-         "path": "/认知/好奇"
-        },
-        {
-         "name": "探究求知",
-         "score": 0.6359,
-         "path": "/认知/好奇/探究求知"
-        },
-        {
-         "name": "惊奇",
-         "score": 0.631,
-         "path": "/认知/惊奇"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "洞察感",
-       "candidate": "洞察感",
-       "link": "新建",
-       "score": 0.6227,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.6227,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "情感",
-         "score": 0.609,
-         "path": "/情感"
-        },
-        {
-         "name": "同感",
-         "score": 0.6021,
-         "path": "/情感/同感"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "叙事突转",
-       "candidate": "叙事突转",
-       "link": "新建",
-       "score": 0.7011,
-       "top": [
-        {
-         "name": "叙事闭合",
-         "score": 0.7011,
-         "path": "/结构/叙事推进/收束归纳/闭环收束/叙事闭合"
-        },
-        {
-         "name": "叙事推进",
-         "score": 0.6872,
-         "path": "/结构/叙事推进"
-        },
-        {
-         "name": "叙事增色",
-         "score": 0.6512,
-         "path": "/表达/信息传达/传达深度/补充细化/叙事增色"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "强化观众体验",
-       "candidate": "强化观众体验",
-       "link": "新建",
-       "score": 0.544,
-       "top": [
-        {
-         "name": "粉丝互动",
-         "score": 0.544,
-         "path": "/情感联结/关系维护/粉丝互动"
-        },
-        {
-         "name": "商业推广",
-         "score": 0.482,
-         "path": "/行为引导/商业推广"
-        },
-        {
-         "name": "情感联结",
-         "score": 0.4706,
-         "path": "/情感联结"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k5",
-     "type": "why",
-     "role": "主",
-     "parent": null,
-     "title": "真正选择的“两难”原理",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片6",
-      "卡片8"
-     ],
-     "阐述": "真正的选择必须是两难之择,即在不可调和的两善中取其一,或在两恶中取其轻。这种危机时刻是故事中最高压、最紧张的时刻,不仅能制造强烈的冲突,还能揭示人物的深层性格。",
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "两难抉择",
-       "candidate": "两难抉择",
-       "link": "新建",
-       "score": 0.6307,
-       "top": [
-        {
-         "name": "苦难困境",
-         "score": 0.6307,
-         "path": "/理念/现象/生活状态/个人境遇/身心状态/苦难困境"
-        },
-        {
-         "name": "困境生存",
-         "score": 0.6022,
-         "path": "/理念/现象/生活状态/困境生存"
-        },
-        {
-         "name": "博弈策略",
-         "score": 0.5598,
-         "path": "/理念/知识/政治/国际政治/国际博弈/博弈策略"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "人物性格",
-       "candidate": "人物性格",
-       "link": "新建",
-       "score": 0.8264,
-       "top": [
-        {
-         "name": "人物形象",
-         "score": 0.8264,
-         "path": "/表象/视觉/符号/图案符号/形象图案/人物形象"
-        },
-        {
-         "name": "人物特征",
-         "score": 0.816,
-         "path": "/表象/视觉/实体/人物/人物特征"
-        },
-        {
-         "name": "人物评价",
-         "score": 0.8014,
-         "path": "/理念/观念/社会观念/时政评议/历史评价/人物评价"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "高压紧张感",
-       "candidate": "高压紧张感",
-       "link": "新建",
-       "score": 0.5488,
-       "top": [
-        {
-         "name": "焦虑恐惧",
-         "score": 0.5488,
-         "path": "/情感/共情/焦虑恐惧"
-        },
-        {
-         "name": "反差冲击",
-         "score": 0.5302,
-         "path": "/认知/惊奇/反差冲击"
-        },
-        {
-         "name": "舒畅松弛",
-         "score": 0.5257,
-         "path": "/情感/共情/舒畅松弛"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "性格揭示",
-       "candidate": "性格揭示",
-       "link": "新建",
-       "score": 0.6227,
-       "top": [
-        {
-         "name": "揭示溯因",
-         "score": 0.6227,
-         "path": "/表达/论证说理/分析论证/揭示溯因"
-        },
-        {
-         "name": "行为刻画",
-         "score": 0.5979,
-         "path": "/表达/形象塑造/行为刻画"
-        },
-        {
-         "name": "形象刻画",
-         "score": 0.565,
-         "path": "/表达/信息传达/传达深度/详细说明/展示呈现/形象刻画"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "制造极致冲突",
-       "candidate": "制造极致冲突",
-       "link": "新建",
-       "score": 0.5042,
-       "top": [
-        {
-         "name": "裂变",
-         "score": 0.5042,
-         "path": "/行为引导/裂变"
-        },
-        {
-         "name": "事实呈现",
-         "score": 0.5012,
-         "path": "/信息传递/事实呈现"
-        },
-        {
-         "name": "揭露",
-         "score": 0.4641,
-         "path": "/信息传递/事实呈现/揭露"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k6",
-     "type": "why",
-     "role": "主",
-     "parent": null,
-     "title": "情感回报递减定理",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片5"
-     ],
-     "阐述": "如果情感连续重复出现,其效果会随着时间减少。因此在创作中需要通过价值的正面与负面动态交替,来引导核心情感(快感与痛感)的转变,从而确保持续吸引观众。",
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "情感回报递减",
-       "candidate": "情感回报递减",
-       "link": "新建",
-       "score": 0.6368,
-       "top": [
-        {
-         "name": "情感",
-         "score": 0.6368,
-         "path": "/理念/情感"
-        },
-        {
-         "name": "情感体验",
-         "score": 0.6108,
-         "path": "/理念/观念/个人观念/人生感悟/内心感受/情感体验"
-        },
-        {
-         "name": "人际情感",
-         "score": 0.609,
-         "path": "/理念/情感/人际情感"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "正负价值交替",
-       "candidate": "正负价值交替",
-       "link": "新建",
-       "score": 0.5911,
-       "top": [
-        {
-         "name": "价值导向",
-         "score": 0.5911,
-         "path": "/理念/观念/个人观念/处世智慧/品格修养/价值导向"
-        },
-        {
-         "name": "价值思辨",
-         "score": 0.5881,
-         "path": "/理念/观念/个人观念/处世智慧/价值取向/价值思辨"
-        },
-        {
-         "name": "价值观反思",
-         "score": 0.5807,
-         "path": "/理念/现象/社会问题/文化精神/价值观反思"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "快感",
-       "candidate": "快感",
-       "link": "新建",
-       "score": 0.675,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.675,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "情感",
-         "score": 0.6308,
-         "path": "/情感"
-        },
-        {
-         "name": "风格美感",
-         "score": 0.5786,
-         "path": "/情感/美感/风格美感"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "痛感",
-       "candidate": "痛感",
-       "link": "新建",
-       "score": 0.6132,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.6132,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "情感",
-         "score": 0.5646,
-         "path": "/情感"
-        },
-        {
-         "name": "同感",
-         "score": 0.5641,
-         "path": "/情感/同感"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "动态节奏控制",
-       "candidate": "动态节奏控制",
-       "link": "新建",
-       "score": 0.657,
-       "top": [
-        {
-         "name": "推进节奏",
-         "score": 0.657,
-         "path": "/结构/叙事推进/推进节奏"
-        },
-        {
-         "name": "动态历程",
-         "score": 0.6177,
-         "path": "/表达/信息传达/传达手法/信息呈现/动态历程"
-        },
-        {
-         "name": "基调设定",
-         "score": 0.5435,
-         "path": "/结构/叙事推进/开篇引入/直述开篇/基调设定"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "维持观众注意力",
-       "candidate": "维持观众注意力",
-       "link": "新建",
-       "score": 0.5201,
-       "top": [
-        {
-         "name": "关系维护",
-         "score": 0.5201,
-         "path": "/情感联结/关系维护"
-        },
-        {
-         "name": "粉丝互动",
-         "score": 0.5113,
-         "path": "/情感联结/关系维护/粉丝互动"
-        },
-        {
-         "name": "事实呈现",
-         "score": 0.503,
-         "path": "/信息传递/事实呈现"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "67e4bdf50000000006028a59",
-   "source_id": "xhs_67e4bdf50000000006028a59",
-   "title": "只要学会这几样,写短视频脚本真的不难❗️",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_3.webp",
-     "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_4.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "短视频脚本创作流:1.确定选题;2.搭建框架(人物、场景、事件);3.细节完善(镜号、拍摄场景、画面内容描述、拍摄技巧、字幕、音乐音效、时长建议)。其中建议长视频每15秒需有重点,短视频3-5秒内呈现主题。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "脚本构思三步骤与要素:提供包含标题、视频画面、景别、角度、时长、视频文案的分镜头表格。构思建议:开门见山点名主题、提出疑问戳用户痛点、讲述故事制造起伏、抛出后续问题引发互动等。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "分镜头脚本公式:1.vlog公式(共鸣=人物+状态+情感;好奇=时间/观点+悬念等);2.脚本三要素(开头噱头、中间论述、结尾总结);3.黄金结构(引子:视觉冲击/创意起手;内容主体:故事线/节奏把握;结尾:印象点/情感/行动引导)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_3.webp"
-    },
-    {
-     "index": 4,
-     "content": "常用构图方法论:水平线构图(稳定宽广)、对角线构图(动感吸引注意力)、中心构图(主体突出)、框式构图(穿透感/神秘感)、九宫格构图(排列主体更醒目)、三分法构图(简单化复杂画面)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_67e4bdf50000000006028a59/image_4.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "how",
-     "role": "主",
-     "parent": null,
-     "title": "短视频脚本创作流",
-     "purpose": "从确定选题到完成一份包含视听细节的脚本",
-     "业务阶段": [
-      "脚本"
-     ],
-     "steps": [
-      {
-       "id": "s1",
-       "input": "创作意向/原始素材",
-       "directive": "依据创作目标确定选题。例:『确定选题』",
-       "output": "确定的选题",
-       "出处": [
-        "卡片1"
-       ],
-       "创作阶段": "定向",
-       "动作": "确定选题",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "短视频选题",
-         "candidate": "短视频选题",
-         "link": "新建",
-         "score": 0.5817,
-         "top": [
-          {
-           "name": "标题",
-           "score": 0.5817,
-           "path": "/表象/视觉/符号/文字符号/标题"
-          },
-          {
-           "name": "动效字幕",
-           "score": 0.5538,
-           "path": "/表象/视觉/符号/文字符号/字幕/动效字幕"
-          },
-          {
-           "name": "政务媒体",
-           "score": 0.5536,
-           "path": "/表象/视觉/实体/机构/政务机构/政务媒体"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "目标拆解",
-         "candidate": "目标拆解",
-         "link": "新建",
-         "score": 0.6595,
-         "top": [
-          {
-           "name": "拆解剖析",
-           "score": 0.6595,
-           "path": "/表达/论证说理/分析论证/拆解剖析"
-          },
-          {
-           "name": "分析解构",
-           "score": 0.6047,
-           "path": "/表达/信息传达/传达深度/详细说明/分析解构"
-          },
-          {
-           "name": "因果解析",
-           "score": 0.5313,
-           "path": "/表达/论证说理/分析论证/揭示溯因/原因追溯/因果解析"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "规划",
-         "candidate": "规划",
-         "link": "新建",
-         "score": 0.481,
-         "top": [
-          {
-           "name": "行为引导",
-           "score": 0.481,
-           "path": "/行为引导"
-          },
-          {
-           "name": "分析",
-           "score": 0.4797,
-           "path": "/信息传递/知识传递/分析"
-          },
-          {
-           "name": "教学",
-           "score": 0.4722,
-           "path": "/信息传递/知识传递/教学"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s2",
-       "input": "← s1 的〈确定的选题〉",
-       "directive": "围绕选题搭建核心框架,明确人物、场景和事件。例:『搭建框架(人物、场景、事件)』",
-       "output": "脚本框架(含人物、场景、事件)",
-       "出处": [
-        "卡片1"
-       ],
-       "创作阶段": "构思",
-       "动作": "搭建框架",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "脚本框架",
-         "candidate": "脚本框架",
-         "link": "新建",
-         "score": 0.5555,
-         "top": [
-          {
-           "name": "场景形象",
-           "score": 0.5555,
-           "path": "/表象/视觉/符号/图案符号/形象图案/场景形象"
-          },
-          {
-           "name": "概念构想",
-           "score": 0.551,
-           "path": "/理念/知识/思想/概念范畴/认知思辨/概念构想"
-          },
-          {
-           "name": "清单列表",
-           "score": 0.5463,
-           "path": "/表象/视觉/符号/文字符号/标注/清单列表"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "叙事要素",
-         "candidate": "叙事要素",
-         "link": "新建",
-         "score": 0.7066,
-         "top": [
-          {
-           "name": "历史叙事",
-           "score": 0.7066,
-           "path": "/理念/知识/历史/历史知识形态/历史叙事"
-          },
-          {
-           "name": "构成要素",
-           "score": 0.6372,
-           "path": "/理念/知识/思想/概念范畴/关系结构/构成要素"
-          },
-          {
-           "name": "人物故事",
-           "score": 0.5836,
-           "path": "/理念/事件/社会事件/人物故事"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "结构搭建",
-         "candidate": "结构搭建",
-         "link": "新建",
-         "score": 0.7107,
-         "top": [
-          {
-           "name": "结构",
-           "score": 0.7107,
-           "path": "/结构"
-          },
-          {
-           "name": "结构导航",
-           "score": 0.6514,
-           "path": "/结构/叙事推进/开篇引入/直述开篇/结构导航"
-          },
-          {
-           "name": "结构模式",
-           "score": 0.6231,
-           "path": "/结构/结构模式"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "规划",
-         "candidate": "规划",
-         "link": "新建",
-         "score": 0.4826,
-         "top": [
-          {
-           "name": "行为引导",
-           "score": 0.4826,
-           "path": "/行为引导"
-          },
-          {
-           "name": "分析",
-           "score": 0.4781,
-           "path": "/信息传递/知识传递/分析"
-          },
-          {
-           "name": "教学",
-           "score": 0.4747,
-           "path": "/信息传递/知识传递/教学"
-          }
-         ]
-        }
-       ]
-      },
-      {
-       "id": "s3",
-       "input": "← s2 的〈脚本框架(含人物、场景、事件)〉",
-       "directive": "将框架细化为镜头级语言。填充:镜号、拍摄场景、画面内容描述、拍摄技巧、字幕、音乐音效、时长建议。例:『细节完善』",
-       "output": "分镜头脚本成品",
-       "出处": [
-        "卡片1",
-        "卡片2"
-       ],
-       "创作阶段": "结构",
-       "动作": "细节完善",
-       "作用域": [
-        {
-         "scope_type": "substance",
-         "value": "镜头语言",
-         "candidate": "镜头语言",
-         "link": "新建",
-         "score": 0.7448,
-         "top": [
-          {
-           "name": "镜头",
-           "score": 0.7448,
-           "path": "/表象/视觉/画面/镜头"
-          },
-          {
-           "name": "影视对白",
-           "score": 0.6025,
-           "path": "/表象/视觉/符号/文字符号/正文/影视对白"
-          },
-          {
-           "name": "构图",
-           "score": 0.5953,
-           "path": "/表象/视觉/画面/构图"
-          }
-         ]
-        },
-        {
-         "scope_type": "substance",
-         "value": "制作细节",
-         "candidate": "制作细节",
-         "link": "新建",
-         "score": 0.7076,
-         "top": [
-          {
-           "name": "日常细节",
-           "score": 0.7076,
-           "path": "/理念/现象/生活状态/日常细节"
-          },
-          {
-           "name": "生活细节",
-           "score": 0.6451,
-           "path": "/理念/现象/生活状态/个人境遇/生活状态/生活细节"
-          },
-          {
-           "name": "工艺品质",
-           "score": 0.5987,
-           "path": "/理念/知识/商业/产品服务/产品特征/工艺品质"
-          }
-         ]
-        },
-        {
-         "scope_type": "form",
-         "value": "分镜头脚本",
-         "candidate": "分镜头脚本",
-         "link": "新建",
-         "score": 0.6179,
-         "top": [
-          {
-           "name": "影视素材",
-           "score": 0.6179,
-           "path": "/呈现/视觉/视觉制作/素材来源/影视素材"
-          },
-          {
-           "name": "叙事逻辑",
-           "score": 0.6057,
-           "path": "/架构/逻辑/叙事逻辑"
-          },
-          {
-           "name": "景别角度",
-           "score": 0.6022,
-           "path": "/呈现/视觉/视觉制作/构图编排/空间布局/景别角度"
-          }
-         ]
-        },
-        {
-         "scope_type": "effect",
-         "value": "执行细化",
-         "candidate": "执行细化",
-         "link": "新建",
-         "score": 0.7531,
-         "top": [
-          {
-           "name": "补充细化",
-           "score": 0.7531,
-           "path": "/表达/信息传达/传达深度/补充细化"
-          },
-          {
-           "name": "深化完善",
-           "score": 0.6008,
-           "path": "/表达/形象塑造/品质体现/形象整合/深化完善"
-          },
-          {
-           "name": "细节呈现",
-           "score": 0.5897,
-           "path": "/表达/信息传达/传达深度/详细说明/展示呈现/细节呈现"
-          }
-         ]
-        },
-        {
-         "scope_type": "intent",
-         "value": "教学",
-         "candidate": "教学",
-         "link": "复用",
-         "score": 0.9997,
-         "top": [
-          {
-           "name": "教学",
-           "score": 0.9997,
-           "path": "/信息传递/知识传递/教学"
-          },
-          {
-           "name": "知识传递",
-           "score": 0.6257,
-           "path": "/信息传递/知识传递"
-          },
-          {
-           "name": "科普",
-           "score": 0.5597,
-           "path": "/信息传递/知识传递/科普"
-          }
-         ]
-        }
-       ]
-      }
-     ],
-     "dropped": []
-    },
-    {
-     "id": "k2",
-     "type": "what",
-     "role": "组件",
-     "parent": {
-      "how_id": "k1",
-      "step": 3
-     },
-     "title": "视频分镜头要素表",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片2"
-     ],
-     "概要": "一份标准的分镜头表格应包含的构成维度",
-     "kind": "多维关系",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "镜号",
-       "item_desc": "标注镜头的先后序号",
-       "作用域": []
-      },
-      {
-       "item_name": "画面",
-       "item_desc": "描述视频的具体视觉画面内容",
-       "作用域": []
-      },
-      {
-       "item_name": "景别/角度",
-       "item_desc": "规定摄影机的拍摄距离与构图角度",
-       "作用域": []
-      },
-      {
-       "item_name": "时长",
-       "item_desc": "单个镜头的持续时间",
-       "作用域": []
-      },
-      {
-       "item_name": "视频文案",
-       "item_desc": "对应镜头的旁白、对白或台词",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "分镜头要素",
-       "candidate": "分镜头要素",
-       "link": "新建",
-       "score": 0.6184,
-       "top": [
-        {
-         "name": "构成要素",
-         "score": 0.6184,
-         "path": "/理念/知识/思想/概念范畴/关系结构/构成要素"
-        },
-        {
-         "name": "镜头",
-         "score": 0.5832,
-         "path": "/表象/视觉/画面/镜头"
-        },
-        {
-         "name": "构图",
-         "score": 0.5817,
-         "path": "/表象/视觉/画面/构图"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "分镜头表格",
-       "candidate": "分镜头表格",
-       "link": "新建",
-       "score": 0.542,
-       "top": [
-        {
-         "name": "影视素材",
-         "score": 0.542,
-         "path": "/呈现/视觉/视觉制作/素材来源/影视素材"
-        },
-        {
-         "name": "时间轴线",
-         "score": 0.5291,
-         "path": "/架构/叙事/叙事组织/脉络铺排/时间组织/时间轴线"
-        },
-        {
-         "name": "叙事逻辑",
-         "score": 0.5271,
-         "path": "/架构/逻辑/叙事逻辑"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "规范信息",
-       "candidate": "规范信息",
-       "link": "新建",
-       "score": 0.6096,
-       "top": [
-        {
-         "name": "信息呈现",
-         "score": 0.6096,
-         "path": "/表达/信息传达/传达手法/信息呈现"
-        },
-        {
-         "name": "信息传达",
-         "score": 0.6017,
-         "path": "/表达/信息传达"
-        },
-        {
-         "name": "完善补充",
-         "score": 0.5469,
-         "path": "/表达/信息传达/传达深度/补充细化/完善补充"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "科普",
-       "candidate": "科普",
-       "link": "复用",
-       "score": 0.9994,
-       "top": [
-        {
-         "name": "科普",
-         "score": 0.9994,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "种草推荐",
-         "score": 0.611,
-         "path": "/行为引导/商业推广/种草推荐"
-        },
-        {
-         "name": "解读",
-         "score": 0.6087,
-         "path": "/信息传递/知识传递/解读"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k3",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "常用的六种摄影构图法",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片4"
-     ],
-     "概要": "提升视频画面美感与表达力的六种典型布局方式",
-     "kind": "子集",
-     "维度拆分规则": "布局逻辑",
-     "body": [
-      {
-       "item_name": "水平线构图",
-       "item_desc": "利用地平线等水平元素,使画面稳定宽广",
-       "作用域": []
-      },
-      {
-       "item_name": "对角线构图",
-       "item_desc": "利用倾斜线条引导视线,增加动感,吸引注意力",
-       "作用域": []
-      },
-      {
-       "item_name": "中心构图",
-       "item_desc": "将主体放于正中心,使主体非常突出",
-       "作用域": []
-      },
-      {
-       "item_name": "框式构图",
-       "item_desc": "利用周边的元素形成框架,产生穿透感或神秘感",
-       "作用域": []
-      },
-      {
-       "item_name": "九宫格构图",
-       "item_desc": "按九宫格交叉点排列主体,使其更醒目",
-       "作用域": []
-      },
-      {
-       "item_name": "三分法构图",
-       "item_desc": "将重点分布在画面的1/3处,用于简单化复杂画面",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "摄影技术",
-       "candidate": "摄影技术",
-       "link": "新建",
-       "score": 0.6397,
-       "top": [
-        {
-         "name": "前沿技术",
-         "score": 0.6397,
-         "path": "/理念/知识/商业/前沿技术"
-        },
-        {
-         "name": "构图",
-         "score": 0.6309,
-         "path": "/表象/视觉/画面/构图"
-        },
-        {
-         "name": "机器人技术",
-         "score": 0.6304,
-         "path": "/理念/知识/商业/前沿技术/AI智能/机器人技术"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "构图布局",
-       "candidate": "构图布局",
-       "link": "新建",
-       "score": 0.8674,
-       "top": [
-        {
-         "name": "构图方式",
-         "score": 0.8674,
-         "path": "/呈现/视觉/视觉制作/构图编排/空间布局/构图方式"
-        },
-        {
-         "name": "构图编排",
-         "score": 0.8604,
-         "path": "/呈现/视觉/视觉制作/构图编排"
-        },
-        {
-         "name": "空间布局",
-         "score": 0.7087,
-         "path": "/呈现/视觉/视觉制作/构图编排/空间布局"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "美感",
-       "candidate": "美感",
-       "link": "新建",
-       "score": 0.5692,
-       "top": [
-        {
-         "name": "情感共鸣",
-         "score": 0.5692,
-         "path": "/表达/互动引导/情感连接/情感共鸣"
-        },
-        {
-         "name": "情感张力",
-         "score": 0.5689,
-         "path": "/表达/论证说理/分析论证/对比反差/情感张力"
-        },
-        {
-         "name": "情感表达",
-         "score": 0.5623,
-         "path": "/表达/情感表达"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "视觉引导",
-       "candidate": "视觉引导",
-       "link": "新建",
-       "score": 0.7313,
-       "top": [
-        {
-         "name": "行动引导",
-         "score": 0.7313,
-         "path": "/表达/互动引导/行动引导"
-        },
-        {
-         "name": "互动引导",
-         "score": 0.7215,
-         "path": "/表达/互动引导"
-        },
-        {
-         "name": "视觉开篇",
-         "score": 0.7135,
-         "path": "/结构/叙事推进/开篇引入/直述开篇/视觉开篇"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "教学",
-       "candidate": "教学",
-       "link": "复用",
-       "score": 1.0,
-       "top": [
-        {
-         "name": "教学",
-         "score": 1.0,
-         "path": "/信息传递/知识传递/教学"
-        },
-        {
-         "name": "知识传递",
-         "score": 0.6253,
-         "path": "/信息传递/知识传递"
-        },
-        {
-         "name": "科普",
-         "score": 0.561,
-         "path": "/信息传递/知识传递/科普"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k4",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "短视频脚本黄金结构",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片3"
-     ],
-     "概要": "短视频从头到尾的线性叙事组成序列",
-     "kind": "序列",
-     "维度拆分规则": null,
-     "body": [
-      {
-       "item_name": "引子",
-       "item_desc": "通过视觉冲击或创意起手,利用开头噱头抓住用户",
-       "作用域": []
-      },
-      {
-       "item_name": "内容主体",
-       "item_desc": "进行中间论述,把握故事线与节奏",
-       "作用域": []
-      },
-      {
-       "item_name": "结尾",
-       "item_desc": "总结全文,留下印象点、情感寄托或行动引导",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "叙事序列",
-       "candidate": "叙事序列",
-       "link": "新建",
-       "score": 0.7423,
-       "top": [
-        {
-         "name": "历史叙事",
-         "score": 0.7423,
-         "path": "/理念/知识/历史/历史知识形态/历史叙事"
-        },
-        {
-         "name": "关系结构",
-         "score": 0.596,
-         "path": "/理念/知识/思想/概念范畴/关系结构"
-        },
-        {
-         "name": "因果推理",
-         "score": 0.5791,
-         "path": "/理念/知识/思想/逻辑原理/因果推理"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "线性结构",
-       "candidate": "线性结构",
-       "link": "新建",
-       "score": 0.6552,
-       "top": [
-        {
-         "name": "并列结构",
-         "score": 0.6552,
-         "path": "/架构/叙事/叙事技法/对照叙事/并列结构"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.6335,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        },
-        {
-         "name": "分段结构",
-         "score": 0.6228,
-         "path": "/架构/逻辑/信息编排逻辑/条目列举/分段结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "节奏控制",
-       "candidate": "节奏控制",
-       "link": "新建",
-       "score": 0.7325,
-       "top": [
-        {
-         "name": "推进节奏",
-         "score": 0.7325,
-         "path": "/结构/叙事推进/推进节奏"
-        },
-        {
-         "name": "基调设定",
-         "score": 0.5629,
-         "path": "/结构/叙事推进/开篇引入/直述开篇/基调设定"
-        },
-        {
-         "name": "叙事推进",
-         "score": 0.5489,
-         "path": "/结构/叙事推进"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "留人钩子",
-       "candidate": "留人钩子",
-       "link": "新建",
-       "score": 0.501,
-       "top": [
-        {
-         "name": "悬念设置",
-         "score": 0.501,
-         "path": "/结构/叙事推进/叙事推进节点/悬念设置"
-        },
-        {
-         "name": "结构回扣",
-         "score": 0.4456,
-         "path": "/结构/叙事推进/收束归纳/闭环收束/结构回扣"
-        },
-        {
-         "name": "动机激发",
-         "score": 0.4281,
-         "path": "/表达/信息传达/传达手法/强调突出/动机激发"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "逻辑梳理",
-       "candidate": "逻辑梳理",
-       "link": "新建",
-       "score": 0.5789,
-       "top": [
-        {
-         "name": "事实呈现",
-         "score": 0.5789,
-         "path": "/信息传递/事实呈现"
-        },
-        {
-         "name": "分析",
-         "score": 0.5635,
-         "path": "/信息传递/知识传递/分析"
-        },
-        {
-         "name": "解读",
-         "score": 0.5486,
-         "path": "/信息传递/知识传递/解读"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k5",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "Vlog脚本创作公式清单",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片3"
-     ],
-     "概要": "针对不同情绪反馈的Vlog内容构成方案",
-     "kind": "子集",
-     "维度拆分规则": "想引发的观众反应",
-     "body": [
-      {
-       "item_name": "共鸣公式",
-       "item_desc": "共鸣 = 人物 + 状态 + 情感",
-       "作用域": []
-      },
-      {
-       "item_name": "好奇公式",
-       "item_desc": "好奇 = 时间/观点 + 悬念",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "Vlog内容要素",
-       "candidate": "Vlog内容要素",
-       "link": "新建",
-       "score": 0.519,
-       "top": [
-        {
-         "name": "构成要素",
-         "score": 0.519,
-         "path": "/理念/知识/思想/概念范畴/关系结构/构成要素"
-        },
-        {
-         "name": "动效字幕",
-         "score": 0.5041,
-         "path": "/表象/视觉/符号/文字符号/字幕/动效字幕"
-        },
-        {
-         "name": "构图",
-         "score": 0.4993,
-         "path": "/表象/视觉/画面/构图"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "创作公式",
-       "candidate": "创作公式",
-       "link": "新建",
-       "score": 0.5841,
-       "top": [
-        {
-         "name": "改编创作",
-         "score": 0.5841,
-         "path": "/架构/修辞/修辞意象/意象引述/改编创作"
-        },
-        {
-         "name": "符号转化",
-         "score": 0.5603,
-         "path": "/架构/修辞/修辞意象/比拟转化/符号转化"
-        },
-        {
-         "name": "视觉制作",
-         "score": 0.5576,
-         "path": "/呈现/视觉/视觉制作"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "共鸣感",
-       "candidate": "共鸣感",
-       "link": "新建",
-       "score": 0.7758,
-       "top": [
-        {
-         "name": "角色代入共鸣",
-         "score": 0.7758,
-         "path": "/情感/同感/角色代入共鸣"
-        },
-        {
-         "name": "身份归属共鸣",
-         "score": 0.7487,
-         "path": "/情感/同感/身份归属共鸣"
-        },
-        {
-         "name": "情绪处境共鸣",
-         "score": 0.7387,
-         "path": "/情感/同感/情绪处境共鸣"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "好奇感",
-       "candidate": "好奇感",
-       "link": "新建",
-       "score": 0.7321,
-       "top": [
-        {
-         "name": "好奇",
-         "score": 0.7321,
-         "path": "/认知/好奇"
-        },
-        {
-         "name": "美感",
-         "score": 0.6044,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "悬念期待",
-         "score": 0.5529,
-         "path": "/认知/好奇/悬念期待"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "情绪调动",
-       "candidate": "情绪调动",
-       "link": "新建",
-       "score": 0.7497,
-       "top": [
-        {
-         "name": "情感动员",
-         "score": 0.7497,
-         "path": "/表达/互动引导/情感连接/情感动员"
-        },
-        {
-         "name": "动机激发",
-         "score": 0.6621,
-         "path": "/表达/信息传达/传达手法/强调突出/动机激发"
-        },
-        {
-         "name": "情感共鸣",
-         "score": 0.6611,
-         "path": "/表达/互动引导/情感连接/情感共鸣"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "方法建模",
-       "candidate": "方法建模",
-       "link": "新建",
-       "score": 0.5298,
-       "top": [
-        {
-         "name": "行为引导",
-         "score": 0.5298,
-         "path": "/行为引导"
-        },
-        {
-         "name": "分析",
-         "score": 0.5138,
-         "path": "/信息传递/知识传递/分析"
-        },
-        {
-         "name": "教学",
-         "score": 0.4942,
-         "path": "/信息传递/知识传递/教学"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k6",
-     "type": "why",
-     "role": "主",
-     "parent": null,
-     "title": "视频节奏的时长分配原理",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片1"
-     ],
-     "概要": "根据视频长度调整注意力分配与主题呈现速度的原则",
-     "阐述": "长视频需要通过周期性的刺激来维持用户注意力,通常每15秒需设置一个重点内容;而短视频留给创作者的时间极短,必须在3-5秒内迅速呈现出核心主题,否则用户极易流失。",
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "视频时长",
-       "candidate": "视频时长",
-       "link": "新建",
-       "score": 0.8209,
-       "top": [
-        {
-         "name": "具体时长",
-         "score": 0.8209,
-         "path": "/表象/视觉/时间/时段/时间跨度/具体时长"
-        },
-        {
-         "name": "时间",
-         "score": 0.6025,
-         "path": "/表象/视觉/时间"
-        },
-        {
-         "name": "时间跨度",
-         "score": 0.5975,
-         "path": "/表象/视觉/时间/时段/时间跨度"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "重心分配",
-       "candidate": "重心分配",
-       "link": "新建",
-       "score": 0.6311,
-       "top": [
-        {
-         "name": "资源分配",
-         "score": 0.6311,
-         "path": "/理念/知识/政治/国家治理/政策制度/资源分配"
-        },
-        {
-         "name": "构图",
-         "score": 0.5186,
-         "path": "/表象/视觉/画面/构图"
-        },
-        {
-         "name": "力量对比",
-         "score": 0.5117,
-         "path": "/理念/知识/政治/国际政治/国际博弈/力量对比"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "节奏编排",
-       "candidate": "节奏编排",
-       "link": "新建",
-       "score": 0.803,
-       "top": [
-        {
-         "name": "节奏控制",
-         "score": 0.803,
-         "path": "/呈现/视觉/视觉制作/剪辑组接/剪辑手法/节奏控制"
-        },
-        {
-         "name": "节奏韵律",
-         "score": 0.7624,
-         "path": "/架构/修辞/修辞意象/句式辞格/韵律句式/节奏韵律"
-        },
-        {
-         "name": "节奏特征",
-         "score": 0.7311,
-         "path": "/呈现/听觉/配乐/节奏特征"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "注意力保持",
-       "candidate": "注意力保持",
-       "link": "新建",
-       "score": 0.5565,
-       "top": [
-        {
-         "name": "回归聚焦",
-         "score": 0.5565,
-         "path": "/结构/叙事推进/收束归纳/回归聚焦"
-        },
-        {
-         "name": "动机激发",
-         "score": 0.5556,
-         "path": "/表达/信息传达/传达手法/强调突出/动机激发"
-        },
-        {
-         "name": "吸引关注",
-         "score": 0.5521,
-         "path": "/结构/叙事推进/开篇引入/策略引入/吸引关注"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "科普",
-       "candidate": "科普",
-       "link": "复用",
-       "score": 0.9994,
-       "top": [
-        {
-         "name": "科普",
-         "score": 0.9994,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "种草推荐",
-         "score": 0.611,
-         "path": "/行为引导/商业推广/种草推荐"
-        },
-        {
-         "name": "解读",
-         "score": 0.6087,
-         "path": "/信息传递/知识传递/解读"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "6901e15a0000000003019fa3",
-   "source_id": "xhs_6901e15a0000000003019fa3",
-   "title": "爆款标题公式直接抄❗️笔记想不火都难",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/6901e15a0000000003019fa3",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_1.webp",
-     "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_2.webp",
-     "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_3.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "3个万能公式:1. 时间+结果+经验(例:半年时间涨粉11w,全靠这个万能公式);2. 痛点+解决方法+保证(例:小红书不涨粉,3大技巧照做就对了);3. 方法+保证(例:傻瓜式化妆手法,有手就行)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_1.webp"
-    },
-    {
-     "index": 2,
-     "content": "前4种标题技巧:1. 提问式(用困惑开头直击需求);2. 设问式(先抛问题再给方案,勾起好奇预告价值);3. 数字式(具体数字降低决策成本,自带干货感);4. 利益式(把用户能得到的好处摆上台面)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_2.webp"
-    },
-    {
-     "index": 3,
-     "content": "后5种标题技巧:5. 悬念式(藏起关键细节,只说一半内容激发好奇);6. 对比式(制造差异感和冲突感);7. 劝诫式(利用避坑心理,抓住用户怕失去的重视感);8. 共情式(说出用户想说没说的话引发共鸣);9. 热点式(绑定节日、热门事件借势营销)。",
-     "image_url": "/data/demo/xiaohongshu/xhs_6901e15a0000000003019fa3/image_3.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "小红书笔记标题3个万能公式",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片1"
-     ],
-     "概要": "提供三种可直接套用的标题组块逻辑,通过组合时间、结果、痛点等要素吸引点击。",
-     "kind": "子集",
-     "维度拆分规则": "标题构成的侧重点",
-     "body": [
-      {
-       "item_name": "时间+结果+经验",
-       "item_desc": "构成要素为具体的执行时间、达成的结果及总结的经验。适用于有具体成果背书的内容。例:『半年时间涨粉11w,全靠这个万能公式』,用具象数字和结果钩住用户。",
-       "作用域": []
-      },
-      {
-       "item_name": "痛点+解决方法+保证",
-       "item_desc": "构成要素为点出用户当下的困扰、给出对策并提供效果承诺。适用于攻略类或教程类内容。例:『小红书不涨粉,3大技巧照做就对了』,精准戳中需求并下承诺。",
-       "作用域": []
-      },
-      {
-       "item_name": "方法+保证",
-       "item_desc": "直接展示操作方法并给予效果保障。旨在传达一种易操作感,降低用户的决策/学习门槛。例:『傻瓜式化妆手法,有手就行』。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "笔记标题",
-       "candidate": "笔记标题",
-       "link": "新建",
-       "score": 0.7256,
-       "top": [
-        {
-         "name": "标题",
-         "score": 0.7256,
-         "path": "/表象/视觉/符号/文字符号/标题"
-        },
-        {
-         "name": "说明注释",
-         "score": 0.5897,
-         "path": "/表象/视觉/符号/文字符号/标注/说明注释"
-        },
-        {
-         "name": "标注",
-         "score": 0.5583,
-         "path": "/表象/视觉/符号/文字符号/标注"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "标题公式",
-       "candidate": "标题公式",
-       "link": "新建",
-       "score": 0.7428,
-       "top": [
-        {
-         "name": "标题",
-         "score": 0.7428,
-         "path": "/表象/视觉/符号/文字符号/标题"
-        },
-        {
-         "name": "正文",
-         "score": 0.5705,
-         "path": "/表象/视觉/符号/文字符号/正文"
-        },
-        {
-         "name": "数据字幕",
-         "score": 0.5522,
-         "path": "/表象/视觉/符号/文字符号/字幕/数据字幕"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "标题结构",
-       "candidate": "标题结构",
-       "link": "新建",
-       "score": 0.7505,
-       "top": [
-        {
-         "name": "结构编排",
-         "score": 0.7505,
-         "path": "/架构/叙事/叙事组织/脉络铺排/结构编排"
-        },
-        {
-         "name": "结构编排",
-         "score": 0.7505,
-         "path": "/架构/策略/互动方式/号召动员/呼吁号召/结构编排"
-        },
-        {
-         "name": "对话结构",
-         "score": 0.7247,
-         "path": "/架构/叙事/叙事体裁/演说交流/对话访谈/对话结构"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "点击吸引",
-       "candidate": "点击吸引",
-       "link": "新建",
-       "score": 0.7086,
-       "top": [
-        {
-         "name": "吸引关注",
-         "score": 0.7086,
-         "path": "/表达/互动引导/吸引关注"
-        },
-        {
-         "name": "吸引关注",
-         "score": 0.7083,
-         "path": "/结构/叙事推进/开篇引入/策略引入/吸引关注"
-        },
-        {
-         "name": "互动引导",
-         "score": 0.5995,
-         "path": "/表达/互动引导"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "价值传达",
-       "candidate": "价值传达",
-       "link": "新建",
-       "score": 0.7605,
-       "top": [
-        {
-         "name": "信息传达",
-         "score": 0.7605,
-         "path": "/表达/信息传达"
-        },
-        {
-         "name": "价值建构",
-         "score": 0.7055,
-         "path": "/表达/论证说理/提炼升华/价值建构"
-        },
-        {
-         "name": "传达深度",
-         "score": 0.7025,
-         "path": "/表达/信息传达/传达深度"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "起标题",
-       "candidate": "起标题",
-       "link": "新建",
-       "score": 0.5213,
-       "top": [
-        {
-         "name": "解读",
-         "score": 0.5213,
-         "path": "/信息传递/知识传递/解读"
-        },
-        {
-         "name": "科普",
-         "score": 0.5188,
-         "path": "/信息传递/知识传递/科普"
-        },
-        {
-         "name": "事实呈现",
-         "score": 0.511,
-         "path": "/信息传递/事实呈现"
-        }
-       ]
-      }
-     ]
-    },
-    {
-     "id": "k2",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "标题创作的9种实用技巧",
-     "业务阶段": [
-      "脚本"
-     ],
-     "出处": [
-      "卡片2",
-      "卡片3"
-     ],
-     "概要": "通过不同的切入点和心理触点,改变标题的表达方式以提升点击率。",
-     "kind": "子集",
-     "维度拆分规则": "类型枚举",
-     "body": [
-      {
-       "item_name": "提问式",
-       "item_desc": "用困惑开头直击需求,直接命中用户的疑问或痛点。",
-       "作用域": []
-      },
-      {
-       "item_name": "设问式",
-       "item_desc": "先抛问题再给方案,通过自问自答勾起好奇心并预告内容价值。",
-       "作用域": []
-      },
-      {
-       "item_name": "数字式",
-       "item_desc": "使用具体数字(如价格、数量、天数等),增强干货感并降低用户的决策成本。",
-       "作用域": []
-      },
-      {
-       "item_name": "利益式",
-       "item_desc": "直接展现价值,把用户能通过笔记得到的好处摆在台面上。",
-       "作用域": []
-      },
-      {
-       "item_name": "悬念式",
-       "item_desc": "隐藏关键细节或结论,只说一半内容,激发点击进去寻找答案的好奇心。",
-       "作用域": []
-      },
-      {
-       "item_name": "对比式",
-       "item_desc": "通过前后或不同对象之间的状态对比,制造差异感和冲突感。",
-       "作用域": []
-      },
-      {
-       "item_name": "劝诫式",
-       "item_desc": "利用避坑和规避损失的心理,抓住用户害怕失去或犯错的重视感。",
-       "作用域": []
-      },
-      {
-       "item_name": "共情式",
-       "item_desc": "替人发声,说出用户想说但没说出的话,以此引发强烈的情绪共鸣。",
-       "作用域": []
-      },
-      {
-       "item_name": "热点式",
-       "item_desc": "绑定节日、热门人物或社会热点事件进行借势营销。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "笔记标题",
-       "candidate": "笔记标题",
-       "link": "新建",
-       "score": 0.7256,
-       "top": [
-        {
-         "name": "标题",
-         "score": 0.7256,
-         "path": "/表象/视觉/符号/文字符号/标题"
-        },
-        {
-         "name": "说明注释",
-         "score": 0.5897,
-         "path": "/表象/视觉/符号/文字符号/标注/说明注释"
-        },
-        {
-         "name": "标注",
-         "score": 0.5583,
-         "path": "/表象/视觉/符号/文字符号/标注"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "心理触点",
-       "candidate": "心理触点",
-       "link": "新建",
-       "score": 0.6499,
-       "top": [
-        {
-         "name": "心理认知",
-         "score": 0.6499,
-         "path": "/理念/知识/身心科学/心理认知"
-        },
-        {
-         "name": "心理调节",
-         "score": 0.6238,
-         "path": "/理念/知识/身心科学/心理认知/心理状态问题/心理调节"
-        },
-        {
-         "name": "心理状态问题",
-         "score": 0.6159,
-         "path": "/理念/知识/身心科学/心理认知/心理状态问题"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "提问式",
-       "candidate": "提问式",
-       "link": "新建",
-       "score": 0.8162,
-       "top": [
-        {
-         "name": "设问式",
-         "score": 0.8162,
-         "path": "/架构/修辞/修辞意象/句式辞格/问答句式/设问式"
-        },
-        {
-         "name": "反问式",
-         "score": 0.7928,
-         "path": "/架构/修辞/修辞意象/句式辞格/问答句式/反问式"
-        },
-        {
-         "name": "问答句式",
-         "score": 0.7431,
-         "path": "/架构/修辞/修辞意象/句式辞格/问答句式"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "对比式",
-       "candidate": "对比式",
-       "link": "新建",
-       "score": 0.7563,
-       "top": [
-        {
-         "name": "对比反差",
-         "score": 0.7563,
-         "path": "/架构/创意/对比反差"
-        },
-        {
-         "name": "差异对比",
-         "score": 0.7422,
-         "path": "/架构/创意/对比反差/反差错位/通用反差/差异对比"
-        },
-        {
-         "name": "对比分析",
-         "score": 0.7415,
-         "path": "/架构/逻辑/信息编排逻辑/归纳论证/分析解读/对比分析"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "好奇感",
-       "candidate": "好奇感",
-       "link": "新建",
-       "score": 0.7313,
-       "top": [
-        {
-         "name": "好奇",
-         "score": 0.7313,
-         "path": "/认知/好奇"
-        },
-        {
-         "name": "美感",
-         "score": 0.602,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "悬念期待",
-         "score": 0.5508,
-         "path": "/认知/好奇/悬念期待"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "共鸣感",
-       "candidate": "共鸣感",
-       "link": "新建",
-       "score": 0.7737,
-       "top": [
-        {
-         "name": "角色代入共鸣",
-         "score": 0.7737,
-         "path": "/情感/同感/角色代入共鸣"
-        },
-        {
-         "name": "身份归属共鸣",
-         "score": 0.7461,
-         "path": "/情感/同感/身份归属共鸣"
-        },
-        {
-         "name": "情绪处境共鸣",
-         "score": 0.7365,
-         "path": "/情感/同感/情绪处境共鸣"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "悬念设置",
-       "candidate": "悬念设置",
-       "link": "复用",
-       "score": 1.0,
-       "top": [
-        {
-         "name": "悬念设置",
-         "score": 1.0,
-         "path": "/结构/叙事推进/叙事推进节点/悬念设置"
-        },
-        {
-         "name": "情感铺垫",
-         "score": 0.6462,
-         "path": "/结构/叙事推进/铺垫准备/情感铺垫"
-        },
-        {
-         "name": "设定铺垫",
-         "score": 0.6262,
-         "path": "/结构/叙事推进/铺垫准备/设定铺垫"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "利益承诺",
-       "candidate": "利益承诺",
-       "link": "新建",
-       "score": 0.5615,
-       "top": [
-        {
-         "name": "价值肯定",
-         "score": 0.5615,
-         "path": "/表达/论证说理/分析论证/论证评判/肯定论证/价值肯定"
-        },
-        {
-         "name": "价值升华",
-         "score": 0.5195,
-         "path": "/结构/叙事推进/收束归纳/闭环收束/价值升华"
-        },
-        {
-         "name": "方案提供",
-         "score": 0.5064,
-         "path": "/表达/信息传达/传达手法/信息呈现/方案提供"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "提升点击率",
-       "candidate": "提升点击率",
-       "link": "新建",
-       "score": 0.5962,
-       "top": [
-        {
-         "name": "商业推广",
-         "score": 0.5962,
-         "path": "/行为引导/商业推广"
-        },
-        {
-         "name": "转发",
-         "score": 0.513,
-         "path": "/行为引导/传播/转发"
-        },
-        {
-         "name": "种草推荐",
-         "score": 0.5095,
-         "path": "/行为引导/商业推广/种草推荐"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "69ff58670000000023016fa2",
-   "source_id": "xhs_69ff58670000000023016fa2",
-   "title": "海外营销灵感|五月爆款Reels创意合集",
-   "platform": "xiaohongshu",
-   "url": "https://www.xiaohongshu.com/explore/69ff58670000000023016fa2",
-   "media": {
-    "type": "image",
-    "video_url": null,
-    "images": [
-     "/data/demo/xiaohongshu/xhs_69ff58670000000023016fa2/image_1.webp"
-    ]
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "",
-     "image_url": "/data/demo/xiaohongshu/xhs_69ff58670000000023016fa2/image_1.webp"
-    }
-   ],
-   "knowledges": [
-    {
-     "id": "k1",
-     "type": "what",
-     "role": "主",
-     "parent": null,
-     "title": "海外短视频爆款创意策略清单",
-     "业务阶段": [
-      "灵感",
-      "脚本"
-     ],
-     "出处": [
-      "卡片2",
-      "卡片3",
-      "卡片4"
-     ],
-     "概要": "针对海外Reels视频创作的三种可迁移的爆款创意表现形式。",
-     "kind": "子集",
-     "维度拆分规则": "类型枚举",
-     "body": [
-      {
-       "item_name": "超现实主义(SURREALISM)",
-       "item_desc": "将日常生活物品巨大化。通过体积对比产生视觉冲击力,创造新鲜感。适合原材料/纯净成分品牌进行视觉吸引。例:@the_ordinary。",
-       "作用域": []
-      },
-      {
-       "item_name": "错觉式转场(ILLUSION TRANSTION)",
-       "item_desc": "利用看似背景的物体作为遮挡或引导进行转场,利用背景与前景的巧妙一致性。适合低预算追求高质量质感的创作场景。",
-       "作用域": []
-      },
-      {
-       "item_name": "反差式展示(THE PROUD FOUNDER)",
-       "item_desc": "创始人先展示凌乱、未修边幅的状态(Rotting),接着切入作为成功品牌创始人的自信状态。利用巨大的心理与视觉落差产生张力,适合用于与潜在客户建立情感联结。",
-       "作用域": []
-      }
-     ],
-     "作用域": [
-      {
-       "scope_type": "substance",
-       "value": "日常生活物品",
-       "candidate": "日常生活物品",
-       "link": "新建",
-       "score": 0.8234,
-       "top": [
-        {
-         "name": "生活日用品",
-         "score": 0.8234,
-         "path": "/表象/视觉/实体/物品/生活日用品"
-        },
-        {
-         "name": "物品",
-         "score": 0.7176,
-         "path": "/表象/视觉/实体/物品"
-        },
-        {
-         "name": "日常活动",
-         "score": 0.6873,
-         "path": "/表象/视觉/行为/日常活动"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "体积对比",
-       "candidate": "体积对比",
-       "link": "新建",
-       "score": 0.6777,
-       "top": [
-        {
-         "name": "力量对比",
-         "score": 0.6777,
-         "path": "/理念/知识/政治/国际政治/国际博弈/力量对比"
-        },
-        {
-         "name": "对比差异",
-         "score": 0.6754,
-         "path": "/理念/知识/思想/概念范畴/关系结构/对比差异"
-        },
-        {
-         "name": "空间区域",
-         "score": 0.5406,
-         "path": "/表象/视觉/空间/空间区域"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "巨大化视觉",
-       "candidate": "巨大化视觉",
-       "link": "新建",
-       "score": 0.6757,
-       "top": [
-        {
-         "name": "视觉增强",
-         "score": 0.6757,
-         "path": "/呈现/视觉/视觉制作/后期处理/动态特效处理/视觉增强"
-        },
-        {
-         "name": "视觉",
-         "score": 0.6663,
-         "path": "/呈现/视觉"
-        },
-        {
-         "name": "视觉画面",
-         "score": 0.6402,
-         "path": "/呈现/视觉/视觉画面"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "新鲜感",
-       "candidate": "新鲜感",
-       "link": "新建",
-       "score": 0.6093,
-       "top": [
-        {
-         "name": "美感",
-         "score": 0.6093,
-         "path": "/情感/美感"
-        },
-        {
-         "name": "情感",
-         "score": 0.5686,
-         "path": "/情感"
-        },
-        {
-         "name": "视觉美感",
-         "score": 0.5589,
-         "path": "/情感/美感/视觉美感"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "视觉冲击力营造",
-       "candidate": "视觉冲击力营造",
-       "link": "新建",
-       "score": 0.702,
-       "top": [
-        {
-         "name": "氛围营造",
-         "score": 0.702,
-         "path": "/表达/氛围营造"
-        },
-        {
-         "name": "视觉开篇",
-         "score": 0.6631,
-         "path": "/结构/叙事推进/开篇引入/直述开篇/视觉开篇"
-        },
-        {
-         "name": "视觉对比",
-         "score": 0.6109,
-         "path": "/表达/信息传达/传达深度/补充细化/视觉对比"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "吸引注意力",
-       "candidate": "吸引注意力",
-       "link": "新建",
-       "score": 0.5451,
-       "top": [
-        {
-         "name": "引流",
-         "score": 0.5451,
-         "path": "/行为引导/传播/引流"
-        },
-        {
-         "name": "行为引导",
-         "score": 0.5342,
-         "path": "/行为引导"
-        },
-        {
-         "name": "呼吁",
-         "score": 0.5325,
-         "path": "/情感联结/情感抒发/呼吁"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "前景背景一致性",
-       "candidate": "前景背景一致性",
-       "link": "新建",
-       "score": 0.5928,
-       "top": [
-        {
-         "name": "光影效果",
-         "score": 0.5928,
-         "path": "/表象/视觉/画面/光影/光影效果"
-        },
-        {
-         "name": "场景氛围",
-         "score": 0.5736,
-         "path": "/表象/视觉/画面/后期/情绪意境/场景氛围"
-        },
-        {
-         "name": "构图",
-         "score": 0.5685,
-         "path": "/表象/视觉/画面/构图"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "错觉式转场",
-       "candidate": "错觉式转场",
-       "link": "新建",
-       "score": 0.7556,
-       "top": [
-        {
-         "name": "转场切换",
-         "score": 0.7556,
-         "path": "/呈现/视觉/视觉制作/剪辑组接/剪辑手法/转场切换"
-        },
-        {
-         "name": "剪辑手法",
-         "score": 0.6421,
-         "path": "/呈现/视觉/视觉制作/剪辑组接/剪辑手法"
-        },
-        {
-         "name": "超现实特效",
-         "score": 0.6277,
-         "path": "/呈现/视觉/视觉制作/后期处理/动态特效处理/超现实特效"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "遮挡转场",
-       "candidate": "遮挡转场",
-       "link": "新建",
-       "score": 0.7783,
-       "top": [
-        {
-         "name": "转场切换",
-         "score": 0.7783,
-         "path": "/呈现/视觉/视觉制作/剪辑组接/剪辑手法/转场切换"
-        },
-        {
-         "name": "剪辑手法",
-         "score": 0.6049,
-         "path": "/呈现/视觉/视觉制作/剪辑组接/剪辑手法"
-        },
-        {
-         "name": "推拉运镜",
-         "score": 0.59,
-         "path": "/呈现/视觉/视觉制作/实景拍摄/拍摄方式/推拉运镜"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "画面质感",
-       "candidate": "画面质感",
-       "link": "新建",
-       "score": 0.6046,
-       "top": [
-        {
-         "name": "细节呈现",
-         "score": 0.6046,
-         "path": "/表达/信息传达/传达深度/详细说明/展示呈现/细节呈现"
-        },
-        {
-         "name": "视角呈现",
-         "score": 0.5944,
-         "path": "/表达/信息传达/传达手法/视角呈现"
-        },
-        {
-         "name": "品质体现",
-         "score": 0.5823,
-         "path": "/表达/形象塑造/品质体现"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "降低创作成本",
-       "candidate": "降低创作成本",
-       "link": "新建",
-       "score": 0.4436,
-       "top": [
-        {
-         "name": "裂变",
-         "score": 0.4436,
-         "path": "/行为引导/裂变"
-        },
-        {
-         "name": "商业推广",
-         "score": 0.4354,
-         "path": "/行为引导/商业推广"
-        },
-        {
-         "name": "科普",
-         "score": 0.4316,
-         "path": "/信息传递/知识传递/科普"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "品牌创始人",
-       "candidate": "品牌创始人",
-       "link": "新建",
-       "score": 0.6376,
-       "top": [
-        {
-         "name": "品牌合作",
-         "score": 0.6376,
-         "path": "/理念/事件/商业事件/品牌合作"
-        },
-        {
-         "name": "商业品牌标识",
-         "score": 0.5492,
-         "path": "/表象/视觉/符号/图案符号/标识图案/商业品牌标识"
-        },
-        {
-         "name": "文化理念",
-         "score": 0.5324,
-         "path": "/理念/知识/文化/传统文化/文化理念"
-        }
-       ]
-      },
-      {
-       "scope_type": "substance",
-       "value": "个人状态对比",
-       "candidate": "个人状态对比",
-       "link": "新建",
-       "score": 0.6522,
-       "top": [
-        {
-         "name": "对比差异",
-         "score": 0.6522,
-         "path": "/理念/知识/思想/概念范畴/关系结构/对比差异"
-        },
-        {
-         "name": "生活状态",
-         "score": 0.65,
-         "path": "/理念/现象/生活状态"
-        },
-        {
-         "name": "生活状态",
-         "score": 0.6495,
-         "path": "/理念/现象/生活状态/个人境遇/生活状态"
-        }
-       ]
-      },
-      {
-       "scope_type": "form",
-       "value": "反差展示结构",
-       "candidate": "反差展示结构",
-       "link": "新建",
-       "score": 0.8047,
-       "top": [
-        {
-         "name": "反差构建",
-         "score": 0.8047,
-         "path": "/架构/策略/认知引导/话语影响/标题操控/反差构建"
-        },
-        {
-         "name": "对比反差",
-         "score": 0.7621,
-         "path": "/架构/创意/对比反差"
-        },
-        {
-         "name": "感知反差",
-         "score": 0.7249,
-         "path": "/架构/创意/对比反差/反差错位/定向反差/感知反差"
-        }
-       ]
-      },
-      {
-       "scope_type": "feeling",
-       "value": "心理落差感",
-       "candidate": "心理落差感",
-       "link": "新建",
-       "score": 0.5836,
-       "top": [
-        {
-         "name": "反差冲击",
-         "score": 0.5836,
-         "path": "/认知/惊奇/反差冲击"
-        },
-        {
-         "name": "悬念期待",
-         "score": 0.5534,
-         "path": "/认知/好奇/悬念期待"
-        },
-        {
-         "name": "情感",
-         "score": 0.553,
-         "path": "/情感"
-        }
-       ]
-      },
-      {
-       "scope_type": "effect",
-       "value": "视觉张力",
-       "candidate": "视觉张力",
-       "link": "新建",
-       "score": 0.7703,
-       "top": [
-        {
-         "name": "情感张力",
-         "score": 0.7703,
-         "path": "/表达/论证说理/分析论证/对比反差/情感张力"
-        },
-        {
-         "name": "视觉对比",
-         "score": 0.7107,
-         "path": "/表达/信息传达/传达深度/补充细化/视觉对比"
-        },
-        {
-         "name": "视觉开篇",
-         "score": 0.6838,
-         "path": "/结构/叙事推进/开篇引入/直述开篇/视觉开篇"
-        }
-       ]
-      },
-      {
-       "scope_type": "intent",
-       "value": "建立情感联结",
-       "candidate": "建立情感联结",
-       "link": "新建",
-       "score": 0.8765,
-       "top": [
-        {
-         "name": "情感联结",
-         "score": 0.8765,
-         "path": "/情感联结"
-        },
-        {
-         "name": "情感抒发",
-         "score": 0.5899,
-         "path": "/情感联结/情感抒发"
-        },
-        {
-         "name": "关系维护",
-         "score": 0.5641,
-         "path": "/情感联结/关系维护"
-        }
-       ]
-      }
-     ]
-    }
-   ]
-  },
-  {
-   "post_id": "7589257893544165455",
-   "source_id": "dy_7589257893544165455",
-   "title": "如何用AI十几秒制作一段高质量精彩的视频...",
-   "platform": "douyin",
-   "url": "https://www.douyin.com/video/7589257893544165455",
-   "media": {
-    "type": "video",
-    "video_url": "/data/demo/douyin/dy_7589257893544165455/video.mp4",
-    "images": []
-   },
-   "cards": [
-    {
-     "index": 1,
-     "content": "利用豆包生成创意提示词。How:1. 开启豆包的“深度思考”模式;2. 输入身份及需求(如:我是一名旅游视频创作者,请帮我写一段关于上海旅游的视频描述词,要求30字以内);3. 在生成的结果中选择并复制最满意的一条。",
-     "video_url": "/data/demo/douyin/dy_7589257893544165455/video.mp4",
-     "start": 0.0,
-     "end": 23.0
-    },
-    {
-     "index": 2,
-     "content": "使用“文生视频”工具转换内容。How:1. 在微信搜索并进入“创作神器”小程序;2. 点击“文生视频”功能;3. 将复制好的描述词粘贴进输入框。",
-     "video_url": "/data/demo/douyin/dy_7589257893544165455/video.mp4",
-     "start": 24.0,
-     "end": 33.0
-    },
-    {
-     "index": 3,
-     "content": "优化参数并生成最终视频。Why:“灵感扩写”能自动丰富文案细节,让生成的画面更具电影感和丰富度;选择 9:16 比例更适合短视频平台分发。。How:1. 点击“灵感扩写”,让 AI 丰富画面细节描述;2. 设置分辨率(如 9:16);3. 点击“生成视频”并等待渲染完成下载即可。",
-     "video_url": "/data/demo/douyin/dy_7589257893544165455/video.mp4",
-     "start": 34.0,
-     "end": 51.0
-    }
-   ],
-   "no_knowledge": true,
-   "knowledges": []
-  },
-  {
-   "post_id": "6a33655e000000000f0055af",
-   "source_id": "6a33655e000000000f0055af",
-   "title": "(取数失败 6a33655e000000000f0055af)",
-   "platform": "xiaohongshu",
-   "url": "",
-   "media": {
-    "type": "image",
-    "images": []
-   },
-   "cards": [],
-   "error": "business_error: code=-21001 msg=小红书接口异常: 6a33655e000000000f0055af 获取详情失败",
-   "knowledges": []
-  }
- ]
-}

+ 0 - 472
web/index.html

@@ -1,472 +0,0 @@
-<!doctype html>
-<html lang="zh">
-<head>
-<meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>创作知识的解构</title>
-<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
-<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
-<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
-<style>
-  *{box-sizing:border-box}
-  html,body{margin:0;padding:0;font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;font-size:13px;color:#111827;background:#f5f5f7;height:100vh;overflow:hidden}
-  .app{height:100vh;display:flex;flex-direction:column}
-  header.top{padding:11px 18px 9px;background:#fff;border-bottom:1px solid #e5e7eb;flex:none}
-  header.top h1{margin:0 0 7px;font-size:16px;font-weight:600}
-  .picker{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
-  .picker .lab{font-size:11.5px;color:#9ca3af;margin-right:2px}
-  .pill{font-size:12px;padding:4px 11px;border-radius:14px;border:1px solid #e5e7eb;background:#fff;color:#6b7280;cursor:pointer}
-  .pill:hover{background:#f3f4f6}
-  .pill.on{background:#1e293b;color:#fff;border-color:#1e293b;font-weight:600}
-  .pill .n{font-size:10px;opacity:.7;margin-left:4px}
-  .scroll{flex:1;overflow:auto;background:#f5f5f7;padding-bottom:40px}
-  details.src{margin:10px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:6px}
-  details.src summary{padding:8px 14px;cursor:pointer;font-size:12px;color:#475569;list-style:none}
-  details.src summary::before{content:'▶ ';color:#94a3b8;font-size:10px}
-  details.src[open] summary::before{content:'▼ '}
-  .srcbody{padding:4px 16px 12px;font-size:12px}
-  .srcbody a{color:#2563eb;word-break:break-all}
-  .srcprompt{color:#0e7490;font-size:11.5px;cursor:pointer}.srcprompt:hover{text-decoration:underline}
-  .srcimgs{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
-  .srcimgs img{width:80px;height:80px;object-fit:cover;border-radius:4px;border:1px solid #e2e8f0;cursor:zoom-in}
-  .barhint{margin:8px 18px 0;font-size:11.5px;color:#6b7280}
-  .ribbon{margin:11px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}
-  .rcap{font-size:11.5px;color:#6b7280;margin-bottom:8px}
-  .rsteps{display:flex;align-items:stretch;flex-wrap:wrap}
-  .rstep{flex:1;min-width:118px;border:1px solid #e2e8f0;border-radius:8px;padding:8px 9px;cursor:pointer;background:#f8fafc}
-  .rstep:hover{background:#ecfeff;border-color:#99d5d0}
-  .rstep.auto{cursor:default;background:#f1f5f9;opacity:.9}.rstep.auto:hover{background:#f1f5f9;border-color:#e2e8f0}
-  .rtop{display:flex;align-items:center;gap:7px}
-  .rn{width:18px;height:18px;border-radius:50%;background:#0e7490;color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center;flex:none}
-  .rstep.auto .rn{background:#94a3b8}
-  .rlab{font-size:13.5px;font-weight:600}
-  .rdesc{font-size:11.5px;color:#6b7280;margin:5px 0 7px;line-height:1.5}
-  .rbtn{font-size:11.5px;color:#0e7490}.rstep.auto .rbtn{color:#94a3b8}
-  .rarrow{display:flex;align-items:center;color:#cbd5e1;font-size:18px;padding:0 4px;flex:none}
-  .pmwhy{font-size:12.5px;color:#92400e;background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:8px 11px;margin-bottom:12px;line-height:1.6}
-  .pmwhy b{color:#78350f}
-  .lbtn{padding:3px 9px;border:1px solid #cbd5e1;border-radius:5px;background:#fff;cursor:pointer;font-size:11.5px;color:#334155;font-family:inherit}
-  .lbtn:hover{background:#f1f5f9}.lbtn.on{background:#fef3c7;border-color:#d97706;color:#92400e;font-weight:600}
-  /* 颗卡 */
-  .kcard{margin:12px 18px 0;background:#fff;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}
-  .khead{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid #eef2f7;flex-wrap:wrap}
-  .kno{font-size:11px;font-weight:700;color:#fff;background:#475569;border-radius:4px;padding:1px 7px}
-  .ktype{font-size:11px;font-weight:700;border-radius:4px;padding:1px 8px}
-  .ty-how{background:#cffafe;color:#155e75}.ty-what{background:#fae8ff;color:#86198f}.ty-why{background:#fef9c3;color:#854d0e}
-  .ktitle{font-size:14px;font-weight:600}
-  .krole{font-size:10.5px;padding:1px 6px;border-radius:3px;background:#f1f5f9;color:#64748b}
-  .kref{font-size:11px;color:#0e7490;cursor:pointer}.kref:hover{text-decoration:underline}
-  .srcbtn{cursor:pointer;color:#0e7490;margin-left:3px;user-select:none}.srcbtn:hover{color:#155e75}
-  .srccard{border:1px solid #e2e8f0;border-radius:6px;padding:8px 10px;margin:8px 0;background:#f8fafc}
-  .srccard .ci{font-size:11.5px;color:#6b7280;font-weight:600;margin-bottom:5px}
-  .srccard img{max-width:100%;max-height:360px;border-radius:5px;border:1px solid #e2e8f0;cursor:zoom-in}
-  .srccard video{max-width:100%;max-height:300px;border-radius:5px}
-  .srcread{font-size:12.5px;color:#1f2937;line-height:1.6;margin-top:6px;background:#fff;border-left:3px solid #0e7490;padding:6px 9px}
-  .kbiz{font-size:11px;padding:1px 7px;border-radius:3px;background:#fef3c7;color:#92400e}
-  .kacts{margin-left:auto;display:flex;gap:6px}
-  .kbody{padding:6px 14px 13px}
-  /* how 工序表 */
-  .twrap{overflow:auto;border:1px solid #e5e7eb;border-radius:6px;margin-top:8px}
-  table.proc{width:max-content;min-width:100%;border-collapse:collapse;font-size:12px}
-  table.proc th,table.proc td{border:1px solid #e5e7eb;padding:6px 8px;vertical-align:top;line-height:1.5}
-  table.proc thead th{font-weight:600;text-align:center;font-size:12px;position:sticky;top:0;z-index:3}
-  table.proc thead tr:nth-child(2) th{top:30px}
-  td.idx{width:30px;text-align:center;color:#6b7280;background:#f8fafc}
-  th.c-intent,td.intent{width:210px;min-width:210px;max-width:210px;white-space:pre-wrap}
-  th.c-cstage,td.cstage{width:54px;text-align:center;background:#ecfeff}
-  th.c-act,td.act{min-width:110px;max-width:140px;word-break:break-word;background:#ecfeff}
-  th.c-dir,td.dir{min-width:230px;max-width:330px;white-space:pre-wrap;word-break:break-word;background:#ecfeff}
-  th.c-out,td.out{min-width:160px;max-width:240px;white-space:pre-wrap;background:#ecfeff}
-  th.c-scope,td.scope{width:92px;min-width:92px;max-width:92px;word-break:break-word}
-  th.g-frame{background:#0e7490;color:#fff}
-  th.g-scope{background:#7c3aed;color:#fff}
-  th.cstage-h{cursor:pointer}th.cstage-h:hover{background:#0e7490}
-  th.c-idx{background:#475569;color:#fff;vertical-align:middle}
-  thead tr:nth-child(2) th.c-intent,thead tr:nth-child(2) th.c-cstage,thead tr:nth-child(2) th.c-act,thead tr:nth-child(2) th.c-dir,thead tr:nth-child(2) th.c-out{background:#0891b2;color:#fff}
-  thead tr:nth-child(2) th.s-substance{background:#dc2626;color:#fff}thead tr:nth-child(2) th.s-form{background:#2563eb;color:#fff}
-  thead tr:nth-child(2) th.s-feeling{background:#db2777;color:#fff}thead tr:nth-child(2) th.s-effect{background:#16a34a;color:#fff}thead tr:nth-child(2) th.s-intent{background:#d97706;color:#fff}
-  td.scope.s-substance{background:#fef2f2}td.scope.s-form{background:#eff6ff}td.scope.s-feeling{background:#fdf2f8}td.scope.s-effect{background:#f0fdf4}td.scope.s-intent{background:#fffbeb}
-  tr.step>td{border-top:1.5px solid #cbd5e1}
-  .cstage-chip{display:inline-block;font-size:11px;padding:1px 6px;border-radius:10px;background:#ede9fe;color:#5b21b6}
-  .act-chip{display:inline-block;font-size:11.5px;padding:1px 7px;border-radius:4px;background:#fff7ed;color:#9a3412;border:1px solid #fed7aa}
-  .dir-txt{font-size:11.5px;color:#33312c;line-height:1.65}.out-txt{font-size:11.5px;color:#166534}
-  .in-txt{font-size:11.5px;color:#1e40af;line-height:1.6}
-  .cue{font-size:11px;color:#7c2d12;background:#fff7ed;border-left:2px solid #fb923c;padding:3px 7px;margin-top:4px;border-radius:0 4px 4px 0}
-  .cue b{color:#9a3412}
-  .kindb{font-size:10.5px;font-weight:700;padding:1px 8px;border-radius:9px;margin-right:8px;vertical-align:middle}
-  .kind-子集{background:#dbeafe;color:#1e40af}.kind-多维关系{background:#dcfce7;color:#166534}.kind-序列{background:#fef3c7;color:#92400e}
-  .dimrule{font-size:10.5px;padding:1px 8px;border-radius:9px;background:#ecfccb;color:#3f6212;margin-right:8px;vertical-align:middle}
-  .ksec-f.key{background:#fde68a;color:#92400e;font-weight:700}
-  .glossbtn{background:#ede9fe!important;color:#6d28d9!important;border-color:#ddd6fe!important}
-  .from{font-size:11px;color:#9ca3af}
-  /* what/why 自由小节 */
-  .def{font-size:13px;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:8px 12px;margin:6px 0 10px}
-  .ksec{margin:9px 0;padding-left:11px;border-left:3px solid #e2e8f0}
-  .ksec-h{display:flex;align-items:center;gap:7px;margin-bottom:4px}
-  .ksec-t{font-size:13px;font-weight:600;color:#334155}
-  .ksec-f{font-size:10.5px;padding:1px 7px;border-radius:9px;background:#f1f5f9;color:#64748b}
-  .ksec-c{font-size:12.5px;line-height:1.65;color:#1f2937;margin-bottom:4px}
-  table.elem{border-collapse:collapse;width:100%;font-size:12.5px}
-  table.elem td{border:1px solid #f0e6f5;padding:6px 10px;text-align:left;vertical-align:top}
-  table.elem td.el{font-weight:600;color:#86198f;background:#fdf4ff;width:130px}
-  /* why 论点卡 */
-  .why-row{display:flex;gap:10px;margin:7px 0}
-  .why-lab{font-size:11px;font-weight:700;border-radius:4px;padding:2px 8px;flex:none;height:20px}
-  .wl-claim{background:#fef9c3;color:#854d0e}.wl-basis{background:#e0e7ff;color:#3730a3}.wl-impact{background:#dcfce7;color:#166534}
-  .why-txt{font-size:12.5px;line-height:1.65;color:#1f2937}
-  .why-exp{font-size:12.5px;line-height:1.72;color:#1f2937;background:#fdf4ff;border-left:3px solid #a21caf;border-radius:0 6px 6px 0;padding:9px 13px;margin:6px 0}
-  /* 颗级作用域 */
-  .kscopes{margin-top:9px;display:flex;gap:5px;flex-wrap:wrap;align-items:center}
-  .kscopes .lab{font-size:11px;color:#9ca3af}
-  .sv{display:inline-block;cursor:pointer;font-size:11.5px;padding:1px 5px;border-radius:3px;border:1px solid rgba(0,0,0,.08);background:rgba(255,255,255,.7);margin:1px 0}
-  .sv:hover{box-shadow:0 0 0 1px #1e293b}
-  .sv .k{font-size:11.5px;opacity:.85;font-weight:700;margin-right:4px}
-  table.proc th.c-scope{font-size:13.5px}
-  .sv .mk{font-size:9px;padding:0 3px;border-radius:2px;margin-left:3px;vertical-align:top}
-  .mk-new{background:#fde68a;color:#92400e}.mk-reuse{background:#bbf7d0;color:#166534}
-  .sv.s-substance{background:#fef2f2}.sv.s-form{background:#eff6ff}.sv.s-feeling{background:#fdf2f8}.sv.s-effect{background:#f0fdf4}.sv.s-intent{background:#fffbeb}
-  body.hl .sv .mk-new{outline:2px solid #d97706}
-  /* drawer + modal */
-  .ov{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100}
-  .drawer{position:fixed;right:0;top:0;bottom:0;width:440px;max-width:92vw;background:#fff;box-shadow:-4px 0 16px rgba(0,0,0,.15);z-index:101;overflow-y:auto}
-  .drawer h2{margin:0;padding:13px 16px;background:#1e293b;color:#fff;font-size:14px;display:flex;align-items:center}
-  .drawer h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
-  .dc{padding:14px 16px;font-size:12.5px;line-height:1.6}.dc .row{margin:6px 0}.dc b{color:#374151}
-  .verdict{display:inline-block;padding:2px 9px;border-radius:5px;font-weight:600;font-size:12px}
-  .v-new{background:#fef3c7;color:#92400e}.v-reuse{background:#dcfce7;color:#166534}
-  .nn{margin:5px 0;padding:7px 10px;border:1px solid #e5e7eb;border-radius:5px;background:#f8fafc}
-  .nn .nm{font-weight:600}.nn .sc{float:right;color:#6b7280;font-family:ui-monospace,monospace}
-  .nn .pth{color:#9ca3af;font-size:11px;font-family:ui-monospace,monospace;word-break:break-all}
-  .modal{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:110;display:flex;align-items:center;justify-content:center;padding:20px}
-  .mbox{background:#fff;width:760px;max-width:94vw;max-height:86vh;border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
-  .mbox h2{margin:0;padding:13px 18px;background:#0f766e;color:#fff;font-size:14px;display:flex;align-items:center}
-  .mbox h2 .x{margin-left:auto;cursor:pointer;font-size:18px}
-  .mbox .body{padding:15px 18px;overflow:auto}.mbox pre{margin:0;font:12.5px/1.7 ui-monospace,Menlo,monospace;white-space:pre-wrap;color:#1f2937}
-  /* 提示词 Markdown 渲染 */
-  .md{font-size:13px;line-height:1.7;color:#1f2937}
-  .md h3{font-size:16px;margin:18px 0 8px;padding-bottom:5px;border-bottom:2px solid #0f766e;color:#0f766e}
-  .md h4{font-size:14px;margin:15px 0 6px;color:#0f766e}
-  .md h5,.md h6{font-size:13px;margin:12px 0 5px;color:#115e59}
-  .md p{margin:8px 0}
-  .md strong{color:#9a3412;font-weight:700}
-  .md code{background:#f1f5f9;color:#be123c;padding:1px 5px;border-radius:4px;font:12px ui-monospace,Menlo,monospace}
-  .md pre{background:#0f172a;border-radius:8px;padding:12px 14px;overflow-x:auto;margin:10px 0}
-  .md pre code{background:none;color:#e2e8f0;padding:0;font-size:12px;line-height:1.6}
-  .md blockquote{margin:10px 0;padding:8px 12px;background:#f0fdfa;border-left:3px solid #14b8a6;border-radius:0 6px 6px 0;color:#134e4a}
-  .md ul,.md ol{margin:8px 0;padding-left:22px}.md li{margin:4px 0}
-  .md hr{border:none;border-top:1px dashed #cbd5e1;margin:14px 0}
-  .md table{border-collapse:collapse;width:100%;margin:10px 0;font-size:12.5px}
-  .md th,.md td{border:1px solid #cbd5e1;padding:6px 9px;text-align:left;vertical-align:top}
-  .md th{background:#0f766e;color:#fff;font-weight:600;white-space:nowrap}
-  .md tbody tr:nth-child(even){background:#f8fafc}
-  .md a{color:#0e7490;text-decoration:underline}
-  .md .ptag{font-size:14px;font-weight:700;color:#0f766e;margin:16px 0 7px;padding:4px 10px;background:#ccfbf1;border-radius:6px;display:inline-block}
-  .md .ptag-ex{font-size:12px;font-weight:600;color:#92400e;background:#fef3c7;margin:11px 0 5px;padding:2px 9px}
-  .md .ptag-sub{font-weight:400;font-size:11.5px;opacity:.8;margin-left:7px}
-  .lb{position:fixed;inset:0;background:rgba(0,0,0,.85);display:flex;align-items:center;justify-content:center;z-index:120;cursor:zoom-out}.lb img{max-width:92vw;max-height:92vh;border-radius:6px}
-  .empty{color:#9ca3af;padding:50px;text-align:center}
-</style>
-</head>
-<body>
-<div id="root"></div>
-<script type="text/x-jsx" id="app-src">
-const {useState,useEffect}=React;
-const j=u=>fetch(u,{cache:"no-store"}).then(r=>r.json());
-// 复制到剪贴板:http/裸IP 下 navigator.clipboard 不可用,降级到 textarea+execCommand
-function copyText(t){
-  if(navigator.clipboard&&window.isSecureContext) return navigator.clipboard.writeText(t);
-  return new Promise(function(res,rej){try{var ta=document.createElement("textarea");ta.value=t;ta.style.position="fixed";ta.style.top="-9999px";ta.style.opacity="0";document.body.appendChild(ta);ta.focus();ta.select();var ok=document.execCommand("copy");document.body.removeChild(ta);ok?res():rej();}catch(e){rej(e);}});
-}
-const SCOPES=[["substance","实质"],["form","形式"],["feeling","感受"],["effect","作用"],["intent","意图"]];
-const SC_CN={substance:"实质",form:"形式",feeling:"感受",effect:"作用",intent:"意图"};
-const TYPECN={how:"How",what:"What",why:"Why"};
-const CSTAGE_DOC=`## 创作阶段:写死的 5 个(每步选 1 个)
-how 工序每一步命中其中**一个**;不在这 5 个里的值会被代码丢弃(受控词表,不开放)。
-
-| 阶段 | 在干什么 |
-|---|---|
-| **定向** | 定主题 / 方向 / 受众——还没开始具体创作 |
-| **构思** | 生成核心创意 / 钩子 / 角度 / 冲突 |
-| **结构** | 搭骨架 / 大纲 / 顺序 |
-| **成文** | 把结构写成具体文字 / 镜头 |
-| **打磨** | 修改 / 精炼 / 优化 / 定稿 |
-
-(区别于「动作」:动作是模型从帖子里实时抽的、不固定;创作阶段是定死的 5 选 1。)`;
-const GLOSSARY=`## 一篇帖子能拆出三种知识(平级的)
-这三种各帮你做一个不同的决定,没有谁更重要。
-
-| 标签 | 大白话 | 它帮你决定 |
-|---|---|---|
-| **怎么做** (How) | 一步步把东西做出来的流程 | 按什么**顺序**做 |
-| **是什么** (What) | 某东西由什么组成 / 有哪些种类 | 用**哪些料** |
-| **为什么** (Why) | 背后的道理、标准、平台规则 | 该**留什么、砍什么** |
-
-## 「是什么」按结构分三种
-- **子集**:像菜单,几个**互不隶属**的项,**归其一 or 挑着用**(例:7 种叙事结构挑一种、构图六法按场景挑)。
-  - 每个项后面那句 **👉 什么时候用** 就是「**选择线索**」——告诉你哪种情况该挑它。没有它,就只能背、不会选。
-- **多维关系**:像配方,几个部件**都要、合起来才完整、无先后**(例:人物 = 生理+社会+心理)。
-- **序列**:几个部件**都要、且有前后位置**(例:故事五部分、黄金三段式)。只是位置顺序——后段若**消费**前段产出、换序就崩,那就成 how 工序了。
-
-## 「为什么」是什么
-- **一段「阐述」**:把原帖讲这条原理的内容**忠实整合**成一段——这条原理**是什么 + 为什么成立**。
-- 解构阶段只**还原原理本身**,不加工"该怎么用"(那是下游应用的事)。`;
-
-const STEPS=[
-  {key:"read",label:"读懂帖子",desc:"把图、视频读成文字",
-   why:"创作知识常在图里、不在正文;这一步只忠实转写、不判断,避免一步干两件事。",
-   src:["/prompt-read/extract.txt","/prompt-read/extract_video.txt"]},
-  {key:"gate",label:"判断是否是创作知识",desc:"判这帖是不是『图文/视频创作』知识:两次判断+分歧裁决,不是就整帖跳过",
-   why:"靠模型语义理解判、不靠关键词(换措辞就绕过);两视角(一个判'是创作'、一个专挑'是制作/越界'的茬)+ 边界倾向排除,把『用工具做视频/游戏设计』挡在门外,省下后面整条拆解。",
-   src:["/prompt-read/gate_admit.txt","/prompt-read/gate_refute.txt","/prompt-read/gate_tiebreak.txt"]},
-  {key:"frame",label:"拆出知识",desc:"从文字里拆出一条条知识,理清每条是 怎么做 / 是什么 / 为什么",
-   why:"先判类型再拆——三类成形不同,默认 how 会把纯 what 硬掰成假 how;how 先吸进步骤里的 what/why,吸不进的才独立成一条。",
-   src:["/prompt-skill/phase1-frame.md"]},
-  {key:"howgate",label:"校验how的严谨性",desc:"每条『怎么做』再验一次:步骤真有先后依赖,还是离散知识被硬串成的假工序?两次判断+裁决,判假就拆回 是什么 / 为什么",
-   why:"模型有『教程=步骤』的先验,爱把几块离散知识(如 前提/人物/冲突)硬串成假工序。这步逐条核验:后步是否真消费前步产出、有没有『定义式拆解』(后步产出其实是前步里已点名的成分);假的当场拆成 what/why,真链原样保留。",
-   src:["/prompt-read/gate_how_admit.txt","/prompt-read/gate_how_refute.txt","/prompt-read/gate_how_tiebreak.txt"]},
-  {key:"scope",label:"给知识归类",desc:"标好 讲什么 / 起什么作用 / 哪个创作环节 → 标签收成规范名词 → 和已有分类库对上号",
-   why:"这 5 类标签最容易串味,单独写厚;标签先名词化(动宾→名词)再做向量定位,既规范又能挂上分类库。",
-   src:["/prompt-skill/phase2-scope.md","/prompt-read/normalize_scope.txt"]},
-  {key:"store",label:"存进知识库",desc:"整理成统一格式存起来,供以后调用",
-   why:"纯拼接 + 校验的确定性活,程序自动做——没有提示词,让 AI 来干只会帮倒忙。",
-   src:null}
-];
-const STEPMAP={}; STEPS.forEach(s=>STEPMAP[s.key]=s);
-
-// 极简 Markdown 渲染(自带、无外部依赖):标题/表格/代码/引用/列表/加粗/行内码/链接
-function mdToHtml(src){
-  var escc=function(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");};
-  var inline=function(t){
-    t=escc(t);
-    t=t.replace(/`([^`]+)`/g,'<code>$1</code>');
-    t=t.replace(/\*\*([^*]+)\*\*/g,'<strong>$1</strong>');
-    t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" target="_blank">$1</a>');
-    return t;
-  };
-  var L=(src||"").split("\n"), out=[], i=0;
-  var isStruct=function(s){return /^```/.test(s)||/^\s*#{1,6}\s/.test(s)||/^\s*>\s?/.test(s)||/^\s*[-*]\s+/.test(s)||/^\s*\d+\.\s+/.test(s)||/^\s*([-*_])(\s*\1){2,}\s*$/.test(s)||/^\s*\|/.test(s)||/^\s*<\/?[^<>]+>/.test(s);};
-  while(i<L.length){
-    var ln=L[i];
-    if(/^```/.test(ln)){ var b=[]; i++; while(i<L.length&&!/^```/.test(L[i])){b.push(L[i]);i++;} i++; out.push("<pre><code>"+escc(b.join("\n"))+"</code></pre>"); continue; }
-    if(/^\s*\|/.test(ln)&&i+1<L.length&&/^\s*\|?[\s:|-]*-[\s:|-]*\|?\s*$/.test(L[i+1])){
-      var head=ln, rows=[]; i+=2;
-      while(i<L.length&&/^\s*\|/.test(L[i])&&L[i].trim()!==""){rows.push(L[i]);i++;}
-      var cells=function(r){r=r.trim().replace(/^\|/,"").replace(/\|$/,"");return r.split("|").map(function(c){return c.trim();});};
-      var th=cells(head).map(function(c){return "<th>"+inline(c)+"</th>";}).join("");
-      var tb=rows.map(function(r){return "<tr>"+cells(r).map(function(c){return "<td>"+inline(c)+"</td>";}).join("")+"</tr>";}).join("");
-      out.push("<table><thead><tr>"+th+"</tr></thead><tbody>"+tb+"</tbody></table>"); continue;
-    }
-    if(/^\s*([-*_])(\s*\1){2,}\s*$/.test(ln)){ out.push("<hr/>"); i++; continue; }
-    var tag=ln.match(/^\s*<(\/?)([^<>\/][^<>]*)>\s*(.*)$/);  // 行首伪标签(如 <工作要点> / <example> 描述)→ 当小节标题
-    if(tag){ if(tag[1]){i++;continue;} var nm=tag[2], rest=tag[3].trim(), ex=/^example$/i.test(nm);
-      out.push('<div class="ptag'+(ex?' ptag-ex':'')+'">'+inline(ex?'示例':nm)+(rest?'<span class="ptag-sub">'+inline(rest)+'</span>':'')+"</div>"); i++; continue; }
-    var h=ln.match(/^\s*(#{1,6})\s+(.*)$/);
-    if(h){ var lv=Math.min(h[1].length+2,6); out.push("<h"+lv+">"+inline(h[2])+"</h"+lv+">"); i++; continue; }
-    if(/^\s*>\s?/.test(ln)){ var q=[]; while(i<L.length&&/^\s*>\s?/.test(L[i])){q.push(inline(L[i].replace(/^\s*>\s?/,"")));i++;} out.push("<blockquote>"+q.join("<br/>")+"</blockquote>"); continue; }
-    if(/^\s*[-*]\s+/.test(ln)){ var ul=[]; while(i<L.length&&/^\s*[-*]\s+/.test(L[i])){ul.push("<li>"+inline(L[i].replace(/^\s*[-*]\s+/,""))+"</li>");i++;} out.push("<ul>"+ul.join("")+"</ul>"); continue; }
-    if(/^\s*\d+\.\s+/.test(ln)){ var ol=[]; while(i<L.length&&/^\s*\d+\.\s+/.test(L[i])){ol.push("<li>"+inline(L[i].replace(/^\s*\d+\.\s+/,""))+"</li>");i++;} out.push("<ol>"+ol.join("")+"</ol>"); continue; }
-    if(ln.trim()===""){ i++; continue; }
-    var p=[]; while(i<L.length&&L[i].trim()!==""&&!isStruct(L[i])){p.push(inline(L[i]));i++;} out.push("<p>"+p.join("<br/>")+"</p>");
-  }
-  return out.join("\n");
-}
-
-function Ribbon({onOpen}){
-  return <div className="ribbon">
-    <div className="rcap">这套系统怎么「从帖子拆解知识」——点任一步看它的提示词</div>
-    <div className="rsteps">{STEPS.map((s,i)=><React.Fragment key={s.key}>
-      {i>0&&<span className="rarrow">→</span>}
-      <div className={"rstep"+(s.src?"":" auto")} onClick={()=>onOpen(s.key)}>
-        <div className="rtop"><span className="rn">{i+1}</span><span className="rlab">{s.label}</span></div>
-        <div className="rdesc">{s.desc}</div>
-        <div className="rbtn">{s.src?"📄 看提示词":"⚙️ 程序自动"}</div>
-      </div></React.Fragment>)}</div>
-  </div>;
-}
-
-function ScopeChip({x,onScope,showType}){
-  return <span className={"sv s-"+x.scope_type} onClick={()=>onScope(x)}>{showType&&<span className="k">{SC_CN[x.scope_type]||x.scope_type}</span>}{x.value}<span className={"mk "+(x.link==="复用"?"mk-reuse":"mk-new")}>{x.link==="复用"?"复":"新"}</span></span>;
-}
-function KScopes({list,onScope}){
-  if(!list||!list.length) return null;
-  return <div className="kscopes"><span className="lab">作用域(5 棵树):</span>
-    {list.map((x,i)=><ScopeChip key={i} x={{...x}} onScope={onScope} showType={true}/>)}</div>;
-}
-
-function HowTable({k,onScope,onPrompt,onSource,onCstage}){
-  const steps=k.steps||[];
-  const scOf=(s,t)=>(s.作用域||[]).filter(x=>x.scope_type===t);
-  return <div className="twrap"><table className="proc">
-    <thead>
-      <tr><th className="c-idx" rowSpan="2">#</th>
-        <th className="g-frame" colSpan="5">② 拆框架</th>
-        <th className="g-scope" colSpan="5">③ 作用域</th></tr>
-      <tr><th className="c-intent">输入</th><th className="c-cstage cstage-h" title="看 5 个写死的创作阶段" onClick={()=>onCstage&&onCstage()}>创作<br/>阶段 ▸</th><th className="c-act">动作<br/>(模型推导)</th><th className="c-dir">方法</th><th className="c-out">产出</th>
-        {SCOPES.map(([kk,cn])=><th key={kk} className={"c-scope s-"+kk}>{cn}</th>)}</tr>
-    </thead>
-    <tbody>{steps.map((s,i)=><tr className="step" key={i}>
-      <td className="idx">{i+1}</td>
-      <td className="intent"><span className="in-txt">{s.input}</span>{s.出处&&s.出处.length>0&&<span className="srcbtn" title={"看原文出处 "+s.出处.join(" ")} onClick={()=>onSource(s.出处)}>🔍</span>}</td>
-      <td className="cstage">{s.创作阶段&&<span className="cstage-chip">{s.创作阶段}</span>}</td>
-      <td className="act">{s.动作&&<span className="act-chip">{s.动作}</span>}</td>
-      <td className="dir"><span className="dir-txt">{s.directive}</span></td>
-      <td className="out"><span className="out-txt">{s.output}</span></td>
-      {SCOPES.map(([kk])=><td key={kk} className={"scope s-"+kk}>{scOf(s,kk).map((x,j)=><ScopeChip key={j} x={x} onScope={onScope}/>)}</td>)}
-    </tr>)}</tbody>
-  </table></div>;
-}
-function WhatCard({k,onScope,onGloss}){
-  return <div>
-    {k.概要&&<div className="def">
-      {k.kind&&<span className={"kindb kind-"+k.kind}>{k.kind}</span>}
-      {k.维度拆分规则&&<span className="dimrule" title="维度拆分规则(仅子集)">按「{k.维度拆分规则}」拆</span>}
-      概要:{k.概要}</div>}
-    {(k.body||[]).length>0&&<table className="elem"><tbody>{k.body.map((it,i)=><tr key={i}>
-      <td className="el">{it.item_name}</td><td>{it.item_desc}</td></tr>)}</tbody></table>}
-    <KScopes list={k.作用域} onScope={onScope}/>
-  </div>;
-}
-function WhyCard({k,onScope}){
-  return <div>
-    {k.阐述&&<div className="why-exp">{k.阐述}</div>}
-    <KScopes list={k.作用域} onScope={onScope}/>
-  </div>;
-}
-
-function KnowledgeCard({k,idx,onScope,onPrompt,onJson,onSource,payload,how_titles,onGloss,onCstage}){
-  const par=k.parent;
-  return <div className="kcard" id={"k-"+k.id}>
-    <div className="khead">
-      <span className="kno">第{idx+1}颗知识</span>
-      <span className={"ktype ty-"+k.type}>{TYPECN[k.type]}</span>
-      <span className="ktitle">{k.title}</span>
-      {k.出处&&k.出处.length>0&&<span className="kref" title={"看原文出处 "+k.出处.join(" ")} onClick={()=>onSource(k.出处)}>🔍 出处 {k.出处.join(" ")}</span>}
-      {par&&<span className="kref" onClick={()=>{var e=document.getElementById("k-"+par.how_id);if(e)e.scrollIntoView({behavior:"smooth",block:"center"});}}>↑ 出自「{how_titles[par.how_id]||par.how_id}」第{par.step}步</span>}
-      {(k.业务阶段||[]).map((b,i)=><span key={i} className="kbiz">业务阶段:{b}</span>)}
-      <span className="kacts">{payload&&<button className="lbtn" onClick={()=>onJson(payload)}>⚙️ 入库 payload</button>}</span>
-    </div>
-    <div className="kbody">
-      {k.type==="how"&&<HowTable k={k} onScope={onScope} onPrompt={onPrompt} onSource={onSource} onCstage={onCstage}/>}
-      {k.type==="what"&&<WhatCard k={k} onScope={onScope} onGloss={onGloss}/>}
-      {k.type==="why"&&<WhyCard k={k} onScope={onScope}/>}
-    </div>
-  </div>;
-}
-
-function App(){
-  const [items,setItems]=useState([]);
-  const [sel,setSel]=useState(0);
-  const [scope,setScope]=useState(null);
-  const [runs,setRuns]=useState([]);     // web/runs/index.json 清单(搜索批次)
-  const [run,setRun]=useState(null);     // 选中的 run slug;null=默认样本 frameworks.json
-  const [pm,setPm]=useState(null);
-  const [json,setJson]=useState(null);
-  const [copied,setCopied]=useState(false);
-  const [zoom,setZoom]=useState(null);
-  const [src,setSrc]=useState(null);
-  const [hl,setHl]=useState(false);
-  const [gloss,setGloss]=useState(false);
-  const [cstage,setCstage]=useState(false);
-  useEffect(()=>{j("/runs/index.json").then(r=>setRuns(Array.isArray(r)?r:[])).catch(()=>setRuns([]));},[]);
-  useEffect(()=>{
-    const fw=run?("/runs/"+run+".json"):"/frameworks.json";
-    const pls=run?("/runs/"+run+".payloads.json"):"/payloads.json";
-    Promise.all([j(fw),j(pls).catch(()=>[])]).then(([f,pl])=>{
-      setSel(0);setScope(null);
-      setItems((f.posts||[]).map(p=>({...p,payloads:(pl||[]).filter(x=>(x.source||{}).id===(p.source_id||("xhs_"+p.post_id)))})));});},[run]);
-  useEffect(()=>{document.body.classList.toggle("hl",hl);},[hl]);
-  function openPrompt(key){
-    const st=STEPMAP[key]; if(!st) return;
-    if(!st.src){ setPm({label:st.label,why:st.why,text:"(这一步是程序自动完成的,没有提示词。)"}); return; }
-    setPm({label:st.label,why:st.why,text:"加载中…"});
-    const multi=st.src.length>1;
-    Promise.all(st.src.map(u=>fetch(u,{cache:"no-store"}).then(r=>r.ok?r.text():"(未找到 "+u+")").catch(()=>"(加载失败 "+u+")")
-      .then(t=>multi?("## 〔"+u.split("/").pop()+"〕\n\n"+t):t)))
-      .then(txts=>setPm({label:st.label,why:st.why,text:txts.join("\n\n")}));
-  }
-  if(!items.length) return <div className="empty">加载中…</div>;
-  const it=items[sel];
-  const ks=it.knowledges||[];
-  const how_titles={}; ks.forEach(k=>{if(k.type==="how")how_titles[k.id]=k.title;});
-  const payloadOf=k=>(it.payloads||[]).find(p=>p.title===k.title);
-  const media=it.media||{}; const imgs=media.images||[]; const videoUrl=media.video_url;
-  const cardsById={}; (it.cards||[]).forEach(c=>cardsById[c.index]=c);
-  const openSource=list=>{var cs=(list||[]).map(s=>{var m=String(s).match(/\d+/);return m?cardsById[parseInt(m[0])]:null;}).filter(Boolean);if(cs.length)setSrc({cards:cs});};
-  const fmtT=s=>{s=Math.floor(s||0);return Math.floor(s/60)+":"+String(s%60).padStart(2,"0");};
-  return <div className="app">
-    <header className="top">
-      <h1>创作知识的解构</h1>
-      <div className="picker"><span className="lab">批次:</span>
-        <select className="runsel" value={run||""} onChange={e=>setRun(e.target.value||null)}>
-          <option value="">样本(frameworks)</option>
-          {runs.map((r,i)=><option key={i} value={r.slug}>{(r.queries||[]).join("+")||r.slug}({r.count}帖)</option>)}
-          {runs.length===0 && <option value="" disabled>(暂无搜索批次——跑一次 query 后出现)</option>}
-        </select>
-      </div>
-      <div className="picker"><span className="lab">帖子:</span>
-        {items.map((x,i)=><div key={i} className={"pill"+(sel===i?" on":"")} onClick={()=>{setSel(i);setScope(null);}}>{x.title.slice(0,16)}<span className="n">{(x.knowledges||[]).length}颗</span></div>)}
-      </div>
-    </header>
-    <div className="scroll">
-      <Ribbon onOpen={openPrompt}/>
-      <details className="src" open><summary>原帖:{it.title}(这一帖的原料)· {it.platform}{videoUrl?" · 视频":(imgs.length?` · ${imgs.length} 图`:"")}</summary>
-        <div className="srcbody"><a href={it.url} target="_blank" rel="noreferrer">{it.url}</a>
-          {videoUrl
-            ? <div style={{marginTop:8}}><video src={videoUrl} controls style={{maxWidth:"380px",maxHeight:"320px",borderRadius:"6px",border:"1px solid #e2e8f0"}}/></div>
-            : <div className="srcimgs">{imgs.map((u,i)=><img key={i} src={u} title={u} onClick={()=>setZoom(u)} onError={e=>{var ph="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='80' height='80'><rect width='80' height='80' fill='%23f1f5f9' stroke='%23cbd5e1' stroke-dasharray='4'/></svg>"; if(e.target.src.slice(0,4)!=='data')e.target.src=ph;}}/>)}</div>}
-        </div>
-      </details>
-      <div className="barhint" style={{display:"flex",gap:8,alignItems:"center"}}>
-        <span>这一帖拆出 <b>{ks.length}</b> 颗知识(how 工序表 / what 知识卡 / why 论点卡);组件颗标「出自某 how 第 N 步」可点跳。</span>
-        <button className="lbtn glossbtn" onClick={()=>setGloss(true)} style={{marginLeft:"auto"}}>❓ 名词说明</button>
-        <button className={"lbtn"+(hl?" on":"")} onClick={()=>setHl(!hl)}>高亮「新值」</button>
-      </div>
-      {ks.length===0 && <div className="kcard"><div className="kbody" style={{padding:"20px 16px",color:"#9ca3af",fontSize:"13px"}}>🚫 这帖<b style={{color:"#6b7280"}}>没有可提取的创作知识</b>(纯作品 / 展示 / 无关)——① 读懂时 <code>is_empty=true</code>,后面拆颗/归类/入库已自动跳过。</div></div>}
-      {ks.map((k,i)=><KnowledgeCard key={i} k={k} idx={i} onScope={setScope} onPrompt={openPrompt} onJson={setJson} onSource={openSource} payload={payloadOf(k)} how_titles={how_titles} onGloss={()=>setGloss(true)} onCstage={()=>setCstage(true)}/>)}
-    </div>
-    {scope&&<div><div className="ov" onClick={()=>setScope(null)}></div>
-      <div className="drawer"><h2>作用域定位详情<span className="x" onClick={()=>setScope(null)}>×</span></h2>
-        <div className="dc">
-          <div className="row"><b>提取候选值</b>:{scope.candidate||scope.value}</div>
-          <div className="row"><b>归属树</b>:<span className={"sv s-"+scope.scope_type} style={{cursor:"default"}}>{SC_CN[scope.scope_type]||scope.scope_type}</span>(在这棵树里找最近邻)</div>
-          <div className="row"><b>判定</b>:<span className={"verdict "+(scope.link==="复用"?"v-reuse":"v-new")}>{scope.link==="复用"?"复用现有节点":"新建(树里没有)"}</span> = 最近邻 {scope.score}</div>
-          <div className="row"><b>最终入库值</b>:{scope.value}</div>
-          <h3 style={{margin:"12px 0 6px",fontSize:12.5,color:"#475569"}}>分类树最近邻 top-{(scope.top||[]).length} · 【{SC_CN[scope.scope_type]||scope.scope_type}】树(火山余弦)</h3>
-          {(scope.top||[]).map((h,i)=><div className="nn" key={i}><span className="sc">{h.score}</span><span className="nm">{h.name}</span><div className="pth">【{SC_CN[scope.scope_type]||scope.scope_type}】 {h.path}</div></div>)}
-          {(!scope.top||!scope.top.length)&&<div style={{color:"#9ca3af"}}>无最近邻</div>}
-        </div></div></div>}
-    {pm&&<div className="modal" onClick={()=>setPm(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
-      <h2>📄 {pm.label} · 这一步的提示词<span className="x" onClick={()=>setPm(null)}>×</span></h2>
-      <div className="body">
-        <div className="pmwhy"><b>为什么这么做:</b>{pm.why}</div>
-        {pm.text==="加载中…"?<pre>{pm.text}</pre>:<div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(pm.text)}}/>}</div></div></div>}
-    {json&&<div className="modal" onClick={()=>{setJson(null);setCopied(false);}}><div className="mbox" onClick={e=>e.stopPropagation()}>
-      <h2>⚙️ ingest payload(给机器看)
-        <button className="lbtn" style={{marginLeft:"auto",marginRight:8}} onClick={()=>copyText(JSON.stringify(json,null,2)).then(()=>{setCopied(true);setTimeout(()=>setCopied(false),1500);}).catch(()=>{})}>{copied?"✓ 已复制":"📋 复制 JSON"}</button>
-        <span className="x" style={{marginLeft:0}} onClick={()=>{setJson(null);setCopied(false);}}>×</span></h2>
-      <div className="body"><pre>{JSON.stringify(json,null,2)}</pre></div></div></div>}
-    {src&&<div className="modal" onClick={()=>setSrc(null)}><div className="mbox" onClick={e=>e.stopPropagation()}>
-      <h2>🔍 原文出处(① 读到的卡片)<span className="x" onClick={()=>setSrc(null)}>×</span></h2>
-      <div className="body">{src.cards.map((c,i)=><div className="srccard" key={i}>
-        <div className="ci">卡片{c.index}{c.start!=null?(" · "+fmtT(c.start)+"–"+fmtT(c.end)):""}</div>
-        {c.image_url&&<img src={c.image_url} onClick={()=>setZoom(c.image_url)} onError={e=>e.target.style.display='none'}/>}
-        {c.video_url&&<video src={c.video_url+(c.start!=null?("#t="+Math.floor(c.start)+","+Math.floor(c.end)):"")} controls/>}
-        {c.content?<div className="srcread">① 在这张卡读到的:{c.content}</div>:<div style={{color:"#9ca3af",fontSize:"12px",marginTop:5}}>(这张卡没读到要点)</div>}
-      </div>)}</div></div></div>}
-    {cstage&&<div className="modal" onClick={()=>setCstage(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
-      <h2>📐 创作阶段 · 写死的 5 个<span className="x" onClick={()=>setCstage(false)}>×</span></h2>
-      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(CSTAGE_DOC)}}/></div></div></div>}
-    {gloss&&<div className="modal" onClick={()=>setGloss(false)}><div className="mbox" onClick={e=>e.stopPropagation()}>
-      <h2>❓ 名词说明 · 用大白话讲清楚<span className="x" onClick={()=>setGloss(false)}>×</span></h2>
-      <div className="body"><div className="md" dangerouslySetInnerHTML={{__html:mdToHtml(GLOSSARY)}}/></div></div></div>}
-    {zoom&&<div className="lb" onClick={()=>setZoom(null)}><img src={zoom}/></div>}
-  </div>;
-}
-ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
-</script>
-<script>
-(function(){var src=document.getElementById("app-src").textContent;
- var out=Babel.transform(src,{presets:[["react",{runtime:"classic"}]]}).code;(0,eval)(out);})();
-</script>
-</body>
-</html>

+ 0 - 1661
web/payloads.json

@@ -1,1661 +0,0 @@
-[
-  {
-    "source": {
-      "id": "xhs_699308fa0000000016009697",
-      "source_type": "post",
-      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
-      }
-    },
-    "title": "“撕裂圣经句”爆款选题法",
-    "content": "目标:通过撕裂赛道圣经句,找到具有情感穿透力的裂缝选题\n步骤1\n  输入:所属赛道的常规共识\n  方法:列出赛道大号反复讲的、人人点头但没人真信的“圣经句”(如:自律即自由、内容为王)。\n  产出:待拆解的赛道圣经句清单\n步骤2\n  输入:← s1 的〈待拆解的赛道圣经句清单〉\n  方法:寻找正确共识失灵的瞬间。针对清单中的句子提问:“什么情况下,一个人严格按这句话做,反而越做越差?”或去竞品爆款视频下寻找包含“道理我都懂,但是……”的评论。例:『内容越好,死得越快』。\n  产出:圣经句的逻辑裂缝/失灵场景\n步骤3\n  输入:← s2 的〈圣经句的逻辑裂缝/失灵场景〉\n  方法:把裂缝撕开,将这种“越做越差”的真实逻辑转化为选题。判据:如果写完后感到羞耻(如“这样说会不会太直白?”)或极度犹豫,说明触碰到了真实痛点。\n  产出:具有羞耻感与冒犯感的爆款选题",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "how"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "赛道共识"
-      },
-      {
-        "scope_type": "substance",
-        "value": "圣经句"
-      },
-      {
-        "scope_type": "effect",
-        "value": "素材"
-      },
-      {
-        "scope_type": "intent",
-        "value": "确定选题"
-      },
-      {
-        "scope_type": "substance",
-        "value": "逻辑裂缝"
-      },
-      {
-        "scope_type": "substance",
-        "value": "共识失灵场景"
-      },
-      {
-        "scope_type": "effect",
-        "value": "冲突切入"
-      },
-      {
-        "scope_type": "substance",
-        "value": "真实痛点"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "羞耻感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "冒犯感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "痛点"
-      },
-      {
-        "scope_type": "intent",
-        "value": "提升传播力"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "选题"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "定向"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "构思"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "列出圣经句"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "寻找失灵瞬间/提取评论“但是”"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "撕开裂缝成题"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_699308fa0000000016009697",
-      "source_type": "post",
-      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
-      }
-    },
-    "title": "爆款选题的“羞耻感”防伪定律",
-    "content": "{\"name\": \"爆款选题的“羞耻感”防伪定律\", \"desc\": \"真正能爆的选题往往由于其不仅通过了大脑审核,更通过了情绪审核。羞耻感是好选题的防伪标签,它本质上触碰到了社交礼仪包裹下、平时大家不敢说出口的真实内容。在内容过剩时代,观众需要的不是正确答案,而是有人帮他们说出“正确答案在特殊场景下不好使”的真相。没有情绪触发就没有转发,作者在发布前感到的安全感(无风险选题)通常等于观众的无感。冒犯感是对“正确共识”的挑战,这种撕裂感能产生更强的穿透力和爆发力。\"}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "why"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "选题防伪定律"
-      },
-      {
-        "scope_type": "substance",
-        "value": "社交礼仪真相"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "羞耻感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "撕裂感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情绪触发"
-      },
-      {
-        "scope_type": "effect",
-        "value": "共识"
-      },
-      {
-        "scope_type": "intent",
-        "value": "提升转发率"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "灵感"
-      },
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "选题"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_699308fa0000000016009697",
-      "source_type": "post",
-      "title": "真正能爆的选题,往往是你写完后感觉羞耻的",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/699308fa0000000016009697"
-      }
-    },
-    "title": "赛道“圣经句”的特征",
-    "content": "{\"name\": \"赛道“圣经句”的特征\", \"kind\": \"多维关系\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"普遍认同性\", \"item_desc\": \"赛道里人人都会点头,表面上表现为“正确答案”。\", \"作用域\": []}, {\"item_name\": \"实际体感缺失\", \"item_desc\": \"在实际执行中往往没人真信,或者在特定场景下会失效、让人感到“不好使”。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "赛道圣经句"
-      },
-      {
-        "scope_type": "substance",
-        "value": "审美疲劳"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "审美疲劳感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "定义特征"
-      },
-      {
-        "scope_type": "intent",
-        "value": "科普"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "选题"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "指在特定赛道内虽然正确但容易引发审美疲劳的共识性话语。"
-      },
-      {
-        "key": "出自",
-        "type": "str",
-        "value": "“撕裂圣经句”爆款选题法 第1步"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_698481e1000000000a02a7c1",
-      "source_type": "post",
-      "title": "7种编剧常用的叙事结构,写剧不用愁!",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/698481e1000000000a02a7c1"
-      }
-    },
-    "title": "7种常用叙事结构及其适用场景",
-    "content": "{\"name\": \"7种常用叙事结构及其适用场景\", \"kind\": \"子集\", \"维度拆分规则\": \"类型枚举\", \"body\": [{\"item_name\": \"三幕式结构\", \"item_desc\": \"最基础的线性叙事,起承转合。分为:第一幕(开端)交代背景、人设和冲突触发;第二幕(发展)核心冲突升级,主角遭遇阻碍,是人物成长和情节铺垫关键;第三幕(高潮与结局)矛盾爆发并解决,情节收尾。\", \"作用域\": []}, {\"item_name\": \"英雄之旅结构\", \"item_desc\": \"核心是“平凡人到英雄的蜕变”,适合成长弧光设计。分为三个阶段:启程(离开舒适区)、考验(挑战与社交、对抗反派)、归来(战胜危机获成长)。\", \"作用域\": []}, {\"item_name\": \"非线性结构\", \"item_desc\": \"打破时间先后,通过时间拆解重组。常用手法包括闪回、插叙、倒叙、多视角切换。适用于制造悬念和多维度理解人物。\", \"作用域\": []}, {\"item_name\": \"环形结构\", \"item_desc\": \"首尾呼应形成闭环。包含非循环类(场景台词呼应)和循环类(重复经历某段事件,如无限循环或宿命感设定)。\", \"作用域\": []}, {\"item_name\": \"多线叙事结构\", \"item_desc\": \"多条独立故事线并行并在节点汇合。每条线有独立主角和冲突,通过切换提升剧情密度,适用于展现核心事件全貌或展现共同主题(如阶级、人性)。\", \"作用域\": []}, {\"item_name\": \"嵌套式结构\", \"item_desc\": \"层层递进的套层结构(如戏中戏、梦中梦)。外层引出内层,内外层互为影响呼应。\", \"作用域\": []}, {\"item_name\": \"反结构\", \"item_desc\": \"无结构或碎片化结构,抛弃线性逻辑和核心冲突。注重氛围营造、情绪表达和人性探讨,靠人物状态和细节描写。适配文艺片、实验性影片。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "叙事结构"
-      },
-      {
-        "scope_type": "substance",
-        "value": "剧本"
-      },
-      {
-        "scope_type": "substance",
-        "value": "情节设计"
-      },
-      {
-        "scope_type": "form",
-        "value": "三幕式结构"
-      },
-      {
-        "scope_type": "form",
-        "value": "英雄之旅"
-      },
-      {
-        "scope_type": "form",
-        "value": "非线性叙事"
-      },
-      {
-        "scope_type": "form",
-        "value": "环形结构"
-      },
-      {
-        "scope_type": "form",
-        "value": "多线叙事"
-      },
-      {
-        "scope_type": "form",
-        "value": "嵌套式结构"
-      },
-      {
-        "scope_type": "form",
-        "value": "反结构"
-      },
-      {
-        "scope_type": "effect",
-        "value": "剧情节奏"
-      },
-      {
-        "scope_type": "effect",
-        "value": "人物弧光"
-      },
-      {
-        "scope_type": "intent",
-        "value": "教学"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "编剧常用的7种叙事结构及其核心逻辑和适用题材。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e2e39b0000000003028ff0",
-      "source_type": "post",
-      "title": "剧本创作:理解前提、人物、冲突",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
-      }
-    },
-    "title": "剧本前提的构成公式",
-    "content": "{\"name\": \"剧本前提的构成公式\", \"kind\": \"多维关系\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"前提构成成分\", \"item_desc\": \"由『作者立场+人物+冲突+结论』构成。其本质是指称主题、论题、基本思想等,指引剧本达到目标。可以通过结局倒推,且情感可以决定前提。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "剧本前提"
-      },
-      {
-        "scope_type": "substance",
-        "value": "创作立场"
-      },
-      {
-        "scope_type": "form",
-        "value": "前提公式"
-      },
-      {
-        "scope_type": "effect",
-        "value": "主旨指引"
-      },
-      {
-        "scope_type": "intent",
-        "value": "立意"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "定义剧本目标与核心思想的内容组成结构"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e2e39b0000000003028ff0",
-      "source_type": "post",
-      "title": "剧本创作:理解前提、人物、冲突",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
-      }
-    },
-    "title": "人物构成的三维度模型",
-    "content": "{\"name\": \"人物构成的三维度模型\", \"kind\": \"多维关系\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"生理维度\", \"item_desc\": \"包含性别、年龄、外表以及遗传特征等。在重要性排序中位列第一。\", \"作用域\": []}, {\"item_name\": \"社会维度\", \"item_desc\": \"包含阶层、职业、教育、家庭、社交等。在重要性排序中位列第二。\", \"作用域\": []}, {\"item_name\": \"心理维度\", \"item_desc\": \"包含道德标准、志向、挫折、性格、态度等。是生理与社会的产物,重要性排序第三。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "人物构成"
-      },
-      {
-        "scope_type": "substance",
-        "value": "生理特征"
-      },
-      {
-        "scope_type": "substance",
-        "value": "社会背景"
-      },
-      {
-        "scope_type": "substance",
-        "value": "心理特质"
-      },
-      {
-        "scope_type": "form",
-        "value": "三维度模型"
-      },
-      {
-        "scope_type": "intent",
-        "value": "刻画人物"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "定义人物作为一个多维度综合产物的具体构成要素"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e2e39b0000000003028ff0",
-      "source_type": "post",
-      "title": "剧本创作:理解前提、人物、冲突",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
-      }
-    },
-    "title": "剧本冲突的四种类型",
-    "content": "{\"name\": \"剧本冲突的四种类型\", \"kind\": \"子集\", \"维度拆分规则\": \"冲突的演进特征\", \"body\": [{\"item_name\": \"静态冲突\", \"item_desc\": \"人物无可见发展,缺乏创造升级冲突的能力时会出现此类冲突。\", \"作用域\": []}, {\"item_name\": \"跳跃冲突\", \"item_desc\": \"当强迫人物作出与其本性不相符的行动时,冲突会产生不自然的跳跃。\", \"作用域\": []}, {\"item_name\": \"缓慢升级冲突\", \"item_desc\": \"编剧不干预自然产生,是对立统一的人物的共同结果,最为推荐。\", \"作用域\": []}, {\"item_name\": \"预示冲突\", \"item_desc\": \"即张力,是对冲突的允诺,用于维持观众吸引力。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "剧本冲突"
-      },
-      {
-        "scope_type": "form",
-        "value": "冲突分类"
-      },
-      {
-        "scope_type": "effect",
-        "value": "张力构建"
-      },
-      {
-        "scope_type": "effect",
-        "value": "吸引力"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "期待感"
-      },
-      {
-        "scope_type": "intent",
-        "value": "诊断剧情"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "基于人物发展与行动逻辑划分的四种冲突形态"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e2e39b0000000003028ff0",
-      "source_type": "post",
-      "title": "剧本创作:理解前提、人物、冲突",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
-      }
-    },
-    "title": "冲突升级的原理与动力",
-    "content": "{\"name\": \"冲突升级的原理与动力\", \"desc\": \"冲突是行动的源泉,其本质由生活环境和社会状况构成。有效的冲突源于‘对立统一’:必须让具备强烈意志力(名誉、金钱、复仇等需求)的主使人物与同样强大且无情的对立人物相遇。冲突的推进模式是‘攻击—反击’,只有势均力敌的对手通过不断的决策(互为因果)产生反应,才能驱动冲突不断升级并自然走向高潮。\"}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "why"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "冲突升级"
-      },
-      {
-        "scope_type": "substance",
-        "value": "对立统一"
-      },
-      {
-        "scope_type": "substance",
-        "value": "人物意志力"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情节"
-      },
-      {
-        "scope_type": "effect",
-        "value": "攻击反击模式"
-      },
-      {
-        "scope_type": "intent",
-        "value": "强化戏剧性"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e2e39b0000000003028ff0",
-      "source_type": "post",
-      "title": "剧本创作:理解前提、人物、冲突",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e2e39b0000000003028ff0"
-      }
-    },
-    "title": "剧本切入与节奏构思法",
-    "content": "目标:确定剧本的起始点并梳理剧情节奏点\n步骤1\n  输入:初步的故事创意或灵感\n  方法:寻找切入点:必须选择一个‘决定点’或‘准备做出决定的点’。例:『通常在导致危机或人生转折的点切入』。\n  产出:剧本的切入位置(决定点)\n步骤2\n  输入:← s1 的剧本切入位置(决定点)\n  方法:配置过渡与危机:使用过渡(小冲突)使人物从一种状态进入另一种;重大决定构成转折点,产生危机。\n  产出:含过渡与危机的剧情链条\n步骤3\n  输入:← s2 的剧情链条\n  方法:推向高潮与结局:由危机预示高潮,最终通过前提的逻辑得出结局。\n  产出:完整的剧情结构规划(含高潮与结局)",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "how"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "切入点"
-      },
-      {
-        "scope_type": "substance",
-        "value": "危机时刻"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情节起始"
-      },
-      {
-        "scope_type": "intent",
-        "value": "规划开篇"
-      },
-      {
-        "scope_type": "substance",
-        "value": "剧情过渡"
-      },
-      {
-        "scope_type": "substance",
-        "value": "转折点"
-      },
-      {
-        "scope_type": "effect",
-        "value": "节奏控制"
-      },
-      {
-        "scope_type": "effect",
-        "value": "状态转换"
-      },
-      {
-        "scope_type": "intent",
-        "value": "连接剧情"
-      },
-      {
-        "scope_type": "substance",
-        "value": "高潮"
-      },
-      {
-        "scope_type": "substance",
-        "value": "结局"
-      },
-      {
-        "scope_type": "form",
-        "value": "剧情结构"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情节收束"
-      },
-      {
-        "scope_type": "intent",
-        "value": "完成叙事"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "结构"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "确定切入点"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "节奏排布"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "完成大纲"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "场景分析五步程序",
-    "content": "目标:通过五个步骤对单个场景进行深度分析与定稿\n步骤1\n  输入:原始场景构思\n  方法:明确该场景中人物的具体目标以及阻碍目标的对抗力量。\n  产出:场景冲突定义\n步骤2\n  输入:← s1 的场景冲突定义\n  方法:识别并标注场景开始处的核心价值状态(如:生命/死亡、爱/恨等正负面状态)。\n  产出:开篇价值状态\n步骤3\n  输入:← s2 的开篇价值状态\n  方法:将场景细化为“动作/反应”的细微交流环节。\n  产出:场景节拍清单\n步骤4\n  输入:← s3 的场景节拍清单\n  方法:标注场景结束时的价值状态,并与开篇价值进行对比,确认是否发生了转变。\n  产出:结尾价值对比\n步骤5\n  输入:← s4 的结尾价值对比\n  方法:对所有节拍进行总结,并精准找出发生转折的点。\n  产出:场景分析总结与转折点定位",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "how"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "人物目标"
-      },
-      {
-        "scope_type": "substance",
-        "value": "对抗力量"
-      },
-      {
-        "scope_type": "effect",
-        "value": "冲突设置"
-      },
-      {
-        "scope_type": "intent",
-        "value": "界定冲突"
-      },
-      {
-        "scope_type": "substance",
-        "value": "核心价值状态"
-      },
-      {
-        "scope_type": "effect",
-        "value": "状态量化"
-      },
-      {
-        "scope_type": "intent",
-        "value": "建立基准"
-      },
-      {
-        "scope_type": "substance",
-        "value": "动作反应"
-      },
-      {
-        "scope_type": "form",
-        "value": "场景节拍"
-      },
-      {
-        "scope_type": "effect",
-        "value": "颗粒度拆解"
-      },
-      {
-        "scope_type": "intent",
-        "value": "细化过程"
-      },
-      {
-        "scope_type": "substance",
-        "value": "价值转变"
-      },
-      {
-        "scope_type": "effect",
-        "value": "对比分析"
-      },
-      {
-        "scope_type": "intent",
-        "value": "验证有效性"
-      },
-      {
-        "scope_type": "substance",
-        "value": "转折点"
-      },
-      {
-        "scope_type": "effect",
-        "value": "结构总结"
-      },
-      {
-        "scope_type": "intent",
-        "value": "定位核心"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "构思"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "结构"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "打磨"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "确定冲突"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "标注开篇价值"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "分解节拍"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "标注结尾价值"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "概述节拍并标注转折点"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "故事五部分构成序列",
-    "content": "{\"name\": \"故事五部分构成序列\", \"kind\": \"序列\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"阐述\", \"item_desc\": \"故事的背景交代部分。\", \"作用域\": []}, {\"item_name\": \"激励事件\", \"item_desc\": \"打破平衡、激发欲望的诱发事件。分为随机(巧合)和有因(抉择)两种,通常在故事前1/4发生。\", \"作用域\": []}, {\"item_name\": \"进展纠葛\", \"item_desc\": \"由于抗力产生的冲突(上升动作)。\", \"作用域\": []}, {\"item_name\": \"危机/高潮\", \"item_desc\": \"危机是情节突转,高潮是问题的最终解决。\", \"作用域\": []}, {\"item_name\": \"结局\", \"item_desc\": \"故事的下降动作与收尾。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "激励事件"
-      },
-      {
-        "scope_type": "substance",
-        "value": "进展纠葛"
-      },
-      {
-        "scope_type": "substance",
-        "value": "危机高潮"
-      },
-      {
-        "scope_type": "form",
-        "value": "五部分序列"
-      },
-      {
-        "scope_type": "form",
-        "value": "线性结构"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情节铺排"
-      },
-      {
-        "scope_type": "intent",
-        "value": "构建剧作架构"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "故事在时间维度上由五个核心部分线性排列而成。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "故事冲突的三种类型",
-    "content": "{\"name\": \"故事冲突的三种类型\", \"kind\": \"子集\", \"维度拆分规则\": \"冲突范围\", \"body\": [{\"item_name\": \"内心冲突\", \"item_desc\": \"人物自身内部的挣扎。\", \"作用域\": []}, {\"item_name\": \"个人冲突\", \"item_desc\": \"人与人之间的直接对抗。\", \"作用域\": []}, {\"item_name\": \"个人-外界冲突\", \"item_desc\": \"人与社会、自然或未知环境的冲突。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "内心冲突"
-      },
-      {
-        "scope_type": "substance",
-        "value": "个人冲突"
-      },
-      {
-        "scope_type": "substance",
-        "value": "社会环境冲突"
-      },
-      {
-        "scope_type": "effect",
-        "value": "对抗力分类"
-      },
-      {
-        "scope_type": "intent",
-        "value": "拓展冲突维度"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "灵感"
-      },
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "按冲突发生的领域划分故事对抗力的来源。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "转折点的四重效果",
-    "content": "{\"name\": \"转折点的四重效果\", \"kind\": \"多维关系\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"惊奇\", \"item_desc\": \"出乎意料的效果。\", \"作用域\": []}, {\"item_name\": \"增强好奇心\", \"item_desc\": \"引导观众对后续发展的探索欲。\", \"作用域\": []}, {\"item_name\": \"见识\", \"item_desc\": \"提供新的洞察。 \", \"作用域\": []}, {\"item_name\": \"新方向\", \"item_desc\": \"改变故事的走向。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "feeling",
-        "value": "惊奇感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "好奇心"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "洞察感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "叙事突转"
-      },
-      {
-        "scope_type": "intent",
-        "value": "强化观众体验"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "场景中发生转折时应当带给观众的四种心理感受。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "真正选择的“两难”原理",
-    "content": "{\"name\": \"真正选择的“两难”原理\", \"desc\": \"真正的选择必须是两难之择,即在不可调和的两善中取其一,或在两恶中取其轻。这种危机时刻是故事中最高压、最紧张的时刻,不仅能制造强烈的冲突,还能揭示人物的深层性格。\"}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "why"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "两难抉择"
-      },
-      {
-        "scope_type": "substance",
-        "value": "人物性格"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "高压紧张感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "性格揭示"
-      },
-      {
-        "scope_type": "intent",
-        "value": "制造极致冲突"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_680659e8000000001a007a11",
-      "source_type": "post",
-      "title": "故事设计原理拆解学习",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/680659e8000000001a007a11"
-      }
-    },
-    "title": "情感回报递减定理",
-    "content": "{\"name\": \"情感回报递减定理\", \"desc\": \"如果情感连续重复出现,其效果会随着时间减少。因此在创作中需要通过价值的正面与负面动态交替,来引导核心情感(快感与痛感)的转变,从而确保持续吸引观众。\"}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "why"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "情感回报递减"
-      },
-      {
-        "scope_type": "substance",
-        "value": "正负价值交替"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "快感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "痛感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "动态节奏控制"
-      },
-      {
-        "scope_type": "intent",
-        "value": "维持观众注意力"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "短视频脚本创作流",
-    "content": "目标:从确定选题到完成一份包含视听细节的脚本\n步骤1\n  输入:创作意向/原始素材\n  方法:依据创作目标确定选题。例:『确定选题』\n  产出:确定的选题\n步骤2\n  输入:← s1 的〈确定的选题〉\n  方法:围绕选题搭建核心框架,明确人物、场景和事件。例:『搭建框架(人物、场景、事件)』\n  产出:脚本框架(含人物、场景、事件)\n步骤3\n  输入:← s2 的〈脚本框架(含人物、场景、事件)〉\n  方法:将框架细化为镜头级语言。填充:镜号、拍摄场景、画面内容描述、拍摄技巧、字幕、音乐音效、时长建议。例:『细节完善』\n  产出:分镜头脚本成品",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "how"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "短视频选题"
-      },
-      {
-        "scope_type": "effect",
-        "value": "目标拆解"
-      },
-      {
-        "scope_type": "intent",
-        "value": "规划"
-      },
-      {
-        "scope_type": "substance",
-        "value": "脚本框架"
-      },
-      {
-        "scope_type": "substance",
-        "value": "叙事要素"
-      },
-      {
-        "scope_type": "effect",
-        "value": "结构搭建"
-      },
-      {
-        "scope_type": "substance",
-        "value": "镜头语言"
-      },
-      {
-        "scope_type": "substance",
-        "value": "制作细节"
-      },
-      {
-        "scope_type": "form",
-        "value": "分镜头脚本"
-      },
-      {
-        "scope_type": "effect",
-        "value": "执行细化"
-      },
-      {
-        "scope_type": "intent",
-        "value": "教学"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "定向"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "构思"
-      },
-      {
-        "key": "创作阶段",
-        "type": "str",
-        "value": "结构"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "确定选题"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "搭建框架"
-      },
-      {
-        "key": "动作",
-        "type": "str",
-        "value": "细节完善"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "视频分镜头要素表",
-    "content": "{\"name\": \"视频分镜头要素表\", \"kind\": \"多维关系\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"镜号\", \"item_desc\": \"标注镜头的先后序号\", \"作用域\": []}, {\"item_name\": \"画面\", \"item_desc\": \"描述视频的具体视觉画面内容\", \"作用域\": []}, {\"item_name\": \"景别/角度\", \"item_desc\": \"规定摄影机的拍摄距离与构图角度\", \"作用域\": []}, {\"item_name\": \"时长\", \"item_desc\": \"单个镜头的持续时间\", \"作用域\": []}, {\"item_name\": \"视频文案\", \"item_desc\": \"对应镜头的旁白、对白或台词\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "分镜头要素"
-      },
-      {
-        "scope_type": "form",
-        "value": "分镜头表格"
-      },
-      {
-        "scope_type": "effect",
-        "value": "规范信息"
-      },
-      {
-        "scope_type": "intent",
-        "value": "科普"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "一份标准的分镜头表格应包含的构成维度"
-      },
-      {
-        "key": "出自",
-        "type": "str",
-        "value": "短视频脚本创作流 第3步"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "常用的六种摄影构图法",
-    "content": "{\"name\": \"常用的六种摄影构图法\", \"kind\": \"子集\", \"维度拆分规则\": \"布局逻辑\", \"body\": [{\"item_name\": \"水平线构图\", \"item_desc\": \"利用地平线等水平元素,使画面稳定宽广\", \"作用域\": []}, {\"item_name\": \"对角线构图\", \"item_desc\": \"利用倾斜线条引导视线,增加动感,吸引注意力\", \"作用域\": []}, {\"item_name\": \"中心构图\", \"item_desc\": \"将主体放于正中心,使主体非常突出\", \"作用域\": []}, {\"item_name\": \"框式构图\", \"item_desc\": \"利用周边的元素形成框架,产生穿透感或神秘感\", \"作用域\": []}, {\"item_name\": \"九宫格构图\", \"item_desc\": \"按九宫格交叉点排列主体,使其更醒目\", \"作用域\": []}, {\"item_name\": \"三分法构图\", \"item_desc\": \"将重点分布在画面的1/3处,用于简单化复杂画面\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "摄影技术"
-      },
-      {
-        "scope_type": "form",
-        "value": "构图布局"
-      },
-      {
-        "scope_type": "effect",
-        "value": "美感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "视觉引导"
-      },
-      {
-        "scope_type": "intent",
-        "value": "教学"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "提升视频画面美感与表达力的六种典型布局方式"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "短视频脚本黄金结构",
-    "content": "{\"name\": \"短视频脚本黄金结构\", \"kind\": \"序列\", \"维度拆分规则\": null, \"body\": [{\"item_name\": \"引子\", \"item_desc\": \"通过视觉冲击或创意起手,利用开头噱头抓住用户\", \"作用域\": []}, {\"item_name\": \"内容主体\", \"item_desc\": \"进行中间论述,把握故事线与节奏\", \"作用域\": []}, {\"item_name\": \"结尾\", \"item_desc\": \"总结全文,留下印象点、情感寄托或行动引导\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "叙事序列"
-      },
-      {
-        "scope_type": "form",
-        "value": "线性结构"
-      },
-      {
-        "scope_type": "effect",
-        "value": "节奏控制"
-      },
-      {
-        "scope_type": "effect",
-        "value": "留人钩子"
-      },
-      {
-        "scope_type": "intent",
-        "value": "逻辑梳理"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "短视频从头到尾的线性叙事组成序列"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "Vlog脚本创作公式清单",
-    "content": "{\"name\": \"Vlog脚本创作公式清单\", \"kind\": \"子集\", \"维度拆分规则\": \"想引发的观众反应\", \"body\": [{\"item_name\": \"共鸣公式\", \"item_desc\": \"共鸣 = 人物 + 状态 + 情感\", \"作用域\": []}, {\"item_name\": \"好奇公式\", \"item_desc\": \"好奇 = 时间/观点 + 悬念\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "Vlog内容要素"
-      },
-      {
-        "scope_type": "form",
-        "value": "创作公式"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "共鸣感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "好奇感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "情绪调动"
-      },
-      {
-        "scope_type": "intent",
-        "value": "方法建模"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "针对不同情绪反馈的Vlog内容构成方案"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_67e4bdf50000000006028a59",
-      "source_type": "post",
-      "title": "只要学会这几样,写短视频脚本真的不难❗️",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/67e4bdf50000000006028a59"
-      }
-    },
-    "title": "视频节奏的时长分配原理",
-    "content": "{\"name\": \"视频节奏的时长分配原理\", \"desc\": \"长视频需要通过周期性的刺激来维持用户注意力,通常每15秒需设置一个重点内容;而短视频留给创作者的时间极短,必须在3-5秒内迅速呈现出核心主题,否则用户极易流失。\"}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "why"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "视频时长"
-      },
-      {
-        "scope_type": "substance",
-        "value": "重心分配"
-      },
-      {
-        "scope_type": "form",
-        "value": "节奏编排"
-      },
-      {
-        "scope_type": "effect",
-        "value": "注意力保持"
-      },
-      {
-        "scope_type": "intent",
-        "value": "科普"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_6901e15a0000000003019fa3",
-      "source_type": "post",
-      "title": "爆款标题公式直接抄❗️笔记想不火都难",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/6901e15a0000000003019fa3"
-      }
-    },
-    "title": "小红书笔记标题3个万能公式",
-    "content": "{\"name\": \"小红书笔记标题3个万能公式\", \"kind\": \"子集\", \"维度拆分规则\": \"标题构成的侧重点\", \"body\": [{\"item_name\": \"时间+结果+经验\", \"item_desc\": \"构成要素为具体的执行时间、达成的结果及总结的经验。适用于有具体成果背书的内容。例:『半年时间涨粉11w,全靠这个万能公式』,用具象数字和结果钩住用户。\", \"作用域\": []}, {\"item_name\": \"痛点+解决方法+保证\", \"item_desc\": \"构成要素为点出用户当下的困扰、给出对策并提供效果承诺。适用于攻略类或教程类内容。例:『小红书不涨粉,3大技巧照做就对了』,精准戳中需求并下承诺。\", \"作用域\": []}, {\"item_name\": \"方法+保证\", \"item_desc\": \"直接展示操作方法并给予效果保障。旨在传达一种易操作感,降低用户的决策/学习门槛。例:『傻瓜式化妆手法,有手就行』。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "笔记标题"
-      },
-      {
-        "scope_type": "substance",
-        "value": "标题公式"
-      },
-      {
-        "scope_type": "form",
-        "value": "标题结构"
-      },
-      {
-        "scope_type": "effect",
-        "value": "点击吸引"
-      },
-      {
-        "scope_type": "effect",
-        "value": "价值传达"
-      },
-      {
-        "scope_type": "intent",
-        "value": "起标题"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "提供三种可直接套用的标题组块逻辑,通过组合时间、结果、痛点等要素吸引点击。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_6901e15a0000000003019fa3",
-      "source_type": "post",
-      "title": "爆款标题公式直接抄❗️笔记想不火都难",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/6901e15a0000000003019fa3"
-      }
-    },
-    "title": "标题创作的9种实用技巧",
-    "content": "{\"name\": \"标题创作的9种实用技巧\", \"kind\": \"子集\", \"维度拆分规则\": \"类型枚举\", \"body\": [{\"item_name\": \"提问式\", \"item_desc\": \"用困惑开头直击需求,直接命中用户的疑问或痛点。\", \"作用域\": []}, {\"item_name\": \"设问式\", \"item_desc\": \"先抛问题再给方案,通过自问自答勾起好奇心并预告内容价值。\", \"作用域\": []}, {\"item_name\": \"数字式\", \"item_desc\": \"使用具体数字(如价格、数量、天数等),增强干货感并降低用户的决策成本。\", \"作用域\": []}, {\"item_name\": \"利益式\", \"item_desc\": \"直接展现价值,把用户能通过笔记得到的好处摆在台面上。\", \"作用域\": []}, {\"item_name\": \"悬念式\", \"item_desc\": \"隐藏关键细节或结论,只说一半内容,激发点击进去寻找答案的好奇心。\", \"作用域\": []}, {\"item_name\": \"对比式\", \"item_desc\": \"通过前后或不同对象之间的状态对比,制造差异感和冲突感。\", \"作用域\": []}, {\"item_name\": \"劝诫式\", \"item_desc\": \"利用避坑和规避损失的心理,抓住用户害怕失去或犯错的重视感。\", \"作用域\": []}, {\"item_name\": \"共情式\", \"item_desc\": \"替人发声,说出用户想说但没说出的话,以此引发强烈的情绪共鸣。\", \"作用域\": []}, {\"item_name\": \"热点式\", \"item_desc\": \"绑定节日、热门人物或社会热点事件进行借势营销。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "笔记标题"
-      },
-      {
-        "scope_type": "substance",
-        "value": "心理触点"
-      },
-      {
-        "scope_type": "form",
-        "value": "提问式"
-      },
-      {
-        "scope_type": "form",
-        "value": "对比式"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "好奇感"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "共鸣感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "悬念设置"
-      },
-      {
-        "scope_type": "effect",
-        "value": "利益承诺"
-      },
-      {
-        "scope_type": "intent",
-        "value": "提升点击率"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "通过不同的切入点和心理触点,改变标题的表达方式以提升点击率。"
-      }
-    ]
-  },
-  {
-    "source": {
-      "id": "xhs_69ff58670000000023016fa2",
-      "source_type": "post",
-      "title": "海外营销灵感|五月爆款Reels创意合集",
-      "author": "",
-      "source_metadata": {
-        "platform": "xiaohongshu",
-        "url": "https://www.xiaohongshu.com/explore/69ff58670000000023016fa2"
-      }
-    },
-    "title": "海外短视频爆款创意策略清单",
-    "content": "{\"name\": \"海外短视频爆款创意策略清单\", \"kind\": \"子集\", \"维度拆分规则\": \"类型枚举\", \"body\": [{\"item_name\": \"超现实主义(SURREALISM)\", \"item_desc\": \"将日常生活物品巨大化。通过体积对比产生视觉冲击力,创造新鲜感。适合原材料/纯净成分品牌进行视觉吸引。例:@the_ordinary。\", \"作用域\": []}, {\"item_name\": \"错觉式转场(ILLUSION TRANSTION)\", \"item_desc\": \"利用看似背景的物体作为遮挡或引导进行转场,利用背景与前景的巧妙一致性。适合低预算追求高质量质感的创作场景。\", \"作用域\": []}, {\"item_name\": \"反差式展示(THE PROUD FOUNDER)\", \"item_desc\": \"创始人先展示凌乱、未修边幅的状态(Rotting),接着切入作为成功品牌创始人的自信状态。利用巨大的心理与视觉落差产生张力,适合用于与潜在客户建立情感联结。\", \"作用域\": []}]}",
-    "dim_creations": [
-      "创作"
-    ],
-    "dim_attributes": [
-      "what"
-    ],
-    "scopes": [
-      {
-        "scope_type": "substance",
-        "value": "日常生活物品"
-      },
-      {
-        "scope_type": "substance",
-        "value": "体积对比"
-      },
-      {
-        "scope_type": "form",
-        "value": "巨大化视觉"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "新鲜感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "视觉冲击力营造"
-      },
-      {
-        "scope_type": "intent",
-        "value": "吸引注意力"
-      },
-      {
-        "scope_type": "substance",
-        "value": "前景背景一致性"
-      },
-      {
-        "scope_type": "form",
-        "value": "错觉式转场"
-      },
-      {
-        "scope_type": "form",
-        "value": "遮挡转场"
-      },
-      {
-        "scope_type": "effect",
-        "value": "画面质感"
-      },
-      {
-        "scope_type": "intent",
-        "value": "降低创作成本"
-      },
-      {
-        "scope_type": "substance",
-        "value": "品牌创始人"
-      },
-      {
-        "scope_type": "substance",
-        "value": "个人状态对比"
-      },
-      {
-        "scope_type": "form",
-        "value": "反差展示结构"
-      },
-      {
-        "scope_type": "feeling",
-        "value": "心理落差感"
-      },
-      {
-        "scope_type": "effect",
-        "value": "视觉张力"
-      },
-      {
-        "scope_type": "intent",
-        "value": "建立情感联结"
-      }
-    ],
-    "custom_ext": [
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "灵感"
-      },
-      {
-        "key": "业务阶段",
-        "type": "str",
-        "value": "脚本"
-      },
-      {
-        "key": "概要",
-        "type": "str",
-        "value": "针对海外Reels视频创作的三种可迁移的爆款创意表现形式。"
-      }
-    ]
-  }
-]

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä