miladyai 2.0.0-alpha.27

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 (241) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +7 -0
  2. package/dist/actions/emote.js +64 -0
  3. package/dist/actions/restart.js +81 -0
  4. package/dist/actions/send-message.js +152 -0
  5. package/dist/agent-admin-routes.js +82 -0
  6. package/dist/agent-lifecycle-routes.js +79 -0
  7. package/dist/agent-transfer-routes.js +102 -0
  8. package/dist/api/agent-admin-routes.js +82 -0
  9. package/dist/api/agent-lifecycle-routes.js +79 -0
  10. package/dist/api/agent-transfer-routes.js +102 -0
  11. package/dist/api/apps-hyperscape-routes.js +58 -0
  12. package/dist/api/apps-routes.js +114 -0
  13. package/dist/api/auth-routes.js +56 -0
  14. package/dist/api/autonomy-routes.js +44 -0
  15. package/dist/api/bug-report-routes.js +111 -0
  16. package/dist/api/character-routes.js +195 -0
  17. package/dist/api/cloud-routes.js +330 -0
  18. package/dist/api/cloud-status-routes.js +155 -0
  19. package/dist/api/compat-utils.js +111 -0
  20. package/dist/api/database.js +735 -0
  21. package/dist/api/diagnostics-routes.js +205 -0
  22. package/dist/api/drop-service.js +134 -0
  23. package/dist/api/early-logs.js +86 -0
  24. package/dist/api/http-helpers.js +131 -0
  25. package/dist/api/knowledge-routes.js +534 -0
  26. package/dist/api/memory-bounds.js +71 -0
  27. package/dist/api/models-routes.js +28 -0
  28. package/dist/api/og-tracker.js +36 -0
  29. package/dist/api/permissions-routes.js +109 -0
  30. package/dist/api/plugin-validation.js +198 -0
  31. package/dist/api/provider-switch-config.js +41 -0
  32. package/dist/api/registry-routes.js +86 -0
  33. package/dist/api/registry-service.js +164 -0
  34. package/dist/api/sandbox-routes.js +1112 -0
  35. package/dist/api/server.js +7949 -0
  36. package/dist/api/subscription-routes.js +172 -0
  37. package/dist/api/terminal-run-limits.js +24 -0
  38. package/dist/api/training-routes.js +158 -0
  39. package/dist/api/trajectory-routes.js +300 -0
  40. package/dist/api/trigger-routes.js +246 -0
  41. package/dist/api/twitter-verify.js +134 -0
  42. package/dist/api/tx-service.js +108 -0
  43. package/dist/api/wallet-routes.js +266 -0
  44. package/dist/api/wallet.js +568 -0
  45. package/dist/api/whatsapp-routes.js +182 -0
  46. package/dist/api/zip-utils.js +109 -0
  47. package/dist/apps-hyperscape-routes.js +58 -0
  48. package/dist/apps-routes.js +114 -0
  49. package/dist/ascii.js +20 -0
  50. package/dist/auth/anthropic.js +44 -0
  51. package/dist/auth/apply-stealth.js +41 -0
  52. package/dist/auth/claude-code-stealth.js +78 -0
  53. package/dist/auth/credentials.js +156 -0
  54. package/dist/auth/index.js +5 -0
  55. package/dist/auth/openai-codex.js +66 -0
  56. package/dist/auth/types.js +9 -0
  57. package/dist/auth-routes.js +56 -0
  58. package/dist/autonomy-routes.js +44 -0
  59. package/dist/bug-report-routes.js +111 -0
  60. package/dist/build-info.json +6 -0
  61. package/dist/character-routes.js +195 -0
  62. package/dist/cli/argv.js +63 -0
  63. package/dist/cli/banner.js +34 -0
  64. package/dist/cli/cli-name.js +21 -0
  65. package/dist/cli/cli-utils.js +16 -0
  66. package/dist/cli/git-commit.js +78 -0
  67. package/dist/cli/parse-duration.js +15 -0
  68. package/dist/cli/plugins-cli.js +590 -0
  69. package/dist/cli/profile-utils.js +9 -0
  70. package/dist/cli/profile.js +95 -0
  71. package/dist/cli/program/build-program.js +17 -0
  72. package/dist/cli/program/command-registry.js +23 -0
  73. package/dist/cli/program/help.js +47 -0
  74. package/dist/cli/program/preaction.js +33 -0
  75. package/dist/cli/program/register.config.js +106 -0
  76. package/dist/cli/program/register.configure.js +20 -0
  77. package/dist/cli/program/register.dashboard.js +124 -0
  78. package/dist/cli/program/register.models.js +23 -0
  79. package/dist/cli/program/register.setup.js +36 -0
  80. package/dist/cli/program/register.start.js +22 -0
  81. package/dist/cli/program/register.subclis.js +70 -0
  82. package/dist/cli/program/register.tui.js +163 -0
  83. package/dist/cli/program/register.update.js +154 -0
  84. package/dist/cli/program.js +3 -0
  85. package/dist/cli/run-main.js +37 -0
  86. package/dist/cli/version.js +7 -0
  87. package/dist/cloud/validate-url.js +93 -0
  88. package/dist/cloud-routes.js +330 -0
  89. package/dist/cloud-status-routes.js +155 -0
  90. package/dist/compat-utils.js +111 -0
  91. package/dist/config/config.js +69 -0
  92. package/dist/config/env-vars.js +19 -0
  93. package/dist/config/includes.js +121 -0
  94. package/dist/config/object-utils.js +7 -0
  95. package/dist/config/paths.js +38 -0
  96. package/dist/config/plugin-auto-enable.js +231 -0
  97. package/dist/config/schema.js +864 -0
  98. package/dist/config/telegram-custom-commands.js +76 -0
  99. package/dist/config/zod-schema.agent-runtime.js +519 -0
  100. package/dist/config/zod-schema.core.js +538 -0
  101. package/dist/config/zod-schema.hooks.js +103 -0
  102. package/dist/config/zod-schema.js +488 -0
  103. package/dist/config/zod-schema.providers-core.js +785 -0
  104. package/dist/config/zod-schema.session.js +73 -0
  105. package/dist/core-plugins.js +37 -0
  106. package/dist/custom-actions.js +250 -0
  107. package/dist/database.js +735 -0
  108. package/dist/diagnostics/integration-observability.js +57 -0
  109. package/dist/diagnostics-routes.js +205 -0
  110. package/dist/drop-service.js +134 -0
  111. package/dist/early-logs.js +24 -0
  112. package/dist/eliza.js +2061 -0
  113. package/dist/emotes/catalog.js +271 -0
  114. package/dist/entry.js +40 -0
  115. package/dist/hooks/discovery.js +167 -0
  116. package/dist/hooks/eligibility.js +64 -0
  117. package/dist/hooks/index.js +4 -0
  118. package/dist/hooks/loader.js +147 -0
  119. package/dist/hooks/registry.js +55 -0
  120. package/dist/http-helpers.js +131 -0
  121. package/dist/index.js +49 -0
  122. package/dist/knowledge-routes.js +534 -0
  123. package/dist/memory-bounds.js +71 -0
  124. package/dist/milady-plugin.js +90 -0
  125. package/dist/models-routes.js +28 -0
  126. package/dist/onboarding-names.js +78 -0
  127. package/dist/onboarding-presets.js +922 -0
  128. package/dist/package.json +1 -0
  129. package/dist/permissions-routes.js +109 -0
  130. package/dist/plugin-validation.js +107 -0
  131. package/dist/plugins/whatsapp/actions.js +91 -0
  132. package/dist/plugins/whatsapp/index.js +16 -0
  133. package/dist/plugins/whatsapp/service.js +270 -0
  134. package/dist/provider-switch-config.js +41 -0
  135. package/dist/providers/admin-trust.js +46 -0
  136. package/dist/providers/autonomous-state.js +101 -0
  137. package/dist/providers/session-bridge.js +86 -0
  138. package/dist/providers/session-utils.js +36 -0
  139. package/dist/providers/simple-mode.js +50 -0
  140. package/dist/providers/ui-catalog.js +15 -0
  141. package/dist/providers/workspace-provider.js +93 -0
  142. package/dist/providers/workspace.js +348 -0
  143. package/dist/registry-routes.js +86 -0
  144. package/dist/registry-service.js +164 -0
  145. package/dist/restart.js +40 -0
  146. package/dist/runtime/core-plugins.js +37 -0
  147. package/dist/runtime/custom-actions.js +250 -0
  148. package/dist/runtime/eliza.js +2061 -0
  149. package/dist/runtime/embedding-manager-support.js +185 -0
  150. package/dist/runtime/embedding-manager.js +193 -0
  151. package/dist/runtime/embedding-presets.js +54 -0
  152. package/dist/runtime/embedding-state.js +8 -0
  153. package/dist/runtime/milady-plugin.js +90 -0
  154. package/dist/runtime/onboarding-names.js +78 -0
  155. package/dist/runtime/restart.js +40 -0
  156. package/dist/runtime/version.js +7 -0
  157. package/dist/sandbox-routes.js +1112 -0
  158. package/dist/security/audit-log.js +149 -0
  159. package/dist/security/network-policy.js +70 -0
  160. package/dist/server.js +7949 -0
  161. package/dist/services/agent-export.js +559 -0
  162. package/dist/services/app-manager.js +389 -0
  163. package/dist/services/browser-capture.js +86 -0
  164. package/dist/services/fallback-training-service.js +128 -0
  165. package/dist/services/mcp-marketplace.js +134 -0
  166. package/dist/services/plugin-installer.js +396 -0
  167. package/dist/services/plugin-manager-types.js +15 -0
  168. package/dist/services/registry-client-app-meta.js +144 -0
  169. package/dist/services/registry-client-endpoints.js +166 -0
  170. package/dist/services/registry-client-local.js +271 -0
  171. package/dist/services/registry-client-network.js +93 -0
  172. package/dist/services/registry-client-queries.js +70 -0
  173. package/dist/services/registry-client.js +157 -0
  174. package/dist/services/sandbox-engine.js +511 -0
  175. package/dist/services/sandbox-manager.js +297 -0
  176. package/dist/services/self-updater.js +175 -0
  177. package/dist/services/skill-catalog-client.js +119 -0
  178. package/dist/services/skill-marketplace.js +521 -0
  179. package/dist/services/stream-manager.js +236 -0
  180. package/dist/services/update-checker.js +121 -0
  181. package/dist/services/update-notifier.js +29 -0
  182. package/dist/services/version-compat.js +78 -0
  183. package/dist/services/whatsapp-pairing.js +196 -0
  184. package/dist/shared/ui-catalog-prompt.js +728 -0
  185. package/dist/subscription-routes.js +172 -0
  186. package/dist/terminal/links.js +19 -0
  187. package/dist/terminal/palette.js +14 -0
  188. package/dist/terminal/theme.js +25 -0
  189. package/dist/terminal-run-limits.js +24 -0
  190. package/dist/training-routes.js +158 -0
  191. package/dist/trajectory-routes.js +300 -0
  192. package/dist/trigger-routes.js +246 -0
  193. package/dist/triggers/action.js +218 -0
  194. package/dist/triggers/runtime.js +281 -0
  195. package/dist/triggers/scheduling.js +295 -0
  196. package/dist/triggers/types.js +5 -0
  197. package/dist/tui/components/assistant-message.js +76 -0
  198. package/dist/tui/components/chat-editor.js +34 -0
  199. package/dist/tui/components/embeddings-overlay.js +46 -0
  200. package/dist/tui/components/footer.js +60 -0
  201. package/dist/tui/components/index.js +15 -0
  202. package/dist/tui/components/modal-frame.js +45 -0
  203. package/dist/tui/components/modal-style.js +15 -0
  204. package/dist/tui/components/model-selector.js +70 -0
  205. package/dist/tui/components/pinned-chat-layout.js +46 -0
  206. package/dist/tui/components/plugins-endpoints-tab.js +196 -0
  207. package/dist/tui/components/plugins-installed-tab-view.js +69 -0
  208. package/dist/tui/components/plugins-installed-tab.js +319 -0
  209. package/dist/tui/components/plugins-overlay-catalog.js +81 -0
  210. package/dist/tui/components/plugins-overlay-data-api.js +21 -0
  211. package/dist/tui/components/plugins-overlay-data-shared.js +20 -0
  212. package/dist/tui/components/plugins-overlay-data.js +323 -0
  213. package/dist/tui/components/plugins-overlay.js +117 -0
  214. package/dist/tui/components/plugins-store-tab.js +148 -0
  215. package/dist/tui/components/settings-overlay.js +61 -0
  216. package/dist/tui/components/status-bar.js +64 -0
  217. package/dist/tui/components/tool-execution.js +68 -0
  218. package/dist/tui/components/user-message.js +22 -0
  219. package/dist/tui/eliza-tui-bridge.js +606 -0
  220. package/dist/tui/index.js +370 -0
  221. package/dist/tui/modal-presets.js +33 -0
  222. package/dist/tui/model-spec.js +46 -0
  223. package/dist/tui/sse-parser.js +78 -0
  224. package/dist/tui/theme.js +110 -0
  225. package/dist/tui/titlebar-spinner.js +62 -0
  226. package/dist/tui/tui-app.js +311 -0
  227. package/dist/tui/ws-client.js +215 -0
  228. package/dist/twitter-verify.js +134 -0
  229. package/dist/tx-service.js +108 -0
  230. package/dist/utils/exec-safety.js +17 -0
  231. package/dist/utils/globals.js +20 -0
  232. package/dist/utils/milady-root.js +61 -0
  233. package/dist/utils/number-parsing.js +37 -0
  234. package/dist/version-resolver.js +37 -0
  235. package/dist/version.js +7 -0
  236. package/dist/wallet-routes.js +266 -0
  237. package/dist/wallet.js +568 -0
  238. package/dist/whatsapp-routes.js +182 -0
  239. package/dist/zip-utils.js +109 -0
  240. package/milady.mjs +14 -0
  241. package/package.json +111 -0
