crewx-agent-cli 0.2.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/dist/config.js ADDED
@@ -0,0 +1,117 @@
1
+ import { chmod, mkdir, open, readFile, rename } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { CliError } from './errors.js';
5
+ export function configPath(environment = process.env) {
6
+ const base = environment.XDG_CONFIG_HOME?.trim() || join(homedir(), '.config');
7
+ return join(base, 'crewx', 'config.json');
8
+ }
9
+ export function normalizeUrl(input) {
10
+ let url;
11
+ try {
12
+ url = new URL(input);
13
+ }
14
+ catch {
15
+ throw new CliError(`Invalid CrewX URL: ${input}`);
16
+ }
17
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
18
+ throw new CliError('CrewX URL must use http:// or https://');
19
+ }
20
+ if (url.protocol === 'http:' &&
21
+ !['localhost', '127.0.0.1', '[::1]', '0.0.0.0'].includes(url.hostname)) {
22
+ throw new CliError('CrewX requires HTTPS unless the server is running on this machine.');
23
+ }
24
+ if (url.username || url.password) {
25
+ throw new CliError('CrewX URL must not contain embedded credentials.');
26
+ }
27
+ url.hash = '';
28
+ url.search = '';
29
+ url.pathname = url.pathname.replace(/\/+$/, '') || '/';
30
+ return url.toString().replace(/\/$/, '');
31
+ }
32
+ function parseStoredConfig(value, path) {
33
+ if (typeof value !== 'object' || value === null) {
34
+ throw new CliError(`CrewX config at ${path} is not a JSON object.`);
35
+ }
36
+ const record = value;
37
+ if (record.version !== 1 || typeof record.url !== 'string' || typeof record.token !== 'string') {
38
+ throw new CliError(`CrewX config at ${path} has an unsupported format.`);
39
+ }
40
+ if (record.token.length === 0) {
41
+ throw new CliError(`CrewX config at ${path} contains an empty token.`);
42
+ }
43
+ return {
44
+ version: 1,
45
+ url: normalizeUrl(record.url),
46
+ token: record.token,
47
+ ...(typeof record.name === 'string' && record.name.trim() ? { name: record.name.trim() } : {}),
48
+ };
49
+ }
50
+ export async function readStoredConfig(environment = process.env) {
51
+ const path = configPath(environment);
52
+ let raw;
53
+ try {
54
+ raw = await readFile(path, 'utf8');
55
+ }
56
+ catch (error) {
57
+ if (error.code === 'ENOENT')
58
+ return undefined;
59
+ throw new CliError(`Unable to read CrewX config at ${path}.`, 1, { cause: error });
60
+ }
61
+ try {
62
+ return parseStoredConfig(JSON.parse(raw), path);
63
+ }
64
+ catch (error) {
65
+ if (error instanceof CliError)
66
+ throw error;
67
+ throw new CliError(`CrewX config at ${path} contains invalid JSON.`, 1, { cause: error });
68
+ }
69
+ }
70
+ export async function resolveConfig(environment = process.env) {
71
+ const environmentUrl = environment.CREWX_URL?.trim();
72
+ const environmentToken = environment.CREWX_TOKEN?.trim();
73
+ const stored = environmentUrl && environmentToken ? undefined : await readStoredConfig(environment);
74
+ const url = environmentUrl || stored?.url;
75
+ const token = environmentToken || stored?.token;
76
+ if (!url || !token) {
77
+ throw new CliError('CrewX is not connected. Run `crewx connect --url <url> --token <token>` or set CREWX_URL and CREWX_TOKEN.');
78
+ }
79
+ return {
80
+ version: 1,
81
+ url: normalizeUrl(url),
82
+ token,
83
+ ...(stored?.name ? { name: stored.name } : {}),
84
+ path: configPath(environment),
85
+ urlSource: environmentUrl ? 'environment' : 'file',
86
+ tokenSource: environmentToken ? 'environment' : 'file',
87
+ };
88
+ }
89
+ export async function saveConfig(input, environment = process.env) {
90
+ const token = input.token.trim();
91
+ if (!token)
92
+ throw new CliError('CrewX token cannot be empty.');
93
+ const path = configPath(environment);
94
+ const directory = dirname(path);
95
+ const temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;
96
+ const config = {
97
+ version: 1,
98
+ url: normalizeUrl(input.url),
99
+ token,
100
+ ...(input.name?.trim() ? { name: input.name.trim() } : {}),
101
+ };
102
+ await mkdir(directory, { recursive: true, mode: 0o700 });
103
+ await chmod(directory, 0o700);
104
+ const file = await open(temporaryPath, 'w', 0o600);
105
+ try {
106
+ await file.writeFile(`${JSON.stringify(config, null, 2)}\n`, 'utf8');
107
+ await file.sync();
108
+ }
109
+ finally {
110
+ await file.close();
111
+ }
112
+ await chmod(temporaryPath, 0o600);
113
+ await rename(temporaryPath, path);
114
+ await chmod(path, 0o600);
115
+ return path;
116
+ }
117
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const CLI_NAME = "crewx";
2
+ export declare const CLI_VERSION = "0.2.0";
3
+ export declare const API_PATH = "/api/agent/v1";
4
+ export declare const DEFAULT_ADAPTER = "codex";
5
+ export declare const DEFAULT_POLL_INTERVAL_MS = 2000;
6
+ export declare const DEFAULT_RUN_TIMEOUT_MS: number;
7
+ export declare const MAX_AGENT_OUTPUT_BYTES: number;
8
+ export declare const MAX_EVENT_CONTENT_LENGTH = 32000;
9
+ export declare const MAX_CONTEXT_LENGTH = 96000;
10
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,UAAU,CAAC;AAChC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,QAAQ,kBAAkB,CAAC;AACxC,eAAO,MAAM,eAAe,UAAU,CAAC;AACvC,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,sBAAsB,QAAkB,CAAC;AACtD,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AACvD,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,kBAAkB,QAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ export const CLI_NAME = 'crewx';
2
+ export const CLI_VERSION = '0.2.0';
3
+ export const API_PATH = '/api/agent/v1';
4
+ export const DEFAULT_ADAPTER = 'codex';
5
+ export const DEFAULT_POLL_INTERVAL_MS = 2_000;
6
+ export const DEFAULT_RUN_TIMEOUT_MS = 30 * 60 * 1_000;
7
+ export const MAX_AGENT_OUTPUT_BYTES = 16 * 1024 * 1024;
8
+ export const MAX_EVENT_CONTENT_LENGTH = 32_000;
9
+ export const MAX_CONTEXT_LENGTH = 96_000;
10
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,CAAC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type AgentAdapter, type Assignment, type OutboundEvent } from "crewx-agent-protocol";
2
+ import { runAdapter, type ParsedAdapterLine } from "./adapters.js";
3
+ import { CrewXApi } from "./api.js";
4
+ export declare function compactNativeRuntimeDiagnostic(adapter: AgentAdapter, parsed: ParsedAdapterLine): string | undefined;
5
+ export declare function runtimeSessionKey(serverUrl: string, context: Record<string, unknown>, assignmentId: string): string;
6
+ export declare function assignmentWorkingDirectory(assignment: Assignment, context: Record<string, unknown>, fallback: string): string;
7
+ export declare class EventBuffer {
8
+ private readonly api;
9
+ private readonly sessionId;
10
+ private readonly queue;
11
+ private flushing;
12
+ private retryNotBefore;
13
+ private consecutiveFailures;
14
+ constructor(api: CrewXApi, sessionId: string);
15
+ push(item: OutboundEvent): void;
16
+ flush(signal?: AbortSignal): Promise<void>;
17
+ private drain;
18
+ }
19
+ export interface AssignmentExecutionOptions {
20
+ assignment: Assignment;
21
+ adapter: AgentAdapter;
22
+ cwd: string;
23
+ context: Record<string, unknown>;
24
+ events: EventBuffer;
25
+ codingCommand?: string | undefined;
26
+ environment?: NodeJS.ProcessEnv | undefined;
27
+ serverUrl: string;
28
+ signal?: AbortSignal | undefined;
29
+ runAgent?: typeof runAdapter | undefined;
30
+ }
31
+ export type AssignmentExecutor = (options: AssignmentExecutionOptions) => Promise<void>;
32
+ export declare function executeAssignment(options: AssignmentExecutionOptions): Promise<void>;
33
+ export interface DaemonOptions {
34
+ api: CrewXApi;
35
+ adapter: AgentAdapter;
36
+ name?: string | undefined;
37
+ cwd: string;
38
+ pollIntervalMs: number;
39
+ once: boolean;
40
+ codingCommand?: string | undefined;
41
+ environment?: NodeJS.ProcessEnv | undefined;
42
+ signal?: AbortSignal | undefined;
43
+ log?: ((message: string) => void) | undefined;
44
+ executeAssignment?: AssignmentExecutor | undefined;
45
+ }
46
+ export declare function runDaemon(options: DaemonOptions): Promise<void>;
47
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EAEf,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAY,MAAM,UAAU,CAAC;AAkE9C,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,SAAS,CA+CpB;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,YAAY,EAAE,MAAM,GACnB,MAAM,CAQR;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR;AAED,qBAAa,WAAW;IAOpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAAK;gBAGb,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,MAAM;IAGpC,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKzB,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAalC,KAAK;CAyBpB;AAeD,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,UAAU,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,0BAA0B,KAChC,OAAO,CAAC,IAAI,CAAC,CAAC;AAgEnB,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAoLf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,QAAQ,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC9C,iBAAiB,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACpD;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA0KrE"}