@parlor/cli 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +19 -2
- package/dist/agent-host-process.d.ts +22 -0
- package/dist/agent-host-process.d.ts.map +1 -0
- package/dist/agent-host-process.js +35 -0
- package/dist/agent-host-process.js.map +1 -0
- package/dist/chat-warning.d.ts +8 -0
- package/dist/chat-warning.d.ts.map +1 -0
- package/dist/chat-warning.js +13 -0
- package/dist/chat-warning.js.map +1 -0
- package/dist/commands/add.d.ts +32 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +79 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +27 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/db.d.ts +12 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +131 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +8 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +44 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +22 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +86 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/typegen.d.ts +2 -0
- package/dist/commands/typegen.d.ts.map +1 -0
- package/dist/commands/typegen.js +13 -0
- package/dist/commands/typegen.js.map +1 -0
- package/dist/desktop-target.d.ts +4 -0
- package/dist/desktop-target.d.ts.map +1 -0
- package/dist/desktop-target.js +45 -0
- package/dist/desktop-target.js.map +1 -0
- package/dist/dev-session.d.ts +15 -0
- package/dist/dev-session.d.ts.map +1 -0
- package/dist/dev-session.js +65 -0
- package/dist/dev-session.js.map +1 -0
- package/dist/errors.d.ts +4 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -0
- package/dist/handlers.d.ts +3 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +12 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +37 -0
- package/dist/main.js.map +1 -0
- package/dist/mobile-target.d.ts +5 -0
- package/dist/mobile-target.d.ts.map +1 -0
- package/dist/mobile-target.js +40 -0
- package/dist/mobile-target.js.map +1 -0
- package/dist/ports.d.ts +14 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +45 -0
- package/dist/ports.js.map +1 -0
- package/dist/serve-entry.d.ts +2 -0
- package/dist/serve-entry.d.ts.map +1 -0
- package/dist/serve-entry.js +20 -0
- package/dist/serve-entry.js.map +1 -0
- package/dist/server-process.d.ts +13 -0
- package/dist/server-process.d.ts.map +1 -0
- package/dist/server-process.js +68 -0
- package/dist/server-process.js.map +1 -0
- package/dist/serverless-warning.d.ts +4 -0
- package/dist/serverless-warning.d.ts.map +1 -0
- package/dist/serverless-warning.js +6 -0
- package/dist/serverless-warning.js.map +1 -0
- package/dist/shutdown.d.ts +6 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +22 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/targets.d.ts +27 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +31 -0
- package/dist/targets.js.map +1 -0
- package/dist/web-target.d.ts +6 -0
- package/dist/web-target.d.ts.map +1 -0
- package/dist/web-target.js +45 -0
- package/dist/web-target.js.map +1 -0
- package/package.json +48 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { once } from "node:events";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { connect } from "node:net";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { appServerEnv } from "@parlor/config";
|
|
7
|
+
import { onShutdown } from "./shutdown.js";
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
/**
|
|
10
|
+
* The first of `frontends` is the app's origin; the others are the other targets of the same
|
|
11
|
+
* `parlor dev`, which the server trusts too.
|
|
12
|
+
*/
|
|
13
|
+
export function serverEnv(config, base = process.env, frontends = [`http://localhost:${config.web.port}`]) {
|
|
14
|
+
const [origin, ...others] = frontends;
|
|
15
|
+
return {
|
|
16
|
+
...base,
|
|
17
|
+
PORT: String(config.server.port),
|
|
18
|
+
PARLOR_WEB_ORIGIN: origin,
|
|
19
|
+
...(others.length > 0 ? { PARLOR_DEV_ORIGINS: others.join(",") } : {}),
|
|
20
|
+
PARLOR_DEV: "1",
|
|
21
|
+
...appServerEnv(config),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export const SERVER_SELF_EXIT_GRACE_MS = 2000;
|
|
25
|
+
// A second signal makes tsx watch SIGKILL its child, and the process group usually delivered the first.
|
|
26
|
+
export async function stopServerProcess(child, graceMs = SERVER_SELF_EXIT_GRACE_MS) {
|
|
27
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
28
|
+
return;
|
|
29
|
+
const exited = once(child, "exit");
|
|
30
|
+
const nudge = setTimeout(() => child.kill("SIGTERM"), graceMs);
|
|
31
|
+
try {
|
|
32
|
+
await exited;
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
clearTimeout(nudge);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function accepts(port) {
|
|
39
|
+
return new Promise((resolve) => {
|
|
40
|
+
const socket = connect(port, "localhost");
|
|
41
|
+
socket.once("connect", () => {
|
|
42
|
+
socket.destroy();
|
|
43
|
+
resolve(true);
|
|
44
|
+
});
|
|
45
|
+
socket.once("error", () => resolve(false));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Lets the page's first requests reach the server instead of failing in Vite's proxy. */
|
|
49
|
+
export async function untilListening(child, port, intervalMs = 100) {
|
|
50
|
+
while (child.exitCode === null && child.signalCode === null) {
|
|
51
|
+
if (await accepts(port))
|
|
52
|
+
return;
|
|
53
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function startServerProcess({ config, rootDir }, frontends) {
|
|
57
|
+
const tsxBin = require.resolve("tsx/cli");
|
|
58
|
+
const runner = new URL("./serve-entry.ts", import.meta.url).pathname.replace(/\.ts$/, import.meta.url.endsWith(".js") ? ".js" : ".ts");
|
|
59
|
+
const entry = join(rootDir, config.server.entry);
|
|
60
|
+
const child = spawn(process.execPath, [tsxBin, "watch", "--clear-screen=false", runner, entry], {
|
|
61
|
+
cwd: rootDir,
|
|
62
|
+
stdio: "inherit",
|
|
63
|
+
env: serverEnv(config, process.env, frontends),
|
|
64
|
+
});
|
|
65
|
+
onShutdown((signaled) => stopServerProcess(child, signaled ? undefined : 0));
|
|
66
|
+
return child;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=server-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-process.js","sourceRoot":"","sources":["../src/server-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const SERVERLESS_UNSUPPORTED_WARNING = "Warning: serverless presets are not supported yet. Pages and actions work, but agents cannot see or use the screen (ui_* tools), actions that need the user's approval always fail when an agent calls them, and the agent sidebar replies without streaming. Deploy with node-server or bun for now.";
|
|
2
|
+
/** A build whose sync polls is a serverless one: its functions cannot hold a stream. */
|
|
3
|
+
export declare function serverlessWarning(syncTransport: "sse" | "poll"): string | undefined;
|
|
4
|
+
//# sourceMappingURL=serverless-warning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverless-warning.d.ts","sourceRoot":"","sources":["../src/serverless-warning.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,0SAC8P,CAAC;AAE1S,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const SERVERLESS_UNSUPPORTED_WARNING = "Warning: serverless presets are not supported yet. Pages and actions work, but agents cannot see or use the screen (ui_* tools), actions that need the user's approval always fail when an agent calls them, and the agent sidebar replies without streaming. Deploy with node-server or bun for now.";
|
|
2
|
+
/** A build whose sync polls is a serverless one: its functions cannot hold a stream. */
|
|
3
|
+
export function serverlessWarning(syncTransport) {
|
|
4
|
+
return syncTransport === "poll" ? SERVERLESS_UNSUPPORTED_WARNING : undefined;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=serverless-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverless-warning.js","sourceRoot":"","sources":["../src/serverless-warning.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GACzC,uSAAuS,CAAC;AAE1S,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,aAA6B;IAC7D,OAAO,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** `signaled` is false when the CLI stops on its own error, so no signal reached its children. */
|
|
2
|
+
type Cleanup = (signaled: boolean) => void | Promise<void>;
|
|
3
|
+
export declare function shutdownAfterError(): Promise<void>;
|
|
4
|
+
export declare function onShutdown(cleanup: Cleanup): void;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=shutdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,KAAK,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAc3D,wBAAgB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAOjD"}
|
package/dist/shutdown.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const cleanups = [];
|
|
2
|
+
let installed = false;
|
|
3
|
+
async function runCleanups(signaled) {
|
|
4
|
+
await Promise.allSettled(cleanups.splice(0).map((cleanup) => cleanup(signaled)));
|
|
5
|
+
}
|
|
6
|
+
async function shutdown(signal) {
|
|
7
|
+
await runCleanups(true);
|
|
8
|
+
process.kill(process.pid, signal);
|
|
9
|
+
}
|
|
10
|
+
export function shutdownAfterError() {
|
|
11
|
+
return runCleanups(false);
|
|
12
|
+
}
|
|
13
|
+
export function onShutdown(cleanup) {
|
|
14
|
+
cleanups.push(cleanup);
|
|
15
|
+
if (installed)
|
|
16
|
+
return;
|
|
17
|
+
installed = true;
|
|
18
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
19
|
+
process.once(signal, () => void shutdown(signal));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAc,EAAE,CAAC;AAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,KAAK,UAAU,WAAW,CAAC,QAAiB;IAC1C,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAsB;IAC5C,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,SAAS;QAAE,OAAO;IACtB,SAAS,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { LoadedConfig } from "@parlor/config";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
export declare const TARGETS: readonly ["web", "ios", "android", "mac", "windows", "linux"];
|
|
4
|
+
export type Target = (typeof TARGETS)[number];
|
|
5
|
+
export interface DevOptions {
|
|
6
|
+
readonly device?: string | undefined;
|
|
7
|
+
/** The web target's origin when this target runs next to it, so both pair once. */
|
|
8
|
+
readonly appOrigin?: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
export interface BuildOptions {
|
|
11
|
+
readonly preset?: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export interface TargetHandler {
|
|
14
|
+
/** Throws when this machine cannot run the target, before `parlor dev` starts anything. */
|
|
15
|
+
assertHost?(): void;
|
|
16
|
+
/** Starts this target's frontend; `parlor dev` already runs the server it talks to. */
|
|
17
|
+
dev(loaded: LoadedConfig, options: DevOptions): Promise<void>;
|
|
18
|
+
build(loaded: LoadedConfig, options: BuildOptions): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare class TargetError extends CliError {
|
|
21
|
+
readonly name = "TargetError";
|
|
22
|
+
}
|
|
23
|
+
export declare function parseTarget(value: unknown): Target;
|
|
24
|
+
/** `web,mac` runs both against one server; the first is the default `web`. */
|
|
25
|
+
export declare function parseTargets(value: unknown): readonly Target[];
|
|
26
|
+
export declare function resolveHandler(handlers: Partial<Record<Target, TargetHandler>>, target: Target): TargetHandler;
|
|
27
|
+
//# sourceMappingURL=targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,eAAO,MAAM,OAAO,YAAI,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AACrF,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,mFAAmF;IACnF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,2FAA2F;IAC3F,UAAU,CAAC,IAAI,IAAI,CAAC;IACpB,uFAAuF;IACvF,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,qBAAa,WAAY,SAAQ,QAAQ;IACvC,SAAkB,IAAI,iBAAiB;CACxC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQlD;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAQ9D;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EAChD,MAAM,EAAE,MAAM,GACb,aAAa,CAMf"}
|
package/dist/targets.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export const TARGETS = ["web", "ios", "android", "mac", "windows", "linux"];
|
|
3
|
+
export class TargetError extends CliError {
|
|
4
|
+
name = "TargetError";
|
|
5
|
+
}
|
|
6
|
+
export function parseTarget(value) {
|
|
7
|
+
const target = value === undefined ? "web" : String(value);
|
|
8
|
+
if (!TARGETS.includes(target)) {
|
|
9
|
+
throw new TargetError(`Unknown target "${target}". Expected one of: ${TARGETS.join(", ")}`);
|
|
10
|
+
}
|
|
11
|
+
return target;
|
|
12
|
+
}
|
|
13
|
+
/** `web,mac` runs both against one server; the first is the default `web`. */
|
|
14
|
+
export function parseTargets(value) {
|
|
15
|
+
const names = (value === undefined ? "web" : String(value))
|
|
16
|
+
.split(",")
|
|
17
|
+
.map((name) => name.trim())
|
|
18
|
+
.filter(Boolean);
|
|
19
|
+
const targets = [...new Set(names.map(parseTarget))];
|
|
20
|
+
if (targets.length === 0)
|
|
21
|
+
return ["web"];
|
|
22
|
+
return targets;
|
|
23
|
+
}
|
|
24
|
+
export function resolveHandler(handlers, target) {
|
|
25
|
+
const handler = handlers[target];
|
|
26
|
+
if (!handler) {
|
|
27
|
+
throw new TargetError(`Target "${target}" is not supported yet`);
|
|
28
|
+
}
|
|
29
|
+
return handler;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAqBrF,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACrB,IAAI,GAAG,aAAa,CAAC;CACxC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAgB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,WAAW,CACnB,mBAAmB,MAAM,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAgB,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACxD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAgD,EAChD,MAAc;IAEd,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,WAAW,CAAC,WAAW,MAAM,wBAAwB,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LoadedConfig } from "@parlor/config";
|
|
2
|
+
import { type ServerBuildResult } from "@parlor/host";
|
|
3
|
+
import type { BuildOptions, TargetHandler } from "./targets.js";
|
|
4
|
+
export declare function buildWebAndServer(loaded: LoadedConfig, options: BuildOptions): Promise<ServerBuildResult>;
|
|
5
|
+
export declare const webTarget: TargetHandler;
|
|
6
|
+
//# sourceMappingURL=web-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-target.d.ts","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMhE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAiB5B;AAED,eAAO,MAAM,SAAS,EAAE,aAkBvB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { buildServer, PresetError, resolvePreset, } from "@parlor/host";
|
|
2
|
+
import { buildWeb, startWebDev } from "@parlor/shell-web";
|
|
3
|
+
import { CliError } from "./errors.js";
|
|
4
|
+
import { serverlessWarning } from "./serverless-warning.js";
|
|
5
|
+
import { onShutdown } from "./shutdown.js";
|
|
6
|
+
function isPortInUse(error) {
|
|
7
|
+
return error instanceof Error && /already in use/.test(error.message);
|
|
8
|
+
}
|
|
9
|
+
export async function buildWebAndServer(loaded, options) {
|
|
10
|
+
const outDir = await buildWeb(loaded);
|
|
11
|
+
console.log(`web build written to ${outDir}`);
|
|
12
|
+
try {
|
|
13
|
+
const { preset, reason } = resolvePreset(options.preset, loaded.config.deploy.preset);
|
|
14
|
+
console.log(`building server for ${preset} (${reason})`);
|
|
15
|
+
const result = await buildServer(loaded, { preset });
|
|
16
|
+
console.log(`server build written to ${result.outputDir} (sync: ${result.syncTransport})`);
|
|
17
|
+
const warning = serverlessWarning(result.syncTransport);
|
|
18
|
+
if (warning)
|
|
19
|
+
console.warn(warning);
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof PresetError)
|
|
24
|
+
throw new CliError(error.message, { cause: error });
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const webTarget = {
|
|
29
|
+
async dev(loaded, options) {
|
|
30
|
+
try {
|
|
31
|
+
const server = await startWebDev(loaded, { appOrigin: options.appOrigin });
|
|
32
|
+
onShutdown(() => server.close());
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (isPortInUse(error)) {
|
|
36
|
+
throw new CliError(`Port ${loaded.config.web.port} was taken while parlor dev was starting. Run it again.`, { cause: error });
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
async build(loaded, options) {
|
|
42
|
+
await buildWebAndServer(loaded, options);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=web-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-target.js","sourceRoot":"","sources":["../src/web-target.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,WAAW,EACX,aAAa,GAEd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAoB,EACpB,OAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CACT,2BAA2B,MAAM,CAAC,SAAS,WAAW,MAAM,CAAC,aAAa,GAAG,CAC9E,CAAC;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAkB;IACtC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAC3E,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,QAAQ,CAChB,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,yDAAyD,EACvF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO;QACzB,MAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parlor/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"homepage": "https://cychien.github.io/parlor",
|
|
5
|
+
"bugs": "https://github.com/cychien/parlor/issues",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/cychien/parlor.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"bin": {
|
|
13
|
+
"parlor": "./dist/main.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"type": "module",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"citty": "^0.2.2",
|
|
27
|
+
"drizzle-kit": "^0.31.11",
|
|
28
|
+
"srvx": "^1.0.5",
|
|
29
|
+
"tsx": "^4.23.15",
|
|
30
|
+
"@parlor/agent-host": "0.1.0",
|
|
31
|
+
"@parlor/config": "0.1.0",
|
|
32
|
+
"@parlor/agent-ui": "0.1.0",
|
|
33
|
+
"@parlor/shell-web": "0.1.0",
|
|
34
|
+
"@parlor/host": "0.1.0",
|
|
35
|
+
"@parlor/scaffold": "0.1.0",
|
|
36
|
+
"@parlor/data": "0.1.0",
|
|
37
|
+
"@parlor/shell-desktop": "0.1.0",
|
|
38
|
+
"@parlor/shell-mobile": "0.1.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^24.14.0",
|
|
42
|
+
"drizzle-orm": "^0.45.4",
|
|
43
|
+
"typescript": "^7.0.2",
|
|
44
|
+
"vitest": "^5.0.3"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc -p tsconfig.json",
|
|
48
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
49
|
+
"test": "vitest run"
|
|
50
|
+
}
|
|
6
51
|
}
|