@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,233 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.handleTest = handleTest;
40
+ exports.handleClear = handleClear;
41
+ exports.handleBackup = handleBackup;
42
+ exports.handleRetry = handleRetry;
43
+ exports.handleQuit = handleQuit;
44
+ const readline_1 = __importDefault(require("readline"));
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const sound_player_1 = require("../../engine/notification/sound-player");
47
+ const test_samples_1 = require("../test-samples");
48
+ const log = __importStar(require("../../logger"));
49
+ const info_handlers_1 = require("./info-handlers");
50
+ /** test table 電文タイプ名のエイリアス (短縮形 → 正式名) */
51
+ const TABLE_TYPE_ALIASES = {
52
+ eq: "earthquake",
53
+ tsu: "tsunami",
54
+ st: "seismicText",
55
+ nt: "nankaiTrough",
56
+ lgob: "lgObservation",
57
+ vc: "volcano",
58
+ };
59
+ /** test table の電文タイプ名を解決する (case-insensitive + エイリアス) */
60
+ function resolveTestTableType(input) {
61
+ const lower = input.toLowerCase();
62
+ for (const key of Object.keys(test_samples_1.TEST_TABLES)) {
63
+ if (key.toLowerCase() === lower)
64
+ return key;
65
+ }
66
+ return TABLE_TYPE_ALIASES[lower] ?? null;
67
+ }
68
+ // ── コマンドハンドラ ──
69
+ function handleTest(ctx, args) {
70
+ const parts = args.trim().split(/\s+/).filter(Boolean);
71
+ const sub = parts[0] ?? "";
72
+ if (sub === "") {
73
+ const testEntry = ctx.commands["test"];
74
+ console.log();
75
+ console.log(chalk_1.default.cyan.bold(" test サブコマンド:"));
76
+ if (testEntry.subcommands) {
77
+ for (const [name, sc] of Object.entries(testEntry.subcommands)) {
78
+ console.log(chalk_1.default.white(` ${name.padEnd(14)}`) + chalk_1.default.gray(sc.description));
79
+ }
80
+ }
81
+ console.log();
82
+ console.log(chalk_1.default.gray(" 詳細: help test <subcommand>"));
83
+ console.log();
84
+ return;
85
+ }
86
+ const subLower = sub.toLowerCase();
87
+ if (subLower === "sound" || subLower === "snd") {
88
+ handleTestSound(parts.slice(1).join(" "));
89
+ return;
90
+ }
91
+ if (subLower === "table" || subLower === "tbl") {
92
+ handleTestTable(parts.slice(1).join(" "));
93
+ return;
94
+ }
95
+ console.log(chalk_1.default.yellow(` 不明なサブコマンド: ${sub}`) + chalk_1.default.gray(" (sound / table)"));
96
+ }
97
+ function handleTestSound(args) {
98
+ const level = args.trim().toLowerCase();
99
+ if (level === "") {
100
+ console.log();
101
+ console.log(chalk_1.default.cyan.bold(" 利用可能なサウンドレベル:"));
102
+ for (const l of sound_player_1.SOUND_LEVELS) {
103
+ console.log(chalk_1.default.white(` ${l}`));
104
+ }
105
+ console.log();
106
+ console.log(chalk_1.default.gray(" 使い方: test sound <level>"));
107
+ console.log();
108
+ return;
109
+ }
110
+ if (!(0, sound_player_1.isSoundLevel)(level)) {
111
+ console.log(chalk_1.default.yellow(` 不明なサウンドレベル: ${level}`));
112
+ console.log(chalk_1.default.gray(` 有効な値: ${sound_player_1.SOUND_LEVELS.join(", ")}`));
113
+ return;
114
+ }
115
+ console.log(chalk_1.default.gray(` サウンドテスト: ${level} を再生中...`));
116
+ (0, sound_player_1.playSound)(level);
117
+ }
118
+ function handleTestTable(args) {
119
+ const parts = args.trim().split(/\s+/).filter(Boolean);
120
+ const type = parts[0] ?? "";
121
+ const variantArg = parts[1];
122
+ if (type === "") {
123
+ console.log();
124
+ console.log(chalk_1.default.cyan.bold(" 利用可能な電文タイプ:"));
125
+ const aliasReverse = {};
126
+ for (const [alias, canonical] of Object.entries(TABLE_TYPE_ALIASES)) {
127
+ (aliasReverse[canonical] ??= []).push(alias);
128
+ }
129
+ for (const [key, entry] of Object.entries(test_samples_1.TEST_TABLES)) {
130
+ const count = entry.variants.length;
131
+ const aliases = aliasReverse[key];
132
+ const aliasText = aliases != null ? ` (${aliases.join(", ")})` : "";
133
+ const nameCol = `${key}${aliasText}`;
134
+ console.log(chalk_1.default.white(` ${nameCol.padEnd(24)}`) +
135
+ chalk_1.default.gray(`${entry.label}`) +
136
+ chalk_1.default.gray(` (${count}件)`));
137
+ }
138
+ console.log();
139
+ console.log(chalk_1.default.gray(" 使い方: test table <type> [番号]"));
140
+ console.log();
141
+ return;
142
+ }
143
+ const resolvedType = resolveTestTableType(type);
144
+ const entry = resolvedType != null ? test_samples_1.TEST_TABLES[resolvedType] : undefined;
145
+ if (entry == null) {
146
+ console.log(chalk_1.default.yellow(` 不明な電文タイプ: ${type}`));
147
+ console.log(chalk_1.default.gray(` 有効な値: ${Object.keys(test_samples_1.TEST_TABLES).join(", ")}`));
148
+ return;
149
+ }
150
+ if (variantArg == null) {
151
+ console.log();
152
+ console.log(chalk_1.default.cyan.bold(` ${entry.label} バリエーション:`));
153
+ for (const [i, v] of entry.variants.entries()) {
154
+ console.log(chalk_1.default.white(` ${String(i + 1).padEnd(4)}`) + chalk_1.default.gray(v.label));
155
+ }
156
+ console.log();
157
+ console.log(chalk_1.default.gray(` 使い方: test table ${resolvedType} <番号>`));
158
+ console.log();
159
+ return;
160
+ }
161
+ const variantNum = parseInt(variantArg, 10);
162
+ if (isNaN(variantNum) || variantNum < 1 || variantNum > entry.variants.length) {
163
+ console.log(chalk_1.default.yellow(` 不明な番号: ${variantArg} (1〜${entry.variants.length})`));
164
+ return;
165
+ }
166
+ const variant = entry.variants[variantNum - 1];
167
+ console.log(chalk_1.default.gray(` 表示テスト: ${entry.label} #${variantNum} ${variant.label}`));
168
+ variant.run();
169
+ }
170
+ function handleClear() {
171
+ if (process.stdout.isTTY) {
172
+ readline_1.default.cursorTo(process.stdout, 0, 0);
173
+ readline_1.default.clearScreenDown(process.stdout);
174
+ }
175
+ else {
176
+ console.clear();
177
+ }
178
+ }
179
+ async function handleBackup(ctx, args) {
180
+ if (!(0, info_handlers_1.hasBackupSupport)(ctx.wsManager)) {
181
+ console.log(chalk_1.default.yellow(" この構成では副回線は利用できません"));
182
+ return;
183
+ }
184
+ const sub = args.trim().toLowerCase();
185
+ if (sub === "") {
186
+ if (ctx.wsManager.isBackupRunning()) {
187
+ const bs = ctx.wsManager.getBackupStatus();
188
+ console.log(chalk_1.default.white(" 副回線: ") +
189
+ (bs?.connected ? chalk_1.default.green.bold("接続中") : chalk_1.default.yellow("再接続中")));
190
+ if (bs?.socketId != null) {
191
+ console.log(chalk_1.default.white(" SocketID: ") + chalk_1.default.white(String(bs.socketId)));
192
+ }
193
+ }
194
+ else {
195
+ console.log(chalk_1.default.white(" 副回線: ") + chalk_1.default.gray("未起動"));
196
+ }
197
+ return;
198
+ }
199
+ if (sub === "on") {
200
+ const result = await ctx.wsManager.startBackup();
201
+ if (result !== "started") {
202
+ return;
203
+ }
204
+ ctx.updateConfig((c) => { c.backup = true; });
205
+ ctx.config.backup = true;
206
+ return;
207
+ }
208
+ if (sub === "off") {
209
+ ctx.wsManager.stopBackup();
210
+ ctx.updateConfig((c) => { c.backup = false; });
211
+ ctx.config.backup = false;
212
+ return;
213
+ }
214
+ console.log(chalk_1.default.yellow(" 使い方: backup / backup on / backup off"));
215
+ }
216
+ async function handleRetry(ctx) {
217
+ const status = ctx.wsManager.getStatus();
218
+ if (status.connected) {
219
+ console.log(chalk_1.default.gray(" 既に接続中です。"));
220
+ return;
221
+ }
222
+ console.log(chalk_1.default.gray(" 再接続を試行中..."));
223
+ try {
224
+ await ctx.wsManager.connect();
225
+ }
226
+ catch (err) {
227
+ log.error(`再接続に失敗しました: ${err instanceof Error ? err.message : err}`);
228
+ }
229
+ }
230
+ async function handleQuit(ctx) {
231
+ ctx.stop();
232
+ await ctx.onQuit();
233
+ }