@evref-bl/plexus-core 0.1.0-alpha.0

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 (73) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +164 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +15 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +62 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/imageRescue.d.ts +136 -0
  10. package/dist/imageRescue.d.ts.map +1 -0
  11. package/dist/imageRescue.js +686 -0
  12. package/dist/imageRescue.js.map +1 -0
  13. package/dist/index.d.ts +16 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +16 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/pathStyle.d.ts +10 -0
  18. package/dist/pathStyle.d.ts.map +1 -0
  19. package/dist/pathStyle.js +33 -0
  20. package/dist/pathStyle.js.map +1 -0
  21. package/dist/pharoLauncherMcpClient.d.ts +12 -0
  22. package/dist/pharoLauncherMcpClient.d.ts.map +1 -0
  23. package/dist/pharoLauncherMcpClient.js +74 -0
  24. package/dist/pharoLauncherMcpClient.js.map +1 -0
  25. package/dist/pharoMcpHealth.d.ts +22 -0
  26. package/dist/pharoMcpHealth.d.ts.map +1 -0
  27. package/dist/pharoMcpHealth.js +80 -0
  28. package/dist/pharoMcpHealth.js.map +1 -0
  29. package/dist/projectClose.d.ts +28 -0
  30. package/dist/projectClose.d.ts.map +1 -0
  31. package/dist/projectClose.js +93 -0
  32. package/dist/projectClose.js.map +1 -0
  33. package/dist/projectConfig.d.ts +44 -0
  34. package/dist/projectConfig.d.ts.map +1 -0
  35. package/dist/projectConfig.js +208 -0
  36. package/dist/projectConfig.js.map +1 -0
  37. package/dist/projectLifecycle.d.ts +115 -0
  38. package/dist/projectLifecycle.d.ts.map +1 -0
  39. package/dist/projectLifecycle.js +495 -0
  40. package/dist/projectLifecycle.js.map +1 -0
  41. package/dist/projectOpen.d.ts +49 -0
  42. package/dist/projectOpen.d.ts.map +1 -0
  43. package/dist/projectOpen.js +218 -0
  44. package/dist/projectOpen.js.map +1 -0
  45. package/dist/projectStartupScript.d.ts +56 -0
  46. package/dist/projectStartupScript.d.ts.map +1 -0
  47. package/dist/projectStartupScript.js +150 -0
  48. package/dist/projectStartupScript.js.map +1 -0
  49. package/dist/projectState.d.ts +128 -0
  50. package/dist/projectState.d.ts.map +1 -0
  51. package/dist/projectState.js +192 -0
  52. package/dist/projectState.js.map +1 -0
  53. package/dist/scopedPharoLauncherServer.d.ts +87 -0
  54. package/dist/scopedPharoLauncherServer.d.ts.map +1 -0
  55. package/dist/scopedPharoLauncherServer.js +186 -0
  56. package/dist/scopedPharoLauncherServer.js.map +1 -0
  57. package/dist/scopedProjectContext.d.ts +93 -0
  58. package/dist/scopedProjectContext.d.ts.map +1 -0
  59. package/dist/scopedProjectContext.js +181 -0
  60. package/dist/scopedProjectContext.js.map +1 -0
  61. package/dist/server.d.ts +42 -0
  62. package/dist/server.d.ts.map +1 -0
  63. package/dist/server.js +133 -0
  64. package/dist/server.js.map +1 -0
  65. package/dist/target.d.ts +19 -0
  66. package/dist/target.d.ts.map +1 -0
  67. package/dist/target.js +2 -0
  68. package/dist/target.js.map +1 -0
  69. package/dist/workspaceMcpConfig.d.ts +42 -0
  70. package/dist/workspaceMcpConfig.d.ts.map +1 -0
  71. package/dist/workspaceMcpConfig.js +79 -0
  72. package/dist/workspaceMcpConfig.js.map +1 -0
  73. package/package.json +37 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ import { closeProject, ProjectCloseError } from "./projectClose.js";
