@gobing-ai/knowledge-kit 0.0.36 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/dist/board/collect/index.css +654 -16
  3. package/dist/board/collect/index.js +191 -64
  4. package/dist/board/daily-voice/index.css +679 -12
  5. package/dist/board/daily-voice/index.js +185 -66
  6. package/dist/board/itc/index.css +679 -13
  7. package/dist/board/itc/index.js +188 -66
  8. package/dist/index.js +2878 -152
  9. package/package.json +3 -2
  10. package/plugins/generations/content-gen/dist/index.js +158 -12
  11. package/plugins/generations/core-facts-gen/dist/index.js +158 -12
  12. package/plugins/generations/daily-article-gen/dist/index.js +158 -12
  13. package/plugins/generations/dailynews-gen/dist/index.js +180 -12
  14. package/plugins/generations/dailynews-gen/src/script-plan.ts +32 -0
  15. package/plugins/generations/episode-plan-gen/dist/index.js +158 -12
  16. package/plugins/generations/gemini-tts/README.md +4 -3
  17. package/plugins/generations/gemini-tts/dist/index.js +158 -12
  18. package/plugins/generations/image-gen/dist/index.js +158 -12
  19. package/plugins/generations/news-report-gen/dist/index.js +158 -12
  20. package/plugins/generations/omni-voice-gen/README.md +15 -4
  21. package/plugins/generations/omni-voice-gen/profiles.json +1 -2
  22. package/plugins/generations/voice-gen/dist/index.js +158 -12
  23. package/plugins/generations/voxcpm-tts/README.md +21 -1
  24. package/plugins/generations/voxcpm-tts/dist/index.js +173 -13
  25. package/plugins/generations/voxcpm-tts/scripts/audit-speaker-consistency.py +109 -0
  26. package/plugins/generations/voxcpm-tts/src/voxcpm-client.ts +28 -1
  27. package/plugins/ingestions/aihot-ingest/dist/index.js +158 -12
  28. package/plugins/ingestions/horizon-ingest/dist/index.js +158 -12
  29. package/plugins/ingestions/last30days-ingest/dist/index.js +158 -12
  30. package/plugins/ingestions/web-search/dist/index.js +158 -12
  31. package/plugins/kk/commands/workflow-run.md +56 -18
  32. package/plugins/kk/decisions/kk-itc.yaml +46 -0
  33. package/plugins/kk/decisions/kk-seo-keyword.yaml +57 -0
  34. package/plugins/kk/decisions/kk-seo-page.yaml +230 -0
  35. package/plugins/kk/decisions/kk-seo-pair.yaml +21 -0
  36. package/plugins/kk/decisions/kk-seo-site.yaml +90 -0
  37. package/plugins/kk/plugin.json +1 -1
  38. package/plugins/kk/publish-presets/chinese-article.json +14 -0
  39. package/plugins/kk/publish-presets/technical-article.json +14 -0
  40. package/plugins/kk/references/smart-seo-attribution.md +85 -0
  41. package/plugins/kk/scripts/daily-stages.ts +42 -2
  42. package/plugins/kk/scripts/daily-voice-style.zh.md +1 -1
  43. package/plugins/kk/scripts/itc-stages.ts +25 -118
  44. package/plugins/kk/scripts/kk-workflow-stages.ts +38 -1
  45. package/plugins/kk/scripts/seo-decisions.ts +477 -0
  46. package/plugins/kk/scripts/seo-enrich.ts +728 -0
  47. package/plugins/kk/scripts/seo-facts.ts +610 -0
  48. package/plugins/kk/scripts/seo-fetch.ts +766 -0
  49. package/plugins/kk/scripts/seo-report.ts +460 -0
  50. package/plugins/kk/scripts/seo-rules.ts +1882 -0
  51. package/plugins/kk/scripts/seo-stages.ts +1044 -0
  52. package/plugins/kk/skills/article-adapt/SKILL.md +2 -2
  53. package/plugins/kk/skills/smart-seo/SKILL.md +183 -0
  54. package/plugins/kk/skills/smart-seo/references/method.md +126 -0
  55. package/plugins/kk/skills/smart-seo/references/narrative.md +125 -0
  56. package/plugins/kk/skills/smart-seo/references/operations.md +202 -0
  57. package/plugins/kk/skills/smart-seo/references/seo-geo-sources.md +90 -0
  58. package/plugins/kk/workflows/feature-verification.yaml +28 -24
  59. package/plugins/kk/workflows/kk-daily-ai-voice2.yaml +86 -18
  60. package/plugins/kk/workflows/kk-itc-author.yaml +406 -0
  61. package/plugins/kk/workflows/kk-itc.yaml +208 -682
  62. package/plugins/kk/workflows/kk-smart-seo.yaml +251 -0
  63. package/plugins/publishings/bilibili-pub/dist/index.js +21782 -0
  64. package/plugins/publishings/bilibili-pub/dist/profile-check.js +20410 -0
  65. package/plugins/publishings/bilibili-pub/package.json +20 -0
  66. package/plugins/publishings/bilibili-pub/plugin.json +12 -0
  67. package/plugins/publishings/bilibili-pub/src/flow.ts +1296 -0
  68. package/plugins/publishings/bilibili-pub/src/index.ts +139 -0
  69. package/plugins/publishings/bilibili-pub/src/profile-check.ts +19 -0
  70. package/plugins/publishings/bilibili-pub/src/selectors.ts +222 -0
  71. package/plugins/publishings/bilibili-pub/tsconfig.json +4 -0
  72. package/plugins/publishings/cnblogs-pub/dist/index.js +21383 -0
  73. package/plugins/publishings/cnblogs-pub/dist/profile-check.js +20412 -0
  74. package/plugins/publishings/cnblogs-pub/package.json +19 -0
  75. package/plugins/publishings/cnblogs-pub/plugin.json +12 -0
  76. package/plugins/publishings/cnblogs-pub/src/flow.ts +708 -0
  77. package/plugins/publishings/cnblogs-pub/src/index.ts +172 -0
  78. package/plugins/publishings/cnblogs-pub/src/profile-check.ts +24 -0
  79. package/plugins/publishings/cnblogs-pub/src/selectors.ts +104 -0
  80. package/plugins/publishings/cnblogs-pub/tsconfig.json +4 -0
  81. package/plugins/publishings/csdn-pub/dist/index.js +21552 -0
  82. package/plugins/publishings/csdn-pub/dist/profile-check.js +20963 -0
  83. package/plugins/publishings/csdn-pub/package.json +19 -0
  84. package/plugins/publishings/csdn-pub/plugin.json +12 -0
  85. package/plugins/publishings/csdn-pub/src/index.ts +1178 -0
  86. package/plugins/publishings/csdn-pub/src/profile-check.ts +23 -0
  87. package/plugins/publishings/csdn-pub/tsconfig.json +4 -0
  88. package/plugins/publishings/emdash-pub/dist/index.js +158 -12
  89. package/plugins/publishings/emdash-pub/plugin.json +22 -1
  90. package/plugins/publishings/infoq-pub/dist/index.js +160 -12
  91. package/plugins/publishings/infoq-pub/dist/profile-check.js +160 -12
  92. package/plugins/publishings/infoq-pub/plugin.json +21 -0
  93. package/plugins/publishings/jike-pub/dist/index.js +21379 -0
  94. package/plugins/publishings/jike-pub/dist/profile-check.js +20951 -0
  95. package/plugins/publishings/jike-pub/package.json +19 -0
  96. package/plugins/publishings/jike-pub/plugin.json +12 -0
  97. package/plugins/publishings/jike-pub/src/index.ts +800 -0
  98. package/plugins/publishings/jike-pub/src/profile-check.ts +21 -0
  99. package/plugins/publishings/jike-pub/tsconfig.json +4 -0
  100. package/plugins/publishings/juejin-pub/dist/index.js +160 -12
  101. package/plugins/publishings/juejin-pub/dist/profile-check.js +160 -12
  102. package/plugins/publishings/juejin-pub/plugin.json +21 -0
  103. package/plugins/publishings/medium-pub/dist/index.js +158 -12
  104. package/plugins/publishings/medium-pub/plugin.json +22 -1
  105. package/plugins/publishings/podcast-pub/dist/index.js +158 -12
  106. package/plugins/publishings/qiita-pub/dist/index.js +158 -12
  107. package/plugins/publishings/qiita-pub/plugin.json +24 -1
  108. package/plugins/publishings/shipinhao-pub/dist/index.js +21715 -0
  109. package/plugins/publishings/shipinhao-pub/dist/profile-check.js +20431 -0
  110. package/plugins/publishings/shipinhao-pub/package.json +19 -0
  111. package/plugins/publishings/shipinhao-pub/plugin.json +12 -0
  112. package/plugins/publishings/shipinhao-pub/src/flow.ts +1323 -0
  113. package/plugins/publishings/shipinhao-pub/src/index.ts +173 -0
  114. package/plugins/publishings/shipinhao-pub/src/profile-check.ts +25 -0
  115. package/plugins/publishings/shipinhao-pub/src/selectors.ts +241 -0
  116. package/plugins/publishings/shipinhao-pub/tsconfig.json +4 -0
  117. package/plugins/publishings/sspai-pub/dist/index.js +21371 -0
  118. package/plugins/publishings/sspai-pub/dist/profile-check.js +20414 -0
  119. package/plugins/publishings/sspai-pub/package.json +19 -0
  120. package/plugins/publishings/sspai-pub/plugin.json +12 -0
  121. package/plugins/publishings/sspai-pub/src/flow.ts +624 -0
  122. package/plugins/publishings/sspai-pub/src/index.ts +167 -0
  123. package/plugins/publishings/sspai-pub/src/profile-check.ts +25 -0
  124. package/plugins/publishings/sspai-pub/src/selectors.ts +122 -0
  125. package/plugins/publishings/sspai-pub/tsconfig.json +4 -0
  126. package/plugins/publishings/substack-pub/dist/index.js +160 -12
  127. package/plugins/publishings/substack-pub/dist/profile-check.js +160 -12
  128. package/plugins/publishings/substack-pub/plugin.json +21 -0
  129. package/plugins/publishings/surfdash-pub/dist/index.js +158 -12
  130. package/plugins/publishings/surfdash-pub/plugin.json +22 -1
  131. package/plugins/publishings/threads-pub/dist/index.js +158 -12
  132. package/plugins/publishings/wechatmp-pub/dist/index.js +1669 -502
  133. package/plugins/publishings/wechatmp-pub/dist/profile-check.js +204 -21
  134. package/plugins/publishings/wechatmp-pub/plugin.json +32 -0
  135. package/plugins/publishings/wechatmp-pub/src/cgi-draft.ts +540 -0
  136. package/plugins/publishings/wechatmp-pub/src/cgi-media.ts +380 -0
  137. package/plugins/publishings/wechatmp-pub/src/cgi.ts +485 -0
  138. package/plugins/publishings/wechatmp-pub/src/flow.ts +104 -0
  139. package/plugins/publishings/weibo-pub/dist/index.js +160 -12
  140. package/plugins/publishings/weibo-pub/dist/profile-check.js +160 -12
  141. package/plugins/publishings/weibo-pub/plugin.json +35 -0
  142. package/plugins/publishings/x-pub/dist/index.js +160 -12
  143. package/plugins/publishings/x-pub/dist/profile-check.js +160 -12
  144. package/plugins/publishings/x-pub/plugin.json +40 -0
  145. package/plugins/publishings/xhs-pub/dist/index.js +160 -12
  146. package/plugins/publishings/xhs-pub/dist/profile-check.js +160 -12
  147. package/plugins/publishings/xhs-pub/plugin.json +37 -0
  148. package/plugins/publishings/xiaoyuzhou-pub/dist/index.js +21491 -0
  149. package/plugins/publishings/xiaoyuzhou-pub/dist/profile-check.js +20417 -0
  150. package/plugins/publishings/xiaoyuzhou-pub/package.json +19 -0
  151. package/plugins/publishings/xiaoyuzhou-pub/plugin.json +12 -0
  152. package/plugins/publishings/xiaoyuzhou-pub/src/flow.ts +826 -0
  153. package/plugins/publishings/xiaoyuzhou-pub/src/index.ts +174 -0
  154. package/plugins/publishings/xiaoyuzhou-pub/src/profile-check.ts +26 -0
  155. package/plugins/publishings/xiaoyuzhou-pub/src/selectors.ts +125 -0
  156. package/plugins/publishings/xiaoyuzhou-pub/tsconfig.json +4 -0
  157. package/plugins/publishings/zenn-pub/dist/index.js +158 -12
  158. package/plugins/publishings/zenn-pub/plugin.json +22 -1
  159. package/plugins/generations/omni-voice-gen/voices/robin-news.wav +0 -0
