gangtise-openapi-cli 0.8.0 → 0.10.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.
package/README.md CHANGED
@@ -59,9 +59,12 @@ export GANGTISE_TOKEN="Bearer xxx"
59
59
  | | `foreign-report list` / `download` | 外资研报(含中文翻译下载) |
60
60
  | | `announcement list` / `download` | 公告(含 Markdown 下载) |
61
61
  | **Quote** | `day-kline` / `day-kline-hk` | A股/港股日K线 |
62
- | **Fundamental** | `income-statement` / `balance-sheet` / `cash-flow` | 三大财务报表 |
62
+ | | `minute-kline` | A股分钟K线 |
63
+ | **Fundamental** | `income-statement` / `balance-sheet` / `cash-flow` | 三大财务报表(累计) |
64
+ | | `income-statement-quarterly` / `cash-flow-quarterly` | 利润表/现金流量表(单季度) |
63
65
  | | `main-business` | 主营构成(按地区/产品拆分) |
64
66
  | | `valuation-analysis` | 估值分析 |
67
+ | | `earning-forecast` | 盈利预测(一致预期) |
65
68
  | **AI** | `knowledge-batch` | 知识库批量检索 |
66
69
  | | `knowledge-resource-download` | 知识资源下载 |
67
70
  | | `security-clue` | 个股线索 |
@@ -72,7 +75,12 @@ export GANGTISE_TOKEN="Bearer xxx"
72
75
  | | `theme-tracking` | 主题跟踪 |
73
76
  | | `hot-topic` | 热点话题 |
74
77
  | | `research-outline` | 研究提纲 |
78
+ | | `management-discuss-announcement` | 管理层讨论-财报 |
79
+ | | `management-discuss-earnings-call` | 管理层讨论-业绩会 |
80
+ | | `viewpoint-debate` / `viewpoint-debate-check` | 观点PK(异步) |
75
81
  | **Vault** | `drive-list` / `drive-download` | 云盘文件列表与下载 |
82
+ | | `record-list` / `record-download` | 录音速记列表与下载 |
83
+ | | `my-conference-list` / `my-conference-download` | 我的会议列表与下载 |
76
84
  | **Raw** | `call` | 原始接口调用(可访问任意 endpoint) |
77
85
 
78
86
  ## AI Agent Skill
@@ -160,6 +168,8 @@ gangtise ai knowledge-batch --query 比亚迪 --query 最近热门概念
160
168
  - `insight announcement list`
161
169
  - `ai security-clue`
162
170
  - `vault drive-list`
171
+ - `vault record-list`
172
+ - `vault my-conference-list`
163
173
  - `ai hot-topic`
164
174
 
165
175
  规则:
@@ -169,7 +179,7 @@ gangtise ai knowledge-batch --query 比亚迪 --query 最近热门概念
169
179
 
170
180
  ## 智能文件命名
171
181
 
172
- 下载命令(`summary download`、`research download`、`foreign-report download`、`announcement download`、`vault drive-download`)省略 `--output` 时,自动使用真实标题作为文件名:
182
+ 下载命令(`summary download`、`research download`、`foreign-report download`、`announcement download`、`vault drive-download`、`vault record-download`、`vault my-conference-download`)省略 `--output` 时,自动使用真实标题作为文件名:
173
183
 
174
184
  1. **缓存优先** — 如果之前执行过对应的 `list` 命令,标题已缓存在 `~/.config/gangtise/title-cache.json`,直接使用,无额外 API 调用
175
185
  2. **API 回查** — 缓存未命中时,自动查询最近 200 条记录匹配标题
@@ -226,6 +236,8 @@ gangtise quote day-kline --security 600519.SH --start-date 2026-03-01 --end-date
226
236
  gangtise quote day-kline --format json
227
237
  # 港股日K线
228
238
  gangtise quote day-kline-hk --security 00700.HK --start-date 2026-03-01 --end-date 2026-03-31