@@ -0,0 +1,63 @@
1
+ //#region src/cli/argv.ts
2
+ const HELP_FLAGS = new Set(["-h", "--help"]);
3
+ const VERSION_FLAGS = new Set([
4
+ "-v",
5
+ "-V",
6
+ "--version"
7
+ ]);
8
+ const FLAG_TERMINATOR = "--";
9
+ function hasHelpOrVersion(argv) {
10
+ return argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg));
11
+ }
12
+ function hasFlag(argv, name) {
13
+ const args = argv.slice(2);
14
+ for (const arg of args) {
15
+ if (arg === FLAG_TERMINATOR) break;
16
+ if (arg === name) return true;
17
+ }
18
+ return false;
19
+ }
20
+ function getVerboseFlag(argv, options) {
21
+ if (hasFlag(argv, "--verbose")) return true;
22
+ if (options?.includeDebug && hasFlag(argv, "--debug")) return true;
23
+ return false;
24
+ }
25
+ function getCommandPath(argv, depth = 2) {
26
+ const args = argv.slice(2);
27
+ const path = [];
28
+ for (let i = 0; i < args.length; i += 1) {
29
+ const arg = args[i];
30
+ if (!arg) continue;
31
+ if (arg === "--") break;
32
+ if (arg.startsWith("-")) continue;
33
+ path.push(arg);
34
+ if (path.length >= depth) break;
35
+ }
36
+ return path;
37
+ }
38
+ function getPrimaryCommand(argv) {
39
+ const [primary] = getCommandPath(argv, 1);
40
+ return primary ?? null;
41
+ }
42
+ function buildParseArgv(params) {
43
+ const baseArgv = params.rawArgs && params.rawArgs.length > 0 ? params.rawArgs : params.fallbackArgv && params.fallbackArgv.length > 0 ? params.fallbackArgv : process.argv;
44
+ const programName = params.programName ?? "";
45
+ const normalizedArgv = programName && baseArgv[0] === programName ? baseArgv.slice(1) : baseArgv[0]?.endsWith("milady") || baseArgv[0]?.endsWith("miladyai") ? baseArgv.slice(1) : baseArgv;
46
+ const executable = (normalizedArgv[0]?.split(/[/\\]/).pop() ?? "").toLowerCase();
47
+ if (normalizedArgv.length >= 2 && (isNodeExecutable(executable) || isBunExecutable(executable))) return normalizedArgv;
48
+ return [
49
+ "node",
50
+ programName || "milady",
51
+ ...normalizedArgv
52
+ ];
53
+ }
54
+ const nodeExecutablePattern = /^node-\d+(?:\.\d+)*(?:\.exe)?$/;
55
+ function isNodeExecutable(executable) {
56
+ return executable === "node" || executable === "node.exe" || executable === "nodejs" || executable === "nodejs.exe" || nodeExecutablePattern.test(executable);
57
+ }
58
+ function isBunExecutable(executable) {
59
+ return executable === "bun" || executable === "bun.exe";
60
+ }
61
+
62
+ //#endregion
63
+ export { buildParseArgv, getCommandPath, getPrimaryCommand, getVerboseFlag, hasHelpOrVersion };
@@ -0,0 +1,34 @@
1
+ import { cyberGreen, isRich, theme } from "../terminal/theme.js";
2
+ import { ascii } from "../ascii.js";
3
+ import { resolveCommitHash } from "./git-commit.js";
4
+
5
+ //#region src/cli/banner.ts
6
+ let bannerEmitted = false;
7
+ function formatCliBannerLine(version, options = {}) {
8
+ const commitLabel = options.commit ?? resolveCommitHash({ env: options.env }) ?? "unknown";
9
+ const rich = options.richTty ?? isRich();
10
+ const title = "milAIdy";
11
+ if (rich) return `${theme.heading(title)} ${theme.info(version)} ${theme.muted(`(${commitLabel})`)}`;
12
+ return `${title} ${version} (${commitLabel})`;
13
+ }
14
+ function formatAsciiBanner(rich) {
15
+ if (rich) return ascii.split("\n").map((line) => cyberGreen(line)).join("\n");
16
+ return ascii;
17
+ }
18
+ function emitCliBanner(version, options = {}) {
19
+ if (bannerEmitted) return;
20
+ const argv = options.argv ?? process.argv;
21
+ if (!process.stdout.isTTY) return;
22
+ if (argv.some((a) => a === "--json" || a.startsWith("--json="))) return;
23
+ if (argv.some((a) => a === "--version" || a === "-V" || a === "-v")) return;
24
+ const art = formatAsciiBanner(options.richTty ?? isRich());
25
+ const line = formatCliBannerLine(version, options);
26
+ process.stdout.write(`\n${art}\n\n${line}\n\n`);
27
+ bannerEmitted = true;
28
+ }
29
+ function hasEmittedCliBanner() {
30
+ return bannerEmitted;
31
+ }
32
+
33
+ //#endregion
34
+ export { emitCliBanner, formatCliBannerLine, hasEmittedCliBanner };
@@ -0,0 +1,21 @@
1
+ import path from "node:path";
2
+
3
+ //#region src/cli/cli-name.ts
4
+ const CLI_NAME = "milady";
5
+ /** Matches a milady command with optional package-runner prefix (pnpm, bun, npm, bunx, npx). */
6
+ const CLI_PREFIX_RE = /^(?:((?:pnpm|bun|npm|bunx|npx)\s+))?(milady)\b/;
7
+ function resolveCliName(argv = process.argv) {
8
+ const argv1 = argv[1];
9
+ if (!argv1) return CLI_NAME;
10
+ const base = path.basename(argv1).trim();
11
+ return base === CLI_NAME ? base : CLI_NAME;
12
+ }
13
+ function replaceCliName(command, cliName = resolveCliName()) {
14
+ if (!command.trim() || !CLI_PREFIX_RE.test(command)) return command;
15
+ return command.replace(CLI_PREFIX_RE, (_match, runner) => {
16
+ return `${runner ?? ""}${cliName}`;
17
+ });
18
+ }
19
+
20
+ //#endregion
21
+ export { replaceCliName, resolveCliName };
@@ -0,0 +1,16 @@
1
+ //#region src/cli/cli-utils.ts
2
+ async function runCommandWithRuntime(runtime, action, onError) {
3
+ try {
4
+ await action();
5
+ } catch (err) {
6
+ if (onError) {
7
+ onError(err);
8
+ return;
9
+ }
10
+ runtime.error(String(err));
11
+ runtime.exit(1);
12
+ }
13
+ }
14
+
15
+ //#endregion
16
+ export { runCommandWithRuntime };
@@ -0,0 +1,78 @@
1
+ import { createRequire } from "node:module";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+
5
+ //#region src/cli/git-commit.ts
6
+ function formatCommit(value) {
7
+ const trimmed = value?.trim();
8
+ if (!trimmed) return null;
9
+ return trimmed.slice(0, 7);
10
+ }
11
+ function resolveGitHead(startDir) {
12
+ let current = startDir;
13
+ for (let i = 0; i < 12; i += 1) {
14
+ const gitPath = path.join(current, ".git");
15
+ try {
16
+ const stat = fs.statSync(gitPath);
17
+ if (stat.isDirectory()) return path.join(gitPath, "HEAD");
18
+ if (stat.isFile()) {
19
+ const match = fs.readFileSync(gitPath, "utf-8").match(/gitdir:\s*(.+)/i);
20
+ if (match?.[1]) return path.join(path.resolve(current, match[1].trim()), "HEAD");
21
+ }
22
+ } catch (err) {
23
+ if (err.code !== "ENOENT") throw err;
24
+ }
25
+ const parent = path.dirname(current);
26
+ if (parent === current) break;
27
+ current = parent;
28
+ }
29
+ return null;
30
+ }
31
+ function readCommitFromPackageJson() {
32
+ try {
33
+ const pkg = createRequire(import.meta.url)("../../package.json");
34
+ return formatCommit(pkg.gitHead ?? pkg.githead);
35
+ } catch (err) {
36
+ if (err.code === "MODULE_NOT_FOUND") return null;
37
+ throw err;
38
+ }
39
+ }
40
+ function readCommitFromBuildInfo() {
41
+ const req = createRequire(import.meta.url);
42
+ for (const candidate of ["../build-info.json", "./build-info.json"]) try {
43
+ const formatted = formatCommit(req(candidate).commit);
44
+ if (formatted) return formatted;
45
+ } catch (err) {
46
+ if (err.code !== "MODULE_NOT_FOUND") throw err;
47
+ }
48
+ return null;
49
+ }
50
+ function readCommitFromGitHead(cwd) {
51
+ const headPath = resolveGitHead(cwd);
52
+ if (!headPath) return null;
53
+ const head = fs.readFileSync(headPath, "utf-8").trim();
54
+ if (!head) return null;
55
+ if (head.startsWith("ref:")) {
56
+ const ref = head.replace(/^ref:\s*/i, "").trim();
57
+ const refPath = path.resolve(path.dirname(headPath), ref);
58
+ return formatCommit(fs.readFileSync(refPath, "utf-8").trim());
59
+ }
60
+ return formatCommit(head);
61
+ }
62
+ let cachedCommit;
63
+ function resolveCommitHash(options = {}) {
64
+ if (cachedCommit !== void 0) return cachedCommit;
65
+ const env = options.env ?? process.env;
66
+ cachedCommit = formatCommit(env.GIT_COMMIT?.trim() || env.GIT_SHA?.trim()) ?? readCommitFromBuildInfo() ?? readCommitFromPackageJson() ?? (() => {
67
+ try {
68
+ return readCommitFromGitHead(options.cwd ?? process.cwd());
69
+ } catch (err) {
70
+ if (err.code === "ENOENT") return null;
71
+ throw err;
72
+ }
73
+ })();
74
+ return cachedCommit;
75
+ }
76
+
77
+ //#endregion
78
+ export { resolveCommitHash };
@@ -0,0 +1,15 @@
1
+ //#region src/cli/parse-duration.ts
2
+ function parseDurationMs(raw, opts) {
3
+ const trimmed = String(raw ?? "").trim().toLowerCase();
4
+ if (!trimmed) throw new Error("invalid duration (empty)");
5
+ const m = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/.exec(trimmed);
6
+ if (!m) throw new Error(`invalid duration: ${raw}`);
7
+ const value = Number(m[1]);
8
+ if (!Number.isFinite(value) || value < 0) throw new Error(`invalid duration: ${raw}`);
9
+ const unit = m[2] ?? opts?.defaultUnit ?? "ms";
10
+ const multiplier = unit === "ms" ? 1 : unit === "s" ? 1e3 : unit === "m" ? 6e4 : unit === "h" ? 36e5 : 864e5;
11
+ return Math.round(value * multiplier);
12
+ }
13
+
14
+ //#endregion
15
+ export { parseDurationMs };