joonecli 0.2.3 → 0.2.5

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 (58) hide show
  1. package/README.md +20 -2
  2. package/dist/cli/index.js +12 -62
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/desktop/cliEntry.d.ts +1 -0
  5. package/dist/desktop/cliEntry.js +18 -0
  6. package/dist/desktop/cliEntry.js.map +1 -0
  7. package/dist/desktop/devServer.d.ts +1 -0
  8. package/dist/desktop/devServer.js +12 -0
  9. package/dist/desktop/devServer.js.map +1 -0
  10. package/dist/desktop/ipc.d.ts +14 -0
  11. package/dist/desktop/ipc.js +46 -0
  12. package/dist/desktop/ipc.js.map +1 -0
  13. package/dist/desktop/npmCli.d.ts +1 -0
  14. package/dist/desktop/npmCli.js +18 -0
  15. package/dist/desktop/npmCli.js.map +1 -0
  16. package/dist/desktop/providerCatalog.d.ts +11 -0
  17. package/dist/desktop/providerCatalog.js +64 -0
  18. package/dist/desktop/providerCatalog.js.map +1 -0
  19. package/dist/desktop/pruneReleaseAssets.d.ts +10 -0
  20. package/dist/desktop/pruneReleaseAssets.js +48 -0
  21. package/dist/desktop/pruneReleaseAssets.js.map +1 -0
  22. package/dist/desktop/publishReleaseAssets.d.ts +12 -0
  23. package/dist/desktop/publishReleaseAssets.js +49 -0
  24. package/dist/desktop/publishReleaseAssets.js.map +1 -0
  25. package/dist/desktop/releaseMetadata.d.ts +12 -0
  26. package/dist/desktop/releaseMetadata.js +54 -0
  27. package/dist/desktop/releaseMetadata.js.map +1 -0
  28. package/dist/desktop/server.d.ts +22 -0
  29. package/dist/desktop/server.js +100 -0
  30. package/dist/desktop/server.js.map +1 -0
  31. package/dist/desktop/smokeTestBundles.d.ts +10 -0
  32. package/dist/desktop/smokeTestBundles.js +108 -0
  33. package/dist/desktop/smokeTestBundles.js.map +1 -0
  34. package/dist/desktop/validateBundles.d.ts +8 -0
  35. package/dist/desktop/validateBundles.js +52 -0
  36. package/dist/desktop/validateBundles.js.map +1 -0
  37. package/dist/desktop/webDev.d.ts +1 -0
  38. package/dist/desktop/webDev.js +32 -0
  39. package/dist/desktop/webDev.js.map +1 -0
  40. package/dist/runtime/service.d.ts +44 -0
  41. package/dist/runtime/service.js +416 -0
  42. package/dist/runtime/service.js.map +1 -0
  43. package/dist/runtime/types.d.ts +110 -0
  44. package/dist/runtime/types.js +2 -0
  45. package/dist/runtime/types.js.map +1 -0
  46. package/dist/ui/App.d.ts +4 -2
  47. package/dist/ui/App.js +178 -33
  48. package/dist/ui/App.js.map +1 -1
  49. package/dist/ui/components/HITLPrompt.d.ts +1 -0
  50. package/dist/ui/components/HITLPrompt.js +3 -3
  51. package/dist/ui/components/HITLPrompt.js.map +1 -1
  52. package/dist/ui/components/ToolCallPanel.d.ts +0 -5
  53. package/dist/ui/components/ToolCallPanel.js +33 -11
  54. package/dist/ui/components/ToolCallPanel.js.map +1 -1
  55. package/dist/ui/components/WorkflowTodoPanel.d.ts +13 -0
  56. package/dist/ui/components/WorkflowTodoPanel.js +35 -0
  57. package/dist/ui/components/WorkflowTodoPanel.js.map +1 -0
  58. package/package.json +12 -1
