@gobing-ai/knowledge-kit 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.md +74 -0
- package/dist/index.js +108 -107
- package/package.json +19 -1
- package/plugins/generations/content-gen/dist/index.js +42 -94
- package/plugins/generations/core-facts-gen/dist/index.js +51 -100
- package/plugins/generations/daily-article-gen/dist/index.js +57 -99
- package/plugins/generations/daily-article-gen/src/index.ts +12 -4
- package/plugins/generations/dailynews-gen/dist/index.js +57 -102
- package/plugins/generations/dailynews-gen/src/script-builder.ts +9 -1
- package/plugins/generations/episode-plan-gen/dist/index.js +120 -113
- package/plugins/generations/episode-plan-gen/src/index.ts +102 -22
- package/plugins/generations/image-gen/dist/index.js +63 -115
- package/plugins/generations/news-report-gen/dist/index.js +117 -99
- package/plugins/generations/news-report-gen/src/index.ts +117 -1
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/pipeline.py +1 -1
- package/plugins/generations/omni-voice-gen/src/omni_voice_gen/voicescript.py +8 -0
- package/plugins/generations/voice-gen/dist/index.js +161 -120
- package/plugins/generations/voice-gen/src/concat.ts +34 -0
- package/plugins/generations/voice-gen/src/index.ts +14 -4
- package/plugins/generations/voice-gen/src/voicebox-server.ts +91 -0
- package/plugins/generations/voice-gen/src/voicescript.ts +8 -0
- package/plugins/ingestions/aihot-ingest/dist/index.js +47 -97
- package/plugins/ingestions/horizon-ingest/dist/index.js +47 -96
- package/plugins/ingestions/karakeep-local/dist/index.js +217 -266
- package/plugins/ingestions/last30days-ingest/dist/index.js +42 -91
- package/plugins/ingestions/web-search/dist/index.js +68 -117
- package/plugins/kk/commands/workflow-run.md +10 -6
- package/plugins/kk/plugin.json +1 -1
- package/plugins/kk/scripts/kk-workflow-stages.ts +376 -70
- package/plugins/kk/skills/publish/SKILL.md +80 -0
- package/plugins/kk/workflows/kk-daily-ai-voice.yaml +136 -224
- package/plugins/kk/workflows/leftover-publish-fanout-example.yaml +53 -0
- package/plugins/publishings/emdash-pub/dist/index.js +42 -91
- package/plugins/publishings/infoq-pub/dist/index.js +21994 -0
- package/plugins/publishings/infoq-pub/package.json +17 -0
- package/plugins/publishings/infoq-pub/plugin.json +7 -0
- package/plugins/publishings/infoq-pub/src/index.ts +123 -0
- package/plugins/publishings/infoq-pub/tsconfig.json +4 -0
- package/plugins/publishings/juejin-pub/dist/index.js +21994 -0
- package/plugins/publishings/juejin-pub/package.json +17 -0
- package/plugins/publishings/juejin-pub/plugin.json +7 -0
- package/plugins/publishings/juejin-pub/src/index.ts +123 -0
- package/plugins/publishings/juejin-pub/tsconfig.json +4 -0
- package/plugins/publishings/medium-pub/dist/index.js +22041 -0
- package/plugins/publishings/medium-pub/package.json +17 -0
- package/plugins/publishings/medium-pub/plugin.json +7 -0
- package/plugins/publishings/medium-pub/src/index.ts +215 -0
- package/plugins/publishings/medium-pub/tsconfig.json +4 -0
- package/plugins/publishings/podcast-pub/dist/index.js +183 -123
- package/plugins/publishings/podcast-pub/src/index.ts +47 -3
- package/plugins/publishings/podcast-pub/src/show-notes.ts +153 -34
- package/plugins/publishings/qiita-pub/dist/index.js +42 -91
- package/plugins/publishings/substack-pub/dist/index.js +21994 -0
- package/plugins/publishings/substack-pub/package.json +17 -0
- package/plugins/publishings/substack-pub/plugin.json +7 -0
- package/plugins/publishings/substack-pub/src/index.ts +123 -0
- package/plugins/publishings/substack-pub/tsconfig.json +4 -0
- package/plugins/publishings/surfdash-pub/dist/index.js +172 -103
- package/plugins/publishings/surfdash-pub/src/index.ts +32 -2
- package/plugins/publishings/wechatmp-pub/dist/index.js +22119 -0
- package/plugins/publishings/wechatmp-pub/package.json +17 -0
- package/plugins/publishings/wechatmp-pub/plugin.json +7 -0
- package/plugins/publishings/wechatmp-pub/src/index.ts +304 -0
- package/plugins/publishings/wechatmp-pub/tsconfig.json +4 -0
- package/plugins/publishings/x-pub/dist/index.js +22110 -0
- package/plugins/publishings/x-pub/package.json +17 -0
- package/plugins/publishings/x-pub/plugin.json +7 -0
- package/plugins/publishings/x-pub/src/index.ts +222 -0
- package/plugins/publishings/x-pub/tsconfig.json +4 -0
- package/plugins/publishings/xhs-pub/dist/index.js +21994 -0
- package/plugins/publishings/xhs-pub/package.json +17 -0
- package/plugins/publishings/xhs-pub/plugin.json +7 -0
- package/plugins/publishings/xhs-pub/src/index.ts +123 -0
- package/plugins/publishings/xhs-pub/tsconfig.json +4 -0
- package/plugins/publishings/zenn-pub/dist/index.js +42 -91
|
@@ -35,6 +35,9 @@ export const VoiceScriptSegmentSchema = z.object({
|
|
|
35
35
|
engine: z.string().min(1).optional(),
|
|
36
36
|
language: z.string().min(1).optional(),
|
|
37
37
|
gap_ms: z.number().int().nonnegative().optional(),
|
|
38
|
+
// Per-segment playback rate (0.5–2.0). Facts read at 1.0 (precise), insights at 1.12
|
|
39
|
+
// (conversational); omitted -> the generator's global default (workflow OMNIVOICE_SPEED).
|
|
40
|
+
speed: z.number().min(0.5).max(2.0).optional(),
|
|
38
41
|
max_chunk_chars: z.number().int().optional(),
|
|
39
42
|
crossfade_ms: z.number().int().optional(),
|
|
40
43
|
personality: z.boolean().optional(),
|
|
@@ -386,13 +389,15 @@ export function buildNewsVoiceScript(docs: Doc[], options?: ScriptBuilderOptions
|
|
|
386
389
|
text: chunk,
|
|
387
390
|
gap_ms: 500, // Natural breathing pause before giving personal perspective
|
|
388
391
|
emotion: 'professional, clear',
|
|
392
|
+
speed: 1.0, // 20260917 pacing: facts/data read slower than the global 1.06 default
|
|
389
393
|
});
|
|
390
394
|
}
|
|
391
395
|
if (normalizedInsight !== null) {
|
|
392
396
|
segments.push({
|
|
393
397
|
text: normalizedInsight,
|
|
394
|
-
gap_ms:
|
|
398
|
+
gap_ms: 1200, // Clear breath between news items (listener complaint: items ran together)
|
|
395
399
|
emotion: 'thoughtful, personal',
|
|
400
|
+
speed: 1.12, // 20260917 pacing: conversational asides read faster than facts
|
|
396
401
|
});
|
|
397
402
|
}
|
|
398
403
|
});
|
|
@@ -503,6 +508,9 @@ export function formatVoiceScriptToYaml(script: VoiceScript): string {
|
|
|
503
508
|
if (segment.gap_ms !== undefined) {
|
|
504
509
|
lines.push(` gap_ms: ${segment.gap_ms}`);
|
|
505
510
|
}
|
|
511
|
+
if (segment.speed !== undefined) {
|
|
512
|
+
lines.push(` speed: ${segment.speed}`);
|
|
513
|
+
}
|
|
506
514
|
if (segment.seed !== undefined) {
|
|
507
515
|
lines.push(` seed: ${segment.seed}`);
|
|
508
516
|
}
|
|
@@ -14642,72 +14642,6 @@ var init_zod = __esm(() => {
|
|
|
14642
14642
|
init_external();
|
|
14643
14643
|
});
|
|
14644
14644
|
|
|
14645
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/errors.js
|
|
14646
|
-
var ErrorCode;
|
|
14647
|
-
var init_errors3 = __esm(() => {
|
|
14648
|
-
ErrorCode = {
|
|
14649
|
-
NotFound: "NOT_FOUND",
|
|
14650
|
-
Validation: "VALIDATION",
|
|
14651
|
-
Conflict: "CONFLICT",
|
|
14652
|
-
Internal: "INTERNAL"
|
|
14653
|
-
};
|
|
14654
|
-
});
|
|
14655
|
-
|
|
14656
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/api-response.js
|
|
14657
|
-
var API_ERROR_CODES, ERROR_CODE_TO_HTTP, CLIENT_SAFE_CODES;
|
|
14658
|
-
var init_api_response = __esm(() => {
|
|
14659
|
-
init_errors3();
|
|
14660
|
-
API_ERROR_CODES = {
|
|
14661
|
-
SUCCESS: 0,
|
|
14662
|
-
NOT_FOUND: 404,
|
|
14663
|
-
VALIDATION_ERROR: 422,
|
|
14664
|
-
BAD_REQUEST: 400,
|
|
14665
|
-
UNAUTHORIZED: 401,
|
|
14666
|
-
FORBIDDEN: 403,
|
|
14667
|
-
CONFLICT: 409,
|
|
14668
|
-
INTERNAL_ERROR: 500
|
|
14669
|
-
};
|
|
14670
|
-
ERROR_CODE_TO_HTTP = {
|
|
14671
|
-
[ErrorCode.NotFound]: API_ERROR_CODES.NOT_FOUND,
|
|
14672
|
-
[ErrorCode.Validation]: API_ERROR_CODES.VALIDATION_ERROR,
|
|
14673
|
-
[ErrorCode.Conflict]: API_ERROR_CODES.CONFLICT,
|
|
14674
|
-
[ErrorCode.Internal]: API_ERROR_CODES.INTERNAL_ERROR
|
|
14675
|
-
};
|
|
14676
|
-
CLIENT_SAFE_CODES = new Set([ErrorCode.NotFound, ErrorCode.Validation, ErrorCode.Conflict]);
|
|
14677
|
-
});
|
|
14678
|
-
|
|
14679
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/cursor.js
|
|
14680
|
-
var init_cursor = () => {};
|
|
14681
|
-
|
|
14682
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/event-severity.js
|
|
14683
|
-
var init_event_severity = () => {};
|
|
14684
|
-
|
|
14685
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/output.js
|
|
14686
|
-
function processStream(name) {
|
|
14687
|
-
const proc = globalThis.process;
|
|
14688
|
-
const stream = proc?.[name];
|
|
14689
|
-
if (stream === undefined) {
|
|
14690
|
-
throw new Error(`No ${name} target available: set one via setDefaultOutputTargets or pass an explicit target`);
|
|
14691
|
-
}
|
|
14692
|
-
return stream;
|
|
14693
|
-
}
|
|
14694
|
-
function writeLine(message, target) {
|
|
14695
|
-
target.write(`${message}
|
|
14696
|
-
`);
|
|
14697
|
-
}
|
|
14698
|
-
function echoError(message, target = defaultStderrTarget ?? processStream("stderr")) {
|
|
14699
|
-
writeLine(message, target);
|
|
14700
|
-
}
|
|
14701
|
-
var defaultStderrTarget;
|
|
14702
|
-
|
|
14703
|
-
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.39/node_modules/@gobing-ai/ts-utils/dist/index.js
|
|
14704
|
-
var init_dist = __esm(() => {
|
|
14705
|
-
init_api_response();
|
|
14706
|
-
init_cursor();
|
|
14707
|
-
init_errors3();
|
|
14708
|
-
init_event_severity();
|
|
14709
|
-
});
|
|
14710
|
-
|
|
14711
14645
|
// ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js
|
|
14712
14646
|
var require_identity = __commonJS((exports) => {
|
|
14713
14647
|
var ALIAS = Symbol.for("yaml.alias");
|
|
@@ -17612,15 +17546,15 @@ var require_timestamp = __commonJS((exports) => {
|
|
|
17612
17546
|
throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");
|
|
17613
17547
|
const [, year, month, day, hour, minute, second] = match.map(Number);
|
|
17614
17548
|
const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0;
|
|
17615
|
-
let
|
|
17549
|
+
let date5 = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);
|
|
17616
17550
|
const tz = match[8];
|
|
17617
17551
|
if (tz && tz !== "Z") {
|
|
17618
17552
|
let d = parseSexagesimal(tz, false);
|
|
17619
17553
|
if (Math.abs(d) < 30)
|
|
17620
17554
|
d *= 60;
|
|
17621
|
-
|
|
17555
|
+
date5 -= 60000 * d;
|
|
17622
17556
|
}
|
|
17623
|
-
return new Date(
|
|
17557
|
+
return new Date(date5);
|
|
17624
17558
|
},
|
|
17625
17559
|
stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\.000Z$/, "") ?? ""
|
|
17626
17560
|
};
|
|
@@ -19480,7 +19414,7 @@ var require_composer = __commonJS((exports) => {
|
|
|
19480
19414
|
var node_process = __require("process");
|
|
19481
19415
|
var directives = require_directives();
|
|
19482
19416
|
var Document = require_Document();
|
|
19483
|
-
var
|
|
19417
|
+
var errors3 = require_errors();
|
|
19484
19418
|
var identity = require_identity();
|
|
19485
19419
|
var composeDoc = require_compose_doc();
|
|
19486
19420
|
var resolveEnd = require_resolve_end();
|
|
@@ -19531,9 +19465,9 @@ var require_composer = __commonJS((exports) => {
|
|
|
19531
19465
|
this.onError = (source, code, message, warning) => {
|
|
19532
19466
|
const pos = getErrorPos(source);
|
|
19533
19467
|
if (warning)
|
|
19534
|
-
this.warnings.push(new
|
|
19468
|
+
this.warnings.push(new errors3.YAMLWarning(pos, code, message));
|
|
19535
19469
|
else
|
|
19536
|
-
this.errors.push(new
|
|
19470
|
+
this.errors.push(new errors3.YAMLParseError(pos, code, message));
|
|
19537
19471
|
};
|
|
19538
19472
|
this.directives = new directives.Directives({ version: options.version || "1.2" });
|
|
19539
19473
|
this.options = options;
|
|
@@ -19619,7 +19553,7 @@ ${cb}` : comment;
|
|
|
19619
19553
|
break;
|
|
19620
19554
|
case "error": {
|
|
19621
19555
|
const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message;
|
|
19622
|
-
const error51 = new
|
|
19556
|
+
const error51 = new errors3.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg);
|
|
19623
19557
|
if (this.atDirectives || !this.doc)
|
|
19624
19558
|
this.errors.push(error51);
|
|
19625
19559
|
else
|
|
@@ -19629,7 +19563,7 @@ ${cb}` : comment;
|
|
|
19629
19563
|
case "doc-end": {
|
|
19630
19564
|
if (!this.doc) {
|
|
19631
19565
|
const msg = "Unexpected doc-end without preceding document";
|
|
19632
|
-
this.errors.push(new
|
|
19566
|
+
this.errors.push(new errors3.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg));
|
|
19633
19567
|
break;
|
|
19634
19568
|
}
|
|
19635
19569
|
this.doc.directives.docEnd = true;
|
|
@@ -19644,7 +19578,7 @@ ${end.comment}` : end.comment;
|
|
|
19644
19578
|
break;
|
|
19645
19579
|
}
|
|
19646
19580
|
default:
|
|
19647
|
-
this.errors.push(new
|
|
19581
|
+
this.errors.push(new errors3.YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`));
|
|
19648
19582
|
}
|
|
19649
19583
|
}
|
|
19650
19584
|
*end(forceDoc = false, endOffset = -1) {
|
|
@@ -19670,7 +19604,7 @@ ${end.comment}` : end.comment;
|
|
|
19670
19604
|
var require_cst_scalar = __commonJS((exports) => {
|
|
19671
19605
|
var resolveBlockScalar = require_resolve_block_scalar();
|
|
19672
19606
|
var resolveFlowScalar = require_resolve_flow_scalar();
|
|
19673
|
-
var
|
|
19607
|
+
var errors3 = require_errors();
|
|
19674
19608
|
var stringifyString = require_stringifyString();
|
|
19675
19609
|
function resolveAsScalar(token, strict = true, onError) {
|
|
19676
19610
|
if (token) {
|
|
@@ -19679,7 +19613,7 @@ var require_cst_scalar = __commonJS((exports) => {
|
|
|
19679
19613
|
if (onError)
|
|
19680
19614
|
onError(offset, code, message);
|
|
19681
19615
|
else
|
|
19682
|
-
throw new
|
|
19616
|
+
throw new errors3.YAMLParseError([offset, offset + 1], code, message);
|
|
19683
19617
|
};
|
|
19684
19618
|
switch (token.type) {
|
|
19685
19619
|
case "scalar":
|
|
@@ -21559,7 +21493,7 @@ var require_parser = __commonJS((exports) => {
|
|
|
21559
21493
|
var require_public_api = __commonJS((exports) => {
|
|
21560
21494
|
var composer = require_composer();
|
|
21561
21495
|
var Document = require_Document();
|
|
21562
|
-
var
|
|
21496
|
+
var errors3 = require_errors();
|
|
21563
21497
|
var log = require_log();
|
|
21564
21498
|
var identity = require_identity();
|
|
21565
21499
|
var lineCounter = require_line_counter();
|
|
@@ -21576,8 +21510,8 @@ var require_public_api = __commonJS((exports) => {
|
|
|
21576
21510
|
const docs = Array.from(composer$1.compose(parser$1.parse(source)));
|
|
21577
21511
|
if (prettyErrors && lineCounter2)
|
|
21578
21512
|
for (const doc2 of docs) {
|
|
21579
|
-
doc2.errors.forEach(
|
|
21580
|
-
doc2.warnings.forEach(
|
|
21513
|
+
doc2.errors.forEach(errors3.prettifyError(source, lineCounter2));
|
|
21514
|
+
doc2.warnings.forEach(errors3.prettifyError(source, lineCounter2));
|
|
21581
21515
|
}
|
|
21582
21516
|
if (docs.length > 0)
|
|
21583
21517
|
return docs;
|
|
@@ -21592,13 +21526,13 @@ var require_public_api = __commonJS((exports) => {
|
|
|
21592
21526
|
if (!doc2)
|
|
21593
21527
|
doc2 = _doc;
|
|
21594
21528
|
else if (doc2.options.logLevel !== "silent") {
|
|
21595
|
-
doc2.errors.push(new
|
|
21529
|
+
doc2.errors.push(new errors3.YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()"));
|
|
21596
21530
|
break;
|
|
21597
21531
|
}
|
|
21598
21532
|
}
|
|
21599
21533
|
if (prettyErrors && lineCounter2) {
|
|
21600
|
-
doc2.errors.forEach(
|
|
21601
|
-
doc2.warnings.forEach(
|
|
21534
|
+
doc2.errors.forEach(errors3.prettifyError(source, lineCounter2));
|
|
21535
|
+
doc2.warnings.forEach(errors3.prettifyError(source, lineCounter2));
|
|
21602
21536
|
}
|
|
21603
21537
|
return doc2;
|
|
21604
21538
|
}
|
|
@@ -21650,12 +21584,12 @@ var require_public_api = __commonJS((exports) => {
|
|
|
21650
21584
|
});
|
|
21651
21585
|
|
|
21652
21586
|
// ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/index.js
|
|
21653
|
-
var composer, Document, Schema,
|
|
21654
|
-
var
|
|
21587
|
+
var composer, Document, Schema, errors3, Alias, identity, Pair, Scalar, YAMLMap, YAMLSeq, cst, lexer, lineCounter, parser, publicApi, visit, $Composer, $Document, $Schema, $YAMLError, $YAMLParseError, $YAMLWarning, $Alias, $isAlias, $isCollection, $isDocument, $isMap, $isNode, $isPair, $isScalar, $isSeq, $Pair, $Scalar, $YAMLMap, $YAMLSeq, $Lexer, $LineCounter, $Parser, $parse, $parseAllDocuments, $parseDocument, $stringify, $visit, $visitAsync;
|
|
21588
|
+
var init_dist = __esm(() => {
|
|
21655
21589
|
composer = require_composer();
|
|
21656
21590
|
Document = require_Document();
|
|
21657
21591
|
Schema = require_Schema();
|
|
21658
|
-
|
|
21592
|
+
errors3 = require_errors();
|
|
21659
21593
|
Alias = require_Alias();
|
|
21660
21594
|
identity = require_identity();
|
|
21661
21595
|
Pair = require_Pair();
|
|
@@ -21671,9 +21605,9 @@ var init_dist2 = __esm(() => {
|
|
|
21671
21605
|
$Composer = composer.Composer;
|
|
21672
21606
|
$Document = Document.Document;
|
|
21673
21607
|
$Schema = Schema.Schema;
|
|
21674
|
-
$YAMLError =
|
|
21675
|
-
$YAMLParseError =
|
|
21676
|
-
$YAMLWarning =
|
|
21608
|
+
$YAMLError = errors3.YAMLError;
|
|
21609
|
+
$YAMLParseError = errors3.YAMLParseError;
|
|
21610
|
+
$YAMLWarning = errors3.YAMLWarning;
|
|
21677
21611
|
$Alias = Alias.Alias;
|
|
21678
21612
|
$isAlias = identity.isAlias;
|
|
21679
21613
|
$isCollection = identity.isCollection;
|
|
@@ -21701,7 +21635,7 @@ var init_dist2 = __esm(() => {
|
|
|
21701
21635
|
// ../../node_modules/.bun/@gobing-ai+ts-runtime@0.4.39/node_modules/@gobing-ai/ts-runtime/dist/config.js
|
|
21702
21636
|
var configSchema;
|
|
21703
21637
|
var init_config = __esm(() => {
|
|
21704
|
-
|
|
21638
|
+
init_dist();
|
|
21705
21639
|
init_zod();
|
|
21706
21640
|
configSchema = exports_external.object({
|
|
21707
21641
|
app: exports_external.object({
|
|
@@ -21952,10 +21886,27 @@ function getProcessPid() {
|
|
|
21952
21886
|
function uniqueToken() {
|
|
21953
21887
|
return `${Date.now()}.${crypto.randomUUID()}`;
|
|
21954
21888
|
}
|
|
21889
|
+
// ../../node_modules/.bun/@gobing-ai+ts-utils@0.4.67/node_modules/@gobing-ai/ts-utils/dist/output.js
|
|
21890
|
+
var defaultStderrTarget;
|
|
21891
|
+
function processStream(name) {
|
|
21892
|
+
const proc = globalThis.process;
|
|
21893
|
+
const stream = proc?.[name];
|
|
21894
|
+
if (stream === undefined) {
|
|
21895
|
+
throw new Error(`No ${name} target available: set one via setDefaultOutputTargets or pass an explicit target`);
|
|
21896
|
+
}
|
|
21897
|
+
return stream;
|
|
21898
|
+
}
|
|
21899
|
+
function writeLine(message, target) {
|
|
21900
|
+
target.write(`${message}
|
|
21901
|
+
`);
|
|
21902
|
+
}
|
|
21903
|
+
function echoError(message, target = defaultStderrTarget ?? processStream("stderr")) {
|
|
21904
|
+
writeLine(message, target);
|
|
21905
|
+
}
|
|
21906
|
+
|
|
21955
21907
|
// ../../packages/kk-core/src/render-md.ts
|
|
21956
21908
|
if (false) {}
|
|
21957
21909
|
// ../../plugins/generations/episode-plan-gen/src/index.ts
|
|
21958
|
-
init_dist();
|
|
21959
21910
|
var SOURCE_BASE = {
|
|
21960
21911
|
aihot: 30,
|
|
21961
21912
|
rss: 12,
|
|
@@ -22000,11 +21951,9 @@ var TAG_CATEGORY = {
|
|
|
22000
21951
|
war: "non-ai"
|
|
22001
21952
|
};
|
|
22002
21953
|
var NON_AI_SOURCES = new Set(["polymarket"]);
|
|
21954
|
+
var AI_DEFAULT_SOURCES = new Set(["aihot"]);
|
|
21955
|
+
var JUNK_KEYWORDS = ["error:", "http error", "unable to download"];
|
|
22003
21956
|
var CATEGORY_KEYWORDS = [
|
|
22004
|
-
{
|
|
22005
|
-
category: "non-ai",
|
|
22006
|
-
words: ["error:", "http error", "unable to download"]
|
|
22007
|
-
},
|
|
22008
21957
|
{
|
|
22009
21958
|
category: "ai-technical",
|
|
22010
21959
|
words: ["api", "tutorial", "benchmark", "architecture", "sdk", "cli", "quantization", "inference", "fine-tun"]
|
|
@@ -22022,13 +21971,28 @@ var CATEGORY_KEYWORDS = [
|
|
|
22022
21971
|
"\u4E0A\u7EBF",
|
|
22023
21972
|
"\u63A8\u51FA",
|
|
22024
21973
|
"\u5F00\u6E90",
|
|
21974
|
+
"ai",
|
|
21975
|
+
"\u4EBA\u5DE5\u667A\u80FD",
|
|
21976
|
+
"\u5927\u6A21\u578B",
|
|
22025
21977
|
"sora",
|
|
22026
21978
|
"gpt",
|
|
21979
|
+
"chatgpt",
|
|
22027
21980
|
"claude",
|
|
22028
21981
|
"gemini",
|
|
22029
21982
|
"llama",
|
|
22030
21983
|
"grok",
|
|
22031
|
-
"copilot"
|
|
21984
|
+
"copilot",
|
|
21985
|
+
"openai",
|
|
21986
|
+
"anthropic",
|
|
21987
|
+
"deepseek",
|
|
21988
|
+
"qwen",
|
|
21989
|
+
"vllm",
|
|
21990
|
+
"glm",
|
|
21991
|
+
"mistral",
|
|
21992
|
+
"nvidia",
|
|
21993
|
+
"\u82F1\u4F1F\u8FBE",
|
|
21994
|
+
"huawei",
|
|
21995
|
+
"\u534E\u4E3A"
|
|
22032
21996
|
]
|
|
22033
21997
|
},
|
|
22034
21998
|
{
|
|
@@ -22052,6 +22016,9 @@ var CATEGORY_KEYWORDS = [
|
|
|
22052
22016
|
];
|
|
22053
22017
|
var IMPORTANCE_BASE = { aihot: 4, rss: 3, hackernews: 3 };
|
|
22054
22018
|
var DEFAULT_IMPORTANCE = 2;
|
|
22019
|
+
function planAuditOutPath(outputPath) {
|
|
22020
|
+
return outputPath.endsWith(".json") ? `${outputPath.slice(0, -".json".length)}.audit.json` : `${outputPath}.audit.json`;
|
|
22021
|
+
}
|
|
22055
22022
|
function docTimestamp(doc2) {
|
|
22056
22023
|
const meta3 = asRecord(doc2.metadata);
|
|
22057
22024
|
for (const key of ["publishedAt", "discoveredAt"]) {
|
|
@@ -22062,9 +22029,9 @@ function docTimestamp(doc2) {
|
|
|
22062
22029
|
return t;
|
|
22063
22030
|
}
|
|
22064
22031
|
}
|
|
22065
|
-
const
|
|
22066
|
-
if (typeof
|
|
22067
|
-
return Date.parse(
|
|
22032
|
+
const date5 = meta3.date;
|
|
22033
|
+
if (typeof date5 === "string" && /^\d{4}-\d{2}-\d{2}/.test(date5.trim())) {
|
|
22034
|
+
return Date.parse(date5.trim().slice(0, 10));
|
|
22068
22035
|
}
|
|
22069
22036
|
return null;
|
|
22070
22037
|
}
|
|
@@ -22155,10 +22122,15 @@ function classifyCategory(doc2) {
|
|
|
22155
22122
|
if (hit)
|
|
22156
22123
|
return hit;
|
|
22157
22124
|
}
|
|
22158
|
-
|
|
22125
|
+
const source = typeof meta3.source === "string" ? meta3.source : "";
|
|
22126
|
+
if (NON_AI_SOURCES.has(source))
|
|
22159
22127
|
return "non-ai";
|
|
22160
22128
|
const title = (doc2.title ?? "").toLowerCase();
|
|
22161
22129
|
const bodyHead = (doc2.body ?? "").slice(0, 200).toLowerCase();
|
|
22130
|
+
if (JUNK_KEYWORDS.some((w) => matchesKeyword(title, w) || matchesKeyword(bodyHead, w)))
|
|
22131
|
+
return "non-ai";
|
|
22132
|
+
if (AI_DEFAULT_SOURCES.has(source))
|
|
22133
|
+
return "ai-news";
|
|
22162
22134
|
for (const { category, words } of CATEGORY_KEYWORDS) {
|
|
22163
22135
|
if (words.some((w) => matchesKeyword(title, w) || matchesKeyword(bodyHead, w)))
|
|
22164
22136
|
return category;
|
|
@@ -22202,6 +22174,7 @@ function planScore(doc2) {
|
|
|
22202
22174
|
}
|
|
22203
22175
|
function planEpisode(docs, options) {
|
|
22204
22176
|
const planDate = options.date ?? new Date().toISOString().slice(0, 10);
|
|
22177
|
+
const rows = options.audit ? new Map : null;
|
|
22205
22178
|
const byUrl = new Map;
|
|
22206
22179
|
const scored = [];
|
|
22207
22180
|
for (const doc2 of docs) {
|
|
@@ -22214,9 +22187,25 @@ function planEpisode(docs, options) {
|
|
|
22214
22187
|
scores: scoreDimensions(doc2, planDate)
|
|
22215
22188
|
}
|
|
22216
22189
|
};
|
|
22190
|
+
const meta3 = asRecord(cleaned.metadata);
|
|
22191
|
+
rows?.set(cleaned, {
|
|
22192
|
+
id: doc2.id,
|
|
22193
|
+
source: sourceOf(doc2),
|
|
22194
|
+
title: doc2.title ?? "",
|
|
22195
|
+
category: meta3.category,
|
|
22196
|
+
scores: meta3.scores,
|
|
22197
|
+
planScore: null,
|
|
22198
|
+
disposition: "gate"
|
|
22199
|
+
});
|
|
22217
22200
|
if (!passesGates(cleaned, planDate))
|
|
22218
22201
|
continue;
|
|
22219
|
-
const
|
|
22202
|
+
const score = planScore(cleaned);
|
|
22203
|
+
const row = rows?.get(cleaned);
|
|
22204
|
+
if (row) {
|
|
22205
|
+
row.planScore = score;
|
|
22206
|
+
row.disposition = "topN";
|
|
22207
|
+
}
|
|
22208
|
+
const record2 = { doc: cleaned, score, mergedFrom: [] };
|
|
22220
22209
|
const urlKey = normalizeUrl(doc2.sourceUri);
|
|
22221
22210
|
if (urlKey) {
|
|
22222
22211
|
const existing = byUrl.get(urlKey);
|
|
@@ -22228,6 +22217,9 @@ function planEpisode(docs, options) {
|
|
|
22228
22217
|
title: loser.doc.title ?? "",
|
|
22229
22218
|
url: loser.doc.sourceUri ?? null
|
|
22230
22219
|
});
|
|
22220
|
+
const loserRow = rows?.get(loser.doc);
|
|
22221
|
+
if (loserRow)
|
|
22222
|
+
loserRow.disposition = "url-merge";
|
|
22231
22223
|
if (winner !== existing) {
|
|
22232
22224
|
existing.doc = winner.doc;
|
|
22233
22225
|
existing.score = winner.score;
|
|
@@ -22259,6 +22251,9 @@ function planEpisode(docs, options) {
|
|
|
22259
22251
|
title: loser.doc.title ?? "",
|
|
22260
22252
|
url: loser.doc.sourceUri ?? null
|
|
22261
22253
|
});
|
|
22254
|
+
const loserRow = rows?.get(loser.doc);
|
|
22255
|
+
if (loserRow)
|
|
22256
|
+
loserRow.disposition = "title-merge";
|
|
22262
22257
|
absorbed.add(loser);
|
|
22263
22258
|
}
|
|
22264
22259
|
}
|
|
@@ -22268,13 +22263,22 @@ function planEpisode(docs, options) {
|
|
|
22268
22263
|
for (const record2 of candidates) {
|
|
22269
22264
|
const source = sourceOf(record2.doc);
|
|
22270
22265
|
const count = perSource.get(source) ?? 0;
|
|
22271
|
-
if (count >= PER_SOURCE_CAP)
|
|
22266
|
+
if (count >= PER_SOURCE_CAP) {
|
|
22267
|
+
const row2 = rows?.get(record2.doc);
|
|
22268
|
+
if (row2)
|
|
22269
|
+
row2.disposition = "cap";
|
|
22272
22270
|
continue;
|
|
22271
|
+
}
|
|
22273
22272
|
perSource.set(source, count + 1);
|
|
22274
22273
|
selected.push(record2);
|
|
22274
|
+
const row = rows?.get(record2.doc);
|
|
22275
|
+
if (row)
|
|
22276
|
+
row.disposition = "selected";
|
|
22275
22277
|
if (selected.length >= Math.max(1, options.maxItems))
|
|
22276
22278
|
break;
|
|
22277
22279
|
}
|
|
22280
|
+
if (rows)
|
|
22281
|
+
options.audit?.push(...rows.values());
|
|
22278
22282
|
return selected.map((r) => {
|
|
22279
22283
|
const meta3 = asRecord(r.doc.metadata);
|
|
22280
22284
|
const ascii = asciiRatio(r.doc.title ?? "");
|
|
@@ -22297,7 +22301,7 @@ function sourceOf(doc2) {
|
|
|
22297
22301
|
const meta3 = asRecord(doc2.metadata);
|
|
22298
22302
|
return typeof meta3.source === "string" ? meta3.source : "unknown";
|
|
22299
22303
|
}
|
|
22300
|
-
function renderPlanMarkdown(docs,
|
|
22304
|
+
function renderPlanMarkdown(docs, date5) {
|
|
22301
22305
|
const items = docs.map((doc2, i) => {
|
|
22302
22306
|
const meta3 = asRecord(doc2.metadata);
|
|
22303
22307
|
const parts = [
|
|
@@ -22311,25 +22315,25 @@ function renderPlanMarkdown(docs, date6) {
|
|
|
22311
22315
|
}).join(`
|
|
22312
22316
|
|
|
22313
22317
|
`);
|
|
22314
|
-
return `# \u6BCF\u65E5 AI \u64AD\u5BA2\u9009\u7A3F\u8BA1\u5212 \u2014 ${
|
|
22318
|
+
return `# \u6BCF\u65E5 AI \u64AD\u5BA2\u9009\u7A3F\u8BA1\u5212 \u2014 ${date5}
|
|
22315
22319
|
|
|
22316
22320
|
\u672C\u671F\u5171 ${docs.length} \u6761\uFF08\u8BC4\u5206/\u53BB\u91CD/\u6807\u8BB0\u540E\u7CBE\u9009\uFF09\u3002
|
|
22317
22321
|
|
|
22318
22322
|
${items}
|
|
22319
22323
|
`;
|
|
22320
22324
|
}
|
|
22321
|
-
function docsToContent(docs,
|
|
22322
|
-
const planned = planEpisode(docs, { maxItems: maxItemsFromEnv(), date:
|
|
22323
|
-
return planContent(planned,
|
|
22325
|
+
function docsToContent(docs, date5, audit) {
|
|
22326
|
+
const planned = planEpisode(docs, { maxItems: maxItemsFromEnv(), date: date5, audit });
|
|
22327
|
+
return planContent(planned, date5);
|
|
22324
22328
|
}
|
|
22325
|
-
function planContent(docs,
|
|
22329
|
+
function planContent(docs, date5) {
|
|
22326
22330
|
return ContentSchema.parse({
|
|
22327
|
-
title: `\u6BCF\u65E5 AI \u64AD\u5BA2\u9009\u7A3F\u8BA1\u5212 \u2014 ${
|
|
22328
|
-
body: renderPlanMarkdown(docs,
|
|
22331
|
+
title: `\u6BCF\u65E5 AI \u64AD\u5BA2\u9009\u7A3F\u8BA1\u5212 \u2014 ${date5}`,
|
|
22332
|
+
body: renderPlanMarkdown(docs, date5),
|
|
22329
22333
|
format: "markdown",
|
|
22330
22334
|
metadata: {
|
|
22331
22335
|
generator: "kk:episode-plan",
|
|
22332
|
-
date:
|
|
22336
|
+
date: date5,
|
|
22333
22337
|
doc_count: docs.length,
|
|
22334
22338
|
docs
|
|
22335
22339
|
}
|
|
@@ -22349,7 +22353,7 @@ function resolvePlanDate() {
|
|
|
22349
22353
|
var MECE_CATEGORIES = ["ai-news", "ai-technical", "ai-research", "ai-industry", "non-ai"];
|
|
22350
22354
|
var QC_DIMENSIONS = ["quality", "importance", "urgency", "impact"];
|
|
22351
22355
|
var DEFAULT_FILTER_CONFIG = {
|
|
22352
|
-
categories: ["ai-news", "ai-industry"],
|
|
22356
|
+
categories: ["ai-news", "ai-technical", "ai-research", "ai-industry"],
|
|
22353
22357
|
minQuality: 2,
|
|
22354
22358
|
minImportance: 3,
|
|
22355
22359
|
minUrgency: 2,
|
|
@@ -22443,8 +22447,10 @@ async function processGeneratorIO(inputPath, outputPath, mode = "plan") {
|
|
|
22443
22447
|
}
|
|
22444
22448
|
async function processPlanIO(inputPath, outputPath) {
|
|
22445
22449
|
const docs = DocListSchema.parse(await readJsonFile(inputPath));
|
|
22446
|
-
const
|
|
22450
|
+
const audit = [];
|
|
22451
|
+
const content = docsToContent(docs, resolvePlanDate(), audit);
|
|
22447
22452
|
await atomicWrite(outputPath, content);
|
|
22453
|
+
await atomicWrite(planAuditOutPath(outputPath), { date: resolvePlanDate(), total: docs.length, rows: audit });
|
|
22448
22454
|
return content;
|
|
22449
22455
|
}
|
|
22450
22456
|
async function processFilterIO(inputPath, outputPath) {
|
|
@@ -22494,6 +22500,7 @@ export {
|
|
|
22494
22500
|
processGeneratorIO,
|
|
22495
22501
|
planScore,
|
|
22496
22502
|
planEpisode,
|
|
22503
|
+
planAuditOutPath,
|
|
22497
22504
|
normalizeUrl,
|
|
22498
22505
|
main2 as main,
|
|
22499
22506
|
filterConfigFromEnv,
|