@tikomni/skills 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/.skill-package-allowlist.txt +1 -3
  2. package/README.md +41 -49
  3. package/README.zh-CN.md +43 -51
  4. package/bin/tikomni-skills.js +2 -2
  5. package/env.example +37 -56
  6. package/package.json +7 -5
  7. package/skills/social-media-crawl/SKILL.md +53 -0
  8. package/skills/social-media-crawl/agents/openai.yaml +5 -0
  9. package/skills/social-media-crawl/references/contracts/output-envelope.md +22 -0
  10. package/skills/social-media-crawl/references/contracts/work-fact-card-fields.md +48 -0
  11. package/skills/social-media-crawl/references/guides/generic-mcp-objects.md +30 -0
  12. package/skills/social-media-crawl/references/mcp-usage-contract.md +30 -0
  13. package/skills/social-media-crawl/references/pipelines/douyin-creator-home.md +7 -0
  14. package/skills/social-media-crawl/references/pipelines/douyin-single-work.md +7 -0
  15. package/skills/social-media-crawl/references/pipelines/xiaohongshu-creator-home.md +7 -0
  16. package/skills/social-media-crawl/references/pipelines/xiaohongshu-single-work.md +7 -0
  17. package/skills/social-media-crawl/references/schemas/creator-profile.schema.json +33 -0
  18. package/skills/social-media-crawl/references/schemas/output-envelope.schema.json +41 -0
  19. package/skills/social-media-crawl/references/schemas/work-collection.schema.json +29 -0
  20. package/skills/social-media-crawl/references/schemas/work-fact-card.schema.json +67 -0
  21. package/skills/social-media-crawl/references/service-guides/u2-u3-mandatory-fallback.md +21 -0
  22. package/skills/social-media-crawl/scripts/__init__.py +2 -0
  23. package/skills/social-media-crawl/scripts/core/__init__.py +2 -0
  24. package/skills/{single-work-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/asr_pipeline.py +98 -2
  25. package/skills/social-media-crawl/scripts/core/completeness.py +83 -0
  26. package/skills/{single-work-analysis → social-media-crawl}/scripts/core/config_loader.py +106 -141
  27. package/skills/social-media-crawl/scripts/core/mcp_dispatch.py +145 -0
  28. package/skills/social-media-crawl/scripts/core/object_detection.py +63 -0
  29. package/skills/{single-work-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/poll_u2_task.py +3 -1
  30. package/skills/{creator-analysis → social-media-crawl}/scripts/core/progress_report.py +32 -0
  31. package/skills/social-media-crawl/scripts/core/storage_router.py +160 -0
  32. package/skills/social-media-crawl/scripts/core/u3_fallback.py +328 -0
  33. package/skills/social-media-crawl/scripts/pipelines/__init__.py +2 -0
  34. package/skills/social-media-crawl/scripts/pipelines/douyin_creator_home_helpers.py +35 -0
  35. package/skills/social-media-crawl/scripts/pipelines/douyin_platform_adapter.py +7 -0
  36. package/skills/{creator-analysis/scripts/author_home/asr → social-media-crawl/scripts/pipelines}/home_asr.py +1 -1
  37. package/skills/{creator-analysis/scripts/author_home/adapters → social-media-crawl/scripts/pipelines}/platform_adapters.py +8 -2
  38. package/skills/social-media-crawl/scripts/pipelines/run_douyin_creator_home.py +237 -0
  39. package/skills/{single-work-analysis/scripts/platform/douyin/run_douyin_single_video.py → social-media-crawl/scripts/pipelines/run_douyin_single_work.py} +58 -149
  40. package/skills/social-media-crawl/scripts/pipelines/run_xiaohongshu_creator_home.py +237 -0
  41. package/skills/{single-work-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py → social-media-crawl/scripts/pipelines/run_xiaohongshu_single_work.py} +30 -119
  42. package/skills/{creator-analysis/scripts/author_home → social-media-crawl/scripts/pipelines}/schema.py +1 -1
  43. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_creator_home_helpers.py +35 -0
  44. package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_platform_adapter.py +7 -0
  45. package/skills/social-media-crawl/scripts/writers/__init__.py +1 -0
  46. package/skills/social-media-crawl/scripts/writers/write_work_fact_card.py +391 -0
  47. package/skills/creator-analysis/SKILL.md +0 -95
  48. package/skills/creator-analysis/agents/openai.yaml +0 -4
  49. package/skills/creator-analysis/env.example +0 -36
  50. package/skills/creator-analysis/references/api-capability-index.md +0 -92
  51. package/skills/creator-analysis/references/api-contracts/asr-api.md +0 -130
  52. package/skills/creator-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  53. package/skills/creator-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  54. package/skills/creator-analysis/references/api-contracts/demo-api.md +0 -717
  55. package/skills/creator-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  56. package/skills/creator-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  57. package/skills/creator-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  58. package/skills/creator-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  59. package/skills/creator-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  60. package/skills/creator-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  61. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  62. package/skills/creator-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  63. package/skills/creator-analysis/references/api-contracts/health-check.md +0 -69
  64. package/skills/creator-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  65. package/skills/creator-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  66. package/skills/creator-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  67. package/skills/creator-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  68. package/skills/creator-analysis/references/api-contracts/ios-shortcut.md +0 -44
  69. package/skills/creator-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  70. package/skills/creator-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  71. package/skills/creator-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  72. package/skills/creator-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  73. package/skills/creator-analysis/references/api-contracts/media-ingest-api.md +0 -126
  74. package/skills/creator-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  75. package/skills/creator-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  76. package/skills/creator-analysis/references/api-contracts/sora2-api.md +0 -2266
  77. package/skills/creator-analysis/references/api-contracts/temp-mail-api.md +0 -208
  78. package/skills/creator-analysis/references/api-contracts/threads-web-api.md +0 -897
  79. package/skills/creator-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  80. package/skills/creator-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  81. package/skills/creator-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  82. package/skills/creator-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  83. package/skills/creator-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  84. package/skills/creator-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  85. package/skills/creator-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  86. package/skills/creator-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  87. package/skills/creator-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  88. package/skills/creator-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  89. package/skills/creator-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  90. package/skills/creator-analysis/references/api-contracts/twitter-web-api.md +0 -989
  91. package/skills/creator-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  92. package/skills/creator-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  93. package/skills/creator-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  94. package/skills/creator-analysis/references/api-contracts/weibo-web-api.md +0 -798
  95. package/skills/creator-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  96. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  97. package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  98. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  99. package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  100. package/skills/creator-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  101. package/skills/creator-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  102. package/skills/creator-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  103. package/skills/creator-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  104. package/skills/creator-analysis/references/api-tags/asr-api.md +0 -100
  105. package/skills/creator-analysis/references/api-tags/bilibili-app-api.md +0 -482
  106. package/skills/creator-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  107. package/skills/creator-analysis/references/api-tags/demo-api.md +0 -365
  108. package/skills/creator-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  109. package/skills/creator-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  110. package/skills/creator-analysis/references/api-tags/douyin-creator-api.md +0 -694
  111. package/skills/creator-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  112. package/skills/creator-analysis/references/api-tags/douyin-search-api.md +0 -1059
  113. package/skills/creator-analysis/references/api-tags/douyin-web-api.md +0 -3314
  114. package/skills/creator-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  115. package/skills/creator-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  116. package/skills/creator-analysis/references/api-tags/health-check.md +0 -40
  117. package/skills/creator-analysis/references/api-tags/hybrid-parsing.md +0 -57
  118. package/skills/creator-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  119. package/skills/creator-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  120. package/skills/creator-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  121. package/skills/creator-analysis/references/api-tags/ios-shortcut.md +0 -45
  122. package/skills/creator-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  123. package/skills/creator-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  124. package/skills/creator-analysis/references/api-tags/lemon8-app-api.md +0 -687
  125. package/skills/creator-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  126. package/skills/creator-analysis/references/api-tags/media-ingest-api.md +0 -112
  127. package/skills/creator-analysis/references/api-tags/pipixia-app-api.md +0 -721
  128. package/skills/creator-analysis/references/api-tags/reddit-app-api.md +0 -1057
  129. package/skills/creator-analysis/references/api-tags/sora2-api.md +0 -737
  130. package/skills/creator-analysis/references/api-tags/temp-mail-api.md +0 -136
  131. package/skills/creator-analysis/references/api-tags/threads-web-api.md +0 -472
  132. package/skills/creator-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  133. package/skills/creator-analysis/references/api-tags/tikhub-user-api.md +0 -253
  134. package/skills/creator-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  135. package/skills/creator-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  136. package/skills/creator-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  137. package/skills/creator-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  138. package/skills/creator-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  139. package/skills/creator-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  140. package/skills/creator-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  141. package/skills/creator-analysis/references/api-tags/toutiao-app-api.md +0 -220
  142. package/skills/creator-analysis/references/api-tags/toutiao-web-api.md +0 -96
  143. package/skills/creator-analysis/references/api-tags/twitter-web-api.md +0 -562
  144. package/skills/creator-analysis/references/api-tags/wechat-channels-api.md +0 -405
  145. package/skills/creator-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  146. package/skills/creator-analysis/references/api-tags/weibo-app-api.md +0 -851
  147. package/skills/creator-analysis/references/api-tags/weibo-web-api.md +0 -470
  148. package/skills/creator-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  149. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  150. package/skills/creator-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  151. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  152. package/skills/creator-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  153. package/skills/creator-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  154. package/skills/creator-analysis/references/api-tags/youtube-web-api.md +0 -934
  155. package/skills/creator-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  156. package/skills/creator-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  157. package/skills/creator-analysis/references/asr-orchestration.md +0 -33
  158. package/skills/creator-analysis/references/config-templates/defaults.yaml +0 -60
  159. package/skills/creator-analysis/references/contracts/creator-card-fields.md +0 -25
  160. package/skills/creator-analysis/references/contracts/work-card-fields.md +0 -68
  161. package/skills/creator-analysis/references/platform-guides/douyin.md +0 -54
  162. package/skills/creator-analysis/references/platform-guides/generic.md +0 -50
  163. package/skills/creator-analysis/references/platform-guides/xiaohongshu.md +0 -69
  164. package/skills/creator-analysis/references/prompt-contracts/asr-clean.md +0 -28
  165. package/skills/creator-analysis/references/prompt-contracts/author-analysis-v2.md +0 -46
  166. package/skills/creator-analysis/references/prompt-contracts/author-analysis.md +0 -49
  167. package/skills/creator-analysis/references/prompt-contracts/cta.md +0 -24
  168. package/skills/creator-analysis/references/prompt-contracts/hook.md +0 -25
  169. package/skills/creator-analysis/references/prompt-contracts/insight.md +0 -47
  170. package/skills/creator-analysis/references/prompt-contracts/sampled-work-batch-explanations.md +0 -30
  171. package/skills/creator-analysis/references/prompt-contracts/structure.md +0 -25
  172. package/skills/creator-analysis/references/prompt-contracts/style.md +0 -27
  173. package/skills/creator-analysis/references/prompt-contracts/summary.md +0 -29
  174. package/skills/creator-analysis/references/prompt-contracts/topic.md +0 -29
  175. package/skills/creator-analysis/references/schemas/author-analysis-input-v1.schema.json +0 -325
  176. package/skills/creator-analysis/references/schemas/author-analysis-v2.schema.json +0 -287
  177. package/skills/creator-analysis/references/schemas/sampled-work-batch-explanations.schema.json +0 -41
  178. package/skills/creator-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  179. package/skills/creator-analysis/references/workflow.md +0 -23
  180. package/skills/creator-analysis/scripts/__init__.py +0 -0
  181. package/skills/creator-analysis/scripts/author_home/__init__.py +0 -0
  182. package/skills/creator-analysis/scripts/author_home/adapters/__init__.py +0 -0
  183. package/skills/creator-analysis/scripts/author_home/analyzers/__init__.py +0 -0
  184. package/skills/creator-analysis/scripts/author_home/analyzers/author_analysis_v2_support.py +0 -1165
  185. package/skills/creator-analysis/scripts/author_home/analyzers/prompt_first_analyzers.py +0 -447
  186. package/skills/creator-analysis/scripts/author_home/analyzers/sampled_work_batch_explainer.py +0 -331
  187. package/skills/creator-analysis/scripts/author_home/asr/__init__.py +0 -5
  188. package/skills/creator-analysis/scripts/author_home/builders/__init__.py +0 -0
  189. package/skills/creator-analysis/scripts/author_home/builders/home_builders.py +0 -213
  190. package/skills/creator-analysis/scripts/author_home/collectors/__init__.py +0 -0
  191. package/skills/creator-analysis/scripts/author_home/orchestrator/__init__.py +0 -0
  192. package/skills/creator-analysis/scripts/author_home/orchestrator/run_author_analysis.py +0 -834
  193. package/skills/creator-analysis/scripts/author_home/orchestrator/work_analysis_artifacts.py +0 -609
  194. package/skills/creator-analysis/scripts/core/__init__.py +0 -0
  195. package/skills/creator-analysis/scripts/core/analysis_pipeline.py +0 -133
  196. package/skills/creator-analysis/scripts/core/config_loader.py +0 -418
  197. package/skills/creator-analysis/scripts/core/storage_router.py +0 -256
  198. package/skills/creator-analysis/scripts/core/tikomni_common.py +0 -588
  199. package/skills/creator-analysis/scripts/pipeline/__init__.py +0 -0
  200. package/skills/creator-analysis/scripts/pipeline/asr/__init__.py +0 -0
  201. package/skills/creator-analysis/scripts/pipeline/asr/asr_pipeline.py +0 -1189
  202. package/skills/creator-analysis/scripts/pipeline/asr/poll_u2_task.py +0 -95
  203. package/skills/creator-analysis/scripts/platform/__init__.py +0 -0
  204. package/skills/creator-analysis/scripts/platform/douyin/__init__.py +0 -0
  205. package/skills/creator-analysis/scripts/platform/douyin/run_douyin_single_video.py +0 -1208
  206. package/skills/creator-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  207. package/skills/creator-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +0 -2128
  208. package/skills/creator-analysis/scripts/writers/__init__.py +0 -0
  209. package/skills/creator-analysis/scripts/writers/write_author_homepage_samples.py +0 -107
  210. package/skills/creator-analysis/scripts/writers/write_benchmark_card.py +0 -1579
  211. package/skills/meta-capability/SKILL.md +0 -69
  212. package/skills/meta-capability/agents/openai.yaml +0 -4
  213. package/skills/meta-capability/env.example +0 -42
  214. package/skills/meta-capability/references/api-capability-index.md +0 -92
  215. package/skills/meta-capability/references/api-contracts/asr-api.md +0 -130
  216. package/skills/meta-capability/references/api-contracts/bilibili-app-api.md +0 -776
  217. package/skills/meta-capability/references/api-contracts/bilibili-web-api.md +0 -2017
  218. package/skills/meta-capability/references/api-contracts/demo-api.md +0 -717
  219. package/skills/meta-capability/references/api-contracts/douyin-app-v3-api.md +0 -3594
  220. package/skills/meta-capability/references/api-contracts/douyin-billboard-api.md +0 -2274
  221. package/skills/meta-capability/references/api-contracts/douyin-creator-api.md +0 -1575
  222. package/skills/meta-capability/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  223. package/skills/meta-capability/references/api-contracts/douyin-search-api.md +0 -4118
  224. package/skills/meta-capability/references/api-contracts/douyin-web-api.md +0 -5544
  225. package/skills/meta-capability/references/api-contracts/douyin-xingtu-api.md +0 -1916
  226. package/skills/meta-capability/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  227. package/skills/meta-capability/references/api-contracts/health-check.md +0 -69
  228. package/skills/meta-capability/references/api-contracts/hybrid-parsing.md +0 -78
  229. package/skills/meta-capability/references/api-contracts/instagram-v1-api.md +0 -2256
  230. package/skills/meta-capability/references/api-contracts/instagram-v2-api.md +0 -2011
  231. package/skills/meta-capability/references/api-contracts/instagram-v3-api.md +0 -2630
  232. package/skills/meta-capability/references/api-contracts/ios-shortcut.md +0 -44
  233. package/skills/meta-capability/references/api-contracts/kuaishou-app-api.md +0 -1518
  234. package/skills/meta-capability/references/api-contracts/kuaishou-web-api.md +0 -1242
  235. package/skills/meta-capability/references/api-contracts/lemon8-app-api.md +0 -1088
  236. package/skills/meta-capability/references/api-contracts/linkedin-web-api.md +0 -1949
  237. package/skills/meta-capability/references/api-contracts/media-ingest-api.md +0 -126
  238. package/skills/meta-capability/references/api-contracts/pipixia-app-api.md +0 -1142
  239. package/skills/meta-capability/references/api-contracts/reddit-app-api.md +0 -2025
  240. package/skills/meta-capability/references/api-contracts/sora2-api.md +0 -2266
  241. package/skills/meta-capability/references/api-contracts/temp-mail-api.md +0 -208
  242. package/skills/meta-capability/references/api-contracts/threads-web-api.md +0 -897
  243. package/skills/meta-capability/references/api-contracts/tikhub-downloader-api.md +0 -134
  244. package/skills/meta-capability/references/api-contracts/tikhub-user-api.md +0 -494
  245. package/skills/meta-capability/references/api-contracts/tiktok-ads-api.md +0 -5947
  246. package/skills/meta-capability/references/api-contracts/tiktok-analytics-api.md +0 -968
  247. package/skills/meta-capability/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  248. package/skills/meta-capability/references/api-contracts/tiktok-creator-api.md +0 -1951
  249. package/skills/meta-capability/references/api-contracts/tiktok-interaction-api.md +0 -742
  250. package/skills/meta-capability/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  251. package/skills/meta-capability/references/api-contracts/tiktok-web-api.md +0 -4448
  252. package/skills/meta-capability/references/api-contracts/toutiao-app-api.md +0 -342
  253. package/skills/meta-capability/references/api-contracts/toutiao-web-api.md +0 -143
  254. package/skills/meta-capability/references/api-contracts/twitter-web-api.md +0 -989
  255. package/skills/meta-capability/references/api-contracts/wechat-channels-api.md +0 -809
  256. package/skills/meta-capability/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  257. package/skills/meta-capability/references/api-contracts/weibo-app-api.md +0 -1547
  258. package/skills/meta-capability/references/api-contracts/weibo-web-api.md +0 -798
  259. package/skills/meta-capability/references/api-contracts/weibo-web-v2-api.md +0 -2459
  260. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  261. package/skills/meta-capability/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  262. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  263. package/skills/meta-capability/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  264. package/skills/meta-capability/references/api-contracts/xigua-app-v2-api.md +0 -489
  265. package/skills/meta-capability/references/api-contracts/youtube-web-api.md +0 -2636
  266. package/skills/meta-capability/references/api-contracts/youtube-web-v2-api.md +0 -2660
  267. package/skills/meta-capability/references/api-contracts/zhihu-web-api.md +0 -2315
  268. package/skills/meta-capability/references/api-tags/asr-api.md +0 -100
  269. package/skills/meta-capability/references/api-tags/bilibili-app-api.md +0 -482
  270. package/skills/meta-capability/references/api-tags/bilibili-web-api.md +0 -1267
  271. package/skills/meta-capability/references/api-tags/demo-api.md +0 -365
  272. package/skills/meta-capability/references/api-tags/douyin-app-v3-api.md +0 -2012
  273. package/skills/meta-capability/references/api-tags/douyin-billboard-api.md +0 -1428
  274. package/skills/meta-capability/references/api-tags/douyin-creator-api.md +0 -694
  275. package/skills/meta-capability/references/api-tags/douyin-creator-v2-api.md +0 -694
  276. package/skills/meta-capability/references/api-tags/douyin-search-api.md +0 -1059
  277. package/skills/meta-capability/references/api-tags/douyin-web-api.md +0 -3314
  278. package/skills/meta-capability/references/api-tags/douyin-xingtu-api.md +0 -935
  279. package/skills/meta-capability/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  280. package/skills/meta-capability/references/api-tags/health-check.md +0 -40
  281. package/skills/meta-capability/references/api-tags/hybrid-parsing.md +0 -57
  282. package/skills/meta-capability/references/api-tags/instagram-v1-api.md +0 -1224
  283. package/skills/meta-capability/references/api-tags/instagram-v2-api.md +0 -1147
  284. package/skills/meta-capability/references/api-tags/instagram-v3-api.md +0 -1123
  285. package/skills/meta-capability/references/api-tags/ios-shortcut.md +0 -45
  286. package/skills/meta-capability/references/api-tags/kuaishou-app-api.md +0 -846
  287. package/skills/meta-capability/references/api-tags/kuaishou-web-api.md +0 -551
  288. package/skills/meta-capability/references/api-tags/lemon8-app-api.md +0 -687
  289. package/skills/meta-capability/references/api-tags/linkedin-web-api.md +0 -1105
  290. package/skills/meta-capability/references/api-tags/media-ingest-api.md +0 -112
  291. package/skills/meta-capability/references/api-tags/pipixia-app-api.md +0 -721
  292. package/skills/meta-capability/references/api-tags/reddit-app-api.md +0 -1057
  293. package/skills/meta-capability/references/api-tags/sora2-api.md +0 -737
  294. package/skills/meta-capability/references/api-tags/temp-mail-api.md +0 -136
  295. package/skills/meta-capability/references/api-tags/threads-web-api.md +0 -472
  296. package/skills/meta-capability/references/api-tags/tikhub-downloader-api.md +0 -65
  297. package/skills/meta-capability/references/api-tags/tikhub-user-api.md +0 -253
  298. package/skills/meta-capability/references/api-tags/tiktok-ads-api.md +0 -1393
  299. package/skills/meta-capability/references/api-tags/tiktok-analytics-api.md +0 -179
  300. package/skills/meta-capability/references/api-tags/tiktok-app-v3-api.md +0 -3264
  301. package/skills/meta-capability/references/api-tags/tiktok-creator-api.md +0 -709
  302. package/skills/meta-capability/references/api-tags/tiktok-interaction-api.md +0 -366
  303. package/skills/meta-capability/references/api-tags/tiktok-shop-web-api.md +0 -663
  304. package/skills/meta-capability/references/api-tags/tiktok-web-api.md +0 -2516
  305. package/skills/meta-capability/references/api-tags/toutiao-app-api.md +0 -220
  306. package/skills/meta-capability/references/api-tags/toutiao-web-api.md +0 -96
  307. package/skills/meta-capability/references/api-tags/twitter-web-api.md +0 -562
  308. package/skills/meta-capability/references/api-tags/wechat-channels-api.md +0 -405
  309. package/skills/meta-capability/references/api-tags/wechat-media-platform-web-api.md +0 -431
  310. package/skills/meta-capability/references/api-tags/weibo-app-api.md +0 -851
  311. package/skills/meta-capability/references/api-tags/weibo-web-api.md +0 -470
  312. package/skills/meta-capability/references/api-tags/weibo-web-v2-api.md +0 -1405
  313. package/skills/meta-capability/references/api-tags/xiaohongshu-app-api.md +0 -534
  314. package/skills/meta-capability/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  315. package/skills/meta-capability/references/api-tags/xiaohongshu-web-api.md +0 -757
  316. package/skills/meta-capability/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  317. package/skills/meta-capability/references/api-tags/xigua-app-v2-api.md +0 -308
  318. package/skills/meta-capability/references/api-tags/youtube-web-api.md +0 -934
  319. package/skills/meta-capability/references/api-tags/youtube-web-v2-api.md +0 -717
  320. package/skills/meta-capability/references/api-tags/zhihu-web-api.md +0 -1384
  321. package/skills/meta-capability/references/config-templates/defaults.yaml +0 -18
  322. package/skills/meta-capability/references/dispatch.md +0 -27
  323. package/skills/meta-capability/references/execution-guidelines.md +0 -25
  324. package/skills/meta-capability/references/implemented-route-map.md +0 -177
  325. package/skills/meta-capability/references/service-guides/asr-u2-u3-fallback.md +0 -75
  326. package/skills/meta-capability/scripts/__init__.py +0 -1
  327. package/skills/meta-capability/scripts/call_route.py +0 -141
  328. package/skills/meta-capability/scripts/core/__init__.py +0 -1
  329. package/skills/meta-capability/scripts/core/bootstrap_env.py +0 -32
  330. package/skills/meta-capability/scripts/core/config_loader.py +0 -204
  331. package/skills/meta-capability/scripts/core/tikomni_common.py +0 -443
  332. package/skills/meta-capability/scripts/test_auth.py +0 -98
  333. package/skills/single-work-analysis/SKILL.md +0 -62
  334. package/skills/single-work-analysis/agents/openai.yaml +0 -4
  335. package/skills/single-work-analysis/env.example +0 -36
  336. package/skills/single-work-analysis/references/api-capability-index.md +0 -92
  337. package/skills/single-work-analysis/references/api-contracts/asr-api.md +0 -130
  338. package/skills/single-work-analysis/references/api-contracts/bilibili-app-api.md +0 -776
  339. package/skills/single-work-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
  340. package/skills/single-work-analysis/references/api-contracts/demo-api.md +0 -717
  341. package/skills/single-work-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
  342. package/skills/single-work-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
  343. package/skills/single-work-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
  344. package/skills/single-work-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
  345. package/skills/single-work-analysis/references/api-contracts/douyin-search-api.md +0 -4118
  346. package/skills/single-work-analysis/references/api-contracts/douyin-web-api.md +0 -5544
  347. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
  348. package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
  349. package/skills/single-work-analysis/references/api-contracts/health-check.md +0 -69
  350. package/skills/single-work-analysis/references/api-contracts/hybrid-parsing.md +0 -78
  351. package/skills/single-work-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
  352. package/skills/single-work-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
  353. package/skills/single-work-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
  354. package/skills/single-work-analysis/references/api-contracts/ios-shortcut.md +0 -44
  355. package/skills/single-work-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
  356. package/skills/single-work-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
  357. package/skills/single-work-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
  358. package/skills/single-work-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
  359. package/skills/single-work-analysis/references/api-contracts/media-ingest-api.md +0 -126
  360. package/skills/single-work-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
  361. package/skills/single-work-analysis/references/api-contracts/reddit-app-api.md +0 -2025
  362. package/skills/single-work-analysis/references/api-contracts/sora2-api.md +0 -2266
  363. package/skills/single-work-analysis/references/api-contracts/temp-mail-api.md +0 -208
  364. package/skills/single-work-analysis/references/api-contracts/threads-web-api.md +0 -897
  365. package/skills/single-work-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
  366. package/skills/single-work-analysis/references/api-contracts/tikhub-user-api.md +0 -494
  367. package/skills/single-work-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
  368. package/skills/single-work-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
  369. package/skills/single-work-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
  370. package/skills/single-work-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
  371. package/skills/single-work-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
  372. package/skills/single-work-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
  373. package/skills/single-work-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
  374. package/skills/single-work-analysis/references/api-contracts/toutiao-app-api.md +0 -342
  375. package/skills/single-work-analysis/references/api-contracts/toutiao-web-api.md +0 -143
  376. package/skills/single-work-analysis/references/api-contracts/twitter-web-api.md +0 -989
  377. package/skills/single-work-analysis/references/api-contracts/wechat-channels-api.md +0 -809
  378. package/skills/single-work-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
  379. package/skills/single-work-analysis/references/api-contracts/weibo-app-api.md +0 -1547
  380. package/skills/single-work-analysis/references/api-contracts/weibo-web-api.md +0 -798
  381. package/skills/single-work-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
  382. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
  383. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
  384. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
  385. package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
  386. package/skills/single-work-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
  387. package/skills/single-work-analysis/references/api-contracts/youtube-web-api.md +0 -2636
  388. package/skills/single-work-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
  389. package/skills/single-work-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
  390. package/skills/single-work-analysis/references/api-tags/asr-api.md +0 -100
  391. package/skills/single-work-analysis/references/api-tags/bilibili-app-api.md +0 -482
  392. package/skills/single-work-analysis/references/api-tags/bilibili-web-api.md +0 -1267
  393. package/skills/single-work-analysis/references/api-tags/demo-api.md +0 -365
  394. package/skills/single-work-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
  395. package/skills/single-work-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
  396. package/skills/single-work-analysis/references/api-tags/douyin-creator-api.md +0 -694
  397. package/skills/single-work-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
  398. package/skills/single-work-analysis/references/api-tags/douyin-search-api.md +0 -1059
  399. package/skills/single-work-analysis/references/api-tags/douyin-web-api.md +0 -3314
  400. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
  401. package/skills/single-work-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
  402. package/skills/single-work-analysis/references/api-tags/health-check.md +0 -40
  403. package/skills/single-work-analysis/references/api-tags/hybrid-parsing.md +0 -57
  404. package/skills/single-work-analysis/references/api-tags/instagram-v1-api.md +0 -1224
  405. package/skills/single-work-analysis/references/api-tags/instagram-v2-api.md +0 -1147
  406. package/skills/single-work-analysis/references/api-tags/instagram-v3-api.md +0 -1123
  407. package/skills/single-work-analysis/references/api-tags/ios-shortcut.md +0 -45
  408. package/skills/single-work-analysis/references/api-tags/kuaishou-app-api.md +0 -846
  409. package/skills/single-work-analysis/references/api-tags/kuaishou-web-api.md +0 -551
  410. package/skills/single-work-analysis/references/api-tags/lemon8-app-api.md +0 -687
  411. package/skills/single-work-analysis/references/api-tags/linkedin-web-api.md +0 -1105
  412. package/skills/single-work-analysis/references/api-tags/media-ingest-api.md +0 -112
  413. package/skills/single-work-analysis/references/api-tags/pipixia-app-api.md +0 -721
  414. package/skills/single-work-analysis/references/api-tags/reddit-app-api.md +0 -1057
  415. package/skills/single-work-analysis/references/api-tags/sora2-api.md +0 -737
  416. package/skills/single-work-analysis/references/api-tags/temp-mail-api.md +0 -136
  417. package/skills/single-work-analysis/references/api-tags/threads-web-api.md +0 -472
  418. package/skills/single-work-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
  419. package/skills/single-work-analysis/references/api-tags/tikhub-user-api.md +0 -253
  420. package/skills/single-work-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
  421. package/skills/single-work-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
  422. package/skills/single-work-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
  423. package/skills/single-work-analysis/references/api-tags/tiktok-creator-api.md +0 -709
  424. package/skills/single-work-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
  425. package/skills/single-work-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
  426. package/skills/single-work-analysis/references/api-tags/tiktok-web-api.md +0 -2516
  427. package/skills/single-work-analysis/references/api-tags/toutiao-app-api.md +0 -220
  428. package/skills/single-work-analysis/references/api-tags/toutiao-web-api.md +0 -96
  429. package/skills/single-work-analysis/references/api-tags/twitter-web-api.md +0 -562
  430. package/skills/single-work-analysis/references/api-tags/wechat-channels-api.md +0 -405
  431. package/skills/single-work-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
  432. package/skills/single-work-analysis/references/api-tags/weibo-app-api.md +0 -851
  433. package/skills/single-work-analysis/references/api-tags/weibo-web-api.md +0 -470
  434. package/skills/single-work-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
  435. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
  436. package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
  437. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
  438. package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
  439. package/skills/single-work-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
  440. package/skills/single-work-analysis/references/api-tags/youtube-web-api.md +0 -934
  441. package/skills/single-work-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
  442. package/skills/single-work-analysis/references/api-tags/zhihu-web-api.md +0 -1384
  443. package/skills/single-work-analysis/references/asr-and-fallback.md +0 -20
  444. package/skills/single-work-analysis/references/config-templates/defaults.yaml +0 -47
  445. package/skills/single-work-analysis/references/contracts/work-card-fields.md +0 -41
  446. package/skills/single-work-analysis/references/platform-guides/douyin.md +0 -47
  447. package/skills/single-work-analysis/references/platform-guides/generic.md +0 -43
  448. package/skills/single-work-analysis/references/platform-guides/xiaohongshu.md +0 -54
  449. package/skills/single-work-analysis/references/prompt-contracts/analysis-bundle.md +0 -82
  450. package/skills/single-work-analysis/references/schemas/work-card.schema.json +0 -39
  451. package/skills/single-work-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
  452. package/skills/single-work-analysis/scripts/__init__.py +0 -0
  453. package/skills/single-work-analysis/scripts/core/__init__.py +0 -0
  454. package/skills/single-work-analysis/scripts/core/analysis_adapter.py +0 -384
  455. package/skills/single-work-analysis/scripts/core/analysis_pipeline.py +0 -456
  456. package/skills/single-work-analysis/scripts/core/bootstrap_env.py +0 -35
  457. package/skills/single-work-analysis/scripts/core/extract_pipeline.py +0 -173
  458. package/skills/single-work-analysis/scripts/core/progress_report.py +0 -258
  459. package/skills/single-work-analysis/scripts/core/storage_router.py +0 -220
  460. package/skills/single-work-analysis/scripts/pipeline/__init__.py +0 -0
  461. package/skills/single-work-analysis/scripts/pipeline/asr/__init__.py +0 -0
  462. package/skills/single-work-analysis/scripts/platform/__init__.py +0 -0
  463. package/skills/single-work-analysis/scripts/platform/douyin/__init__.py +0 -0
  464. package/skills/single-work-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +0 -224
  465. package/skills/single-work-analysis/scripts/platform/douyin/select_low_quality_video_url.py +0 -200
  466. package/skills/single-work-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
  467. package/skills/single-work-analysis/scripts/writers/__init__.py +0 -0
  468. package/skills/single-work-analysis/scripts/writers/write_benchmark_card.py +0 -752
  469. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/bootstrap_env.py +0 -0
  470. /package/skills/{creator-analysis → social-media-crawl}/scripts/core/extract_pipeline.py +0 -0
  471. /package/skills/{single-work-analysis → social-media-crawl}/scripts/core/tikomni_common.py +0 -0
  472. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/douyin_video_type_matrix.py +0 -0
  473. /package/skills/{creator-analysis/scripts/author_home/collectors → social-media-crawl/scripts/pipelines}/homepage_collectors.py +0 -0
  474. /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/select_low_quality_video_url.py +0 -0
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Lightweight config loader for Tikomni scripts (Phase 1 skeleton)."""
2
+ """Config loader for social-media-crawl."""
3
3
 
4
4
  from __future__ import annotations
5
5
 
@@ -11,7 +11,7 @@ from scripts.core.tikomni_common import bootstrap_runtime_env
11
11
 
12
12
  try:
13
13
  import yaml
14
- except Exception: # pragma: no cover - defensive fallback
14
+ except Exception: # pragma: no cover
15
15
  yaml = None
16
16
 
17
17
  SKILL_ROOT = Path(__file__).resolve().parents[2]
@@ -23,12 +23,15 @@ BUILTIN_DEFAULT_CONFIG: Dict[str, Any] = {
23
23
  "profile": "default",
24
24
  "runtime": {
25
25
  "base_url": "https://api.tikomni.com",
26
+ "mcp_url": "https://mcp.tikomni.com/mcp",
26
27
  "auth_env_key": "TIKOMNI_API_KEY",
27
28
  "timeout_ms": 60000,
29
+ "u2_pending_timeout_sec": 60,
28
30
  },
29
31
  "storage_routes": {
30
32
  "default": {
31
33
  "root_dir": "",
34
+ "card_root": "",
32
35
  "runs_dir": "_runs",
33
36
  "results_dir": "results",
34
37
  "errors_dir": "_errors",
@@ -37,25 +40,23 @@ BUILTIN_DEFAULT_CONFIG: Dict[str, Any] = {
37
40
  "single_video": "work",
38
41
  "note": "work",
39
42
  "work": "work",
43
+ "author_home": "work",
44
+ "work_collection": "work",
40
45
  },
41
46
  "card_type_routes": {
42
47
  "work": {
43
48
  "prefix": "CBV",
44
- "parts": ["内容系统", "对标研究", "作品卡"],
45
- },
49
+ "parts": ["内容系统", "作品库", "{platform}-{author_slug}"],
50
+ }
46
51
  },
47
52
  },
48
53
  "naming_rules": {
49
- "card_filename_pattern": "{prefix}-{platform}-{author_slug}-{title_slug}{ext}",
54
+ "card_filename_pattern": "{identifier}{ext}",
50
55
  "json_filename_pattern": "{timestamp}-{platform}-{identifier}{ext}",
51
56
  },
52
- "analysis": {
53
- "provider": "auto",
54
- "timeout_sec": 90,
55
- },
56
57
  "asr_strategy": {
57
58
  "poll_interval_sec": 3.0,
58
- "max_polls": 10,
59
+ "max_polls": 30,
59
60
  "submit_retry": {
60
61
  "douyin_video": {"max_retries": 2, "backoff_ms": 1500},
61
62
  "xiaohongshu_note": {"max_retries": 0, "backoff_ms": 0},
@@ -71,29 +72,29 @@ LOCALE_ROUTE_PRESETS: Dict[str, Dict[str, Dict[str, Any]]] = {
71
72
  "zh": {
72
73
  "work": {
73
74
  "prefix": "CBV",
74
- "parts": ["内容系统", "对标研究", "作品卡"],
75
- },
75
+ "parts": ["内容系统", "作品库", "{platform}-{author_slug}"],
76
+ }
76
77
  },
77
78
  "en": {
78
79
  "work": {
79
80
  "prefix": "CBV",
80
- "parts": ["content-system", "benchmark-research", "work-cards"],
81
- },
81
+ "parts": ["content-system", "work-library", "{platform}-{author_slug}"],
82
+ }
82
83
  },
83
84
  }
84
85
 
85
- CARD_ROUTE_ENV_KEYS: Dict[str, str] = {
86
- "work": "TIKOMNI_CARD_ROUTE_WORK",
86
+ CARD_ROUTE_ENV_KEYS: Dict[str, List[str]] = {
87
+ "work": ["TIKOMNI_CARD_ROUTE_WORK", "TIKOMNI_CARD_ROUTE_AUTHOR_SAMPLE_WORK"],
87
88
  }
88
89
 
89
- CARD_PREFIX_ENV_KEYS: Dict[str, str] = {
90
- "work": "TIKOMNI_CARD_PREFIX_WORK",
90
+ CARD_PREFIX_ENV_KEYS: Dict[str, List[str]] = {
91
+ "work": ["TIKOMNI_CARD_PREFIX_WORK", "TIKOMNI_CARD_PREFIX_AUTHOR_SAMPLE_WORK"],
91
92
  }
92
93
 
93
94
 
94
95
  def _deep_clone(value: Any) -> Any:
95
96
  if isinstance(value, dict):
96
- return {k: _deep_clone(v) for k, v in value.items()}
97
+ return {key: _deep_clone(item) for key, item in value.items()}
97
98
  if isinstance(value, list):
98
99
  return [_deep_clone(item) for item in value]
99
100
  return value
@@ -109,6 +110,10 @@ def _deep_merge(defaults: Dict[str, Any], override: Dict[str, Any]) -> Dict[str,
109
110
  return merged
110
111
 
111
112
 
113
+ def _builtin_defaults() -> Dict[str, Any]:
114
+ return _deep_clone(BUILTIN_DEFAULT_CONFIG)
115
+
116
+
112
117
  def _resolve_repo_anchored_path(path_value: str) -> str:
113
118
  candidate = Path(path_value).expanduser()
114
119
  if not candidate.is_absolute():
@@ -116,15 +121,17 @@ def _resolve_repo_anchored_path(path_value: str) -> str:
116
121
  return str(candidate.resolve())
117
122
 
118
123
 
119
- def resolve_config_path(cli_config_path: Optional[str] = None, env_values: Optional[Dict[str, str]] = None) -> str:
120
- """Resolve config file path with priority:
121
- 1) --config
122
- 2) TIKOMNI_CONFIG_FILE
123
- 3) references/config-templates/defaults.yaml
124
+ def _load_yaml(path: str) -> Dict[str, Any]:
125
+ if yaml is None:
126
+ raise RuntimeError("PyYAML unavailable")
127
+ with open(path, "r", encoding="utf-8") as handle:
128
+ payload = yaml.safe_load(handle) or {}
129
+ if not isinstance(payload, dict):
130
+ raise ValueError(f"config_root_must_be_mapping:{path}")
131
+ return payload
124
132
 