239
+ # A股分钟K线
240
+ gangtise quote minute-kline --security 600519.SH --start-time "2026-04-15 09:30:00" --end-time "2026-04-15 15:00:00" --field open --field close --field volume
229
241
  ```
230
242
 
231
243
  ### Fundamental
@@ -246,6 +258,12 @@ gangtise fundamental main-business --security-code 600519.SH --breakdown region
246
258
  # 多报告期:--period 可传多个值
247
259
  gangtise fundamental main-business --security-code 600519.SH --breakdown product --period annual --period interim
248
260
  gangtise fundamental valuation-analysis --security-code 600519.SH --indicator peTtm
261
+ # 盈利预测(一致预期)
262
+ gangtise fundamental earning-forecast --security-code 600519.SH --consensus netIncome --consensus eps --consensus pe
263
+ # 利润表(单季度)
264
+ gangtise fundamental income-statement-quarterly --security-code 600519.SH --fiscal-year 2025 --period q2 --field netProfit
265
+ # 现金流量表(单季度)
266
+ gangtise fundamental cash-flow-quarterly --security-code 600519.SH --fiscal-year 2025 --period q2 --field netOpCashFlows
249
267
  ```
250
268
 
251
269
  ### AI
@@ -264,6 +282,16 @@ gangtise ai hot-topic --start-date 2026-03-22 --end-date 2026-03-27 --category m
264
282
  # 不传 --category 默认查全部类型(早报+午报+盘中快报+晚报),--with-related-securities 和 --with-close-reading 默认开启
265
283
  gangtise ai hot-topic --start-date 2026-04-15 --end-date 2026-04-17
266
284
  gangtise ai research-outline --security-code 600519.SH
285
+ # 管理层讨论-财报
286
+ gangtise ai management-discuss-announcement --report-date 2025-06-30 --security-code 000001.SZ --dimension businessOperation
287
+ # 管理层讨论-业绩会
288
+ gangtise ai management-discuss-earnings-call --report-date 2025-06-30 --security-code 000001.SZ --dimension financialPerformance
289
+ # 观点PK(异步,返回 dataId)
290
+ gangtise ai viewpoint-debate --viewpoint "飞天茅台的批价低点是1500元"
291
+ # 等待生成完成后查询结果
292
+ gangtise ai viewpoint-debate-check --data-id 202603310528
293
+ # 也可以 --wait 同步等待结果(最长3分钟)
294
+ gangtise ai viewpoint-debate --viewpoint "比亚迪股价将突破500元" --wait
267
295
  gangtise ai knowledge-resource-download --resource-type 60 --source-id 3052524 --output ./resource.txt
268
296
  ```
269
297
 
@@ -275,6 +303,16 @@ gangtise vault drive-list --keyword 部门文档 --space-type 1 --file-type 1
275
303
  # 云盘下载:自动使用文件标题命名
276
304
  gangtise vault drive-download --file-id 62130
277
305
  # → 2028 全球智能危机 一份来自未来的金融史思想实验 .pdf
306
+
307
+ # 录音速记列表
308
+ gangtise vault record-list --keyword 晨会 --category upload --category mobile
309
+ # 录音速记下载(--content-type: original/asr/summary)
310
+ gangtise vault record-download --record-id 49412 --content-type summary
311
+
312
+ # 我的会议列表
313
+ gangtise vault my-conference-list --keyword AI --category earningsCall --institution C100000027
314
+ # 我的会议下载(--content-type: asr/summary)
315
+ gangtise vault my-conference-download --conference-id 43319 --content-type asr
278
316
  ```
279
317
 
280
318
  ### Raw
