poe-code 2.0.3 → 2.0.4
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/README.md +17 -30
- package/dist/cli/command-runner.d.ts +1 -1
- package/dist/cli/commands/configure.d.ts +0 -2
- package/dist/cli/commands/configure.js +99 -34
- package/dist/cli/commands/configure.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.js +73 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +1 -0
- package/dist/cli/commands/remove.js +41 -28
- package/dist/cli/commands/remove.js.map +1 -1
- package/dist/cli/commands/shared.d.ts +9 -12
- package/dist/cli/commands/shared.js +26 -24
- package/dist/cli/commands/shared.js.map +1 -1
- package/dist/cli/commands/spawn.d.ts +1 -0
- package/dist/cli/commands/spawn.js +14 -5
- package/dist/cli/commands/spawn.js.map +1 -1
- package/dist/cli/commands/test.d.ts +4 -0
- package/dist/cli/commands/test.js +36 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/constants.d.ts +12 -9
- package/dist/cli/constants.js +15 -9
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/container.d.ts +3 -3
- package/dist/cli/context.d.ts +4 -13
- package/dist/cli/context.js +19 -149
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/error-logger.js +1 -1
- package/dist/cli/error-logger.js.map +1 -1
- package/dist/cli/errors.d.ts +0 -10
- package/dist/cli/errors.js +0 -12
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/logger.js +9 -11
- package/dist/cli/logger.js.map +1 -1
- package/dist/cli/options.d.ts +13 -4
- package/dist/cli/options.js +12 -11
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/program.js +5 -2
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/prompts.d.ts +14 -4
- package/dist/cli/prompts.js +12 -24
- package/dist/cli/prompts.js.map +1 -1
- package/dist/cli/service-registry.d.ts +37 -15
- package/dist/cli/service-registry.js.map +1 -1
- package/dist/cli/telemetry.d.ts +1 -1
- package/dist/cli/ui/service-menu.d.ts +2 -2
- package/dist/cli/ui/theme.js +6 -6
- package/dist/cli/ui/theme.js.map +1 -1
- package/dist/providers/claude-code.d.ts +10 -46
- package/dist/providers/claude-code.js +94 -224
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/codex.d.ts +14 -40
- package/dist/providers/codex.js +74 -177
- package/dist/providers/codex.js.map +1 -1
- package/dist/providers/create-provider.d.ts +26 -0
- package/dist/providers/create-provider.js +120 -0
- package/dist/providers/create-provider.js.map +1 -0
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +4 -10
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/opencode.d.ts +3 -43
- package/dist/providers/opencode.js +112 -173
- package/dist/providers/opencode.js.map +1 -1
- package/dist/providers/provider-helpers.d.ts +10 -0
- package/dist/providers/provider-helpers.js +62 -0
- package/dist/providers/provider-helpers.js.map +1 -0
- package/dist/providers/versioned-provider.d.ts +3 -0
- package/dist/providers/versioned-provider.js +9 -0
- package/dist/providers/versioned-provider.js.map +1 -0
- package/dist/services/credentials.d.ts +14 -0
- package/dist/services/credentials.js +123 -22
- package/dist/services/credentials.js.map +1 -1
- package/dist/services/model-strategy.d.ts +1 -1
- package/dist/services/model-strategy.js +20 -15
- package/dist/services/model-strategy.js.map +1 -1
- package/dist/services/mutation-events.d.ts +4 -0
- package/dist/services/mutation-events.js +56 -0
- package/dist/services/mutation-events.js.map +1 -0
- package/dist/services/service-install.d.ts +3 -4
- package/dist/services/service-install.js +30 -12
- package/dist/services/service-install.js.map +1 -1
- package/dist/services/service-manifest.d.ts +49 -21
- package/dist/services/service-manifest.js +261 -64
- package/dist/services/service-manifest.js.map +1 -1
- package/dist/tools/label-generator.d.ts +2 -2
- package/dist/tools/label-generator.js +1 -1
- package/dist/tools/label-generator.js.map +1 -1
- package/dist/utils/binary-version.d.ts +6 -0
- package/dist/utils/binary-version.js +35 -0
- package/dist/utils/binary-version.js.map +1 -0
- package/dist/utils/command-checks.d.ts +39 -0
- package/dist/utils/command-checks.js +116 -0
- package/dist/utils/command-checks.js.map +1 -0
- package/package.json +6 -8
- package/dist/providers/roo-code.d.ts +0 -41
- package/dist/providers/roo-code.js +0 -201
- package/dist/providers/roo-code.js.map +0 -1
- package/dist/utils/prerequisites.d.ts +0 -41
- package/dist/utils/prerequisites.js +0 -92
- package/dist/utils/prerequisites.js.map +0 -1
|
@@ -1,58 +1,150 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
export async function saveCredentials(options) {
|
|
3
3
|
const { fs, filePath, apiKey } = options;
|
|
4
|
-
await fs
|
|
5
|
-
|
|
6
|
-
await fs
|
|
4
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
5
|
+
document.apiKey = apiKey;
|
|
6
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
7
7
|
}
|
|
8
8
|
export async function loadCredentials(options) {
|
|
9
|
+
const { fs, filePath } = options;
|
|
10
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
11
|
+
return typeof document.apiKey === "string" && document.apiKey.length > 0
|
|
12
|
+
? document.apiKey
|
|
13
|
+
: null;
|
|
14
|
+
}
|
|
15
|
+
export async function deleteCredentials(options) {
|
|
9
16
|
const { fs, filePath } = options;
|
|
10
17
|
try {
|
|
11
|
-
|
|
12
|
-
return
|
|
18
|
+
await fs.unlink(filePath);
|
|
19
|
+
return true;
|
|
13
20
|
}
|
|
14
21
|
catch (error) {
|
|
15
22
|
if (isNotFound(error)) {
|
|
16
|
-
return
|
|
23
|
+
return false;
|
|
17
24
|
}
|
|
18
25
|
throw error;
|
|
19
26
|
}
|
|
20
27
|
}
|
|
21
|
-
export async function
|
|
28
|
+
export async function loadConfiguredServices(options) {
|
|
22
29
|
const { fs, filePath } = options;
|
|
30
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
31
|
+
return { ...(document.configured_services ?? {}) };
|
|
32
|
+
}
|
|
33
|
+
export async function saveConfiguredService(options) {
|
|
34
|
+
const { fs, filePath, service, metadata } = options;
|
|
35
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
36
|
+
const normalized = normalizeConfiguredServiceMetadata(metadata);
|
|
37
|
+
document.configured_services = {
|
|
38
|
+
...(document.configured_services ?? {}),
|
|
39
|
+
[service]: normalized
|
|
40
|
+
};
|
|
41
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
42
|
+
}
|
|
43
|
+
export async function removeConfiguredService(options) {
|
|
44
|
+
const { fs, filePath, service } = options;
|
|
45
|
+
const document = await readCredentialsDocument(fs, filePath);
|
|
46
|
+
const services = document.configured_services;
|
|
47
|
+
if (!services || !(service in services)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
delete services[service];
|
|
51
|
+
if (Object.keys(services).length === 0) {
|
|
52
|
+
delete document.configured_services;
|
|
53
|
+
}
|
|
54
|
+
await writeCredentialsDocument(fs, filePath, document);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
function normalizeConfiguredServiceMetadata(metadata) {
|
|
58
|
+
const version = typeof metadata.version === "string" && metadata.version.length > 0
|
|
59
|
+
? metadata.version
|
|
60
|
+
: null;
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const files = [];
|
|
63
|
+
for (const entry of metadata.files ?? []) {
|
|
64
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!seen.has(entry)) {
|
|
68
|
+
files.push(entry);
|
|
69
|
+
seen.add(entry);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
version,
|
|
74
|
+
files
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function readCredentialsDocument(fs, filePath) {
|
|
23
78
|
try {
|
|
24
|
-
await fs.
|
|
25
|
-
return
|
|
79
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
80
|
+
return await parseCredentialsDocument(fs, filePath, raw);
|
|
26
81
|
}
|
|
27
82
|
catch (error) {
|
|
28
83
|
if (isNotFound(error)) {
|
|
29
|
-
return
|
|
84
|
+
return {};
|
|
30
85
|
}
|
|
31
86
|
throw error;
|
|
32
87
|
}
|
|
33
88
|
}
|
|
34
|
-
function
|
|
35
|
-
return (typeof error === "object" &&
|
|
36
|
-
error !== null &&
|
|
37
|
-
"code" in error &&
|
|
38
|
-
error.code === "ENOENT");
|
|
39
|
-
}
|
|
40
|
-
async function parseCredentialsContent(fs, filePath, raw) {
|
|
89
|
+
async function parseCredentialsDocument(fs, filePath, raw) {
|
|
41
90
|
try {
|
|
42
91
|
const parsed = JSON.parse(raw);
|
|
43
|
-
|
|
44
|
-
return parsed.apiKey;
|
|
45
|
-
}
|
|
46
|
-
return null;
|
|
92
|
+
return normalizeCredentialsDocument(parsed);
|
|
47
93
|
}
|
|
48
94
|
catch (error) {
|
|
49
95
|
if (error instanceof SyntaxError) {
|
|
50
96
|
await recoverInvalidCredentials(fs, filePath, raw);
|
|
51
|
-
return
|
|
97
|
+
return {};
|
|
52
98
|
}
|
|
53
99
|
throw error;
|
|
54
100
|
}
|
|
55
101
|
}
|
|
102
|
+
function normalizeCredentialsDocument(value) {
|
|
103
|
+
if (!isRecord(value)) {
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
const document = {};
|
|
107
|
+
if (typeof value.apiKey === "string" && value.apiKey.length > 0) {
|
|
108
|
+
document.apiKey = value.apiKey;
|
|
109
|
+
}
|
|
110
|
+
const services = normalizeConfiguredServices(value.configured_services);
|
|
111
|
+
if (Object.keys(services).length > 0) {
|
|
112
|
+
document.configured_services = services;
|
|
113
|
+
}
|
|
114
|
+
return document;
|
|
115
|
+
}
|
|
116
|
+
function normalizeConfiguredServices(value) {
|
|
117
|
+
if (!isRecord(value)) {
|
|
118
|
+
return {};
|
|
119
|
+
}
|
|
120
|
+
const entries = {};
|
|
121
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
122
|
+
if (!isRecord(entry)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const normalized = normalizeConfiguredServiceMetadata({
|
|
126
|
+
version: typeof entry.version === "string" && entry.version.length > 0
|
|
127
|
+
? entry.version
|
|
128
|
+
: null,
|
|
129
|
+
files: Array.isArray(entry.files) ? entry.files : []
|
|
130
|
+
});
|
|
131
|
+
entries[key] = normalized;
|
|
132
|
+
}
|
|
133
|
+
return entries;
|
|
134
|
+
}
|
|
135
|
+
async function writeCredentialsDocument(fs, filePath, document) {
|
|
136
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
137
|
+
const payload = {};
|
|
138
|
+
if (document.apiKey) {
|
|
139
|
+
payload.apiKey = document.apiKey;
|
|
140
|
+
}
|
|
141
|
+
if (document.configured_services) {
|
|
142
|
+
payload.configured_services = document.configured_services;
|
|
143
|
+
}
|
|
144
|
+
await fs.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, {
|
|
145
|
+
encoding: "utf8"
|
|
146
|
+
});
|
|
147
|
+
}
|
|
56
148
|
async function recoverInvalidCredentials(fs, filePath, content) {
|
|
57
149
|
const backupPath = createInvalidBackupPath(filePath);
|
|
58
150
|
await fs.writeFile(backupPath, content, { encoding: "utf8" });
|
|
@@ -64,5 +156,14 @@ function createInvalidBackupPath(filePath) {
|
|
|
64
156
|
const base = path.basename(filePath);
|
|
65
157
|
return path.join(dir, `${base}.invalid-${timestamp}.json`);
|
|
66
158
|
}
|
|
159
|
+
function isRecord(value) {
|
|
160
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
161
|
+
}
|
|
162
|
+
function isNotFound(error) {
|
|
163
|
+
return (typeof error === "object" &&
|
|
164
|
+
error !== null &&
|
|
165
|
+
"code" in error &&
|
|
166
|
+
error.code === "ENOENT");
|
|
167
|
+
}
|
|
67
168
|
const EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\n`;
|
|
68
169
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ export interface ModelContext {
|
|
|
33
33
|
previousModel?: string;
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
* Mixed strategy: alternates between GPT-5.1 and Claude
|
|
36
|
+
* Mixed strategy: alternates between GPT-5.1 and the default Claude model
|
|
37
37
|
*/
|
|
38
38
|
export declare class MixedStrategy implements ModelStrategy {
|
|
39
39
|
private currentIndex;
|
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import * as os from "os";
|
|
4
|
+
import { DEFAULT_CLAUDE_CODE_MODEL, DEFAULT_CODEX_MODEL } from "../cli/constants.js";
|
|
5
|
+
const CLAUDE_DEFAULT_MODEL = DEFAULT_CLAUDE_CODE_MODEL;
|
|
4
6
|
/**
|
|
5
7
|
* Available model identifiers
|
|
6
8
|
*/
|
|
7
9
|
export const AVAILABLE_MODELS = [
|
|
8
|
-
|
|
10
|
+
CLAUDE_DEFAULT_MODEL,
|
|
9
11
|
"GPT-5.1",
|
|
10
12
|
"GPT-4o",
|
|
11
13
|
"Claude-3.5-Sonnet",
|
|
12
|
-
|
|
14
|
+
DEFAULT_CODEX_MODEL,
|
|
13
15
|
];
|
|
14
16
|
/**
|
|
15
|
-
* Mixed strategy: alternates between GPT-5.1 and Claude
|
|
17
|
+
* Mixed strategy: alternates between GPT-5.1 and the default Claude model
|
|
16
18
|
*/
|
|
17
19
|
export class MixedStrategy {
|
|
18
20
|
constructor() {
|
|
19
21
|
this.currentIndex = 0;
|
|
20
|
-
this.models = ["GPT-5.1",
|
|
22
|
+
this.models = ["GPT-5.1", CLAUDE_DEFAULT_MODEL];
|
|
21
23
|
}
|
|
22
24
|
getNextModel() {
|
|
23
25
|
const model = this.models[this.currentIndex];
|
|
@@ -28,7 +30,7 @@ export class MixedStrategy {
|
|
|
28
30
|
return "mixed";
|
|
29
31
|
}
|
|
30
32
|
getDescription() {
|
|
31
|
-
return
|
|
33
|
+
return `Alternates between GPT-5.1 and ${CLAUDE_DEFAULT_MODEL} on each call`;
|
|
32
34
|
}
|
|
33
35
|
reset() {
|
|
34
36
|
this.currentIndex = 0;
|
|
@@ -39,11 +41,11 @@ export class MixedStrategy {
|
|
|
39
41
|
*/
|
|
40
42
|
export class SmartStrategy {
|
|
41
43
|
constructor() {
|
|
42
|
-
this.lastModel =
|
|
44
|
+
this.lastModel = CLAUDE_DEFAULT_MODEL;
|
|
43
45
|
}
|
|
44
46
|
getNextModel(context) {
|
|
45
47
|
if (!context) {
|
|
46
|
-
return
|
|
48
|
+
return CLAUDE_DEFAULT_MODEL;
|
|
47
49
|
}
|
|
48
50
|
// Smart selection based on context
|
|
49
51
|
if (context.messageType === "code" || context.messageType === "reasoning") {
|
|
@@ -53,8 +55,8 @@ export class SmartStrategy {
|
|
|
53
55
|
return "GPT-5.1";
|
|
54
56
|
}
|
|
55
57
|
// Use Claude for medium complexity code
|
|
56
|
-
this.lastModel =
|
|
57
|
-
return
|
|
58
|
+
this.lastModel = CLAUDE_DEFAULT_MODEL;
|
|
59
|
+
return CLAUDE_DEFAULT_MODEL;
|
|
58
60
|
}
|
|
59
61
|
if (context.messageType === "chat") {
|
|
60
62
|
// Use GPT-4o for general chat
|
|
@@ -62,8 +64,8 @@ export class SmartStrategy {
|
|
|
62
64
|
return "GPT-4o";
|
|
63
65
|
}
|
|
64
66
|
// Default to Claude
|
|
65
|
-
this.lastModel =
|
|
66
|
-
return
|
|
67
|
+
this.lastModel = CLAUDE_DEFAULT_MODEL;
|
|
68
|
+
return CLAUDE_DEFAULT_MODEL;
|
|
67
69
|
}
|
|
68
70
|
getName() {
|
|
69
71
|
return "smart";
|
|
@@ -72,14 +74,14 @@ export class SmartStrategy {
|
|
|
72
74
|
return "Intelligently selects model based on task complexity and type";
|
|
73
75
|
}
|
|
74
76
|
reset() {
|
|
75
|
-
this.lastModel =
|
|
77
|
+
this.lastModel = CLAUDE_DEFAULT_MODEL;
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
80
|
/**
|
|
79
81
|
* Fixed strategy: always uses the same model
|
|
80
82
|
*/
|
|
81
83
|
export class FixedStrategy {
|
|
82
|
-
constructor(model =
|
|
84
|
+
constructor(model = CLAUDE_DEFAULT_MODEL) {
|
|
83
85
|
this.model = model;
|
|
84
86
|
}
|
|
85
87
|
getNextModel() {
|
|
@@ -141,7 +143,10 @@ export class ModelStrategyFactory {
|
|
|
141
143
|
}
|
|
142
144
|
static getAvailableStrategies() {
|
|
143
145
|
return [
|
|
144
|
-
{
|
|
146
|
+
{
|
|
147
|
+
type: "mixed",
|
|
148
|
+
description: `Alternate between GPT-5.1 and ${CLAUDE_DEFAULT_MODEL}`
|
|
149
|
+
},
|
|
145
150
|
{ type: "smart", description: "Intelligently select based on task type" },
|
|
146
151
|
{ type: "fixed", description: "Always use the same model" },
|
|
147
152
|
{ type: "round-robin", description: "Cycle through all available models" },
|
|
@@ -173,7 +178,7 @@ export class StrategyConfigManager {
|
|
|
173
178
|
static getDefaultConfig() {
|
|
174
179
|
return {
|
|
175
180
|
type: "fixed",
|
|
176
|
-
fixedModel:
|
|
181
|
+
fixedModel: CLAUDE_DEFAULT_MODEL,
|
|
177
182
|
};
|
|
178
183
|
}
|
|
179
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-strategy.js","sourceRoot":"","sources":["../../src/services/model-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"model-strategy.js","sourceRoot":"","sources":["../../src/services/model-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ScopedLogger } from "../cli/logger.js";
|
|
2
|
+
import type { ServiceMutationObservers } from "./service-manifest.js";
|
|
3
|
+
export declare function createMutationReporter(logger: ScopedLogger): ServiceMutationObservers;
|
|
4
|
+
export declare function combineMutationObservers(...observers: Array<ServiceMutationObservers | undefined>): ServiceMutationObservers | undefined;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function createMutationReporter(logger) {
|
|
2
|
+
return {
|
|
3
|
+
onStart(details) {
|
|
4
|
+
logger.verbose(`Starting mutation: ${details.label}`);
|
|
5
|
+
},
|
|
6
|
+
onComplete(details, outcome) {
|
|
7
|
+
logger.info(formatMutationMessage(details, outcome));
|
|
8
|
+
},
|
|
9
|
+
onError(details, error) {
|
|
10
|
+
logger.error(`${details.label} failed: ${describeError(error)}`);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function combineMutationObservers(...observers) {
|
|
15
|
+
const active = observers.filter((observer) => observer != null);
|
|
16
|
+
if (active.length === 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
onStart(details) {
|
|
21
|
+
for (const observer of active) {
|
|
22
|
+
observer.onStart?.(details);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
onComplete(details, outcome) {
|
|
26
|
+
for (const observer of active) {
|
|
27
|
+
observer.onComplete?.(details, outcome);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
onError(details, error) {
|
|
31
|
+
for (const observer of active) {
|
|
32
|
+
observer.onError?.(details, error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function formatMutationMessage(details, outcome) {
|
|
38
|
+
const status = describeOutcome(outcome);
|
|
39
|
+
return `${details.label}: ${status}`;
|
|
40
|
+
}
|
|
41
|
+
function describeOutcome(outcome) {
|
|
42
|
+
if (outcome.changed) {
|
|
43
|
+
return outcome.detail ?? outcome.effect;
|
|
44
|
+
}
|
|
45
|
+
if (outcome.detail && outcome.detail !== "noop") {
|
|
46
|
+
return outcome.detail;
|
|
47
|
+
}
|
|
48
|
+
return "no changes";
|
|
49
|
+
}
|
|
50
|
+
function describeError(error) {
|
|
51
|
+
if (error instanceof Error) {
|
|
52
|
+
return error.message;
|
|
53
|
+
}
|
|
54
|
+
return String(error ?? "Unknown error");
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mutation-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation-events.js","sourceRoot":"","sources":["../../src/services/mutation-events.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,sBAAsB,CACpC,MAAoB;IAEpB,OAAO;QACL,OAAO,CAAC,OAAO;YACb,MAAM,CAAC,OAAO,CAAC,sBAAsB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,UAAU,CAAC,OAAO,EAAE,OAAO;YACzB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,KAAK;YACpB,MAAM,CAAC,KAAK,CACV,GAAG,OAAO,CAAC,KAAK,YAAY,aAAa,CAAC,KAAK,CAAC,EAAE,CACnD,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,GAAG,SAAsD;IAEzD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAC7B,CAAC,QAAQ,EAAwC,EAAE,CAAC,QAAQ,IAAI,IAAI,CACrE,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,OAAO,CAAC,OAAO;YACb,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,UAAU,CAAC,OAAO,EAAE,OAAO;YACzB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,OAAO,EAAE,KAAK;YACpB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAA2B,EAC3B,OAA+B;IAE/B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,OAA+B;IACtD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CommandRunner,
|
|
1
|
+
import type { CommandRunner, CommandCheck } from "../utils/command-checks.js";
|
|
2
2
|
export interface InstallContext {
|
|
3
3
|
isDryRun: boolean;
|
|
4
4
|
runCommand: CommandRunner;
|
|
@@ -6,16 +6,15 @@ export interface InstallContext {
|
|
|
6
6
|
}
|
|
7
7
|
export interface InstallCommand {
|
|
8
8
|
id: string;
|
|
9
|
-
description: string;
|
|
10
9
|
command: string;
|
|
11
10
|
args: string[];
|
|
12
11
|
}
|
|
13
12
|
export interface ServiceInstallDefinition {
|
|
14
13
|
id: string;
|
|
15
14
|
summary: string;
|
|
16
|
-
check:
|
|
15
|
+
check: CommandCheck;
|
|
17
16
|
steps: InstallCommand[];
|
|
18
|
-
postChecks?:
|
|
17
|
+
postChecks?: CommandCheck[];
|
|
19
18
|
successMessage?: string;
|
|
20
19
|
}
|
|
21
20
|
export declare function runServiceInstall(definition: ServiceInstallDefinition, context: InstallContext): Promise<boolean>;
|
|
@@ -17,20 +17,11 @@ export async function runServiceInstall(definition, context) {
|
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
if (context.isDryRun) {
|
|
20
|
-
|
|
21
|
-
for (const step of definition.steps) {
|
|
22
|
-
context.logger(`Dry run: ${step.description} -> ${formatCommand(step.command, step.args)}`);
|
|
23
|
-
}
|
|
20
|
+
logInstallDryRun(definition, context);
|
|
24
21
|
return true;
|
|
25
22
|
}
|
|
26
23
|
for (const step of definition.steps) {
|
|
27
|
-
|
|
28
|
-
const result = await context.runCommand(step.command, step.args);
|
|
29
|
-
if (result.exitCode !== 0) {
|
|
30
|
-
const stderr = result.stderr.trim();
|
|
31
|
-
const suffix = stderr.length > 0 ? `: ${stderr}` : "";
|
|
32
|
-
throw new Error(`${step.description} failed with exit code ${result.exitCode}${suffix}`);
|
|
33
|
-
}
|
|
24
|
+
await runInstallStep(step, context);
|
|
34
25
|
}
|
|
35
26
|
await definition.check.run(checkContext);
|
|
36
27
|
if (definition.postChecks) {
|
|
@@ -41,7 +32,34 @@ export async function runServiceInstall(definition, context) {
|
|
|
41
32
|
context.logger(definition.successMessage ?? `${definition.summary} installed.`);
|
|
42
33
|
return true;
|
|
43
34
|
}
|
|
35
|
+
function describeInstallCommand(step) {
|
|
36
|
+
return `[${step.id}] ${formatCommand(step.command, step.args)}`;
|
|
37
|
+
}
|
|
44
38
|
function formatCommand(command, args) {
|
|
45
|
-
return [command, ...args].join(" ");
|
|
39
|
+
return [command, ...args.map(quoteIfNeeded)].join(" ");
|
|
40
|
+
}
|
|
41
|
+
function quoteIfNeeded(value) {
|
|
42
|
+
if (value.length === 0) {
|
|
43
|
+
return '""';
|
|
44
|
+
}
|
|
45
|
+
if (value.includes(" ") || value.includes("\t") || value.includes("\n")) {
|
|
46
|
+
return `"${value.replaceAll('"', '\\"')}"`;
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
function logInstallDryRun(definition, context) {
|
|
51
|
+
context.logger(`Dry run: would install ${definition.summary}.`);
|
|
52
|
+
for (const step of definition.steps) {
|
|
53
|
+
context.logger(`Dry run: ${describeInstallCommand(step)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function runInstallStep(step, context) {
|
|
57
|
+
context.logger(`Running ${describeInstallCommand(step)}`);
|
|
58
|
+
const result = await context.runCommand(step.command, step.args);
|
|
59
|
+
if (result.exitCode !== 0) {
|
|
60
|
+
const stderr = result.stderr.trim();
|
|
61
|
+
const suffix = stderr.length > 0 ? `: ${stderr}` : "";
|
|
62
|
+
throw new Error(`${describeInstallCommand(step)} failed with exit code ${result.exitCode}${suffix}`);
|
|
63
|
+
}
|
|
46
64
|
}
|
|
47
65
|
//# sourceMappingURL=service-install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-install.js","sourceRoot":"","sources":["../../src/services/service-install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-install.js","sourceRoot":"","sources":["../../src/services/service-install.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAoC,EACpC,OAAuB;IAEvB,MAAM,YAAY,GAAwB;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;IAEF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAChE,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEzC,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,MAAM,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,MAAM,CACZ,UAAU,CAAC,cAAc,IAAI,GAAG,UAAU,CAAC,OAAO,aAAa,CAChE,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAoB;IAClD,OAAO,IAAI,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,IAAc;IACpD,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAoC,EACpC,OAAuB;IAEvB,OAAO,CAAC,MAAM,CAAC,0BAA0B,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,YAAY,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAoB,EACpB,OAAuB;IAEvB,OAAO,CAAC,MAAM,CAAC,WAAW,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,GAAG,sBAAsB,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,QAAQ,GAAG,MAAM,EAAE,CACpF,CAAC;IACJ,CAAC;AACH,CAAC"}
|