@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.
Files changed (216) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +2 -2
  3. package/dist/api/AgentsApi.d.ts +9 -1
  4. package/dist/api/AgentsApi.d.ts.map +1 -1
  5. package/dist/api/AgentsApi.js +201 -6
  6. package/dist/api/QaTasksApi.d.ts.map +1 -1
  7. package/dist/api/QaTasksApi.js +6 -0
  8. package/dist/api/TasksApi.d.ts.map +1 -1
  9. package/dist/api/TasksApi.js +1 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/prompts/PdrPrompts.d.ts.map +1 -1
  14. package/dist/prompts/PdrPrompts.js +9 -1
  15. package/dist/prompts/SdsPrompts.d.ts.map +1 -1
  16. package/dist/prompts/SdsPrompts.js +9 -0
  17. package/dist/services/agents/AgentRatingFormula.d.ts +27 -0
  18. package/dist/services/agents/AgentRatingFormula.d.ts.map +1 -0
  19. package/dist/services/agents/AgentRatingFormula.js +45 -0
  20. package/dist/services/agents/AgentRatingService.d.ts +60 -0
  21. package/dist/services/agents/AgentRatingService.d.ts.map +1 -0
  22. package/dist/services/agents/AgentRatingService.js +363 -0
  23. package/dist/services/agents/GatewayAgentService.d.ts +11 -0
  24. package/dist/services/agents/GatewayAgentService.d.ts.map +1 -1
  25. package/dist/services/agents/GatewayAgentService.js +525 -84
  26. package/dist/services/agents/GatewayHandoff.d.ts +11 -0
  27. package/dist/services/agents/GatewayHandoff.d.ts.map +1 -0
  28. package/dist/services/agents/GatewayHandoff.js +141 -0
  29. package/dist/services/agents/RoutingService.d.ts +1 -0
  30. package/dist/services/agents/RoutingService.d.ts.map +1 -1
  31. package/dist/services/agents/RoutingService.js +4 -4
  32. package/dist/services/backlog/BacklogService.d.ts +23 -0
  33. package/dist/services/backlog/BacklogService.d.ts.map +1 -1
  34. package/dist/services/backlog/BacklogService.js +62 -7
  35. package/dist/services/backlog/TaskOrderingHeuristics.d.ts +12 -0
  36. package/dist/services/backlog/TaskOrderingHeuristics.d.ts.map +1 -0
  37. package/dist/services/backlog/TaskOrderingHeuristics.js +56 -0
  38. package/dist/services/backlog/TaskOrderingService.d.ts +17 -4
  39. package/dist/services/backlog/TaskOrderingService.d.ts.map +1 -1
  40. package/dist/services/backlog/TaskOrderingService.js +538 -79
  41. package/dist/services/docs/DocInventory.d.ts +11 -0
  42. package/dist/services/docs/DocInventory.d.ts.map +1 -0
  43. package/dist/services/docs/DocInventory.js +230 -0
  44. package/dist/services/docs/DocgenRunContext.d.ts +59 -0
  45. package/dist/services/docs/DocgenRunContext.d.ts.map +1 -0
  46. package/dist/services/docs/DocgenRunContext.js +4 -0
  47. package/dist/services/docs/DocsService.d.ts +70 -3
  48. package/dist/services/docs/DocsService.d.ts.map +1 -1
  49. package/dist/services/docs/DocsService.js +1930 -89
  50. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts +23 -0
  51. package/dist/services/docs/alignment/DocAlignmentGraph.d.ts.map +1 -0
  52. package/dist/services/docs/alignment/DocAlignmentGraph.js +78 -0
  53. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts +19 -0
  54. package/dist/services/docs/alignment/DocAlignmentPatcher.d.ts.map +1 -0
  55. package/dist/services/docs/alignment/DocAlignmentPatcher.js +222 -0
  56. package/dist/services/docs/patch/DocPatchEngine.d.ts +57 -0
  57. package/dist/services/docs/patch/DocPatchEngine.d.ts.map +1 -0
  58. package/dist/services/docs/patch/DocPatchEngine.js +331 -0
  59. package/dist/services/docs/review/Glossary.d.ts +16 -0
  60. package/dist/services/docs/review/Glossary.d.ts.map +1 -0
  61. package/dist/services/docs/review/Glossary.js +47 -0
  62. package/dist/services/docs/review/ReviewReportRenderer.d.ts +3 -0
  63. package/dist/services/docs/review/ReviewReportRenderer.d.ts.map +1 -0
  64. package/dist/services/docs/review/ReviewReportRenderer.js +133 -0
  65. package/dist/services/docs/review/ReviewReportSchema.d.ts +39 -0
  66. package/dist/services/docs/review/ReviewReportSchema.d.ts.map +1 -0
  67. package/dist/services/docs/review/ReviewReportSchema.js +47 -0
  68. package/dist/services/docs/review/ReviewTypes.d.ts +76 -0
  69. package/dist/services/docs/review/ReviewTypes.d.ts.map +1 -0
  70. package/dist/services/docs/review/ReviewTypes.js +94 -0
  71. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts +7 -0
  72. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.d.ts.map +1 -0
  73. package/dist/services/docs/review/gates/AdminOpenApiSpecGate.js +93 -0
  74. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts +7 -0
  75. package/dist/services/docs/review/gates/ApiPathConsistencyGate.d.ts.map +1 -0
  76. package/dist/services/docs/review/gates/ApiPathConsistencyGate.js +308 -0
  77. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts +8 -0
  78. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.d.ts.map +1 -0
  79. package/dist/services/docs/review/gates/BuildReadyCompletenessGate.js +278 -0
  80. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts +8 -0
  81. package/dist/services/docs/review/gates/DeploymentBlueprintGate.d.ts.map +1 -0
  82. package/dist/services/docs/review/gates/DeploymentBlueprintGate.js +487 -0
  83. package/dist/services/docs/review/gates/NoMaybesGate.d.ts +8 -0
  84. package/dist/services/docs/review/gates/NoMaybesGate.d.ts.map +1 -0
  85. package/dist/services/docs/review/gates/NoMaybesGate.js +145 -0
  86. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts +7 -0
  87. package/dist/services/docs/review/gates/OpenApiCoverageGate.d.ts.map +1 -0
  88. package/dist/services/docs/review/gates/OpenApiCoverageGate.js +266 -0
  89. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts +7 -0
  90. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.d.ts.map +1 -0
  91. package/dist/services/docs/review/gates/OpenApiSchemaSanityGate.js +59 -0
  92. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts +7 -0
  93. package/dist/services/docs/review/gates/OpenQuestionsGate.d.ts.map +1 -0
  94. package/dist/services/docs/review/gates/OpenQuestionsGate.js +200 -0
  95. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts +7 -0
  96. package/dist/services/docs/review/gates/PdrInterfacesGate.d.ts.map +1 -0
  97. package/dist/services/docs/review/gates/PdrInterfacesGate.js +159 -0
  98. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts +8 -0
  99. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.d.ts.map +1 -0
  100. package/dist/services/docs/review/gates/PdrOpenQuestionsGate.js +129 -0
  101. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts +7 -0
  102. package/dist/services/docs/review/gates/PdrOwnershipGate.d.ts.map +1 -0
  103. package/dist/services/docs/review/gates/PdrOwnershipGate.js +169 -0
  104. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts +10 -0
  105. package/dist/services/docs/review/gates/PlaceholderArtifactGate.d.ts.map +1 -0
  106. package/dist/services/docs/review/gates/PlaceholderArtifactGate.js +261 -0
  107. package/dist/services/docs/review/gates/RfpConsentGate.d.ts +6 -0
  108. package/dist/services/docs/review/gates/RfpConsentGate.d.ts.map +1 -0
  109. package/dist/services/docs/review/gates/RfpConsentGate.js +127 -0
  110. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts +7 -0
  111. package/dist/services/docs/review/gates/RfpDefinitionGate.d.ts.map +1 -0
  112. package/dist/services/docs/review/gates/RfpDefinitionGate.js +173 -0
  113. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts +7 -0
  114. package/dist/services/docs/review/gates/SdsAdaptersGate.d.ts.map +1 -0
  115. package/dist/services/docs/review/gates/SdsAdaptersGate.js +196 -0
  116. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts +7 -0
  117. package/dist/services/docs/review/gates/SdsDecisionsGate.d.ts.map +1 -0
  118. package/dist/services/docs/review/gates/SdsDecisionsGate.js +89 -0
  119. package/dist/services/docs/review/gates/SdsOpsGate.d.ts +7 -0
  120. package/dist/services/docs/review/gates/SdsOpsGate.d.ts.map +1 -0
  121. package/dist/services/docs/review/gates/SdsOpsGate.js +162 -0
  122. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts +7 -0
  123. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.d.ts.map +1 -0
  124. package/dist/services/docs/review/gates/SdsPolicyTelemetryGate.js +166 -0
  125. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts +7 -0
  126. package/dist/services/docs/review/gates/SqlRequiredTablesGate.d.ts.map +1 -0
  127. package/dist/services/docs/review/gates/SqlRequiredTablesGate.js +273 -0
  128. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts +7 -0
  129. package/dist/services/docs/review/gates/SqlSyntaxGate.d.ts.map +1 -0
  130. package/dist/services/docs/review/gates/SqlSyntaxGate.js +203 -0
  131. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts +9 -0
  132. package/dist/services/docs/review/gates/TerminologyNormalizationGate.d.ts.map +1 -0
  133. package/dist/services/docs/review/gates/TerminologyNormalizationGate.js +217 -0
  134. package/dist/services/docs/review/glossary.json +47 -0
  135. package/dist/services/estimate/EstimateService.d.ts +2 -0
  136. package/dist/services/estimate/EstimateService.d.ts.map +1 -1
  137. package/dist/services/estimate/EstimateService.js +66 -18
  138. package/dist/services/estimate/VelocityService.d.ts +4 -0
  139. package/dist/services/estimate/VelocityService.d.ts.map +1 -1
  140. package/dist/services/estimate/VelocityService.js +179 -36
  141. package/dist/services/estimate/types.d.ts +1 -0
  142. package/dist/services/estimate/types.d.ts.map +1 -1
  143. package/dist/services/execution/GatewayTrioService.d.ts +200 -0
  144. package/dist/services/execution/GatewayTrioService.d.ts.map +1 -0
  145. package/dist/services/execution/GatewayTrioService.js +2492 -0
  146. package/dist/services/execution/QaApiRunner.d.ts +30 -0
  147. package/dist/services/execution/QaApiRunner.d.ts.map +1 -0
  148. package/dist/services/execution/QaApiRunner.js +881 -0
  149. package/dist/services/execution/QaFollowupService.d.ts +2 -0
  150. package/dist/services/execution/QaFollowupService.d.ts.map +1 -1
  151. package/dist/services/execution/QaFollowupService.js +9 -2
  152. package/dist/services/execution/QaPlanValidator.d.ts +10 -0
  153. package/dist/services/execution/QaPlanValidator.d.ts.map +1 -0
  154. package/dist/services/execution/QaPlanValidator.js +128 -0
  155. package/dist/services/execution/QaProfileService.d.ts +27 -1
  156. package/dist/services/execution/QaProfileService.d.ts.map +1 -1
  157. package/dist/services/execution/QaProfileService.js +354 -7
  158. package/dist/services/execution/QaTasksService.d.ts +59 -1
  159. package/dist/services/execution/QaTasksService.d.ts.map +1 -1
  160. package/dist/services/execution/QaTasksService.js +3347 -318
  161. package/dist/services/execution/QaTestCommandBuilder.d.ts +51 -0
  162. package/dist/services/execution/QaTestCommandBuilder.d.ts.map +1 -0
  163. package/dist/services/execution/QaTestCommandBuilder.js +495 -0
  164. package/dist/services/execution/TaskSelectionService.d.ts +4 -2
  165. package/dist/services/execution/TaskSelectionService.d.ts.map +1 -1
  166. package/dist/services/execution/TaskSelectionService.js +144 -28
  167. package/dist/services/execution/TaskStateService.d.ts +19 -6
  168. package/dist/services/execution/TaskStateService.d.ts.map +1 -1
  169. package/dist/services/execution/TaskStateService.js +128 -13
  170. package/dist/services/execution/WorkOnTasksService.d.ts +32 -1
  171. package/dist/services/execution/WorkOnTasksService.d.ts.map +1 -1
  172. package/dist/services/execution/WorkOnTasksService.js +4667 -722
  173. package/dist/services/jobs/JobInsightsService.d.ts +4 -0
  174. package/dist/services/jobs/JobInsightsService.d.ts.map +1 -1
  175. package/dist/services/jobs/JobInsightsService.js +51 -5
  176. package/dist/services/jobs/JobResumeService.d.ts.map +1 -1
  177. package/dist/services/jobs/JobResumeService.js +23 -10
  178. package/dist/services/jobs/JobService.d.ts +56 -4
  179. package/dist/services/jobs/JobService.d.ts.map +1 -1
  180. package/dist/services/jobs/JobService.js +232 -1
  181. package/dist/services/openapi/OpenApiService.d.ts +51 -0
  182. package/dist/services/openapi/OpenApiService.d.ts.map +1 -1
  183. package/dist/services/openapi/OpenApiService.js +953 -106
  184. package/dist/services/planning/CreateTasksService.d.ts +21 -0
  185. package/dist/services/planning/CreateTasksService.d.ts.map +1 -1
  186. package/dist/services/planning/CreateTasksService.js +569 -31
  187. package/dist/services/planning/RefineTasksService.d.ts +9 -0
  188. package/dist/services/planning/RefineTasksService.d.ts.map +1 -1
  189. package/dist/services/planning/RefineTasksService.js +409 -59
  190. package/dist/services/review/CodeReviewService.d.ts +18 -0
  191. package/dist/services/review/CodeReviewService.d.ts.map +1 -1
  192. package/dist/services/review/CodeReviewService.js +1309 -167
  193. package/dist/services/review/ReviewNormalizer.d.ts +9 -0
  194. package/dist/services/review/ReviewNormalizer.d.ts.map +1 -0
  195. package/dist/services/review/ReviewNormalizer.js +147 -0
  196. package/dist/services/shared/AuthErrors.d.ts +3 -0
  197. package/dist/services/shared/AuthErrors.d.ts.map +1 -0
  198. package/dist/services/shared/AuthErrors.js +17 -0
  199. package/dist/services/shared/DocdexGuidance.d.ts +7 -0
  200. package/dist/services/shared/DocdexGuidance.d.ts.map +1 -0
  201. package/dist/services/shared/DocdexGuidance.js +12 -0
  202. package/dist/services/shared/ProjectGuidance.d.ts +17 -0
  203. package/dist/services/shared/ProjectGuidance.d.ts.map +1 -0
  204. package/dist/services/shared/ProjectGuidance.js +78 -0
  205. package/dist/services/system/ToolDenylist.d.ts +13 -0
  206. package/dist/services/system/ToolDenylist.d.ts.map +1 -0
  207. package/dist/services/system/ToolDenylist.js +85 -0
  208. package/dist/services/tasks/TaskCommentFormatter.d.ts +20 -0
  209. package/dist/services/tasks/TaskCommentFormatter.d.ts.map +1 -0
  210. package/dist/services/tasks/TaskCommentFormatter.js +54 -0
  211. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -1
  212. package/dist/services/telemetry/TelemetryService.js +39 -7
  213. package/dist/workspace/WorkspaceManager.d.ts +26 -0
  214. package/dist/workspace/WorkspaceManager.d.ts.map +1 -1
  215. package/dist/workspace/WorkspaceManager.js +206 -32
  216. 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,3 @@
1
+ export declare const AUTH_ERROR_REASON = "auth_error";
2
+ export declare const isAuthErrorMessage: (message?: string | null) => boolean;
3
+ //# sourceMappingURL=AuthErrors.d.ts.map
@@ -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;AA0FD,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;IAmBlB,OAAO,CAAC,SAAS;IAWX,UAAU,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA6GlF,aAAa,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuG7E,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAqB1C,MAAM,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAerD,KAAK,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAc7C"}
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 = metadata.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 = metadata.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 = metadata.action ?? metadata.phase ?? null;
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 = metadata.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 = metadata.action ?? metadata.phase ?? null;
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