@rallycry/conveyor-agent 7.0.1 → 7.0.2
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/chunk-CYZPFJGN.js +26 -0
- package/dist/chunk-CYZPFJGN.js.map +1 -0
- package/dist/chunk-KNBG2634.js +51 -0
- package/dist/chunk-KNBG2634.js.map +1 -0
- package/dist/{chunk-HAU4E7IA.js → chunk-NZ3IPMLO.js} +99 -105
- package/dist/chunk-NZ3IPMLO.js.map +1 -0
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/tag-audit-handler-4RRGIHVB.js +184 -0
- package/dist/tag-audit-handler-4RRGIHVB.js.map +1 -0
- package/dist/tunnel-client.d.ts +1 -0
- package/dist/tunnel-client.js +212 -0
- package/dist/tunnel-client.js.map +1 -0
- package/package.json +5 -2
- package/dist/chunk-HAU4E7IA.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ProjectRunner,
|
|
4
|
-
SessionRunner
|
|
4
|
+
SessionRunner
|
|
5
|
+
} from "./chunk-NZ3IPMLO.js";
|
|
6
|
+
import "./chunk-KNBG2634.js";
|
|
7
|
+
import {
|
|
5
8
|
createServiceLogger
|
|
6
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CYZPFJGN.js";
|
|
7
10
|
|
|
8
11
|
// src/cli.ts
|
|
9
12
|
import { readFileSync } from "fs";
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { SessionRunner } from \"./runner/session-runner.js\";\nimport { ProjectRunner } from \"./runner/project-runner.js\";\nimport type { AgentRunnerStatus, RunnerMode } from \"@project/shared\";\nimport { createServiceLogger } from \"./utils/logger.js\";\n\n// Handle --version flag before any other initialization\nif (process.argv.includes(\"--version\")) {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(__dirname, \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n process.stdout.write(pkg.version + \"\\n\");\n process.exit(0);\n}\n\nconst logger = createServiceLogger(\"CLI\");\n\nasync function bootstrapFromCodespace(apiUrl: string, instanceName: string): Promise<void> {\n logger.info(\"Bootstrapping from codespace\", { codespace: instanceName });\n const response = await fetch(`${apiUrl}/api/codespace/bootstrap/${instanceName}`);\n if (!response.ok) {\n const errorText = await response.text();\n logger.error(\"Bootstrap failed\", { status: response.status, body: errorText });\n process.exit(1);\n }\n const config = (await response.json()) as {\n mode?: \"task\" | \"project\";\n taskId?: string;\n sessionId?: string;\n taskToken?: string;\n runnerMode?: string;\n agentMode?: string;\n isAuto?: string;\n taskBranch?: string;\n projectId?: string;\n projectToken?: string;\n apiUrl?: string;\n workspaceBranch?: string;\n envVars: Record<string, string>;\n };\n\n for (const [key, value] of Object.entries(config.envVars ?? {})) {\n process.env[key] = value;\n }\n\n if (config.mode === \"project\") {\n process.env.CONVEYOR_PROJECT_TOKEN = config.projectToken;\n process.env.CONVEYOR_PROJECT_ID = config.projectId;\n if (config.workspaceBranch) {\n process.env.CONVEYOR_WORKSPACE_BRANCH = config.workspaceBranch;\n }\n logger.info(\"Bootstrap complete (project mode)\", { projectId: config.projectId });\n } else {\n process.env.CONVEYOR_TASK_ID = config.taskId;\n if (config.sessionId) {\n process.env.CONVEYOR_SESSION_ID = config.sessionId;\n }\n process.env.CONVEYOR_TASK_TOKEN = config.taskToken;\n process.env.CONVEYOR_AGENT_MODE = config.agentMode;\n process.env.CONVEYOR_IS_AUTO = config.isAuto;\n if (config.runnerMode) {\n process.env.CONVEYOR_MODE = config.runnerMode;\n }\n if (config.taskBranch) {\n process.env.CONVEYOR_TASK_BRANCH = config.taskBranch;\n }\n logger.info(\"Bootstrap complete\", { taskId: config.taskId });\n }\n}\n\nprocess.on(\"uncaughtException\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EPIPE\") return;\n logger.error(\"Uncaught exception\", { error: err.message, code: err.code });\n process.exit(1);\n});\n\nlet conveyorApiUrl = process.env.CONVEYOR_API_URL;\n\n// Step 1: Codespace bootstrap\nconst INSTANCE_NAME = process.env.CODESPACE_NAME || process.env.CLAUDESPACE_NAME;\nif (INSTANCE_NAME && !process.env.CONVEYOR_TASK_TOKEN && !process.env.CONVEYOR_PROJECT_TOKEN) {\n if (!conveyorApiUrl) {\n logger.error(\"CONVEYOR_API_URL is required for codespace bootstrap\");\n process.exit(1);\n }\n await bootstrapFromCodespace(conveyorApiUrl, INSTANCE_NAME);\n conveyorApiUrl = process.env.CONVEYOR_API_URL ?? conveyorApiUrl;\n}\n\n// Step 2: Read env vars (bootstrap may have set them)\nconst CONVEYOR_PROJECT_TOKEN = process.env.CONVEYOR_PROJECT_TOKEN;\nconst CONVEYOR_PROJECT_ID = process.env.CONVEYOR_PROJECT_ID;\n\n// Step 3: Branch on mode\nif (CONVEYOR_PROJECT_TOKEN && CONVEYOR_PROJECT_ID) {\n const CONVEYOR_PROJECT_DIR = process.env.CONVEYOR_WORKSPACE ?? process.cwd();\n\n if (!conveyorApiUrl) {\n logger.error(\"CONVEYOR_API_URL is required for project runner mode\");\n process.exit(1);\n }\n\n logger.info(\"Starting project runner\", { projectId: CONVEYOR_PROJECT_ID });\n\n const runner = new ProjectRunner({\n conveyorApiUrl,\n projectToken: CONVEYOR_PROJECT_TOKEN,\n projectId: CONVEYOR_PROJECT_ID,\n projectDir: CONVEYOR_PROJECT_DIR,\n });\n\n process.on(\"SIGTERM\", () => {\n logger.info(\"Received SIGTERM, stopping project runner\");\n void runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGTERM timeout\");\n process.exit(1);\n }, 40_000).unref();\n });\n\n process.on(\"SIGINT\", () => {\n logger.info(\"Received SIGINT, stopping project runner\");\n void runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGINT timeout\");\n process.exit(1);\n }, 40_000).unref();\n });\n\n runner.start().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Project runner failed\", { error: msg });\n process.exit(1);\n });\n} else {\n const CONVEYOR_TASK_TOKEN = process.env.CONVEYOR_TASK_TOKEN;\n const CONVEYOR_TASK_ID = process.env.CONVEYOR_TASK_ID;\n const CONVEYOR_WORKSPACE = process.env.CONVEYOR_WORKSPACE ?? process.cwd();\n const CONVEYOR_MODE = (process.env.CONVEYOR_MODE ?? \"task\") as RunnerMode;\n const CONVEYOR_AGENT_MODE = process.env.CONVEYOR_AGENT_MODE || undefined;\n const CONVEYOR_IS_AUTO = CONVEYOR_AGENT_MODE\n ? CONVEYOR_AGENT_MODE === \"auto\"\n : process.env.CONVEYOR_IS_AUTO === \"true\";\n\n if (!CONVEYOR_TASK_TOKEN || !CONVEYOR_TASK_ID) {\n logger.error(\"Missing required environment variables\");\n logger.error(\" CONVEYOR_TASK_TOKEN - JWT token for task authentication\");\n logger.error(\" CONVEYOR_TASK_ID - ID of the task to execute\");\n logger.error(\"\");\n logger.error(\"CONVEYOR_API_URL is provided via codespace secret or bootstrap.\");\n logger.error(\"\");\n logger.error(\"Optional:\");\n logger.error(\" CONVEYOR_MODE - Runner mode: 'task' (default) or 'pm'\");\n logger.error(\" CONVEYOR_WORKSPACE - Working directory (defaults to cwd)\");\n process.exit(1);\n }\n\n if (CONVEYOR_MODE !== \"task\" && CONVEYOR_MODE !== \"pm\" && CONVEYOR_MODE !== \"code-review\") {\n logger.error(\"Invalid CONVEYOR_MODE\", {\n mode: CONVEYOR_MODE,\n expected: [\"task\", \"pm\", \"code-review\"],\n });\n process.exit(1);\n }\n\n logger.info(\"Starting agent\", { mode: CONVEYOR_MODE });\n\n const runner = new SessionRunner(\n {\n connection: {\n apiUrl: conveyorApiUrl ?? \"\",\n taskToken: CONVEYOR_TASK_TOKEN,\n // CONVEYOR_SESSION_ID is the CodespaceSession ID for BaseService ACL.\n // Falls back to CONVEYOR_TASK_ID for backward compat (codespace bootstrap sets only task ID).\n sessionId: process.env.CONVEYOR_SESSION_ID ?? CONVEYOR_TASK_ID,\n runnerMode: CONVEYOR_MODE,\n },\n runnerMode: CONVEYOR_MODE,\n isAuto: CONVEYOR_IS_AUTO,\n workspaceDir: CONVEYOR_WORKSPACE,\n agentMode: CONVEYOR_AGENT_MODE as import(\"@project/shared\").AgentMode | undefined,\n },\n {\n onStatusChange: (status: AgentRunnerStatus) => {\n logger.info(\"Status changed\", { status });\n },\n onEvent: (event: Record<string, unknown>) => {\n const detail =\n (event.message as string) ?? (event.content as string) ?? (event.summary as string) ?? \"\";\n if (detail) {\n logger.info(detail, { eventType: event.type as string });\n }\n },\n },\n );\n\n process.on(\"SIGTERM\", () => {\n logger.info(\"Received SIGTERM, stopping agent\");\n runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGTERM timeout\");\n process.exit(1);\n }, 5_000).unref();\n });\n\n process.on(\"SIGINT\", () => {\n logger.info(\"Received SIGINT, stopping agent\");\n runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGINT timeout\");\n process.exit(1);\n }, 5_000).unref();\n });\n\n runner.start().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Agent runner failed\", { error: msg });\n process.exit(1);\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { SessionRunner } from \"./runner/session-runner.js\";\nimport { ProjectRunner } from \"./runner/project-runner.js\";\nimport type { AgentRunnerStatus, RunnerMode } from \"@project/shared\";\nimport { createServiceLogger } from \"./utils/logger.js\";\n\n// Handle --version flag before any other initialization\nif (process.argv.includes(\"--version\")) {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(__dirname, \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n process.stdout.write(pkg.version + \"\\n\");\n process.exit(0);\n}\n\nconst logger = createServiceLogger(\"CLI\");\n\nasync function bootstrapFromCodespace(apiUrl: string, instanceName: string): Promise<void> {\n logger.info(\"Bootstrapping from codespace\", { codespace: instanceName });\n const response = await fetch(`${apiUrl}/api/codespace/bootstrap/${instanceName}`);\n if (!response.ok) {\n const errorText = await response.text();\n logger.error(\"Bootstrap failed\", { status: response.status, body: errorText });\n process.exit(1);\n }\n const config = (await response.json()) as {\n mode?: \"task\" | \"project\";\n taskId?: string;\n sessionId?: string;\n taskToken?: string;\n runnerMode?: string;\n agentMode?: string;\n isAuto?: string;\n taskBranch?: string;\n projectId?: string;\n projectToken?: string;\n apiUrl?: string;\n workspaceBranch?: string;\n envVars: Record<string, string>;\n };\n\n for (const [key, value] of Object.entries(config.envVars ?? {})) {\n process.env[key] = value;\n }\n\n if (config.mode === \"project\") {\n process.env.CONVEYOR_PROJECT_TOKEN = config.projectToken;\n process.env.CONVEYOR_PROJECT_ID = config.projectId;\n if (config.workspaceBranch) {\n process.env.CONVEYOR_WORKSPACE_BRANCH = config.workspaceBranch;\n }\n logger.info(\"Bootstrap complete (project mode)\", { projectId: config.projectId });\n } else {\n process.env.CONVEYOR_TASK_ID = config.taskId;\n if (config.sessionId) {\n process.env.CONVEYOR_SESSION_ID = config.sessionId;\n }\n process.env.CONVEYOR_TASK_TOKEN = config.taskToken;\n process.env.CONVEYOR_AGENT_MODE = config.agentMode;\n process.env.CONVEYOR_IS_AUTO = config.isAuto;\n if (config.runnerMode) {\n process.env.CONVEYOR_MODE = config.runnerMode;\n }\n if (config.taskBranch) {\n process.env.CONVEYOR_TASK_BRANCH = config.taskBranch;\n }\n logger.info(\"Bootstrap complete\", { taskId: config.taskId });\n }\n}\n\nprocess.on(\"uncaughtException\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EPIPE\") return;\n logger.error(\"Uncaught exception\", { error: err.message, code: err.code });\n process.exit(1);\n});\n\nlet conveyorApiUrl = process.env.CONVEYOR_API_URL;\n\n// Step 1: Codespace bootstrap\nconst INSTANCE_NAME = process.env.CODESPACE_NAME || process.env.CLAUDESPACE_NAME;\nif (INSTANCE_NAME && !process.env.CONVEYOR_TASK_TOKEN && !process.env.CONVEYOR_PROJECT_TOKEN) {\n if (!conveyorApiUrl) {\n logger.error(\"CONVEYOR_API_URL is required for codespace bootstrap\");\n process.exit(1);\n }\n await bootstrapFromCodespace(conveyorApiUrl, INSTANCE_NAME);\n conveyorApiUrl = process.env.CONVEYOR_API_URL ?? conveyorApiUrl;\n}\n\n// Step 2: Read env vars (bootstrap may have set them)\nconst CONVEYOR_PROJECT_TOKEN = process.env.CONVEYOR_PROJECT_TOKEN;\nconst CONVEYOR_PROJECT_ID = process.env.CONVEYOR_PROJECT_ID;\n\n// Step 3: Branch on mode\nif (CONVEYOR_PROJECT_TOKEN && CONVEYOR_PROJECT_ID) {\n const CONVEYOR_PROJECT_DIR = process.env.CONVEYOR_WORKSPACE ?? process.cwd();\n\n if (!conveyorApiUrl) {\n logger.error(\"CONVEYOR_API_URL is required for project runner mode\");\n process.exit(1);\n }\n\n logger.info(\"Starting project runner\", { projectId: CONVEYOR_PROJECT_ID });\n\n const runner = new ProjectRunner({\n conveyorApiUrl,\n projectToken: CONVEYOR_PROJECT_TOKEN,\n projectId: CONVEYOR_PROJECT_ID,\n projectDir: CONVEYOR_PROJECT_DIR,\n });\n\n process.on(\"SIGTERM\", () => {\n logger.info(\"Received SIGTERM, stopping project runner\");\n void runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGTERM timeout\");\n process.exit(1);\n }, 40_000).unref();\n });\n\n process.on(\"SIGINT\", () => {\n logger.info(\"Received SIGINT, stopping project runner\");\n void runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGINT timeout\");\n process.exit(1);\n }, 40_000).unref();\n });\n\n runner.start().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Project runner failed\", { error: msg });\n process.exit(1);\n });\n} else {\n const CONVEYOR_TASK_TOKEN = process.env.CONVEYOR_TASK_TOKEN;\n const CONVEYOR_TASK_ID = process.env.CONVEYOR_TASK_ID;\n const CONVEYOR_WORKSPACE = process.env.CONVEYOR_WORKSPACE ?? process.cwd();\n const CONVEYOR_MODE = (process.env.CONVEYOR_MODE ?? \"task\") as RunnerMode;\n const CONVEYOR_AGENT_MODE = process.env.CONVEYOR_AGENT_MODE || undefined;\n const CONVEYOR_IS_AUTO = CONVEYOR_AGENT_MODE\n ? CONVEYOR_AGENT_MODE === \"auto\"\n : process.env.CONVEYOR_IS_AUTO === \"true\";\n\n if (!CONVEYOR_TASK_TOKEN || !CONVEYOR_TASK_ID) {\n logger.error(\"Missing required environment variables\");\n logger.error(\" CONVEYOR_TASK_TOKEN - JWT token for task authentication\");\n logger.error(\" CONVEYOR_TASK_ID - ID of the task to execute\");\n logger.error(\"\");\n logger.error(\"CONVEYOR_API_URL is provided via codespace secret or bootstrap.\");\n logger.error(\"\");\n logger.error(\"Optional:\");\n logger.error(\" CONVEYOR_MODE - Runner mode: 'task' (default) or 'pm'\");\n logger.error(\" CONVEYOR_WORKSPACE - Working directory (defaults to cwd)\");\n process.exit(1);\n }\n\n if (CONVEYOR_MODE !== \"task\" && CONVEYOR_MODE !== \"pm\" && CONVEYOR_MODE !== \"code-review\") {\n logger.error(\"Invalid CONVEYOR_MODE\", {\n mode: CONVEYOR_MODE,\n expected: [\"task\", \"pm\", \"code-review\"],\n });\n process.exit(1);\n }\n\n logger.info(\"Starting agent\", { mode: CONVEYOR_MODE });\n\n const runner = new SessionRunner(\n {\n connection: {\n apiUrl: conveyorApiUrl ?? \"\",\n taskToken: CONVEYOR_TASK_TOKEN,\n // CONVEYOR_SESSION_ID is the CodespaceSession ID for BaseService ACL.\n // Falls back to CONVEYOR_TASK_ID for backward compat (codespace bootstrap sets only task ID).\n sessionId: process.env.CONVEYOR_SESSION_ID ?? CONVEYOR_TASK_ID,\n runnerMode: CONVEYOR_MODE,\n },\n runnerMode: CONVEYOR_MODE,\n isAuto: CONVEYOR_IS_AUTO,\n workspaceDir: CONVEYOR_WORKSPACE,\n agentMode: CONVEYOR_AGENT_MODE as import(\"@project/shared\").AgentMode | undefined,\n },\n {\n onStatusChange: (status: AgentRunnerStatus) => {\n logger.info(\"Status changed\", { status });\n },\n onEvent: (event: Record<string, unknown>) => {\n const detail =\n (event.message as string) ?? (event.content as string) ?? (event.summary as string) ?? \"\";\n if (detail) {\n logger.info(detail, { eventType: event.type as string });\n }\n },\n },\n );\n\n process.on(\"SIGTERM\", () => {\n logger.info(\"Received SIGTERM, stopping agent\");\n runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGTERM timeout\");\n process.exit(1);\n }, 5_000).unref();\n });\n\n process.on(\"SIGINT\", () => {\n logger.info(\"Received SIGINT, stopping agent\");\n runner.stop();\n setTimeout(() => {\n logger.warn(\"Forcing exit after SIGINT timeout\");\n process.exit(1);\n }, 5_000).unref();\n });\n\n runner.start().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(\"Agent runner failed\", { error: msg });\n process.exit(1);\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _project_shared from '@project/shared';
|
|
2
|
-
import { AgentSessionServiceMethods, AgentMode, AgentQuestion, AgentRunnerStatus, DebugTelemetryEvent, DebugSessionSummary } from '@project/shared';
|
|
2
|
+
import { AgentSessionServiceMethods, AgentMode, AgentQuestion, AgentRunnerStatus, TagAuditRunnerRequest, DebugTelemetryEvent, DebugSessionSummary } from '@project/shared';
|
|
3
3
|
export * from '@project/shared';
|
|
4
4
|
import { ChildProcess } from 'node:child_process';
|
|
5
5
|
|
|
@@ -211,6 +211,7 @@ declare class SessionRunner {
|
|
|
211
211
|
private readonly callbacks;
|
|
212
212
|
private _state;
|
|
213
213
|
private stopped;
|
|
214
|
+
private hasCompleted;
|
|
214
215
|
private interrupted;
|
|
215
216
|
private taskContext;
|
|
216
217
|
private fullContext;
|
|
@@ -318,6 +319,7 @@ declare class ProjectConnection {
|
|
|
318
319
|
ok: boolean;
|
|
319
320
|
error?: string;
|
|
320
321
|
}) => void) => void): void;
|
|
322
|
+
onAuditTags(callback: (request: TagAuditRunnerRequest) => void): void;
|
|
321
323
|
sendHeartbeat(): void;
|
|
322
324
|
sendEvent(event: Record<string, unknown>): void;
|
|
323
325
|
emitStatus(status: "busy" | "idle"): void;
|
|
@@ -351,6 +353,7 @@ declare class ProjectRunner {
|
|
|
351
353
|
stop(): Promise<void>;
|
|
352
354
|
private wireEventHandlers;
|
|
353
355
|
private handleReconnect;
|
|
356
|
+
private handleAuditTags;
|
|
354
357
|
private handleAssignment;
|
|
355
358
|
private handleStopTask;
|
|
356
359
|
private checkoutWorkspaceBranch;
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,9 @@ import {
|
|
|
21
21
|
runStartCommand,
|
|
22
22
|
stageAndCommit,
|
|
23
23
|
updateRemoteToken
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-NZ3IPMLO.js";
|
|
25
|
+
import "./chunk-KNBG2634.js";
|
|
26
|
+
import "./chunk-CYZPFJGN.js";
|
|
25
27
|
|
|
26
28
|
// src/runner/file-cache.ts
|
|
27
29
|
var DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
|