3
+ import { PlexusProjectLifecycle } from "./projectLifecycle.js";
4
+ import { openProject, ProjectOpenError } from "./projectOpen.js";
5
+ import { startScopedPharoLauncherServer } from "./scopedPharoLauncherServer.js";
6
+ import { startProjectLifecycleServer } from "./server.js";
7
+ function usage() {
8
+ return [
9
+ "Usage:",
10
+ " plexus project open <path> [--workspace-id <id>] [--target-id <id>] [--state-root <path>]",
11
+ " plexus project close <path> [--workspace-id <id>] [--state-root <path>]",
12
+ " plexus project status <path> [--workspace-id <id>] [--state-root <path>]",
13
+ " plexus mcp project",
14
+ " plexus mcp pharo-launcher [--project-path <path>] [--workspace-id <id>] [--target-id <id>] [--state-root <path>]",
15
+ "",
16
+ "Environment:",
17
+ " PLEXUS_STATE_ROOT Optional runtime state root.",
18
+ " PLEXUS_WORKSPACE_ID Optional runtime workspace id.",
19
+ " VIBE_KANBAN_WORKSPACE_ID Optional runtime workspace id.",
20
+ " PLEXUS_TARGET_ID Optional runtime target id.",
21
+ ].join("\n");
22
+ }
23
+ function parseCommand(argv) {
24
+ const [scope, command] = argv;
25
+ const projectCommandHasPath = scope === "project";
26
+ const projectPath = projectCommandHasPath ? argv[2] : undefined;
27
+ const rest = projectCommandHasPath ? argv.slice(3) : argv.slice(2);
28
+ const parsed = { scope, command, projectPath };
29
+ for (let index = 0; index < rest.length; index += 1) {
30
+ const arg = rest[index];
31
+ const value = rest[index + 1];
32
+ if (!value) {
33
+ throw new Error(`${arg} requires a value`);
34
+ }
35
+ switch (arg) {
36
+ case "--project-path":
37
+ case "--state-root":
38
+ if (arg === "--project-path") {
39
+ parsed.projectPath = value;
40
+ }
41
+ else {
42
+ parsed.stateRoot = value;
43
+ }
44
+ break;
45
+ case "--workspace-id":
46
+ parsed.workspaceId = value;
47
+ break;
48
+ case "--target-id":
49
+ parsed.targetId = value;
50
+ break;
51
+ default:
52
+ throw new Error(`Unknown option: ${arg}`);
53
+ }
54
+ index += 1;
55
+ }
56
+ return parsed;
57
+ }
58
+ async function main(argv) {
59
+ if (argv.includes("--help") || argv.includes("-h")) {
60
+ console.log(usage());
61
+ return 0;
62
+ }
63
+ const parsed = parseCommand(argv);
64
+ const workspaceId = parsed.workspaceId ??
65
+ process.env.PLEXUS_WORKSPACE_ID ??
66
+ process.env.VIBE_KANBAN_WORKSPACE_ID;
67
+ const stateRoot = parsed.stateRoot ?? process.env.PLEXUS_STATE_ROOT;
68
+ if (parsed.scope === "mcp" && parsed.command === "pharo-launcher") {
69
+ const projectPath = parsed.projectPath ?? process.env.PLEXUS_PROJECT_ROOT;
70
+ if (!projectPath) {
71
+ console.error("plexus mcp pharo-launcher requires --project-path or PLEXUS_PROJECT_ROOT");
72
+ return 2;
73
+ }
74
+ await startScopedPharoLauncherServer({
75
+ projectRoot: projectPath,
76
+ stateRoot,
77
+ workspaceId,
78
+ targetId: parsed.targetId ?? process.env.PLEXUS_TARGET_ID,
79
+ });
80
+ return 0;
81
+ }
82
+ if (parsed.scope === "mcp" && parsed.command === "project") {
83
+ await startProjectLifecycleServer();
84
+ return 0;
85
+ }
86
+ if (parsed.scope !== "project" ||
87
+ (parsed.command !== "open" &&
88
+ parsed.command !== "close" &&
89
+ parsed.command !== "status") ||
90
+ !parsed.projectPath) {
91
+ console.error(usage());
92
+ return 2;
93
+ }
94
+ try {
95
+ if (parsed.command === "open") {
96
+ const result = await openProject({
97
+ projectRoot: parsed.projectPath,
98
+ stateRoot,
99
+ workspaceId,
100
+ targetId: parsed.targetId ?? process.env.PLEXUS_TARGET_ID,
101
+ });
102
+ console.log(JSON.stringify({
103
+ ok: result.ok,
104
+ statePath: result.statePath,
105
+ images: result.state.images,
106
+ }, null, 2));
107
+ return 0;
108
+ }
109
+ if (parsed.command === "status") {
110
+ const lifecycle = new PlexusProjectLifecycle();
111
+ const status = await lifecycle.status({
112
+ projectPath: parsed.projectPath,
113
+ stateRoot,
114
+ workspaceId,
115
+ });
116
+ console.log(JSON.stringify(status, null, 2));
117
+ return status.ok ? 0 : 1;
118
+ }
119
+ const result = await closeProject({
120
+ projectRoot: parsed.projectPath,
121
+ stateRoot,
122
+ workspaceId,
123
+ });
124
+ console.log(JSON.stringify({
125
+ ok: result.ok,
126
+ statePath: result.statePath,
127
+ images: result.state?.images ?? [],
128
+ stoppedImages: result.stoppedImages,
129
+ }, null, 2));
130
+ return 0;
131
+ }
132
+ catch (error) {
133
+ if (error instanceof ProjectOpenError) {
134
+ console.error(JSON.stringify({
135
+ ok: false,
136
+ statePath: error.result.statePath,
137
+ failures: error.result.failures,
138
+ images: error.result.state.images,
139
+ }, null, 2));
140
+ return 1;
141
+ }
142
+ if (error instanceof ProjectCloseError) {
143
+ console.error(JSON.stringify({
144
+ ok: false,
145
+ statePath: error.result.statePath,
146
+ failures: error.result.failures,
147
+ images: error.result.state?.images ?? [],
148
+ stoppedImages: error.result.stoppedImages,
149
+ }, null, 2));
150
+ return 1;
151
+ }
152
+ console.error(error instanceof Error ? error.message : String(error));
153
+ return 1;
154
+ }
155
+ }
156
+ main(process.argv.slice(2))
157
+ .then((exitCode) => {
158
+ process.exitCode = exitCode;
159
+ })
160
+ .catch((error) => {
161
+ console.error(error instanceof Error ? error.message : String(error));
162
+ process.exitCode = 1;
163
+ });
164
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface PharoLauncherMcpConfig {
2
+ source: "env" | "package" | "command";
3
+ command: string;
4
+ args: string[];
5
+ entry?: string;
6
+ packageDir?: string;
7
+ repoDir?: string;
8
+ }
9
+ export interface LoadPharoLauncherMcpConfigOptions {
10
+ resolveInstalledEntry?: () => string | undefined;
11
+ }
12
+ export declare const pharoLauncherMcpPackageName: "@evref-bl/pharo-launcher-mcp";
13
+ export declare const pharoLauncherMcpCommandName: "pharo-launcher-mcp";
14
+ export declare function loadPharoLauncherMcpConfig(env?: NodeJS.ProcessEnv, options?: LoadPharoLauncherMcpConfigOptions): PharoLauncherMcpConfig;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,qBAAqB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAClD;AAID,eAAO,MAAM,2BAA2B,EACtC,8BAAuC,CAAC;AAC1C,eAAO,MAAM,2BAA2B,EAAG,oBAA6B,CAAC;AAqCzE,wBAAgB,0BAA0B,CACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,OAAO,GAAE,iCAAsC,GAC9C,sBAAsB,CAmCxB"}
package/dist/config.js ADDED
@@ -0,0 +1,62 @@
1
+ import { createRequire } from "node:module";
2
+ import { dirnamePathLike, joinPathLike } from "./pathStyle.js";
3
+ const require = createRequire(import.meta.url);
4
+ export const pharoLauncherMcpPackageName = "@evref-bl/pharo-launcher-mcp";
5
+ export const pharoLauncherMcpCommandName = "pharo-launcher-mcp";
6
+ function packageDirFromEntry(entry) {
7
+ return dirnamePathLike(dirnamePathLike(entry));
8
+ }
9
+ function resolveInstalledPharoLauncherMcpEntry() {
10
+ try {
11
+ return require.resolve(pharoLauncherMcpPackageName);
12
+ }
13
+ catch {
14
+ return undefined;
15
+ }
16
+ }
17
+ function hasExplicitPharoLauncherMcpEnv(env) {
18
+ return Boolean(env.PHARO_LAUNCHER_MCP_COMMAND ??
19
+ env.PHARO_LAUNCHER_MCP_ARGS ??
20
+ env.PHARO_LAUNCHER_MCP_ENTRY ??
21
+ env.PHARO_LAUNCHER_MCP_REPO_DIR);
22
+ }
23
+ function parsePharoLauncherMcpArgs(value) {
24
+ if (value === undefined) {
25
+ return undefined;
26
+ }
27
+ return value.split(" ").filter(Boolean);
28
+ }
29
+ function defaultPharoLauncherMcpEntryForRepo(repoDir) {
30
+ return joinPathLike(repoDir, "dist", "index.js");
31
+ }
32
+ export function loadPharoLauncherMcpConfig(env = process.env, options = {}) {
33
+ if (!hasExplicitPharoLauncherMcpEnv(env)) {
34
+ const installedEntry = (options.resolveInstalledEntry ?? resolveInstalledPharoLauncherMcpEntry)();
35
+ if (installedEntry) {
36
+ return {
37
+ source: "package",
38
+ command: process.execPath,
39
+ args: [installedEntry],
40
+ entry: installedEntry,
41
+ packageDir: packageDirFromEntry(installedEntry),
42
+ };
43
+ }
44
+ return {
45
+ source: "command",
46
+ command: pharoLauncherMcpCommandName,
47
+ args: [],
48
+ };
49
+ }
50
+ const explicitArgs = parsePharoLauncherMcpArgs(env.PHARO_LAUNCHER_MCP_ARGS);
51
+ const repoDir = env.PHARO_LAUNCHER_MCP_REPO_DIR;
52
+ const entry = env.PHARO_LAUNCHER_MCP_ENTRY ??
53
+ (repoDir ? defaultPharoLauncherMcpEntryForRepo(repoDir) : undefined);
54
+ return {
55
+ source: "env",
56
+ ...(repoDir ? { repoDir } : {}),
57
+ ...(entry ? { entry } : {}),
58
+ command: env.PHARO_LAUNCHER_MCP_COMMAND ?? process.execPath,
59
+ args: explicitArgs ?? (entry ? [entry] : []),
60
+ };
61
+ }
62
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAe/D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,2BAA2B,GACtC,8BAAuC,CAAC;AAC1C,MAAM,CAAC,MAAM,2BAA2B,GAAG,oBAA6B,CAAC;AAEzE,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,qCAAqC;IAC5C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,GAAsB;IAC5D,OAAO,OAAO,CACZ,GAAG,CAAC,0BAA0B;QAC5B,GAAG,CAAC,uBAAuB;QAC3B,GAAG,CAAC,wBAAwB;QAC5B,GAAG,CAAC,2BAA2B,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,KAAyB;IAEzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,mCAAmC,CAAC,OAAe;IAC1D,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAyB,OAAO,CAAC,GAAG,EACpC,UAA6C,EAAE;IAE/C,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,cAAc,GAAG,CACrB,OAAO,CAAC,qBAAqB,IAAI,qCAAqC,CACvE,EAAE,CAAC;QACJ,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,IAAI,EAAE,CAAC,cAAc,CAAC;gBACtB,KAAK,EAAE,cAAc;gBACrB,UAAU,EAAE,mBAAmB,CAAC,cAAc,CAAC;aAChD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,2BAA2B;YACpC,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC;IAChD,MAAM,KAAK,GACT,GAAG,CAAC,wBAAwB;QAC5B,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO;QACL,MAAM,EAAE,KAAK;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC,0BAA0B,IAAI,OAAO,CAAC,QAAQ;QAC3D,IAAI,EAAE,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { type PharoLauncherMcpToolClient } from "./pharoLauncherMcpClient.js";
2
+ import { type PharoMcpHealthClient } from "./pharoMcpHealth.js";
3
+ import { type ProjectImageState, type ProjectPortRange, type ProjectState } from "./projectState.js";
4
+ export type ImageRescueOperation = "snapshotSource" | "plan" | "prepareTarget" | "applyPlan";
5
+ export type ImageRescueFailureClass = "apply-time-breaker" | "runtime-breaker" | "unclassified";
6
+ export interface ImageRescueEntrySelection {
7
+ indexes?: number[];
8
+ entryReferences?: string[];
9
+ startIndex?: number;
10
+ endIndex?: number;
11
+ latestCount?: number;
12
+ }
13
+ export interface ImageRescueRepositoryAction {
14
+ label?: string;
15
+ toolName?: "load_repository" | "edit_repository";
16
+ arguments: Record<string, unknown>;
17
+ }
18
+ export interface ImageRescuePollOptions {
19
+ intervalMs?: number;
20
+ processTimeoutMs?: number;
21
+ healthTimeoutMs?: number;
22
+ }
23
+ export interface ImageRescueOptions {
24
+ operation: ImageRescueOperation;
25
+ projectRoot: string;
26
+ sourceImageId: string;
27
+ stateRoot?: string;
28
+ workspaceId?: string;
29
+ targetImageId?: string;
30
+ targetImageName?: string;
31
+ targetTemplateName?: string;
32
+ targetTemplateCategory?: string;
33
+ targetMcpPort?: number;
34
+ sourceHistoryDirectoryPath?: string;
35
+ historyFilePath?: string;
36
+ selection?: ImageRescueEntrySelection;
37
+ exclude?: ImageRescueEntrySelection;
38
+ codeChangesOnly?: boolean;
39
+ includeEntryCounts?: boolean;
40
+ loadRepositories?: boolean;
41
+ repositoryActions?: ImageRescueRepositoryAction[];
42
+ confirm?: boolean;
43
+ pharoLauncherMcpClient?: PharoLauncherMcpToolClient;
44
+ imageMcpClient?: ImageRescueMcpClient;
45
+ healthClient?: PharoMcpHealthClient;
46
+ portRange?: ProjectPortRange;
47
+ now?: () => Date;
48
+ poll?: ImageRescuePollOptions;
49
+ sleep?: (durationMs: number) => Promise<void>;
50
+ }
51
+ export interface ImageRescueMcpClient {
52
+ callTool(image: ProjectImageState, toolName: string, argumentsValue: Record<string, unknown>): Promise<unknown>;
53
+ }
54
+ export interface LauncherPathStatus {
55
+ path: string;
56
+ exists: boolean;
57
+ }
58
+ export interface LauncherConfigReport {
59
+ launcherDir?: LauncherPathStatus;
60
+ profile?: {
61
+ imagesDir?: LauncherPathStatus;
62
+ };
63
+ }
64
+ export interface LauncherImageInfo {
65
+ name?: string;
66
+ pharoVersion?: string;
67
+ imagePath?: string;
68
+ originTemplate?: {
69
+ name?: string;
70
+ url?: string;
71
+ };
72
+ vmId?: string;
73
+ }
74
+ export interface ResolvedImagePaths {
75
+ imagePath?: string;
76
+ imageDirectoryPath?: string;
77
+ changesPath?: string;
78
+ localDirectoryPath?: string;
79
+ ombuDirectoryPath?: string;
80
+ }
81
+ export interface ImageRescueRepositorySnapshot {
82
+ capturedAt: string;
83
+ status: "captured" | "unavailable";
84
+ repositories: Record<string, unknown>[];
85
+ error?: string;
86
+ }
87
+ export interface ImageRescueSourceSnapshot {
88
+ capturedAt: string;
89
+ launcherImage?: LauncherImageInfo;
90
+ paths: ResolvedImagePaths;
91
+ repositories?: ImageRescueRepositorySnapshot;
92
+ }
93
+ export interface ImageRescueHistoryFile {
94
+ path: string;
95
+ mtimeMs?: number;
96
+ size?: number;
97
+ }
98
+ export interface ImageRescueRepositoryResult {
99
+ label: string;
100
+ toolName: string;
101
+ arguments: Record<string, unknown>;
102
+ status: "planned" | "applied" | "skipped" | "failed";
103
+ result?: unknown;
104
+ error?: string;
105
+ }
106
+ export interface ImageRescueChangeResult {
107
+ historyFilePath: string;
108
+ arguments: Record<string, unknown>;
109
+ status: "planned" | "applied" | "failed";
110
+ result?: unknown;
111
+ error?: string;
112
+ failureClass?: ImageRescueFailureClass;
113
+ }
114
+ export interface ImageRescueResult {
115
+ ok: boolean;
116
+ operation: ImageRescueOperation;
117
+ projectRoot: string;
118
+ statePath: string;
119
+ state?: ProjectState;
120
+ sourceImage: ProjectImageState;
121
+ targetImage?: ProjectImageState;
122
+ sourceSnapshot: ImageRescueSourceSnapshot;
123
+ historyDirectoryPath?: string;
124
+ historyFiles?: ImageRescueHistoryFile[];
125
+ historyListing?: unknown;
126
+ selectedHistoryFilePath?: string;
127
+ repositoryResults?: ImageRescueRepositoryResult[];
128
+ changeResult?: ImageRescueChangeResult;
129
+ warnings: string[];
130
+ }
131
+ export declare class ImageRescueError extends Error {
132
+ readonly result?: ImageRescueResult | undefined;
133
+ constructor(message: string, result?: ImageRescueResult | undefined);
134
+ }
135
+ export declare function rescueImage(options: ImageRescueOptions): Promise<ImageRescueResult>;
136
+ //# sourceMappingURL=imageRescue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageRescue.d.ts","sourceRoot":"","sources":["../src/imageRescue.ts"],"names":[],"mappings":"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"}