@sayue_ltr/fleq 1.50.0 → 1.51.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 (92) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +47 -5
  3. package/dist/config.js +35 -2
  4. package/dist/dmdata/rest-client.js +58 -3
  5. package/dist/dmdata/telegram-parser.js +37 -59
  6. package/dist/dmdata/ws-client.js +49 -18
  7. package/dist/engine/cli/cli-run.js +71 -1
  8. package/dist/engine/cli/cli.js +12 -0
  9. package/dist/engine/filter/compile-filter.js +21 -0
  10. package/dist/engine/filter/compiler.js +188 -0
  11. package/dist/engine/filter/errors.js +41 -0
  12. package/dist/engine/filter/field-registry.js +78 -0
  13. package/dist/engine/filter/index.js +15 -0
  14. package/dist/engine/filter/parser.js +137 -0
  15. package/dist/engine/filter/rank-maps.js +34 -0
  16. package/dist/engine/filter/tokenizer.js +121 -0
  17. package/dist/engine/filter/type-checker.js +104 -0
  18. package/dist/engine/filter/types.js +2 -0
  19. package/dist/engine/filter-template/pipeline-controller.js +73 -0
  20. package/dist/engine/filter-template/pipeline.js +16 -0
  21. package/dist/engine/messages/display-callbacks.js +7 -0
  22. package/dist/engine/messages/message-router.js +114 -182
  23. package/dist/engine/messages/summary-tracker.js +106 -0
  24. package/dist/engine/messages/telegram-stats.js +103 -0
  25. package/dist/engine/messages/volcano-route-handler.js +122 -0
  26. package/dist/engine/monitor/monitor.js +51 -3
  27. package/dist/engine/monitor/shutdown.js +1 -0
  28. package/dist/engine/notification/notifier.js +16 -1
  29. package/dist/engine/notification/sound-player.js +193 -28
  30. package/dist/engine/presentation/diff-store.js +158 -0
  31. package/dist/engine/presentation/diff-types.js +2 -0
  32. package/dist/engine/presentation/events/from-earthquake.js +53 -0
  33. package/dist/engine/presentation/events/from-eew.js +72 -0
  34. package/dist/engine/presentation/events/from-lg-observation.js +58 -0
  35. package/dist/engine/presentation/events/from-nankai-trough.js +39 -0
  36. package/dist/engine/presentation/events/from-raw.js +35 -0
  37. package/dist/engine/presentation/events/from-seismic-text.js +37 -0
  38. package/dist/engine/presentation/events/from-tsunami.js +51 -0
  39. package/dist/engine/presentation/events/from-volcano.js +88 -0
  40. package/dist/engine/presentation/events/to-presentation-event.js +32 -0
  41. package/dist/engine/presentation/level-helpers.js +118 -0
  42. package/dist/engine/presentation/processors/process-earthquake.js +36 -0
  43. package/dist/engine/presentation/processors/process-eew.js +90 -0
  44. package/dist/engine/presentation/processors/process-lg-observation.js +30 -0
  45. package/dist/engine/presentation/processors/process-message.js +53 -0
  46. package/dist/engine/presentation/processors/process-nankai-trough.js +30 -0
  47. package/dist/engine/presentation/processors/process-raw.js +22 -0
  48. package/dist/engine/presentation/processors/process-seismic-text.js +30 -0
  49. package/dist/engine/presentation/processors/process-tsunami.js +42 -0
  50. package/dist/engine/presentation/processors/process-volcano.js +41 -0
  51. package/dist/engine/presentation/types.js +2 -0
  52. package/dist/engine/startup/config-resolver.js +2 -0
  53. package/dist/engine/template/compile-template.js +18 -0
  54. package/dist/engine/template/compiler.js +102 -0
  55. package/dist/engine/template/field-accessor.js +25 -0
  56. package/dist/engine/template/filters.js +94 -0
  57. package/dist/engine/template/index.js +5 -0
  58. package/dist/engine/template/parser.js +190 -0
  59. package/dist/engine/template/tokenizer.js +96 -0
  60. package/dist/engine/template/types.js +2 -0
  61. package/dist/types.js +2 -1
  62. package/dist/ui/display-adapter.js +60 -0
  63. package/dist/ui/earthquake-formatter.js +17 -5
  64. package/dist/ui/eew-formatter.js +25 -10
  65. package/dist/ui/formatter.js +67 -32
  66. package/dist/ui/minimap/grid-layout.js +91 -0
  67. package/dist/ui/minimap/index.js +16 -0
  68. package/dist/ui/minimap/minimap-renderer.js +277 -0
  69. package/dist/ui/minimap/pref-mapping.js +82 -0
  70. package/dist/ui/minimap/types.js +2 -0
  71. package/dist/ui/night-overlay.js +56 -0
  72. package/dist/ui/repl-handlers/command-definitions.js +320 -0
  73. package/dist/ui/repl-handlers/index.js +11 -0
  74. package/dist/ui/repl-handlers/info-handlers.js +577 -0
  75. package/dist/ui/repl-handlers/operation-handlers.js +233 -0
  76. package/dist/ui/repl-handlers/settings-handlers.js +923 -0
  77. package/dist/ui/repl-handlers/types.js +10 -0
  78. package/dist/ui/repl.js +81 -1752
  79. package/dist/ui/statistics-formatter.js +208 -0
  80. package/dist/ui/status-line.js +69 -0
  81. package/dist/ui/summary/index.js +5 -0
  82. package/dist/ui/summary/summary-line.js +18 -0
  83. package/dist/ui/summary/summary-model.js +31 -0
  84. package/dist/ui/summary/token-builders.js +317 -0
  85. package/dist/ui/summary/types.js +2 -0
  86. package/dist/ui/summary/width-fit.js +41 -0
  87. package/dist/ui/summary-interval-formatter.js +72 -0
  88. package/dist/ui/theme.js +34 -5
  89. package/dist/ui/tip-shuffler.js +81 -0
  90. package/dist/ui/volcano-formatter.js +15 -13
  91. package/dist/ui/waiting-tips.js +289 -249
  92. package/package.json +1 -1
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildCommandMap = buildCommandMap;
37
+ const info = __importStar(require("./info-handlers"));
38
+ const settings = __importStar(require("./settings-handlers"));
39
+ const ops = __importStar(require("./operation-handlers"));
40
+ /** コマンド定義を生成する。ctx は遅延参照されるため、構築時点で ReplContext が完成している必要はない */
41
+ function buildCommandMap(getCtx) {
42
+ return {
43
+ help: {
44
+ description: "コマンド一覧を表示 (例: help status)",
45
+ detail: "引数なしで一覧表示。help <command> でコマンドの詳細を表示。",
46
+ category: "info",
47
+ handler: (args) => info.handleHelp(getCtx(), args),
48
+ },
49
+ "?": {
50
+ description: "help のエイリアス",
51
+ category: "info",
52
+ handler: (args) => info.handleHelp(getCtx(), args),
53
+ },
54
+ history: {
55
+ description: "地震履歴を取得・表示 (例: history 5)",
56
+ detail: "dmdata.jp API から直近の地震履歴を取得します。\n 引数: 件数 (1〜100, デフォルト10)\n 例: history 20",
57
+ category: "info",
58
+ handler: (args) => info.handleHistory(getCtx(), args),
59
+ },
60
+ stats: {
61
+ description: "電文統計を表示",
62
+ category: "info",
63
+ handler: () => info.handleStats(getCtx()),
64
+ },
65
+ colors: {
66
+ description: "カラーパレット・震度色の一覧を表示",
67
+ detail: "CUD (カラーユニバーサルデザイン) パレットと、\n 震度・長周期地震動階級・フレームレベルに対応する色を確認できます。",
68
+ category: "info",
69
+ handler: () => info.handleColors(),
70
+ },
71
+ detail: {
72
+ description: "直近の情報を再表示 (例: detail tsunami, detail volcano)",
73
+ detail: "引数なし: 津波情報を再表示 (デフォルト)\n detail tsunami: 津波情報を再表示\n detail volcano: 火山警報状態を再表示",
74
+ category: "info",
75
+ subcommands: {
76
+ tsunami: { description: "津波情報を再表示" },
77
+ volcano: { description: "火山警報状態を再表示" },
78
+ },
79
+ handler: (args) => info.handleDetail(getCtx(), args),
80
+ },
81
+ status: {
82
+ description: "WebSocket 接続状態を表示",
83
+ detail: "現在の WebSocket 接続状態、SocketID、再接続試行回数を表示します。",
84
+ category: "status",
85
+ handler: () => info.handleStatus(getCtx()),
86
+ },
87
+ config: {
88
+ description: "現在の設定を表示",
89
+ detail: "Configファイルに保存された設定を一覧表示します。",
90
+ category: "status",
91
+ handler: () => info.handleConfig(),
92
+ },
93
+ contract: {
94
+ description: "契約区分一覧を表示",
95
+ detail: "dmdata.jp で契約している区分を API から取得して表示します。",
96
+ category: "status",
97
+ handler: () => info.handleContract(getCtx()),
98
+ },
99
+ socket: {
100
+ description: "接続中のソケット一覧を表示",
101
+ detail: "dmdata.jp で現在開いているソケット一覧を表示します。",
102
+ category: "status",
103
+ handler: () => info.handleSocket(getCtx()),
104
+ },
105
+ notify: {
106
+ description: "通知設定の表示・切替 (例: notify eew on)",
107
+ detail: "引数なし: 現在の通知設定を一覧表示\n notify <category>: トグル切替\n notify <category> on: 有効にする\n notify <category> off: 無効にする\n notify all:on / all:off: 一括操作\n カテゴリ: eew, earthquake, tsunami, seismicText, nankaiTrough, lgObservation, volcano",
108
+ category: "settings",
109
+ subcommands: {
110
+ "<category>": { description: "トグル切替 / on / off" },
111
+ "all:on": { description: "全カテゴリを有効にする" },
112
+ "all:off": { description: "全カテゴリを無効にする" },
113
+ },
114
+ handler: (args) => settings.handleNotify(getCtx(), args),
115
+ },
116
+ eewlog: {
117
+ description: "EEWログ記録の設定 (例: eewlog on / eewlog fields)",
118
+ detail: "eewlog: 現在のログ記録設定を表示\n eewlog on: ログ記録を有効にする\n eewlog off: ログ記録を無効にする\n eewlog fields: 記録項目の一覧表示 (グループ別)\n eewlog fields <field>: 項目のトグル切替\n eewlog fields <field> on/off: 項目の有効/無効\n [震源] hypocenter, originTime, coordinates\n [規模] magnitude\n [変化] diff, maxIntChangeReason\n [予測概要] forecastIntensity, maxLgInt\n [予測地域] forecastAreas, lgIntensity, isPlum, hasArrived",
119
+ category: "settings",
120
+ subcommands: {
121
+ on: { description: "ログ記録を有効にする" },
122
+ off: { description: "ログ記録を無効にする" },
123
+ fields: { description: "記録項目の一覧・切替" },
124
+ },
125
+ handler: (args) => settings.handleEewLog(getCtx(), args),
126
+ },
127
+ tablewidth: {
128
+ description: "テーブル幅の表示・変更 (例: tablewidth 80 / tablewidth auto)",
129
+ detail: "引数なし: 現在のテーブル幅を表示\n tablewidth <40〜200>: テーブル幅を固定値に変更\n tablewidth auto: ターミナル幅に自動追従 (デフォルト)\n 変更は即座に反映され、Configファイルに保存されます。",
130
+ category: "settings",
131
+ subcommands: {
132
+ "<40-200>": { description: "テーブル幅を固定値に変更" },
133
+ auto: { description: "ターミナル幅に自動追従" },
134
+ },
135
+ handler: (args) => settings.handleTableWidth(getCtx(), args),
136
+ },
137
+ infotext: {
138
+ description: "お知らせ電文の全文/省略切替 (例: infotext full)",
139
+ detail: "infotext full: 全文表示\n infotext short: 省略表示 (デフォルト)",
140
+ category: "settings",
141
+ subcommands: {
142
+ full: { description: "全文表示" },
143
+ short: { description: "省略表示 (デフォルト)" },
144
+ },
145
+ handler: (args) => settings.handleInfoText(getCtx(), args),
146
+ },
147
+ tipinterval: {
148
+ description: "待機中ヒント表示間隔の表示・変更 (例: tipinterval 15)",
149
+ detail: "tipinterval: 現在のヒント間隔(分)を表示\n tipinterval <0〜1440>: ヒント間隔を分で変更 (0で無効)",
150
+ category: "settings",
151
+ subcommands: {
152
+ "<0-1440>": { description: "ヒント間隔を分で変更 (0で無効)" },
153
+ },
154
+ handler: (args) => settings.handleTipInterval(getCtx(), args),
155
+ },
156
+ mode: {
157
+ description: "表示モード切替 (例: mode compact)",
158
+ detail: "mode: 現在のモードを表示\n mode normal: フルフレーム表示 (デフォルト)\n mode compact: 1行サマリー表示\n 長時間モニタリング時は compact がおすすめです。",
159
+ category: "settings",
160
+ subcommands: {
161
+ normal: { description: "フルフレーム表示 (デフォルト)" },
162
+ compact: { description: "1行サマリー表示" },
163
+ },
164
+ handler: (args) => settings.handleMode(getCtx(), args),
165
+ },
166
+ filter: {
167
+ description: "フィルタの表示・設定 (例: filter set domain = \"eew\")",
168
+ detail: "filter: 現在のフィルタ状態を表示\n filter set <expr>: フィルタを即時適用\n filter clear: フィルタを解除\n filter test <expr>: 構文チェックのみ(適用しない)",
169
+ category: "settings",
170
+ subcommands: {
171
+ set: { description: "フィルタを即時適用" },
172
+ clear: { description: "フィルタを解除" },
173
+ test: { description: "構文チェックのみ" },
174
+ },
175
+ handler: (args) => settings.handleFilter(getCtx(), args),
176
+ },
177
+ focus: {
178
+ description: "focus の表示・設定",
179
+ detail: "focus: 現在の状態表示\n focus <expr>: 適用\n focus off: 解除",
180
+ category: "settings",
181
+ subcommands: {
182
+ "<expr>": { description: "focus を適用" },
183
+ off: { description: "focus を解除" },
184
+ },
185
+ handler: (args) => settings.handleFocus(getCtx(), args),
186
+ },
187
+ clock: {
188
+ description: "プロンプト時計の切替 (例: clock / clock elapsed)",
189
+ detail: "clock: 経過時間/現在時刻をトグル切替\n clock elapsed: 経過時間表示 (デフォルト)\n clock now: 現在時刻表示",
190
+ category: "settings",
191
+ subcommands: {
192
+ elapsed: { description: "経過時間表示 (デフォルト)" },
193
+ now: { description: "現在時刻表示" },
194
+ },
195
+ handler: (args) => settings.handleClock(getCtx(), args),
196
+ },
197
+ night: {
198
+ description: "ナイトモードの切替",
199
+ detail: "night: 現在の状態表示\n night on: ナイトモード有効\n night off: ナイトモード無効",
200
+ category: "settings",
201
+ subcommands: {
202
+ on: { description: "有効にする" },
203
+ off: { description: "無効にする" },
204
+ },
205
+ handler: (args) => settings.handleNight(getCtx(), args),
206
+ },
207
+ summary: {
208
+ description: "定期要約の表示・設定 (on [分] で間隔指定可)",
209
+ detail: "summary: 現在の設定を表示\n summary on [N]: N分間隔で要約 (デフォルト10分)\n summary off: 停止\n summary now: 今すぐ要約表示",
210
+ category: "settings",
211
+ subcommands: {
212
+ on: { description: "定期要約を開始" },
213
+ off: { description: "定期要約を停止" },
214
+ now: { description: "今すぐ要約を表示" },
215
+ },
216
+ handler: (args) => settings.handleSummary(getCtx(), args),
217
+ },
218
+ sound: {
219
+ description: "通知音の ON/OFF 切替",
220
+ detail: "sound: 現在の状態を表示\n sound on: 通知音を有効にする\n sound off: 通知音を無効にする",
221
+ category: "settings",
222
+ subcommands: {
223
+ on: { description: "通知音を有効にする" },
224
+ off: { description: "通知音を無効にする" },
225
+ },
226
+ handler: (args) => settings.handleSound(getCtx(), args),
227
+ },
228
+ theme: {
229
+ description: "カラーテーマの表示・管理 (例: theme path / theme reload)",
230
+ detail: "theme: テーマ概要を表示\n theme path: theme.json のパスを表示\n theme show: 全パレット色・全ロールスタイルを一覧表示\n theme reset: デフォルト theme.json を書き出し\n theme reload: theme.json を再読込\n theme validate: theme.json を検証",
231
+ category: "settings",
232
+ subcommands: {
233
+ path: { description: "theme.json のパスを表示" },
234
+ show: { description: "全パレット色・ロールスタイル一覧" },
235
+ reset: { description: "デフォルト theme.json を書き出し" },
236
+ reload: { description: "theme.json を再読込" },
237
+ validate: { description: "theme.json を検証" },
238
+ },
239
+ handler: (args) => settings.handleTheme(getCtx(), args),
240
+ },
241
+ mute: {
242
+ description: "通知を一時ミュート (例: mute 30m)",
243
+ detail: "mute: 現在のミュート状態を表示\n mute <duration>: 指定時間ミュート (例: 30m, 1h, 90s)\n mute off: ミュート解除",
244
+ category: "settings",
245
+ subcommands: {
246
+ "<duration>": { description: "指定時間ミュート (例: 30m, 1h)" },
247
+ off: { description: "ミュート解除" },
248
+ },
249
+ handler: (args) => settings.handleMute(getCtx(), args),
250
+ },
251
+ fold: {
252
+ description: "観測点の表示件数制限 (例: fold 10 / fold off)",
253
+ detail: "fold: 現在の設定を表示\n fold <N>: 上位N件に制限\n fold off: 全件表示に戻す",
254
+ category: "settings",
255
+ subcommands: {
256
+ "<N>": { description: "観測点を上位N件に制限 (1〜999)" },
257
+ off: { description: "全件表示に戻す" },
258
+ },
259
+ handler: (args) => settings.handleFold(getCtx(), args),
260
+ },
261
+ limit: {
262
+ description: "省略表示の上限設定 (例: limit volcanoAlertLines 15)",
263
+ detail: "limit: 現在の省略設定を一覧表示\n limit <key> <N>: 上限値を変更 (1〜999)\n limit <key> default: デフォルト値に戻す\n limit reset: 全項目をデフォルトに戻す",
264
+ category: "settings",
265
+ subcommands: {
266
+ "<key> <N>": { description: "上限値を変更 (1〜999)" },
267
+ "<key> default": { description: "デフォルト値に戻す" },
268
+ reset: { description: "全項目をデフォルトに戻す" },
269
+ },
270
+ handler: (args) => settings.handleLimit(getCtx(), args),
271
+ },
272
+ test: {
273
+ description: "テスト機能",
274
+ detail: "test sound [level]: サウンドテスト\n test table [type] [番号]: 表示形式テスト",
275
+ category: "operation",
276
+ subcommands: {
277
+ sound: {
278
+ description: "サウンドテスト",
279
+ detail: "引数なし: 利用可能なサウンドレベル一覧を表示\n test sound <level>: 指定レベルのサウンドを再生\n レベル: critical, warning, normal, info, cancel",
280
+ },
281
+ table: {
282
+ description: "表示形式テスト",
283
+ detail: "引数なし: 利用可能な電文タイプ一覧を表示\n test table <type>: バリエーション一覧を表示\n test table <type> <番号>: 指定バリエーションを表示\n タイプ: earthquake, eew, tsunami, seismicText, nankaiTrough, lgObservation, volcano",
284
+ },
285
+ },
286
+ handler: (args) => ops.handleTest(getCtx(), args),
287
+ },
288
+ clear: {
289
+ description: "ターミナル画面をクリア",
290
+ category: "operation",
291
+ handler: () => ops.handleClear(),
292
+ },
293
+ backup: {
294
+ description: "EEW副回線の起動/停止 (例: backup on)",
295
+ detail: "backup: 副回線の状態を表示\n backup on: 副回線を起動\n backup off: 副回線を停止",
296
+ category: "operation",
297
+ subcommands: {
298
+ on: { description: "副回線を起動" },
299
+ off: { description: "副回線を停止" },
300
+ },
301
+ handler: (args) => ops.handleBackup(getCtx(), args),
302
+ },
303
+ retry: {
304
+ description: "WebSocket 再接続を試行",
305
+ detail: "切断中の場合に手動で再接続を試みます。",
306
+ category: "operation",
307
+ handler: () => ops.handleRetry(getCtx()),
308
+ },
309
+ quit: {
310
+ description: "アプリケーションを終了",
311
+ category: "operation",
312
+ handler: () => ops.handleQuit(getCtx()),
313
+ },
314
+ exit: {
315
+ description: "quit のエイリアス",
316
+ category: "operation",
317
+ handler: () => ops.handleQuit(getCtx()),
318
+ },
319
+ };
320
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildCommandMap = exports.resolveCommand = exports.CATEGORY_ALIASES = exports.COMMAND_ALIASES = exports.CATEGORY_LABELS = void 0;
4
+ var types_1 = require("./types");
5
+ Object.defineProperty(exports, "CATEGORY_LABELS", { enumerable: true, get: function () { return types_1.CATEGORY_LABELS; } });
6
+ var info_handlers_1 = require("./info-handlers");
7
+ Object.defineProperty(exports, "COMMAND_ALIASES", { enumerable: true, get: function () { return info_handlers_1.COMMAND_ALIASES; } });
8
+ Object.defineProperty(exports, "CATEGORY_ALIASES", { enumerable: true, get: function () { return info_handlers_1.CATEGORY_ALIASES; } });
9
+ Object.defineProperty(exports, "resolveCommand", { enumerable: true, get: function () { return info_handlers_1.resolveCommand; } });
10
+ var command_definitions_1 = require("./command-definitions");
11
+ Object.defineProperty(exports, "buildCommandMap", { enumerable: true, get: function () { return command_definitions_1.buildCommandMap; } });