@codemieai/code 0.0.33 → 0.0.34

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 (180) hide show
  1. package/README.md +73 -7
  2. package/bin/codemie-opencode.js +11 -0
  3. package/dist/agents/codemie-code/agent.d.ts +17 -1
  4. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  5. package/dist/agents/codemie-code/agent.js +62 -3
  6. package/dist/agents/codemie-code/agent.js.map +1 -1
  7. package/dist/agents/codemie-code/index.d.ts +1 -0
  8. package/dist/agents/codemie-code/index.d.ts.map +1 -1
  9. package/dist/agents/codemie-code/index.js +28 -2
  10. package/dist/agents/codemie-code/index.js.map +1 -1
  11. package/dist/agents/codemie-code/prompts.d.ts +12 -3
  12. package/dist/agents/codemie-code/prompts.d.ts.map +1 -1
  13. package/dist/agents/codemie-code/prompts.js +25 -5
  14. package/dist/agents/codemie-code/prompts.js.map +1 -1
  15. package/dist/agents/codemie-code/types.d.ts +3 -0
  16. package/dist/agents/codemie-code/types.d.ts.map +1 -1
  17. package/dist/agents/codemie-code/types.js.map +1 -1
  18. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  19. package/dist/agents/core/AgentCLI.js +3 -1
  20. package/dist/agents/core/AgentCLI.js.map +1 -1
  21. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  22. package/dist/agents/core/BaseAgentAdapter.js +33 -0
  23. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  24. package/dist/agents/core/session/BaseSessionAdapter.d.ts +25 -0
  25. package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
  26. package/dist/agents/core/session/discovery-types.d.ts +53 -0
  27. package/dist/agents/core/session/discovery-types.d.ts.map +1 -0
  28. package/dist/agents/core/session/discovery-types.js +8 -0
  29. package/dist/agents/core/session/discovery-types.js.map +1 -0
  30. package/dist/agents/core/types.d.ts +45 -0
  31. package/dist/agents/core/types.d.ts.map +1 -1
  32. package/dist/agents/plugins/claude/claude.plugin.d.ts +44 -1
  33. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  34. package/dist/agents/plugins/claude/claude.plugin.js +214 -0
  35. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  36. package/dist/agents/plugins/claude/plugin/README.md +40 -2
  37. package/dist/agents/plugins/claude/plugin/claude-templates/README.md +5 -5
  38. package/dist/agents/plugins/claude/plugin/claude-templates/templates/CLAUDE.md.template +177 -436
  39. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/code-review-agent-template.md.template +49 -82
  40. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/refactor-cleaner-agent.md.template +337 -0
  41. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/solution-architect-agent.md.template +129 -419
  42. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/unit-tester-agent.md.template +146 -693
  43. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/api/api-patterns.md.template +110 -138
  44. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/architecture.md.template +197 -0
  45. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/data/database-patterns.md.template +171 -91
  46. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/development/development-practices.md.template +219 -131
  47. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/security/security-practices.md.template +223 -98
  48. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/standards/code-quality.md.template +131 -95
  49. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/testing/testing-patterns.md.template +247 -75
  50. package/dist/agents/plugins/claude/plugin/commands/README.md +133 -0
  51. package/dist/agents/plugins/claude/plugin/commands/codemie-init.md +336 -544
  52. package/dist/agents/plugins/claude/plugin/commands/codemie-subagents.md +232 -503
  53. package/dist/agents/plugins/claude/plugin/commands/memory-add.md +311 -30
  54. package/dist/agents/plugins/claude/plugin/commands/memory-refresh.md +218 -39
  55. package/dist/agents/plugins/gemini/gemini.plugin.d.ts.map +1 -1
  56. package/dist/agents/plugins/gemini/gemini.plugin.js +0 -3
  57. package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
  58. package/dist/agents/plugins/opencode/index.d.ts +8 -0
  59. package/dist/agents/plugins/opencode/index.d.ts.map +1 -0
  60. package/dist/agents/plugins/opencode/index.js +12 -0
  61. package/dist/agents/plugins/opencode/index.js.map +1 -0
  62. package/dist/agents/plugins/opencode/opencode-message-types.d.ts +207 -0
  63. package/dist/agents/plugins/opencode/opencode-message-types.d.ts.map +1 -0
  64. package/dist/agents/plugins/opencode/opencode-message-types.js +59 -0
  65. package/dist/agents/plugins/opencode/opencode-message-types.js.map +1 -0
  66. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts +65 -0
  67. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -0
  68. package/dist/agents/plugins/opencode/opencode-model-configs.js +184 -0
  69. package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -0
  70. package/dist/agents/plugins/opencode/opencode.paths.d.ts +62 -0
  71. package/dist/agents/plugins/opencode/opencode.paths.d.ts.map +1 -0
  72. package/dist/agents/plugins/opencode/opencode.paths.js +148 -0
  73. package/dist/agents/plugins/opencode/opencode.paths.js.map +1 -0
  74. package/dist/agents/plugins/opencode/opencode.plugin.d.ts +35 -0
  75. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -0
  76. package/dist/agents/plugins/opencode/opencode.plugin.js +338 -0
  77. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -0
  78. package/dist/agents/plugins/opencode/opencode.session.d.ts +77 -0
  79. package/dist/agents/plugins/opencode/opencode.session.d.ts.map +1 -0
  80. package/dist/agents/plugins/opencode/opencode.session.js +424 -0
  81. package/dist/agents/plugins/opencode/opencode.session.js.map +1 -0
  82. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts +25 -0
  83. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts.map +1 -0
  84. package/dist/agents/plugins/opencode/opencode.storage-utils.js +96 -0
  85. package/dist/agents/plugins/opencode/opencode.storage-utils.js.map +1 -0
  86. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts +30 -0
  87. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -0
  88. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +116 -0
  89. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -0
  90. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts +102 -0
  91. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts.map +1 -0
  92. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js +584 -0
  93. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js.map +1 -0
  94. package/dist/agents/registry.d.ts.map +1 -1
  95. package/dist/agents/registry.js +2 -0
  96. package/dist/agents/registry.js.map +1 -1
  97. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts +5 -0
  98. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts.map +1 -1
  99. package/dist/cli/commands/doctor/checks/AgentsCheck.js +29 -0
  100. package/dist/cli/commands/doctor/checks/AgentsCheck.js.map +1 -1
  101. package/dist/cli/commands/install.d.ts.map +1 -1
  102. package/dist/cli/commands/install.js +86 -7
  103. package/dist/cli/commands/install.js.map +1 -1
  104. package/dist/cli/commands/opencode-metrics.d.ts +13 -0
  105. package/dist/cli/commands/opencode-metrics.d.ts.map +1 -0
  106. package/dist/cli/commands/opencode-metrics.js +200 -0
  107. package/dist/cli/commands/opencode-metrics.js.map +1 -0
  108. package/dist/cli/commands/setup.d.ts.map +1 -1
  109. package/dist/cli/commands/setup.js +113 -0
  110. package/dist/cli/commands/setup.js.map +1 -1
  111. package/dist/cli/commands/skill.d.ts +6 -0
  112. package/dist/cli/commands/skill.d.ts.map +1 -0
  113. package/dist/cli/commands/skill.js +196 -0
  114. package/dist/cli/commands/skill.js.map +1 -0
  115. package/dist/cli/commands/update.d.ts.map +1 -1
  116. package/dist/cli/commands/update.js +34 -6
  117. package/dist/cli/commands/update.js.map +1 -1
  118. package/dist/cli/index.js +4 -0
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/migrations/003-remove-hooks-node.migration.d.ts +22 -0
  121. package/dist/migrations/003-remove-hooks-node.migration.d.ts.map +1 -0
  122. package/dist/migrations/003-remove-hooks-node.migration.js +103 -0
  123. package/dist/migrations/003-remove-hooks-node.migration.js.map +1 -0
  124. package/dist/migrations/index.d.ts +1 -0
  125. package/dist/migrations/index.d.ts.map +1 -1
  126. package/dist/migrations/index.js +1 -1
  127. package/dist/migrations/index.js.map +1 -1
  128. package/dist/providers/plugins/sso/sso.http-client.js +2 -2
  129. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  130. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  131. package/dist/providers/plugins/sso/sso.setup-steps.js +14 -10
  132. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  133. package/dist/skills/core/SkillDiscovery.d.ts +83 -0
  134. package/dist/skills/core/SkillDiscovery.d.ts.map +1 -0
  135. package/dist/skills/core/SkillDiscovery.js +237 -0
  136. package/dist/skills/core/SkillDiscovery.js.map +1 -0
  137. package/dist/skills/core/SkillManager.d.ts +86 -0
  138. package/dist/skills/core/SkillManager.d.ts.map +1 -0
  139. package/dist/skills/core/SkillManager.js +155 -0
  140. package/dist/skills/core/SkillManager.js.map +1 -0
  141. package/dist/skills/core/types.d.ts +120 -0
  142. package/dist/skills/core/types.d.ts.map +1 -0
  143. package/dist/skills/core/types.js +20 -0
  144. package/dist/skills/core/types.js.map +1 -0
  145. package/dist/skills/index.d.ts +12 -0
  146. package/dist/skills/index.d.ts.map +1 -0
  147. package/dist/skills/index.js +12 -0
  148. package/dist/skills/index.js.map +1 -0
  149. package/dist/skills/utils/content-loader.d.ts +25 -0
  150. package/dist/skills/utils/content-loader.d.ts.map +1 -0
  151. package/dist/skills/utils/content-loader.js +161 -0
  152. package/dist/skills/utils/content-loader.js.map +1 -0
  153. package/dist/skills/utils/frontmatter.d.ts +60 -0
  154. package/dist/skills/utils/frontmatter.d.ts.map +1 -0
  155. package/dist/skills/utils/frontmatter.js +114 -0
  156. package/dist/skills/utils/frontmatter.js.map +1 -0
  157. package/dist/skills/utils/pattern-matcher.d.ts +60 -0
  158. package/dist/skills/utils/pattern-matcher.d.ts.map +1 -0
  159. package/dist/skills/utils/pattern-matcher.js +97 -0
  160. package/dist/skills/utils/pattern-matcher.js.map +1 -0
  161. package/dist/utils/installation-detector.d.ts +22 -0
  162. package/dist/utils/installation-detector.d.ts.map +1 -0
  163. package/dist/utils/installation-detector.js +49 -0
  164. package/dist/utils/installation-detector.js.map +1 -0
  165. package/dist/utils/native-installer.d.ts +49 -0
  166. package/dist/utils/native-installer.d.ts.map +1 -0
  167. package/dist/utils/native-installer.js +194 -0
  168. package/dist/utils/native-installer.js.map +1 -0
  169. package/dist/utils/version-utils.d.ts +50 -0
  170. package/dist/utils/version-utils.d.ts.map +1 -0
  171. package/dist/utils/version-utils.js +92 -0
  172. package/dist/utils/version-utils.js.map +1 -0
  173. package/package.json +5 -2
  174. package/scripts/copy-mr-skill-to-global.ts +252 -0
  175. package/scripts/demo-hooks.sh +125 -0
  176. package/scripts/test-hooks.sh +196 -0
  177. package/dist/agents/plugins/claude/plugin/claude-templates/templates/INDEX.md +0 -205
  178. package/dist/agents/plugins/claude/plugin/claude-templates/templates/TEMPLATE_SIZES.md +0 -74
  179. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/layered-architecture.md.template +0 -143
  180. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/project-structure.md.template +0 -127
