fi-pool-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +26 -0
  2. package/dist/db/index.d.ts +18 -0
  3. package/dist/db/index.d.ts.map +1 -0
  4. package/dist/db/index.js +58 -0
  5. package/dist/db/index.js.map +1 -0
  6. package/dist/db/migrate.d.ts +11 -0
  7. package/dist/db/migrate.d.ts.map +1 -0
  8. package/dist/db/migrate.js +42 -0
  9. package/dist/db/migrate.js.map +1 -0
  10. package/dist/db/schema.d.ts +1101 -0
  11. package/dist/db/schema.d.ts.map +1 -0
  12. package/dist/db/schema.js +149 -0
  13. package/dist/db/schema.js.map +1 -0
  14. package/dist/index.d.ts +50 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +69 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/services/analysis.d.ts +62 -0
  19. package/dist/services/analysis.d.ts.map +1 -0
  20. package/dist/services/analysis.js +74 -0
  21. package/dist/services/analysis.js.map +1 -0
  22. package/dist/services/daily-info.d.ts +150 -0
  23. package/dist/services/daily-info.d.ts.map +1 -0
  24. package/dist/services/daily-info.js +293 -0
  25. package/dist/services/daily-info.js.map +1 -0
  26. package/dist/services/embedding.d.ts +89 -0
  27. package/dist/services/embedding.d.ts.map +1 -0
  28. package/dist/services/embedding.js +227 -0
  29. package/dist/services/embedding.js.map +1 -0
  30. package/dist/services/llm.d.ts +64 -0
  31. package/dist/services/llm.d.ts.map +1 -0
  32. package/dist/services/llm.js +109 -0
  33. package/dist/services/llm.js.map +1 -0
  34. package/dist/services/pipeline.d.ts +161 -0
  35. package/dist/services/pipeline.d.ts.map +1 -0
  36. package/dist/services/pipeline.js +844 -0
  37. package/dist/services/pipeline.js.map +1 -0
  38. package/dist/services/pool.d.ts +142 -0
  39. package/dist/services/pool.d.ts.map +1 -0
  40. package/dist/services/pool.js +208 -0
  41. package/dist/services/pool.js.map +1 -0
  42. package/dist/services/sentiment.d.ts +31 -0
  43. package/dist/services/sentiment.d.ts.map +1 -0
  44. package/dist/services/sentiment.js +76 -0
  45. package/dist/services/sentiment.js.map +1 -0
  46. package/dist/services/session.d.ts +117 -0
  47. package/dist/services/session.d.ts.map +1 -0
  48. package/dist/services/session.js +176 -0
  49. package/dist/services/session.js.map +1 -0
  50. package/dist/services/stock.d.ts +82 -0
  51. package/dist/services/stock.d.ts.map +1 -0
  52. package/dist/services/stock.js +99 -0
  53. package/dist/services/stock.js.map +1 -0
  54. package/dist/services/word-count.d.ts +61 -0
  55. package/dist/services/word-count.d.ts.map +1 -0
  56. package/dist/services/word-count.js +120 -0
  57. package/dist/services/word-count.js.map +1 -0
  58. package/dist/tools/auxiliary.d.ts +93 -0
  59. package/dist/tools/auxiliary.d.ts.map +1 -0
  60. package/dist/tools/auxiliary.js +204 -0
  61. package/dist/tools/auxiliary.js.map +1 -0
  62. package/dist/tools/command.d.ts +193 -0
  63. package/dist/tools/command.d.ts.map +1 -0
  64. package/dist/tools/command.js +263 -0
  65. package/dist/tools/command.js.map +1 -0
  66. package/dist/tools/execute.d.ts +109 -0
  67. package/dist/tools/execute.d.ts.map +1 -0
  68. package/dist/tools/execute.js +112 -0
  69. package/dist/tools/execute.js.map +1 -0
  70. package/dist/tools/manager.d.ts +150 -0
  71. package/dist/tools/manager.d.ts.map +1 -0
  72. package/dist/tools/manager.js +200 -0
  73. package/dist/tools/manager.js.map +1 -0
  74. package/dist/tools/query.d.ts +163 -0
  75. package/dist/tools/query.d.ts.map +1 -0
  76. package/dist/tools/query.js +190 -0
  77. package/dist/tools/query.js.map +1 -0
  78. package/dist/utils/http-client.d.ts +87 -0
  79. package/dist/utils/http-client.d.ts.map +1 -0
  80. package/dist/utils/http-client.js +211 -0
  81. package/dist/utils/http-client.js.map +1 -0
  82. package/dist/utils/indicators.d.ts +194 -0
  83. package/dist/utils/indicators.d.ts.map +1 -0
  84. package/dist/utils/indicators.js +395 -0
  85. package/dist/utils/indicators.js.map +1 -0
  86. package/dist/utils/signals.d.ts +65 -0
  87. package/dist/utils/signals.d.ts.map +1 -0
  88. package/dist/utils/signals.js +171 -0
  89. package/dist/utils/signals.js.map +1 -0
  90. package/drizzle/0000_equal_marvel_apes.sql +124 -0
  91. package/drizzle/meta/0000_snapshot.json +858 -0
  92. package/drizzle/meta/_journal.json +13 -0
  93. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWd,CAAC;AAIJ,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOf,CAAC;AAIJ,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASnB,CAAC;AAIJ,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAanB,CAAC;AAIJ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY7B,CAAC;AAIJ,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWzB,CAAC;AAIJ,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAavB,CAAC;AAIJ,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarB,CAAC;AAIJ,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIjB,CAAC;AAIH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYtB,CAAC"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Drizzle ORM Schema — Fi-Pool-Manager
