@mcoda/core 0.1.8 → 0.1.11
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/CHANGELOG.md +3 -0
- package/README.md +2 -2
- package/dist/api/AgentsApi.d.ts +9 -1
- package/dist/api/AgentsApi.d.ts.map +1 -1
- package/dist/api/AgentsApi.js +201 -6
- package/dist/api/QaTasksApi.d.ts.map +1 -1
- package/dist/api/QaTasksApi.js +6 -0
- package/dist/api/TasksApi.d.ts.map +1 -1
- package/dist/api/TasksApi.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/prompts/PdrPrompts.d.ts.map +1 -1
- package/dist/prompts/PdrPrompts.js +9 -1
- package/dist/prompts/SdsPrompts.d.ts.map +1 -1
- package/dist/prompts/SdsPrompts.js +9 -0
- package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
- package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingFormula.js +45 -0
- package/dist/services/agents/AgentRatingService.d.ts +60 -0
- package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
- package/dist/services/agents/AgentRatingService.js +363 -0
- package/dist/services/agents/GatewayAgentService.d.ts +11 -0
- package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
- package/dist/services/agents/GatewayAgentService.js +525 -84
- package/dist/services/agents/GatewayHandoff.d.ts +11 -0
- package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
- package/dist/services/agents/GatewayHandoff.js +141 -0
- package/dist/services/agents/RoutingService.d.ts +1 -0
- package/dist/services/agents/RoutingService.d.ts.map +1 -1
- package/dist/services/agents/RoutingService.js +4 -4
- package/dist/services/backlog/BacklogService.d.ts +23 -0
- package/dist/services/backlog/BacklogService.d.ts.map +1 -1
- package/dist/services/backlog/BacklogService.js +62 -7
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
- package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
- package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
- package/dist/services/backlog/TaskOrderingService.d.ts +17 -4
- package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
- package/dist/services/backlog/TaskOrderingService.js +538 -79
- package/dist/services/docs/DocInventory.d.ts +11 -0
- package/dist/services/docs/DocInventory.d.ts.map +1 -0
- package/dist/services/docs/DocInventory.js +230 -0
- package/dist/services/docs/DocgenRunContext.d.ts +59 -0
- package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
- package/dist/services/docs/DocgenRunContext.js +4 -0
- package/dist/services/docs/DocsService.d.ts +70 -3
- package/dist/services/docs/DocsService.d.ts.map +1 -1
- package/dist/services/docs/DocsService.js +1930 -89
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
- package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
- package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
- package/dist/services/docs/patch/DocPatchEngine.js +331 -0
- package/dist/services/docs/review/Glossary.d.ts +16 -0
- package/dist/services/docs/review/Glossary.d.ts.map +1 -0
- package/dist/services/docs/review/Glossary.js +47 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
- package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
- package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewReportSchema.js +47 -0
- package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
- package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
- package/dist/services/docs/review/ReviewTypes.js +94 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
- package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
- package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
- package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
- package/dist/services/docs/review/glossary.json +47 -0
- package/dist/services/estimate/EstimateService.d.ts +2 -0
- package/dist/services/estimate/EstimateService.d.ts.map +1 -1
- package/dist/services/estimate/EstimateService.js +66 -18
- package/dist/services/estimate/VelocityService.d.ts +4 -0
- package/dist/services/estimate/VelocityService.d.ts.map +1 -1
- package/dist/services/estimate/VelocityService.js +179 -36
- package/dist/services/estimate/types.d.ts +1 -0
- package/dist/services/estimate/types.d.ts.map +1 -1
- package/dist/services/execution/GatewayTrioService.d.ts +200 -0
- package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
- package/dist/services/execution/GatewayTrioService.js +2492 -0
- package/dist/services/execution/QaApiRunner.d.ts +30 -0
- package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
- package/dist/services/execution/QaApiRunner.js +881 -0
- package/dist/services/execution/QaFollowupService.d.ts +2 -0
- package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
- package/dist/services/execution/QaFollowupService.js +9 -2
- package/dist/services/execution/QaPlanValidator.d.ts +10 -0
- package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
- package/dist/services/execution/QaPlanValidator.js +128 -0
- package/dist/services/execution/QaProfileService.d.ts +27 -1
- package/dist/services/execution/QaProfileService.d.ts.map +1 -1
- package/dist/services/execution/QaProfileService.js +354 -7
- package/dist/services/execution/QaTasksService.d.ts +59 -1
- package/dist/services/execution/QaTasksService.d.ts.map +1 -1
- package/dist/services/execution/QaTasksService.js +3347 -318
- package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
- package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
- package/dist/services/execution/QaTestCommandBuilder.js +495 -0
- package/dist/services/execution/TaskSelectionService.d.ts +4 -2
- package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
- package/dist/services/execution/TaskSelectionService.js +144 -28
- package/dist/services/execution/TaskStateService.d.ts +19 -6
- package/dist/services/execution/TaskStateService.d.ts.map +1 -1
- package/dist/services/execution/TaskStateService.js +128 -13
- package/dist/services/execution/WorkOnTasksService.d.ts +32 -1
- package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
- package/dist/services/execution/WorkOnTasksService.js +4667 -722
- package/dist/services/jobs/JobInsightsService.d.ts +4 -0
- package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
- package/dist/services/jobs/JobInsightsService.js +51 -5
- package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
- package/dist/services/jobs/JobResumeService.js +23 -10
- package/dist/services/jobs/JobService.d.ts +56 -4
- package/dist/services/jobs/JobService.d.ts.map +1 -1
- package/dist/services/jobs/JobService.js +232 -1
- package/dist/services/openapi/OpenApiService.d.ts +51 -0
- package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
- package/dist/services/openapi/OpenApiService.js +953 -106
- package/dist/services/planning/CreateTasksService.d.ts +21 -0
- package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
- package/dist/services/planning/CreateTasksService.js +569 -31
- package/dist/services/planning/RefineTasksService.d.ts +9 -0
- package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
- package/dist/services/planning/RefineTasksService.js +409 -59
- package/dist/services/review/CodeReviewService.d.ts +18 -0
- package/dist/services/review/CodeReviewService.d.ts.map +1 -1
- package/dist/services/review/CodeReviewService.js +1309 -167
- package/dist/services/review/ReviewNormalizer.d.ts +9 -0
- package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
- package/dist/services/review/ReviewNormalizer.js +147 -0
- package/dist/services/shared/AuthErrors.d.ts +3 -0
- package/dist/services/shared/AuthErrors.d.ts.map +1 -0
- package/dist/services/shared/AuthErrors.js +17 -0
- package/dist/services/shared/DocdexGuidance.d.ts +7 -0
- package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
- package/dist/services/shared/DocdexGuidance.js +12 -0
- package/dist/services/shared/ProjectGuidance.d.ts +17 -0
- package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
- package/dist/services/shared/ProjectGuidance.js +78 -0
- package/dist/services/system/ToolDenylist.d.ts +13 -0
- package/dist/services/system/ToolDenylist.d.ts.map +1 -0
- package/dist/services/system/ToolDenylist.js +85 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
- package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
- package/dist/services/tasks/TaskCommentFormatter.js +54 -0
- package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
- package/dist/services/telemetry/TelemetryService.js +39 -7
- package/dist/workspace/WorkspaceManager.d.ts +26 -0
- package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
- package/dist/workspace/WorkspaceManager.js +206 -32
- package/package.json +6 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReviewAgentResult } from "./CodeReviewService.js";
|
|
2
|
+
export interface ReviewNormalizationResult {
|
|
3
|
+
result: ReviewAgentResult;
|
|
4
|
+
parsedFromJson: boolean;
|
|
5
|
+
usedFallback: boolean;
|
|
6
|
+
issues: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const normalizeReviewOutput: (raw: string) => ReviewNormalizationResult;
|
|
9
|
+
//# sourceMappingURL=ReviewNormalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReviewNormalizer.d.ts","sourceRoot":"","sources":["../../../src/services/review/ReviewNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,wBAAwB,CAAC;AAE/E,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAgID,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,KAAG,yBAoBnD,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
const VALID_DECISIONS = [
|
|
2
|
+
"approve",
|
|
3
|
+
"changes_requested",
|
|
4
|
+
"block",
|
|
5
|
+
"info_only",
|
|
6
|
+
];
|
|
7
|
+
const DEFAULT_SUMMARY = "Review output was unstructured; treated as informational.";
|
|
8
|
+
const normalizeDecision = (value) => {
|
|
9
|
+
if (!value)
|
|
10
|
+
return undefined;
|
|
11
|
+
const normalized = value.trim().toLowerCase();
|
|
12
|
+
if (!normalized)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (normalized === "approved")
|
|
15
|
+
return "approve";
|
|
16
|
+
if (VALID_DECISIONS.includes(normalized)) {
|
|
17
|
+
return normalized;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
};
|
|
21
|
+
const decisionFromText = (raw) => {
|
|
22
|
+
const normalized = raw.toLowerCase();
|
|
23
|
+
const explicit = normalized.match(/decision\\s*[:=-]?\\s*(approve|approved|changes_requested|changes requested|block|info_only)/i);
|
|
24
|
+
if (explicit) {
|
|
25
|
+
const mapped = explicit[1]?.replace(" ", "_");
|
|
26
|
+
return normalizeDecision(mapped) ?? "info_only";
|
|
27
|
+
}
|
|
28
|
+
if (/(block|reject|fatal|critical)/i.test(normalized))
|
|
29
|
+
return "block";
|
|
30
|
+
if (/(changes_requested|changes requested|request changes)/i.test(normalized))
|
|
31
|
+
return "changes_requested";
|
|
32
|
+
if (/(approve|approved|looks good|ship it)/i.test(normalized))
|
|
33
|
+
return "approve";
|
|
34
|
+
return "info_only";
|
|
35
|
+
};
|
|
36
|
+
const summaryFromText = (raw) => {
|
|
37
|
+
const match = raw.match(/summary\\s*[:=-]?\\s*(.+)/i);
|
|
38
|
+
if (match?.[1]) {
|
|
39
|
+
const summary = match[1].trim();
|
|
40
|
+
if (summary)
|
|
41
|
+
return summary;
|
|
42
|
+
}
|
|
43
|
+
const firstLine = raw.split(/\\r?\\n/).find((line) => line.trim());
|
|
44
|
+
return firstLine?.trim() || undefined;
|
|
45
|
+
};
|
|
46
|
+
const sanitizeFindings = (findings) => {
|
|
47
|
+
if (!Array.isArray(findings))
|
|
48
|
+
return [];
|
|
49
|
+
return findings.filter((finding) => Boolean(finding && typeof finding === "object"));
|
|
50
|
+
};
|
|
51
|
+
const coerceResult = (raw, partial, forcedDecision) => {
|
|
52
|
+
const decision = normalizeDecision(partial.decision) ?? forcedDecision ?? decisionFromText(raw);
|
|
53
|
+
const summary = partial.summary?.trim() || summaryFromText(raw) || DEFAULT_SUMMARY;
|
|
54
|
+
return {
|
|
55
|
+
decision,
|
|
56
|
+
summary,
|
|
57
|
+
findings: sanitizeFindings(partial.findings),
|
|
58
|
+
testRecommendations: Array.isArray(partial.testRecommendations) ? partial.testRecommendations : [],
|
|
59
|
+
resolvedSlugs: Array.isArray(partial.resolvedSlugs) ? partial.resolvedSlugs : undefined,
|
|
60
|
+
unresolvedSlugs: Array.isArray(partial.unresolvedSlugs) ? partial.unresolvedSlugs : undefined,
|
|
61
|
+
raw,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const extractJsonCandidates = (raw) => {
|
|
65
|
+
const candidates = [];
|
|
66
|
+
if (!raw)
|
|
67
|
+
return candidates;
|
|
68
|
+
const fenceRegex = /```(?:json)?\\s*([\\s\\S]*?)```/gi;
|
|
69
|
+
let match = fenceRegex.exec(raw);
|
|
70
|
+
while (match) {
|
|
71
|
+
const fenced = match[1]?.trim();
|
|
72
|
+
if (fenced)
|
|
73
|
+
candidates.push(fenced);
|
|
74
|
+
match = fenceRegex.exec(raw);
|
|
75
|
+
}
|
|
76
|
+
const text = raw;
|
|
77
|
+
let inString = false;
|
|
78
|
+
let escape = false;
|
|
79
|
+
let depth = 0;
|
|
80
|
+
let startIndex = -1;
|
|
81
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
82
|
+
const ch = text[i] ?? "";
|
|
83
|
+
if (inString) {
|
|
84
|
+
if (escape) {
|
|
85
|
+
escape = false;
|
|
86
|
+
}
|
|
87
|
+
else if (ch === "\\\\") {
|
|
88
|
+
escape = true;
|
|
89
|
+
}
|
|
90
|
+
else if (ch === "\"") {
|
|
91
|
+
inString = false;
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (ch === "\"") {
|
|
96
|
+
inString = true;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (ch === "{") {
|
|
100
|
+
if (depth === 0)
|
|
101
|
+
startIndex = i;
|
|
102
|
+
depth += 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (ch === "}" && depth > 0) {
|
|
106
|
+
depth -= 1;
|
|
107
|
+
if (depth === 0 && startIndex >= 0) {
|
|
108
|
+
const candidate = text.slice(startIndex, i + 1).trim();
|
|
109
|
+
if (candidate)
|
|
110
|
+
candidates.push(candidate);
|
|
111
|
+
startIndex = -1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return candidates;
|
|
116
|
+
};
|
|
117
|
+
const parseJsonCandidate = (candidate) => {
|
|
118
|
+
try {
|
|
119
|
+
const parsed = JSON.parse(candidate);
|
|
120
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
121
|
+
return undefined;
|
|
122
|
+
return parsed;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
export const normalizeReviewOutput = (raw) => {
|
|
129
|
+
const issues = [];
|
|
130
|
+
const candidates = extractJsonCandidates(raw);
|
|
131
|
+
for (const candidate of candidates) {
|
|
132
|
+
const parsed = parseJsonCandidate(candidate);
|
|
133
|
+
if (parsed) {
|
|
134
|
+
const result = coerceResult(raw, parsed);
|
|
135
|
+
if (!normalizeDecision(parsed.decision)) {
|
|
136
|
+
issues.push("coerced_decision");
|
|
137
|
+
}
|
|
138
|
+
if (!parsed.summary) {
|
|
139
|
+
issues.push("coerced_summary");
|
|
140
|
+
}
|
|
141
|
+
return { result, parsedFromJson: true, usedFallback: false, issues };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const fallback = coerceResult(raw, {}, "info_only");
|
|
145
|
+
issues.push("non_json_output");
|
|
146
|
+
return { result: fallback, parsedFromJson: false, usedFallback: true, issues };
|
|
147
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthErrors.d.ts","sourceRoot":"","sources":["../../../src/services/shared/AuthErrors.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,GAAG,IAAI,KAAG,OAG5D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const AUTH_ERROR_PATTERNS = [
|
|
2
|
+
/auth_error/i,
|
|
3
|
+
/usage_limit_reached/i,
|
|
4
|
+
/too many requests/i,
|
|
5
|
+
/http\s*429/i,
|
|
6
|
+
/rate limit/i,
|
|
7
|
+
/usage limit/i,
|
|
8
|
+
/invalid[_\s-]*api[_\s-]*key/i,
|
|
9
|
+
/no openai api key/i,
|
|
10
|
+
/insufficient[_\s-]*quota/i,
|
|
11
|
+
];
|
|
12
|
+
export const AUTH_ERROR_REASON = "auth_error";
|
|
13
|
+
export const isAuthErrorMessage = (message) => {
|
|
14
|
+
if (!message)
|
|
15
|
+
return false;
|
|
16
|
+
return AUTH_ERROR_PATTERNS.some((pattern) => pattern.test(message));
|
|
17
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type DocdexGuidanceOptions = {
|
|
2
|
+
contextLabel: string;
|
|
3
|
+
includeHeading?: boolean;
|
|
4
|
+
includeFallback?: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare const buildDocdexUsageGuidance: ({ contextLabel, includeHeading, includeFallback, }: DocdexGuidanceOptions) => string;
|
|
7
|
+
//# sourceMappingURL=DocdexGuidance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocdexGuidance.d.ts","sourceRoot":"","sources":["../../../src/services/shared/DocdexGuidance.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAKF,eAAO,MAAM,wBAAwB,GAAI,oDAItC,qBAAqB,KAAG,MAY1B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const DOCDEX_QUERY_EXAMPLE = "`docdexd search --repo <workspaceRoot> --query \"<query>\"` or `DOCDEX_REPO=<workspaceRoot> docdexd search --query \"<query>\"`";
|
|
2
|
+
export const buildDocdexUsageGuidance = ({ contextLabel, includeHeading = false, includeFallback = true, }) => {
|
|
3
|
+
const lines = [];
|
|
4
|
+
if (includeHeading) {
|
|
5
|
+
lines.push("## Docdex Usage (required)");
|
|
6
|
+
}
|
|
7
|
+
lines.push("Docdex context is injected by mcoda; do not run docdexd directly.");
|
|
8
|
+
lines.push(`If more context is needed, list the exact docdex queries in ${contextLabel} and always scope to the repo (example: ${DOCDEX_QUERY_EXAMPLE}).`);
|
|
9
|
+
const fallback = includeFallback ? " and fall back to local docs." : ".";
|
|
10
|
+
lines.push(`If docdex is unavailable or returns no results, say so in ${contextLabel}${fallback}`);
|
|
11
|
+
return lines.join("\n");
|
|
12
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ProjectGuidance = {
|
|
2
|
+
content: string;
|
|
3
|
+
source: string;
|
|
4
|
+
};
|
|
5
|
+
export declare const isDocContextExcluded: (value: string | undefined, allowQaDocs?: boolean) => boolean;
|
|
6
|
+
export declare const normalizeDocType: (params: {
|
|
7
|
+
docType?: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
content?: string;
|
|
11
|
+
}) => {
|
|
12
|
+
docType: string;
|
|
13
|
+
downgraded: boolean;
|
|
14
|
+
reason?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const loadProjectGuidance: (workspaceRoot: string, mcodaDir?: string) => Promise<ProjectGuidance | null>;
|
|
17
|
+
//# sourceMappingURL=ProjectGuidance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectGuidance.d.ts","sourceRoot":"","sources":["../../../src/services/shared/ProjectGuidance.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAeF,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,GAAG,SAAS,EAAE,qBAAmB,KAAG,OAMrF,CAAC;AAoBF,eAAO,MAAM,gBAAgB,GAAI,QAAQ;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,KAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAe1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,MAAM,EACrB,WAAW,MAAM,KAChB,OAAO,CAAC,eAAe,GAAG,IAAI,CAchC,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { PathHelper } from "@mcoda/shared";
|
|
4
|
+
const QA_DOC_PATTERN = /(^|[\\/])(qa|e2e)([-_/]|$)/i;
|
|
5
|
+
const MCODA_DOC_PATTERN = /(^|[\\/])\.mcoda([\\/]|$)/i;
|
|
6
|
+
const SDS_DOC_PATTERN = /(^|[\\/])docs[\\/]+sds([\\/]|$)/i;
|
|
7
|
+
const FRONTMATTER_BLOCK = /^---[\s\S]*?\n---/;
|
|
8
|
+
const guidanceCandidates = (workspaceRoot, mcodaDir) => {
|
|
9
|
+
const resolvedMcodaDir = mcodaDir ?? PathHelper.getWorkspaceDir(workspaceRoot);
|
|
10
|
+
return [
|
|
11
|
+
path.join(resolvedMcodaDir, "docs", "project-guidance.md"),
|
|
12
|
+
path.join(workspaceRoot, "docs", "project-guidance.md"),
|
|
13
|
+
];
|
|
14
|
+
};
|
|
15
|
+
export const isDocContextExcluded = (value, allowQaDocs = false) => {
|
|
16
|
+
if (!value)
|
|
17
|
+
return false;
|
|
18
|
+
const normalized = value.replace(/\\/g, "/");
|
|
19
|
+
if (MCODA_DOC_PATTERN.test(normalized))
|
|
20
|
+
return true;
|
|
21
|
+
if (!allowQaDocs && QA_DOC_PATTERN.test(normalized))
|
|
22
|
+
return true;
|
|
23
|
+
return false;
|
|
24
|
+
};
|
|
25
|
+
const extractFrontmatter = (content) => {
|
|
26
|
+
if (!content)
|
|
27
|
+
return undefined;
|
|
28
|
+
const trimmed = content.trimStart();
|
|
29
|
+
if (!trimmed.startsWith("---"))
|
|
30
|
+
return undefined;
|
|
31
|
+
const match = trimmed.match(FRONTMATTER_BLOCK);
|
|
32
|
+
return match ? match[0] : undefined;
|
|
33
|
+
};
|
|
34
|
+
const hasSdsFrontmatter = (content) => {
|
|
35
|
+
if (!content)
|
|
36
|
+
return false;
|
|
37
|
+
const frontmatter = extractFrontmatter(content);
|
|
38
|
+
if (!frontmatter)
|
|
39
|
+
return false;
|
|
40
|
+
if (/(doc_type|doctype|docType|type)\s*:\s*sds\b/i.test(frontmatter))
|
|
41
|
+
return true;
|
|
42
|
+
if (/(tags?|categories)\s*:\s*\[?[^\n]*\bsds\b/i.test(frontmatter))
|
|
43
|
+
return true;
|
|
44
|
+
if (/sds\s*:\s*true/i.test(frontmatter))
|
|
45
|
+
return true;
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
export const normalizeDocType = (params) => {
|
|
49
|
+
const raw = (params.docType ?? "DOC").trim();
|
|
50
|
+
const normalizedType = raw ? raw.toUpperCase() : "DOC";
|
|
51
|
+
if (normalizedType !== "SDS") {
|
|
52
|
+
return { docType: normalizedType || "DOC", downgraded: false };
|
|
53
|
+
}
|
|
54
|
+
const pathValue = params.path ?? params.title ?? "";
|
|
55
|
+
const normalizedPath = pathValue.replace(/\\/g, "/");
|
|
56
|
+
const inSdsPath = SDS_DOC_PATTERN.test(normalizedPath);
|
|
57
|
+
const frontmatter = hasSdsFrontmatter(params.content);
|
|
58
|
+
if (inSdsPath || frontmatter) {
|
|
59
|
+
return { docType: "SDS", downgraded: false };
|
|
60
|
+
}
|
|
61
|
+
const reason = [inSdsPath ? null : "path_not_sds", frontmatter ? null : "frontmatter_missing"].filter(Boolean).join("|");
|
|
62
|
+
return { docType: "DOC", downgraded: true, reason: reason || "not_sds" };
|
|
63
|
+
};
|
|
64
|
+
export const loadProjectGuidance = async (workspaceRoot, mcodaDir) => {
|
|
65
|
+
for (const candidate of guidanceCandidates(workspaceRoot, mcodaDir)) {
|
|
66
|
+
try {
|
|
67
|
+
const content = (await fs.readFile(candidate, "utf8")).trim();
|
|
68
|
+
if (!content)
|
|
69
|
+
continue;
|
|
70
|
+
return { content, source: candidate };
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// ignore missing file
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
console.warn(`[project-guidance] no project guidance found; searched: ${guidanceCandidates(workspaceRoot, mcodaDir).join(", ")}`);
|
|
77
|
+
return null;
|
|
78
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ToolDenylist {
|
|
2
|
+
private readonly entries;
|
|
3
|
+
private constructor();
|
|
4
|
+
static load(options?: {
|
|
5
|
+
mcodaDir?: string;
|
|
6
|
+
env?: NodeJS.ProcessEnv;
|
|
7
|
+
}): Promise<ToolDenylist>;
|
|
8
|
+
list(): string[];
|
|
9
|
+
match(name: string): string | undefined;
|
|
10
|
+
findMatch(names: Array<string | undefined>): string | undefined;
|
|
11
|
+
formatViolation(matched: string): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ToolDenylist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolDenylist.d.ts","sourceRoot":"","sources":["../../../src/services/system/ToolDenylist.ts"],"names":[],"mappings":"AA6CA,qBAAa,YAAY;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA5C,OAAO;WAEM,IAAI,CAAC,OAAO,GAAE;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;KACpB,GAAG,OAAO,CAAC,YAAY,CAAC;IAc9B,IAAI,IAAI,MAAM,EAAE;IAIhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKvC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS;IAS/D,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAOzC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_DENYLIST = ["gpt-creator"];
|
|
4
|
+
const DEFAULT_ALTERNATIVES = new Map([
|
|
5
|
+
["gpt-creator", ["codex", "local-model"]],
|
|
6
|
+
]);
|
|
7
|
+
const parseDelimitedList = (value) => {
|
|
8
|
+
if (!value)
|
|
9
|
+
return [];
|
|
10
|
+
return value
|
|
11
|
+
.split(",")
|
|
12
|
+
.map((entry) => entry.trim())
|
|
13
|
+
.filter(Boolean);
|
|
14
|
+
};
|
|
15
|
+
const normalizeToolName = (value) => value.trim().toLowerCase();
|
|
16
|
+
const parseConfigList = (value) => {
|
|
17
|
+
if (!value)
|
|
18
|
+
return [];
|
|
19
|
+
if (Array.isArray(value)) {
|
|
20
|
+
return value.filter((entry) => typeof entry === "string");
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === "string") {
|
|
23
|
+
return parseDelimitedList(value);
|
|
24
|
+
}
|
|
25
|
+
return [];
|
|
26
|
+
};
|
|
27
|
+
const readConfigDenylist = async (mcodaDir) => {
|
|
28
|
+
if (!mcodaDir)
|
|
29
|
+
return [];
|
|
30
|
+
const configPath = path.join(mcodaDir, "config.json");
|
|
31
|
+
try {
|
|
32
|
+
const raw = await fs.readFile(configPath, "utf8");
|
|
33
|
+
const parsed = JSON.parse(raw);
|
|
34
|
+
const configured = parsed?.tools?.denylist ??
|
|
35
|
+
parsed?.toolDenylist ??
|
|
36
|
+
parsed?.tool_denylist;
|
|
37
|
+
return parseConfigList(configured);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export class ToolDenylist {
|
|
44
|
+
constructor(entries) {
|
|
45
|
+
this.entries = entries;
|
|
46
|
+
}
|
|
47
|
+
static async load(options = {}) {
|
|
48
|
+
const env = options.env ?? process.env;
|
|
49
|
+
const configEntries = await readConfigDenylist(options.mcodaDir);
|
|
50
|
+
const envEntries = parseDelimitedList(env.MCODA_TOOL_DENYLIST);
|
|
51
|
+
const combined = [...DEFAULT_DENYLIST, ...configEntries, ...envEntries];
|
|
52
|
+
const entries = new Map();
|
|
53
|
+
for (const name of combined) {
|
|
54
|
+
const normalized = normalizeToolName(name);
|
|
55
|
+
if (!normalized || entries.has(normalized))
|
|
56
|
+
continue;
|
|
57
|
+
entries.set(normalized, DEFAULT_ALTERNATIVES.get(normalized) ?? []);
|
|
58
|
+
}
|
|
59
|
+
return new ToolDenylist(entries);
|
|
60
|
+
}
|
|
61
|
+
list() {
|
|
62
|
+
return Array.from(this.entries.keys());
|
|
63
|
+
}
|
|
64
|
+
match(name) {
|
|
65
|
+
const normalized = normalizeToolName(name);
|
|
66
|
+
return this.entries.has(normalized) ? normalized : undefined;
|
|
67
|
+
}
|
|
68
|
+
findMatch(names) {
|
|
69
|
+
for (const name of names) {
|
|
70
|
+
if (!name)
|
|
71
|
+
continue;
|
|
72
|
+
const match = this.match(name);
|
|
73
|
+
if (match)
|
|
74
|
+
return match;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
formatViolation(matched) {
|
|
79
|
+
const alternatives = this.entries.get(matched) ?? [];
|
|
80
|
+
const suggestion = alternatives.length
|
|
81
|
+
? `Suggested alternatives: ${alternatives.join(", ")}.`
|
|
82
|
+
: "Use a supported agent or tool instead.";
|
|
83
|
+
return `Tool '${matched}' is deprecated and blocked by the tool denylist. ${suggestion}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TaskCommentSlugInput {
|
|
2
|
+
source: string;
|
|
3
|
+
message: string;
|
|
4
|
+
file?: string | null;
|
|
5
|
+
line?: number | null;
|
|
6
|
+
category?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export interface TaskCommentFormatInput {
|
|
9
|
+
slug: string;
|
|
10
|
+
source: string;
|
|
11
|
+
message: string;
|
|
12
|
+
status?: string | null;
|
|
13
|
+
category?: string | null;
|
|
14
|
+
file?: string | null;
|
|
15
|
+
line?: number | null;
|
|
16
|
+
suggestedFix?: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare const createTaskCommentSlug: (input: TaskCommentSlugInput) => string;
|
|
19
|
+
export declare const formatTaskCommentBody: (input: TaskCommentFormatInput) => string;
|
|
20
|
+
//# sourceMappingURL=TaskCommentFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskCommentFormatter.d.ts","sourceRoot":"","sources":["../../../src/services/tasks/TaskCommentFormatter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAiBD,eAAO,MAAM,qBAAqB,GAAI,OAAO,oBAAoB,KAAG,MAiBnE,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,sBAAsB,KAAG,MAyBrE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
const slugify = (value) => value
|
|
3
|
+
.toLowerCase()
|
|
4
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
5
|
+
.replace(/^-+|-+$/g, "")
|
|
6
|
+
.replace(/-{2,}/g, "-");
|
|
7
|
+
const normalizePath = (value) => value
|
|
8
|
+
.replace(/\\/g, "/")
|
|
9
|
+
.replace(/^\.\//, "")
|
|
10
|
+
.replace(/^\/+/, "");
|
|
11
|
+
const buildStableHash = (input) => createHash("sha1").update(input).digest("hex").slice(0, 8);
|
|
12
|
+
export const createTaskCommentSlug = (input) => {
|
|
13
|
+
const baseParts = [
|
|
14
|
+
input.source,
|
|
15
|
+
input.category ?? undefined,
|
|
16
|
+
input.file ? normalizePath(input.file) : undefined,
|
|
17
|
+
typeof input.line === "number" ? `L${input.line}` : undefined,
|
|
18
|
+
].filter(Boolean);
|
|
19
|
+
const base = slugify(baseParts.join("-")) || "comment";
|
|
20
|
+
const trimmedBase = base.length > 60 ? base.slice(0, 60).replace(/-+$/g, "") : base;
|
|
21
|
+
const hashInput = [
|
|
22
|
+
input.source,
|
|
23
|
+
input.category ?? "",
|
|
24
|
+
input.file ?? "",
|
|
25
|
+
typeof input.line === "number" ? String(input.line) : "",
|
|
26
|
+
input.message.trim(),
|
|
27
|
+
].join("|");
|
|
28
|
+
return `${trimmedBase || "comment"}-${buildStableHash(hashInput)}`;
|
|
29
|
+
};
|
|
30
|
+
export const formatTaskCommentBody = (input) => {
|
|
31
|
+
const message = input.message.trim() || "(no details provided)";
|
|
32
|
+
const suggestedFix = input.suggestedFix?.trim();
|
|
33
|
+
const location = input.file && typeof input.line === "number"
|
|
34
|
+
? `${normalizePath(input.file)}:${input.line}`
|
|
35
|
+
: input.file
|
|
36
|
+
? normalizePath(input.file)
|
|
37
|
+
: undefined;
|
|
38
|
+
const lines = [
|
|
39
|
+
"[task-comment]",
|
|
40
|
+
`slug: ${input.slug}`,
|
|
41
|
+
`source: ${input.source}`,
|
|
42
|
+
input.category ? `category: ${input.category}` : undefined,
|
|
43
|
+
`status: ${input.status ?? "open"}`,
|
|
44
|
+
location ? `location: ${location}` : undefined,
|
|
45
|
+
"message:",
|
|
46
|
+
message,
|
|
47
|
+
].filter(Boolean);
|
|
48
|
+
if (suggestedFix) {
|
|
49
|
+
lines.push("");
|
|
50
|
+
lines.push("suggested_fix:");
|
|
51
|
+
lines.push(suggestedFix);
|
|
52
|
+
}
|
|
53
|
+
return lines.join("\n");
|
|
54
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../../src/services/telemetry/TelemetryService.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,aAAa,EAAE,oBAAoB,EAAE,KAAK,eAAe,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvI,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,KAAK,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7F,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../../src/services/telemetry/TelemetryService.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,aAAa,EAAE,oBAAoB,EAAE,KAAK,eAAe,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvI,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,KAAK,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7F,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAqGD,qBAAa,gBAAgB;IAMP,OAAO,CAAC,SAAS;IALrC,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,MAAM,CAAC,CAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,CAAW;IACtB,OAAO,CAAC,UAAU,CAAC,CAAa;IAEhC,OAAO;WAMM,MAAM,CACjB,SAAS,EAAE,mBAAmB,EAC9B,OAAO,GAAE;QAAE,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACtE,OAAO,CAAC,gBAAgB,CAAC;IA6BtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,KAAK,UAAU,GAErB;YAEa,cAAc;YASd,eAAe;YAKf,gBAAgB;YAMhB,aAAa;YAOb,cAAc;IAc5B,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,SAAS;IAWX,UAAU,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA+HlF,aAAa,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAwH7E,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAqB1C,MAAM,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAerD,KAAK,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAc7C"}
|
|
@@ -161,7 +161,8 @@ export class TelemetryService {
|
|
|
161
161
|
const filtered = [];
|
|
162
162
|
for (const row of rows) {
|
|
163
163
|
const metadata = parseMetadata(row.metadata_json);
|
|
164
|
-
const commandName =
|
|
164
|
+
const commandName = row.command_name ??
|
|
165
|
+
metadata.commandName ??
|
|
165
166
|
metadata.command_name ??
|
|
166
167
|
metadata.command;
|
|
167
168
|
if (options.command && commandName && options.command !== commandName) {
|
|
@@ -232,11 +233,15 @@ export class TelemetryService {
|
|
|
232
233
|
const filtered = this.filterRows(rows, { command: options.command });
|
|
233
234
|
const summary = new Map();
|
|
234
235
|
for (const { row, metadata } of filtered) {
|
|
235
|
-
const commandName =
|
|
236
|
+
const commandName = row.command_name ??
|
|
237
|
+
metadata.commandName ??
|
|
236
238
|
metadata.command_name ??
|
|
237
239
|
metadata.command ??
|
|
238
240
|
null;
|
|
239
|
-
const action =
|
|
241
|
+
const action = row.action ??
|
|
242
|
+
metadata.action ??
|
|
243
|
+
metadata.phase ??
|
|
244
|
+
null;
|
|
240
245
|
const keyParts = groupBy.map((dim) => {
|
|
241
246
|
switch (dim) {
|
|
242
247
|
case "project":
|
|
@@ -273,6 +278,10 @@ export class TelemetryService {
|
|
|
273
278
|
tokens_prompt: 0,
|
|
274
279
|
tokens_completion: 0,
|
|
275
280
|
tokens_total: 0,
|
|
281
|
+
tokens_cached: 0,
|
|
282
|
+
tokens_cache_read: 0,
|
|
283
|
+
tokens_cache_write: 0,
|
|
284
|
+
duration_ms: 0,
|
|
276
285
|
cost_estimate: null,
|
|
277
286
|
};
|
|
278
287
|
summary.set(key, record);
|
|
@@ -281,6 +290,14 @@ export class TelemetryService {
|
|
|
281
290
|
record.tokens_prompt += row.tokens_prompt ?? 0;
|
|
282
291
|
record.tokens_completion += row.tokens_completion ?? 0;
|
|
283
292
|
record.tokens_total += row.tokens_total ?? 0;
|
|
293
|
+
record.tokens_cached = (record.tokens_cached ?? 0) + (row.tokens_cached ?? 0);
|
|
294
|
+
record.tokens_cache_read = (record.tokens_cache_read ?? 0) + (row.tokens_cache_read ?? 0);
|
|
295
|
+
record.tokens_cache_write = (record.tokens_cache_write ?? 0) + (row.tokens_cache_write ?? 0);
|
|
296
|
+
const durationMs = row.duration_ms ??
|
|
297
|
+
(row.duration_seconds != null ? Math.round(row.duration_seconds * 1000) : null);
|
|
298
|
+
if (durationMs != null) {
|
|
299
|
+
record.duration_ms = (record.duration_ms ?? 0) + durationMs;
|
|
300
|
+
}
|
|
284
301
|
record.cost_estimate = addCost(record.cost_estimate, row.cost_estimate);
|
|
285
302
|
}
|
|
286
303
|
return Array.from(summary.values());
|
|
@@ -338,15 +355,21 @@ export class TelemetryService {
|
|
|
338
355
|
const filtered = this.filterRows(rows, { command: options.command });
|
|
339
356
|
const mapped = filtered
|
|
340
357
|
.map(({ row, metadata }) => {
|
|
341
|
-
const commandName =
|
|
358
|
+
const commandName = row.command_name ??
|
|
359
|
+
metadata.commandName ??
|
|
342
360
|
metadata.command_name ??
|
|
343
361
|
metadata.command ??
|
|
344
362
|
null;
|
|
345
|
-
const action =
|
|
363
|
+
const action = row.action ??
|
|
364
|
+
metadata.action ??
|
|
365
|
+
metadata.phase ??
|
|
366
|
+
null;
|
|
346
367
|
const errorKind = metadata.error_kind ??
|
|
347
368
|
metadata.errorKind ??
|
|
348
369
|
metadata.error ??
|
|
349
370
|
null;
|
|
371
|
+
const durationMs = row.duration_ms ??
|
|
372
|
+
(row.duration_seconds != null ? Math.round(row.duration_seconds * 1000) : null);
|
|
350
373
|
return {
|
|
351
374
|
workspace_id: row.workspace_id,
|
|
352
375
|
agent_id: row.agent_id,
|
|
@@ -358,14 +381,23 @@ export class TelemetryService {
|
|
|
358
381
|
project_id: row.project_id,
|
|
359
382
|
epic_id: row.epic_id,
|
|
360
383
|
user_story_id: row.user_story_id,
|
|
384
|
+
command_name: commandName,
|
|
385
|
+
action,
|
|
386
|
+
invocation_kind: row.invocation_kind ?? null,
|
|
387
|
+
provider: row.provider ?? null,
|
|
388
|
+
currency: row.currency ?? null,
|
|
361
389
|
tokens_prompt: row.tokens_prompt,
|
|
362
390
|
tokens_completion: row.tokens_completion,
|
|
363
391
|
tokens_total: row.tokens_total,
|
|
392
|
+
tokens_cached: row.tokens_cached ?? null,
|
|
393
|
+
tokens_cache_read: row.tokens_cache_read ?? null,
|
|
394
|
+
tokens_cache_write: row.tokens_cache_write ?? null,
|
|
364
395
|
cost_estimate: row.cost_estimate,
|
|
365
396
|
duration_seconds: row.duration_seconds,
|
|
397
|
+
duration_ms: durationMs ?? null,
|
|
398
|
+
started_at: row.started_at ?? null,
|
|
399
|
+
finished_at: row.finished_at ?? null,
|
|
366
400
|
timestamp: row.timestamp,
|
|
367
|
-
command_name: commandName,
|
|
368
|
-
action,
|
|
369
401
|
error_kind: errorKind,
|
|
370
402
|
metadata,
|
|
371
403
|
};
|
|
@@ -6,6 +6,7 @@ export interface WorkspaceResolution {
|
|
|
6
6
|
mcodaDir: string;
|
|
7
7
|
workspaceDbPath: string;
|
|
8
8
|
globalDbPath: string;
|
|
9
|
+
noRepoWrites?: boolean;
|
|
9
10
|
config?: WorkspaceConfig;
|
|
10
11
|
}
|
|
11
12
|
export interface TelemetryPreferences {
|
|
@@ -18,6 +19,17 @@ export interface WorkspaceConfig {
|
|
|
18
19
|
mirrorDocs?: boolean;
|
|
19
20
|
branch?: string;
|
|
20
21
|
docdexUrl?: string;
|
|
22
|
+
docdexRepoId?: string;
|
|
23
|
+
reviewJsonAgent?: string;
|
|
24
|
+
projectKey?: string;
|
|
25
|
+
restrictAutoMergeWithoutScope?: boolean;
|
|
26
|
+
autoMerge?: boolean;
|
|
27
|
+
autoPush?: boolean;
|
|
28
|
+
codexNoSandbox?: boolean;
|
|
29
|
+
qa?: {
|
|
30
|
+
cleanIgnorePaths?: string[];
|
|
31
|
+
runAllMarkerRequired?: boolean;
|
|
32
|
+
};
|
|
21
33
|
velocity?: {
|
|
22
34
|
implementationSpPerHour?: number;
|
|
23
35
|
reviewSpPerHour?: number;
|
|
@@ -26,10 +38,24 @@ export interface WorkspaceConfig {
|
|
|
26
38
|
};
|
|
27
39
|
telemetry?: TelemetryPreferences;
|
|
28
40
|
}
|
|
41
|
+
export declare const cleanupWorkspaceStateDirs: (input: {
|
|
42
|
+
workspaceRoot: string;
|
|
43
|
+
mcodaDir: string;
|
|
44
|
+
}) => Promise<string[]>;
|
|
45
|
+
export declare const resolveDocgenStatePath: (input: {
|
|
46
|
+
outputPath: string;
|
|
47
|
+
mcodaDir: string;
|
|
48
|
+
jobId: string;
|
|
49
|
+
commandName: string;
|
|
50
|
+
}) => {
|
|
51
|
+
statePath: string;
|
|
52
|
+
warnings: string[];
|
|
53
|
+
};
|
|
29
54
|
export declare class WorkspaceResolver {
|
|
30
55
|
static resolveWorkspace(input: {
|
|
31
56
|
cwd?: string;
|
|
32
57
|
explicitWorkspace?: string;
|
|
58
|
+
noRepoWrites?: boolean;
|
|
33
59
|
}): Promise<WorkspaceResolution>;
|
|
34
60
|
}
|
|
35
61
|
//# sourceMappingURL=WorkspaceManager.d.ts.map
|