@@ -0,0 +1,584 @@
1
+ // src/agents/plugins/opencode/session/processors/opencode.metrics-processor.ts
2
+ /**
3
+ * OpenCode Metrics Processor
4
+ *
5
+ * Transforms OpenCode session messages into MetricDelta records and writes
6
+ * them to JSONL for eventual sync to CodeMie API.
7
+ *
8
+ * Per tech spec "Fix OpenCode Metrics Sync":
9
+ * - Loads parts from storage/part/{messageID}/
10
+ * - Extracts tool usage, file operations, user prompts
11
+ * - Creates MetricDelta records per assistant message (ADR-16)
12
+ * - Writes to JSONL via MetricsWriter with status: 'pending'
13
+ * - Implements deduplication to prevent duplicate deltas
14
+ */
15
+ import { isToolPart, isStepFinishPart } from '../../opencode-message-types.js';
16
+ import { readJsonWithRetry, readJsonlTolerant } from '../../opencode.storage-utils.js';
17
+ import { logger } from '../../../../../utils/logger.js';
18
+ import { getCodemiePath } from '../../../../../utils/paths.js';
19
+ import { readdir, readFile, writeFile } from 'fs/promises';
20
+ import { existsSync } from 'fs';
21
+ import { join } from 'path';
22
+ // Cooldown to prevent concurrent processing of same session (ADR-18)
23
+ const REPROCESS_COOLDOWN_MS = 60_000; // 60 seconds
24
+ /**
25
+ * OpenCode Metrics Processor
26
+ *
27
+ * Aggregates token usage, extracts tool/file metrics from parts,
28
+ * and writes MetricDelta records to JSONL.
29
+ */
30
+ export class OpenCodeMetricsProcessor {
31
+ name = 'opencode-metrics';
32
+ priority = 1; // Run first (before conversations)
33
+ cacheDir;
34
+ constructor() {
35
+ this.cacheDir = getCodemiePath('cache', 'opencode');
36
+ }
37
+ /**
38
+ * Check if session has data to process
39
+ */
40
+ shouldProcess(session) {
41
+ return session.messages.length > 0;
42
+ }
43
+ /**
44
+ * Process session to aggregate metrics and write JSONL deltas
45
+ *
46
+ * Per tech spec ADR-1/G2: Validate metadata at START before any processing
47
+ */
48
+ async process(session, _context) {
49
+ try {
50
+ // MANDATORY: Validate metadata has required fields (ADR-1, Review 13 G2)
51
+ const metadata = session.metadata;
52
+ if (!metadata.storagePath || typeof metadata.storagePath !== 'string') {
53
+ return {
54
+ success: false,
55
+ message: 'Missing storagePath in session.metadata (adapter not updated)',
56
+ metadata: { failureReason: 'NO_STORAGE_PATH' }
57
+ };
58
+ }
59
+ if (!metadata.openCodeSessionId || typeof metadata.openCodeSessionId !== 'string') {
60
+ logger.warn('[opencode-metrics] Missing openCodeSessionId, using fallback');
61
+ }
62
+ const storagePath = metadata.storagePath;
63
+ const openCodeSessionId = metadata.openCodeSessionId || 'unknown';
64
+ // Check concurrent processing prevention (ADR-18)
65
+ if (!await this.shouldProcessSession(session.sessionId)) {
66
+ return {
67
+ success: true,
68
+ message: 'Session recently processed, skipping',
69
+ metadata: { skippedReason: 'RECENTLY_PROCESSED' }
70
+ };
71
+ }
72
+ const messages = session.messages;
73
+ // Transform messages to deltas
74
+ // Cast metadata to OpenCodeMetadata (validated above)
75
+ const openCodeMetadata = {
76
+ projectPath: metadata.projectPath,
77
+ createdAt: metadata.createdAt,
78
+ updatedAt: metadata.updatedAt,
79
+ storagePath,
80
+ openCodeSessionId,
81
+ openCodeVersion: metadata.openCodeVersion
82
+ };
83
+ const { deltas, stats } = await this.transformMessagesToDeltas(messages, session.sessionId, openCodeSessionId, storagePath, openCodeMetadata);
84
+ if (deltas.length === 0) {
85
+ logger.debug(`[opencode-metrics] No new deltas to write for session ${session.sessionId}`);
86
+ // Still update session.metrics for backward compat
87
+ this.updateSessionMetrics(session, messages);
88
+ return {
89
+ success: true,
90
+ message: `No new deltas (${stats.skippedDueToDedup} already processed)`,
91
+ metadata: {
92
+ recordsProcessed: messages.length,
93
+ deltasWritten: 0,
94
+ deltasSkipped: stats.skippedDueToDedup,
95
+ ...stats
96
+ }
97
+ };
98
+ }
99
+ // Write deltas to JSONL
100
+ const { MetricsWriter } = await import('../../../../../providers/plugins/sso/session/processors/metrics/MetricsWriter.js');
101
+ const writer = new MetricsWriter(session.sessionId);
102
+ logger.debug(`[opencode-metrics] Writing to: ${writer.getFilePath()}`);
103
+ for (const delta of deltas) {
104
+ // Log delta details for debugging
105
+ logger.debug(`[opencode-metrics] Delta ${delta.recordId}:`, {
106
+ tokens: delta.tokens,
107
+ tools: Object.keys(delta.tools || {}),
108
+ toolStatus: delta.toolStatus ? Object.keys(delta.toolStatus) : [],
109
+ fileOps: (delta.fileOperations || []).length,
110
+ models: delta.models,
111
+ userPrompts: delta.userPrompts?.length || 0
112
+ });
113
+ await writer.appendDelta(delta);
114
+ }
115
+ // Mark session as processed (ADR-18)
116
+ await this.markSessionProcessed(session.sessionId);
117
+ // Update session.metrics for backward compat
118
+ this.updateSessionMetrics(session, messages);
119
+ logger.info(`[opencode-metrics] Wrote ${deltas.length} deltas for session ${session.sessionId}`);
120
+ logger.info(`[opencode-metrics] Metrics file: ${writer.getFilePath()}`);
121
+ return {
122
+ success: true,
123
+ message: `Generated ${deltas.length} deltas`,
124
+ metadata: {
125
+ recordsProcessed: messages.length,
126
+ deltasWritten: deltas.length,
127
+ deltasSkipped: stats.skippedDueToDedup,
128
+ ...stats
129
+ }
130
+ };
131
+ }
132
+ catch (error) {
133
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
134
+ logger.error(`[opencode-metrics] Processing failed:`, error);
135
+ return {
136
+ success: false,
137
+ message: `Metrics processing failed: ${errorMessage}`,
138
+ metadata: { failureReason: 'PROCESSING_ERROR' }
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Check if session should be processed (cooldown check per ADR-18)
144
+ */
145
+ async shouldProcessSession(sessionId) {
146
+ try {
147
+ const lastProcessedPath = join(this.cacheDir, `${sessionId}_last_processed`);
148
+ if (existsSync(lastProcessedPath)) {
149
+ const lastProcessed = parseInt(await readFile(lastProcessedPath, 'utf-8'), 10);
150
+ if (Date.now() - lastProcessed < REPROCESS_COOLDOWN_MS) {
151
+ logger.debug(`[opencode-metrics] Session ${sessionId} processed recently, skipping`);
152
+ return false;
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // File corrupt or missing, proceed with processing
158
+ }
159
+ return true;
160
+ }
161
+ /**
162
+ * Mark session as processed (ADR-18)
163
+ */
164
+ async markSessionProcessed(sessionId) {
165
+ try {
166
+ const { mkdir } = await import('fs/promises');
167
+ if (!existsSync(this.cacheDir)) {
168
+ await mkdir(this.cacheDir, { recursive: true });
169
+ }
170
+ const lastProcessedPath = join(this.cacheDir, `${sessionId}_last_processed`);
171
+ await writeFile(lastProcessedPath, Date.now().toString());
172
+ }
173
+ catch (error) {
174
+ logger.debug(`[opencode-metrics] Failed to mark session processed: ${error}`);
175
+ }
176
+ }
177
+ /**
178
+ * Transform messages to MetricDelta records
179
+ *
180
+ * Per ADR-16: One delta per assistant message with tokens
181
+ */
182
+ async transformMessagesToDeltas(messages, codemieSessionId, openCodeSessionId, storagePath, sessionMetadata) {
183
+ const deltas = [];
184
+ const stats = {
185
+ messagesWithTokens: 0,
186
+ messagesWithoutTokens: 0,
187
+ tokensFromMessage: 0,
188
+ tokensFromStepFinish: 0,
189
+ skippedDueToDedup: 0,
190
+ tokenCoverageRate: 0
191
+ };
192
+ // Get existing record IDs for deduplication (ADR-5)
193
+ const existingRecordIds = await this.getExistingRecordIds(codemieSessionId);
194
+ const existingDeltas = await this.readExistingDeltas(codemieSessionId);
195
+ // Track already-attached user prompts (ADR-21)
196
+ const alreadyAttachedPrompts = new Set();
197
+ for (const delta of existingDeltas) {
198
+ if (delta.userPrompts) {
199
+ for (const prompt of delta.userPrompts) {
200
+ if (prompt.text)
201
+ alreadyAttachedPrompts.add(prompt.text);
202
+ }
203
+ }
204
+ }
205
+ // Extract all user prompts
206
+ const allUserPrompts = await this.extractUserPrompts(messages, storagePath, openCodeSessionId);
207
+ // Filter to only NEW prompts
208
+ const newPrompts = allUserPrompts.filter(p => !alreadyAttachedPrompts.has(p.text));
209
+ let promptsAttached = false;
210
+ let totalAssistantMessages = 0;
211
+ for (const msg of messages) {
212
+ if (msg.role !== 'assistant')
213
+ continue;
214
+ totalAssistantMessages++;
215
+ const assistantMsg = msg;
216
+ // Check deduplication (ADR-5, ADR-15)
217
+ if (existingRecordIds.has(assistantMsg.id)) {
218
+ stats.skippedDueToDedup++;
219
+ continue;
220
+ }
221
+ // Load parts for this message
222
+ const parts = await this.loadPartsForMessage(storagePath, assistantMsg.id, openCodeSessionId);
223
+ // Resolve token source (ADR-13)
224
+ const tokenSource = await this.resolveTokenSource(assistantMsg, parts);
225
+ if (tokenSource.source === 'none') {
226
+ stats.messagesWithoutTokens++;
227
+ continue;
228
+ }
229
+ if (tokenSource.source === 'message') {
230
+ stats.tokensFromMessage++;
231
+ }
232
+ else {
233
+ stats.tokensFromStepFinish++;
234
+ }
235
+ stats.messagesWithTokens++;
236
+ // Extract tool metrics
237
+ const { tools, toolStatus, fileOperations } = this.extractToolMetrics(parts);
238
+ // Build delta (ADR-15: recordId is message.id)
239
+ const delta = {
240
+ recordId: assistantMsg.id,
241
+ sessionId: codemieSessionId,
242
+ agentSessionId: openCodeSessionId,
243
+ timestamp: this.resolveTimestamp(assistantMsg, sessionMetadata),
244
+ tokens: {
245
+ input: tokenSource.tokens.input,
246
+ output: tokenSource.tokens.output,
247
+ ...(tokenSource.tokens.cache?.write && { cacheCreation: tokenSource.tokens.cache.write }),
248
+ ...(tokenSource.tokens.cache?.read && { cacheRead: tokenSource.tokens.cache.read })
249
+ },
250
+ tools,
251
+ ...(Object.keys(toolStatus).length > 0 && { toolStatus }),
252
+ ...(fileOperations.length > 0 && { fileOperations })
253
+ };
254
+ // Add model if present (ADR-6)
255
+ const modelString = this.getValidModelString(assistantMsg.providerID, assistantMsg.modelID);
256
+ if (modelString) {
257
+ delta.models = [modelString];
258
+ }
259
+ // Attach user prompts to first NEW delta only (ADR-21)
260
+ if (!promptsAttached && newPrompts.length > 0) {
261
+ delta.userPrompts = newPrompts;
262
+ promptsAttached = true;
263
+ }
264
+ deltas.push(delta);
265
+ }
266
+ // Calculate coverage rate
267
+ stats.tokenCoverageRate = totalAssistantMessages > 0
268
+ ? stats.messagesWithTokens / totalAssistantMessages
269
+ : 0;
270
+ return { deltas, stats };
271
+ }
272
+ /**
273
+ * Resolve token source with fallback (ADR-13)
274
+ */
275
+ async resolveTokenSource(assistantMsg, parts) {
276
+ // Primary: message.tokens (both input AND output must be valid numbers)
277
+ if (typeof assistantMsg.tokens?.input === 'number' && !isNaN(assistantMsg.tokens.input) &&
278
+ typeof assistantMsg.tokens?.output === 'number' && !isNaN(assistantMsg.tokens.output)) {
279
+ return { source: 'message', tokens: assistantMsg.tokens };
280
+ }
281
+ // Fallback: step-finish parts (sorted for deterministic selection per ADR-13 G6)
282
+ const stepFinishParts = parts
283
+ .filter(isStepFinishPart)
284
+ .sort((a, b) => a.id.localeCompare(b.id));
285
+ for (const part of stepFinishParts) {
286
+ const tokens = part.tokens;
287
+ if (typeof tokens?.input === 'number' && !isNaN(tokens.input) &&
288
+ typeof tokens?.output === 'number' && !isNaN(tokens.output)) {
289
+ logger.debug(`[opencode-metrics] Using step-finish tokens for message ${assistantMsg.id}`);
290
+ return { source: 'step-finish', tokens };
291
+ }
292
+ }
293
+ // Neither available
294
+ logger.warn(`[opencode-metrics] No valid tokens found for message ${assistantMsg.id}`);
295
+ return { source: 'none' };
296
+ }
297
+ /**
298
+ * Resolve timestamp with fallback chain (ADR-13 G4)
299
+ */
300
+ resolveTimestamp(msg, sessionMetadata) {
301
+ // Primary: message timestamp
302
+ if (msg.time?.created && typeof msg.time.created === 'number') {
303
+ return msg.time.created;
304
+ }
305
+ // Fallback: session updated time
306
+ if (sessionMetadata.updatedAt) {
307
+ const parsed = new Date(sessionMetadata.updatedAt).getTime();
308
+ if (!isNaN(parsed)) {
309
+ logger.debug(`[opencode-metrics] Using session updatedAt for message ${msg.id}`);
310
+ return parsed;
311
+ }
312
+ }
313
+ // Last resort: current time
314
+ logger.warn(`[opencode-metrics] Missing timestamp for message ${msg.id}, using Date.now()`);
315
+ return Date.now();
316
+ }
317
+ /**
318
+ * Load parts for a message (ADR-11 - part-message validation)
319
+ */
320
+ async loadPartsForMessage(storagePath, messageId, expectedSessionId) {
321
+ const partsDir = join(storagePath, 'part', messageId);
322
+ if (!existsSync(partsDir)) {
323
+ return [];
324
+ }
325
+ const parts = [];
326
+ try {
327
+ const files = await readdir(partsDir);
328
+ for (const file of files) {
329
+ if (!file.endsWith('.json'))
330
+ continue;
331
+ const part = await readJsonWithRetry(join(partsDir, file));
332
+ if (!part)
333
+ continue;
334
+ // Validate part belongs to this message (ADR-11)
335
+ if (part.messageID !== messageId) {
336
+ logger.debug(`[opencode-metrics] Skipping orphaned part ${part.id}: messageID mismatch`);
337
+ continue;
338
+ }
339
+ // Optionally validate session correlation
340
+ if (expectedSessionId && part.sessionID !== expectedSessionId) {
341
+ logger.debug(`[opencode-metrics] Skipping part ${part.id}: sessionID mismatch`);
342
+ continue;
343
+ }
344
+ parts.push(part);
345
+ }
346
+ }
347
+ catch (error) {
348
+ logger.debug(`[opencode-metrics] Error loading parts from ${partsDir}:`, error);
349
+ }
350
+ return parts.sort((a, b) => a.id.localeCompare(b.id));
351
+ }
352
+ /**
353
+ * Extract tool metrics from parts (ADR-8, ADR-14)
354
+ */
355
+ extractToolMetrics(parts) {
356
+ const tools = {};
357
+ const toolStatus = {};
358
+ const fileOperations = [];
359
+ const toolParts = parts.filter(isToolPart);
360
+ for (const part of toolParts) {
361
+ const toolName = part.tool.toLowerCase();
362
+ tools[toolName] = (tools[toolName] || 0) + 1;
363
+ const statusResult = this.mapToolStatus(part.state.status);
364
+ if (statusResult !== 'skip') {
365
+ if (!toolStatus[toolName]) {
366
+ toolStatus[toolName] = { success: 0, failure: 0 };
367
+ }
368
+ toolStatus[toolName][statusResult]++;
369
+ // Extract file operations only for completed tools (ADR-8)
370
+ if (statusResult === 'success') {
371
+ const ops = this.extractFileOperation(part.tool, part.state.input, part.state.metadata);
372
+ fileOperations.push(...ops);
373
+ }
374
+ }
375
+ }
376
+ return { tools, toolStatus, fileOperations };
377
+ }
378
+ /**
379
+ * Map tool status to success/failure/skip (ADR-14)
380
+ */
381
+ mapToolStatus(status) {
382
+ switch (status.toLowerCase()) {
383
+ case 'completed':
384
+ return 'success';
385
+ case 'error':
386
+ return 'failure';
387
+ case 'pending':
388
+ case 'running':
389
+ return 'skip'; // Don't count incomplete tools
390
+ default:
391
+ logger.debug(`[opencode-metrics] Unknown tool status: ${status}`);
392
+ return 'skip';
393
+ }
394
+ }
395
+ /**
396
+ * Extract file operation from tool call (ADR-8, ADR-17)
397
+ * Only emits allowed file operation types.
398
+ */
399
+ extractFileOperation(toolName, input, metadata) {
400
+ const toolLower = toolName.toLowerCase();
401
+ const operations = [];
402
+ // Map tools to allowed types (ADR-8)
403
+ const typeMapping = {
404
+ 'read': 'read',
405
+ 'write': 'write',
406
+ 'edit': 'edit',
407
+ 'glob': 'glob',
408
+ 'grep': 'grep',
409
+ 'apply_patch': 'edit', // Map to edit, not patch
410
+ 'multiedit': 'edit', // Map to edit, not multiedit
411
+ };
412
+ const mappedType = typeMapping[toolLower];
413
+ if (!mappedType)
414
+ return [];
415
+ // Handle apply_patch - extract from state.metadata.files (ADR-17)
416
+ if (toolLower === 'apply_patch') {
417
+ const files = metadata?.files;
418
+ if (Array.isArray(files)) {
419
+ for (const file of files) {
420
+ const path = file.filePath || file.relativePath;
421
+ if (typeof path === 'string') {
422
+ const op = { type: 'edit', path };
423
+ // Add line metrics from apply_patch (ADR-8)
424
+ if (typeof file.additions === 'number') {
425
+ op.linesAdded = file.additions;
426
+ }
427
+ if (typeof file.deletions === 'number') {
428
+ op.linesRemoved = file.deletions;
429
+ }
430
+ operations.push(op);
431
+ }
432
+ }
433
+ }
434
+ return operations;
435
+ }
436
+ // Handle multiedit (ADR-17)
437
+ if (toolLower === 'multiedit') {
438
+ const edits = input?.edits;
439
+ if (Array.isArray(edits)) {
440
+ for (const edit of edits) {
441
+ if (typeof edit.filePath === 'string') {
442
+ operations.push({ type: 'edit', path: edit.filePath });
443
+ }
444
+ }
445
+ }
446
+ return operations;
447
+ }
448
+ // Standard file operations
449
+ const fileOp = { type: mappedType };
450
+ // Per ADR-17: field names are camelCase (filePath, not file_path)
451
+ const filePath = input?.filePath || input?.path;
452
+ if (typeof filePath === 'string') {
453
+ fileOp.path = filePath;
454
+ }
455
+ if (typeof input?.pattern === 'string') {
456
+ fileOp.pattern = input.pattern;
457
+ }
458
+ operations.push(fileOp);
459
+ return operations;
460
+ }
461
+ /**
462
+ * Extract user prompts from messages (ADR-10, ADR-20)
463
+ */
464
+ async extractUserPrompts(messages, storagePath, sessionId) {
465
+ const prompts = [];
466
+ for (const msg of messages) {
467
+ if (msg.role !== 'user')
468
+ continue;
469
+ const text = await this.extractUserPromptText(msg, storagePath, sessionId);
470
+ if (text) {
471
+ prompts.push({ count: 1, text });
472
+ }
473
+ }
474
+ return prompts;
475
+ }
476
+ /**
477
+ * Extract user prompt text from message (ADR-10, ADR-20)
478
+ */
479
+ async extractUserPromptText(msg, storagePath, sessionId) {
480
+ // Try parts first (ADR-20)
481
+ const partsDir = join(storagePath, 'part', msg.id);
482
+ if (existsSync(partsDir)) {
483
+ const parts = await this.loadPartsForMessage(storagePath, msg.id, sessionId);
484
+ // Filter: exclude ignored and synthetic parts (ADR-10)
485
+ const textParts = parts.filter(p => p.type === 'text' &&
486
+ 'text' in p &&
487
+ !p.ignored &&
488
+ !p.synthetic);
489
+ if (textParts.length > 0) {
490
+ const combinedText = textParts
491
+ .map(p => p.text)
492
+ .filter(t => t?.trim())
493
+ .join('\n');
494
+ if (combinedText) {
495
+ return combinedText;
496
+ }
497
+ }
498
+ }
499
+ // Fallback: check message.summary.title (ADR-20)
500
+ if (msg.summary?.title) {
501
+ return msg.summary.title;
502
+ }
503
+ // No text found
504
+ return undefined;
505
+ }
506
+ /**
507
+ * Get existing record IDs for deduplication (ADR-5)
508
+ * Uses tolerant JSONL reading to handle corrupted lines.
509
+ */
510
+ async getExistingRecordIds(sessionId) {
511
+ try {
512
+ const existingDeltas = await this.readExistingDeltas(sessionId);
513
+ return new Set(existingDeltas.map(d => d.recordId));
514
+ }
515
+ catch (error) {
516
+ logger.warn('[opencode-metrics] Could not read existing deltas:', error);
517
+ return new Set();
518
+ }
519
+ }
520
+ /**
521
+ * Read existing deltas from JSONL file (ADR-5, ADR-21)
522
+ */
523
+ async readExistingDeltas(sessionId) {
524
+ try {
525
+ const { MetricsWriter } = await import('../../../../../providers/plugins/sso/session/processors/metrics/MetricsWriter.js');
526
+ const writer = new MetricsWriter(sessionId);
527
+ if (!writer.exists()) {
528
+ return [];
529
+ }
530
+ // Use tolerant read that skips corrupted lines
531
+ return await readJsonlTolerant(writer.getFilePath());
532
+ }
533
+ catch (error) {
534
+ logger.debug('[opencode-metrics] Could not read existing deltas:', error);
535
+ return [];
536
+ }
537
+ }
538
+ /**
539
+ * Get valid model string (ADR-6)
540
+ */
541
+ getValidModelString(providerID, modelID) {
542
+ const model = modelID?.trim();
543
+ if (!model)
544
+ return undefined;
545
+ const provider = providerID?.toLowerCase().trim();
546
+ return provider ? `${provider}/${model}` : model;
547
+ }
548
+ /**
549
+ * Update session.metrics for backward compatibility
550
+ */
551
+ updateSessionMetrics(session, messages) {
552
+ let totalInput = 0;
553
+ let totalOutput = 0;
554
+ let cacheRead = 0;
555
+ let cacheWrite = 0;
556
+ for (const msg of messages) {
557
+ if (msg.role === 'assistant') {
558
+ const assistantMsg = msg;
559
+ if (assistantMsg.tokens) {
560
+ totalInput += assistantMsg.tokens.input || 0;
561
+ totalOutput += assistantMsg.tokens.output || 0;
562
+ cacheRead += assistantMsg.tokens.cache?.read || 0;
563
+ cacheWrite += assistantMsg.tokens.cache?.write || 0;
564
+ }
565
+ }
566
+ }
567
+ // Ensure session.metrics exists before mutating
568
+ if (!session.metrics) {
569
+ session.metrics = {
570
+ tokens: { input: 0, output: 0 },
571
+ tools: {},
572
+ toolStatus: {},
573
+ fileOperations: []
574
+ };
575
+ }
576
+ session.metrics.tokens = {
577
+ input: totalInput,
578
+ output: totalOutput,
579
+ cacheRead,
580
+ cacheWrite
581
+ };
582
+ }
583
+ }
584
+ //# sourceMappingURL=opencode.metrics-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.metrics-processor.js","sourceRoot":"","sources":["../../../../../../src/agents/plugins/opencode/session/processors/opencode.metrics-processor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACxE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;IAC1F,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKvD,MAAM,CAAC,YAAY,IAAI,YAAY,EAAE;IAKrC,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;WAKnB,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAW1D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAKhF;;OAEG;IACH,MAAM,CAAC,uBAAuB,IAAI,qBAAqB,EAAE;CAI1D"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAwC;IACxE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;IAC1F,OAAO,CAAC,MAAM,CAAC,WAAW,CAAS;IAEnC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKvD,MAAM,CAAC,YAAY,IAAI,YAAY,EAAE;IAKrC,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;WAKnB,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAW1D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAKhF;;OAEG;IACH,MAAM,CAAC,uBAAuB,IAAI,qBAAqB,EAAE;CAI1D"}
@@ -1,6 +1,7 @@
1
1
  import { ClaudePlugin } from './plugins/claude/claude.plugin.js';
2
2
  import { CodeMieCodePlugin } from './plugins/codemie-code.plugin.js';
3
3
  import { GeminiPlugin } from './plugins/gemini/gemini.plugin.js';
4
+ import { OpenCodePlugin } from './plugins/opencode/index.js';
4
5
  export { BUILTIN_AGENT_NAME } from './plugins/codemie-code.plugin.js';
5
6
  /**
6
7
  * Central registry for all agents
@@ -20,6 +21,7 @@ export class AgentRegistry {
20
21
  AgentRegistry.registerPlugin(new CodeMieCodePlugin());
21
22
  AgentRegistry.registerPlugin(new ClaudePlugin());
22
23
  AgentRegistry.registerPlugin(new GeminiPlugin());
24
+ AgentRegistry.registerPlugin(new OpenCodePlugin());
23
25
  AgentRegistry.initialized = true;
24
26
  }
25
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAKjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAU,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;IAChE,MAAM,CAAU,iBAAiB,GAAuC,IAAI,GAAG,EAAE,CAAC;IAClF,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;IAEnC;;OAEG;IACK,MAAM,CAAC,UAAU;QACvB,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,aAAa,CAAC,cAAc,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QACtD,aAAa,CAAC,cAAc,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QACjD,aAAa,CAAC,cAAc,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAEjD,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,MAAoB;QAChD,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEhD,0DAA0D;QAC1D,MAAM,QAAQ,GAAI,MAAc,CAAC,QAAQ,CAAC;QAC1C,IAAI,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YAC/B,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB;QAC7B,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAmB,EAAE,CAAC;QAClC,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAiB;QAC1C,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB;QAC5B,aAAa,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,11 @@
4
4
  import { ItemWiseHealthCheck, HealthCheckResult, HealthCheckDetail } from '../types.js';
5
5
  export declare class AgentsCheck implements ItemWiseHealthCheck {
6
6
  name: string;
7
+ /**
8
+ * Check if agent was installed via deprecated npm method
9
+ * Returns warning detail if npm install detected, null otherwise
10
+ */
11
+ private checkDeprecatedInstallation;
7
12
  run(): Promise<HealthCheckResult>;
8
13
  runWithItemDisplay(onStartItem: (itemName: string) => void, onDisplayItem: (detail: HealthCheckDetail) => void): Promise<HealthCheckResult>;
9
14
  }