3
+ *
4
+ * 10 张表定义,与 docs/database-schema.md 完全对应。
5
+ * 使用 drizzle-orm/sqlite-core 定义 SQLite 表结构。
6
+ *
7
+ * 表清单:
8
+ * - pool 股池
9
+ * - pool_stock 股池与股票关联(M:N)
10
+ * - stock 股票基础信息
11
+ * - daily_info 日行情数据
12
+ * - daily_analysis_report 客观分析报告
13
+ * - sentiment_report 舆情报告
14
+ * - analysis_roler 多角色发言记录
15
+ * - final_report 最终报告
16
+ * - config 系统配置
17
+ * - vec_embedding 向量数据
18
+ *
19
+ * 迁移命令:
20
+ * npm run db:generate 生成迁移文件
21
+ * npm run db:migrate 执行迁移
22
+ */
23
+ import { sqliteTable, text, integer, real, blob, uniqueIndex, index } from 'drizzle-orm/sqlite-core';
24
+ // ─── Pool 股池 ───────────────────────────────────────────────
25
+ export const pool = sqliteTable('pool', {
26
+ id: integer('id').primaryKey({ autoIncrement: true }),
27
+ name: text('name').notNull().unique(),
28
+ desc: text('desc').notNull().default(''),
29
+ poolAnalysis: text('pool_analysis').notNull().default(''),
30
+ poolSignal: integer('pool_signal').notNull().default(0), // -1:看空, 0:中性, 1:看多
31
+ createdAt: text('created_at').notNull().default("datetime('now')"),
32
+ updatedAt: text('updated_at').notNull().default("datetime('now')"),
33
+ }, (table) => ({
34
+ nameIdx: index('idx_pool_name').on(table.name),
35
+ signalIdx: index('idx_pool_signal').on(table.poolSignal),
36
+ }));
37
+ // ─── Stock 股票基础信息 ─────────────────────────────────────
38
+ export const stock = sqliteTable('stock', {
39
+ code: text('code').primaryKey(), // 6位代码,如 '600519'
40
+ name: text('name').notNull(),
41
+ currentPrice: real('current_price').notNull().default(0),
42
+ updatedAt: text('updated_at').notNull().default("datetime('now')"),
43
+ }, (table) => ({
44
+ nameIdx: index('idx_stock_name').on(table.name),
45
+ }));
46
+ // ─── PoolStock 股池与股票的关联(M:N)──────────────────────
47
+ export const poolStock = sqliteTable('pool_stock', {
48
+ id: integer('id').primaryKey({ autoIncrement: true }),
49
+ poolId: integer('pool_id').notNull().references(() => pool.id),
50
+ stockCode: text('stock_code').notNull().references(() => stock.code),
51
+ addedAt: text('added_at').notNull().default("datetime('now')"),
52
+ }, (table) => ({
53
+ uniqueIdx: uniqueIndex('idx_pool_stock_unique').on(table.poolId, table.stockCode),
54
+ poolIdx: index('idx_pool_stock_pool').on(table.poolId),
55
+ stockIdx: index('idx_pool_stock_stock').on(table.stockCode),
56
+ }));
57
+ // ─── DailyInfo 日行情数据 ──────────────────────────────────
58
+ export const dailyInfo = sqliteTable('daily_info', {
59
+ id: integer('id').primaryKey({ autoIncrement: true }),
60
+ code: text('code').notNull().references(() => stock.code),
61
+ date: text('date').notNull(), // 'yyyy-MM-dd'
62
+ open: real('open').notNull(),
63
+ high: real('high').notNull(),
64
+ low: real('low').notNull(),
65
+ close: real('close').notNull(),
66
+ volume: integer('volume').notNull(), // 股数
67
+ }, (table) => ({
68
+ codeDateUnique: uniqueIndex('idx_daily_info_unique').on(table.code, table.date),
69
+ codeIdx: index('idx_daily_info_code').on(table.code),
70
+ dateIdx: index('idx_daily_info_date').on(table.date),
71
+ }));
72
+ // ─── DailyAnalysisReport 客观分析报告 ──────────────────────
73
+ export const dailyAnalysisReport = sqliteTable('daily_analysis_report', {
74
+ id: integer('id').primaryKey({ autoIncrement: true }),
75
+ code: text('code').notNull().references(() => stock.code),
76
+ date: text('date').notNull(), // 'yyyy-MM-dd'
77
+ summary: text('summary').notNull().default(''), // 文本摘要
78
+ indicators: text('indicators').notNull().default('{}'), // JSON: 结构化指标数据
79
+ signals: text('signals').notNull().default('{}'), // JSON: 信号标记
80
+ createdAt: text('created_at').notNull().default("datetime('now')"),
81
+ }, (table) => ({
82
+ codeDateUnique: uniqueIndex('idx_dar_unique').on(table.code, table.date),
83
+ codeIdx: index('idx_dar_code').on(table.code),
84
+ dateIdx: index('idx_dar_date').on(table.date),
85
+ }));
86
+ // ─── SentimentReport 舆情报告 ──────────────────────────────
87
+ export const sentimentReport = sqliteTable('sentiment_report', {
88
+ id: integer('id').primaryKey({ autoIncrement: true }),
89
+ code: text('code').notNull().references(() => stock.code),
90
+ date: text('date').notNull(), // 'yyyy-MM-dd'
91
+ report: text('report').notNull().default(''),
92
+ sources: text('sources').notNull().default('[]'), // JSON: 来源列表
93
+ createdAt: text('created_at').notNull().default("datetime('now')"),
94
+ }, (table) => ({
95
+ codeDateUnique: uniqueIndex('idx_sr_unique').on(table.code, table.date),
96
+ codeIdx: index('idx_sr_code').on(table.code),
97
+ dateIdx: index('idx_sr_date').on(table.date),
98
+ }));
99
+ // ─── AnalysisRoler 多角色发言记录 ─────────────────────────
100
+ export const analysisRoler = sqliteTable('analysis_roler', {
101
+ id: integer('id').primaryKey({ autoIncrement: true }),
102
+ code: text('code').notNull().references(() => stock.code),
103
+ date: text('date').notNull(), // 'yyyy-MM-dd'
104
+ role: text('role').notNull(), // 角色名
105
+ responsibility: text('responsibility').notNull().default(''),
106
+ report: text('report').notNull().default(''),
107
+ round: integer('round').notNull().default(1), // 第几轮
108
+ wordCount: integer('word_count').notNull().default(0), // 实际字数
109
+ createdAt: text('created_at').notNull().default("datetime('now')"),
110
+ }, (table) => ({
111
+ codeDateIdx: index('idx_ar_code_date').on(table.code, table.date),
112
+ roleIdx: index('idx_ar_role').on(table.role),
113
+ }));
114
+ // ─── FinalReport 最终报告 ──────────────────────────────────
115
+ export const finalReport = sqliteTable('final_report', {
116
+ id: integer('id').primaryKey({ autoIncrement: true }),
117
+ code: text('code').notNull().references(() => stock.code),
118
+ date: text('date').notNull(), // 'yyyy-MM-dd'
119
+ summary: text('summary').notNull().default(''), // overview 内容
120
+ fullReport: text('full_report').notNull().default(''), // full 内容
121
+ roleSummary: text('role_summary').notNull().default('[]'), // JSON: 各角色核心观点
122
+ pipelineId: text('pipeline_id').notNull().default(''), // 流水线运行 ID
123
+ createdAt: text('created_at').notNull().default("datetime('now')"),
124
+ }, (table) => ({
125
+ codeDateUnique: uniqueIndex('idx_fr_unique').on(table.code, table.date),
126
+ codeIdx: index('idx_fr_code').on(table.code),
127
+ dateIdx: index('idx_fr_date').on(table.date),
128
+ }));
129
+ // ─── Config 系统配置 ──────────────────────────────────────
130
+ export const config = sqliteTable('config', {
131
+ key: text('key').primaryKey(),
132
+ value: text('value').notNull().default(''),
133
+ updatedAt: text('updated_at').notNull().default("datetime('now')"),
134
+ });
135
+ // ─── VecEmbedding 向量数据 ────────────────────────────────
136
+ export const vecEmbedding = sqliteTable('vec_embedding', {
137
+ id: integer('id').primaryKey({ autoIncrement: true }),
138
+ contentType: text('content_type').notNull(), // 'analysis' | 'final'
139
+ contentCode: text('content_code').notNull(), // 股票代码
140
+ contentDate: text('content_date').notNull(), // 报告日期
141
+ contentText: text('content_text').notNull(), // 原始文本(用于溯源)
142
+ embedding: blob('embedding'), // 向量数据(sqlite-vec)
143
+ createdAt: text('created_at').notNull().default("datetime('now')"),
144
+ }, (table) => ({
145
+ typeIdx: index('idx_ve_type').on(table.contentType),
146
+ codeIdx: index('idx_ve_code').on(table.contentCode),
147
+ typeCodeDateIdx: index('idx_ve_type_code_date').on(table.contentType, table.contentCode, table.contentDate),
148
+ }));
149
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * fi-pool-server
3
+ * Fi-Pool-Manager 核心服务入口
4
+ *
5
+ * 数据获取(腾讯财经接口)
6
+ * 本地技术指标计算
7
+ * LLM 分析引擎(LM Studio)
8
+ * 向量检索
9
+ * 舆情搜索(DashScope)
10
+ * 数据库访问(Drizzle ORM + SQLite)
11
+ *
12
+ * 使用方式:
13
+ * ```typescript
14
+ * import { initDatabase, queryTools, managerTools } from 'fi-pool-server';
15
+ *
16
+ * await initDatabase();
17
+ * const pools = await queryTools.listPools();
18
+ * const result = await managerTools.createPool('我的股池');
19
+ * ```
20
+ *
21
+ * 工具模块分类:
22
+ * - managerTools — 股池管理(创建/删除/更新),返回 { success, data/error }
23
+ * - queryTools — 数据查询(直接返回数据,不包装)
24
+ * - commandTools — 报告输出与操作型接口
25
+ * - executeTools — 流水线执行(返回 { success, data/error })
26
+ * - auxiliaryTools — 辅助功能(帮助、配置、状态)
27
+ *
28
+ * @module fi-pool-server
29
+ */
30
+ export { initDatabase, getDatabase, closeDatabase, getDbPath } from './db/index.js';
31
+ export { ensureDatabase } from './db/migrate.js';
32
+ export * from './db/schema.js';
33
+ export * as managerTools from './tools/manager.js';
34
+ export * as queryTools from './tools/query.js';
35
+ export * as commandTools from './tools/command.js';
36
+ export * as executeTools from './tools/execute.js';
37
+ export * as auxiliaryTools from './tools/auxiliary.js';
38
+ export * as stockService from './services/stock.js';
39
+ export * as poolService from './services/pool.js';
40
+ export * as dailyInfoService from './services/daily-info.js';
41
+ export * as analysisService from './services/analysis.js';
42
+ export * as llmService from './services/llm.js';
43
+ export * as sentimentService from './services/sentiment.js';
44
+ export * as sessionService from './services/session.js';
45
+ export * as wordCountService from './services/word-count.js';
46
+ export * as embeddingService from './services/embedding.js';
47
+ export { runFullPipeline, runLocalAnalysis, stage1FetchData } from './services/pipeline.js';
48
+ declare let VERSION: string;
49
+ export { VERSION };
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,cAAc,gBAAgB,CAAC;AAI/B,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAIvD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAY5F,QAAA,IAAI,OAAO,QAAU,CAAC;AAQtB,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * fi-pool-server
3
+ * Fi-Pool-Manager 核心服务入口
4
+ *
5
+ * 数据获取(腾讯财经接口)
6
+ * 本地技术指标计算
7
+ * LLM 分析引擎(LM Studio)
8
+ * 向量检索
9
+ * 舆情搜索(DashScope)
10
+ * 数据库访问(Drizzle ORM + SQLite)
11
+ *
12
+ * 使用方式:
13
+ * ```typescript
14
+ * import { initDatabase, queryTools, managerTools } from 'fi-pool-server';
15
+ *
16
+ * await initDatabase();
17
+ * const pools = await queryTools.listPools();
18
+ * const result = await managerTools.createPool('我的股池');
19
+ * ```
20
+ *
21
+ * 工具模块分类:
22
+ * - managerTools — 股池管理(创建/删除/更新),返回 { success, data/error }
23
+ * - queryTools — 数据查询(直接返回数据,不包装)
24
+ * - commandTools — 报告输出与操作型接口
25
+ * - executeTools — 流水线执行(返回 { success, data/error })
26
+ * - auxiliaryTools — 辅助功能(帮助、配置、状态)
27
+ *
28
+ * @module fi-pool-server
29
+ */
30
+ // ─── 数据库 ────────────────────────────────────────────────────
31
+ export { initDatabase, getDatabase, closeDatabase, getDbPath } from './db/index.js';
32
+ export { ensureDatabase } from './db/migrate.js';
33
+ // ─── 数据库 Schema(供外部高级使用)─────────────────────────
34
+ export * from './db/schema.js';
35
+ // ─── 工具模块 ──────────────────────────────────────────────────
36
+ export * as managerTools from './tools/manager.js';
37
+ export * as queryTools from './tools/query.js';
38
+ export * as commandTools from './tools/command.js';
39
+ export * as executeTools from './tools/execute.js';
40
+ export * as auxiliaryTools from './tools/auxiliary.js';
41
+ // ─── 核心服务(供深度集成使用)───────────────────────────────
42
+ export * as stockService from './services/stock.js';
43
+ export * as poolService from './services/pool.js';
44
+ export * as dailyInfoService from './services/daily-info.js';
45
+ export * as analysisService from './services/analysis.js';
46
+ export * as llmService from './services/llm.js';
47
+ export * as sentimentService from './services/sentiment.js';
48
+ export * as sessionService from './services/session.js';
49
+ export * as wordCountService from './services/word-count.js';
50
+ export * as embeddingService from './services/embedding.js';
51
+ // ─── 流水线编排器(独立入口点)─────────────────────────────
52
+ export { runFullPipeline, runLocalAnalysis, stage1FetchData } from './services/pipeline.js';
53
+ // ─── 版本号(从 package.json 读取,保持与发布版本同步)──────
54
+ import { readFileSync } from 'fs';
55
+ import { fileURLToPath } from 'url';
56
+ import { dirname, resolve } from 'path';
57
+ const __filename = fileURLToPath(import.meta.url);
58
+ const __dirname = dirname(__filename);
59
+ const pkgPath = resolve(__dirname, '../package.json');
60
+ let VERSION = '0.0.0';
61
+ try {
62
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
63
+ VERSION = pkg.version || VERSION;
64
+ }
65
+ catch {
66
+ // 无法读取时保持默认
67
+ }
68
+ export { VERSION };
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,+DAA+D;AAE/D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,mDAAmD;AAEnD,cAAc,gBAAgB,CAAC;AAE/B,8DAA8D;AAE9D,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAEvD,mDAAmD;AAEnD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAE5D,iDAAiD;AAEjD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE5F,6CAA6C;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAExC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEtD,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AACnC,CAAC;AAAC,MAAM,CAAC;IACP,YAAY;AACd,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * 技术分析与信号检测服务
3
+ *
4
+ * 将 utils/indicators 和 utils/signals 中的纯函数组合为
5
+ * 面向流水线场景的高级分析接口。
6
+ *
7
+ * @module services/analysis
8
+ */
9
+ import type { OHLCV } from '../utils/indicators.js';
10
+ import { type Signals } from '../utils/signals.js';
11
+ /**
12
+ * 结构化技术指标。
13
+ * 对应 daily_analysis_report.indicators 字段的 JSON 结构。
14
+ */
15
+ export interface Indicators {
16
+ priceChangePct: number;
17
+ amplitude: number;
18
+ ma: {
19
+ ma5: number | null;
20
+ ma10: number | null;
21
+ ma20: number | null;
22
+ ma60: number | null;
23
+ };
24
+ macd: {
25
+ dif: number | null;
26
+ dea: number | null;
27
+ histogram: number | null;
28
+ };
29
+ rsi: {
30
+ rsi6: number | null;
31
+ rsi14: number | null;
32
+ };
33
+ kdj: {
34
+ k: number | null;
35
+ d: number | null;
36
+ j: number | null;
37
+ };
38
+ bb: {
39
+ upper: number | null;
40
+ mid: number | null;
41
+ lower: number | null;
42
+ };
43
+ }
44
+ /**
45
+ * 对一组 OHLCV 数据计算完整的技术指标集合。
46
+ *
47
+ * @param data - OHLCV 日行情数组(按日期升序)
48
+ * @returns 结构化指标对象,最新位置的有效值
49
+ *
50
+ * @example
51
+ * const ind = computeIndicators(ohlcvData);
52
+ * console.log(ind.ma.ma5, ind.rsi.rsi14);
53
+ */
54
+ export declare function computeIndicators(data: OHLCV[]): Indicators;
55
+ /**
56
+ * 检测技术信号。
57
+ *
58
+ * @param data - OHLCV 数组
59
+ * @returns 信号检测结果
60
+ */
61
+ export declare function computeSignals(data: OHLCV[]): Signals;
62
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/services/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1F,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3E,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9D,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CA2C3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAUrD"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 技术分析与信号检测服务
3
+ *
4
+ * 将 utils/indicators 和 utils/signals 中的纯函数组合为
5
+ * 面向流水线场景的高级分析接口。
6
+ *
7
+ * @module services/analysis
8
+ */
9
+ import { calcMA, calcMACD, calcRSI, calcKDJ, calcBollinger, calcPriceChangePct, calcAmplitude } from '../utils/indicators.js';
10
+ import { detectSignals } from '../utils/signals.js';
11
+ /**
12
+ * 对一组 OHLCV 数据计算完整的技术指标集合。
13
+ *
14
+ * @param data - OHLCV 日行情数组(按日期升序)
15
+ * @returns 结构化指标对象,最新位置的有效值
16
+ *
17
+ * @example
18
+ * const ind = computeIndicators(ohlcvData);
19
+ * console.log(ind.ma.ma5, ind.rsi.rsi14);
20
+ */
21
+ export function computeIndicators(data) {
22
+ const lastIdx = data.length - 1;
23
+ const ma5 = calcMA(data, 5);
24
+ const ma10 = calcMA(data, 10);
25
+ const ma20 = calcMA(data, 20);
26
+ const ma60 = calcMA(data, 60);
27
+ const { dif, dea, histogram } = calcMACD(data);
28
+ const rsi6 = calcRSI(data, 6);
29
+ const rsi14 = calcRSI(data, 14);
30
+ const { k, d, j } = calcKDJ(data);
31
+ const { upper, mid, lower } = calcBollinger(data);
32
+ return {
33
+ priceChangePct: calcPriceChangePct(data, lastIdx),
34
+ amplitude: calcAmplitude(data, lastIdx),
35
+ ma: {
36
+ ma5: ma5[lastIdx] ?? null,
37
+ ma10: ma10[lastIdx] ?? null,
38
+ ma20: ma20[lastIdx] ?? null,
39
+ ma60: data.length >= 60 ? (ma60[lastIdx] ?? null) : null,
40
+ },
41
+ macd: {
42
+ dif: dif[lastIdx] ?? null,
43
+ dea: dea[lastIdx] ?? null,
44
+ histogram: histogram[lastIdx] ?? null,
45
+ },
46
+ rsi: {
47
+ rsi6: rsi6[lastIdx] ?? null,
48
+ rsi14: rsi14[lastIdx] ?? null,
49
+ },
50
+ kdj: {
51
+ k: k[lastIdx] ?? null,
52
+ d: d[lastIdx] ?? null,
53
+ j: j[lastIdx] ?? null,
54
+ },
55
+ bb: {
56
+ upper: upper[lastIdx] ?? null,
57
+ mid: mid[lastIdx] ?? null,
58
+ lower: lower[lastIdx] ?? null,
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * 检测技术信号。
64
+ *
65
+ * @param data - OHLCV 数组
66
+ * @returns 信号检测结果
67
+ */
68
+ export function computeSignals(data) {
69
+ const ma5 = calcMA(data, 5);
70
+ const ma10 = calcMA(data, 10);
71
+ const rsi14 = calcRSI(data, 14);
72
+ return detectSignals(data, { ma5: ma5[ma5.length - 1] ?? null, ma10: ma10[ma10.length - 1] ?? null }, rsi14[rsi14.length - 1] ?? null);
73
+ }
74
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/services/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9H,OAAO,EAAE,aAAa,EAAgB,MAAM,qBAAqB,CAAC;AAgBlE;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAElD,OAAO;QACL,cAAc,EAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;QACvC,EAAE,EAAE;YACF,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YACzB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI;YAC3B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI;YAC3B,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACzD;QACD,IAAI,EAAE;YACJ,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YACzB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YACzB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI;SACtC;QACD,GAAG,EAAE;YACH,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI;YAC3B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;SAC9B;QACD,GAAG,EAAE;YACH,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;YACrB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;YACrB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI;SACtB;QACD,EAAE,EAAE;YACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;YAC7B,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;YACzB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI;SAC9B;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEhC,OAAO,aAAa,CAClB,IAAI,EACJ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,EACzE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 日行情数据服务
3
+ *
4
+ * 提供上游职责:
5
+ * 1. 从腾讯财经接口获取历史 K 线数据和实时报价
6
+ * 2. 将获取的数据批量写入 daily_info 表(upsert)
7
+ * 3. 查询已入库的日行情数据
8
+ * 4. 刷新数据入口(单只或全量)
9
+ *
10
+ * 内置请求频率控制:相邻两次 HTTP 调用至少间隔 1200ms。
11
+ *
12
+ * @module services/daily-info
13
+ */
14
+ /**
15
+ * 根据股票代码判断所属市场,返回前缀标识。
16
+ *
17
+ * 上海:600/601/603/605/688/900
18
+ * 深圳:000/001/002/300/301/200
19
+ *
20
+ * @param code - 六位股票代码
21
+ * @returns 'sh' 或 'sz'
22
+ *
23
+ * @example
24
+ * getMarketPrefix('600519') // => 'sh'
25
+ * getMarketPrefix('000001') // => 'sz'
26
+ */
27
+ export declare function getMarketPrefix(code: string): 'sh' | 'sz';
28
+ /**
29
+ * 行情 K 线数据点接口。
30
+ */
31
+ export interface OHLCV {
32
+ /** 交易日期,格式 'yyyy-MM-dd' */
33
+ date: string;
34
+ /** 开盘价 */
35
+ open: number;
36
+ /** 最高价 */
37
+ high: number;
38
+ /** 最低价 */
39
+ low: number;
40
+ /** 收盘价 */
41
+ close: number;
42
+ /** 成交量(股数) */
43
+ volume: number;
44
+ }
45
+ /**
46
+ * 从腾讯财经接口获取最近 60 个交易日的日 K 线数据。
47
+ *
48
+ * 使用的接口:
49
+ * http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param=${marketCode},day,,,60,qfq
50
+ *
51
+ * 返回数据的 day/qfqday 数组格式为 [date, open, close, high, low, volume]。
52
+ *
53
+ * @param code - 六位股票代码
54
+ * @returns 日 K 线数据数组(按日期升序,最近的在最后)
55
+ *
56
+ * @example
57
+ * const data = await fetchFromTencent('600519');
58
+ * console.log(data.length); // <= 60
59
+ */
60
+ export declare function fetchFromTencent(code: string): Promise<OHLCV[]>;
61
+ /**
62
+ * 实时行情数据点接口。
63
+ */
64
+ export interface RealTimeQuote {
65
+ /** 当前最新价格 */
66
+ price: number;
67
+ /** 股票名称 */
68
+ name: string;
69
+ }
70
+ /**
71
+ * 从腾讯实时行情接口获取当前价格和名称。
72
+ * 使用的接口:
73
+ * https://web.sqt.gtimg.cn/q=sh${code} 或 sz${code}
74
+ *
75
+ * 返回 JSONP 格式文本,解析为股票数据字段数组后提取所需信息。
76
+ *
77
+ * @param code - 六位股票代码
78
+ * @returns 实时行情 { price, name }
79
+ *
80
+ * @example
81
+ * const { price, name } = await fetchRealTimeQuote('600519');
82
+ * // => { price: 1915.00, name: '贵州茅台' }
83
+ */
84
+ export declare function fetchRealTimeQuote(code: string): Promise<RealTimeQuote>;
85
+ /**
86
+ * 批量插入或更新日行情数据。
87
+ * 按 (code, date) 唯一约束执行 upsert:
88
+ * - 已存在记录:更新 open/high/low/close/volume
89
+ * - 不存在记录:新增
90
+ *
91
+ * @param records - 行情数据记录数组
92
+ * @returns 成功处理的记录数
93
+ *
94
+ * @example
95
+ * const n = await upsertDailyInfo([
96
+ * { code: '600519', date: '2024-06-01', open: 1500, high: 1510, low: 1490, close: 1505, volume: 1000000 },
97
+ * ]);
98
+ * // n === 1
99
+ */
100
+ export declare function upsertDailyInfo(records: {
101
+ code: string;
102
+ date: string;
103
+ open: number;
104
+ high: number;
105
+ low: number;
106
+ close: number;
107
+ volume: number;
108
+ }[]): Promise<number>;
109
+ /**
110
+ * 查询指定股票的日行情数据。
111
+ * 可选的日期范围过滤。
112
+ *
113
+ * @param code - 股票代码
114
+ * @param startDate - 起始日期 'yyyy-MM-dd'(含),不指定则不限制起始
115
+ * @param endDate - 结束日期 'yyyy-MM-dd'(含),不指定则不限制结束
116
+ * @returns 日行情数据数组(按日期升序)
117
+ *
118
+ * @example
119
+ * // 获取最近 10 天的数据
120
+ * const data = await getDailyInfo('600519', '2024-05-01', '2024-06-01');
121
+ */
122
+ export declare function getDailyInfo(code: string, startDate?: string, endDate?: string): Promise<{
123
+ date: string;
124
+ id: number;
125
+ code: string;
126
+ open: number;
127
+ high: number;
128
+ low: number;
129
+ close: number;
130
+ volume: number;
131
+ }[]>;
132
+ /**
133
+ * 刷新最新行情数据。
134
+ *
135
+ * - 当指定 code 时:获取该股票的最新实时行情和 K 线数据,更新 stock 表和 daily_info 表。
136
+ * - 当不指定 code 时:遍历数据库中所有股票,逐个刷新。
137
+ *
138
+ * @param code - 可选股票代码。不传则刷新全部
139
+ * @returns 更新的 daily_info 记录总数
140
+ *
141
+ * @example
142
+ * // 刷新单只
143
+ * const { updated } = await refreshData('600519');
144
+ * // 刷新全部
145
+ * const { updated } = await refreshData();
146
+ */
147
+ export declare function refreshData(code?: string): Promise<{
148
+ updated: number;
149
+ }>;
150
+ //# sourceMappingURL=daily-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daily-info.d.ts","sourceRoot":"","sources":["../../src/services/daily-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8BH;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAQzD;AAcD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU;IACV,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAuCrE;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC7E;AAyBD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,EAAE,GACF,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM;;;;;;;;;KAmBjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAC/B,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA4C9B"}