package/dist/src/cli.js CHANGED
@@ -356,12 +356,20 @@ quote.command("day-kline-hk").option("--security <code>", "Security code (HK sto
356
356
  const client = await createClient();
357
357
  await printData(await client.call("quote.day-kline-hk", { securityList: maybeArray(options.security), startDate: options.startDate, endDate: options.endDate, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
358
358
  });
359
+ quote.command("minute-kline").option("--security <code>", "Security code (A-share only: .SH/.SZ/.BJ)").option("--start-time <datetime>", "Start time (yyyy-MM-dd HH:mm:ss)").option("--end-time <datetime>", "End time (yyyy-MM-dd HH:mm:ss)").option("--limit <number>", "Max rows per request (default: 5000, max: 10000)").option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
360
+ const client = await createClient();
361
+ await printData(await client.call("quote.minute-kline", { securityCode: options.security, startTime: options.startTime, endTime: options.endTime, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
362
+ });
359
363
  program.addCommand(quote);
360
364
  const fundamental = new Command("fundamental").description("Fundamental APIs");
361
365
  fundamental.command("income-statement").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
362
366
  const client = await createClient();
363
367
  await printData(await client.call("fundamental.income-statement", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
364
368
  });
369
+ fundamental.command("income-statement-quarterly").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period: q1/q2/q3/q4/latest", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
370
+ const client = await createClient();
371
+ await printData(await client.call("fundamental.income-statement-quarterly", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
372
+ });
365
373
  fundamental.command("balance-sheet").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
366
374
  const client = await createClient();
367
375
  await printData(await client.call("fundamental.balance-sheet", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
@@ -370,6 +378,10 @@ fundamental.command("cash-flow").requiredOption("--security-code <code>").option
370
378
  const client = await createClient();
371
379
  await printData(await client.call("fundamental.cash-flow", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
372
380
  });
381
+ fundamental.command("cash-flow-quarterly").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period: q1/q2/q3/q4/latest", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
382
+ const client = await createClient();
383
+ await printData(await client.call("fundamental.cash-flow-quarterly", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
384
+ });
373
385
  fundamental.command("main-business").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").addOption(new Option("--breakdown <type>", "Breakdown: product/industry/region").choices(["product", "industry", "region"]).default("product")).option("--period <type>", "Period: interim/annual", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
374
386
  const client = await createClient();
375
387
  await printData(await client.call("fundamental.main-business", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, breakdown: options.breakdown, periodList: maybeArray(options.period), fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
@@ -378,6 +390,10 @@ fundamental.command("valuation-analysis").requiredOption("--security-code <code>
378
390
  const client = await createClient();
379
391
  await printData(await client.call("fundamental.valuation-analysis", { securityCode: options.securityCode, indicator: options.indicator, startDate: options.startDate, endDate: options.endDate, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
380
392
  });
393
+ fundamental.command("earning-forecast").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--consensus <name>", "Consensus indicator: netIncome/netIncomeYoy/eps/pe/bps/pb/peg/roe/ps", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
394
+ const client = await createClient();
395
+ await printData(await client.call("fundamental.earning-forecast", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, consensusList: maybeArray(options.consensus) }), parseFormat(options.format), options.output);
396
+ });
381
397
  program.addCommand(fundamental);
382
398
  const ai = new Command("ai").description("AI APIs");
383
399
  ai.command("knowledge-batch").requiredOption("--query <text>", "Query", collectList, []).option("--top <number>", "Top", "10").option("--resource-type <number>", "Resource type", collectNumberList, []).option("--knowledge-name <name>", "Knowledge name", collectList, []).option("--start-time <ms>").option("--end-time <ms>").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
@@ -480,6 +496,67 @@ ai.command("hot-topic").option("--from <number>", "Starting offset", "0").option
480
496
  withCloseReading: options.withCloseReading || undefined,
481
497
  }), parseFormat(options.format), options.output);
482
498
  });
499
+ ai.command("management-discuss-announcement").requiredOption("--report-date <date>", "Report date (yyyy-MM-dd, e.g. 2025-06-30)").requiredOption("--security-code <code>", "Security code (e.g. 000001.SZ)").addOption(new Option("--dimension <name>", "Discussion dimension").choices(["businessOperation", "financialPerformance", "developmentAndRisk"]).makeOptionMandatory()).option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
500
+ const client = await createClient();
501
+ await printData(await client.call("ai.management-discuss-announcement", {
502
+ reportDate: options.reportDate,
503
+ securityCode: options.securityCode,
504
+ discussionDimension: options.dimension,
505
+ }), parseFormat(options.format), options.output);
506
+ });
507
+ ai.command("management-discuss-earnings-call").requiredOption("--report-date <date>", "Report date (yyyy-MM-dd, e.g. 2025-06-30)").requiredOption("--security-code <code>", "Security code (e.g. 000001.SZ)").addOption(new Option("--dimension <name>", "Discussion dimension").choices(["businessOperation", "financialPerformance", "developmentAndRisk"]).makeOptionMandatory()).option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
508
+ const client = await createClient();
509
+ await printData(await client.call("ai.management-discuss-earnings-call", {
510
+ reportDate: options.reportDate,
511
+ securityCode: options.securityCode,
512
+ discussionDimension: options.dimension,
513
+ }), parseFormat(options.format), options.output);
514
+ });
515
+ ai.command("viewpoint-debate").requiredOption("--viewpoint <text>", "Viewpoint text (max 1000 chars)").option("--wait", "Wait for content generation (blocking, up to 3 min)").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
516
+ const client = await createClient();
517
+ // Step 1: get dataId
518
+ const idResult = await client.call("ai.viewpoint-debate.get-id", { viewpoint: options.viewpoint });
519
+ const dataId = idResult?.dataId;
520
+ if (!dataId) {
521
+ process.stderr.write("Failed to get viewpoint debate ID.\n");
522
+ process.exitCode = 1;
523
+ return;
524
+ }
525
+ // Non-blocking: return dataId immediately
526
+ if (!options.wait) {
527
+ process.stderr.write(`Viewpoint debate task submitted. dataId: ${dataId}\n`);
528
+ process.stdout.write(`${JSON.stringify({ dataId, status: "pending", hint: `Run 'gangtise ai viewpoint-debate-check --data-id ${dataId}' in ~2 minutes to get results` })}\n`);
529
+ return;
530
+ }
531
+ // Blocking (--wait): poll for content
532
+ process.stderr.write(`Got dataId: ${dataId}, waiting for content generation...\n`);
533
+ let attempts = 0;
534
+ const maxAttempts = 12;
535
+ const delayMs = 15_000;
536
+ while (attempts < maxAttempts) {
537
+ attempts++;
538
+ const contentResult = await client.call("ai.viewpoint-debate.get-content", { dataId });
539
+ if (contentResult?.data?.content) {
540
+ await printData(contentResult.data, parseFormat(options.format), options.output);
541
+ return;
542
+ }
543
+ if (attempts < maxAttempts) {
544
+ process.stderr.write(`Attempt ${attempts}/${maxAttempts}: content not ready, retrying in 15s...\n`);
545
+ await new Promise(resolve => setTimeout(resolve, delayMs));
546
+ }
547
+ }
548
+ process.stderr.write(`Content not available after ${maxAttempts} attempts. Try again later with: gangtise ai viewpoint-debate-check --data-id ${dataId}\n`);
549
+ process.exitCode = 1;
550
+ });
551
+ ai.command("viewpoint-debate-check").requiredOption("--data-id <id>", "dataId from viewpoint-debate").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
552
+ const client = await createClient();
553
+ const contentResult = await client.call("ai.viewpoint-debate.get-content", { dataId: options.dataId });
554
+ if (contentResult?.data?.content) {
555
+ await printData(contentResult.data, parseFormat(options.format), options.output);
556
+ return;
557
+ }
558
+ process.stdout.write(`${JSON.stringify({ dataId: options.dataId, status: "pending", hint: "Content not ready yet, retry in ~2 minutes" })}\n`);
559
+ });
483
560
  const vault = new Command("vault").description("Vault APIs");