@@ -12236,6 +12236,83 @@ var init_file_system_node = () => {};
12236
12236
  import { dirname as dirname2 } from "path";
12237
12237
  import { parseArgs } from "util";
12238
12238
 
12239
+ // ../../packages/kk-core/src/content-limits.ts
12240
+ var PLATFORM_CONTENT_LIMITS = Object.freeze({
12241
+ schemaVersion: 5,
12242
+ tagLimits: Object.freeze({
12243
+ default: 7,
12244
+ imageText: Object.freeze({
12245
+ instagram: 5,
12246
+ douyin: 5,
12247
+ kuaishou: 4,
12248
+ weixin: 1,
12249
+ xiaohongshu: 10
12250
+ }),
12251
+ shortVideo: Object.freeze({
12252
+ douyin: 5,
12253
+ kuaishou: 4,
12254
+ xiaohongshu: 10,
12255
+ bilibili: 10,
12256
+ zhihu: 5,
12257
+ tiktok: 20,
12258
+ youtube: 60
12259
+ })
12260
+ }),
12261
+ titleCapabilities: Object.freeze({
12262
+ dynamic: Object.freeze({
12263
+ bilibili: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12264
+ zhihu: Object.freeze({ max: 50, unit: "utf16_code_units" }),
12265
+ douban: Object.freeze({ max: 70, unit: "utf16_code_units" }),
12266
+ x: null,
12267
+ threads: null,
12268
+ weibo: null,
12269
+ jike: null,
12270
+ zsxq: null,
12271
+ toutiao: null,
12272
+ juejin: null
12273
+ }),
12274
+ imageText: Object.freeze({
12275
+ xiaohongshu: Object.freeze({ max: 20, unit: "xiaohongshu_title_weighted" }),
12276
+ weixin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12277
+ douyin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12278
+ shipinhao: Object.freeze({ max: 22, unit: "utf16_code_units" }),
12279
+ reddit: Object.freeze({ max: 300, unit: "utf16_code_units" })
12280
+ }),
12281
+ article: Object.freeze({
12282
+ juejin: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12283
+ csdn: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12284
+ cnblogs: Object.freeze({ max: 128, unit: "utf16_code_units" }),
12285
+ weibo: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12286
+ sspai: Object.freeze({ max: 80, unit: "utf16_code_units" })
12287
+ }),
12288
+ shortVideo: Object.freeze({
12289
+ shipinhao: Object.freeze({ max: 16, unit: "utf16_code_units" }),
12290
+ douyin: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12291
+ bilibili: Object.freeze({ max: 80, unit: "utf16_code_units" })
12292
+ })
12293
+ }),
12294
+ bodyCapabilities: Object.freeze({
12295
+ dynamic: Object.freeze({
12296
+ threads: Object.freeze({ max: 500, unit: "unicode_code_points", behavior: "split_thread" }),
12297
+ x: Object.freeze({ max: 280, unit: "weighted", behavior: "split_thread" }),
12298
+ weibo: Object.freeze({ max: 2000, unit: "unicode_code_points" }),
12299
+ jike: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12300
+ }),
12301
+ imageText: Object.freeze({
12302
+ xiaohongshu: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12303
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12304
+ }),
12305
+ article: Object.freeze({
12306
+ wechatmp: Object.freeze({ max: 50000, unit: "unicode_code_points" }),
12307
+ juejin: Object.freeze({ max: 50000, unit: "unicode_code_points" })
12308
+ }),
12309
+ shortVideo: Object.freeze({
12310
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12311
+ kuaishou: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12312
+ shipinhao: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12313
+ })
12314
+ })
12315
+ });
12239
12316
  // ../../packages/kk-core/src/kinds.ts
