openmeld 0.3.205 → 0.3.207
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.
- package/dist/{add-me-membership-jhCNTfdl.js → add-me-membership-1JHMjZoR.js} +2 -2
- package/dist/{add-me-membership-jhCNTfdl.js.map → add-me-membership-1JHMjZoR.js.map} +1 -1
- package/dist/{agents-9krfNX_L.js → agents-CIDsThyG.js} +1041 -597
- package/dist/agents-CIDsThyG.js.map +1 -0
- package/dist/{api-client-foundation-BguumKMv.js → api-client-foundation-D6_NXHPV.js} +1 -1
- package/dist/{api-client-foundation-BMPOo4bG.js → api-client-foundation-DSurenul.js} +17 -7
- package/dist/api-client-foundation-DSurenul.js.map +1 -0
- package/dist/auth-session-B7QMhHwh.js +4 -0
- package/dist/{auth-session-wmefguut.js → auth-session-CO5XtFaq.js} +450 -128
- package/dist/auth-session-CO5XtFaq.js.map +1 -0
- package/dist/{base-url-C89TOpPV.js → base-url-BE3pFiOZ.js} +1 -1
- package/dist/{base-url-jWXPssF_.js → base-url-C6sHRNGu.js} +3 -3
- package/dist/{base-url-jWXPssF_.js.map → base-url-C6sHRNGu.js.map} +1 -1
- package/dist/cli-binary-manifest-DiUulkp0.js +117 -0
- package/dist/cli-binary-manifest-DiUulkp0.js.map +1 -0
- package/dist/{command-DKM3wO3V.js → command-Bzt9zgnI.js} +14 -12
- package/dist/{command-DKM3wO3V.js.map → command-Bzt9zgnI.js.map} +1 -1
- package/dist/computer-connection-BOl79Ftf.js +54 -0
- package/dist/computer-connection-BOl79Ftf.js.map +1 -0
- package/dist/computer-connection-review-BTOvbJYL.js +39 -0
- package/dist/computer-connection-review-BTOvbJYL.js.map +1 -0
- package/dist/{computer-setup-continuation-Dad0lLP9.js → computer-setup-continuation-DmKdhR5u.js} +4 -4
- package/dist/{computer-setup-continuation-Dad0lLP9.js.map → computer-setup-continuation-DmKdhR5u.js.map} +1 -1
- package/dist/control-plane-D9jDcbMZ.js +1211 -0
- package/dist/control-plane-D9jDcbMZ.js.map +1 -0
- package/dist/daemon-local-state-file-jOXuXrky.js +45 -0
- package/dist/daemon-local-state-file-jOXuXrky.js.map +1 -0
- package/dist/daemon-runtime-lease-Dd4hdHNo.js +50 -0
- package/dist/daemon-runtime-lease-Dd4hdHNo.js.map +1 -0
- package/dist/{daemon-runtime-lease-BG9g0a6Z.js → daemon-runtime-lease-y3n1K0-C.js} +1 -1
- package/dist/{daemon-service-manager-DqVtRLBY.js → daemon-service-manager-Bh0LoLed.js} +1 -1
- package/dist/{daemon-service-manager-BVipiZwK.js → daemon-service-manager-GiMCiTmu.js} +99 -85
- package/dist/daemon-service-manager-GiMCiTmu.js.map +1 -0
- package/dist/daemon-service-runtime-DQW9gSLT.js +3642 -0
- package/dist/daemon-service-runtime-DQW9gSLT.js.map +1 -0
- package/dist/{daemon-state-BwIoDq7_.js → daemon-state-C37ZtIZK.js} +11 -5
- package/dist/daemon-state-C37ZtIZK.js.map +1 -0
- package/dist/{dist-CkixulB-.js → dist-D-kJdWZE.js} +4272 -3990
- package/dist/dist-D-kJdWZE.js.map +1 -0
- package/dist/dist-DTG_Vqc7.js +4 -0
- package/dist/distribution-DY2fBeSW.js +72 -0
- package/dist/distribution-DY2fBeSW.js.map +1 -0
- package/dist/{elapsed-time-CjAPqg-B.js → elapsed-time-CcoM2R3N.js} +7 -4
- package/dist/{elapsed-time-CjAPqg-B.js.map → elapsed-time-CcoM2R3N.js.map} +1 -1
- package/dist/{installer-CZyyvNZr.js → installation-inventory-DJlwXa1q.js} +362 -361
- package/dist/installation-inventory-DJlwXa1q.js.map +1 -0
- package/dist/{lock-CvBnBcFK.js → lock-Dxp6o_t_.js} +56 -7
- package/dist/lock-Dxp6o_t_.js.map +1 -0
- package/dist/{openmeld-DVThrV4O.js → openmeld-CiL4AiB0.js} +232 -23
- package/dist/openmeld-CiL4AiB0.js.map +1 -0
- package/dist/openmeld-dev.js +1 -1
- package/dist/openmeld-environment-target-NtJYJe1D.js +256 -0
- package/dist/openmeld-environment-target-NtJYJe1D.js.map +1 -0
- package/dist/{openmeld-maintenance-worker-Cxp6fwB5.js → openmeld-maintenance-worker-DjdmRASI.js} +9 -8
- package/dist/{openmeld-maintenance-worker-Cxp6fwB5.js.map → openmeld-maintenance-worker-DjdmRASI.js.map} +1 -1
- package/dist/{openmeld-tools-update-coordinator-DJ65uI3O.js → openmeld-tools-update-coordinator-D9Skj8IE.js} +52 -4013
- package/dist/openmeld-tools-update-coordinator-D9Skj8IE.js.map +1 -0
- package/dist/openmeld.js +3 -3
- package/dist/{prepare-session-executor-aE1YARgn.js → prepare-session-executor-B0NtjHEL.js} +15 -13
- package/dist/{prepare-session-executor-aE1YARgn.js.map → prepare-session-executor-B0NtjHEL.js.map} +1 -1
- package/dist/{profiles-Dx3gaXgQ.js → runtime-transport-QIZmAo4-.js} +634 -1825
- package/dist/runtime-transport-QIZmAo4-.js.map +1 -0
- package/dist/service-account-authorization-Dt8kGvq8.js +56 -0
- package/dist/service-account-authorization-Dt8kGvq8.js.map +1 -0
- package/dist/service-control-capabilities-BU5F75zi.js +54 -0
- package/dist/service-control-capabilities-BU5F75zi.js.map +1 -0
- package/dist/service-control-capabilities-CzUB1ovW.js +4 -0
- package/dist/upgrade-DLECkjMt.js +4 -0
- package/dist/{upgrade-Bk8t5oav.js → upgrade-NxpTydHp.js} +6 -4
- package/dist/upgrade-NxpTydHp.js.map +1 -0
- package/dist/{urls-4D7CaXe3.js → urls-CY2uzH2-.js} +2 -1
- package/dist/urls-CY2uzH2-.js.map +1 -0
- package/package.json +2 -2
- package/dist/agents-9krfNX_L.js.map +0 -1
- package/dist/api-client-foundation-BMPOo4bG.js.map +0 -1
- package/dist/auth-session-CpPqG8Xz.js +0 -4
- package/dist/auth-session-wmefguut.js.map +0 -1
- package/dist/daemon-runtime-lease-CXlGR-iA.js +0 -87
- package/dist/daemon-runtime-lease-CXlGR-iA.js.map +0 -1
- package/dist/daemon-service-manager-BVipiZwK.js.map +0 -1
- package/dist/daemon-state-BwIoDq7_.js.map +0 -1
- package/dist/dist-BFbC-9BX.js +0 -4
- package/dist/dist-CkixulB-.js.map +0 -1
- package/dist/installer-CZyyvNZr.js.map +0 -1
- package/dist/lock-CvBnBcFK.js.map +0 -1
- package/dist/openmeld-DVThrV4O.js.map +0 -1
- package/dist/openmeld-tools-update-coordinator-DJ65uI3O.js.map +0 -1
- package/dist/profiles-Dx3gaXgQ.js.map +0 -1
- package/dist/upgrade-BFGKy5He.js +0 -4
- package/dist/upgrade-Bk8t5oav.js.map +0 -1
- package/dist/urls-4D7CaXe3.js.map +0 -1
package/dist/openmeld-dev.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { n as DEV_LOCAL_GATEWAY_BASE_URL } from "./base-url-
|
|
3
|
+
import { n as DEV_LOCAL_GATEWAY_BASE_URL } from "./base-url-C6sHRNGu.js";
|
|
4
4
|
//#region src/openmeld-dev.ts
|
|
5
5
|
const LOCAL_GATEWAY_URL = DEV_LOCAL_GATEWAY_BASE_URL;
|
|
6
6
|
const LOCAL_AUTH_URL = "http://localhost:8788";
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { t as normalizeBaseUrl } from "./urls-CY2uzH2-.js";
|
|
4
|
+
import { dt as resolveOpenMeldEnvPreset } from "./lock-Dxp6o_t_.js";
|
|
5
|
+
import { a as resolveBaseUrl, r as normalizeGatewayBaseUrl, s as resolveDefaultGatewayBaseUrl } from "./base-url-C6sHRNGu.js";
|
|
6
|
+
import process$1 from "node:process";
|
|
7
|
+
//#region src/runtime/cli-entry-command.ts
|
|
8
|
+
const OPENMELD_CLI_COMMAND = "openmeld";
|
|
9
|
+
const OPENMELD_CLI_NPX_COMMAND = "npx -y openmeld@latest";
|
|
10
|
+
const OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND_ENV = "OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND";
|
|
11
|
+
const OPENMELD_USER_FACING_CLI_COMMAND_ENV$1 = "OPENMELD_USER_FACING_CLI_COMMAND";
|
|
12
|
+
const OPENMELD_TOP_LEVEL_COMMANDS = [
|
|
13
|
+
"adapter",
|
|
14
|
+
"agents",
|
|
15
|
+
"auth",
|
|
16
|
+
"computer",
|
|
17
|
+
"daemon",
|
|
18
|
+
"doctor",
|
|
19
|
+
"help",
|
|
20
|
+
"login",
|
|
21
|
+
"profile",
|
|
22
|
+
"profiles",
|
|
23
|
+
"prompt",
|
|
24
|
+
"reset",
|
|
25
|
+
"send",
|
|
26
|
+
"service",
|
|
27
|
+
"setup",
|
|
28
|
+
"skills",
|
|
29
|
+
"space",
|
|
30
|
+
"start",
|
|
31
|
+
"tail",
|
|
32
|
+
"upgrade",
|
|
33
|
+
"view",
|
|
34
|
+
"whoami"
|
|
35
|
+
];
|
|
36
|
+
const OPENMELD_COMMAND_PREFIX_RE = /^openmeld(?=$|\s)/u;
|
|
37
|
+
const OPENMELD_COMMAND_LINE_RE = /^(?<prefix>\s*(?:(?:[$*-])\s+|\d+\)\s+)??)(?<command>openmeld(?=$|\s).*)$/u;
|
|
38
|
+
const OPENMELD_COMMAND_AFTER_PIPE_RE = /^(?<prefix>.*\|\s+)(?<command>openmeld(?=$|\s).*)$/u;
|
|
39
|
+
const INLINE_OPENMELD_COMMAND_RE = /`(openmeld(?: [^`]*)?)`/gu;
|
|
40
|
+
const CLI_OPTION_NAME_RE = /^[a-z][a-z0-9-]*$/u;
|
|
41
|
+
const FIRST_CLI_OPERAND_OR_OPTION_RE = /^(?<commandPath>.*?)(?<tail>\s+(?:--|<).*)$/u;
|
|
42
|
+
const INLINE_OPENMELD_TOP_LEVEL_MENTION_RE = new RegExp(`\\bats (?<command>${OPENMELD_TOP_LEVEL_COMMANDS.join("|")})\\b`, "gu");
|
|
43
|
+
const NEWLINE_SPLIT_RE = /\r?\n/u;
|
|
44
|
+
const WHITESPACE_SPLIT_RE = /\s+/u;
|
|
45
|
+
const PROFILE_AWARE_TOP_LEVEL_COMMANDS = /* @__PURE__ */ new Set(["whoami"]);
|
|
46
|
+
const PROFILE_AWARE_SPACE_COMMANDS = /* @__PURE__ */ new Set([
|
|
47
|
+
"add-me",
|
|
48
|
+
"add-agents",
|
|
49
|
+
"add-human-profiles",
|
|
50
|
+
"add-members",
|
|
51
|
+
"contract",
|
|
52
|
+
"create",
|
|
53
|
+
"delete",
|
|
54
|
+
"guide",
|
|
55
|
+
"history",
|
|
56
|
+
"join",
|
|
57
|
+
"leave",
|
|
58
|
+
"list",
|
|
59
|
+
"password",
|
|
60
|
+
"publication",
|
|
61
|
+
"remove-members",
|
|
62
|
+
"result",
|
|
63
|
+
"send",
|
|
64
|
+
"status",
|
|
65
|
+
"updates",
|
|
66
|
+
"watch"
|
|
67
|
+
]);
|
|
68
|
+
const SPACE_PARENT_OPTIONS_WITH_VALUE = /* @__PURE__ */ new Set(["--gateway-url"]);
|
|
69
|
+
function resolveUserFacingCliEntryCommand(input = {}) {
|
|
70
|
+
const explicitCommand = normalizeText((input.env ?? process$1.env)[OPENMELD_USER_FACING_CLI_COMMAND_ENV$1]);
|
|
71
|
+
if (explicitCommand.length > 0) return explicitCommand;
|
|
72
|
+
return isNpxCliInvocation(input) ? OPENMELD_CLI_NPX_COMMAND : OPENMELD_CLI_COMMAND;
|
|
73
|
+
}
|
|
74
|
+
function resolveSetupFollowUpCliEntryCommand(input = {}) {
|
|
75
|
+
const setupCommand = normalizeText((input.env ?? process$1.env)[OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND_ENV]);
|
|
76
|
+
if (setupCommand.length > 0) return setupCommand;
|
|
77
|
+
return resolveUserFacingCliEntryCommand(input);
|
|
78
|
+
}
|
|
79
|
+
function formatOpenMeldCliCommand(command, input = {}) {
|
|
80
|
+
if (!OPENMELD_COMMAND_PREFIX_RE.test(command)) return command;
|
|
81
|
+
return command.replace(OPENMELD_COMMAND_PREFIX_RE, resolveUserFacingCliEntryCommand(input));
|
|
82
|
+
}
|
|
83
|
+
function formatOpenMeldCliCommands(commands, input = {}) {
|
|
84
|
+
return commands.map((command) => formatOpenMeldCliLine(command, input));
|
|
85
|
+
}
|
|
86
|
+
function formatProfileAwareOpenMeldCliCommand(command, input = {}) {
|
|
87
|
+
return formatOpenMeldCliCommand(applyProfileAwareCommandScope(command, input), input);
|
|
88
|
+
}
|
|
89
|
+
function formatProfileAwareOpenMeldCliCommands(commands, input = {}) {
|
|
90
|
+
return commands.map((command) => formatProfileAwareOpenMeldCliCommand(command, input));
|
|
91
|
+
}
|
|
92
|
+
function formatInlineOpenMeldCliCommands(text, input = {}) {
|
|
93
|
+
return text.replace(INLINE_OPENMELD_COMMAND_RE, (_, command) => {
|
|
94
|
+
return `\`${formatOpenMeldCliCommand(command, input)}\``;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function formatOpenMeldCliLine(text, input = {}) {
|
|
98
|
+
const inlineFormatted = formatInlineOpenMeldCliCommands(text, input);
|
|
99
|
+
const lineMatch = OPENMELD_COMMAND_LINE_RE.exec(inlineFormatted);
|
|
100
|
+
if (lineMatch?.groups?.command) return formatBareOpenMeldCliMentions(`${lineMatch.groups.prefix ?? ""}${formatOpenMeldCliCommand(lineMatch.groups.command, input)}`, input);
|
|
101
|
+
const pipeMatch = OPENMELD_COMMAND_AFTER_PIPE_RE.exec(inlineFormatted);
|
|
102
|
+
if (pipeMatch?.groups?.command) return formatBareOpenMeldCliMentions(`${pipeMatch.groups.prefix}${formatOpenMeldCliCommand(pipeMatch.groups.command, input)}`, input);
|
|
103
|
+
return formatBareOpenMeldCliMentions(inlineFormatted, input);
|
|
104
|
+
}
|
|
105
|
+
function formatOpenMeldCliTextBlock(text, input = {}) {
|
|
106
|
+
return text.split(NEWLINE_SPLIT_RE).map((line) => formatOpenMeldCliLine(line, input)).join("\n");
|
|
107
|
+
}
|
|
108
|
+
function isNpxCliInvocation(input) {
|
|
109
|
+
const env = input.env ?? process$1.env;
|
|
110
|
+
const argv = input.argv ?? process$1.argv;
|
|
111
|
+
const npmCommand = normalizeText(env.npm_command).toLowerCase();
|
|
112
|
+
const npmExecPath = normalizePath(env.npm_execpath);
|
|
113
|
+
const npmUserAgent = normalizeText(env.npm_config_user_agent).toLowerCase();
|
|
114
|
+
if (npmCommand === "exec" && npmExecTargetIsOpenMeldCli(env) && (npmUserAgent.startsWith("npm/") || npmExecPath.includes("/npm/") || npmExecPath.endsWith("/npm-cli.js"))) return true;
|
|
115
|
+
const scriptPath = normalizePath(argv[1]);
|
|
116
|
+
return scriptPath.includes("/.npm/") && scriptPath.includes("_npx");
|
|
117
|
+
}
|
|
118
|
+
function npmExecTargetIsOpenMeldCli(env) {
|
|
119
|
+
return normalizeText(env.npm_lifecycle_script).replaceAll("\"", "") === OPENMELD_CLI_COMMAND;
|
|
120
|
+
}
|
|
121
|
+
function formatBareOpenMeldCliMentions(text, input = {}) {
|
|
122
|
+
return text.replace(INLINE_OPENMELD_TOP_LEVEL_MENTION_RE, (_, command) => {
|
|
123
|
+
return formatOpenMeldCliCommand(`openmeld ${command}`, input);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function applyProfileAwareCommandScope(command, input) {
|
|
127
|
+
if (!OPENMELD_COMMAND_PREFIX_RE.test(command)) return command;
|
|
128
|
+
let scopedCommand = command.trimEnd();
|
|
129
|
+
const profileId = normalizeText(input.profileId ?? void 0);
|
|
130
|
+
if (profileId.length > 0) scopedCommand = appendCliOption(scopedCommand, "profile", profileId);
|
|
131
|
+
if (input.resolvedView === "agent") scopedCommand = appendCliOption(scopedCommand, "view", "agent");
|
|
132
|
+
return scopedCommand;
|
|
133
|
+
}
|
|
134
|
+
function appendCliOption(command, optionName, value) {
|
|
135
|
+
if (!CLI_OPTION_NAME_RE.test(optionName) || hasCliOption(command, optionName)) return command;
|
|
136
|
+
if (optionName === "profile") return insertCliOptionBeforeFirstOperandOrOption(command, optionName, value);
|
|
137
|
+
return `${command} --${optionName} ${value}`;
|
|
138
|
+
}
|
|
139
|
+
function insertCliOptionBeforeFirstOperandOrOption(command, optionName, value) {
|
|
140
|
+
if (optionName !== "profile") {
|
|
141
|
+
const match = FIRST_CLI_OPERAND_OR_OPTION_RE.exec(command);
|
|
142
|
+
if (!(match?.groups?.commandPath && match.groups.tail)) return `${command} --${optionName} ${value}`;
|
|
143
|
+
return `${match.groups.commandPath} --${optionName} ${value}${match.groups.tail}`;
|
|
144
|
+
}
|
|
145
|
+
const tokens = command.trim().split(WHITESPACE_SPLIT_RE);
|
|
146
|
+
const insertionIndex = resolveProfileOptionInsertionIndex(tokens);
|
|
147
|
+
if (insertionIndex === null) return command;
|
|
148
|
+
return [
|
|
149
|
+
...tokens.slice(0, insertionIndex),
|
|
150
|
+
`--${optionName}`,
|
|
151
|
+
value,
|
|
152
|
+
...tokens.slice(insertionIndex)
|
|
153
|
+
].join(" ");
|
|
154
|
+
}
|
|
155
|
+
function hasCliOption(command, optionName) {
|
|
156
|
+
return new RegExp(`(?:^|\\s)--${optionName}(?:=|\\s|$)`, "u").test(command);
|
|
157
|
+
}
|
|
158
|
+
function resolveProfileOptionInsertionIndex(tokens) {
|
|
159
|
+
if (tokens[0] !== OPENMELD_CLI_COMMAND) return null;
|
|
160
|
+
const topLevelCommand = tokens[1] ?? "";
|
|
161
|
+
if (PROFILE_AWARE_TOP_LEVEL_COMMANDS.has(topLevelCommand)) return 2;
|
|
162
|
+
if (topLevelCommand !== "space") return null;
|
|
163
|
+
let index = 2;
|
|
164
|
+
while (index < tokens.length) {
|
|
165
|
+
const token = tokens[index] ?? "";
|
|
166
|
+
if (SPACE_PARENT_OPTIONS_WITH_VALUE.has(token)) {
|
|
167
|
+
index += 2;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if ([...SPACE_PARENT_OPTIONS_WITH_VALUE].some((option) => token.startsWith(`${option}=`))) {
|
|
171
|
+
index += 1;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const spaceCommand = tokens[index] ?? "";
|
|
177
|
+
if (!PROFILE_AWARE_SPACE_COMMANDS.has(spaceCommand)) return null;
|
|
178
|
+
return index + 1;
|
|
179
|
+
}
|
|
180
|
+
function normalizePath(value) {
|
|
181
|
+
return normalizeText(value).replaceAll("\\", "/").toLowerCase();
|
|
182
|
+
}
|
|
183
|
+
function normalizeText(value) {
|
|
184
|
+
return String(value ?? "").trim();
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
//#region src/config/auth-url.ts
|
|
188
|
+
const DEFAULT_AUTH_BASE_URL = "https://auth.openmeld.ai";
|
|
189
|
+
const DEV_LOCAL_AUTH_BASE_URL = "http://localhost:8788";
|
|
190
|
+
function resolveAuthBaseUrl(cliValue, input = {}) {
|
|
191
|
+
const env = input.env ?? process.env;
|
|
192
|
+
const fromCli = String(cliValue ?? "").trim();
|
|
193
|
+
if (fromCli) return normalizeBaseUrl(fromCli);
|
|
194
|
+
const fromEnv = String(env.OPENMELD_AUTH_URL ?? "").trim();
|
|
195
|
+
if (fromEnv) return normalizeBaseUrl(fromEnv);
|
|
196
|
+
return normalizeBaseUrl(resolveDefaultAuthBaseUrl(env));
|
|
197
|
+
}
|
|
198
|
+
function resolveDefaultAuthBaseUrl(env) {
|
|
199
|
+
const preset = resolveOpenMeldEnvPreset({ env });
|
|
200
|
+
if (preset === "dev-local" || preset === "canary") return DEV_LOCAL_AUTH_BASE_URL;
|
|
201
|
+
return DEFAULT_AUTH_BASE_URL;
|
|
202
|
+
}
|
|
203
|
+
//#endregion
|
|
204
|
+
//#region src/config/openmeld-environment-target.ts
|
|
205
|
+
const OPENMELD_USER_FACING_CLI_COMMAND_ENV = "OPENMELD_USER_FACING_CLI_COMMAND";
|
|
206
|
+
async function resolveOpenMeldEnvironmentTarget(input = {}) {
|
|
207
|
+
const env = input.env ?? process$1.env;
|
|
208
|
+
const preset = resolveOpenMeldEnvPreset({ env });
|
|
209
|
+
return {
|
|
210
|
+
preset,
|
|
211
|
+
gatewayUrl: await resolveBaseUrl(input.gatewayUrl, { env }),
|
|
212
|
+
authBaseUrl: resolveAuthBaseUrl(input.authUrl, { env }),
|
|
213
|
+
userFacingCommand: resolveUserFacingCommandForPreset({
|
|
214
|
+
env,
|
|
215
|
+
preset
|
|
216
|
+
})
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function resolveOpenMeldEnvironmentTargetFromEnv(input = {}) {
|
|
220
|
+
const env = input.env ?? process$1.env;
|
|
221
|
+
const preset = resolveOpenMeldEnvPreset({ env });
|
|
222
|
+
return {
|
|
223
|
+
preset,
|
|
224
|
+
gatewayUrl: resolveGatewayUrlFromEnvOnly({
|
|
225
|
+
env,
|
|
226
|
+
gatewayUrl: input.gatewayUrl
|
|
227
|
+
}),
|
|
228
|
+
authBaseUrl: resolveAuthBaseUrl(input.authUrl, { env }),
|
|
229
|
+
userFacingCommand: resolveUserFacingCommandForPreset({
|
|
230
|
+
env,
|
|
231
|
+
preset
|
|
232
|
+
})
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function resolveUserFacingCommandForPreset(input) {
|
|
236
|
+
const explicitCommand = normalizeOptionalText(input.env[OPENMELD_USER_FACING_CLI_COMMAND_ENV]);
|
|
237
|
+
if (explicitCommand) return explicitCommand;
|
|
238
|
+
if (input.preset === "dev-local") return "openmeld-dev";
|
|
239
|
+
if (input.preset === "canary") return "openmeld-canary";
|
|
240
|
+
return resolveUserFacingCliEntryCommand({ env: input.env });
|
|
241
|
+
}
|
|
242
|
+
function resolveGatewayUrlFromEnvOnly(input) {
|
|
243
|
+
const fromInput = normalizeOptionalText(input.gatewayUrl);
|
|
244
|
+
if (fromInput) return normalizeGatewayBaseUrl(fromInput);
|
|
245
|
+
const fromEnv = normalizeOptionalText(input.env.OPENMELD_GATEWAY_URL);
|
|
246
|
+
if (fromEnv) return normalizeGatewayBaseUrl(fromEnv);
|
|
247
|
+
return normalizeGatewayBaseUrl(resolveDefaultGatewayBaseUrl({ env: input.env }));
|
|
248
|
+
}
|
|
249
|
+
function normalizeOptionalText(value) {
|
|
250
|
+
const normalized = String(value ?? "").trim();
|
|
251
|
+
return normalized.length > 0 ? normalized : null;
|
|
252
|
+
}
|
|
253
|
+
//#endregion
|
|
254
|
+
export { formatOpenMeldCliCommand as a, formatOpenMeldCliTextBlock as c, resolveSetupFollowUpCliEntryCommand as d, resolveUserFacingCliEntryCommand as f, formatInlineOpenMeldCliCommands as i, formatProfileAwareOpenMeldCliCommand as l, resolveOpenMeldEnvironmentTargetFromEnv as n, formatOpenMeldCliCommands as o, resolveAuthBaseUrl as r, formatOpenMeldCliLine as s, resolveOpenMeldEnvironmentTarget as t, formatProfileAwareOpenMeldCliCommands as u };
|
|
255
|
+
|
|
256
|
+
//# sourceMappingURL=openmeld-environment-target-NtJYJe1D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openmeld-environment-target-NtJYJe1D.js","names":["OPENMELD_USER_FACING_CLI_COMMAND_ENV","process","process"],"sources":["../src/runtime/cli-entry-command.ts","../src/config/auth-url.ts","../src/config/openmeld-environment-target.ts"],"sourcesContent":["import process from \"node:process\";\n\nconst OPENMELD_CLI_COMMAND = \"openmeld\";\nconst OPENMELD_CLI_NPX_COMMAND = \"npx -y openmeld@latest\";\nconst OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND_ENV =\n \"OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND\";\nconst OPENMELD_USER_FACING_CLI_COMMAND_ENV = \"OPENMELD_USER_FACING_CLI_COMMAND\";\nconst OPENMELD_TOP_LEVEL_COMMANDS = [\n \"adapter\",\n \"agents\",\n \"auth\",\n \"computer\",\n \"daemon\",\n \"doctor\",\n \"help\",\n \"login\",\n \"profile\",\n \"profiles\",\n \"prompt\",\n \"reset\",\n \"send\",\n \"service\",\n \"setup\",\n \"skills\",\n \"space\",\n \"start\",\n \"tail\",\n \"upgrade\",\n \"view\",\n \"whoami\",\n] as const;\nconst OPENMELD_COMMAND_PREFIX_RE = /^openmeld(?=$|\\s)/u;\nconst OPENMELD_COMMAND_LINE_RE =\n /^(?<prefix>\\s*(?:(?:[$*-])\\s+|\\d+\\)\\s+)??)(?<command>openmeld(?=$|\\s).*)$/u;\nconst OPENMELD_COMMAND_AFTER_PIPE_RE =\n /^(?<prefix>.*\\|\\s+)(?<command>openmeld(?=$|\\s).*)$/u;\nconst INLINE_OPENMELD_COMMAND_RE = /`(openmeld(?: [^`]*)?)`/gu;\nconst CLI_OPTION_NAME_RE = /^[a-z][a-z0-9-]*$/u;\nconst FIRST_CLI_OPERAND_OR_OPTION_RE =\n /^(?<commandPath>.*?)(?<tail>\\s+(?:--|<).*)$/u;\nconst INLINE_OPENMELD_TOP_LEVEL_MENTION_RE = new RegExp(\n `\\\\bats (?<command>${OPENMELD_TOP_LEVEL_COMMANDS.join(\"|\")})\\\\b`,\n \"gu\"\n);\nconst NEWLINE_SPLIT_RE = /\\r?\\n/u;\nconst WHITESPACE_SPLIT_RE = /\\s+/u;\nconst PROFILE_AWARE_TOP_LEVEL_COMMANDS = new Set([\"whoami\"]);\nconst PROFILE_AWARE_SPACE_COMMANDS = new Set([\n \"add-me\",\n \"add-agents\",\n \"add-human-profiles\",\n \"add-members\",\n \"contract\",\n \"create\",\n \"delete\",\n \"guide\",\n \"history\",\n \"join\",\n \"leave\",\n \"list\",\n \"password\",\n \"publication\",\n \"remove-members\",\n \"result\",\n \"send\",\n \"status\",\n \"updates\",\n \"watch\",\n]);\nconst SPACE_PARENT_OPTIONS_WITH_VALUE = new Set([\"--gateway-url\"]);\n\ntype CliEntryCommandInput = {\n env?: NodeJS.ProcessEnv;\n argv?: string[];\n};\n\ntype ProfileAwareCliCommandInput = CliEntryCommandInput & {\n profileId?: string | null;\n resolvedView?: \"human\" | \"agent\" | string;\n};\n\nexport function resolveUserFacingCliEntryCommand(\n input: CliEntryCommandInput = {}\n): string {\n const env = input.env ?? process.env;\n const explicitCommand = normalizeText(\n env[OPENMELD_USER_FACING_CLI_COMMAND_ENV]\n );\n if (explicitCommand.length > 0) {\n return explicitCommand;\n }\n return isNpxCliInvocation(input)\n ? OPENMELD_CLI_NPX_COMMAND\n : OPENMELD_CLI_COMMAND;\n}\n\nexport function resolveSetupFollowUpCliEntryCommand(\n input: CliEntryCommandInput = {}\n): string {\n const env = input.env ?? process.env;\n const setupCommand = normalizeText(\n env[OPENMELD_SETUP_FOLLOW_UP_CLI_COMMAND_ENV]\n );\n if (setupCommand.length > 0) {\n return setupCommand;\n }\n return resolveUserFacingCliEntryCommand(input);\n}\n\nexport function formatOpenMeldCliCommand(\n command: string,\n input: CliEntryCommandInput = {}\n): string {\n if (!OPENMELD_COMMAND_PREFIX_RE.test(command)) {\n return command;\n }\n return command.replace(\n OPENMELD_COMMAND_PREFIX_RE,\n resolveUserFacingCliEntryCommand(input)\n );\n}\n\nexport function formatOpenMeldCliCommands(\n commands: string[],\n input: CliEntryCommandInput = {}\n): string[] {\n return commands.map((command) => formatOpenMeldCliLine(command, input));\n}\n\nexport function formatProfileAwareOpenMeldCliCommand(\n command: string,\n input: ProfileAwareCliCommandInput = {}\n): string {\n return formatOpenMeldCliCommand(\n applyProfileAwareCommandScope(command, input),\n input\n );\n}\n\nexport function formatProfileAwareOpenMeldCliCommands(\n commands: string[],\n input: ProfileAwareCliCommandInput = {}\n): string[] {\n return commands.map((command) =>\n formatProfileAwareOpenMeldCliCommand(command, input)\n );\n}\n\nexport function formatInlineOpenMeldCliCommands(\n text: string,\n input: CliEntryCommandInput = {}\n): string {\n return text.replace(INLINE_OPENMELD_COMMAND_RE, (_, command: string) => {\n return `\\`${formatOpenMeldCliCommand(command, input)}\\``;\n });\n}\n\nexport function formatOpenMeldCliLine(\n text: string,\n input: CliEntryCommandInput = {}\n): string {\n const inlineFormatted = formatInlineOpenMeldCliCommands(text, input);\n const lineMatch = OPENMELD_COMMAND_LINE_RE.exec(inlineFormatted);\n if (lineMatch?.groups?.command) {\n return formatBareOpenMeldCliMentions(\n `${lineMatch.groups.prefix ?? \"\"}${formatOpenMeldCliCommand(\n lineMatch.groups.command,\n input\n )}`,\n input\n );\n }\n\n const pipeMatch = OPENMELD_COMMAND_AFTER_PIPE_RE.exec(inlineFormatted);\n if (pipeMatch?.groups?.command) {\n return formatBareOpenMeldCliMentions(\n `${pipeMatch.groups.prefix}${formatOpenMeldCliCommand(\n pipeMatch.groups.command,\n input\n )}`,\n input\n );\n }\n\n return formatBareOpenMeldCliMentions(inlineFormatted, input);\n}\n\nexport function formatOpenMeldCliTextBlock(\n text: string,\n input: CliEntryCommandInput = {}\n): string {\n return text\n .split(NEWLINE_SPLIT_RE)\n .map((line) => formatOpenMeldCliLine(line, input))\n .join(\"\\n\");\n}\n\nfunction isNpxCliInvocation(input: CliEntryCommandInput): boolean {\n const env = input.env ?? process.env;\n const argv = input.argv ?? process.argv;\n const npmCommand = normalizeText(env.npm_command).toLowerCase();\n const npmExecPath = normalizePath(env.npm_execpath);\n const npmUserAgent = normalizeText(env.npm_config_user_agent).toLowerCase();\n const usesNpmExec =\n npmCommand === \"exec\" &&\n npmExecTargetIsOpenMeldCli(env) &&\n (npmUserAgent.startsWith(\"npm/\") ||\n npmExecPath.includes(\"/npm/\") ||\n npmExecPath.endsWith(\"/npm-cli.js\"));\n if (usesNpmExec) {\n return true;\n }\n\n const scriptPath = normalizePath(argv[1]);\n return scriptPath.includes(\"/.npm/\") && scriptPath.includes(\"_npx\");\n}\n\nfunction npmExecTargetIsOpenMeldCli(env: NodeJS.ProcessEnv): boolean {\n // Every descendant of `npm exec` inherits npm_command=exec, so a openmeld\n // process spawned inside e.g. `npx vitest` carries the same env markers as\n // `npx openmeld`. npm records the resolved bin command it executed (quoted)\n // in npm_lifecycle_script; only that target proves openmeld itself was the\n // npx invocation.\n const execTarget = normalizeText(env.npm_lifecycle_script).replaceAll(\n '\"',\n \"\"\n );\n return execTarget === OPENMELD_CLI_COMMAND;\n}\n\nfunction formatBareOpenMeldCliMentions(\n text: string,\n input: CliEntryCommandInput = {}\n): string {\n return text.replace(\n INLINE_OPENMELD_TOP_LEVEL_MENTION_RE,\n (_, command: string) => {\n return formatOpenMeldCliCommand(`openmeld ${command}`, input);\n }\n );\n}\n\nfunction applyProfileAwareCommandScope(\n command: string,\n input: ProfileAwareCliCommandInput\n): string {\n if (!OPENMELD_COMMAND_PREFIX_RE.test(command)) {\n return command;\n }\n\n let scopedCommand = command.trimEnd();\n const profileId = normalizeText(input.profileId ?? undefined);\n if (profileId.length > 0) {\n scopedCommand = appendCliOption(scopedCommand, \"profile\", profileId);\n }\n if (input.resolvedView === \"agent\") {\n scopedCommand = appendCliOption(scopedCommand, \"view\", \"agent\");\n }\n return scopedCommand;\n}\n\nfunction appendCliOption(\n command: string,\n optionName: string,\n value: string\n): string {\n if (\n !CLI_OPTION_NAME_RE.test(optionName) ||\n hasCliOption(command, optionName)\n ) {\n return command;\n }\n if (optionName === \"profile\") {\n return insertCliOptionBeforeFirstOperandOrOption(\n command,\n optionName,\n value\n );\n }\n return `${command} --${optionName} ${value}`;\n}\n\nfunction insertCliOptionBeforeFirstOperandOrOption(\n command: string,\n optionName: string,\n value: string\n): string {\n if (optionName !== \"profile\") {\n const match = FIRST_CLI_OPERAND_OR_OPTION_RE.exec(command);\n if (!(match?.groups?.commandPath && match.groups.tail)) {\n return `${command} --${optionName} ${value}`;\n }\n return `${match.groups.commandPath} --${optionName} ${value}${match.groups.tail}`;\n }\n\n const tokens = command.trim().split(WHITESPACE_SPLIT_RE);\n const insertionIndex = resolveProfileOptionInsertionIndex(tokens);\n if (insertionIndex === null) {\n return command;\n }\n return [\n ...tokens.slice(0, insertionIndex),\n `--${optionName}`,\n value,\n ...tokens.slice(insertionIndex),\n ].join(\" \");\n}\n\nfunction hasCliOption(command: string, optionName: string): boolean {\n const optionPattern = new RegExp(`(?:^|\\\\s)--${optionName}(?:=|\\\\s|$)`, \"u\");\n return optionPattern.test(command);\n}\n\nfunction resolveProfileOptionInsertionIndex(tokens: string[]): number | null {\n if (tokens[0] !== OPENMELD_CLI_COMMAND) {\n return null;\n }\n const topLevelCommand = tokens[1] ?? \"\";\n if (PROFILE_AWARE_TOP_LEVEL_COMMANDS.has(topLevelCommand)) {\n return 2;\n }\n if (topLevelCommand !== \"space\") {\n return null;\n }\n\n let index = 2;\n while (index < tokens.length) {\n const token = tokens[index] ?? \"\";\n if (SPACE_PARENT_OPTIONS_WITH_VALUE.has(token)) {\n index += 2;\n continue;\n }\n if (\n [...SPACE_PARENT_OPTIONS_WITH_VALUE].some((option) =>\n token.startsWith(`${option}=`)\n )\n ) {\n index += 1;\n continue;\n }\n break;\n }\n\n const spaceCommand = tokens[index] ?? \"\";\n if (!PROFILE_AWARE_SPACE_COMMANDS.has(spaceCommand)) {\n return null;\n }\n return index + 1;\n}\n\nfunction normalizePath(value: string | undefined): string {\n return normalizeText(value).replaceAll(\"\\\\\", \"/\").toLowerCase();\n}\n\nfunction normalizeText(value: string | undefined): string {\n return String(value ?? \"\").trim();\n}\n","import { normalizeBaseUrl } from \"../protocol/urls\";\nimport { resolveOpenMeldEnvPreset } from \"./paths\";\n\nexport const DEFAULT_AUTH_BASE_URL = \"https://auth.openmeld.ai\";\nexport const DEV_LOCAL_AUTH_BASE_URL = \"http://localhost:8788\";\n\nexport function resolveAuthBaseUrl(\n cliValue?: string,\n input: { env?: NodeJS.ProcessEnv } = {}\n): string {\n const env = input.env ?? process.env;\n const fromCli = String(cliValue ?? \"\").trim();\n if (fromCli) {\n return normalizeBaseUrl(fromCli);\n }\n\n const fromEnv = String(env.OPENMELD_AUTH_URL ?? \"\").trim();\n if (fromEnv) {\n return normalizeBaseUrl(fromEnv);\n }\n\n return normalizeBaseUrl(resolveDefaultAuthBaseUrl(env));\n}\n\nfunction resolveDefaultAuthBaseUrl(env: NodeJS.ProcessEnv): string {\n const preset = resolveOpenMeldEnvPreset({ env });\n if (preset === \"dev-local\" || preset === \"canary\") {\n return DEV_LOCAL_AUTH_BASE_URL;\n }\n return DEFAULT_AUTH_BASE_URL;\n}\n","import process from \"node:process\";\nimport { resolveUserFacingCliEntryCommand } from \"../runtime/cli-entry-command\";\nimport { resolveAuthBaseUrl } from \"./auth-url\";\nimport {\n normalizeGatewayBaseUrl,\n resolveBaseUrl,\n resolveDefaultGatewayBaseUrl,\n} from \"./base-url\";\nimport type { OpenMeldEnvPreset } from \"./paths\";\nimport { resolveOpenMeldEnvPreset } from \"./paths\";\n\nconst OPENMELD_USER_FACING_CLI_COMMAND_ENV = \"OPENMELD_USER_FACING_CLI_COMMAND\";\n\nexport type OpenMeldEnvironmentTarget = {\n preset: OpenMeldEnvPreset;\n gatewayUrl: string;\n authBaseUrl: string;\n userFacingCommand: string;\n};\n\ntype OpenMeldEnvironmentTargetInput = {\n gatewayUrl?: string;\n authUrl?: string;\n env?: NodeJS.ProcessEnv;\n};\n\nexport async function resolveOpenMeldEnvironmentTarget(\n input: OpenMeldEnvironmentTargetInput = {}\n): Promise<OpenMeldEnvironmentTarget> {\n const env = input.env ?? process.env;\n const preset = resolveOpenMeldEnvPreset({ env });\n return {\n preset,\n gatewayUrl: await resolveBaseUrl(input.gatewayUrl, { env }),\n authBaseUrl: resolveAuthBaseUrl(input.authUrl, { env }),\n userFacingCommand: resolveUserFacingCommandForPreset({ env, preset }),\n };\n}\n\nexport function resolveOpenMeldEnvironmentTargetFromEnv(\n input: OpenMeldEnvironmentTargetInput = {}\n): OpenMeldEnvironmentTarget {\n const env = input.env ?? process.env;\n const preset = resolveOpenMeldEnvPreset({ env });\n return {\n preset,\n gatewayUrl: resolveGatewayUrlFromEnvOnly({\n env,\n gatewayUrl: input.gatewayUrl,\n }),\n authBaseUrl: resolveAuthBaseUrl(input.authUrl, { env }),\n userFacingCommand: resolveUserFacingCommandForPreset({ env, preset }),\n };\n}\n\nfunction resolveUserFacingCommandForPreset(input: {\n env: NodeJS.ProcessEnv;\n preset: OpenMeldEnvPreset;\n}): string {\n const explicitCommand = normalizeOptionalText(\n input.env[OPENMELD_USER_FACING_CLI_COMMAND_ENV]\n );\n if (explicitCommand) {\n return explicitCommand;\n }\n if (input.preset === \"dev-local\") {\n return \"openmeld-dev\";\n }\n if (input.preset === \"canary\") {\n return \"openmeld-canary\";\n }\n return resolveUserFacingCliEntryCommand({ env: input.env });\n}\n\nfunction resolveGatewayUrlFromEnvOnly(input: {\n env: NodeJS.ProcessEnv;\n gatewayUrl?: string;\n}): string {\n const fromInput = normalizeOptionalText(input.gatewayUrl);\n if (fromInput) {\n return normalizeGatewayBaseUrl(fromInput);\n }\n const fromEnv = normalizeOptionalText(input.env.OPENMELD_GATEWAY_URL);\n if (fromEnv) {\n return normalizeGatewayBaseUrl(fromEnv);\n }\n return normalizeGatewayBaseUrl(\n resolveDefaultGatewayBaseUrl({ env: input.env })\n );\n}\n\nfunction normalizeOptionalText(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n"],"mappings":"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"}
|
package/dist/{openmeld-maintenance-worker-Cxp6fwB5.js → openmeld-maintenance-worker-DjdmRASI.js}
RENAMED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { An as resolveSkillsAgentRegistry,
|
|
5
|
-
import {
|
|
6
|
-
import { g as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { a as isOpenMeldOrphanedLockError, d as runWithHeldLock, i as isOpenMeldLockError, t as acquireLock } from "./lock-Dxp6o_t_.js";
|
|
4
|
+
import { An as resolveSkillsAgentRegistry, b as prepareDaemonServiceUpdateWorkerCarrier, g as scheduleDaemonServiceUpdate, h as runPendingDaemonServiceUpdate, n as readOpenMeldToolsMaintenancePolicy, p as readPendingOpenMeldToolsUpdateAttempt, t as createOpenMeldToolsUpdateCoordinator } from "./openmeld-tools-update-coordinator-D9Skj8IE.js";
|
|
5
|
+
import { b as withSkillsInstallLock, f as ensureLocalSkills, h as downloadOfficialSkillUpdate, l as installSkillsToTargets, s as resolveTrackedInstallTargets } from "./installation-inventory-DJlwXa1q.js";
|
|
6
|
+
import { Bt as readDaemonServiceContract, g as assertDaemonMaintenanceInstallationOwnership, it as completePendingDaemonServiceUpdate, nt as OPENMELD_VERSION, st as readPendingDaemonServiceUpdate, yt as configureDaemonMaintenanceEnvironment } from "./daemon-service-runtime-DQW9gSLT.js";
|
|
7
|
+
import { g as getConfiguredSkillsConfig } from "./base-url-C6sHRNGu.js";
|
|
8
|
+
import { W as withDaemonServiceReconcileLock } from "./daemon-state-C37ZtIZK.js";
|
|
9
|
+
import { S as resolveDaemonServiceManager, v as readDaemonServiceStartupPolicyCurrent } from "./daemon-service-manager-GiMCiTmu.js";
|
|
9
10
|
//#region src/skills/maintenance.ts
|
|
10
11
|
async function maintainOfficialCliSkill() {
|
|
11
12
|
if (await downloadOfficialSkillUpdate().catch((error) => {
|
|
@@ -69,7 +70,7 @@ async function runMaintenancePass() {
|
|
|
69
70
|
}
|
|
70
71
|
const result = await runPendingDaemonServiceUpdate();
|
|
71
72
|
if (result?.phase === "updated") {
|
|
72
|
-
const { finishComputerSetupAfterBackgroundUpdate, recoverComputerSetupAfterBackgroundUpdate } = await import("./computer-setup-continuation-
|
|
73
|
+
const { finishComputerSetupAfterBackgroundUpdate, recoverComputerSetupAfterBackgroundUpdate } = await import("./computer-setup-continuation-DmKdhR5u.js");
|
|
73
74
|
await prepareDaemonServiceUpdateWorkerCarrier(result);
|
|
74
75
|
await finishComputerSetupAfterBackgroundUpdate();
|
|
75
76
|
await withDaemonServiceReconcileLock(async () => {
|
|
@@ -98,4 +99,4 @@ async function reconcileCurrentServiceStartupPolicy(updatesCurrent) {
|
|
|
98
99
|
//#endregion
|
|
99
100
|
export { runOpenMeldMaintenanceWorker };
|
|
100
101
|
|
|
101
|
-
//# sourceMappingURL=openmeld-maintenance-worker-
|
|
102
|
+
//# sourceMappingURL=openmeld-maintenance-worker-DjdmRASI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openmeld-maintenance-worker-
|
|
1
|
+
{"version":3,"file":"openmeld-maintenance-worker-DjdmRASI.js","names":[],"sources":["../src/skills/maintenance.ts","../src/local-service/maintenance/openmeld-maintenance-worker.ts"],"sourcesContent":["import { getConfiguredSkillsConfig } from \"../config/runtime-config\";\nimport { resolveSkillsAgentRegistry } from \"./agents\";\nimport { resolveTrackedInstallTargets } from \"./installation-inventory\";\nimport { installSkillsToTargets, withSkillsInstallLock } from \"./installer\";\nimport { downloadOfficialSkillUpdate } from \"./official-release\";\nimport { ensureLocalSkills } from \"./store\";\n\nexport async function maintainOfficialCliSkill(): Promise<void> {\n const outcome = await downloadOfficialSkillUpdate().catch(\n (error: unknown) => {\n process.stderr.write(\n `[openmeld] Skill download deferred: ${error instanceof Error ? error.message : String(error)}\\n`\n );\n return \"deferred\" as const;\n }\n );\n if (outcome === \"lane_isolated\") {\n return;\n }\n await withSkillsInstallLock(async () => {\n const localSkills = await ensureLocalSkills();\n const skillsConfig = await getConfiguredSkillsConfig();\n const targets = await resolveTrackedInstallTargets({\n skillsConfig,\n registry: resolveSkillsAgentRegistry(skillsConfig),\n localSkills,\n onlyOpenMeldInstalledTargets: false,\n });\n const results = await installSkillsToTargets({\n skills: localSkills,\n targets,\n });\n const failures = results.filter((result) => result.status === \"failed\");\n if (failures.length) {\n throw new Error(\n failures\n .map((result) => `${result.targetId}: ${result.reason}`)\n .join(\"; \")\n );\n }\n });\n}\n","import { readDaemonServiceContract } from \"../../config/daemon-service-contract\";\nimport { configureDaemonMaintenanceEnvironment } from \"../../config/daemon-service-update-worker-registration\";\nimport { withDaemonServiceReconcileLock } from \"../../config/daemon-state\";\nimport {\n acquireLock,\n isOpenMeldLockError,\n isOpenMeldOrphanedLockError,\n runWithHeldLock,\n} from \"../../config/lock\";\nimport { OPENMELD_VERSION } from \"../../runtime/version\";\nimport { maintainOfficialCliSkill } from \"../../skills/maintenance\";\nimport {\n readDaemonServiceStartupPolicyCurrent,\n resolveDaemonServiceManager,\n} from \"../lifecycle/daemon-service-manager\";\nimport { assertDaemonMaintenanceInstallationOwnership } from \"../lifecycle/daemon-service-manager-command-match\";\nimport {\n runPendingDaemonServiceUpdate,\n scheduleDaemonServiceUpdate,\n} from \"../lifecycle/daemon-service-update-coordinator\";\nimport {\n completePendingDaemonServiceUpdate,\n readPendingDaemonServiceUpdate,\n} from \"../lifecycle/daemon-service-update-state\";\nimport { prepareDaemonServiceUpdateWorkerCarrier } from \"../lifecycle/daemon-service-update-worker-manager\";\nimport { readOpenMeldToolsMaintenancePolicy } from \"./openmeld-tools-maintenance-policy\";\nimport { readPendingOpenMeldToolsUpdateAttempt } from \"./openmeld-tools-update-attempt-state\";\nimport { createOpenMeldToolsUpdateCoordinator } from \"./openmeld-tools-update-coordinator\";\n\n// The OS owns this process. It is also the sole executor of persisted download\n// attempts; Service requests only publish an attempt and wake this worker.\nexport async function runOpenMeldMaintenanceWorker(): Promise<void> {\n configureDaemonMaintenanceEnvironment(process.env);\n await runMaintenanceWithLock();\n}\n\nasync function runMaintenanceWithLock(): Promise<boolean> {\n try {\n const lock = await acquireLock({\n openMeldProfileId: \"__system__\",\n key: \"maintenance-worker\",\n });\n return await runWithHeldLock({\n lock,\n run: runMaintenancePass,\n releaseContext: { component: \"maintenance_worker\" },\n });\n } catch (error) {\n // Setup/repair may still own the lifecycle lock when the OS first runs us.\n // Leave its state intact; the existing OS trigger will run another pass.\n if (isOpenMeldLockError(error) && !isOpenMeldOrphanedLockError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function runMaintenancePass(): Promise<boolean> {\n const pendingJob = await readPendingDaemonServiceUpdate();\n const pendingAttempt = await readPendingOpenMeldToolsUpdateAttempt();\n if (!(pendingJob || pendingAttempt)) {\n const contract = await readDaemonServiceContract();\n if (!contract || contract.desiredState !== \"background\") {\n return false;\n }\n }\n await assertDaemonMaintenanceInstallationOwnership();\n if ((await readOpenMeldToolsMaintenancePolicy()).automaticUpdatesEnabled) {\n try {\n await maintainOfficialCliSkill();\n } catch (error) {\n process.stderr.write(\n `[openmeld] Skill maintenance deferred: ${error instanceof Error ? error.message : String(error)}\\n`\n );\n }\n }\n const coordinator = createOpenMeldToolsUpdateCoordinator();\n if (!pendingJob) {\n if (pendingAttempt) {\n await coordinator.resumePendingUpdate();\n } else {\n const update = await coordinator.requestUpdate({\n requestSource: \"automatic\",\n });\n await reconcileCurrentServiceStartupPolicy(update.status === \"current\");\n }\n await coordinator.waitForIdle();\n }\n const result = await runPendingDaemonServiceUpdate();\n if (result?.phase === \"updated\") {\n const {\n finishComputerSetupAfterBackgroundUpdate,\n recoverComputerSetupAfterBackgroundUpdate,\n } = await import(\"../../commands/computer-setup-continuation\");\n // Only a verified replacement may replace the working recovery carrier.\n await prepareDaemonServiceUpdateWorkerCarrier(result);\n await finishComputerSetupAfterBackgroundUpdate();\n await withDaemonServiceReconcileLock(async () => {\n const current = await readPendingDaemonServiceUpdate();\n if (\n current?.jobId === result.jobId &&\n current.phase === \"updated\" &&\n current.targetVersion === result.targetVersion\n ) {\n await completePendingDaemonServiceUpdate(current);\n }\n });\n await recoverComputerSetupAfterBackgroundUpdate();\n return true;\n }\n if (result?.phase === \"restored\" || result?.phase === \"needs_help\") {\n process.exitCode = 1;\n }\n return false;\n}\n\nasync function reconcileCurrentServiceStartupPolicy(\n updatesCurrent: boolean\n): Promise<void> {\n if (!updatesCurrent) {\n return;\n }\n const contract = await readDaemonServiceContract();\n // An older recovery worker must not apply its policy to a newer Service,\n // and maintenance must preserve an explicit user stop.\n if (\n contract?.desiredState !== \"background\" ||\n contract.daemonVersion !== OPENMELD_VERSION\n ) {\n return;\n }\n const manager = await resolveDaemonServiceManager();\n if (\n (await readDaemonServiceStartupPolicyCurrent({\n controller: manager?.controller ?? null,\n status: (await manager?.status()) ?? null,\n })) === false\n ) {\n await scheduleDaemonServiceUpdate({\n targetVersion: contract.daemonVersion,\n urgency: \"available\",\n });\n }\n}\n"],"mappings":"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"}
|