484
561
  vault.command("drive-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--file-type <number>", "File type", collectNumberList, []).option("--space-type <number>", "Space type", collectNumberList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
485
562
  const client = await createClient();
@@ -491,6 +568,26 @@ vault.command("drive-download").requiredOption("--file-id <id>").option("--outpu
491
568
  const title = options.output ? undefined : await resolveTitle(client, result, "vault.drive.list", "fileId", options.fileId);
492
569
  await saveDownloadResult(result, `file-${options.fileId}`, options.output ?? title);
493
570
  });
571
+ vault.command("record-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--category <name>", "Recording type: upload/link/mobile/gtNote/pc/share", collectList, []).option("--space-type <number>", "Space type: 1=my records / 2=tenant records", collectNumberList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
572
+ const client = await createClient();
573
+ await printData(await client.call("vault.record.list", { from: Number(options.from), size: options.size === undefined ? undefined : Number(options.size), startTime: options.startTime, endTime: options.endTime, keyword: options.keyword, categoryList: maybeArray(options.category), spaceTypeList: options.spaceType.length ? options.spaceType : undefined }), parseFormat(options.format), options.output, { endpointKey: "vault.record.list", idField: "recordId" });
574
+ });
575
+ vault.command("record-download").requiredOption("--record-id <id>").requiredOption("--content-type <type>", "Content type: original/asr/summary").option("--output <path>").action(async (options) => {
576
+ const client = await createClient();
577
+ const result = await client.call("vault.record.download", undefined, { recordId: options.recordId, contentType: options.contentType });
578
+ const title = options.output ? undefined : await resolveTitle(client, result, "vault.record.list", "recordId", options.recordId);
579
+ await saveDownloadResult(result, `record-${options.recordId}`, options.output ?? title);
580
+ });
581
+ vault.command("my-conference-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--research-area <id>", "Research area ID", collectList, []).option("--security <code>", "Security code", collectList, []).option("--institution <id>", "Institution ID", collectList, []).option("--category <name>", "Conference category: earningsCall/strategyMeeting/fundRoadshow/shareholdersMeeting/maMeeting/specialMeeting/companyAnalysis/industryAnalysis/other", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
582
+ const client = await createClient();
583
+ await printData(await client.call("vault.my-conference.list", { from: Number(options.from), size: options.size === undefined ? undefined : Number(options.size), startTime: options.startTime, endTime: options.endTime, keyword: options.keyword, researchAreaList: maybeArray(options.researchArea), securityList: maybeArray(options.security), institutionList: maybeArray(options.institution), categoryList: maybeArray(options.category) }), parseFormat(options.format), options.output, { endpointKey: "vault.my-conference.list", idField: "conferenceId" });
584
+ });
585
+ vault.command("my-conference-download").requiredOption("--conference-id <id>").requiredOption("--content-type <type>", "Content type: asr/summary").option("--output <path>").action(async (options) => {
586
+ const client = await createClient();
587
+ const result = await client.call("vault.my-conference.download", undefined, { conferenceId: options.conferenceId, contentType: options.contentType });
588
+ const title = options.output ? undefined : await resolveTitle(client, result, "vault.my-conference.list", "conferenceId", options.conferenceId);
589
+ await saveDownloadResult(result, `conference-${options.conferenceId}`, options.output ?? title);
590
+ });
494
591
  program.addCommand(vault);
