@todu/cli 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/config.js +3 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts +4 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +675 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/habit.d.ts +2 -2
- package/dist/commands/habit.d.ts.map +1 -1
- package/dist/commands/habit.js +270 -315
- package/dist/commands/habit.js.map +1 -1
- package/dist/commands/label.d.ts +2 -2
- package/dist/commands/label.d.ts.map +1 -1
- package/dist/commands/label.js +76 -92
- package/dist/commands/label.js.map +1 -1
- package/dist/commands/note.d.ts +2 -2
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +97 -118
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/plugin.d.ts +4 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +527 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/project.d.ts +2 -2
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +99 -117
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/recurring.d.ts +2 -2
- package/dist/commands/recurring.d.ts.map +1 -1
- package/dist/commands/recurring.js +250 -284
- package/dist/commands/recurring.js.map +1 -1
- package/dist/commands/sync.d.ts +2 -2
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +123 -12
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/task.d.ts +2 -2
- package/dist/commands/task.d.ts.map +1 -1
- package/dist/commands/task.js +181 -207
- package/dist/commands/task.js.map +1 -1
- package/dist/daemon-command-client.d.ts +11 -0
- package/dist/daemon-command-client.d.ts.map +1 -0
- package/dist/daemon-command-client.js +57 -0
- package/dist/daemon-command-client.js.map +1 -0
- package/dist/daemon-plugin-config.d.ts +8 -0
- package/dist/daemon-plugin-config.d.ts.map +1 -0
- package/dist/daemon-plugin-config.js +22 -0
- package/dist/daemon-plugin-config.js.map +1 -0
- package/dist/daemon-plugin-paths.d.ts +8 -0
- package/dist/daemon-plugin-paths.d.ts.map +1 -0
- package/dist/daemon-plugin-paths.js +28 -0
- package/dist/daemon-plugin-paths.js.map +1 -0
- package/dist/daemon-transport.d.ts +37 -0
- package/dist/daemon-transport.d.ts.map +1 -0
- package/dist/daemon-transport.js +422 -0
- package/dist/daemon-transport.js.map +1 -0
- package/dist/daemon-worker-assignment.d.ts +8 -0
- package/dist/daemon-worker-assignment.d.ts.map +1 -0
- package/dist/daemon-worker-assignment.js +22 -0
- package/dist/daemon-worker-assignment.js.map +1 -0
- package/dist/index.js +20 -23
- package/dist/index.js.map +1 -1
- package/dist/test-helpers/daemon-process.d.ts +5 -0
- package/dist/test-helpers/daemon-process.d.ts.map +1 -0
- package/dist/test-helpers/daemon-process.js +55 -0
- package/dist/test-helpers/daemon-process.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/warnings.d.ts +7 -0
- package/dist/warnings.d.ts.map +1 -0
- package/dist/warnings.js +21 -0
- package/dist/warnings.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToduFileConfig } from "@todu/core";
|
|
2
|
+
export declare const TODUAI_DAEMON_PLUGIN_CONFIG_ENV = "TODUAI_DAEMON_PLUGIN_CONFIG";
|
|
3
|
+
export interface ResolvedDaemonPluginConfig {
|
|
4
|
+
value: string | undefined;
|
|
5
|
+
source: "env" | "file" | "unset";
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveDaemonPluginConfig(config: ToduFileConfig, env?: NodeJS.ProcessEnv): ResolvedDaemonPluginConfig;
|
|
8
|
+
//# sourceMappingURL=daemon-plugin-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-plugin-config.d.ts","sourceRoot":"","sources":["../src/daemon-plugin-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,0BAA0B,CAqB5B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const TODUAI_DAEMON_PLUGIN_CONFIG_ENV = "TODUAI_DAEMON_PLUGIN_CONFIG";
|
|
2
|
+
export function resolveDaemonPluginConfig(config, env = process.env) {
|
|
3
|
+
const envValue = env[TODUAI_DAEMON_PLUGIN_CONFIG_ENV];
|
|
4
|
+
if (envValue !== undefined) {
|
|
5
|
+
return {
|
|
6
|
+
value: envValue,
|
|
7
|
+
source: "env",
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const pluginConfig = config.daemon?.plugins?.config;
|
|
11
|
+
if (!pluginConfig) {
|
|
12
|
+
return {
|
|
13
|
+
value: undefined,
|
|
14
|
+
source: "unset",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
value: JSON.stringify(pluginConfig),
|
|
19
|
+
source: "file",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=daemon-plugin-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-plugin-config.js","sourceRoot":"","sources":["../src/daemon-plugin-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,+BAA+B,GAAG,6BAA6B,CAAC;AAO7E,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACR;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACtD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;QACnC,MAAM,EAAE,MAAM;KACf,CAAC;AAAA,CACH"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToduFileConfig } from "@todu/core";
|
|
2
|
+
export declare const TODUAI_DAEMON_PLUGIN_PATHS_ENV = "TODUAI_DAEMON_PLUGIN_PATHS";
|
|
3
|
+
export interface ResolvedDaemonPluginPaths {
|
|
4
|
+
value: string | undefined;
|
|
5
|
+
source: "env" | "file" | "unset";
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveDaemonPluginPaths(configPath: string, config: ToduFileConfig, env?: NodeJS.ProcessEnv): ResolvedDaemonPluginPaths;
|
|
8
|
+
//# sourceMappingURL=daemon-plugin-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-plugin-paths.d.ts","sourceRoot":"","sources":["../src/daemon-plugin-paths.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,8BAA8B,+BAA+B,CAAC;AAE3E,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,yBAAyB,CA2B3B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export const TODUAI_DAEMON_PLUGIN_PATHS_ENV = "TODUAI_DAEMON_PLUGIN_PATHS";
|
|
3
|
+
export function resolveDaemonPluginPaths(configPath, config, env = process.env) {
|
|
4
|
+
const envValue = env[TODUAI_DAEMON_PLUGIN_PATHS_ENV];
|
|
5
|
+
if (envValue !== undefined) {
|
|
6
|
+
return {
|
|
7
|
+
value: envValue,
|
|
8
|
+
source: "env",
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const filePluginPaths = config.daemon?.plugins?.paths;
|
|
12
|
+
if (!filePluginPaths) {
|
|
13
|
+
return {
|
|
14
|
+
value: undefined,
|
|
15
|
+
source: "unset",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const configDir = path.dirname(configPath);
|
|
19
|
+
const normalizedPaths = filePluginPaths
|
|
20
|
+
.map((pluginPath) => pluginPath.trim())
|
|
21
|
+
.filter((pluginPath) => pluginPath.length > 0)
|
|
22
|
+
.map((pluginPath) => path.resolve(configDir, pluginPath));
|
|
23
|
+
return {
|
|
24
|
+
value: normalizedPaths.join(","),
|
|
25
|
+
source: "file",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=daemon-plugin-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-plugin-paths.js","sourceRoot":"","sources":["../src/daemon-plugin-paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,MAAM,8BAA8B,GAAG,4BAA4B,CAAC;AAO3E,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,MAAsB,EACtB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACT;IAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;IACtD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,eAAe,GAAG,eAAe;SACpC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;SACtC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAE5D,OAAO;QACL,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAChC,MAAM,EAAE,MAAM;KACf,CAAC;AAAA,CACH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Socket } from "node:net";
|
|
2
|
+
export declare const DAEMON_PROTOCOL_VERSION = "1";
|
|
3
|
+
export declare const DEFAULT_CLI_DAEMON_CONNECT_TIMEOUT_MS = 1000;
|
|
4
|
+
export declare const DEFAULT_CLI_DAEMON_REQUEST_TIMEOUT_MS = 10000;
|
|
5
|
+
export interface DaemonTransportError {
|
|
6
|
+
code: string;
|
|
7
|
+
message: string;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export type DaemonTransportResult<T> = {
|
|
11
|
+
ok: true;
|
|
12
|
+
value: T;
|
|
13
|
+
} | {
|
|
14
|
+
ok: false;
|
|
15
|
+
error: DaemonTransportError;
|
|
16
|
+
};
|
|
17
|
+
export interface DaemonTransportClient {
|
|
18
|
+
request<T>(method: string, params?: Record<string, unknown>, options?: {
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}): Promise<DaemonTransportResult<T>>;
|
|
21
|
+
}
|
|
22
|
+
export interface DaemonTransportClientOptions {
|
|
23
|
+
socketPath: string;
|
|
24
|
+
connectTimeoutMs?: number;
|
|
25
|
+
requestTimeoutMs?: number;
|
|
26
|
+
protocolVersion?: string;
|
|
27
|
+
connect?: (socketPath: string) => Socket;
|
|
28
|
+
requestIdFactory?: () => string;
|
|
29
|
+
}
|
|
30
|
+
export interface InvokeDaemonMethodOptions extends DaemonTransportClientOptions {
|
|
31
|
+
method: string;
|
|
32
|
+
params?: Record<string, unknown>;
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function createDaemonTransportClient(options: DaemonTransportClientOptions): DaemonTransportClient;
|
|
36
|
+
export declare function invokeDaemonMethod<T>(options: InvokeDaemonMethodOptions): Promise<DaemonTransportResult<T>>;
|
|
37
|
+
//# sourceMappingURL=daemon-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-transport.d.ts","sourceRoot":"","sources":["../src/daemon-transport.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAE5C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAC3D,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,CAAC,EACP,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CAgFvB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAKnC"}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import net from "node:net";
|
|
2
|
+
export const DAEMON_PROTOCOL_VERSION = "1";
|
|
3
|
+
export const DEFAULT_CLI_DAEMON_CONNECT_TIMEOUT_MS = 1_000;
|
|
4
|
+
export const DEFAULT_CLI_DAEMON_REQUEST_TIMEOUT_MS = 10_000;
|
|
5
|
+
export function createDaemonTransportClient(options) {
|
|
6
|
+
const connectTimeoutMs = normalizeTimeout(options.connectTimeoutMs, DEFAULT_CLI_DAEMON_CONNECT_TIMEOUT_MS);
|
|
7
|
+
const requestTimeoutMs = normalizeTimeout(options.requestTimeoutMs, DEFAULT_CLI_DAEMON_REQUEST_TIMEOUT_MS);
|
|
8
|
+
const protocolVersion = options.protocolVersion ?? DAEMON_PROTOCOL_VERSION;
|
|
9
|
+
const connect = options.connect ?? ((socketPath) => net.createConnection(socketPath));
|
|
10
|
+
const requestIdFactory = options.requestIdFactory ?? createRequestId;
|
|
11
|
+
return {
|
|
12
|
+
async request(method, params = {}, requestOptions) {
|
|
13
|
+
const timeoutMs = normalizeTimeout(requestOptions?.timeoutMs, requestTimeoutMs);
|
|
14
|
+
const socketResult = await connectSocket(options.socketPath, connectTimeoutMs, connect);
|
|
15
|
+
if (!socketResult.ok) {
|
|
16
|
+
return socketResult;
|
|
17
|
+
}
|
|
18
|
+
const socket = socketResult.value;
|
|
19
|
+
const reader = createJsonLineReader(socket);
|
|
20
|
+
try {
|
|
21
|
+
const helloResponse = await sendRequestFrame(socket, reader, {
|
|
22
|
+
id: requestIdFactory(),
|
|
23
|
+
method: "daemon.hello",
|
|
24
|
+
params: { protocolVersion },
|
|
25
|
+
}, timeoutMs);
|
|
26
|
+
if (!helloResponse.ok) {
|
|
27
|
+
return helloResponse;
|
|
28
|
+
}
|
|
29
|
+
if (!isProtocolHelloResult(helloResponse.value.result, protocolVersion)) {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
error: {
|
|
33
|
+
code: "BAD_RESPONSE",
|
|
34
|
+
message: "Daemon hello response is missing expected protocol metadata",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const response = await sendRequestFrame(socket, reader, {
|
|
39
|
+
id: requestIdFactory(),
|
|
40
|
+
method,
|
|
41
|
+
params,
|
|
42
|
+
}, timeoutMs);
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
ok: true,
|
|
48
|
+
value: response.value.result,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
reader.dispose();
|
|
53
|
+
socket.end();
|
|
54
|
+
socket.destroy();
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function invokeDaemonMethod(options) {
|
|
60
|
+
const client = createDaemonTransportClient(options);
|
|
61
|
+
return client.request(options.method, options.params ?? {}, {
|
|
62
|
+
timeoutMs: options.timeoutMs,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
function createJsonLineReader(socket) {
|
|
66
|
+
let buffer = "";
|
|
67
|
+
const queue = [];
|
|
68
|
+
const pending = [];
|
|
69
|
+
const onData = (chunk) => {
|
|
70
|
+
buffer += chunk;
|
|
71
|
+
const lines = buffer.split("\n");
|
|
72
|
+
buffer = lines.pop() ?? "";
|
|
73
|
+
for (const line of lines) {
|
|
74
|
+
const trimmed = line.trim();
|
|
75
|
+
if (trimmed.length === 0) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const parsed = parseJsonFrame(trimmed);
|
|
79
|
+
if (!parsed.ok) {
|
|
80
|
+
rejectPending(parsed.error);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (pending.length > 0) {
|
|
84
|
+
const waiter = pending.shift();
|
|
85
|
+
waiter?.resolve(parsed.value);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
queue.push(parsed.value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const onError = (error) => {
|
|
93
|
+
rejectPending(error);
|
|
94
|
+
};
|
|
95
|
+
const onClose = () => {
|
|
96
|
+
rejectPending(new Error("Daemon connection closed before response was received"));
|
|
97
|
+
};
|
|
98
|
+
const rejectPending = (error) => {
|
|
99
|
+
while (pending.length > 0) {
|
|
100
|
+
const waiter = pending.shift();
|
|
101
|
+
waiter?.reject(error);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
socket.setEncoding("utf8");
|
|
105
|
+
socket.on("data", onData);
|
|
106
|
+
socket.on("error", onError);
|
|
107
|
+
socket.on("close", onClose);
|
|
108
|
+
return {
|
|
109
|
+
next(timeoutMs) {
|
|
110
|
+
if (queue.length > 0) {
|
|
111
|
+
const frame = queue.shift();
|
|
112
|
+
return Promise.resolve(frame);
|
|
113
|
+
}
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const timeout = setTimeout(() => {
|
|
116
|
+
removePending(waiter);
|
|
117
|
+
reject(new Error(`Timed out waiting for daemon response frame after ${Math.floor(timeoutMs)}ms`));
|
|
118
|
+
}, timeoutMs);
|
|
119
|
+
const waiter = {
|
|
120
|
+
resolve: (frame) => {
|
|
121
|
+
clearTimeout(timeout);
|
|
122
|
+
resolve(frame);
|
|
123
|
+
},
|
|
124
|
+
reject: (error) => {
|
|
125
|
+
clearTimeout(timeout);
|
|
126
|
+
reject(error);
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
pending.push(waiter);
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
dispose() {
|
|
133
|
+
socket.off("data", onData);
|
|
134
|
+
socket.off("error", onError);
|
|
135
|
+
socket.off("close", onClose);
|
|
136
|
+
rejectPending(new Error("Daemon response reader disposed"));
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
function removePending(waiter) {
|
|
140
|
+
const index = pending.indexOf(waiter);
|
|
141
|
+
if (index >= 0) {
|
|
142
|
+
pending.splice(index, 1);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function sendRequestFrame(socket, reader, request, timeoutMs) {
|
|
147
|
+
try {
|
|
148
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
error: {
|
|
154
|
+
code: "DAEMON_UNAVAILABLE",
|
|
155
|
+
message: getErrorMessage(error),
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const startedAt = Date.now();
|
|
160
|
+
while (true) {
|
|
161
|
+
const elapsed = Date.now() - startedAt;
|
|
162
|
+
const remaining = timeoutMs - elapsed;
|
|
163
|
+
if (remaining <= 0) {
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
error: createRequestTimeoutError(request.method, timeoutMs),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
let frame;
|
|
170
|
+
try {
|
|
171
|
+
frame = await reader.next(remaining);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
ok: false,
|
|
176
|
+
error: mapReaderError(error, request.method, timeoutMs),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const parsed = parseIncomingFrame(frame);
|
|
180
|
+
if (!parsed.ok) {
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
error: parsed.error,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (parsed.kind === "event") {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (parsed.value.id !== request.id) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (parsed.kind === "error") {
|
|
193
|
+
return {
|
|
194
|
+
ok: false,
|
|
195
|
+
error: parsed.value.error,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
ok: true,
|
|
200
|
+
value: parsed.value,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function connectSocket(socketPath, timeoutMs, connect) {
|
|
205
|
+
return new Promise((resolve) => {
|
|
206
|
+
let settled = false;
|
|
207
|
+
const socket = connect(socketPath);
|
|
208
|
+
const cleanup = () => {
|
|
209
|
+
socket.off("error", onError);
|
|
210
|
+
socket.off("connect", onConnect);
|
|
211
|
+
};
|
|
212
|
+
const finish = (result) => {
|
|
213
|
+
if (settled) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
settled = true;
|
|
217
|
+
clearTimeout(timeout);
|
|
218
|
+
cleanup();
|
|
219
|
+
resolve(result);
|
|
220
|
+
};
|
|
221
|
+
const onConnect = () => {
|
|
222
|
+
finish({ ok: true, value: socket });
|
|
223
|
+
};
|
|
224
|
+
const onError = (error) => {
|
|
225
|
+
finish({
|
|
226
|
+
ok: false,
|
|
227
|
+
error: mapConnectError(socketPath, error),
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
const timeout = setTimeout(() => {
|
|
231
|
+
socket.destroy();
|
|
232
|
+
finish({
|
|
233
|
+
ok: false,
|
|
234
|
+
error: {
|
|
235
|
+
code: "DAEMON_UNAVAILABLE",
|
|
236
|
+
message: `Timed out connecting to daemon socket after ${Math.floor(timeoutMs)}ms`,
|
|
237
|
+
details: {
|
|
238
|
+
socketPath,
|
|
239
|
+
timeoutMs: Math.floor(timeoutMs),
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
}, timeoutMs);
|
|
244
|
+
socket.once("connect", onConnect);
|
|
245
|
+
socket.once("error", onError);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function mapConnectError(socketPath, source) {
|
|
249
|
+
const code = errorCode(source);
|
|
250
|
+
if (code === "ENOENT" || code === "ECONNREFUSED" || code === "EACCES" || code === "EPERM") {
|
|
251
|
+
return {
|
|
252
|
+
code: "DAEMON_UNAVAILABLE",
|
|
253
|
+
message: `Daemon unavailable at socket: ${socketPath}`,
|
|
254
|
+
details: {
|
|
255
|
+
socketPath,
|
|
256
|
+
reason: code,
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
code: "INTERNAL_ERROR",
|
|
262
|
+
message: getErrorMessage(source),
|
|
263
|
+
details: {
|
|
264
|
+
socketPath,
|
|
265
|
+
reason: code,
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
function parseJsonFrame(payload) {
|
|
270
|
+
try {
|
|
271
|
+
return {
|
|
272
|
+
ok: true,
|
|
273
|
+
value: JSON.parse(payload),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
return {
|
|
278
|
+
ok: false,
|
|
279
|
+
error: {
|
|
280
|
+
code: "BAD_RESPONSE",
|
|
281
|
+
message: "Daemon returned invalid JSON response",
|
|
282
|
+
details: {
|
|
283
|
+
parseError: getErrorMessage(error),
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
function parseIncomingFrame(frame) {
|
|
290
|
+
if (!isRecord(frame)) {
|
|
291
|
+
return {
|
|
292
|
+
ok: false,
|
|
293
|
+
error: {
|
|
294
|
+
code: "BAD_RESPONSE",
|
|
295
|
+
message: "Daemon response frame must be an object",
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (typeof frame.event === "string") {
|
|
300
|
+
return {
|
|
301
|
+
ok: true,
|
|
302
|
+
kind: "event",
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
if (isRecord(frame.error)) {
|
|
306
|
+
const protocolError = frame.error;
|
|
307
|
+
if (typeof protocolError.code === "string" && typeof protocolError.message === "string") {
|
|
308
|
+
const id = frame.id;
|
|
309
|
+
if (typeof id === "string" || id === null) {
|
|
310
|
+
return {
|
|
311
|
+
ok: true,
|
|
312
|
+
kind: "error",
|
|
313
|
+
value: {
|
|
314
|
+
id,
|
|
315
|
+
error: {
|
|
316
|
+
code: protocolError.code,
|
|
317
|
+
message: protocolError.message,
|
|
318
|
+
details: isRecord(protocolError.details) ? protocolError.details : undefined,
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (typeof frame.id === "string" && "result" in frame) {
|
|
326
|
+
return {
|
|
327
|
+
ok: true,
|
|
328
|
+
kind: "success",
|
|
329
|
+
value: {
|
|
330
|
+
id: frame.id,
|
|
331
|
+
result: frame.result,
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
ok: false,
|
|
337
|
+
error: {
|
|
338
|
+
code: "BAD_RESPONSE",
|
|
339
|
+
message: "Daemon response frame shape is invalid",
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
function mapReaderError(error, method, timeoutMs) {
|
|
344
|
+
if (isDaemonTransportError(error)) {
|
|
345
|
+
return error;
|
|
346
|
+
}
|
|
347
|
+
if (error instanceof Error && error.message.startsWith("Timed out waiting for daemon response")) {
|
|
348
|
+
return createRequestTimeoutError(method, timeoutMs);
|
|
349
|
+
}
|
|
350
|
+
if (error instanceof Error &&
|
|
351
|
+
error.message === "Daemon connection closed before response was received") {
|
|
352
|
+
return {
|
|
353
|
+
code: "DAEMON_UNAVAILABLE",
|
|
354
|
+
message: error.message,
|
|
355
|
+
details: {
|
|
356
|
+
method,
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return {
|
|
361
|
+
code: "INTERNAL_ERROR",
|
|
362
|
+
message: getErrorMessage(error),
|
|
363
|
+
details: {
|
|
364
|
+
method,
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
function createRequestTimeoutError(method, timeoutMs) {
|
|
369
|
+
return {
|
|
370
|
+
code: "TIMEOUT",
|
|
371
|
+
message: `Daemon request timed out after ${timeoutMs}ms`,
|
|
372
|
+
details: {
|
|
373
|
+
method,
|
|
374
|
+
timeoutMs,
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function isDaemonTransportError(value) {
|
|
379
|
+
if (!isRecord(value)) {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
return typeof value.code === "string" && typeof value.message === "string";
|
|
383
|
+
}
|
|
384
|
+
function isProtocolHelloResult(value, expectedProtocolVersion) {
|
|
385
|
+
if (!isRecord(value)) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
return value.protocolVersion === expectedProtocolVersion;
|
|
389
|
+
}
|
|
390
|
+
function normalizeTimeout(value, fallback) {
|
|
391
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
392
|
+
return fallback;
|
|
393
|
+
}
|
|
394
|
+
if (value < 1) {
|
|
395
|
+
return fallback;
|
|
396
|
+
}
|
|
397
|
+
return Math.floor(value);
|
|
398
|
+
}
|
|
399
|
+
function isRecord(value) {
|
|
400
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
401
|
+
}
|
|
402
|
+
function errorCode(error) {
|
|
403
|
+
if (!isRecord(error)) {
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
return typeof error.code === "string" ? error.code : undefined;
|
|
407
|
+
}
|
|
408
|
+
function getErrorMessage(error) {
|
|
409
|
+
if (error instanceof Error) {
|
|
410
|
+
return error.message;
|
|
411
|
+
}
|
|
412
|
+
if (typeof error === "string") {
|
|
413
|
+
return error;
|
|
414
|
+
}
|
|
415
|
+
return "Unexpected daemon transport error";
|
|
416
|
+
}
|
|
417
|
+
let requestCounter = 0;
|
|
418
|
+
function createRequestId() {
|
|
419
|
+
requestCounter += 1;
|
|
420
|
+
return `cli-${Date.now()}-${requestCounter}`;
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=daemon-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-transport.js","sourceRoot":"","sources":["../src/daemon-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToduFileConfig } from "@todu/core";
|
|
2
|
+
export declare const TODUAI_DAEMON_ASSIGNED_WORKERS_ENV = "TODUAI_DAEMON_ASSIGNED_WORKERS";
|
|
3
|
+
export interface ResolvedDaemonAssignedWorkers {
|
|
4
|
+
value: string | undefined;
|
|
5
|
+
source: "env" | "file" | "unset";
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveDaemonAssignedWorkers(config: ToduFileConfig, env?: NodeJS.ProcessEnv): ResolvedDaemonAssignedWorkers;
|
|
8
|
+
//# sourceMappingURL=daemon-worker-assignment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-worker-assignment.d.ts","sourceRoot":"","sources":["../src/daemon-worker-assignment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,kCAAkC,mCAAmC,CAAC;AAEnF,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,cAAc,EACtB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,6BAA6B,CAqB/B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const TODUAI_DAEMON_ASSIGNED_WORKERS_ENV = "TODUAI_DAEMON_ASSIGNED_WORKERS";
|
|
2
|
+
export function resolveDaemonAssignedWorkers(config, env = process.env) {
|
|
3
|
+
const envValue = env[TODUAI_DAEMON_ASSIGNED_WORKERS_ENV];
|
|
4
|
+
if (envValue !== undefined) {
|
|
5
|
+
return {
|
|
6
|
+
value: envValue,
|
|
7
|
+
source: "env",
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
const fileAssigned = config.daemon?.workers?.assigned;
|
|
11
|
+
if (!fileAssigned) {
|
|
12
|
+
return {
|
|
13
|
+
value: undefined,
|
|
14
|
+
source: "unset",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
value: fileAssigned.map((workerType) => workerType.trim()).join(","),
|
|
19
|
+
source: "file",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=daemon-worker-assignment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-worker-assignment.js","sourceRoot":"","sources":["../src/daemon-worker-assignment.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kCAAkC,GAAG,gCAAgC,CAAC;AAOnF,MAAM,UAAU,4BAA4B,CAC1C,MAAsB,EACtB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACL;IAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACzD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IACtD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACpE,MAAM,EAAE,MAAM;KACf,CAAC;AAAA,CACH"}
|