@moneysiren/app 0.1.0-alpha.9

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 (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/apps/cli/src/cli.d.ts +59 -0
  4. package/dist/apps/cli/src/cli.js +199 -0
  5. package/dist/apps/cli/src/commands/dashboard.d.ts +3 -0
  6. package/dist/apps/cli/src/commands/dashboard.js +239 -0
  7. package/dist/apps/cli/src/commands/doctor.d.ts +3 -0
  8. package/dist/apps/cli/src/commands/doctor.js +25 -0
  9. package/dist/apps/cli/src/commands/init.d.ts +3 -0
  10. package/dist/apps/cli/src/commands/init.js +18 -0
  11. package/dist/apps/cli/src/commands/install.d.ts +3 -0
  12. package/dist/apps/cli/src/commands/install.js +244 -0
  13. package/dist/apps/cli/src/commands/modes.d.ts +3 -0
  14. package/dist/apps/cli/src/commands/modes.js +73 -0
  15. package/dist/apps/cli/src/commands/notify.d.ts +3 -0
  16. package/dist/apps/cli/src/commands/notify.js +430 -0
  17. package/dist/apps/cli/src/commands/report.d.ts +3 -0
  18. package/dist/apps/cli/src/commands/report.js +206 -0
  19. package/dist/apps/cli/src/commands/runtime.d.ts +10 -0
  20. package/dist/apps/cli/src/commands/runtime.js +499 -0
  21. package/dist/apps/cli/src/commands/shared.d.ts +9 -0
  22. package/dist/apps/cli/src/commands/shared.js +29 -0
  23. package/dist/apps/cli/src/commands/summary.d.ts +3 -0
  24. package/dist/apps/cli/src/commands/summary.js +15 -0
  25. package/dist/apps/cli/src/commands/sync.d.ts +3 -0
  26. package/dist/apps/cli/src/commands/sync.js +393 -0
  27. package/dist/apps/cli/src/commands/theme.d.ts +3 -0
  28. package/dist/apps/cli/src/commands/theme.js +181 -0
  29. package/dist/apps/cli/src/desktop-runtime.d.ts +54 -0
  30. package/dist/apps/cli/src/desktop-runtime.js +720 -0
  31. package/dist/apps/cli/src/home.d.ts +7 -0
  32. package/dist/apps/cli/src/home.js +124 -0
  33. package/dist/apps/cli/src/index.d.ts +3 -0
  34. package/dist/apps/cli/src/index.js +14 -0
  35. package/dist/apps/cli/src/install-profile.d.ts +35 -0
  36. package/dist/apps/cli/src/install-profile.js +124 -0
  37. package/dist/apps/cli/src/install-selector.d.ts +10 -0
  38. package/dist/apps/cli/src/install-selector.js +66 -0
  39. package/dist/apps/cli/src/interactive.d.ts +3 -0
  40. package/dist/apps/cli/src/interactive.js +32 -0
  41. package/dist/apps/cli/src/postinstall.d.ts +3 -0
  42. package/dist/apps/cli/src/postinstall.js +42 -0
  43. package/dist/apps/cli/src/release-installer.d.ts +57 -0
  44. package/dist/apps/cli/src/release-installer.js +432 -0
  45. package/dist/apps/cli/src/runtime-adapter.d.ts +24 -0
  46. package/dist/apps/cli/src/runtime-adapter.js +185 -0
  47. package/dist/apps/cli/src/slash.d.ts +15 -0
  48. package/dist/apps/cli/src/slash.js +229 -0
  49. package/dist/apps/cli/src/summary-model.d.ts +51 -0
  50. package/dist/apps/cli/src/summary-model.js +136 -0
  51. package/dist/apps/cli/src/theme.d.ts +18 -0
  52. package/dist/apps/cli/src/theme.js +118 -0
  53. package/dist/apps/cli/src/version.d.ts +2 -0
  54. package/dist/apps/cli/src/version.js +2 -0
  55. package/dist/packages/config/src/index.d.ts +3 -0
  56. package/dist/packages/config/src/index.js +3 -0
  57. package/dist/packages/config/src/load.d.ts +3 -0
  58. package/dist/packages/config/src/load.js +80 -0
  59. package/dist/packages/config/src/schema.d.ts +49 -0
  60. package/dist/packages/config/src/schema.js +28 -0
  61. package/dist/packages/connectors/aws/src/cost-explorer.d.ts +34 -0
  62. package/dist/packages/connectors/aws/src/cost-explorer.js +43 -0
  63. package/dist/packages/connectors/aws/src/index.d.ts +35 -0
  64. package/dist/packages/connectors/aws/src/index.js +67 -0
  65. package/dist/packages/connectors/aws/src/normalize.d.ts +69 -0
  66. package/dist/packages/connectors/aws/src/normalize.js +141 -0
  67. package/dist/packages/connectors/aws/src/sdk-client.d.ts +6 -0
  68. package/dist/packages/connectors/aws/src/sdk-client.js +21 -0
  69. package/dist/packages/connectors/cloudflare/src/client.d.ts +23 -0
  70. package/dist/packages/connectors/cloudflare/src/client.js +107 -0
  71. package/dist/packages/connectors/cloudflare/src/index.d.ts +33 -0
  72. package/dist/packages/connectors/cloudflare/src/index.js +81 -0
  73. package/dist/packages/connectors/cloudflare/src/normalize.d.ts +113 -0
  74. package/dist/packages/connectors/cloudflare/src/normalize.js +288 -0
  75. package/dist/packages/connectors/mock/src/index.d.ts +58 -0
  76. package/dist/packages/connectors/mock/src/index.js +66 -0
  77. package/dist/packages/connectors/openai/src/index.d.ts +55 -0
  78. package/dist/packages/connectors/openai/src/index.js +169 -0
  79. package/dist/packages/connectors/openai/src/normalize.d.ts +91 -0
  80. package/dist/packages/connectors/openai/src/normalize.js +180 -0
  81. package/dist/packages/connectors/supabase/src/client.d.ts +22 -0
  82. package/dist/packages/connectors/supabase/src/client.js +132 -0
  83. package/dist/packages/connectors/supabase/src/index.d.ts +33 -0
  84. package/dist/packages/connectors/supabase/src/index.js +87 -0
  85. package/dist/packages/connectors/supabase/src/normalize.d.ts +106 -0
  86. package/dist/packages/connectors/supabase/src/normalize.js +266 -0
  87. package/dist/packages/core/src/collector.d.ts +12 -0
  88. package/dist/packages/core/src/collector.js +68 -0
  89. package/dist/packages/core/src/index.d.ts +5 -0
  90. package/dist/packages/core/src/index.js +4 -0
  91. package/dist/packages/core/src/provider.d.ts +18 -0
  92. package/dist/packages/core/src/provider.js +2 -0
  93. package/dist/packages/core/src/risk-engine.d.ts +9 -0
  94. package/dist/packages/core/src/risk-engine.js +4 -0
  95. package/dist/packages/core/src/snapshots.d.ts +49 -0
  96. package/dist/packages/core/src/snapshots.js +9 -0
  97. package/dist/packages/db/src/client.d.ts +11 -0
  98. package/dist/packages/db/src/client.js +14 -0
  99. package/dist/packages/db/src/index.d.ts +6 -0
  100. package/dist/packages/db/src/index.js +6 -0
  101. package/dist/packages/db/src/local-store.d.ts +161 -0
  102. package/dist/packages/db/src/local-store.js +623 -0
  103. package/dist/packages/db/src/migrate.d.ts +17 -0
  104. package/dist/packages/db/src/migrate.js +35 -0
  105. package/dist/packages/db/src/schema.d.ts +5 -0
  106. package/dist/packages/db/src/schema.js +120 -0
  107. package/dist/packages/db/src/sqlite-bin.d.ts +3 -0
  108. package/dist/packages/db/src/sqlite-bin.js +16 -0
  109. package/dist/packages/local-api/src/index.d.ts +2 -0
  110. package/dist/packages/local-api/src/index.js +2 -0
  111. package/dist/packages/local-api/src/server.d.ts +36 -0
  112. package/dist/packages/local-api/src/server.js +310 -0
  113. package/dist/packages/report/src/daily.d.ts +24 -0
  114. package/dist/packages/report/src/daily.js +9 -0
  115. package/dist/packages/report/src/index.d.ts +4 -0
  116. package/dist/packages/report/src/index.js +4 -0
  117. package/dist/packages/report/src/korean.d.ts +3 -0
  118. package/dist/packages/report/src/korean.js +62 -0
  119. package/dist/packages/report/src/slack.d.ts +34 -0
  120. package/dist/packages/report/src/slack.js +134 -0
  121. package/dist/packages/runtime/src/index.d.ts +2 -0
  122. package/dist/packages/runtime/src/index.js +2 -0
  123. package/dist/packages/runtime/src/runtime.d.ts +26 -0
  124. package/dist/packages/runtime/src/runtime.js +182 -0
  125. package/dist/packages/view-model/src/hud-model.d.ts +74 -0
  126. package/dist/packages/view-model/src/hud-model.js +295 -0
  127. package/dist/packages/view-model/src/index.d.ts +6 -0
  128. package/dist/packages/view-model/src/index.js +6 -0
  129. package/dist/packages/view-model/src/notification-preferences-model.d.ts +75 -0
  130. package/dist/packages/view-model/src/notification-preferences-model.js +400 -0
  131. package/dist/packages/view-model/src/notification-preferences.d.ts +6 -0
  132. package/dist/packages/view-model/src/notification-preferences.js +36 -0
  133. package/dist/packages/view-model/src/sync-state.d.ts +47 -0
  134. package/dist/packages/view-model/src/sync-state.js +140 -0
  135. package/dist/packages/view-model/src/usage-progress.d.ts +22 -0
  136. package/dist/packages/view-model/src/usage-progress.js +57 -0
  137. package/dist/packages/view-model/src/view-model.d.ts +215 -0
  138. package/dist/packages/view-model/src/view-model.js +826 -0
  139. package/package.json +40 -0
  140. package/scripts/postinstall.mjs +69 -0
@@ -0,0 +1,244 @@
1
+ import { DEFAULT_INSTALL_SURFACES, INSTALL_SURFACES, isInstallSurface, readInstallProfileFile, resolveInstallProfilePath, writeInstallProfileFile, } from "../install-profile.js";
2
+ import { formatInstallSelectionLine, installSelectionHelp, parseInstallSurfaceSelection, promptForInstallSurfaces, } from "../install-selector.js";
3
+ import { DEFAULT_RELEASE_REPOSITORY, DEFAULT_RELEASE_TAG, installReleaseAssets, } from "../release-installer.js";
4
+ const INSTALL_USAGE = [
5
+ "Usage: moneysiren install [--status|--all|--cli|--web|--hud|--no-cli|--no-web|--no-hud] [--profile-only] [--tag <tag>] [--repo <owner/name>] [--dir <path>]",
6
+ "",
7
+ "Components:",
8
+ installSelectionHelp(),
9
+ "",
10
+ "Default: all components selected (recommended).",
11
+ `Release default: ${DEFAULT_RELEASE_REPOSITORY}@${DEFAULT_RELEASE_TAG}.`,
12
+ ].join("\n");
13
+ export async function runInstallCommand(args, context) {
14
+ if (args.includes("--help") || args.includes("-h")) {
15
+ context.stdout(INSTALL_USAGE);
16
+ return 0;
17
+ }
18
+ if (args.length === 1 && args[0] === "--status") {
19
+ return writeInstallStatus(context);
20
+ }
21
+ const parsed = parseInstallArgs(args);
22
+ if (parsed === null) {
23
+ context.stderr(INSTALL_USAGE);
24
+ return 1;
25
+ }
26
+ const selectedSurfaces = parsed.selectedSurfaces ?? await selectedSurfacesFromPromptOrDefault(context);
27
+ const releaseResult = await installReleaseAssetsForSelectionSafely({
28
+ context,
29
+ parsed,
30
+ selectedSurfaces,
31
+ });
32
+ if (releaseResult === "failed") {
33
+ return 1;
34
+ }
35
+ const profile = await writeInstallProfileFile({
36
+ selectedSurfaces,
37
+ source: "cli",
38
+ recommendedDefault: isDefaultSelection(selectedSurfaces),
39
+ }, {
40
+ env: context.env,
41
+ now: context.now,
42
+ });
43
+ context.stdout("MoneySiren install profile updated.");
44
+ context.stdout(formatInstallSelectionLine(profile.selectedSurfaces));
45
+ writeReleaseInstallResult(context, releaseResult);
46
+ context.stdout("Secrets returned: false");
47
+ return 0;
48
+ }
49
+ async function writeInstallStatus(context) {
50
+ const profile = await readInstallProfileFile({
51
+ env: context.env,
52
+ });
53
+ const selectedSurfaces = profile?.selectedSurfaces ?? DEFAULT_INSTALL_SURFACES;
54
+ context.stdout("MoneySiren install profile");
55
+ context.stdout(`Status: ${profile === null ? "not configured; using recommended default" : "configured"}`);
56
+ context.stdout(formatInstallSelectionLine(selectedSurfaces));
57
+ context.stdout(`Recommended default: ${isDefaultSelection(selectedSurfaces) ? "yes" : "no"}`);
58
+ context.stdout(`Profile path: ${resolveInstallProfilePath({ env: context.env })}`);
59
+ context.stdout("Secrets returned: false");
60
+ return 0;
61
+ }
62
+ async function selectedSurfacesFromPromptOrDefault(context) {
63
+ if (!context.interactive || context.stdin === undefined || context.output === undefined) {
64
+ return DEFAULT_INSTALL_SURFACES;
65
+ }
66
+ return promptForInstallSurfaces({
67
+ stdin: context.stdin,
68
+ output: context.output,
69
+ });
70
+ }
71
+ function parseInstallArgs(args) {
72
+ if (args.length === 0) {
73
+ return {
74
+ profileOnly: false,
75
+ };
76
+ }
77
+ if (args.length === 1) {
78
+ const selected = parseInstallSurfaceSelection(args[0] ?? "");
79
+ if (selected !== null) {
80
+ return {
81
+ profileOnly: false,
82
+ selectedSurfaces: selected,
83
+ };
84
+ }
85
+ }
86
+ let explicitIncludes = false;
87
+ let installDir;
88
+ let profileOnly = false;
89
+ let releaseRepository;
90
+ let releaseTag;
91
+ const selected = new Set();
92
+ for (let index = 0; index < args.length; index += 1) {
93
+ const arg = args[index];
94
+ if (arg === undefined) {
95
+ return null;
96
+ }
97
+ if (arg === "--profile-only") {
98
+ profileOnly = true;
99
+ continue;
100
+ }
101
+ if (arg === "--tag" || arg === "--repo" || arg === "--dir") {
102
+ const value = args[index + 1];
103
+ if (value === undefined || value.startsWith("--")) {
104
+ return null;
105
+ }
106
+ if (arg === "--tag") {
107
+ releaseTag = value;
108
+ }
109
+ else if (arg === "--repo") {
110
+ releaseRepository = value;
111
+ }
112
+ else {
113
+ installDir = value;
114
+ }
115
+ index += 1;
116
+ continue;
117
+ }
118
+ if (arg.startsWith("--tag=")) {
119
+ releaseTag = arg.slice("--tag=".length);
120
+ continue;
121
+ }
122
+ if (arg.startsWith("--repo=")) {
123
+ releaseRepository = arg.slice("--repo=".length);
124
+ continue;
125
+ }
126
+ if (arg.startsWith("--dir=")) {
127
+ installDir = arg.slice("--dir=".length);
128
+ continue;
129
+ }
130
+ if (arg === "--all") {
131
+ for (const surface of DEFAULT_INSTALL_SURFACES) {
132
+ selected.add(surface);
133
+ }
134
+ explicitIncludes = true;
135
+ continue;
136
+ }
137
+ if (arg.startsWith("--no-")) {
138
+ const surface = arg.slice("--no-".length);
139
+ if (!isInstallSurface(surface)) {
140
+ return null;
141
+ }
142
+ if (!explicitIncludes) {
143
+ for (const defaultSurface of DEFAULT_INSTALL_SURFACES) {
144
+ selected.add(defaultSurface);
145
+ }
146
+ explicitIncludes = true;
147
+ }
148
+ selected.delete(surface);
149
+ continue;
150
+ }
151
+ if (arg.startsWith("--")) {
152
+ const surface = arg.slice("--".length);
153
+ if (!isInstallSurface(surface)) {
154
+ return null;
155
+ }
156
+ selected.add(surface);
157
+ explicitIncludes = true;
158
+ continue;
159
+ }
160
+ if (!isInstallSurface(arg)) {
161
+ return null;
162
+ }
163
+ selected.add(arg);
164
+ explicitIncludes = true;
165
+ }
166
+ const normalized = INSTALL_SURFACES.filter((surface) => selected.has(surface));
167
+ if (normalized.length === 0 && explicitIncludes) {
168
+ return null;
169
+ }
170
+ return {
171
+ ...(installDir === undefined ? {} : { installDir }),
172
+ profileOnly,
173
+ ...(releaseRepository === undefined ? {} : { releaseRepository }),
174
+ ...(releaseTag === undefined ? {} : { releaseTag }),
175
+ ...(normalized.length === 0 ? {} : { selectedSurfaces: normalized }),
176
+ };
177
+ }
178
+ function isDefaultSelection(selectedSurfaces) {
179
+ return selectedSurfaces.length === INSTALL_SURFACES.length &&
180
+ INSTALL_SURFACES.every((surface, index) => selectedSurfaces[index] === surface);
181
+ }
182
+ async function installReleaseAssetsForSelection(input) {
183
+ if (input.parsed.profileOnly) {
184
+ return "profile-only";
185
+ }
186
+ if (!input.selectedSurfaces.some((surface) => surface === "web" || surface === "hud")) {
187
+ return "cli-only";
188
+ }
189
+ return installReleaseAssets({
190
+ env: input.context.env,
191
+ fetchImpl: input.context.fetch,
192
+ ...(input.parsed.installDir === undefined ? {} : { installDir: input.parsed.installDir }),
193
+ now: input.context.now,
194
+ ...(input.parsed.releaseRepository === undefined ? {} : { repository: input.parsed.releaseRepository }),
195
+ selectedSurfaces: input.selectedSurfaces,
196
+ ...(input.parsed.releaseTag === undefined ? {} : { tag: input.parsed.releaseTag }),
197
+ });
198
+ }
199
+ async function installReleaseAssetsForSelectionSafely(input) {
200
+ try {
201
+ return await installReleaseAssetsForSelection(input);
202
+ }
203
+ catch (error) {
204
+ const message = error instanceof Error ? error.message : String(error);
205
+ input.context.stderr(`Release asset installation failed: ${message}`);
206
+ if (input.selectedSurfaces.includes("hud")) {
207
+ input.context.stderr("The selected HUD desktop artifact must be present, checksummed, and signed before MoneySiren will install it.");
208
+ input.context.stderr("For now, use `moneysiren install --web` to install only the web runtime, or retry after a signed desktop release is published.");
209
+ }
210
+ input.context.stderr("Install profile was not changed.");
211
+ return "failed";
212
+ }
213
+ }
214
+ function writeReleaseInstallResult(context, result) {
215
+ if (result === "profile-only") {
216
+ context.stdout("Release assets: skipped (--profile-only).");
217
+ return;
218
+ }
219
+ if (result === "cli-only") {
220
+ context.stdout("Release assets: skipped (CLI-only selection).");
221
+ return;
222
+ }
223
+ writeReleaseInstallSummary(context, result);
224
+ }
225
+ function writeReleaseInstallSummary(context, result) {
226
+ context.stdout(`Release: ${result.repository}@${result.tag}`);
227
+ context.stdout(`Release URL: ${result.releaseUrl}`);
228
+ context.stdout(`Install directory: ${result.installDir}`);
229
+ for (const asset of result.assets) {
230
+ context.stdout(`Downloaded ${asset.surface}: ${asset.name}`);
231
+ context.stdout(` SHA256 verified: ${asset.checksumVerified ? "yes" : "checksum unavailable"}`);
232
+ context.stdout(` Signature status: ${formatSignatureStatus(asset)}`);
233
+ }
234
+ }
235
+ function formatSignatureStatus(asset) {
236
+ if (asset.signatureVerified) {
237
+ return "verified";
238
+ }
239
+ if (asset.signatureStatus === "unsigned-prerelease-accepted") {
240
+ return "unsigned alpha accepted";
241
+ }
242
+ return "not required";
243
+ }
244
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1,3 @@
1
+ import type { CliExecutionContext } from "../cli.js";
2
+ export declare function runModesCommand(args: readonly string[], context: CliExecutionContext): Promise<number>;
3
+ //# sourceMappingURL=modes.d.ts.map
@@ -0,0 +1,73 @@
1
+ import { DEFAULT_INSTALL_SURFACES, formatInstallSurfaces, readInstallProfileFile, } from "../install-profile.js";
2
+ const MODES_USAGE = "Usage: moneysiren modes";
3
+ export async function runModesCommand(args, context) {
4
+ if (args.includes("--help") || args.includes("-h")) {
5
+ context.stdout(MODES_USAGE);
6
+ return 0;
7
+ }
8
+ if (args.length > 0) {
9
+ context.stderr(MODES_USAGE);
10
+ return 1;
11
+ }
12
+ const profile = await readInstallProfileFile({
13
+ env: context.env,
14
+ });
15
+ const selectedSurfaces = profile?.selectedSurfaces ?? DEFAULT_INSTALL_SURFACES;
16
+ context.stdout("MoneySiren modes");
17
+ context.stdout(`Platform: ${platformLabel()}`);
18
+ context.stdout(`Install profile: ${formatInstallSurfaces(selectedSurfaces)}${profile === null ? " (recommended default)" : ""}`);
19
+ context.stdout("npm install: npm install -g @moneysiren/cli@alpha");
20
+ context.stdout("Short command: msiren");
21
+ context.stdout(`Runtime lock: ${runtimeLockHint()}`);
22
+ context.stdout("");
23
+ context.stdout("1. CLI automation");
24
+ context.stdout(` Status: ${surfaceStatus("cli", selectedSurfaces)} from the npm CLI package`);
25
+ context.stdout(" Try: msiren doctor");
26
+ context.stdout(" Try: msiren sync --provider mock");
27
+ context.stdout("");
28
+ context.stdout("2. Local web dashboard/runtime");
29
+ context.stdout(` Status: ${surfaceStatus("web", selectedSurfaces)} GitHub Release web runtime archive is installed by the CLI`);
30
+ context.stdout(" Install: msiren install --web");
31
+ context.stdout(" Try: msiren start");
32
+ context.stdout(" Stop: msiren stop --web");
33
+ context.stdout(" Try: msiren dashboard check");
34
+ context.stdout(" Note: msiren start runs the installed GitHub Release web runtime.");
35
+ context.stdout("");
36
+ context.stdout("3. Desktop tray/notifier");
37
+ context.stdout(` Status: ${surfaceStatus("hud", selectedSurfaces)} Windows/macOS target is the thin Tauri tray shell from GitHub Releases`);
38
+ context.stdout(" Install: msiren install --hud");
39
+ context.stdout(" Try: msiren hud");
40
+ context.stdout(" Try: msiren status");
41
+ context.stdout(" Stop: msiren stop --hud");
42
+ context.stdout(" Try: msiren notify once --dry-run");
43
+ context.stdout("");
44
+ context.stdout("Install recommended set: msiren install --all");
45
+ context.stdout("Stop managed runtimes: msiren stop");
46
+ context.stdout("Change selection only: msiren install --profile-only");
47
+ return 0;
48
+ }
49
+ function surfaceStatus(surface, selectedSurfaces) {
50
+ return selectedSurfaces.includes(surface) ? "selected;" : "not selected;";
51
+ }
52
+ function platformLabel() {
53
+ if (process.platform === "darwin") {
54
+ return `macOS (${process.platform} ${process.arch})`;
55
+ }
56
+ if (process.platform === "win32") {
57
+ return `Windows (${process.platform} ${process.arch})`;
58
+ }
59
+ if (process.platform === "linux") {
60
+ return `Linux (${process.platform} ${process.arch})`;
61
+ }
62
+ return `${process.platform} ${process.arch}`;
63
+ }
64
+ function runtimeLockHint() {
65
+ if (process.platform === "darwin") {
66
+ return "~/Library/Application Support/MoneySiren/runtime.json";
67
+ }
68
+ if (process.platform === "win32") {
69
+ return "%APPDATA%\\MoneySiren\\runtime.json";
70
+ }
71
+ return "${XDG_CONFIG_HOME:-~/.config}/moneysiren/runtime.json";
72
+ }
73
+ //# sourceMappingURL=modes.js.map
@@ -0,0 +1,3 @@
1
+ import type { CliExecutionContext } from "../cli.js";
2
+ export declare function runNotifyCommand(args: readonly string[], context: CliExecutionContext): Promise<number>;
3
+ //# sourceMappingURL=notify.d.ts.map