125
- Relative paths are always anchored at repository root (not current CWD).
126
- """
127
133
 
134
+ def resolve_config_path(cli_config_path: Optional[str] = None, env_values: Optional[Dict[str, str]] = None) -> str:
128
135
  if cli_config_path and str(cli_config_path).strip():
129
136
  return _resolve_repo_anchored_path(str(cli_config_path).strip())
130
137
 
@@ -136,31 +143,20 @@ def resolve_config_path(cli_config_path: Optional[str] = None, env_values: Optio
136
143
 
137
144
  if raw_env_path:
138
145
  return _resolve_repo_anchored_path(raw_env_path)
139
-
140
146
  return str(DEFAULT_CONFIG_PATH)
141
147
 
142
148
 
143
- def _load_yaml(path: str) -> Dict[str, Any]:
144
- if yaml is None:
145
- raise RuntimeError("PyYAML unavailable")
146
-
147
- with open(path, "r", encoding="utf-8") as handle:
148
- payload = yaml.safe_load(handle) or {}
149
- if not isinstance(payload, dict):
150
- raise ValueError(f"config_root_must_be_mapping:{path}")
151
- return payload
152
-
153
-
154
- def _builtin_defaults() -> Dict[str, Any]:
155
- return _deep_clone(BUILTIN_DEFAULT_CONFIG)
156
-
157
-
158
149
  def _read_env(name: str, env_values: Optional[Dict[str, str]] = None) -> str:
159
150
  if isinstance(env_values, dict) and name in env_values:
160
151
  return str(env_values.get(name, "") or "").strip()
161
152
  return os.getenv(name, "").strip()
162
153
 
163
154
 
155
+ def _env_text(name: str, env_values: Optional[Dict[str, str]] = None) -> Optional[str]:
156
+ value = _read_env(name, env_values=env_values)
157
+ return value or None
158
+
159
+
164
160
  def _env_int(name: str, env_values: Optional[Dict[str, str]] = None) -> Optional[int]:
165
161
  raw = _read_env(name, env_values=env_values)
166
162
  if not raw:
@@ -169,12 +165,14 @@ def _env_int(name: str, env_values: Optional[Dict[str, str]] = None) -> Optional
169
165
  value = int(raw)
170
166
  except Exception:
171
167
  return None
172
- return value if value > 0 else None
168
+ return value
173
169
 
174
170
 
175
- def _env_text(name: str, env_values: Optional[Dict[str, str]] = None) -> Optional[str]:
176
- value = _read_env(name, env_values=env_values)
177
- return value or None
171
+ def _require_absolute_path(path_value: str, env_key: str) -> str:
172
+ candidate = Path(path_value).expanduser()
173
+ if not candidate.is_absolute():
174
+ raise ValueError(f"{env_key} must be an absolute path")
175
+ return str(candidate.resolve())
178
176
 
179
177
 
180
178
  def _require_absolute_env(name: str, env_values: Optional[Dict[str, str]] = None) -> str:
@@ -186,8 +184,8 @@ def _require_absolute_env(name: str, env_values: Optional[Dict[str, str]] = None
186
184
 
187
185
  def _route_from_env(value: str) -> Optional[List[str]]:
188
186
  parts = [item.strip() for item in value.split("|")]
189
- normalized = [item for item in parts if item]
190
- return normalized if normalized else None
187
+ cleaned = [item for item in parts if item]
188
+ return cleaned if cleaned else None
191
189
 
192
190
 
193
191
  def _normalize_path_locale(raw_value: Optional[str]) -> str:
@@ -197,44 +195,30 @@ def _normalize_path_locale(raw_value: Optional[str]) -> str:
197
195
  return "zh"
198
196
 
199
197
 
200
- def _require_absolute_path(path_value: str, env_key: str) -> str:
201
- candidate = Path(path_value).expanduser()
202
- if not candidate.is_absolute():
203
- raise ValueError(f"{env_key} must be an absolute path")
204
- return str(candidate.resolve())
205
-
206
-
207
198
  def resolve_storage_paths(config: Dict[str, Any]) -> Dict[str, str]:
208
- """Resolve storage directories from an explicit absolute root (never CWD)."""
209
-
210
199
  default_route = config_get(config, "storage_routes.default", {})
211
200
  default_route = default_route if isinstance(default_route, dict) else {}
212
201
 
213
- root_dir = Path(
214
- _require_absolute_path(str(default_route.get("root_dir") or ""), "TIKOMNI_OUTPUT_ROOT")
215
- )
202
+ root_dir = Path(_require_absolute_path(str(default_route.get("root_dir") or ""), "TIKOMNI_OUTPUT_ROOT"))
203
+ card_root = Path(_require_absolute_path(str(default_route.get("card_root") or ""), "TIKOMNI_CARD_ROOT"))
216
204
 
217
205
  resolved: Dict[str, str] = {
218
206
  "root_dir": str(root_dir),
207
+ "card_root": str(card_root),
219
208
  }
220
- for key in ("runs_dir", "results_dir", "errors_dir"):
221
- raw_value = str(default_route.get(key) or "").strip()
222
- if not raw_value:
223
- raw_value = {
224
- "runs_dir": "_runs",
225
- "results_dir": "results",
226
- "errors_dir": "_errors",
227
- }[key]
228
209
 
210
+ for key in ("runs_dir", "results_dir", "errors_dir"):
211
+ raw_value = str(default_route.get(key) or "").strip() or {
212
+ "runs_dir": "_runs",
213
+ "results_dir": "results",
214
+ "errors_dir": "_errors",
215
+ }[key]
229
216
  part = Path(raw_value).expanduser()
230
- if part.is_absolute():
231
- resolved[key] = str(part.resolve())
232
- else:
233
- resolved[key] = str((root_dir / part).resolve())
217
+ resolved[key] = str(part.resolve()) if part.is_absolute() else str((root_dir / part).resolve())
234
218
 
235
- resolved["runs_root"] = resolved.get("runs_dir", str((root_dir / "_runs").resolve()))
236
- resolved["results_root"] = resolved.get("results_dir", str((root_dir / "results").resolve()))
237
- resolved["errors_root"] = resolved.get("errors_dir", str((root_dir / "_errors").resolve()))
219
+ resolved["runs_root"] = resolved["runs_dir"]
220
+ resolved["results_root"] = resolved["results_dir"]
221
+ resolved["errors_root"] = resolved["errors_dir"]
238
222
  return resolved
239
223
 
240
224
 
@@ -244,10 +228,8 @@ def apply_env_overrides(config: Dict[str, Any], env_values: Optional[Dict[str, s
244
228
 
245
229
  storage_routes = config.setdefault("storage_routes", {}) if isinstance(config.get("storage_routes"), dict) else {}
246
230
  config["storage_routes"] = storage_routes
247
-
248
231
  default_route = storage_routes.setdefault("default", {}) if isinstance(storage_routes.get("default"), dict) else {}
249
232
  storage_routes["default"] = default_route
250
-
251
233
  card_type_routes = (
252
234
  storage_routes.setdefault("card_type_routes", {}) if isinstance(storage_routes.get("card_type_routes"), dict) else {}
253
235
  )
@@ -255,14 +237,31 @@ def apply_env_overrides(config: Dict[str, Any], env_values: Optional[Dict[str, s
255
237
 
256
238
  naming_rules = config.setdefault("naming_rules", {}) if isinstance(config.get("naming_rules"), dict) else {}
257
239
  config["naming_rules"] = naming_rules
258
- analysis = config.setdefault("analysis", {}) if isinstance(config.get("analysis"), dict) else {}
259
- config["analysis"] = analysis
240
+ asr_strategy = config.setdefault("asr_strategy", {}) if isinstance(config.get("asr_strategy"), dict) else {}
241
+ config["asr_strategy"] = asr_strategy
242
+
243
+ auth_env_key = _env_text("TIKOMNI_AUTH_ENV_KEY", env_values=env_values)
244
+ if auth_env_key is not None:
245
+ runtime["auth_env_key"] = auth_env_key
246
+
247
+ for env_key, config_key in {
248
+ "TIKOMNI_BASE_URL": "base_url",
249
+ "TIKOMNI_MCP_URL": "mcp_url",
250
+ }.items():
251
+ value = _env_text(env_key, env_values=env_values)
252
+ if value is not None:
253
+ runtime[config_key] = value.rstrip("/")
260
254
 
261
255
  timeout_ms = _env_int("TIKOMNI_TIMEOUT_MS", env_values=env_values)
262
256
  if timeout_ms is not None:
263
257
  runtime["timeout_ms"] = timeout_ms
264
258
 
259
+ pending_timeout_sec = _env_int("TIKOMNI_U2_PENDING_TIMEOUT_SEC", env_values=env_values)
260
+ if pending_timeout_sec is not None and pending_timeout_sec > 0:
261
+ runtime["u2_pending_timeout_sec"] = pending_timeout_sec
262
+
265
263
  default_route["root_dir"] = _require_absolute_env("TIKOMNI_OUTPUT_ROOT", env_values=env_values)
264
+ default_route["card_root"] = _require_absolute_env("TIKOMNI_CARD_ROOT", env_values=env_values)
266
265
 
267
266
  for env_key, config_key in {
268
267
  "TIKOMNI_OUTPUT_RUNS_DIR": "runs_dir",
@@ -275,80 +274,49 @@ def apply_env_overrides(config: Dict[str, Any], env_values: Optional[Dict[str, s
275
274
 
276
275
  card_filename_pattern = _env_text("TIKOMNI_FILENAME_PATTERN_CARD", env_values=env_values)
277
276
  json_filename_pattern = _env_text("TIKOMNI_FILENAME_PATTERN_JSON", env_values=env_values)
278
- legacy_filename_pattern = _env_text("TIKOMNI_FILENAME_PATTERN", env_values=env_values)
279
277
  if card_filename_pattern is not None:
280
278
  naming_rules["card_filename_pattern"] = card_filename_pattern
281
- elif legacy_filename_pattern is not None:
282
- naming_rules["card_filename_pattern"] = legacy_filename_pattern
283
279
  if json_filename_pattern is not None:
284
280
  naming_rules["json_filename_pattern"] = json_filename_pattern
285
281
 
286
- analysis_provider = _env_text("TIKOMNI_ANALYSIS_PROVIDER", env_values=env_values)
287
- if analysis_provider is not None:
288
- analysis["provider"] = analysis_provider
289
-
290
- analysis_timeout_sec = _env_int("TIKOMNI_ANALYSIS_TIMEOUT_SEC", env_values=env_values)
291
- if analysis_timeout_sec is not None:
292
- analysis["timeout_sec"] = analysis_timeout_sec
282
+ poll_interval_sec = _env_int("TIKOMNI_POLL_INTERVAL_SEC", env_values=env_values)
283
+ if poll_interval_sec is not None and poll_interval_sec > 0:
284
+ asr_strategy["poll_interval_sec"] = float(poll_interval_sec)
293
285
 
294
286
  path_locale = _normalize_path_locale(_read_env("TIKOMNI_PATH_LOCALE", env_values=env_values) or "zh")
295
287
  locale_routes = LOCALE_ROUTE_PRESETS.get(path_locale, LOCALE_ROUTE_PRESETS["zh"])
296
-
297
288
  for route_key, route_value in locale_routes.items():
298
- existing = card_type_routes.get(route_key)
299
- existing_prefix = ""
300
- existing_parts: List[str] = []
301
- if isinstance(existing, dict):
302
- if isinstance(existing.get("prefix"), str):
303
- existing_prefix = existing.get("prefix", "").strip()
304
- if isinstance(existing.get("parts"), list) and existing.get("parts"):
305
- existing_parts = [str(item) for item in existing.get("parts", []) if str(item).strip()]
306
-
307
289
  card_type_routes[route_key] = {
308
- "prefix": existing_prefix or str(route_value.get("prefix") or ""),
309
- "parts": existing_parts or _deep_clone(route_value.get("parts", [])),
290
+ "prefix": str(route_value.get("prefix") or "CBV"),
291
+ "parts": list(route_value.get("parts") or []),
310
292
  }
311
293
 
312
- for route_key, env_name in CARD_ROUTE_ENV_KEYS.items():
313
- raw_value = _env_text(env_name, env_values=env_values)
314
- if raw_value is None:
315
- continue
316
-
317
- env_parts = _route_from_env(raw_value)
318
- if not env_parts:
319
- continue
320
-
321
- current = card_type_routes.get(route_key)
322
- prefix = ""
323
- if isinstance(current, dict) and isinstance(current.get("prefix"), str):
324
- prefix = current.get("prefix") or ""
325
- if not prefix:
326
- prefix = LOCALE_ROUTE_PRESETS["zh"].get(route_key, {}).get("prefix", "")
327
-
328
- card_type_routes[route_key] = {
329
- "prefix": prefix,
330
- "parts": env_parts,
331
- }
332
-
333
- for route_key, env_name in CARD_PREFIX_ENV_KEYS.items():
334
- prefix_value = _env_text(env_name, env_values=env_values)
335
- if prefix_value is None:
336
- continue
337
- current = card_type_routes.get(route_key)
338
- current_parts: List[str] = []
339
- if isinstance(current, dict) and isinstance(current.get("parts"), list):
340
- current_parts = [str(item) for item in current.get("parts", []) if str(item).strip()]
341
- if not current_parts:
342
- current_parts = list(LOCALE_ROUTE_PRESETS["zh"].get(route_key, {}).get("parts", []))
343
- card_type_routes[route_key] = {
344
- "prefix": prefix_value,
345
- "parts": current_parts,
346
- }
294
+ for route_key, env_names in CARD_ROUTE_ENV_KEYS.items():
295
+ for env_name in env_names:
296
+ raw_value = _env_text(env_name, env_values=env_values)
297
+ if raw_value is None:
298
+ continue
299
+ env_parts = _route_from_env(raw_value)
300
+ if not env_parts:
301
+ continue
302
+ current = card_type_routes.get(route_key) if isinstance(card_type_routes.get(route_key), dict) else {}
303
+ prefix = str(current.get("prefix") or LOCALE_ROUTE_PRESETS["zh"][route_key]["prefix"])
304
+ card_type_routes[route_key] = {"prefix": prefix, "parts": env_parts}
305
+ break
306
+
307
+ for route_key, env_names in CARD_PREFIX_ENV_KEYS.items():
308
+ for env_name in env_names:
309
+ prefix_value = _env_text(env_name, env_values=env_values)
310
+ if prefix_value is None:
311
+ continue
312
+ current = card_type_routes.get(route_key) if isinstance(card_type_routes.get(route_key), dict) else {}
313
+ parts = current.get("parts") if isinstance(current.get("parts"), list) else list(LOCALE_ROUTE_PRESETS["zh"][route_key]["parts"])
314
+ card_type_routes[route_key] = {"prefix": prefix_value, "parts": parts}
315
+ break
347
316
 
348
317
  resolved_storage = resolve_storage_paths(config)
349
318
  for key, value in resolved_storage.items():
350
319
  default_route[key] = value
351
-
352
320
  return config
353
321
 
354
322
 
@@ -357,10 +325,7 @@ def load_tikomni_config(
357
325
  env_file: Optional[str] = None,
358
326
  allow_process_env: bool = False,
359
327
  ) -> Tuple[Dict[str, Any], str]:
360
- bootstrap = bootstrap_runtime_env(
361
- primary_env_file=env_file,
362
- allow_process_env=allow_process_env,
363
- )
328
+ bootstrap = bootstrap_runtime_env(primary_env_file=env_file, allow_process_env=allow_process_env)
364
329
  env_values = bootstrap.get("effective_env", {}) if isinstance(bootstrap, dict) else {}
365
330
 
366
331
  explicit_config_requested = bool(
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env python3
2
+ """Minimal MCP HTTP client for social-media-crawl."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import json
7
+ import urllib.request
8
+ from dataclasses import dataclass
9
+ from typing import Any, Dict, Optional
10
+
11
+
12
+ def _parse_response_body(body: bytes) -> Any:
13
+ text = body.decode("utf-8", errors="replace").strip()
14
+ if not text:
15
+ return {}
16
+ if text.startswith("data:"):
17
+ payloads = []
18
+ for line in text.splitlines():
19
+ if not line.startswith("data:"):
20
+ continue
21
+ payload = line.split("data:", 1)[1].strip()
22
+ if payload:
23
+ payloads.append(payload)
24
+ if payloads:
25
+ return json.loads(payloads[-1])
26
+ return json.loads(text)
27
+
28
+
29
+ @dataclass
30
+ class McpResponse:
31
+ ok: bool
32
+ status_code: int
33
+ data: Any
34
+ session_id: Optional[str]
35
+ error_reason: Optional[str] = None
36
+
37
+
38
+ class McpHttpClient:
39
+ def __init__(self, *, url: str, api_key: str, timeout_ms: int = 60000) -> None:
40
+ self.url = url.rstrip("/")
41
+ self.api_key = api_key
42
+ self.timeout_ms = timeout_ms
43
+ self.session_id: Optional[str] = None
44
+ self._next_id = 1
45
+
46
+ def _headers(self) -> Dict[str, str]:
47
+ headers = {
48
+ "Authorization": f"Bearer {self.api_key}",
49
+ "Content-Type": "application/json",
50
+ "Accept": "application/json, text/event-stream",
51
+ }
52
+ if self.session_id:
53
+ headers["mcp-session-id"] = self.session_id
54
+ return headers
55
+
56
+ def _request(self, payload: Dict[str, Any]) -> McpResponse:
57
+ req = urllib.request.Request(
58
+ self.url,
59
+ data=json.dumps(payload).encode("utf-8"),
60
+ headers=self._headers(),
61
+ method="POST",
62
+ )
63
+ try:
64
+ with urllib.request.urlopen(req, timeout=max(self.timeout_ms / 1000.0, 1.0)) as response:
65
+ body = response.read()
66
+ data = _parse_response_body(body)
67
+ session_id = response.headers.get("mcp-session-id") or response.headers.get("Mcp-Session-Id")
68
+ if session_id:
69
+ self.session_id = session_id
70
+ return McpResponse(ok=True, status_code=response.getcode(), data=data, session_id=self.session_id)
71
+ except urllib.error.HTTPError as error:
72
+ body = error.read()
73
+ try:
74
+ data = _parse_response_body(body)
75
+ except Exception:
76
+ data = {"raw": body.decode("utf-8", errors="replace")}
77
+ return McpResponse(
78
+ ok=False,
79
+ status_code=error.code,
80
+ data=data,
81
+ session_id=self.session_id,
82
+ error_reason=f"http_error:{error.code}",
83
+ )
84
+ except Exception as error:
85
+ return McpResponse(
86
+ ok=False,
87
+ status_code=0,
88
+ data={},
89
+ session_id=self.session_id,
90
+ error_reason=f"request_failed:{type(error).__name__}:{error}",
91
+ )
92
+
93
+ def _rpc(self, method: str, params: Optional[Dict[str, Any]] = None, notification: bool = False) -> McpResponse:
94
+ payload: Dict[str, Any] = {"jsonrpc": "2.0", "method": method}
95
+ if not notification:
96
+ payload["id"] = self._next_id
97
+ self._next_id += 1
98
+ if params is not None:
99
+ payload["params"] = params
100
+ return self._request(payload)
101
+
102
+ def initialize(self) -> McpResponse:
103
+ response = self._rpc(
104
+ "initialize",
105
+ {
106
+ "protocolVersion": "2025-03-26",
107
+ "capabilities": {},
108
+ "clientInfo": {"name": "social-media-crawl", "version": "0.1.0"},
109
+ },
110
+ )
111
+ if response.ok:
112
+ self._rpc("notifications/initialized", notification=True)
113
+ return response
114
+
115
+ def tools_list(self) -> McpResponse:
116
+ if not self.session_id:
117
+ init = self.initialize()
118
+ if not init.ok:
119
+ return init
120
+ return self._rpc("tools/list")
121
+
122
+ def tool_call(self, name: str, arguments: Optional[Dict[str, Any]] = None) -> McpResponse:
123
+ if not self.session_id:
124
+ init = self.initialize()
125
+ if not init.ok:
126
+ return init
127
+ return self._rpc("tools/call", {"name": name, "arguments": arguments or {}})
128
+
129
+ def catalog_search(self, query: str) -> McpResponse:
130
+ return self.tool_call("catalog.search", {"query": query})
131
+
132
+ def endpoint_describe(self, endpoint: str) -> McpResponse:
133
+ return self.tool_call("endpoint.describe", {"endpoint": endpoint})
134
+
135
+ def api_call(self, endpoint: str, params: Optional[Dict[str, Any]] = None, body: Optional[Dict[str, Any]] = None, method: str = "GET") -> McpResponse:
136
+ return self.tool_call(
137
+ "api.call",
138
+ {"endpoint": endpoint, "params": params or {}, "body": body or {}, "method": method},
139
+ )
140
+
141
+ def u2_submit(self, file_url: str) -> McpResponse:
142
+ return self.tool_call("u2.submit", {"file_url": file_url})
143
+
144
+ def u2_query(self, task_id: str) -> McpResponse:
145
+ return self.tool_call("u2.query", {"task_id": task_id})
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env python3
2
+ """Platform and object detection helpers."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import urllib.request
7
+ from dataclasses import dataclass, asdict
8
+ from typing import Dict
9
+ from urllib.parse import urlparse
10
+
11
+
12
+ @dataclass
13
+ class DetectionResult:
14
+ input_value: str
15
+ resolved_url: str
16
+ platform: str
17
+ object_type: str
18
+
19
+ def to_dict(self) -> Dict[str, str]:
20
+ return asdict(self)
21
+
22
+
23
+ def resolve_final_url(input_value: str, timeout_ms: int = 10000) -> str:
24
+ candidate = str(input_value or "").strip()
25
+ if not candidate.startswith(("http://", "https://")):
26
+ return candidate
27
+ try:
28
+ request = urllib.request.Request(candidate, method="GET")
29
+ with urllib.request.urlopen(request, timeout=max(timeout_ms / 1000.0, 1.0)) as response:
30
+ return response.geturl() or candidate
31
+ except Exception:
32
+ return candidate
33
+
34
+
35
+ def detect_target(input_value: str, timeout_ms: int = 10000) -> DetectionResult:
36
+ raw = str(input_value or "").strip()
37
+ resolved = resolve_final_url(raw, timeout_ms=timeout_ms)
38
+ candidate = resolved or raw
39
+ lower = candidate.lower()
40
+ host = urlparse(lower).netloc
41
+
42
+ platform = "unknown"
43
+ object_type = "unknown"
44
+
45
+ if any(token in host for token in ["douyin.com", "iesdouyin.com"]):
46
+ platform = "douyin"
47
+ if "/video/" in lower:
48
+ object_type = "work"
49
+ elif "/user/" in lower or "sec_uid=" in lower or "sec_user_id=" in lower:
50
+ object_type = "creator"
51
+ elif any(token in host for token in ["xiaohongshu.com", "xhslink.com"]):
52
+ platform = "xiaohongshu"
53
+ if any(token in lower for token in ["/discovery/item/", "/explore/"]):
54
+ object_type = "work"
55
+ elif any(token in lower for token in ["/user/profile/", "/user/", "/profile/"]):
56
+ object_type = "creator"
57
+
58
+ return DetectionResult(
59
+ input_value=raw,
60
+ resolved_url=resolved or raw,
61
+ platform=platform,
62
+ object_type=object_type,
63
+ )
@@ -19,7 +19,7 @@ bootstrap_for_direct_run(__file__, __package__)
19
19
  import argparse
20
20
  from typing import Any, Callable, Dict, Optional
21
21
 
22
- from scripts.pipeline.asr.asr_pipeline import poll_u2_task_core
22
+ from scripts.core.asr_pipeline import poll_u2_task_core
23
23
  from scripts.core.tikomni_common import extract_error_reason, resolve_runtime, write_json_stdout
24
24
 
25
25
 
@@ -31,6 +31,7 @@ def poll_u2_task(
31
31
  task_id: str,
32
32
  poll_interval_sec: float,
33
33
  max_polls: int,
34
+ pending_timeout_sec: Optional[int] = None,
34
35
  progress_callback: Optional[Callable[[Dict[str, Any]], None]] = None,
35
36
  ) -> Dict[str, Any]:
36
37
  return poll_u2_task_core(
@@ -40,6 +41,7 @@ def poll_u2_task(
40
41
  task_id=task_id,
41
42
  poll_interval_sec=poll_interval_sec,
42
43
  max_polls=max_polls,
44
+ pending_timeout_sec=pending_timeout_sec,
43
45
  progress_callback=progress_callback,
44
46
  )
45
47