495
592
  program.addCommand(ai);
496
593
  program.command("raw").description("Raw API calls").addCommand(new Command("call").argument("<endpointKey>").option("--body <json>").option("--query <key=value>", "Query string pair", collectKeyValue, {}).option("--format <format>", "Output format", "json").option("--output <path>").action(async (endpointKey, options) => {
@@ -204,6 +204,13 @@ export const ENDPOINTS = {
204
204
  kind: "json",
205
205
  description: "Query main business composition",
206
206
  },
207
+ fundamentalEarningForecast: {
208
+ key: "fundamental.earning-forecast",
209
+ method: "POST",
210
+ path: "/application/open-fundamental/earning-forecast",
211
+ kind: "json",
212
+ description: "Query earning forecast (consensus estimates)",
213
+ },
207
214
  fundamentalValuationAnalysis: {
208
215
  key: "fundamental.valuation-analysis",
209
216
  method: "POST",
@@ -290,6 +297,55 @@ export const ENDPOINTS = {
290
297
  description: "List hot topic reports",
291
298
  pagination: { enabled: true, maxPageSize: 20 },
292
299
  },
300
+ aiManagementDiscussAnnouncement: {
301
+ key: "ai.management-discuss-announcement",
302
+ method: "POST",
303
+ path: "/application/open-ai/management-discuss/from-announcement",
304
+ kind: "json",
305
+ description: "Management discussion from financial reports (half-year/annual)",
306
+ },
307
+ aiManagementDiscussEarningsCall: {
308
+ key: "ai.management-discuss-earnings-call",
309
+ method: "POST",
310
+ path: "/application/open-ai/management-discuss/from-earningsCall",
311
+ kind: "json",
312
+ description: "Management discussion from earnings calls",
313
+ },
314
+ aiViewpointDebateGetId: {
315
+ key: "ai.viewpoint-debate.get-id",
316
+ method: "POST",
317
+ path: "/application/open-ai/agent/viewpoint-debate-getid",
318
+ kind: "json",
319
+ description: "Get viewpoint debate ID",
320
+ },
321
+ aiViewpointDebateGetContent: {
322
+ key: "ai.viewpoint-debate.get-content",
323
+ method: "POST",
324
+ path: "/application/open-ai/agent/viewpoint-debate-getcontent",
325
+ kind: "json",
326
+ description: "Get viewpoint debate content",
327
+ },
328
+ quoteMinuteKline: {
329
+ key: "quote.minute-kline",
330
+ method: "POST",
331
+ path: "/application/open-quote/kline/minute",
332
+ kind: "json",
333
+ description: "Query A-share minute kline (SH/SZ/BJ)",
334
+ },
335
+ fundamentalIncomeStatementQuarterly: {
336
+ key: "fundamental.income-statement-quarterly",
337
+ method: "POST",
338
+ path: "/application/open-fundamental/financial-report/income-statement/quarterly",
339
+ kind: "json",
340
+ description: "Query income statement (quarterly)",
341
+ },
342
+ fundamentalCashFlowQuarterly: {
343
+ key: "fundamental.cash-flow-quarterly",
344
+ method: "POST",
345
+ path: "/application/open-fundamental/financial-report/cash-flow-statement/quarterly",
346
+ kind: "json",
347
+ description: "Query cash flow statement (quarterly)",
348
+ },
293
349
  vaultDriveList: {
294
350
  key: "vault.drive.list",
295
351
  method: "POST",
@@ -305,6 +361,36 @@ export const ENDPOINTS = {
305
361
  kind: "download",
306
362
  description: "Download vault drive file",
307
363
  },
364
+ vaultRecordList: {
365
+ key: "vault.record.list",
366
+ method: "POST",
367
+ path: "/application/open-vault/record/getList",
368
+ kind: "json",
369
+ description: "List voice recording transcriptions",
370
+ pagination: { enabled: true, maxPageSize: 50 },
371
+ },
372
+ vaultRecordDownload: {
373
+ key: "vault.record.download",
374
+ method: "GET",
375
+ path: "/application/open-vault/record/download/file",
376
+ kind: "download",
377
+ description: "Download voice recording transcription file",
378
+ },
379
+ vaultMyConferenceList: {
380
+ key: "vault.my-conference.list",
381
+ method: "POST",
382
+ path: "/application/open-vault/my-conference/getList",
383
+ kind: "json",
384
+ description: "List my conferences",
385
+ pagination: { enabled: true, maxPageSize: 50 },
386
+ },
387
+ vaultMyConferenceDownload: {
388
+ key: "vault.my-conference.download",
389
+ method: "GET",
390
+ path: "/application/open-vault/my-conference/download/file",
391
+ kind: "download",
392
+ description: "Download my conference resource",
393
+ },
308
394
  };
309
395
  export const ENDPOINT_REGISTRY = Object.values(ENDPOINTS).reduce((accumulator, endpoint) => {
310
396
  accumulator[endpoint.key] = endpoint;
@@ -1,2 +1,2 @@
1
1
  // Auto-generated — DO NOT EDIT
2
- export const CLI_VERSION = "0.8.0";
2
+ export const CLI_VERSION = "0.10.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gangtise-openapi-cli",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "CLI for Gangtise OpenAPI",
5
5
  "license": "MIT",
6
6
  "repository": {