@@ -0,0 +1,12 @@
1
+ export interface DesktopReleaseMetadata {
2
+ productName: string;
3
+ version: string;
4
+ slug: string;
5
+ releaseTag: string;
6
+ releaseName: string;
7
+ releaseBody: string;
8
+ assetNamePrefix: string;
9
+ assetNamePattern: string;
10
+ workflowArtifactPrefix: string;
11
+ }
12
+ export declare const loadDesktopReleaseMetadata: (rootDir?: string) => DesktopReleaseMetadata;
@@ -0,0 +1,54 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { isDirectDesktopScriptExecution } from "./cliEntry.js";
4
+ const slugify = (value) => value
5
+ .trim()
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, "-")
8
+ .replace(/^-+|-+$/g, "");
9
+ const loadTauriDesktopConfig = (rootDir) => {
10
+ const configPath = path.join(rootDir, "src-tauri", "tauri.conf.json");
11
+ const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
12
+ if (!config.productName || !config.version) {
13
+ throw new Error(`Desktop Tauri config at ${configPath} must define productName and version.`);
14
+ }
15
+ return {
16
+ productName: config.productName,
17
+ version: config.version,
18
+ };
19
+ };
20
+ export const loadDesktopReleaseMetadata = (rootDir = process.cwd()) => {
21
+ const { productName, version } = loadTauriDesktopConfig(rootDir);
22
+ const slug = slugify(productName);
23
+ return {
24
+ productName,
25
+ version,
26
+ slug,
27
+ releaseTag: `${slug}-v${version}`,
28
+ releaseName: `${productName} v${version}`,
29
+ releaseBody: `Automated desktop bundles for ${productName} v${version}.`,
30
+ assetNamePrefix: `${slug}_${version}_`,
31
+ assetNamePattern: `${slug}_[version]_[platform]_[arch][ext]`,
32
+ workflowArtifactPrefix: `${slug}-desktop-bundles-v${version}`,
33
+ };
34
+ };
35
+ const writeGitHubOutput = (metadata) => {
36
+ const outputPath = process.env.GITHUB_OUTPUT;
37
+ if (!outputPath) {
38
+ console.log(JSON.stringify(metadata, null, 2));
39
+ return;
40
+ }
41
+ const outputLines = [
42
+ `release_tag=${metadata.releaseTag}`,
43
+ `release_name=${metadata.releaseName}`,
44
+ `release_body=${metadata.releaseBody}`,
45
+ `asset_name_prefix=${metadata.assetNamePrefix}`,
46
+ `asset_name_pattern=${metadata.assetNamePattern}`,
47
+ `workflow_artifact_prefix=${metadata.workflowArtifactPrefix}`,
48
+ ];
49
+ fs.appendFileSync(outputPath, `${outputLines.join("\n")}\n`, "utf8");
50
+ };
51
+ if (isDirectDesktopScriptExecution(import.meta.url)) {
52
+ writeGitHubOutput(loadDesktopReleaseMetadata());
53
+ }
54
+ //# sourceMappingURL=releaseMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releaseMetadata.js","sourceRoot":"","sources":["../../src/desktop/releaseMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAmB/D,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CACxC,KAAK;KACF,IAAI,EAAE;KACN,WAAW,EAAE;KACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;KAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAE7B,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAsB,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CACL,CAAC;IAEjC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,2BAA2B,UAAU,uCAAuC,CAC7E,CAAC;IACJ,CAAC;IAED,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EACC,EAAE;IAC1B,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO;QACL,WAAW;QACX,OAAO;QACP,IAAI;QACJ,UAAU,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE;QACjC,WAAW,EAAE,GAAG,WAAW,KAAK,OAAO,EAAE;QACzC,WAAW,EAAE,iCAAiC,WAAW,KAAK,OAAO,GAAG;QACxE,eAAe,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG;QACtC,gBAAgB,EAAE,GAAG,IAAI,mCAAmC;QAC5D,sBAAsB,EAAE,GAAG,IAAI,qBAAqB,OAAO,EAAE;KAC9D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAgC,EAAQ,EAAE;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,eAAe,QAAQ,CAAC,UAAU,EAAE;QACpC,gBAAgB,QAAQ,CAAC,WAAW,EAAE;QACtC,gBAAgB,QAAQ,CAAC,WAAW,EAAE;QACtC,qBAAqB,QAAQ,CAAC,eAAe,EAAE;QAC/C,sBAAsB,QAAQ,CAAC,gBAAgB,EAAE;QACjD,4BAA4B,QAAQ,CAAC,sBAAsB,EAAE;KAC9D,CAAC;IAEF,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,IAAI,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpD,iBAAiB,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { RuntimeEvent } from "../runtime/types.js";
2
+ interface RuntimeLike {
3
+ loadConfig(): Promise<unknown>;
4
+ saveConfig(config: unknown): Promise<void>;
5
+ answerHitl(id: string, answer: string): Promise<void>;
6
+ listSessions(): Promise<unknown>;
7
+ startSession(): Promise<unknown>;
8
+ resumeSession(sessionId: string): Promise<unknown>;
9
+ submitMessage(sessionId: string, text: string): Promise<unknown>;
10
+ closeSession(sessionId: string): Promise<void>;
11
+ subscribe(sessionId: string, listener: (event: RuntimeEvent) => void): () => void;
12
+ }
13
+ interface CreateDesktopRuntimeServerOptions {
14
+ runtime: RuntimeLike;
15
+ port?: number;
16
+ }
17
+ export declare function createDesktopRuntimeServer({ runtime, port, }: CreateDesktopRuntimeServerOptions): Promise<{
18
+ port: number;
19
+ url: string;
20
+ close: () => Promise<void>;
21
+ }>;
22
+ export {};
@@ -0,0 +1,100 @@
1
+ import express from "express";
2
+ import { createServer } from "node:http";
3
+ export async function createDesktopRuntimeServer({ runtime, port = 0, }) {
4
+ const app = express();
5
+ const allowedOrigins = new Set(["http://localhost:1420", "http://127.0.0.1:1420"]);
6
+ app.use((request, response, next) => {
7
+ const origin = request.headers.origin;
8
+ if (origin && allowedOrigins.has(origin)) {
9
+ response.setHeader("Access-Control-Allow-Origin", origin);
10
+ response.setHeader("Vary", "Origin");
11
+ response.setHeader("Access-Control-Allow-Methods", "GET,POST,DELETE,OPTIONS");
12
+ response.setHeader("Access-Control-Allow-Headers", "content-type");
13
+ }
14
+ if (request.method === "OPTIONS") {
15
+ response.status(204).end();
16
+ return;
17
+ }
18
+ next();
19
+ });
20
+ app.use(express.json());
21
+ app.get("/health", (_request, response) => {
22
+ response.json({ ok: true });
23
+ });
24
+ app.get("/config", async (_request, response) => {
25
+ response.json(await runtime.loadConfig());
26
+ });
27
+ app.post("/config", async (request, response) => {
28
+ await runtime.saveConfig(request.body);
29
+ response.status(204).end();
30
+ });
31
+ app.post("/hitl/:id/answer", async (request, response) => {
32
+ await runtime.answerHitl(asValue(request.params.id), request.body.answer ?? "");
33
+ response.status(204).end();
34
+ });
35
+ app.get("/sessions", async (_request, response) => {
36
+ response.json(await runtime.listSessions());
37
+ });
38
+ app.post("/sessions", async (_request, response) => {
39
+ response.json(await runtime.startSession());
40
+ });
41
+ app.post("/sessions/:sessionId/resume", async (request, response) => {
42
+ response.json(await runtime.resumeSession(asSessionId(request.params.sessionId)));
43
+ });
44
+ app.post("/sessions/:sessionId/messages", async (request, response) => {
45
+ response.json(await runtime.submitMessage(asSessionId(request.params.sessionId), request.body.text));
46
+ });
47
+ app.delete("/sessions/:sessionId", async (request, response) => {
48
+ await runtime.closeSession(asSessionId(request.params.sessionId));
49
+ response.status(204).end();
50
+ });
51
+ app.get("/sessions/:sessionId/events", (request, response) => {
52
+ response.setHeader("Content-Type", "text/event-stream");
53
+ response.setHeader("Cache-Control", "no-cache");
54
+ response.setHeader("Connection", "keep-alive");
55
+ response.flushHeaders();
56
+ const unsubscribe = runtime.subscribe(asSessionId(request.params.sessionId), (event) => {
57
+ response.write(`data: ${JSON.stringify(event)}\n\n`);
58
+ });
59
+ request.on("close", () => {
60
+ unsubscribe();
61
+ response.end();
62
+ });
63
+ });
64
+ const server = createServer(app);
65
+ await new Promise((resolve) => {
66
+ server.listen(port, "127.0.0.1", () => resolve());
67
+ });
68
+ const address = server.address();
69
+ if (!address || typeof address === "string") {
70
+ throw new Error("Failed to resolve desktop runtime server address");
71
+ }
72
+ return {
73
+ port: address.port,
74
+ url: `http://127.0.0.1:${address.port}`,
75
+ close: async () => {
76
+ await new Promise((resolve, reject) => {
77
+ server.close((error) => {
78
+ if (error) {
79
+ reject(error);
80
+ return;
81
+ }
82
+ resolve();
83
+ });
84
+ });
85
+ },
86
+ };
87
+ }
88
+ function asSessionId(value) {
89
+ if (Array.isArray(value)) {
90
+ return value[0] ?? "";
91
+ }
92
+ return value ?? "";
93
+ }
94
+ function asValue(value) {
95
+ if (Array.isArray(value)) {
96
+ return value[0] ?? "";
97
+ }
98
+ return value ?? "";
99
+ }
100
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/desktop/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ExecFileSyncOptionsWithStringEncoding } from "node:child_process";
2
+ import { type DesktopBundleRunner } from "./validateBundles.js";
3
+ export type InstallerSmokeExecutor = (command: string, args: string[], options: ExecFileSyncOptionsWithStringEncoding) => string;
4
+ interface SmokeTestDesktopBundlesOptions {
5
+ rootDir?: string;
6
+ runner: DesktopBundleRunner;
7
+ exec?: InstallerSmokeExecutor;
8
+ }
9
+ export declare const smokeTestDesktopBundles: ({ rootDir, runner, exec, }: SmokeTestDesktopBundlesOptions) => string[];
10
+ export {};
@@ -0,0 +1,108 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ import { validateDesktopBundles, } from "./validateBundles.js";
6
+ import { isDirectDesktopScriptExecution } from "./cliEntry.js";
7
+ const createSmokeDirectory = (runner) => fs.mkdtempSync(path.join(os.tmpdir(), `joone-installer-smoke-${runner}-`));
8
+ const parseMacMountPoint = (attachOutput) => {
9
+ const lines = attachOutput
10
+ .split(/\r?\n/)
11
+ .map((line) => line.trim())
12
+ .filter(Boolean);
13
+ const mountLine = [...lines].reverse().find((line) => line.startsWith("/dev/"));
14
+ if (!mountLine) {
15
+ throw new Error("Unable to determine the mounted DMG path from hdiutil output.");
16
+ }
17
+ const segments = mountLine.split("\t").filter(Boolean);
18
+ const mountPoint = segments.at(-1)?.trim();
19
+ if (!mountPoint || !path.isAbsolute(mountPoint)) {
20
+ throw new Error("Unable to determine the mounted DMG path from hdiutil output.");
21
+ }
22
+ return mountPoint;
23
+ };
24
+ const ensureAppBundleExists = (mountPoint) => {
25
+ const entries = fs.readdirSync(mountPoint, { withFileTypes: true });
26
+ const appBundle = entries.find((entry) => entry.isDirectory() && entry.name.toLowerCase().endsWith(".app"));
27
+ if (!appBundle) {
28
+ throw new Error(`Expected a macOS app bundle inside mounted DMG at ${mountPoint}.`);
29
+ }
30
+ };
31
+ const smokeTestWindowsInstaller = (bundlePath, smokeDir, exec) => {
32
+ const extractDir = path.join(smokeDir, "msi-extract");
33
+ fs.mkdirSync(extractDir, { recursive: true });
34
+ exec("msiexec", ["/a", bundlePath, "/qn", `TARGETDIR=${extractDir}`], {
35
+ encoding: "utf8",
36
+ stdio: "pipe",
37
+ });
38
+ };
39
+ const smokeTestLinuxInstaller = (bundlePath, smokeDir, exec) => {
40
+ const localBundlePath = path.join(smokeDir, path.basename(bundlePath));
41
+ fs.copyFileSync(bundlePath, localBundlePath);
42
+ fs.chmodSync(localBundlePath, 0o755);
43
+ exec(localBundlePath, ["--appimage-extract"], {
44
+ cwd: smokeDir,
45
+ encoding: "utf8",
46
+ stdio: "pipe",
47
+ });
48
+ const appRunPath = path.join(smokeDir, "squashfs-root", "AppRun");
49
+ if (!fs.existsSync(appRunPath)) {
50
+ throw new Error(`Expected AppImage extraction output at ${appRunPath}.`);
51
+ }
52
+ };
53
+ const smokeTestMacInstaller = (bundlePath, exec) => {
54
+ const attachOutput = exec("hdiutil", ["attach", bundlePath, "-nobrowse", "-readonly"], {
55
+ encoding: "utf8",
56
+ stdio: "pipe",
57
+ });
58
+ const mountPoint = parseMacMountPoint(attachOutput);
59
+ try {
60
+ ensureAppBundleExists(mountPoint);
61
+ }
62
+ finally {
63
+ exec("hdiutil", ["detach", mountPoint], {
64
+ encoding: "utf8",
65
+ stdio: "pipe",
66
+ });
67
+ }
68
+ };
69
+ export const smokeTestDesktopBundles = ({ rootDir = process.cwd(), runner, exec = execFileSync, }) => {
70
+ const bundles = validateDesktopBundles({ rootDir, runner });
71
+ const bundlePath = bundles[0];
72
+ if (!bundlePath) {
73
+ throw new Error(`No bundle available for smoke testing on ${runner}.`);
74
+ }
75
+ const smokeDir = createSmokeDirectory(runner);
76
+ try {
77
+ if (runner === "windows-latest") {
78
+ smokeTestWindowsInstaller(bundlePath, smokeDir, exec);
79
+ }
80
+ else if (runner === "ubuntu-22.04") {
81
+ smokeTestLinuxInstaller(bundlePath, smokeDir, exec);
82
+ }
83
+ else {
84
+ smokeTestMacInstaller(bundlePath, exec);
85
+ }
86
+ return bundles;
87
+ }
88
+ finally {
89
+ fs.rmSync(smokeDir, { recursive: true, force: true });
90
+ }
91
+ };
92
+ const parseRunnerArg = () => {
93
+ const runnerFlagIndex = process.argv.indexOf("--runner");
94
+ const runnerValue = runnerFlagIndex >= 0 ? process.argv[runnerFlagIndex + 1] : undefined;
95
+ if (runnerValue === "windows-latest" ||
96
+ runnerValue === "ubuntu-22.04" ||
97
+ runnerValue === "macos-latest") {
98
+ return runnerValue;
99
+ }
100
+ throw new Error("Missing or unsupported --runner value. Expected one of windows-latest, ubuntu-22.04, macos-latest.");
101
+ };
102
+ if (isDirectDesktopScriptExecution(import.meta.url)) {
103
+ const bundles = smokeTestDesktopBundles({ runner: parseRunnerArg() });
104
+ for (const bundle of bundles) {
105
+ console.log(bundle);
106
+ }
107
+ }
108
+ //# sourceMappingURL=smokeTestBundles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smokeTestBundles.js","sourceRoot":"","sources":["../../src/desktop/smokeTestBundles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type DesktopBundlePlatform = "msi" | "appimage" | "dmg";
2
+ export type DesktopBundleRunner = "windows-latest" | "ubuntu-22.04" | "macos-latest";
3
+ interface ValidateDesktopBundlesOptions {
4
+ rootDir?: string;
5
+ runner: DesktopBundleRunner;
6
+ }
7
+ export declare const validateDesktopBundles: ({ rootDir, runner, }: ValidateDesktopBundlesOptions) => string[];
8
+ export {};
@@ -0,0 +1,52 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { isDirectDesktopScriptExecution } from "./cliEntry.js";
4
+ const RUNNER_TO_PLATFORM = {
5
+ "windows-latest": "msi",
6
+ "ubuntu-22.04": "appimage",
7
+ "macos-latest": "dmg",
8
+ };
9
+ const PLATFORM_GLOBS = {
10
+ msi: /\.msi$/i,
11
+ appimage: /\.AppImage$/i,
12
+ dmg: /\.dmg$/i,
13
+ };
14
+ const collectFiles = (directory) => {
15
+ if (!fs.existsSync(directory)) {
16
+ return [];
17
+ }
18
+ return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
19
+ const entryPath = path.join(directory, entry.name);
20
+ if (entry.isDirectory()) {
21
+ return collectFiles(entryPath);
22
+ }
23
+ return [entryPath];
24
+ });
25
+ };
26
+ export const validateDesktopBundles = ({ rootDir = process.cwd(), runner, }) => {
27
+ const platform = RUNNER_TO_PLATFORM[runner];
28
+ const bundleDirectory = path.join(rootDir, "src-tauri", "target", "release", "bundle", platform);
29
+ const expectedPattern = PLATFORM_GLOBS[platform];
30
+ const bundles = collectFiles(bundleDirectory).filter((filePath) => expectedPattern.test(filePath));
31
+ if (bundles.length === 0) {
32
+ throw new Error(`Expected at least one desktop ${platform} bundle in ${bundleDirectory} for ${runner}.`);
33
+ }
34
+ return bundles;
35
+ };
36
+ const parseRunnerArg = () => {
37
+ const runnerFlagIndex = process.argv.indexOf("--runner");
38
+ const runnerValue = runnerFlagIndex >= 0 ? process.argv[runnerFlagIndex + 1] : undefined;
39
+ if (runnerValue === "windows-latest" ||
40
+ runnerValue === "ubuntu-22.04" ||
41
+ runnerValue === "macos-latest") {
42
+ return runnerValue;
43
+ }
44
+ throw new Error("Missing or unsupported --runner value. Expected one of windows-latest, ubuntu-22.04, macos-latest.");
45
+ };
46
+ if (isDirectDesktopScriptExecution(import.meta.url)) {
47
+ const bundles = validateDesktopBundles({ runner: parseRunnerArg() });
48
+ for (const bundle of bundles) {
49
+ console.log(bundle);
50
+ }
51
+ }
52
+ //# sourceMappingURL=validateBundles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateBundles.js","sourceRoot":"","sources":["../../src/desktop/validateBundles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAQ/D,MAAM,kBAAkB,GAAuD;IAC7E,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,UAAU;IAC1B,cAAc,EAAE,KAAK;CACtB,CAAC;AAEF,MAAM,cAAc,GAA0C;IAC5D,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,cAAc;IACxB,GAAG,EAAE,SAAS;CACf,CAAC;AAOF,MAAM,YAAY,GAAG,CAAC,SAAiB,EAAY,EAAE;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,EACvB,MAAM,GACwB,EAAY,EAAE;IAC5C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,OAAO,EACP,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,QAAQ,CACT,CAAC;IACF,MAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC/B,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,cAAc,eAAe,QAAQ,MAAM,GAAG,CACxF,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,GAAwB,EAAE;IAC/C,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,WAAW,GACf,eAAe,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,IACE,WAAW,KAAK,gBAAgB;QAChC,WAAW,KAAK,cAAc;QAC9B,WAAW,KAAK,cAAc,EAC9B,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;AACJ,CAAC,CAAC;AAEF,IAAI,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import { spawn } from "node:child_process";
2
+ import { resolveNpmCliPath } from "./npmCli.js";
3
+ const nodeExec = process.execPath;
4
+ const npmCli = resolveNpmCliPath();
5
+ const runtime = spawn(nodeExec, [npmCli, "run", "desktop:runtime:dev"], {
6
+ stdio: "inherit",
7
+ env: process.env,
8
+ });
9
+ const web = spawn(nodeExec, [npmCli, "exec", "--", "vite", "--config", "desktop/vite.config.ts", "--host", "0.0.0.0", "--port", "1420"], {
10
+ stdio: "inherit",
11
+ env: {
12
+ ...process.env,
13
+ VITE_JOONE_DESKTOP_API_URL: "http://127.0.0.1:3011",
14
+ },
15
+ });
16
+ const shutdown = () => {
17
+ runtime.kill();
18
+ web.kill();
19
+ };
20
+ process.on("SIGINT", shutdown);
21
+ process.on("SIGTERM", shutdown);
22
+ runtime.on("exit", (code) => {
23
+ if (code && code !== 0) {
24
+ web.kill();
25
+ process.exit(code);
26
+ }
27
+ });
28
+ web.on("exit", (code) => {
29
+ runtime.kill();
30
+ process.exit(code ?? 0);
31
+ });
32
+ //# sourceMappingURL=webDev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webDev.js","sourceRoot":"","sources":["../../src/desktop/webDev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;AAClC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;AAEnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,qBAAqB,CAAC,EAAE;IACtE,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,KAAK,CACf,QAAQ,EACR,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC3G;IACE,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE;QACH,GAAG,OAAO,CAAC,GAAG;QACd,0BAA0B,EAAE,uBAAuB;KACpD;CACF,CACF,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;IACpB,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,GAAG,CAAC,IAAI,EAAE,CAAC;AACb,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAEhC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IAC1B,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IACtB,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type JooneConfig } from "../cli/config.js";
2
+ import type { ContextState } from "../core/promptBuilder.js";
3
+ import type { RuntimeEvent, RuntimeHarnessFactory, RuntimePreparedSession, RuntimeSessionSnapshot } from "./types.js";
4
+ interface RuntimeServiceOptions {
5
+ configPath: string;
6
+ cwd?: string;
7
+ harnessFactory?: RuntimeHarnessFactory;
8
+ }
9
+ export declare class JooneRuntimeService {
10
+ private readonly configPath;
11
+ private readonly cwd;
12
+ private readonly sessionStore;
13
+ private readonly sessions;
14
+ private readonly listeners;
15
+ private readonly harnessFactory;
16
+ constructor(options: RuntimeServiceOptions);
17
+ loadConfig(): Promise<JooneConfig>;
18
+ saveConfig(config: JooneConfig): Promise<void>;
19
+ listSessions(): Promise<RuntimeSessionSnapshot[]>;
20
+ prepareSession(options?: {
21
+ sessionId?: string;
22
+ config?: JooneConfig;
23
+ }): Promise<RuntimePreparedSession>;
24
+ startSession(options?: {
25
+ config?: JooneConfig;
26
+ sessionId?: string;
27
+ }): Promise<RuntimeSessionSnapshot>;
28
+ resumeSession(sessionId: string): Promise<RuntimeSessionSnapshot>;
29
+ subscribe(sessionId: string, listener: (event: RuntimeEvent) => void): () => void;
30
+ syncSessionState(sessionId: string, state: ContextState): void;
31
+ submitMessage(sessionId: string, text: string): Promise<RuntimeSessionSnapshot>;
32
+ cancelSession(sessionId: string): Promise<void>;
33
+ closeSession(sessionId: string): Promise<void>;
34
+ answerHitl(id: string, answer: string): Promise<void>;
35
+ private emit;
36
+ private loadResumedState;
37
+ private createInitialState;
38
+ private ensureHarness;
39
+ private buildSnapshot;
40
+ private buildPersistedSnapshot;
41
+ private buildStartedEvent;
42
+ private getRecord;
43
+ }
44
+ export {};