@social-data/social-neuron-subscription 1.0.0-beta.1 → 1.0.0-beta.10

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/bin/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- // ⚠️ 本文件由 backend/app/cli_spec/gen.py 生成,请勿手改;要改改 gen.py 的 _CLI_JS 后重跑 gen。
4
+ // ⚠️ 本文件由 core/cli/gen.py 生成,请勿手改;要改改 gen.py 的 _CLI_JS 后重跑 gen。
5
5
  //
6
6
  // 能力 CLI —— 通用薄运行时(纯 JS,零依赖):一能力一命令、一包、一配置文件,互不影响。
7
7
  // <cmd> <action> [--flags] 调用一条命令
@@ -40,7 +40,11 @@ function resolveConfig() {
40
40
 
41
41
  function emit(env) {
42
42
  process.stdout.write(JSON.stringify(env) + "\n");
43
- process.exit(env.ok ? 0 : (EXIT[env.error && env.error.type] ?? 1));
43
+ const dataExit = env.ok && env.data && env.data.meta && env.data.meta.exit_code;
44
+ const status = env.ok
45
+ ? ([0, 1, 2].includes(dataExit) ? dataExit : 0)
46
+ : (EXIT[env.error && env.error.type] ?? 1);
47
+ process.exit(status);
44
48
  }
45
49
  function fail(type, code, message, extra) {
46
50
  emit({ ok: false, error: { type, code, message, ...(extra || {}) } });
@@ -167,7 +171,8 @@ function parseArgs(cmd, argv) {
167
171
  }
168
172
 
169
173
  async function main() {
170
- const argv = process.argv.slice(2);
174
+ let argv = process.argv.slice(2);
175
+ if (argv.length === 0 && MANIFEST.default_action) argv = [MANIFEST.default_action];
171
176
  if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") return printHelp();
172
177
  if (argv[0] === "--version" || argv[0] === "-V") { process.stdout.write(VERSION + "\n"); return; }
173
178
  if (argv[0] === "bind") return doBind(argv.slice(1));
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
 
4
- // ⚠️ 本文件由 backend/app/cli_spec/gen.py 生成,请勿手改。
4
+ // ⚠️ 本文件由 core/cli/gen.py 生成,请勿手改。
5
5
  // postinstall:把包内 SKILL.md 覆盖写到 OpenClaw 技能目录(OPENCLAW_SKILLS_DIR 或 ~/.openclaw/skills)。
6
6
 
7
7
  const fs = require("fs");
package/manifest.json CHANGED
@@ -2,6 +2,7 @@
2
2
  "revision": 6,
3
3
  "capability": "subscription",
4
4
  "command": "social-neuron-subscription",
5
+ "default_action": null,
5
6
  "mcp_path": "/subscription/mcp",
6
7
  "tools": [
7
8
  {
@@ -84,7 +85,7 @@
84
85
  },
85
86
  "SftpTarget": {
86
87
  "additionalProperties": false,
87
- "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。",
88
+ "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。\n目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task\n重跑多少次,远端路径与文件名都不变。",
88
89
  "properties": {
89
90
  "type": {
90
91
  "const": "sftp",
@@ -114,10 +115,23 @@
114
115
  "type": "string"
115
116
  },
116
117
  "remote_path": {
117
- "description": "远端目录/路径",
118
+ "description": "远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。",
118
119
  "title": "Remote Path",
119
120
  "type": "string"
120
121
  },
122
+ "filename_template": {
123
+ "anyOf": [
124
+ {
125
+ "type": "string"
126
+ },
127
+ {
128
+ "type": "null"
129
+ }
130
+ ],
131
+ "default": null,
132
+ "description": "自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。",
133
+ "title": "Filename Template"
134
+ },
121
135
  "format": {
122
136
  "default": "json",
123
137
  "description": "文件格式:csv/excel/json(默认 json)",
@@ -144,7 +158,7 @@
144
158
  "additionalProperties": false,
145
159
  "properties": {
146
160
  "name": {
147
- "description": "job 名称,全局唯一",
161
+ "description": "job 名称,同一凭证(token)下唯一",
148
162
  "maxLength": 128,
149
163
  "minLength": 1,
150
164
  "title": "Name",
@@ -171,15 +185,39 @@
171
185
  "type": "array"
172
186
  },
173
187
  "published": {
174
- "description": "发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天到昨天)",
175
- "enum": [
176
- "T-0",
177
- "T-1",
178
- "T-7"
179
- ],
188
+ "description": "**发布时间**口径(必填,主口径 —— 它同时决定查哪个月的索引、怎么拆分片,所以不能缺省)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
189
+ "pattern": "^T-\\d+~T-\\d+$",
180
190
  "title": "Published",
181
191
  "type": "string"
182
192
  },
193
+ "idate": {
194
+ "anyOf": [
195
+ {
196
+ "pattern": "^T-\\d+~T-\\d+$",
197
+ "type": "string"
198
+ },
199
+ {
200
+ "type": "null"
201
+ }
202
+ ],
203
+ "default": null,
204
+ "description": "**入库时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:入库时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
205
+ "title": "Idate"
206
+ },
207
+ "udate": {
208
+ "anyOf": [
209
+ {
210
+ "pattern": "^T-\\d+~T-\\d+$",
211
+ "type": "string"
212
+ },
213
+ {
214
+ "type": "null"
215
+ }
216
+ ],
217
+ "default": null,
218
+ "description": "**更新时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:更新时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
219
+ "title": "Udate"
220
+ },
183
221
  "frequency": {
184
222
  "description": "自然语言同步频率,系统转 cron(东八区)。可指定具体时间、并**支持一天多次**:如「每天9点」「每天9点和15点」(一天跑两次)「每周一9点」「每小时」「每30分钟」。无法解析为 cron 会被拒绝。",
185
223
  "maxLength": 64,
@@ -196,6 +234,14 @@
196
234
  "title": "Fields",
197
235
  "type": "array"
198
236
  },
237
+ "size": {
238
+ "default": 500000,
239
+ "description": "每次执行最多导出的记录行数,默认且最大为 500000",
240
+ "maximum": 500000,
241
+ "minimum": 1,
242
+ "title": "Size",
243
+ "type": "integer"
244
+ },
199
245
  "target": {
200
246
  "anyOf": [
201
247
  {
@@ -224,7 +270,7 @@
224
270
  }
225
271
  ],
226
272
  "default": null,
227
- "description": "投递目标;省略默认 octo(excel)。本期仅接受 octo",
273
+ "description": "投递目标;省略默认 octo(json)。本期支持 octo(上传存储→CDN url)与 sftp(账密上传远端,路径/文件名可用日期变量);kafka: 暂未实现。",
228
274
  "title": "Target"
229
275
  }
230
276
  },
@@ -240,15 +286,15 @@
240
286
  },
241
287
  "output_schema": {
242
288
  "additionalProperties": false,
243
- "description": "订阅 job 出参对象(= sub_job 全字段,id 暴露为 job_id)。",
289
+ "description": "订阅 job 出参对象。",
244
290
  "properties": {
245
291
  "job_id": {
246
- "description": "job ID(sub_job.id)",
292
+ "description": "job ID",
247
293
  "title": "Job Id",
248
294
  "type": "integer"
249
295
  },
250
296
  "name": {
251
- "description": "job 名称,全局唯一",
297
+ "description": "job 名称,同一凭证(token)下唯一",
252
298
  "title": "Name",
253
299
  "type": "string"
254
300
  },
@@ -269,10 +315,34 @@
269
315
  "type": "array"
270
316
  },
271
317
  "published": {
272
- "description": "发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天)",
318
+ "description": "发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间",
273
319
  "title": "Published",
274
320
  "type": "string"
275
321
  },
322
+ "idate": {
323
+ "anyOf": [
324
+ {
325
+ "type": "string"
326
+ },
327
+ {
328
+ "type": "null"
329
+ }
330
+ ],
331
+ "description": "入库时间口径(相对,T-M~T-N);null=该维度不过滤",
332
+ "title": "Idate"
333
+ },
334
+ "udate": {
335
+ "anyOf": [
336
+ {
337
+ "type": "string"
338
+ },
339
+ {
340
+ "type": "null"
341
+ }
342
+ ],
343
+ "description": "更新时间口径(相对,T-M~T-N);null=该维度不过滤",
344
+ "title": "Udate"
345
+ },
276
346
  "fields": {
277
347
  "description": "拉取/导出字段(空=全量)",
278
348
  "items": {
@@ -281,6 +351,11 @@
281
351
  "title": "Fields",
282
352
  "type": "array"
283
353
  },
354
+ "size": {
355
+ "description": "每次执行最多导出的记录行数,范围 1–500000",
356
+ "title": "Size",
357
+ "type": "integer"
358
+ },
284
359
  "frequency": {
285
360
  "description": "自然语言频率",
286
361
  "title": "Frequency",
@@ -292,7 +367,7 @@
292
367
  "type": "string"
293
368
  },
294
369
  "target_type": {
295
- "description": "投递类型:octo(本期)/sftp/kafka",
370
+ "description": "投递类型:octo、sftp、kafka(暂不支持)",
296
371
  "title": "Target Type",
297
372
  "type": "string"
298
373
  },
@@ -324,7 +399,10 @@
324
399
  "rule_ids",
325
400
  "source",
326
401
  "published",
402
+ "idate",
403
+ "udate",
327
404
  "fields",
405
+ "size",
328
406
  "frequency",
329
407
  "cron",
330
408
  "target_type",
@@ -342,7 +420,7 @@
342
420
  "field": "name",
343
421
  "type": "string",
344
422
  "required": true,
345
- "desc": "job 名称,全局唯一"
423
+ "desc": "job 名称,同一凭证(token)下唯一"
346
424
  },
347
425
  {
348
426
  "flag": "--rule-ids",
@@ -361,9 +439,23 @@
361
439
  {
362
440
  "flag": "--published",
363
441
  "field": "published",
364
- "type": "enum(T-0、T-1、T-7)",
442
+ "type": "string",
365
443
  "required": true,
366
- "desc": "发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天到昨天)"
444
+ "desc": "**发布时间**口径(必填,主口径 —— 它同时决定查哪个月的索引、怎么拆分片,所以不能缺省)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
445
+ },
446
+ {
447
+ "flag": "--idate",
448
+ "field": "idate",
449
+ "type": "string",
450
+ "required": false,
451
+ "desc": "**入库时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:入库时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
452
+ },
453
+ {
454
+ "flag": "--udate",
455
+ "field": "udate",
456
+ "type": "string",
457
+ "required": false,
458
+ "desc": "**更新时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:更新时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
367
459
  },
368
460
  {
369
461
  "flag": "--frequency",
@@ -379,12 +471,19 @@
379
471
  "required": false,
380
472
  "desc": "拉取/导出字段;不填拉全量"
381
473
  },
474
+ {
475
+ "flag": "--size",
476
+ "field": "size",
477
+ "type": "integer",
478
+ "required": false,
479
+ "desc": "每次执行最多导出的记录行数,默认且最大为 500000"
480
+ },
382
481
  {
383
482
  "flag": "--target",
384
483
  "field": "target",
385
484
  "type": "object(json)",
386
485
  "required": false,
387
- "desc": "投递目标;省略默认 octo(excel)。本期仅接受 octo"
486
+ "desc": "投递目标;省略默认 octo(json)。本期支持 octo(上传存储→CDN url)与 sftp(账密上传远端,路径/文件名可用日期变量);kafka: 暂未实现。"
388
487
  }
389
488
  ],
390
489
  "transport": {
@@ -498,15 +597,15 @@
498
597
  "$defs": {
499
598
  "SubJob": {
500
599
  "additionalProperties": false,
501
- "description": "订阅 job 出参对象(= sub_job 全字段,id 暴露为 job_id)。",
600
+ "description": "订阅 job 出参对象。",
502
601
  "properties": {
503
602
  "job_id": {
504
- "description": "job ID(sub_job.id)",
603
+ "description": "job ID",
505
604
  "title": "Job Id",
506
605
  "type": "integer"
507
606
  },
508
607
  "name": {
509
- "description": "job 名称,全局唯一",
608
+ "description": "job 名称,同一凭证(token)下唯一",
510
609
  "title": "Name",
511
610
  "type": "string"
512
611
  },
@@ -527,10 +626,34 @@
527
626
  "type": "array"
528
627
  },
529
628
  "published": {
530
- "description": "发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天)",
629
+ "description": "发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间",
531
630
  "title": "Published",
532
631
  "type": "string"
533
632
  },
633
+ "idate": {
634
+ "anyOf": [
635
+ {
636
+ "type": "string"
637
+ },
638
+ {
639
+ "type": "null"
640
+ }
641
+ ],
642
+ "description": "入库时间口径(相对,T-M~T-N);null=该维度不过滤",
643
+ "title": "Idate"
644
+ },
645
+ "udate": {
646
+ "anyOf": [
647
+ {
648
+ "type": "string"
649
+ },
650
+ {
651
+ "type": "null"
652
+ }
653
+ ],
654
+ "description": "更新时间口径(相对,T-M~T-N);null=该维度不过滤",
655
+ "title": "Udate"
656
+ },
534
657
  "fields": {
535
658
  "description": "拉取/导出字段(空=全量)",
536
659
  "items": {
@@ -539,6 +662,11 @@
539
662
  "title": "Fields",
540
663
  "type": "array"
541
664
  },
665
+ "size": {
666
+ "description": "每次执行最多导出的记录行数,范围 1–500000",
667
+ "title": "Size",
668
+ "type": "integer"
669
+ },
542
670
  "frequency": {
543
671
  "description": "自然语言频率",
544
672
  "title": "Frequency",
@@ -550,7 +678,7 @@
550
678
  "type": "string"
551
679
  },
552
680
  "target_type": {
553
- "description": "投递类型:octo(本期)/sftp/kafka",
681
+ "description": "投递类型:octo、sftp、kafka(暂不支持)",
554
682
  "title": "Target Type",
555
683
  "type": "string"
556
684
  },
@@ -582,7 +710,10 @@
582
710
  "rule_ids",
583
711
  "source",
584
712
  "published",
713
+ "idate",
714
+ "udate",
585
715
  "fields",
716
+ "size",
586
717
  "frequency",
587
718
  "cron",
588
719
  "target_type",
@@ -644,8 +775,8 @@
644
775
  "action": "job-trigger",
645
776
  "op": "job_trigger",
646
777
  "name": "subscription/job_trigger",
647
- "summary": "临时触发一次本人 job,落一条 sub_task(manual);默认用 job 存的 target,可覆盖。",
648
- "description": "临时触发一次本人 job,落一条 sub_task(manual);默认用 job 存的 target,可覆盖。\n\n落 pending task 后触发 Airflow DAG(``social_neuron_subscription``)跑取数→组装→投递(上传取 url);\n未配 airflow_base_url 时(本地/测试)触发被跳过,仅留 pending task。**无通知**:结果落\n``file_info.url``,调用方轮询 ``task-list`` 拉取。",
778
+ "summary": "临时触发一次本人 job,落一条 ik_subscription_task(manual);默认用 job 存的 target,可覆盖。",
779
+ "description": "临时触发一次本人 job,落一条 ik_subscription_task(manual);默认用 job 存的 target,可覆盖。\n\n落 pending task 后触发 Airflow DAG(``social_neuron_subscription``)跑取数→组装→投递(上传取 url);\n未配 airflow_base_url 时(本地/测试)触发被跳过,仅留 pending task。**无通知**:结果落\n``file_info.url``,调用方轮询 ``task-list`` 拉取。",
649
780
  "input_schema": {
650
781
  "$defs": {
651
782
  "KafkaTarget": {
@@ -720,7 +851,7 @@
720
851
  },
721
852
  "SftpTarget": {
722
853
  "additionalProperties": false,
723
- "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。",
854
+ "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。\n目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task\n重跑多少次,远端路径与文件名都不变。",
724
855
  "properties": {
725
856
  "type": {
726
857
  "const": "sftp",
@@ -750,10 +881,23 @@
750
881
  "type": "string"
751
882
  },
752
883
  "remote_path": {
753
- "description": "远端目录/路径",
884
+ "description": "远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。",
754
885
  "title": "Remote Path",
755
886
  "type": "string"
756
887
  },
888
+ "filename_template": {
889
+ "anyOf": [
890
+ {
891
+ "type": "string"
892
+ },
893
+ {
894
+ "type": "null"
895
+ }
896
+ ],
897
+ "default": null,
898
+ "description": "自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。",
899
+ "title": "Filename Template"
900
+ },
757
901
  "format": {
758
902
  "default": "json",
759
903
  "description": "文件格式:csv/excel/json(默认 json)",
@@ -787,6 +931,7 @@
787
931
  "start_time": {
788
932
  "anyOf": [
789
933
  {
934
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
790
935
  "type": "string"
791
936
  },
792
937
  {
@@ -794,12 +939,13 @@
794
939
  }
795
940
  ],
796
941
  "default": null,
797
- "description": "回溯起始;与 end_time 同传同不传",
942
+ "description": "**发布时间**下界(绝对日期 yyyy-MM-dd,东八区,按天闭区间,不含时分秒);与 end_time 同传同不传;不传则按 job 上的 published 相对口径折算",
798
943
  "title": "Start Time"
799
944
  },
800
945
  "end_time": {
801
946
  "anyOf": [
802
947
  {
948
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
803
949
  "type": "string"
804
950
  },
805
951
  {
@@ -807,9 +953,65 @@
807
953
  }
808
954
  ],
809
955
  "default": null,
810
- "description": "回溯结束",
956
+ "description": "**发布时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)",
811
957
  "title": "End Time"
812
958
  },
959
+ "idate_start": {
960
+ "anyOf": [
961
+ {
962
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
963
+ "type": "string"
964
+ },
965
+ {
966
+ "type": "null"
967
+ }
968
+ ],
969
+ "default": null,
970
+ "description": "**入库时间**下界(绝对日期 yyyy-MM-dd,东八区);与 idate_end 同传同不传;不传则按 job 上的 idate 相对口径折算,job 也没配=该维度不过滤",
971
+ "title": "Idate Start"
972
+ },
973
+ "idate_end": {
974
+ "anyOf": [
975
+ {
976
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
977
+ "type": "string"
978
+ },
979
+ {
980
+ "type": "null"
981
+ }
982
+ ],
983
+ "default": null,
984
+ "description": "本次**入库时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)",
985
+ "title": "Idate End"
986
+ },
987
+ "udate_start": {
988
+ "anyOf": [
989
+ {
990
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
991
+ "type": "string"
992
+ },
993
+ {
994
+ "type": "null"
995
+ }
996
+ ],
997
+ "default": null,
998
+ "description": "**更新时间**下界(绝对日期 yyyy-MM-dd,东八区);与 udate_end 同传同不传;不传则按 job 上的 udate 相对口径折算,job 也没配=该维度不过滤",
999
+ "title": "Udate Start"
1000
+ },
1001
+ "udate_end": {
1002
+ "anyOf": [
1003
+ {
1004
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
1005
+ "type": "string"
1006
+ },
1007
+ {
1008
+ "type": "null"
1009
+ }
1010
+ ],
1011
+ "default": null,
1012
+ "description": "**更新时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)",
1013
+ "title": "Udate End"
1014
+ },
813
1015
  "target": {
814
1016
  "anyOf": [
815
1017
  {
@@ -840,6 +1042,21 @@
840
1042
  "default": null,
841
1043
  "description": "覆盖本次投递目标",
842
1044
  "title": "Target"
1045
+ },
1046
+ "size": {
1047
+ "anyOf": [
1048
+ {
1049
+ "maximum": 500000,
1050
+ "minimum": 1,
1051
+ "type": "integer"
1052
+ },
1053
+ {
1054
+ "type": "null"
1055
+ }
1056
+ ],
1057
+ "default": null,
1058
+ "description": "覆盖本次导出行数;不传则继承 job 的 size,最大 500000",
1059
+ "title": "Size"
843
1060
  }
844
1061
  },
845
1062
  "required": [
@@ -882,14 +1099,42 @@
882
1099
  "field": "start_time",
883
1100
  "type": "string",
884
1101
  "required": false,
885
- "desc": "回溯起始;与 end_time 同传同不传"
1102
+ "desc": "**发布时间**下界(绝对日期 yyyy-MM-dd,东八区,按天闭区间,不含时分秒);与 end_time 同传同不传;不传则按 job 上的 published 相对口径折算"
886
1103
  },
887
1104
  {
888
1105
  "flag": "--end-time",
889
1106
  "field": "end_time",
890
1107
  "type": "string",
891
1108
  "required": false,
892
- "desc": "回溯结束"
1109
+ "desc": "**发布时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)"
1110
+ },
1111
+ {
1112
+ "flag": "--idate-start",
1113
+ "field": "idate_start",
1114
+ "type": "string",
1115
+ "required": false,
1116
+ "desc": "**入库时间**下界(绝对日期 yyyy-MM-dd,东八区);与 idate_end 同传同不传;不传则按 job 上的 idate 相对口径折算,job 也没配=该维度不过滤"
1117
+ },
1118
+ {
1119
+ "flag": "--idate-end",
1120
+ "field": "idate_end",
1121
+ "type": "string",
1122
+ "required": false,
1123
+ "desc": "本次**入库时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)"
1124
+ },
1125
+ {
1126
+ "flag": "--udate-start",
1127
+ "field": "udate_start",
1128
+ "type": "string",
1129
+ "required": false,
1130
+ "desc": "**更新时间**下界(绝对日期 yyyy-MM-dd,东八区);与 udate_end 同传同不传;不传则按 job 上的 udate 相对口径折算,job 也没配=该维度不过滤"
1131
+ },
1132
+ {
1133
+ "flag": "--udate-end",
1134
+ "field": "udate_end",
1135
+ "type": "string",
1136
+ "required": false,
1137
+ "desc": "**更新时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内)"
893
1138
  },
894
1139
  {
895
1140
  "flag": "--target",
@@ -897,6 +1142,13 @@
897
1142
  "type": "object(json)",
898
1143
  "required": false,
899
1144
  "desc": "覆盖本次投递目标"
1145
+ },
1146
+ {
1147
+ "flag": "--size",
1148
+ "field": "size",
1149
+ "type": "integer",
1150
+ "required": false,
1151
+ "desc": "覆盖本次导出行数;不传则继承 job 的 size,最大 500000"
900
1152
  }
901
1153
  ],
902
1154
  "transport": {
@@ -992,7 +1244,7 @@
992
1244
  },
993
1245
  "SftpTarget": {
994
1246
  "additionalProperties": false,
995
- "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。",
1247
+ "description": "sftp(本期):把导出文件上传到 SFTP 远端目录。\n目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task\n重跑多少次,远端路径与文件名都不变。",
996
1248
  "properties": {
997
1249
  "type": {
998
1250
  "const": "sftp",
@@ -1022,10 +1274,23 @@
1022
1274
  "type": "string"
1023
1275
  },
1024
1276
  "remote_path": {
1025
- "description": "远端目录/路径",
1277
+ "description": "远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。",
1026
1278
  "title": "Remote Path",
1027
1279
  "type": "string"
1028
1280
  },
1281
+ "filename_template": {
1282
+ "anyOf": [
1283
+ {
1284
+ "type": "string"
1285
+ },
1286
+ {
1287
+ "type": "null"
1288
+ }
1289
+ ],
1290
+ "default": null,
1291
+ "description": "自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。",
1292
+ "title": "Filename Template"
1293
+ },
1029
1294
  "format": {
1030
1295
  "default": "json",
1031
1296
  "description": "文件格式:csv/excel/json(默认 json)",
@@ -1068,7 +1333,7 @@
1068
1333
  }
1069
1334
  ],
1070
1335
  "default": null,
1071
- "description": "新名称(全局唯一)",
1336
+ "description": "新名称(同一凭证下唯一)",
1072
1337
  "title": "Name"
1073
1338
  },
1074
1339
  "rule_ids": {
@@ -1110,11 +1375,7 @@
1110
1375
  "published": {
1111
1376
  "anyOf": [
1112
1377
  {
1113
- "enum": [
1114
- "T-0",
1115
- "T-1",
1116
- "T-7"
1117
- ],
1378
+ "pattern": "^T-\\d+~T-\\d+$",
1118
1379
  "type": "string"
1119
1380
  },
1120
1381
  {
@@ -1122,9 +1383,37 @@
1122
1383
  }
1123
1384
  ],
1124
1385
  "default": null,
1125
- "description": "发布时间口径:T-0 / T-1 / T-7",
1386
+ "description": "**发布时间**口径(必填字段,只能改不能清)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
1126
1387
  "title": "Published"
1127
1388
  },
1389
+ "idate": {
1390
+ "anyOf": [
1391
+ {
1392
+ "pattern": "^(?:T-\\d+~T-\\d+)?$",
1393
+ "type": "string"
1394
+ },
1395
+ {
1396
+ "type": "null"
1397
+ }
1398
+ ],
1399
+ "default": null,
1400
+ "description": "**入库时间**口径。不传=不改;传空串 \"\"=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
1401
+ "title": "Idate"
1402
+ },
1403
+ "udate": {
1404
+ "anyOf": [
1405
+ {
1406
+ "pattern": "^(?:T-\\d+~T-\\d+)?$",
1407
+ "type": "string"
1408
+ },
1409
+ {
1410
+ "type": "null"
1411
+ }
1412
+ ],
1413
+ "default": null,
1414
+ "description": "**更新时间**口径。不传=不改;传空串 \"\"=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。",
1415
+ "title": "Udate"
1416
+ },
1128
1417
  "fields": {
1129
1418
  "anyOf": [
1130
1419
  {
@@ -1142,6 +1431,21 @@
1142
1431
  "description": "整组全量覆盖",
1143
1432
  "title": "Fields"
1144
1433
  },
1434
+ "size": {
1435
+ "anyOf": [
1436
+ {
1437
+ "maximum": 500000,
1438
+ "minimum": 1,
1439
+ "type": "integer"
1440
+ },
1441
+ {
1442
+ "type": "null"
1443
+ }
1444
+ ],
1445
+ "default": null,
1446
+ "description": "每次执行最多导出的记录行数;不传则不修改,最大 500000",
1447
+ "title": "Size"
1448
+ },
1145
1449
  "frequency": {
1146
1450
  "anyOf": [
1147
1451
  {
@@ -1214,15 +1518,15 @@
1214
1518
  },
1215
1519
  "output_schema": {
1216
1520
  "additionalProperties": false,
1217
- "description": "订阅 job 出参对象(= sub_job 全字段,id 暴露为 job_id)。",
1521
+ "description": "订阅 job 出参对象。",
1218
1522
  "properties": {
1219
1523
  "job_id": {
1220
- "description": "job ID(sub_job.id)",
1524
+ "description": "job ID",
1221
1525
  "title": "Job Id",
1222
1526
  "type": "integer"
1223
1527
  },
1224
1528
  "name": {
1225
- "description": "job 名称,全局唯一",
1529
+ "description": "job 名称,同一凭证(token)下唯一",
1226
1530
  "title": "Name",
1227
1531
  "type": "string"
1228
1532
  },
@@ -1243,10 +1547,34 @@
1243
1547
  "type": "array"
1244
1548
  },
1245
1549
  "published": {
1246
- "description": "发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天)",
1550
+ "description": "发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间",
1247
1551
  "title": "Published",
1248
1552
  "type": "string"
1249
1553
  },
1554
+ "idate": {
1555
+ "anyOf": [
1556
+ {
1557
+ "type": "string"
1558
+ },
1559
+ {
1560
+ "type": "null"
1561
+ }
1562
+ ],
1563
+ "description": "入库时间口径(相对,T-M~T-N);null=该维度不过滤",
1564
+ "title": "Idate"
1565
+ },
1566
+ "udate": {
1567
+ "anyOf": [
1568
+ {
1569
+ "type": "string"
1570
+ },
1571
+ {
1572
+ "type": "null"
1573
+ }
1574
+ ],
1575
+ "description": "更新时间口径(相对,T-M~T-N);null=该维度不过滤",
1576
+ "title": "Udate"
1577
+ },
1250
1578
  "fields": {
1251
1579
  "description": "拉取/导出字段(空=全量)",
1252
1580
  "items": {
@@ -1255,6 +1583,11 @@
1255
1583
  "title": "Fields",
1256
1584
  "type": "array"
1257
1585
  },
1586
+ "size": {
1587
+ "description": "每次执行最多导出的记录行数,范围 1–500000",
1588
+ "title": "Size",
1589
+ "type": "integer"
1590
+ },
1258
1591
  "frequency": {
1259
1592
  "description": "自然语言频率",
1260
1593
  "title": "Frequency",
@@ -1266,7 +1599,7 @@
1266
1599
  "type": "string"
1267
1600
  },
1268
1601
  "target_type": {
1269
- "description": "投递类型:octo(本期)/sftp/kafka",
1602
+ "description": "投递类型:octo、sftp、kafka(暂不支持)",
1270
1603
  "title": "Target Type",
1271
1604
  "type": "string"
1272
1605
  },
@@ -1298,7 +1631,10 @@
1298
1631
  "rule_ids",
1299
1632
  "source",
1300
1633
  "published",
1634
+ "idate",
1635
+ "udate",
1301
1636
  "fields",
1637
+ "size",
1302
1638
  "frequency",
1303
1639
  "cron",
1304
1640
  "target_type",
@@ -1323,7 +1659,7 @@
1323
1659
  "field": "name",
1324
1660
  "type": "string",
1325
1661
  "required": false,
1326
- "desc": "新名称(全局唯一)"
1662
+ "desc": "新名称(同一凭证下唯一)"
1327
1663
  },
1328
1664
  {
1329
1665
  "flag": "--rule-ids",
@@ -1342,9 +1678,23 @@
1342
1678
  {
1343
1679
  "flag": "--published",
1344
1680
  "field": "published",
1345
- "type": "enum(T-0、T-1、T-7)",
1681
+ "type": "string",
1682
+ "required": false,
1683
+ "desc": "**发布时间**口径(必填字段,只能改不能清)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
1684
+ },
1685
+ {
1686
+ "flag": "--idate",
1687
+ "field": "idate",
1688
+ "type": "string",
1346
1689
  "required": false,
1347
- "desc": "发布时间口径:T-0 / T-1 / T-7"
1690
+ "desc": "**入库时间**口径。不传=不改;传空串 \"\"=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
1691
+ },
1692
+ {
1693
+ "flag": "--udate",
1694
+ "field": "udate",
1695
+ "type": "string",
1696
+ "required": false,
1697
+ "desc": "**更新时间**口径。不传=不改;传空串 \"\"=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。"
1348
1698
  },
1349
1699
  {
1350
1700
  "flag": "--fields",
@@ -1353,6 +1703,13 @@
1353
1703
  "required": false,
1354
1704
  "desc": "整组全量覆盖"
1355
1705
  },
1706
+ {
1707
+ "flag": "--size",
1708
+ "field": "size",
1709
+ "type": "integer",
1710
+ "required": false,
1711
+ "desc": "每次执行最多导出的记录行数;不传则不修改,最大 500000"
1712
+ },
1356
1713
  {
1357
1714
  "flag": "--frequency",
1358
1715
  "field": "frequency",
@@ -1497,10 +1854,10 @@
1497
1854
  "$defs": {
1498
1855
  "SubTask": {
1499
1856
  "additionalProperties": false,
1500
- "description": "订阅 task 出参对象(**对外精简**:只给调用方轮询/下载所需;其余字段仅存 sub_task 表供排查)。",
1857
+ "description": "订阅 task 出参对象(**对外精简**:只给调用方轮询/下载所需)。",
1501
1858
  "properties": {
1502
1859
  "task_id": {
1503
- "description": "task ID(sub_task.id)",
1860
+ "description": "task ID",
1504
1861
  "title": "Task Id",
1505
1862
  "type": "integer"
1506
1863
  },
@@ -1509,6 +1866,11 @@
1509
1866
  "title": "Job Id",
1510
1867
  "type": "integer"
1511
1868
  },
1869
+ "size": {
1870
+ "description": "本次执行最多导出的记录行数",
1871
+ "title": "Size",
1872
+ "type": "integer"
1873
+ },
1512
1874
  "status": {
1513
1875
  "description": "pending/running/success/failed/terminated",
1514
1876
  "title": "Status",
@@ -1555,6 +1917,7 @@
1555
1917
  "required": [
1556
1918
  "task_id",
1557
1919
  "job_id",
1920
+ "size",
1558
1921
  "status",
1559
1922
  "created_at",
1560
1923
  "updated_at"
@@ -1660,7 +2023,7 @@
1660
2023
  ],
1661
2024
  "skill": {
1662
2025
  "slug": "social-neuron-subscription",
1663
- "description": "使用场景:定时导出/订阅推送/定期拉数/大批量出文件——需异步产出文件并下载时用能力:按魔方规则、定时 cron 或手动触发,把大库数据异步导出为文件,上传 octo/sftp,产出下载 url 供调用方轮询拉取;可创建/修改/列出/删除/触发订阅 job、翻页查询 task。概念:job=订阅定义(数据范围+频率+投递方式,系统按频率生成 cron);task=job 的一次执行,产物与下载地址落在 file_info。边界:①每 token 生效 job 默认≤10;②单次拉数≤10 万行,超出截断;③投递仅 octo/sftp(kafka 规划中,暂不支持),无主动通知、须轮询 task 取结果。",
2026
+ "description": "使用场景:定时导出/订阅推送/定期拉数/大批量出文件——需异步产出文件并下载时用能力:按魔方规则、定时 cron 或手动触发,把大库数据异步导出为文件,上传 octo/sftp,产出下载 url 供调用方轮询拉取;可创建/修改/列出/删除/触发订阅 job、翻页查询 task。概念:job=订阅定义(数据范围+频率+投递方式,系统按频率生成 cron);task=job 的一次执行,产物与下载地址落在 file_info。边界:①每 token 生效 job 默认≤10;②单次拉数可指定 size,默认且最大 50 万行,超出截断;③投递仅 octo/sftp(kafka 规划中,暂不支持),无主动通知、须轮询 task 取结果。④如果拉取不到数据则不会产生文件上传,也就没有文件url信息",
1664
2027
  "actions": [
1665
2028
  "job-create",
1666
2029
  "job-delete",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-data/social-neuron-subscription",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.10",
4
4
  "description": "Social Neuron subscription 能力 CLI —— 一能力一命令(social-neuron-subscription),薄客户端直达 /subscription/{op}。",
5
5
  "bin": {
6
6
  "social-neuron-subscription": "bin/cli.js"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: social-neuron-subscription
3
- description: "使用场景:定时导出/订阅推送/定期拉数/大批量出文件——需异步产出文件并下载时用能力:按魔方规则、定时 cron 或手动触发,把大库数据异步导出为文件,上传 octo/sftp,产出下载 url 供调用方轮询拉取;可创建/修改/列出/删除/触发订阅 job、翻页查询 task。概念:job=订阅定义(数据范围+频率+投递方式,系统按频率生成 cron);task=job 的一次执行,产物与下载地址落在 file_info。边界:①每 token 生效 job 默认≤10;②单次拉数≤10 万行,超出截断;③投递仅 octo/sftp(kafka 规划中,暂不支持),无主动通知、须轮询 task 取结果。"
3
+ description: "使用场景:定时导出/订阅推送/定期拉数/大批量出文件——需异步产出文件并下载时用能力:按魔方规则、定时 cron 或手动触发,把大库数据异步导出为文件,上传 octo/sftp,产出下载 url 供调用方轮询拉取;可创建/修改/列出/删除/触发订阅 job、翻页查询 task。概念:job=订阅定义(数据范围+频率+投递方式,系统按频率生成 cron);task=job 的一次执行,产物与下载地址落在 file_info。边界:①每 token 生效 job 默认≤10;②单次拉数可指定 size,默认且最大 50 万行,超出截断;③投递仅 octo/sftp(kafka 规划中,暂不支持),无主动通知、须轮询 task 取结果。④如果拉取不到数据则不会产生文件上传,也就没有文件url信息"
4
4
  metadata:
5
5
  openclaw:
6
6
  requires: { bins: ['social-neuron-subscription'], skills: [] }
@@ -21,13 +21,16 @@ metadata:
21
21
 
22
22
  | flag | 字段 | 类型 | 必填 | 约束 | 说明 |
23
23
  |---|---|---|---|---|---|
24
- | --name | name | string | 是 | minLen=1, maxLen=128 | job 名称,全局唯一 |
24
+ | --name | name | string | 是 | minLen=1, maxLen=128 | job 名称,同一凭证(token)下唯一 |
25
25
  | --rule-ids | rule_ids | list[string] | 是 | minItems=1, minLen=1 | 魔方规则ID数组,至少 1 个 |
26
26
  | --source | source | list[string] | 是 | minItems=1, minLen=1 | 站点数组,至少 1 个;只能取已配置站点 |
27
- | --published | published | enum(T-0、T-1、T-7) | 是 | - | 发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天到昨天) |
27
+ | --published | published | string | 是 | - | **发布时间**口径(必填,主口径 —— 它同时决定查哪个月的索引、怎么拆分片,所以不能缺省)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
28
+ | --idate | idate | string | 否 | - | **入库时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:入库时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
29
+ | --udate | udate | string | 否 | - | **更新时间**口径(选填,不传=该维度不过滤)。在发布时间窗**之内**再 AND 一层:更新时间落在本区间的数据。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
28
30
  | --frequency | frequency | string | 是 | minLen=1, maxLen=64 | 自然语言同步频率,系统转 cron(东八区)。可指定具体时间、并**支持一天多次**:如「每天9点」「每天9点和15点」(一天跑两次)「每周一9点」「每小时」「每30分钟」。无法解析为 cron 会被拒绝。 |
29
31
  | --fields | fields | list[string] | 否 | minLen=1 | 拉取/导出字段;不填拉全量 |
30
- | --target | target | OctoTarget、SftpTarget、KafkaTarget | 否 | - | 投递目标;省略默认 octo(excel)。本期仅接受 octo |
32
+ | --size | size | integer | 否 | min=1, max=500000 | 每次执行最多导出的记录行数,默认且最大为 500000 |
33
+ | --target | target | OctoTarget、SftpTarget、KafkaTarget | 否 | - | 投递目标;省略默认 octo(json)。本期支持 octo(上传存储→CDN url)与 sftp(账密上传远端,路径/文件名可用日期变量);kafka: 暂未实现。 |
31
34
 
32
35
  **对象 `KafkaTarget`** —— kafka(规划):把记录流投送到 topic(无文件)。
33
36
 
@@ -46,6 +49,8 @@ metadata:
46
49
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
47
50
 
48
51
  **对象 `SftpTarget`** —— sftp(本期):把导出文件上传到 SFTP 远端目录。
52
+ 目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task
53
+ 重跑多少次,远端路径与文件名都不变。
49
54
 
50
55
  | 键 | 类型 | 必填 | 约束 | 说明 |
51
56
  |---|---|---|---|---|
@@ -54,22 +59,26 @@ metadata:
54
59
  | port | integer | 否 | - | 端口,默认 22 |
55
60
  | username | string | 是 | - | 登录用户名 |
56
61
  | password | string | 是 | - | 登录密码 |
57
- | remote_path | string | 是 | - | 远端目录/路径 |
62
+ | remote_path | string | 是 | - | 远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。 |
63
+ | filename_template | string | 否 | - | 自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。 |
58
64
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
59
65
 
60
66
  **出参 `SubJob`**
61
67
 
62
68
  | 字段 | 类型 | 必填 | 约束 | 说明 |
63
69
  |---|---|---|---|---|
64
- | job_id | integer | 是 | - | job ID(sub_job.id) |
65
- | name | string | 是 | - | job 名称,全局唯一 |
70
+ | job_id | integer | 是 | - | job ID |
71
+ | name | string | 是 | - | job 名称,同一凭证(token)下唯一 |
66
72
  | rule_ids | list[string] | 是 | - | 魔方规则ID数组 |
67
73
  | source | list[string] | 是 | - | 站点数组 |
68
- | published | string | 是 | - | 发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天) |
74
+ | published | string | 是 | - | 发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间 |
75
+ | idate | string | 是 | - | 入库时间口径(相对,T-M~T-N);null=该维度不过滤 |
76
+ | udate | string | 是 | - | 更新时间口径(相对,T-M~T-N);null=该维度不过滤 |
69
77
  | fields | list[string] | 是 | - | 拉取/导出字段(空=全量) |
78
+ | size | integer | 是 | - | 每次执行最多导出的记录行数,范围 1–500000 |
70
79
  | frequency | string | 是 | - | 自然语言频率 |
71
80
  | cron | string | 是 | - | 系统由 frequency 转换的 cron |
72
- | target_type | string | 是 | - | 投递类型:octo(本期)/sftp/kafka |
81
+ | target_type | string | 是 | - | 投递类型:octo、sftp、kafka(暂不支持) |
73
82
  | target_info | object | 是 | - | 投递配置 |
74
83
  | active | integer | 是 | - | 1 生效 / 0 停用 |
75
84
  | created_at | string | 是 | - | 创建时间(ISO8601,UTC+8) |
@@ -111,28 +120,31 @@ metadata:
111
120
  | items | list[SubJob] | 是 | - | 本人 job 列表,按创建时间倒序(全量) |
112
121
  | total | integer | 是 | - | 命中总数 |
113
122
 
114
- **对象 `SubJob`** —— 订阅 job 出参对象(= sub_job 全字段,id 暴露为 job_id)。
123
+ **对象 `SubJob`** —— 订阅 job 出参对象。
115
124
 
116
125
  | 键 | 类型 | 必填 | 约束 | 说明 |
117
126
  |---|---|---|---|---|
118
- | job_id | integer | 是 | - | job ID(sub_job.id) |
119
- | name | string | 是 | - | job 名称,全局唯一 |
127
+ | job_id | integer | 是 | - | job ID |
128
+ | name | string | 是 | - | job 名称,同一凭证(token)下唯一 |
120
129
  | rule_ids | list[string] | 是 | - | 魔方规则ID数组 |
121
130
  | source | list[string] | 是 | - | 站点数组 |
122
- | published | string | 是 | - | 发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天) |
131
+ | published | string | 是 | - | 发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间 |
132
+ | idate | string | 是 | - | 入库时间口径(相对,T-M~T-N);null=该维度不过滤 |
133
+ | udate | string | 是 | - | 更新时间口径(相对,T-M~T-N);null=该维度不过滤 |
123
134
  | fields | list[string] | 是 | - | 拉取/导出字段(空=全量) |
135
+ | size | integer | 是 | - | 每次执行最多导出的记录行数,范围 1–500000 |
124
136
  | frequency | string | 是 | - | 自然语言频率 |
125
137
  | cron | string | 是 | - | 系统由 frequency 转换的 cron |
126
- | target_type | string | 是 | - | 投递类型:octo(本期)/sftp/kafka |
138
+ | target_type | string | 是 | - | 投递类型:octo、sftp、kafka(暂不支持) |
127
139
  | target_info | object | 是 | - | 投递配置 |
128
140
  | active | integer | 是 | - | 1 生效 / 0 停用 |
129
141
  | created_at | string | 是 | - | 创建时间(ISO8601,UTC+8) |
130
142
  | updated_at | string | 是 | - | 更新时间(ISO8601,UTC+8) |
131
143
 
132
- 示例:social-neuron-subscription job-list
144
+ 示例:social-neuron-subscription job-list
133
145
 
134
146
  ### social-neuron-subscription job-trigger
135
- 临时触发一次本人 job,落一条 sub_task(manual);默认用 job 存的 target,可覆盖。
147
+ 临时触发一次本人 job,落一条 ik_subscription_task(manual);默认用 job 存的 target,可覆盖。
136
148
 
137
149
  落 pending task 后触发 Airflow DAG(``social_neuron_subscription``)跑取数→组装→投递(上传取 url);
138
150
  未配 airflow_base_url 时(本地/测试)触发被跳过,仅留 pending task。**无通知**:结果落
@@ -143,9 +155,14 @@ metadata:
143
155
  | flag | 字段 | 类型 | 必填 | 约束 | 说明 |
144
156
  |---|---|---|---|---|---|
145
157
  | --job-id | job_id | integer | 是 | - | 目标 job |
146
- | --start-time | start_time | string | 否 | - | 回溯起始;与 end_time 同传同不传 |
147
- | --end-time | end_time | string | 否 | - | 回溯结束 |
158
+ | --start-time | start_time | string | 否 | - | **发布时间**下界(绝对日期 yyyy-MM-dd,东八区,按天闭区间,不含时分秒);与 end_time 同传同不传;不传则按 job 上的 published 相对口径折算 |
159
+ | --end-time | end_time | string | 否 | - | **发布时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内) |
160
+ | --idate-start | idate_start | string | 否 | - | **入库时间**下界(绝对日期 yyyy-MM-dd,东八区);与 idate_end 同传同不传;不传则按 job 上的 idate 相对口径折算,job 也没配=该维度不过滤 |
161
+ | --idate-end | idate_end | string | 否 | - | 本次**入库时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内) |
162
+ | --udate-start | udate_start | string | 否 | - | **更新时间**下界(绝对日期 yyyy-MM-dd,东八区);与 udate_end 同传同不传;不传则按 job 上的 udate 相对口径折算,job 也没配=该维度不过滤 |
163
+ | --udate-end | udate_end | string | 否 | - | **更新时间**上界(绝对日期 yyyy-MM-dd,东八区,该日整天含在窗内) |
148
164
  | --target | target | OctoTarget、SftpTarget、KafkaTarget | 否 | - | 覆盖本次投递目标 |
165
+ | --size | size | integer | 否 | min=1, max=500000 | 覆盖本次导出行数;不传则继承 job 的 size,最大 500000 |
149
166
 
150
167
  **对象 `KafkaTarget`** —— kafka(规划):把记录流投送到 topic(无文件)。
151
168
 
@@ -164,6 +181,8 @@ metadata:
164
181
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
165
182
 
166
183
  **对象 `SftpTarget`** —— sftp(本期):把导出文件上传到 SFTP 远端目录。
184
+ 目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task
185
+ 重跑多少次,远端路径与文件名都不变。
167
186
 
168
187
  | 键 | 类型 | 必填 | 约束 | 说明 |
169
188
  |---|---|---|---|---|
@@ -172,7 +191,8 @@ metadata:
172
191
  | port | integer | 否 | - | 端口,默认 22 |
173
192
  | username | string | 是 | - | 登录用户名 |
174
193
  | password | string | 是 | - | 登录密码 |
175
- | remote_path | string | 是 | - | 远端目录/路径 |
194
+ | remote_path | string | 是 | - | 远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。 |
195
+ | filename_template | string | 否 | - | 自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。 |
176
196
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
177
197
 
178
198
  **出参 `SubJobTriggerResult`**
@@ -192,11 +212,14 @@ metadata:
192
212
  | flag | 字段 | 类型 | 必填 | 约束 | 说明 |
193
213
  |---|---|---|---|---|---|
194
214
  | --job-id | job_id | integer | 是 | - | 目标 job |
195
- | --name | name | string | 否 | minLen=1, maxLen=128 | 新名称(全局唯一) |
215
+ | --name | name | string | 否 | minLen=1, maxLen=128 | 新名称(同一凭证下唯一) |
196
216
  | --rule-ids | rule_ids | list[string] | 否 | minItems=1, minLen=1 | 整组全量覆盖 |
197
217
  | --source | source | list[string] | 否 | minItems=1, minLen=1 | 整组全量覆盖 |
198
- | --published | published | enum(T-0、T-1、T-7) | 否 | - | 发布时间口径:T-0 / T-1 / T-7 |
218
+ | --published | published | string | 否 | - | **发布时间**口径(必填字段,只能改不能清)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
219
+ | --idate | idate | string | 否 | - | **入库时间**口径。不传=不改;传空串 ""=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
220
+ | --udate | udate | string | 否 | - | **更新时间**口径。不传=不改;传空串 ""=**清除**该维度(恢复成不过滤)。记法 **T-M~T-N**:从 M 天前到 N 天前的闭区间(要求 M>=N),端点按天计,基准日是本次触发的 task_time(东八区;定时=cron 槽位日,手动=触发当日)。**两个端点都必须写全,不接受单值简写** —— 「昨天」写 T-1~T-1,写 T-1 会被拒绝。举例:T-0~T-0=今天;T-1~T-1=昨天;T-2~T-2=前天;T-1~T-0=昨天到今天(2天);T-2~T-1=前天到昨天(2天,口语的「前两天」);T-3~T-1=前三天(3天);T-7~T-3=7天前到3天前(5天);T-7~T-1=近7天到昨天(7天)。跨度最多 120 天、偏移最多 720 天(近两年),M<N 或超限直接报错(不会静默回落)。 |
199
221
  | --fields | fields | list[string] | 否 | minLen=1 | 整组全量覆盖 |
222
+ | --size | size | integer | 否 | min=1, max=500000 | 每次执行最多导出的记录行数;不传则不修改,最大 500000 |
200
223
  | --frequency | frequency | string | 否 | minLen=1, maxLen=64 | 传入则按新频率重算 cron(用法同创建;支持一天多次,如「每天9点和15点」);无法解析为 cron 会被拒绝 |
201
224
  | --target | target | OctoTarget、SftpTarget、KafkaTarget | 否 | - | 整体替换投递目标 |
202
225
  | --active | active | enum(0、1) | 否 | - | 启停:1 / 0 |
@@ -218,6 +241,8 @@ metadata:
218
241
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
219
242
 
220
243
  **对象 `SftpTarget`** —— sftp(本期):把导出文件上传到 SFTP 远端目录。
244
+ 目录与文件名都支持日期变量 ``yyyyMMdd`` / ``yyyyMM`` / ``yyyy``,同一个 task
245
+ 重跑多少次,远端路径与文件名都不变。
221
246
 
222
247
  | 键 | 类型 | 必填 | 约束 | 说明 |
223
248
  |---|---|---|---|---|
@@ -226,22 +251,26 @@ metadata:
226
251
  | port | integer | 否 | - | 端口,默认 22 |
227
252
  | username | string | 是 | - | 登录用户名 |
228
253
  | password | string | 是 | - | 登录密码 |
229
- | remote_path | string | 是 | - | 远端目录/路径 |
254
+ | remote_path | string | 是 | - | 远端目录/路径。可在**任意一层**用日期变量,但变量必须**独占一层**:`/data/sub/yyyyMM/yyyyMMdd` 合法,`/data/sub_yyyyMMdd` 非法。只认 yyyyMMdd / yyyyMM / yyyy 三种;不允许 '..'、空目录层。 |
255
+ | filename_template | string | 否 | - | 自定义文件名模板(不含扩展名)。只允许字母、数字、'_'、'-' 与日期变量,且变量前后必须是 '_' 或首尾:`daily_yyyyMMdd_export`、`yyyyMM_summary` 合法,`dailyyyyyMMdd`、`report-yyyyMMdd-x` 非法。系统统一追加 `_<task_id>` 与扩展名。不传=沿用默认 `<job_id>_<task_id>.<ext>`。 |
230
256
  | format | enum(csv、excel、json) | 否 | - | 文件格式:csv/excel/json(默认 json) |
231
257
 
232
258
  **出参 `SubJob`**
233
259
 
234
260
  | 字段 | 类型 | 必填 | 约束 | 说明 |
235
261
  |---|---|---|---|---|
236
- | job_id | integer | 是 | - | job ID(sub_job.id) |
237
- | name | string | 是 | - | job 名称,全局唯一 |
262
+ | job_id | integer | 是 | - | job ID |
263
+ | name | string | 是 | - | job 名称,同一凭证(token)下唯一 |
238
264
  | rule_ids | list[string] | 是 | - | 魔方规则ID数组 |
239
265
  | source | list[string] | 是 | - | 站点数组 |
240
- | published | string | 是 | - | 发布时间口径:T-0(当天)/ T-1(昨天)/ T-7(近7天) |
266
+ | published | string | 是 | - | 发布时间口径(相对,规范形态 T-M~T-N,如 T-1~T-1 / T-7~T-3);触发时按 task_time 折算成绝对日期区间 |
267
+ | idate | string | 是 | - | 入库时间口径(相对,T-M~T-N);null=该维度不过滤 |
268
+ | udate | string | 是 | - | 更新时间口径(相对,T-M~T-N);null=该维度不过滤 |
241
269
  | fields | list[string] | 是 | - | 拉取/导出字段(空=全量) |
270
+ | size | integer | 是 | - | 每次执行最多导出的记录行数,范围 1–500000 |
242
271
  | frequency | string | 是 | - | 自然语言频率 |
243
272
  | cron | string | 是 | - | 系统由 frequency 转换的 cron |
244
- | target_type | string | 是 | - | 投递类型:octo(本期)/sftp/kafka |
273
+ | target_type | string | 是 | - | 投递类型:octo、sftp、kafka(暂不支持) |
245
274
  | target_info | object | 是 | - | 投递配置 |
246
275
  | active | integer | 是 | - | 1 生效 / 0 停用 |
247
276
  | created_at | string | 是 | - | 创建时间(ISO8601,UTC+8) |
@@ -272,12 +301,13 @@ metadata:
272
301
  | items | list[SubTask] | 是 | - | task 列表,按 created_at 排序(方向由 sort 定,默认倒序) |
273
302
  | total | integer | 是 | - | 命中总数 |
274
303
 
275
- **对象 `SubTask`** —— 订阅 task 出参对象(**对外精简**:只给调用方轮询/下载所需;其余字段仅存 sub_task 表供排查)。
304
+ **对象 `SubTask`** —— 订阅 task 出参对象(**对外精简**:只给调用方轮询/下载所需)。
276
305
 
277
306
  | 键 | 类型 | 必填 | 约束 | 说明 |
278
307
  |---|---|---|---|---|
279
- | task_id | integer | 是 | - | task ID(sub_task.id) |
308
+ | task_id | integer | 是 | - | task ID |
280
309
  | job_id | integer | 是 | - | 所属 job |
310
+ | size | integer | 是 | - | 本次执行最多导出的记录行数 |
281
311
  | status | string | 是 | - | pending/running/success/failed/terminated |
282
312
  | file_info | object | 否 | - | 产物 + 下载入口,含 type 标识:octo→{type,name,format,rows,url};sftp→{...,url,path};kafka→{type,brokers,topic} |
283
313
  | error_msg | string | 否 | - | 失败原因(status=failed 时给出;成功/进行中为空) |