@rallycry/conveyor-agent 7.0.8 → 7.0.10
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-PMDVB2EU.js → chunk-BOFWZIL6.js} +699 -250
- package/dist/chunk-BOFWZIL6.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +14 -2
- package/dist/index.js +1 -1
- package/dist/{tag-audit-handler-4RRGIHVB.js → tag-audit-handler-L7YPDXTA.js} +40 -8
- package/dist/tag-audit-handler-L7YPDXTA.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-PMDVB2EU.js.map +0 -1
- package/dist/tag-audit-handler-4RRGIHVB.js.map +0 -1
package/dist/cli.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ interface AgentConnectionConfig {
|
|
|
21
21
|
interface IncomingMessage {
|
|
22
22
|
content: string;
|
|
23
23
|
userId: string;
|
|
24
|
+
source?: string;
|
|
24
25
|
files?: Array<{
|
|
25
26
|
name: string;
|
|
26
27
|
content: string;
|
|
@@ -68,7 +69,7 @@ declare class AgentConnection {
|
|
|
68
69
|
onModeChange(callback: (data: SetModeData) => void): void;
|
|
69
70
|
onWake(callback: () => void): void;
|
|
70
71
|
onApiKeyUpdate(callback: (data: ApiKeyUpdateData) => void): void;
|
|
71
|
-
emitStatus(status: string): void
|
|
72
|
+
emitStatus(status: string): Promise<void>;
|
|
72
73
|
postChatMessage(content: string): void;
|
|
73
74
|
private isDuplicateMessage;
|
|
74
75
|
sendHeartbeat(): void;
|
|
@@ -104,7 +105,7 @@ declare class AgentConnection {
|
|
|
104
105
|
}>;
|
|
105
106
|
refreshAuthToken(): Promise<boolean>;
|
|
106
107
|
sendEvent(event: Record<string, unknown>): void;
|
|
107
|
-
flushEvents(): void
|
|
108
|
+
flushEvents(): Promise<void>;
|
|
108
109
|
}
|
|
109
110
|
|
|
110
111
|
type ModeAction = {
|
|
@@ -243,6 +244,17 @@ declare class SessionRunner {
|
|
|
243
244
|
run(): Promise<void>;
|
|
244
245
|
/** Convenience wrapper: connect() then run(). */
|
|
245
246
|
start(): Promise<void>;
|
|
247
|
+
/**
|
|
248
|
+
* Returns true if the message should be skipped (not processed).
|
|
249
|
+
*
|
|
250
|
+
* After the agent has completed, we only process:
|
|
251
|
+
* 1. Critical automated sources (e.g. CI failure) — always process
|
|
252
|
+
* 2. Messages with source: "user" — real user typed in chat
|
|
253
|
+
* 3. Messages from flushAllCombined — have a real userId but no source
|
|
254
|
+
*
|
|
255
|
+
* Everything else (system messages, stale history replays) is skipped.
|
|
256
|
+
*/
|
|
257
|
+
private shouldSkipMessage;
|
|
246
258
|
private coreLoop;
|
|
247
259
|
private executeInitialMode;
|
|
248
260
|
private waitForMessage;
|
package/dist/index.js
CHANGED
|
@@ -8,10 +8,7 @@ import {
|
|
|
8
8
|
// src/runner/tag-audit-handler.ts
|
|
9
9
|
var logger = createServiceLogger("TagAudit");
|
|
10
10
|
var FALLBACK_MODEL = "claude-sonnet-4-20250514";
|
|
11
|
-
function
|
|
12
|
-
const parts = [];
|
|
13
|
-
parts.push(`# Tag Audit for project: ${request.projectName}
|
|
14
|
-
`);
|
|
11
|
+
function buildTagsSection(request, parts) {
|
|
15
12
|
parts.push("## Current Tags\n");
|
|
16
13
|
if (request.tags.length === 0) {
|
|
17
14
|
parts.push("No tags currently exist.\n");
|
|
@@ -26,6 +23,23 @@ function buildTagAuditPrompt(request) {
|
|
|
26
23
|
parts.push("");
|
|
27
24
|
}
|
|
28
25
|
}
|
|
26
|
+
}
|
|
27
|
+
function buildContextSections(request, parts) {
|
|
28
|
+
if (request.objectives && request.objectives.length > 0) {
|
|
29
|
+
parts.push("## Project Objectives\n");
|
|
30
|
+
for (const obj of request.objectives) {
|
|
31
|
+
parts.push(`- **${obj.name}**${obj.description ? `: ${obj.description}` : ""}`);
|
|
32
|
+
}
|
|
33
|
+
parts.push("");
|
|
34
|
+
}
|
|
35
|
+
if (request.tagRules && request.tagRules.length > 0) {
|
|
36
|
+
parts.push("## Tag Rules\n");
|
|
37
|
+
parts.push("These tags have associated rule files that agents load automatically:\n");
|
|
38
|
+
for (const rule of request.tagRules) {
|
|
39
|
+
parts.push(`- **${rule.tagName}** \u2192 \`${rule.rulePath}\``);
|
|
40
|
+
}
|
|
41
|
+
parts.push("");
|
|
42
|
+
}
|
|
29
43
|
if (request.fileHeatmap.length > 0) {
|
|
30
44
|
parts.push("## File Access Heatmap\n");
|
|
31
45
|
parts.push("Files most frequently read by agents, broken down by tag:\n");
|
|
@@ -35,6 +49,24 @@ function buildTagAuditPrompt(request) {
|
|
|
35
49
|
}
|
|
36
50
|
parts.push("");
|
|
37
51
|
}
|
|
52
|
+
if (request.recentTaskSamples && request.recentTaskSamples.length > 0) {
|
|
53
|
+
parts.push("## Recent Task Samples\n");
|
|
54
|
+
parts.push("Recent tasks per tag (to understand how tags are used):\n");
|
|
55
|
+
for (const sample of request.recentTaskSamples) {
|
|
56
|
+
parts.push(`### ${sample.tagName}`);
|
|
57
|
+
for (const task of sample.tasks) {
|
|
58
|
+
parts.push(`- ${task.title} (${task.status})`);
|
|
59
|
+
}
|
|
60
|
+
parts.push("");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function buildTagAuditPrompt(request) {
|
|
65
|
+
const parts = [];
|
|
66
|
+
parts.push(`# Tag Audit for project: ${request.projectName}
|
|
67
|
+
`);
|
|
68
|
+
buildTagsSection(request, parts);
|
|
69
|
+
buildContextSections(request, parts);
|
|
38
70
|
parts.push("Analyze the tags above and the codebase, then output your recommendations.");
|
|
39
71
|
return parts.join("\n");
|
|
40
72
|
}
|
|
@@ -76,7 +108,7 @@ After your analysis, output a JSON block in this exact format:
|
|
|
76
108
|
}
|
|
77
109
|
\`\`\`
|
|
78
110
|
|
|
79
|
-
|
|
111
|
+
Always provide recommendations. Even well-organized projects have room for improvement \u2014 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.`;
|
|
80
112
|
async function fetchModel(connection) {
|
|
81
113
|
try {
|
|
82
114
|
const ctx = await connection.call("getProjectAgentContext", {
|
|
@@ -161,8 +193,8 @@ async function handleTagAudit(request, connection, projectDir) {
|
|
|
161
193
|
allowDangerouslySkipPermissions: true,
|
|
162
194
|
tools: { type: "preset", preset: "claude_code" },
|
|
163
195
|
mcpServers: {},
|
|
164
|
-
maxTurns:
|
|
165
|
-
maxBudgetUsd:
|
|
196
|
+
maxTurns: 8,
|
|
197
|
+
maxBudgetUsd: 5
|
|
166
198
|
}
|
|
167
199
|
});
|
|
168
200
|
const responseText = await collectResponseFromEvents(events, connection, requestId);
|
|
@@ -181,4 +213,4 @@ export {
|
|
|
181
213
|
buildTagAuditPrompt,
|
|
182
214
|
handleTagAudit
|
|
183
215
|
};
|
|
184
|
-
//# sourceMappingURL=tag-audit-handler-
|
|
216
|
+
//# sourceMappingURL=tag-audit-handler-L7YPDXTA.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: \\`{ path: string, description?: 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":[]}
|