@sfmc-bds/cli 0.2.0-beta.1 → 0.2.0-beta.11

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 (197) hide show
  1. package/LICENSE +663 -0
  2. package/dist/argv-parse.d.ts +11 -0
  3. package/dist/argv-parse.d.ts.map +1 -0
  4. package/dist/argv-parse.js +28 -0
  5. package/dist/argv-parse.js.map +7 -0
  6. package/dist/cli-gate.d.ts +11 -0
  7. package/dist/cli-gate.d.ts.map +1 -0
  8. package/dist/cli-gate.js +46 -0
  9. package/dist/cli-gate.js.map +7 -0
  10. package/dist/command-palette.d.ts +61 -0
  11. package/dist/command-palette.d.ts.map +1 -0
  12. package/dist/command-palette.js +352 -0
  13. package/dist/command-palette.js.map +7 -0
  14. package/dist/command-surface.d.ts +85 -0
  15. package/dist/command-surface.d.ts.map +1 -0
  16. package/dist/command-surface.js +292 -0
  17. package/dist/command-surface.js.map +7 -0
  18. package/dist/command-surface.test.js +92 -0
  19. package/dist/command-surface.test.js.map +7 -0
  20. package/dist/commands-reload.js +2 -2
  21. package/dist/commands-reload.js.map +2 -2
  22. package/dist/commands.d.ts +1 -1
  23. package/dist/commands.d.ts.map +1 -1
  24. package/dist/commands.js +196 -21
  25. package/dist/commands.js.map +2 -2
  26. package/dist/debug-command.d.ts +5 -0
  27. package/dist/debug-command.d.ts.map +1 -0
  28. package/dist/debug-command.js +118 -0
  29. package/dist/debug-command.js.map +7 -0
  30. package/dist/debug-command.test.js +76 -0
  31. package/dist/debug-command.test.js.map +7 -0
  32. package/dist/directory-picker.d.ts +27 -0
  33. package/dist/directory-picker.d.ts.map +1 -0
  34. package/dist/directory-picker.js +112 -0
  35. package/dist/directory-picker.js.map +7 -0
  36. package/dist/help-text.d.ts +3 -0
  37. package/dist/help-text.d.ts.map +1 -0
  38. package/dist/help-text.js +160 -0
  39. package/dist/help-text.js.map +7 -0
  40. package/dist/i18n/locales/en.d.ts +94 -79
  41. package/dist/i18n/locales/en.d.ts.map +1 -1
  42. package/dist/i18n/locales/en.js +96 -81
  43. package/dist/i18n/locales/en.js.map +2 -2
  44. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  45. package/dist/i18n/locales/zh-CN.js +130 -109
  46. package/dist/i18n/locales/zh-CN.js.map +2 -2
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +9 -4
  50. package/dist/index.js.map +2 -2
  51. package/dist/interactive-prompts.d.ts +1 -2
  52. package/dist/interactive-prompts.d.ts.map +1 -1
  53. package/dist/interactive-prompts.js +12 -23
  54. package/dist/interactive-prompts.js.map +3 -3
  55. package/dist/llbot-launch.d.ts +20 -0
  56. package/dist/llbot-launch.d.ts.map +1 -0
  57. package/dist/llbot-launch.js +40 -0
  58. package/dist/llbot-launch.js.map +7 -0
  59. package/dist/log-filter.test.js +119 -0
  60. package/dist/log-filter.test.js.map +7 -0
  61. package/dist/logs.d.ts +16 -1
  62. package/dist/logs.d.ts.map +1 -1
  63. package/dist/logs.js +80 -11
  64. package/dist/logs.js.map +2 -2
  65. package/dist/main.js +55 -46
  66. package/dist/main.js.map +2 -2
  67. package/dist/module-commands.d.ts +17 -40
  68. package/dist/module-commands.d.ts.map +1 -1
  69. package/dist/module-commands.js +129 -85
  70. package/dist/module-commands.js.map +2 -2
  71. package/dist/module-pack-build.d.ts +10 -0
  72. package/dist/module-pack-build.d.ts.map +1 -0
  73. package/dist/module-pack-build.js +434 -0
  74. package/dist/module-pack-build.js.map +7 -0
  75. package/dist/module-toggle.d.ts +33 -0
  76. package/dist/module-toggle.d.ts.map +1 -0
  77. package/dist/module-toggle.js +28 -0
  78. package/dist/module-toggle.js.map +7 -0
  79. package/dist/module-toggle.test.js +37 -0
  80. package/dist/module-toggle.test.js.map +7 -0
  81. package/dist/node-service-probe.d.ts +18 -0
  82. package/dist/node-service-probe.d.ts.map +1 -0
  83. package/dist/node-service-probe.js +97 -0
  84. package/dist/node-service-probe.js.map +7 -0
  85. package/dist/pack-lifecycle.d.ts +1 -1
  86. package/dist/pack-lifecycle.d.ts.map +1 -1
  87. package/dist/pack-lifecycle.js +14 -4
  88. package/dist/pack-lifecycle.js.map +2 -2
  89. package/dist/pack-update/index.d.ts +18 -0
  90. package/dist/pack-update/index.d.ts.map +1 -0
  91. package/dist/pack-update/index.js +113 -0
  92. package/dist/pack-update/index.js.map +7 -0
  93. package/dist/registry.d.ts +7 -4
  94. package/dist/registry.d.ts.map +1 -1
  95. package/dist/registry.js +15 -3
  96. package/dist/registry.js.map +2 -2
  97. package/dist/repl-windows/format-display.d.ts +10 -0
  98. package/dist/repl-windows/format-display.d.ts.map +1 -0
  99. package/dist/repl-windows/format-display.js +57 -0
  100. package/dist/repl-windows/format-display.js.map +7 -0
  101. package/dist/repl-windows/host.d.ts +60 -0
  102. package/dist/repl-windows/host.d.ts.map +1 -0
  103. package/dist/repl-windows/host.js +179 -0
  104. package/dist/repl-windows/host.js.map +7 -0
  105. package/dist/repl-windows/index.d.ts +9 -0
  106. package/dist/repl-windows/index.d.ts.map +1 -0
  107. package/dist/repl-windows/index.js +13 -0
  108. package/dist/repl-windows/index.js.map +7 -0
  109. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  110. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  111. package/dist/repl-windows/logs-filter-window.js +77 -0
  112. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  113. package/dist/repl-windows/service-window.d.ts +4 -0
  114. package/dist/repl-windows/service-window.d.ts.map +1 -0
  115. package/dist/repl-windows/service-window.js +35 -0
  116. package/dist/repl-windows/service-window.js.map +7 -0
  117. package/dist/repl-windows/types.d.ts +56 -0
  118. package/dist/repl-windows/types.d.ts.map +1 -0
  119. package/dist/repl-windows/types.js +1 -0
  120. package/dist/repl-windows/types.js.map +7 -0
  121. package/dist/repl.d.ts +6 -9
  122. package/dist/repl.d.ts.map +1 -1
  123. package/dist/repl.js +698 -427
  124. package/dist/repl.js.map +3 -3
  125. package/dist/runtime.d.ts +6 -13
  126. package/dist/runtime.d.ts.map +1 -1
  127. package/dist/runtime.js +23 -28
  128. package/dist/runtime.js.map +2 -2
  129. package/dist/send-target.d.ts +11 -0
  130. package/dist/send-target.d.ts.map +1 -0
  131. package/dist/send-target.js +42 -0
  132. package/dist/send-target.js.map +7 -0
  133. package/dist/services.d.ts +50 -4
  134. package/dist/services.d.ts.map +1 -1
  135. package/dist/services.js +244 -20
  136. package/dist/services.js.map +2 -2
  137. package/dist/theme.js +1 -1
  138. package/dist/theme.js.map +2 -2
  139. package/dist/wizard.d.ts.map +1 -1
  140. package/dist/wizard.js +76 -16
  141. package/dist/wizard.js.map +2 -2
  142. package/dist/world-packs-uninstall.test.js +54 -0
  143. package/dist/world-packs-uninstall.test.js.map +7 -0
  144. package/dist/world-packs.d.ts.map +1 -1
  145. package/dist/world-packs.js +6 -3
  146. package/dist/world-packs.js.map +2 -2
  147. package/package.json +29 -24
  148. package/scripts/module-install/check-modules.mjs +204 -0
  149. package/scripts/module-install/fetch-module.mjs +1007 -0
  150. package/scripts/module-install/lib/catalog.mjs +96 -0
  151. package/scripts/module-install/lib/io.mjs +37 -0
  152. package/scripts/module-install/lib/link-from.mjs +80 -0
  153. package/scripts/module-install/lib/lock.mjs +78 -0
  154. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  155. package/scripts/module-install/lib/packages.mjs +142 -0
  156. package/scripts/module-install/lib/paths.mjs +48 -0
  157. package/scripts/module-install/lib/registry-index.mjs +50 -0
  158. package/scripts/module-install/test/install-resolver.test.ts +47 -0
  159. package/scripts/module-install/test/link-local.test.ts +50 -0
  160. package/scripts/module-install/test/local-resolver.test.ts +44 -0
  161. package/scripts/module-install/test/registry-index.test.ts +27 -0
  162. package/dist/module-wizard.d.ts +0 -14
  163. package/dist/module-wizard.d.ts.map +0 -1
  164. package/dist/module-wizard.js +0 -313
  165. package/dist/module-wizard.js.map +0 -7
  166. package/dist/pack-update/bindings.d.ts +0 -12
  167. package/dist/pack-update/bindings.d.ts.map +0 -1
  168. package/dist/pack-update/bindings.js +0 -64
  169. package/dist/pack-update/bindings.js.map +0 -7
  170. package/dist/pack-update/config.d.ts +0 -22
  171. package/dist/pack-update/config.d.ts.map +0 -1
  172. package/dist/pack-update/config.js +0 -141
  173. package/dist/pack-update/config.js.map +0 -7
  174. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  175. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  176. package/dist/pack-update/providers/curseforge.js +0 -229
  177. package/dist/pack-update/providers/curseforge.js.map +0 -7
  178. package/dist/pack-update/providers/index.d.ts +0 -16
  179. package/dist/pack-update/providers/index.d.ts.map +0 -1
  180. package/dist/pack-update/providers/index.js +0 -37
  181. package/dist/pack-update/providers/index.js.map +0 -7
  182. package/dist/pack-update/service.d.ts +0 -21
  183. package/dist/pack-update/service.d.ts.map +0 -1
  184. package/dist/pack-update/service.js +0 -572
  185. package/dist/pack-update/service.js.map +0 -7
  186. package/dist/pack-update/types.d.ts +0 -126
  187. package/dist/pack-update/types.d.ts.map +0 -1
  188. package/dist/pack-update/types.js +0 -8
  189. package/dist/pack-update/types.js.map +0 -7
  190. package/dist/pack-update/version-policy.d.ts +0 -81
  191. package/dist/pack-update/version-policy.d.ts.map +0 -1
  192. package/dist/pack-update/version-policy.js +0 -210
  193. package/dist/pack-update/version-policy.js.map +0 -7
  194. package/dist/remote-agent.d.ts +0 -18
  195. package/dist/remote-agent.d.ts.map +0 -1
  196. package/dist/remote-agent.js +0 -196
  197. package/dist/remote-agent.js.map +0 -7
