@rallycry/conveyor-agent 7.0.11 → 7.0.13

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/cli.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  loadConveyorConfig,
6
6
  runSetupCommand,
7
7
  runStartCommand
8
- } from "./chunk-OUARAX27.js";
8
+ } from "./chunk-3O4P2KST.js";
9
9
  import "./chunk-KNBG2634.js";
10
10
  import {
11
11
  createServiceLogger
@@ -137,6 +137,7 @@ if (CONVEYOR_PROJECT_TOKEN && CONVEYOR_PROJECT_ID) {
137
137
  process.exit(1);
138
138
  }
139
139
  logger.info("Starting agent", { mode: CONVEYOR_MODE });
140
+ const lifecycleOverrides = process.env.CLAUDESPACE_NAME ? { idleTimeoutMs: 60 * 60 * 1e3, sleepGracePeriodMs: 60 * 1e3 } : void 0;
140
141
  const runner = new SessionRunner(
141
142
  {
142
143
  connection: {
@@ -150,7 +151,8 @@ if (CONVEYOR_PROJECT_TOKEN && CONVEYOR_PROJECT_ID) {
150
151
  runnerMode: CONVEYOR_MODE,
151
152
  isAuto: CONVEYOR_IS_AUTO,
152
153
  workspaceDir: CONVEYOR_WORKSPACE,
153
- agentMode: CONVEYOR_AGENT_MODE
154
+ agentMode: CONVEYOR_AGENT_MODE,
155
+ lifecycle: lifecycleOverrides
154
156
  },
155
157
  {
156
158
  onStatusChange: (status) => {
@@ -221,7 +223,8 @@ if (CONVEYOR_PROJECT_TOKEN && CONVEYOR_PROJECT_ID) {
221
223
  }
222
224
  runner.connection.sendEvent({
223
225
  type: "setup_complete",
224
- startCommandRunning
226
+ startCommandRunning,
227
+ previewPort: conveyorConfig.previewPort
225
228
  });
226
229
  }
227
230
  runner.run().catch((error) => {
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\";\nimport { loadConveyorConfig } from \"./setup/config.js\";\nimport { runSetupCommand, runStartCommand } from \"./setup/commands.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 // Connect first so setup/start output is forwarded to the API\n await runner.connect();\n\n // Run setup and start commands (project-configured dev environment)\n const conveyorConfig = loadConveyorConfig();\n if (conveyorConfig) {\n const logOutput = (stream: \"stdout\" | \"stderr\", data: string) => {\n runner.connection.sendEvent({ type: \"setup_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n };\n if (conveyorConfig.setupCommand) {\n logger.info(\"Running setup command\", { command: conveyorConfig.setupCommand });\n try {\n await runSetupCommand(conveyorConfig.setupCommand, CONVEYOR_WORKSPACE, logOutput);\n logger.info(\"Setup command completed\");\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Setup command failed\";\n logger.error(\"Setup command failed\", { error: msg });\n runner.connection.sendEvent({ type: \"setup_error\", message: msg });\n }\n }\n\n let startCommandRunning = false;\n if (conveyorConfig.startCommand) {\n logger.info(\"Running start command\", { command: conveyorConfig.startCommand });\n const child = runStartCommand(\n conveyorConfig.startCommand,\n CONVEYOR_WORKSPACE,\n (stream, data) => {\n runner.connection.sendEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n },\n );\n startCommandRunning = true;\n child.on(\"exit\", (code, signal) => {\n logger.info(\"Start command exited\", { code, signal });\n runner.connection.sendEvent({ type: \"start_command_exited\", code, signal });\n });\n child.on(\"error\", (err) => {\n logger.error(\"Start command error\", { error: err.message });\n runner.connection.sendEvent({ type: \"setup_error\", message: err.message });\n });\n }\n\n runner.connection.sendEvent({\n type: \"setup_complete\",\n startCommandRunning,\n });\n }\n\n // Start the main agent lifecycle (context fetch, mode resolution, core loop)\n runner.run().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\";\nimport { loadConveyorConfig } from \"./setup/config.js\";\nimport { runSetupCommand, runStartCommand } from \"./setup/commands.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 // Claudespace pods: longer idle timeout to stay alive for incoming messages\n const lifecycleOverrides = process.env.CLAUDESPACE_NAME\n ? { idleTimeoutMs: 60 * 60 * 1000, sleepGracePeriodMs: 60 * 1000 }\n : undefined;\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 lifecycle: lifecycleOverrides,\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 // Connect first so setup/start output is forwarded to the API\n await runner.connect();\n\n // Run setup and start commands (project-configured dev environment)\n const conveyorConfig = loadConveyorConfig();\n if (conveyorConfig) {\n const logOutput = (stream: \"stdout\" | \"stderr\", data: string) => {\n runner.connection.sendEvent({ type: \"setup_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n };\n if (conveyorConfig.setupCommand) {\n logger.info(\"Running setup command\", { command: conveyorConfig.setupCommand });\n try {\n await runSetupCommand(conveyorConfig.setupCommand, CONVEYOR_WORKSPACE, logOutput);\n logger.info(\"Setup command completed\");\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Setup command failed\";\n logger.error(\"Setup command failed\", { error: msg });\n runner.connection.sendEvent({ type: \"setup_error\", message: msg });\n }\n }\n\n let startCommandRunning = false;\n if (conveyorConfig.startCommand) {\n logger.info(\"Running start command\", { command: conveyorConfig.startCommand });\n const child = runStartCommand(\n conveyorConfig.startCommand,\n CONVEYOR_WORKSPACE,\n (stream, data) => {\n runner.connection.sendEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n },\n );\n startCommandRunning = true;\n child.on(\"exit\", (code, signal) => {\n logger.info(\"Start command exited\", { code, signal });\n runner.connection.sendEvent({ type: \"start_command_exited\", code, signal });\n });\n child.on(\"error\", (err) => {\n logger.error(\"Start command error\", { error: err.message });\n runner.connection.sendEvent({ type: \"setup_error\", message: err.message });\n });\n }\n\n runner.connection.sendEvent({\n type: \"setup_complete\",\n startCommandRunning,\n previewPort: conveyorConfig.previewPort,\n });\n }\n\n // Start the main agent lifecycle (context fetch, mode resolution, core loop)\n runner.run().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
@@ -221,6 +221,7 @@ declare class SessionRunner {
221
221
  private stopped;
222
222
  private hasCompleted;
223
223
  private interrupted;
224
+ private _isReviewing;
224
225
  private taskContext;
225
226
  private fullContext;
226
227
  private queryBridge;
@@ -256,6 +257,7 @@ declare class SessionRunner {
256
257
  */
257
258
  private shouldSkipMessage;
258
259
  private coreLoop;
260
+ /** Returns true if an initial query was executed, false otherwise. */
259
261
  private executeInitialMode;
260
262
  private waitForMessage;
261
263
  /** Inject a message (from connection callback or external source) */
@@ -268,6 +270,7 @@ declare class SessionRunner {
268
270
  private needsPRNudge;
269
271
  private refreshTaskContext;
270
272
  private maybeSendPRNudge;
273
+ private maybeTransitionToReview;
271
274
  private buildFullContext;
272
275
  private createQueryBridge;
273
276
  private wireConnectionCallbacks;
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  runStartCommand,
24
24
  stageAndCommit,
25
25
  updateRemoteToken
26
- } from "./chunk-OUARAX27.js";
26
+ } from "./chunk-3O4P2KST.js";
27
27
  import "./chunk-KNBG2634.js";
28
28
  import "./chunk-CYZPFJGN.js";
29
29
 
@@ -94,7 +94,7 @@ Each recommendation must include:
94
94
  - \`payload\`: Type-specific data:
95
95
  - create_tag: \`{ name: string, description: string, contextPaths?: string[] }\`
96
96
  - update_description: \`{ description: string }\`
97
- - add_context_link: \`{ path: string, description?: string }\`
97
+ - add_context_link: \`{ type: "rule" | "doc" | "file" | "folder", path: string, label?: string }\`
98
98
  - documentation_gap: \`{ area: string, suggestedContent?: string }\`
99
99
  - merge_tags: \`{ sourceTagIds: string[], targetName: string }\`
100
100
  - rename_tag: \`{ newName: string }\`
@@ -213,4 +213,4 @@ export {
213
213
  buildTagAuditPrompt,
214
214
  handleTagAudit
215
215
  };
216
- //# sourceMappingURL=tag-audit-handler-L7YPDXTA.js.map
216
+ //# sourceMappingURL=tag-audit-handler-PACJJEDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runner/tag-audit-handler.ts"],"sourcesContent":["import { createHarness } from \"../harness/index.js\";\nimport type { ProjectConnection } from \"../connection/project-connection.js\";\nimport type { TagAuditRunnerRequest } from \"@project/shared\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"TagAudit\");\n\nconst FALLBACK_MODEL = \"claude-sonnet-4-20250514\";\n\n// ── Prompt section builders ────────────────────────────────────────────\n\nfunction buildTagsSection(request: TagAuditRunnerRequest, parts: string[]): void {\n parts.push(\"## Current Tags\\n\");\n if (request.tags.length === 0) {\n parts.push(\"No tags currently exist.\\n\");\n } else {\n for (const tag of request.tags) {\n parts.push(`### ${tag.name} (id: ${tag.id})`);\n parts.push(`- Description: ${tag.description ?? \"(none)\"}`);\n parts.push(`- Active tasks: ${tag.activeTaskCount}`);\n if (tag.contextPaths) {\n parts.push(`- Context paths: ${JSON.stringify(tag.contextPaths)}`);\n }\n parts.push(\"\");\n }\n }\n}\n\nfunction buildContextSections(request: TagAuditRunnerRequest, parts: string[]): void {\n if (request.objectives && request.objectives.length > 0) {\n parts.push(\"## Project Objectives\\n\");\n for (const obj of request.objectives) {\n parts.push(`- **${obj.name}**${obj.description ? `: ${obj.description}` : \"\"}`);\n }\n parts.push(\"\");\n }\n\n if (request.tagRules && request.tagRules.length > 0) {\n parts.push(\"## Tag Rules\\n\");\n parts.push(\"These tags have associated rule files that agents load automatically:\\n\");\n for (const rule of request.tagRules) {\n parts.push(`- **${rule.tagName}** → \\`${rule.rulePath}\\``);\n }\n parts.push(\"\");\n }\n\n if (request.fileHeatmap.length > 0) {\n parts.push(\"## File Access Heatmap\\n\");\n parts.push(\"Files most frequently read by agents, broken down by tag:\\n\");\n for (const entry of request.fileHeatmap.slice(0, 50)) {\n const tagBreakdown = Object.entries(entry.byTag)\n .map(([tag, count]) => `${tag}: ${count}`)\n .join(\", \");\n parts.push(`- \\`${entry.filePath}\\` (total: ${entry.totalReads}) — ${tagBreakdown}`);\n }\n parts.push(\"\");\n }\n\n if (request.recentTaskSamples && request.recentTaskSamples.length > 0) {\n parts.push(\"## Recent Task Samples\\n\");\n parts.push(\"Recent tasks per tag (to understand how tags are used):\\n\");\n for (const sample of request.recentTaskSamples) {\n parts.push(`### ${sample.tagName}`);\n for (const task of sample.tasks) {\n parts.push(`- ${task.title} (${task.status})`);\n }\n parts.push(\"\");\n }\n }\n}\n\n// ── Prompt builder ──────────────────────────────────────────────────────\n\nexport function buildTagAuditPrompt(request: TagAuditRunnerRequest): string {\n const parts: string[] = [];\n\n parts.push(`# Tag Audit for project: ${request.projectName}\\n`);\n buildTagsSection(request, parts);\n buildContextSections(request, parts);\n parts.push(\"Analyze the tags above and the codebase, then output your recommendations.\");\n\n return parts.join(\"\\n\");\n}\n\nconst TAG_AUDIT_SYSTEM_PROMPT = `You are analyzing tags for a software project. Tags are used to organize tasks, associate context paths (files/directories that agents should read), and track work areas.\n\nGiven the current tags (with descriptions, context paths, and active task counts) and a file access heatmap (which files agents read most, broken down by tag), analyze the project and generate recommendations.\n\nYou have full access to the codebase. Read relevant files — especially .claude/rules/, README files, and any context paths referenced by existing tags — to validate your recommendations.\n\nGenerate recommendations of these types:\n- **create_tag**: Suggest new tags for uncovered areas of the codebase\n- **update_description**: Improve a tag's description to be more useful\n- **add_context_link**: Add context paths (files/directories) that agents should read when working on tasks with this tag\n- **documentation_gap**: Identify areas where documentation or context is missing\n- **merge_tags**: Suggest merging overlapping tags\n- **rename_tag**: Suggest a better name for a tag\n\nEach recommendation must include:\n- \\`id\\`: A unique UUID\n- \\`type\\`: One of the types above\n- \\`tagName\\`: The tag name this applies to\n- \\`tagId\\`: The existing tag's ID (if modifying an existing tag, omit for create_tag)\n- \\`suggestion\\`: A short description of the recommendation\n- \\`reasoning\\`: Why this recommendation would help\n- \\`payload\\`: Type-specific data:\n - create_tag: \\`{ name: string, description: string, contextPaths?: string[] }\\`\n - update_description: \\`{ description: string }\\`\n - add_context_link: \\`{ type: \"rule\" | \"doc\" | \"file\" | \"folder\", path: string, label?: string }\\`\n - documentation_gap: \\`{ area: string, suggestedContent?: string }\\`\n - merge_tags: \\`{ sourceTagIds: string[], targetName: string }\\`\n - rename_tag: \\`{ newName: string }\\`\n\nAfter your analysis, output a JSON block in this exact format:\n\n\\`\\`\\`json\n{\n \"recommendations\": [ ...array of recommendations... ],\n \"summary\": \"Brief summary of findings\"\n}\n\\`\\`\\`\n\nAlways provide recommendations. Even well-organized projects have room for improvement — look for missing context links, stale descriptions, documentation gaps, and tag coverage opportunities. Aim for at least 3-5 recommendations. Be specific, actionable, and concise.`;\n\n// ── Fetch agent context ─────────────────────────────────────────────────\n\nasync function fetchModel(connection: ProjectConnection): Promise<string> {\n try {\n const ctx = await connection.call(\"getProjectAgentContext\", {\n projectId: connection.projectId,\n });\n return ctx.model || FALLBACK_MODEL;\n } catch {\n return FALLBACK_MODEL;\n }\n}\n\n// ── JSON extraction ─────────────────────────────────────────────────────\n\nfunction extractJsonFromResponse(text: string): { recommendations: unknown[]; summary: string } {\n // Try to find a JSON code block first\n const codeBlockMatch = text.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n const jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n if (parsed && Array.isArray(parsed.recommendations) && typeof parsed.summary === \"string\") {\n return parsed;\n }\n } catch {\n // Try to find a JSON object in the raw text\n const objectMatch = text.match(/\\{[\\s\\S]*\"recommendations\"[\\s\\S]*\\}/);\n if (objectMatch) {\n try {\n const parsed = JSON.parse(objectMatch[0]);\n if (parsed && Array.isArray(parsed.recommendations)) {\n return { recommendations: parsed.recommendations, summary: parsed.summary ?? \"\" };\n }\n } catch {\n // Fall through\n }\n }\n }\n\n throw new Error(\"Could not parse tag audit recommendations from Claude response\");\n}\n\n// ── Event stream processing ─────────────────────────────────────────────\n\nasync function collectResponseFromEvents(\n events: AsyncIterable<{ type: string }>,\n connection: ProjectConnection,\n requestId: string,\n): Promise<string> {\n const responseParts: string[] = [];\n for await (const event of events) {\n if (event.type === \"assistant\") {\n const { message } = event as {\n type: string;\n message: {\n content: Array<{ type: string; text?: string; name?: string; input?: unknown }>;\n };\n };\n for (const block of message.content) {\n if (block.type === \"text\" && block.text) {\n responseParts.push(block.text);\n } else if (block.type === \"tool_use\" && block.name) {\n const inputStr =\n typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n await connection\n .call(\"reportTagAuditProgress\", {\n projectId: connection.projectId,\n requestId,\n activity: {\n tool: block.name,\n input: inputStr.slice(0, 10_000),\n timestamp: new Date().toISOString(),\n },\n })\n .catch(() => {});\n }\n }\n }\n if (event.type === \"result\") break;\n }\n return responseParts.join(\"\\n\\n\").trim();\n}\n\n// ── Main handler ────────────────────────────────────────────────────────\n\nexport async function handleTagAudit(\n request: TagAuditRunnerRequest,\n connection: ProjectConnection,\n projectDir: string,\n): Promise<void> {\n const { requestId } = request;\n\n logger.info(\"Starting tag audit\", { requestId, tagCount: request.tags.length });\n\n await connection\n .call(\"reportTagAuditProgress\", {\n projectId: connection.projectId,\n requestId,\n activity: {\n tool: \"audit\",\n input: \"Starting tag audit...\",\n timestamp: new Date().toISOString(),\n },\n })\n .catch(() => {});\n\n const model = await fetchModel(connection);\n const harness = createHarness();\n const events = harness.executeQuery({\n prompt: buildTagAuditPrompt(request),\n options: {\n model,\n systemPrompt: TAG_AUDIT_SYSTEM_PROMPT,\n cwd: projectDir,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n mcpServers: {},\n maxTurns: 8,\n maxBudgetUsd: 5,\n },\n });\n\n const responseText = await collectResponseFromEvents(events, connection, requestId);\n if (!responseText) throw new Error(\"No response from Claude\");\n\n const { recommendations, summary } = extractJsonFromResponse(responseText);\n logger.info(\"Tag audit complete\", { requestId, recommendationCount: recommendations.length });\n\n await connection.call(\"reportTagAuditResult\", {\n projectId: connection.projectId,\n requestId,\n recommendations: recommendations as Array<Record<string, unknown>>,\n summary,\n complete: true,\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rallycry/conveyor-agent",
3
- "version": "7.0.11",
3
+ "version": "7.0.13",
4
4
  "description": "Conveyor Agent Runner v7.0 - Agent-as-User architecture with BaseService patterns",
5
5
  "keywords": [
6
6
  "agent",