12240
12317
  init_zod();
12241
12318
 
@@ -12326,6 +12403,67 @@ var BrowserSessionDescriptorSchema = object({
12326
12403
  }
12327
12404
  }).optional()
12328
12405
  }).strict();
12406
+ var ContentCountUnitSchema = _enum([
12407
+ "utf16_code_units",
12408
+ "unicode_code_points",
12409
+ "weighted",
12410
+ "xiaohongshu_title_weighted"
12411
+ ]);
12412
+ var LimitEntrySchema = object({
12413
+ max: number2().int().positive(),
12414
+ unit: ContentCountUnitSchema
12415
+ }).strict();
12416
+ var PublishingProfileLimitsSchema = object({
12417
+ title: LimitEntrySchema.optional(),
12418
+ body: LimitEntrySchema.optional()
12419
+ }).strict();
12420
+ var PublishingProfileRequiresSchema = object({
12421
+ cover: boolean2().optional(),
12422
+ orderedImages: boolean2().optional()
12423
+ }).strict();
12424
+ var PublishingProfileModeBindingSchema = object({
12425
+ metadata: record(string2(), unknown())
12426
+ }).strict();
12427
+ var PublishingProfileModesSchema = object({
12428
+ draft: PublishingProfileModeBindingSchema.optional(),
12429
+ live: PublishingProfileModeBindingSchema.optional()
12430
+ }).strict().superRefine((modes, ctx) => {
12431
+ if (modes.draft === undefined && modes.live === undefined) {
12432
+ ctx.addIssue({
12433
+ code: "custom",
12434
+ message: 'modes must define at least one of "draft" or "live"'
12435
+ });
12436
+ }
12437
+ });
12438
+ var PublishingProfileSchema = object({
12439
+ format: string2().min(1),
12440
+ locale: string2().regex(/^(source|[a-z]{2,3}(-[A-Za-z0-9]+)*)$/, {
12441
+ message: 'locale must be "source" or a valid language tag'
12442
+ }),
12443
+ limits: PublishingProfileLimitsSchema.optional(),
12444
+ requires: PublishingProfileRequiresSchema.optional(),
12445
+ modes: PublishingProfileModesSchema
12446
+ }).strict();
12447
+ var PublishingCapabilitiesSchema = object({
12448
+ defaultProfile: string2().min(1),
12449
+ profiles: record(string2().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/), PublishingProfileSchema)
12450
+ }).strict().superRefine((data, ctx) => {
12451
+ const keys = Object.keys(data.profiles);
12452
+ if (keys.length === 0) {
12453
+ ctx.addIssue({
12454
+ code: "custom",
12455
+ path: ["profiles"],
12456
+ message: "profiles record must be nonempty"
12457
+ });
12458
+ }
12459
+ if (!(data.defaultProfile in data.profiles)) {
12460
+ ctx.addIssue({
12461
+ code: "custom",
12462
+ path: ["defaultProfile"],
12463
+ message: `defaultProfile "${data.defaultProfile}" must reference a declared profile`
12464
+ });
12465
+ }
12466
+ });
12329
12467
  var PluginManifestSchemaBase = looseObject({
12330
12468
  name: string2().min(1),
12331
12469
  kind: PluginKindSchema,
@@ -12334,23 +12472,31 @@ var PluginManifestSchemaBase = looseObject({
12334
12472
  version: string2().optional(),
12335
12473
  description: string2().optional(),
12336
12474
  operations: record(string2(), PluginOperationSchema).optional(),
12337
- browserSession: BrowserSessionDescriptorSchema.optional()
12475
+ browserSession: BrowserSessionDescriptorSchema.optional(),
12476
+ publishing: PublishingCapabilitiesSchema.optional()
12338
12477
  });
12339
12478
  var PluginManifestSchema = PluginManifestSchemaBase.superRefine((manifest, ctx) => {
12340
- if (manifest.browserSession === undefined)
12341
- return;
12342
- if (manifest.kind !== "publish") {
12343
- ctx.addIssue({
12344
- code: "custom",
12345
- path: ["browserSession"],
12346
- message: `browserSession requires kind "publish", not "${manifest.kind}"`
12347
- });
12479
+ if (manifest.browserSession !== undefined) {
12480
+ if (manifest.kind !== "publish") {
12481
+ ctx.addIssue({
12482
+ code: "custom",
12483
+ path: ["browserSession"],
12484
+ message: `browserSession requires kind "publish", not "${manifest.kind}"`
12485
+ });
12486
+ }
12487
+ if (manifest.check === undefined) {
12488
+ ctx.addIssue({
12489
+ code: "custom",
12490
+ path: ["browserSession"],
12491
+ message: "browserSession requires a check probe entry that owns the session routines"
12492
+ });
12493
+ }
12348
12494
  }
12349
- if (manifest.check === undefined) {
12495
+ if (manifest.publishing !== undefined && manifest.kind !== "publish") {
12350
12496
  ctx.addIssue({
12351
12497
  code: "custom",
12352
- path: ["browserSession"],
12353
- message: "browserSession requires a check probe entry that owns the session routines"
12498
+ path: ["publishing"],
12499
+ message: `publishing requires kind "publish", not "${manifest.kind}"`
12354
12500
  });
12355
12501
  }
12356
12502
  });
@@ -11985,6 +11985,83 @@ import { homedir } from "os";
11985
11985
  import { dirname as dirname2, join } from "path";
11986
11986
  import { parseArgs } from "util";
11987
11987
 
11988
+ // ../../packages/kk-core/src/content-limits.ts
11989
+ var PLATFORM_CONTENT_LIMITS = Object.freeze({
11990
+ schemaVersion: 5,
11991
+ tagLimits: Object.freeze({
11992
+ default: 7,
11993
+ imageText: Object.freeze({
11994
+ instagram: 5,
11995
+ douyin: 5,
11996
+ kuaishou: 4,
11997
+ weixin: 1,
11998
+ xiaohongshu: 10
11999
+ }),
12000
+ shortVideo: Object.freeze({
12001
+ douyin: 5,
12002
+ kuaishou: 4,
12003
+ xiaohongshu: 10,
12004
+ bilibili: 10,
12005
+ zhihu: 5,
12006
+ tiktok: 20,
12007
+ youtube: 60
12008
+ })
12009
+ }),
12010
+ titleCapabilities: Object.freeze({
12011
+ dynamic: Object.freeze({
12012
+ bilibili: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12013
+ zhihu: Object.freeze({ max: 50, unit: "utf16_code_units" }),
12014
+ douban: Object.freeze({ max: 70, unit: "utf16_code_units" }),
12015
+ x: null,
12016
+ threads: null,
12017
+ weibo: null,
12018
+ jike: null,
12019
+ zsxq: null,
12020
+ toutiao: null,
12021
+ juejin: null
12022
+ }),
12023
+ imageText: Object.freeze({
12024
+ xiaohongshu: Object.freeze({ max: 20, unit: "xiaohongshu_title_weighted" }),
12025
+ weixin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12026
+ douyin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12027
+ shipinhao: Object.freeze({ max: 22, unit: "utf16_code_units" }),
12028
+ reddit: Object.freeze({ max: 300, unit: "utf16_code_units" })
12029
+ }),
12030
+ article: Object.freeze({
12031
+ juejin: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12032
+ csdn: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12033
+ cnblogs: Object.freeze({ max: 128, unit: "utf16_code_units" }),
12034
+ weibo: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12035
+ sspai: Object.freeze({ max: 80, unit: "utf16_code_units" })
12036
+ }),
12037
+ shortVideo: Object.freeze({
12038
+ shipinhao: Object.freeze({ max: 16, unit: "utf16_code_units" }),
12039
+ douyin: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12040
+ bilibili: Object.freeze({ max: 80, unit: "utf16_code_units" })
12041
+ })
12042
+ }),
12043
+ bodyCapabilities: Object.freeze({
12044
+ dynamic: Object.freeze({
12045
+ threads: Object.freeze({ max: 500, unit: "unicode_code_points", behavior: "split_thread" }),
12046
+ x: Object.freeze({ max: 280, unit: "weighted", behavior: "split_thread" }),
12047
+ weibo: Object.freeze({ max: 2000, unit: "unicode_code_points" }),
12048
+ jike: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12049
+ }),
12050
+ imageText: Object.freeze({
12051
+ xiaohongshu: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12052
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12053
+ }),
12054
+ article: Object.freeze({
12055
+ wechatmp: Object.freeze({ max: 50000, unit: "unicode_code_points" }),
12056
+ juejin: Object.freeze({ max: 50000, unit: "unicode_code_points" })
12057
+ }),
12058
+ shortVideo: Object.freeze({
12059
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12060
+ kuaishou: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12061
+ shipinhao: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12062
+ })
12063
+ })
12064
+ });
11988
12065
  // ../../packages/kk-core/src/kinds.ts
11989
12066
  init_zod();
11990
12067
 
@@ -12075,6 +12152,67 @@ var BrowserSessionDescriptorSchema = object({
12075
12152
  }
12076
12153
  }).optional()
12077
12154
  }).strict();
12155
+ var ContentCountUnitSchema = _enum([
12156
+ "utf16_code_units",
12157
+ "unicode_code_points",
12158
+ "weighted",
12159
+ "xiaohongshu_title_weighted"
12160
+ ]);
12161
+ var LimitEntrySchema = object({
12162
+ max: number2().int().positive(),
12163
+ unit: ContentCountUnitSchema
12164
+ }).strict();
12165
+ var PublishingProfileLimitsSchema = object({
12166
+ title: LimitEntrySchema.optional(),
12167
+ body: LimitEntrySchema.optional()
12168
+ }).strict();
12169
+ var PublishingProfileRequiresSchema = object({
12170
+ cover: boolean2().optional(),
12171
+ orderedImages: boolean2().optional()
12172
+ }).strict();
12173
+ var PublishingProfileModeBindingSchema = object({
12174
+ metadata: record(string2(), unknown())
12175
+ }).strict();
12176
+ var PublishingProfileModesSchema = object({
12177
+ draft: PublishingProfileModeBindingSchema.optional(),
12178
+ live: PublishingProfileModeBindingSchema.optional()
12179
+ }).strict().superRefine((modes, ctx) => {
12180
+ if (modes.draft === undefined && modes.live === undefined) {
12181
+ ctx.addIssue({
12182
+ code: "custom",
12183
+ message: 'modes must define at least one of "draft" or "live"'
12184
+ });
12185
+ }
12186
+ });
12187
+ var PublishingProfileSchema = object({
12188
+ format: string2().min(1),
12189
+ locale: string2().regex(/^(source|[a-z]{2,3}(-[A-Za-z0-9]+)*)$/, {
12190
+ message: 'locale must be "source" or a valid language tag'
12191
+ }),
12192
+ limits: PublishingProfileLimitsSchema.optional(),
12193
+ requires: PublishingProfileRequiresSchema.optional(),
12194
+ modes: PublishingProfileModesSchema
12195
+ }).strict();
12196
+ var PublishingCapabilitiesSchema = object({
12197
+ defaultProfile: string2().min(1),
12198
+ profiles: record(string2().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/), PublishingProfileSchema)
12199
+ }).strict().superRefine((data, ctx) => {
12200
+ const keys = Object.keys(data.profiles);
12201
+ if (keys.length === 0) {
12202
+ ctx.addIssue({
12203
+ code: "custom",
12204
+ path: ["profiles"],
12205
+ message: "profiles record must be nonempty"
12206
+ });
12207
+ }
12208
+ if (!(data.defaultProfile in data.profiles)) {
12209
+ ctx.addIssue({
12210
+ code: "custom",
12211
+ path: ["defaultProfile"],
12212
+ message: `defaultProfile "${data.defaultProfile}" must reference a declared profile`
12213
+ });
12214
+ }
12215
+ });
12078
12216
  var PluginManifestSchemaBase = looseObject({
12079
12217
  name: string2().min(1),
12080
12218
  kind: PluginKindSchema,
@@ -12083,23 +12221,31 @@ var PluginManifestSchemaBase = looseObject({
12083
12221
  version: string2().optional(),
12084
12222
  description: string2().optional(),
12085
12223
  operations: record(string2(), PluginOperationSchema).optional(),
12086
- browserSession: BrowserSessionDescriptorSchema.optional()
12224
+ browserSession: BrowserSessionDescriptorSchema.optional(),
12225
+ publishing: PublishingCapabilitiesSchema.optional()
12087
12226
  });
12088
12227
  var PluginManifestSchema = PluginManifestSchemaBase.superRefine((manifest, ctx) => {
12089
- if (manifest.browserSession === undefined)
12090
- return;
12091
- if (manifest.kind !== "publish") {
12092
- ctx.addIssue({
12093
- code: "custom",
12094
- path: ["browserSession"],
12095
- message: `browserSession requires kind "publish", not "${manifest.kind}"`
12096
- });
12228
+ if (manifest.browserSession !== undefined) {
12229
+ if (manifest.kind !== "publish") {
12230
+ ctx.addIssue({
12231
+ code: "custom",
12232
+ path: ["browserSession"],
12233
+ message: `browserSession requires kind "publish", not "${manifest.kind}"`
12234
+ });
12235
+ }
12236
+ if (manifest.check === undefined) {
12237
+ ctx.addIssue({
12238
+ code: "custom",
12239
+ path: ["browserSession"],
12240
+ message: "browserSession requires a check probe entry that owns the session routines"
12241
+ });
12242
+ }
12097
12243
  }
12098
- if (manifest.check === undefined) {
12244
+ if (manifest.publishing !== undefined && manifest.kind !== "publish") {
12099
12245
  ctx.addIssue({
12100
12246
  code: "custom",
12101
- path: ["browserSession"],
12102
- message: "browserSession requires a check probe entry that owns the session routines"
12247
+ path: ["publishing"],
12248
+ message: `publishing requires kind "publish", not "${manifest.kind}"`
12103
12249
  });
12104
12250
  }
12105
12251
  });
@@ -11986,6 +11986,83 @@ import { homedir } from "os";
11986
11986
  import { dirname as dirname2, join } from "path";
11987
11987
  import { parseArgs } from "util";
11988
11988
 
11989
+ // ../../packages/kk-core/src/content-limits.ts
11990
+ var PLATFORM_CONTENT_LIMITS = Object.freeze({
11991
+ schemaVersion: 5,
11992
+ tagLimits: Object.freeze({
11993
+ default: 7,
11994
+ imageText: Object.freeze({
11995
+ instagram: 5,
11996
+ douyin: 5,
11997
+ kuaishou: 4,
11998
+ weixin: 1,
11999
+ xiaohongshu: 10
12000
+ }),
12001
+ shortVideo: Object.freeze({
12002
+ douyin: 5,
12003
+ kuaishou: 4,
12004
+ xiaohongshu: 10,
12005
+ bilibili: 10,
12006
+ zhihu: 5,
12007
+ tiktok: 20,
12008
+ youtube: 60
12009
+ })
12010
+ }),
12011
+ titleCapabilities: Object.freeze({
12012
+ dynamic: Object.freeze({
12013
+ bilibili: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12014
+ zhihu: Object.freeze({ max: 50, unit: "utf16_code_units" }),
12015
+ douban: Object.freeze({ max: 70, unit: "utf16_code_units" }),
12016
+ x: null,
12017
+ threads: null,
12018
+ weibo: null,
12019
+ jike: null,
12020
+ zsxq: null,
12021
+ toutiao: null,
12022
+ juejin: null
12023
+ }),
12024
+ imageText: Object.freeze({
12025
+ xiaohongshu: Object.freeze({ max: 20, unit: "xiaohongshu_title_weighted" }),
12026
+ weixin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12027
+ douyin: Object.freeze({ max: 20, unit: "utf16_code_units" }),
12028
+ shipinhao: Object.freeze({ max: 22, unit: "utf16_code_units" }),
12029
+ reddit: Object.freeze({ max: 300, unit: "utf16_code_units" })
12030
+ }),
12031
+ article: Object.freeze({
12032
+ juejin: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12033
+ csdn: Object.freeze({ max: 100, unit: "utf16_code_units" }),
12034
+ cnblogs: Object.freeze({ max: 128, unit: "utf16_code_units" }),
12035
+ weibo: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12036
+ sspai: Object.freeze({ max: 80, unit: "utf16_code_units" })
12037
+ }),
12038
+ shortVideo: Object.freeze({
12039
+ shipinhao: Object.freeze({ max: 16, unit: "utf16_code_units" }),
12040
+ douyin: Object.freeze({ max: 30, unit: "utf16_code_units" }),
12041
+ bilibili: Object.freeze({ max: 80, unit: "utf16_code_units" })
12042
+ })
12043
+ }),
12044
+ bodyCapabilities: Object.freeze({
12045
+ dynamic: Object.freeze({
12046
+ threads: Object.freeze({ max: 500, unit: "unicode_code_points", behavior: "split_thread" }),
12047
+ x: Object.freeze({ max: 280, unit: "weighted", behavior: "split_thread" }),
12048
+ weibo: Object.freeze({ max: 2000, unit: "unicode_code_points" }),
12049
+ jike: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12050
+ }),
12051
+ imageText: Object.freeze({
12052
+ xiaohongshu: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12053
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12054
+ }),
12055
+ article: Object.freeze({
12056
+ wechatmp: Object.freeze({ max: 50000, unit: "unicode_code_points" }),
12057
+ juejin: Object.freeze({ max: 50000, unit: "unicode_code_points" })
12058
+ }),
12059
+ shortVideo: Object.freeze({
12060
+ douyin: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12061
+ kuaishou: Object.freeze({ max: 1000, unit: "unicode_code_points" }),
12062
+ shipinhao: Object.freeze({ max: 1000, unit: "unicode_code_points" })
12063
+ })
12064
+ })
12065
+ });
11989
12066
  // ../../packages/kk-core/src/kinds.ts
11990
12067
  init_zod();
11991
12068
 
@@ -12076,6 +12153,67 @@ var BrowserSessionDescriptorSchema = object({
12076
12153
  }
12077
12154
  }).optional()
12078
12155
  }).strict();
12156
+ var ContentCountUnitSchema = _enum([
12157
+ "utf16_code_units",
12158
+ "unicode_code_points",
12159
+ "weighted",
12160
+ "xiaohongshu_title_weighted"
12161
+ ]);
12162
+ var LimitEntrySchema = object({
12163
+ max: number2().int().positive(),
12164
+ unit: ContentCountUnitSchema
12165
+ }).strict();
12166
+ var PublishingProfileLimitsSchema = object({
12167
+ title: LimitEntrySchema.optional(),
12168
+ body: LimitEntrySchema.optional()
12169
+ }).strict();
12170
+ var PublishingProfileRequiresSchema = object({
12171
+ cover: boolean2().optional(),
12172
+ orderedImages: boolean2().optional()
12173
+ }).strict();
12174
+ var PublishingProfileModeBindingSchema = object({
12175
+ metadata: record(string2(), unknown())
12176
+ }).strict();
12177
+ var PublishingProfileModesSchema = object({
12178
+ draft: PublishingProfileModeBindingSchema.optional(),
12179
+ live: PublishingProfileModeBindingSchema.optional()
12180
+ }).strict().superRefine((modes, ctx) => {
12181
+ if (modes.draft === undefined && modes.live === undefined) {
12182
+ ctx.addIssue({
12183
+ code: "custom",
12184
+ message: 'modes must define at least one of "draft" or "live"'
12185
+ });
12186
+ }
12187
+ });
12188
+ var PublishingProfileSchema = object({
12189
+ format: string2().min(1),
12190
+ locale: string2().regex(/^(source|[a-z]{2,3}(-[A-Za-z0-9]+)*)$/, {
12191
+ message: 'locale must be "source" or a valid language tag'
12192
+ }),
12193
+ limits: PublishingProfileLimitsSchema.optional(),
12194
+ requires: PublishingProfileRequiresSchema.optional(),
12195
+ modes: PublishingProfileModesSchema
12196
+ }).strict();
12197
+ var PublishingCapabilitiesSchema = object({
12198
+ defaultProfile: string2().min(1),
12199
+ profiles: record(string2().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/), PublishingProfileSchema)
12200
+ }).strict().superRefine((data, ctx) => {
12201
+ const keys = Object.keys(data.profiles);
12202
+ if (keys.length === 0) {
12203
+ ctx.addIssue({
12204
+ code: "custom",
12205
+ path: ["profiles"],
12206
+ message: "profiles record must be nonempty"
12207
+ });
12208
+ }
12209
+ if (!(data.defaultProfile in data.profiles)) {
12210
+ ctx.addIssue({
12211
+ code: "custom",
12212
+ path: ["defaultProfile"],
12213
+ message: `defaultProfile "${data.defaultProfile}" must reference a declared profile`
12214
+ });
12215
+ }
12216
+ });
12079
12217
  var PluginManifestSchemaBase = looseObject({
12080
12218
  name: string2().min(1),
12081
12219
  kind: PluginKindSchema,
@@ -12084,23 +12222,31 @@ var PluginManifestSchemaBase = looseObject({
12084
12222
  version: string2().optional(),
12085
12223
  description: string2().optional(),
12086
12224
  operations: record(string2(), PluginOperationSchema).optional(),
12087
- browserSession: BrowserSessionDescriptorSchema.optional()
12225
+ browserSession: BrowserSessionDescriptorSchema.optional(),
12226
+ publishing: PublishingCapabilitiesSchema.optional()
12088
12227
  });
12089
12228
  var PluginManifestSchema = PluginManifestSchemaBase.superRefine((manifest, ctx) => {
12090
- if (manifest.browserSession === undefined)
12091
- return;
12092
- if (manifest.kind !== "publish") {
12093
- ctx.addIssue({
12094
- code: "custom",
12095
- path: ["browserSession"],
12096
- message: `browserSession requires kind "publish", not "${manifest.kind}"`
12097
- });
12229
+ if (manifest.browserSession !== undefined) {
12230
+ if (manifest.kind !== "publish") {
12231
+ ctx.addIssue({
12232
+ code: "custom",
12233
+ path: ["browserSession"],
12234
+ message: `browserSession requires kind "publish", not "${manifest.kind}"`
12235
+ });
12236
+ }
12237
+ if (manifest.check === undefined) {
12238
+ ctx.addIssue({
12239
+ code: "custom",
12240
+ path: ["browserSession"],
12241
+ message: "browserSession requires a check probe entry that owns the session routines"
12242
+ });
12243
+ }
12098
12244
  }
12099
- if (manifest.check === undefined) {
12245
+ if (manifest.publishing !== undefined && manifest.kind !== "publish") {
12100
12246
  ctx.addIssue({
12101
12247
  code: "custom",
12102
- path: ["browserSession"],
12103
- message: "browserSession requires a check probe entry that owns the session routines"
12248
+ path: ["publishing"],
12249
+ message: `publishing requires kind "publish", not "${manifest.kind}"`
12104
12250
  });
12105
12251
  }
12106
12252
  });