@@ -1,196 +0,0 @@
1
- import { WebSocket } from "ws";
2
- import {
3
- configPath,
4
- DEFAULT_REMOTE_CONFIG,
5
- loadEnsuredConfig,
6
- writeJson,
7
- withConfigSchema
8
- } from "@sfmc-bds/sdk/node/config";
9
- import { cmdRestart, cmdSend, cmdStart, cmdStop } from "./commands.js";
10
- import { ROOT } from "./runtime.js";
11
- import { SERVICE_NAMES, serviceStatus } from "./services.js";
12
- let socket = null;
13
- let retryTimer = null;
14
- let retryDelay = 1e3;
15
- let heartbeatTimer = null;
16
- let lastError = "";
17
- let warnedMissingConfig = false;
18
- let stopping = false;
19
- const HEARTBEAT_INTERVAL_MS = 2e4;
20
- function loadConfig() {
21
- return loadEnsuredConfig(
22
- ROOT,
23
- "remote.json",
24
- "remote",
25
- { ...DEFAULT_REMOTE_CONFIG }
26
- );
27
- }
28
- function writeConfig(config) {
29
- writeJson(configPath(ROOT, "remote.json"), withConfigSchema({ ...config }, "remote"));
30
- }
31
- function isService(value) {
32
- return !!value && SERVICE_NAMES.includes(value);
33
- }
34
- function isAction(value) {
35
- return value === "status" || value === "start" || value === "stop" || value === "restart" || value === "send";
36
- }
37
- function websocketUrl(controllerUrl, agentId) {
38
- const url = new URL(controllerUrl);
39
- url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
40
- url.pathname = "/v1/agent";
41
- url.search = new URLSearchParams({ id: agentId }).toString();
42
- return url.toString();
43
- }
44
- function send(payload) {
45
- if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(payload));
46
- }
47
- function startHeartbeat() {
48
- stopHeartbeat();
49
- heartbeatTimer = setInterval(() => send({ type: "ping" }), HEARTBEAT_INTERVAL_MS);
50
- }
51
- function stopHeartbeat() {
52
- if (heartbeatTimer) {
53
- clearInterval(heartbeatTimer);
54
- heartbeatTimer = null;
55
- }
56
- }
57
- async function execute(task) {
58
- if (!isAction(task.action)) throw new Error("invalid task action");
59
- if (task.action === "status") return { services: serviceStatus() };
60
- if (!isService(task.service)) throw new Error("service is required and must be one of: " + SERVICE_NAMES.join(", "));
61
- if (task.action === "send") {
62
- if (!task.message) throw new Error("message is required for send action");
63
- return { output: await cmdSend(task.service, task.message), services: serviceStatus() };
64
- }
65
- const output = task.action === "start" ? await cmdStart(task.service) : task.action === "stop" ? await cmdStop(task.service) : await cmdRestart(task.service);
66
- return { output, services: serviceStatus() };
67
- }
68
- function scheduleReconnect() {
69
- if (retryTimer || stopping) return;
70
- const delay = retryDelay;
71
- retryTimer = setTimeout(() => {
72
- retryTimer = null;
73
- startRemoteAgent();
74
- }, delay);
75
- }
76
- function resetReconnect(reason) {
77
- retryDelay = 1e3;
78
- if (reason) {
79
- lastError = reason;
80
- console.warn(`[remote-agent] ${reason} \u2014 will retry in ${retryDelay}ms`);
81
- }
82
- }
83
- function stopRemoteAgent() {
84
- stopping = true;
85
- stopHeartbeat();
86
- if (retryTimer) {
87
- clearTimeout(retryTimer);
88
- retryTimer = null;
89
- }
90
- if (socket) {
91
- try {
92
- socket.close(1e3, "client_shutdown");
93
- } catch {
94
- }
95
- socket = null;
96
- }
97
- }
98
- function startRemoteAgent() {
99
- if (stopping) return;
100
- if (socket || retryTimer) return;
101
- const config = loadConfig();
102
- if (!config.enabled || !config.controller_url || !config.agent_id || !config.agent_secret) {
103
- if (!warnedMissingConfig) {
104
- const missing = [];
105
- if (!config.enabled) missing.push("enabled");
106
- if (!config.controller_url) missing.push("controller_url");
107
- if (!config.agent_id) missing.push("agent_id");
108
- if (!config.agent_secret) missing.push("agent_secret");
109
- if (missing.length) {
110
- console.warn(`[remote-agent] disabled \u2014 missing remote.json fields: ${missing.join(", ")} (run \`sfmc remote enroll\`)`);
111
- }
112
- warnedMissingConfig = true;
113
- }
114
- return;
115
- }
116
- warnedMissingConfig = true;
117
- let ws;
118
- try {
119
- ws = new WebSocket(websocketUrl(config.controller_url, config.agent_id));
120
- } catch (e) {
121
- resetReconnect(`failed to construct websocket: ${e.message}`);
122
- scheduleReconnect();
123
- return;
124
- }
125
- socket = ws;
126
- ws.on("open", () => {
127
- retryDelay = 1e3;
128
- lastError = "";
129
- send({ type: "hello", agentId: config.agent_id, secret: config.agent_secret, status: serviceStatus() });
130
- startHeartbeat();
131
- });
132
- ws.on("message", (raw) => {
133
- let msg;
134
- try {
135
- msg = JSON.parse(raw.toString());
136
- } catch {
137
- return;
138
- }
139
- if (msg.type === "ping") {
140
- send({ type: "pong" });
141
- return;
142
- }
143
- if (msg.type !== "task") return;
144
- const task = msg;
145
- void execute(task).then((result) => send({ type: "task_result", taskId: task.taskId, ok: true, result })).catch((error) => send({ type: "task_result", taskId: task.taskId, ok: false, error: error.message }));
146
- });
147
- ws.on("close", (code, reason) => {
148
- if (socket === ws) socket = null;
149
- stopHeartbeat();
150
- if (stopping) return;
151
- resetReconnect(`disconnected (code=${code} ${reason.toString() || "no_reason"})`);
152
- scheduleReconnect();
153
- });
154
- ws.on("error", (e) => {
155
- resetReconnect(`socket error: ${e.message}`);
156
- });
157
- }
158
- async function enrollRemoteAgent(controllerUrl, enrollmentToken, name) {
159
- const response = await fetch(new URL("/v1/enroll", controllerUrl), {
160
- method: "POST",
161
- headers: { "content-type": "application/json", authorization: `Bearer ${enrollmentToken}` },
162
- body: JSON.stringify({ name })
163
- });
164
- const result = await response.json();
165
- if (!response.ok || !result.agentId || !result.agentSecret) throw new Error(result.error ?? "enrollment failed");
166
- writeConfig({ enabled: true, controller_url: controllerUrl, agent_id: result.agentId, agent_secret: result.agentSecret });
167
- return result.agentId;
168
- }
169
- function disableRemoteAgent() {
170
- const config = loadConfig();
171
- if (config.agent_id || config.agent_secret) {
172
- writeConfig({ ...config, enabled: false });
173
- }
174
- stopRemoteAgent();
175
- stopping = false;
176
- }
177
- function remoteStatus() {
178
- const config = loadConfig();
179
- const result = { connected: socket?.readyState === WebSocket.OPEN };
180
- if (config.enabled !== void 0) result.enabled = config.enabled;
181
- if (config.controller_url) result.controller_url = config.controller_url;
182
- if (config.agent_id) result.agent_id = config.agent_id;
183
- if (lastError) {
184
- result.last_error = lastError;
185
- result.retry_in_ms = retryDelay;
186
- }
187
- return result;
188
- }
189
- export {
190
- disableRemoteAgent,
191
- enrollRemoteAgent,
192
- remoteStatus,
193
- startRemoteAgent,
194
- stopRemoteAgent
195
- };
196
- //# sourceMappingURL=remote-agent.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/remote-agent.ts"],
4
- "sourcesContent": ["import { WebSocket } from \"ws\";\nimport {\n configPath,\n DEFAULT_REMOTE_CONFIG,\n loadEnsuredConfig,\n writeJson,\n withConfigSchema,\n type RemoteConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { cmdRestart, cmdSend, cmdStart, cmdStop } from \"./commands.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { SERVICE_NAMES, serviceStatus, type ServiceName } from \"./services.js\";\n\ntype Task = {\n type: \"task\";\n taskId: string;\n action: \"status\" | \"start\" | \"stop\" | \"restart\" | \"send\";\n service?: string;\n message?: string;\n};\n\ntype RemoteStatus = {\n enabled?: boolean;\n controller_url?: string;\n agent_id?: string;\n connected: boolean;\n last_error?: string;\n retry_in_ms?: number;\n};\n\nlet socket: WebSocket | null = null;\nlet retryTimer: NodeJS.Timeout | null = null;\nlet retryDelay = 1000;\nlet heartbeatTimer: NodeJS.Timeout | null = null;\nlet lastError = \"\";\nlet warnedMissingConfig = false;\nlet stopping = false;\n\nconst HEARTBEAT_INTERVAL_MS = 20_000;\n\n/** \u542F\u52A8\u65F6\u786E\u4FDD remote.json \u5B58\u5728,\u8FD4\u56DE\u73B0\u6709\u6216\u7A7A\u914D\u7F6E\uFF08\u5DF2\u5265\u79BB $schema\uFF09\u3002 */\nfunction loadConfig(): RemoteConfig {\n return loadEnsuredConfig(\n ROOT,\n \"remote.json\",\n \"remote\",\n { ...DEFAULT_REMOTE_CONFIG } as Record<string, unknown>\n ) as RemoteConfig;\n}\n\nfunction writeConfig(config: RemoteConfig): void {\n writeJson(configPath(ROOT, \"remote.json\"), withConfigSchema({ ...config } as Record<string, unknown>, \"remote\"));\n}\n\nfunction isService(value: string | undefined): value is ServiceName {\n return !!value && SERVICE_NAMES.includes(value as ServiceName);\n}\n\nfunction isAction(value: unknown): value is Task[\"action\"] {\n return value === \"status\" || value === \"start\" || value === \"stop\" || value === \"restart\" || value === \"send\";\n}\n\nfunction websocketUrl(controllerUrl: string, agentId: string): string {\n const url = new URL(controllerUrl);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.pathname = \"/v1/agent\";\n url.search = new URLSearchParams({ id: agentId }).toString();\n return url.toString();\n}\n\nfunction send(payload: unknown): void {\n if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(payload));\n}\n\nfunction startHeartbeat(): void {\n stopHeartbeat();\n heartbeatTimer = setInterval(() => send({ type: \"ping\" }), HEARTBEAT_INTERVAL_MS);\n}\n\nfunction stopHeartbeat(): void {\n if (heartbeatTimer) {\n clearInterval(heartbeatTimer);\n heartbeatTimer = null;\n }\n}\n\nasync function execute(task: Task): Promise<unknown> {\n if (!isAction(task.action)) throw new Error(\"invalid task action\");\n if (task.action === \"status\") return { services: serviceStatus() };\n if (!isService(task.service)) throw new Error(\"service is required and must be one of: \" + SERVICE_NAMES.join(\", \"));\n if (task.action === \"send\") {\n if (!task.message) throw new Error(\"message is required for send action\");\n return { output: await cmdSend(task.service, task.message), services: serviceStatus() };\n }\n\n const output =\n task.action === \"start\"\n ? await cmdStart(task.service)\n : task.action === \"stop\"\n ? await cmdStop(task.service)\n : await cmdRestart(task.service);\n return { output, services: serviceStatus() };\n}\n\nfunction scheduleReconnect(): void {\n if (retryTimer || stopping) return;\n const delay = retryDelay;\n retryTimer = setTimeout(() => {\n retryTimer = null;\n startRemoteAgent();\n }, delay);\n}\n\nfunction resetReconnect(reason?: string): void {\n retryDelay = 1000;\n if (reason) {\n lastError = reason;\n console.warn(`[remote-agent] ${reason} \u2014 will retry in ${retryDelay}ms`);\n }\n}\n\n/** Close the active socket (if any) and stop reconnecting. Idempotent. */\nexport function stopRemoteAgent(): void {\n stopping = true;\n stopHeartbeat();\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n if (socket) {\n try {\n socket.close(1000, \"client_shutdown\");\n } catch {\n /* ignore */\n }\n socket = null;\n }\n}\n\n/** Start one outbound-only remote-management connection for this supervisor process. */\nexport function startRemoteAgent(): void {\n if (stopping) return;\n if (socket || retryTimer) return;\n const config = loadConfig();\n if (!config.enabled || !config.controller_url || !config.agent_id || !config.agent_secret) {\n if (!warnedMissingConfig) {\n const missing: string[] = [];\n if (!config.enabled) missing.push(\"enabled\");\n if (!config.controller_url) missing.push(\"controller_url\");\n if (!config.agent_id) missing.push(\"agent_id\");\n if (!config.agent_secret) missing.push(\"agent_secret\");\n if (missing.length) {\n console.warn(`[remote-agent] disabled \u2014 missing remote.json fields: ${missing.join(\", \")} (run \\`sfmc remote enroll\\`)`);\n }\n warnedMissingConfig = true;\n }\n return;\n }\n warnedMissingConfig = true;\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(websocketUrl(config.controller_url, config.agent_id));\n } catch (e) {\n resetReconnect(`failed to construct websocket: ${(e as Error).message}`);\n scheduleReconnect();\n return;\n }\n socket = ws;\n\n ws.on(\"open\", () => {\n retryDelay = 1000;\n lastError = \"\";\n send({ type: \"hello\", agentId: config.agent_id, secret: config.agent_secret, status: serviceStatus() });\n startHeartbeat();\n });\n ws.on(\"message\", (raw) => {\n let msg: { type?: string };\n try {\n msg = JSON.parse(raw.toString()) as { type?: string };\n } catch {\n return;\n }\n if (msg.type === \"ping\") {\n send({ type: \"pong\" });\n return;\n }\n if (msg.type !== \"task\") return;\n const task = msg as Task;\n void execute(task)\n .then((result) => send({ type: \"task_result\", taskId: task.taskId, ok: true, result }))\n .catch((error: Error) => send({ type: \"task_result\", taskId: task.taskId, ok: false, error: error.message }));\n });\n ws.on(\"close\", (code, reason) => {\n if (socket === ws) socket = null;\n stopHeartbeat();\n if (stopping) return;\n resetReconnect(`disconnected (code=${code} ${reason.toString() || \"no_reason\"})`);\n scheduleReconnect();\n });\n ws.on(\"error\", (e) => {\n resetReconnect(`socket error: ${e.message}`);\n /* close event will follow and trigger reconnect */\n });\n}\n\nexport async function enrollRemoteAgent(controllerUrl: string, enrollmentToken: string, name: string): Promise<string> {\n const response = await fetch(new URL(\"/v1/enroll\", controllerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", authorization: `Bearer ${enrollmentToken}` },\n body: JSON.stringify({ name }),\n });\n const result = (await response.json()) as { agentId?: string; agentSecret?: string; error?: string };\n if (!response.ok || !result.agentId || !result.agentSecret) throw new Error(result.error ?? \"enrollment failed\");\n\n writeConfig({ enabled: true, controller_url: controllerUrl, agent_id: result.agentId, agent_secret: result.agentSecret });\n return result.agentId;\n}\n\n/** Disable the remote agent: clear enabled flag and close the connection. */\nexport function disableRemoteAgent(): void {\n const config = loadConfig();\n if (config.agent_id || config.agent_secret) {\n writeConfig({ ...config, enabled: false });\n }\n stopRemoteAgent();\n stopping = false;\n}\n\nexport function remoteStatus(): RemoteStatus {\n const config = loadConfig();\n const result: RemoteStatus = { connected: socket?.readyState === WebSocket.OPEN };\n if (config.enabled !== undefined) result.enabled = config.enabled;\n if (config.controller_url) result.controller_url = config.controller_url;\n if (config.agent_id) result.agent_id = config.agent_id;\n if (lastError) {\n result.last_error = lastError;\n result.retry_in_ms = retryDelay;\n }\n return result;\n}"],
5
- "mappings": "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",
6
- "names": []
7
- }