@codemieai/code 0.10.1 → 0.11.0

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 (112) hide show
  1. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  2. package/dist/agents/core/AgentCLI.js +11 -3
  3. package/dist/agents/core/AgentCLI.js.map +1 -1
  4. package/dist/agents/core/BaseAgentAdapter.d.ts +3 -1
  5. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.js +34 -2
  7. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  8. package/dist/agents/core/config-redaction.d.ts +7 -0
  9. package/dist/agents/core/config-redaction.d.ts.map +1 -0
  10. package/dist/agents/core/config-redaction.js +20 -0
  11. package/dist/agents/core/config-redaction.js.map +1 -0
  12. package/dist/agents/core/print-config.d.ts +8 -0
  13. package/dist/agents/core/print-config.d.ts.map +1 -0
  14. package/dist/agents/core/print-config.js +17 -0
  15. package/dist/agents/core/print-config.js.map +1 -0
  16. package/dist/agents/core/session/BaseSessionAdapter.d.ts +5 -1
  17. package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
  18. package/dist/agents/core/types.d.ts +34 -4
  19. package/dist/agents/core/types.d.ts.map +1 -1
  20. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  21. package/dist/agents/plugins/claude/claude.plugin.js +73 -0
  22. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  23. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  24. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +115 -32
  25. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  26. package/dist/agents/plugins/claude/settings-conflict.d.ts +8 -0
  27. package/dist/agents/plugins/claude/settings-conflict.d.ts.map +1 -0
  28. package/dist/agents/plugins/claude/settings-conflict.js +35 -0
  29. package/dist/agents/plugins/claude/settings-conflict.js.map +1 -0
  30. package/dist/agents/plugins/codemie-code-hooks/shell-hooks-source.d.ts +14 -2
  31. package/dist/agents/plugins/codemie-code-hooks/shell-hooks-source.d.ts.map +1 -1
  32. package/dist/agents/plugins/codemie-code-hooks/shell-hooks-source.js +218 -263
  33. package/dist/agents/plugins/codemie-code-hooks/shell-hooks-source.js.map +1 -1
  34. package/dist/agents/plugins/opencode/opencode-message-types.d.ts +13 -0
  35. package/dist/agents/plugins/opencode/opencode-message-types.d.ts.map +1 -1
  36. package/dist/agents/plugins/opencode/opencode-message-types.js.map +1 -1
  37. package/dist/agents/plugins/opencode/opencode.incremental-sync.d.ts +38 -0
  38. package/dist/agents/plugins/opencode/opencode.incremental-sync.d.ts.map +1 -0
  39. package/dist/agents/plugins/opencode/opencode.incremental-sync.js +153 -0
  40. package/dist/agents/plugins/opencode/opencode.incremental-sync.js.map +1 -0
  41. package/dist/agents/plugins/opencode/opencode.paths.d.ts +18 -2
  42. package/dist/agents/plugins/opencode/opencode.paths.d.ts.map +1 -1
  43. package/dist/agents/plugins/opencode/opencode.paths.js +39 -6
  44. package/dist/agents/plugins/opencode/opencode.paths.js.map +1 -1
  45. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
  46. package/dist/agents/plugins/opencode/opencode.plugin.js +241 -75
  47. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
  48. package/dist/agents/plugins/opencode/opencode.session.d.ts +18 -1
  49. package/dist/agents/plugins/opencode/opencode.session.d.ts.map +1 -1
  50. package/dist/agents/plugins/opencode/opencode.session.js +58 -17
  51. package/dist/agents/plugins/opencode/opencode.session.js.map +1 -1
  52. package/dist/agents/plugins/opencode/opencode.sqlite-reader.d.ts +8 -2
  53. package/dist/agents/plugins/opencode/opencode.sqlite-reader.d.ts.map +1 -1
  54. package/dist/agents/plugins/opencode/opencode.sqlite-reader.js +67 -42
  55. package/dist/agents/plugins/opencode/opencode.sqlite-reader.js.map +1 -1
  56. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts +19 -0
  57. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts.map +1 -1
  58. package/dist/agents/plugins/opencode/opencode.storage-utils.js +51 -0
  59. package/dist/agents/plugins/opencode/opencode.storage-utils.js.map +1 -1
  60. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts +13 -19
  61. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -1
  62. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +339 -82
  63. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -1
  64. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts +37 -33
  65. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts.map +1 -1
  66. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js +204 -246
  67. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js.map +1 -1
  68. package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
  69. package/dist/cli/commands/proxy/connectors/desktop.js +6 -0
  70. package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
  71. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts +1 -0
  72. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -1
  73. package/dist/cli/commands/proxy/connectors/vscode-models.js +36 -12
  74. package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -1
  75. package/dist/cli/commands/proxy/connectors/vscode.d.ts.map +1 -1
  76. package/dist/cli/commands/proxy/connectors/vscode.js +3 -0
  77. package/dist/cli/commands/proxy/connectors/vscode.js.map +1 -1
  78. package/dist/cli/commands/proxy/health-check.d.ts.map +1 -1
  79. package/dist/cli/commands/proxy/health-check.js +9 -0
  80. package/dist/cli/commands/proxy/health-check.js.map +1 -1
  81. package/dist/cli/commands/setup.d.ts +31 -0
  82. package/dist/cli/commands/setup.d.ts.map +1 -1
  83. package/dist/cli/commands/setup.js +137 -45
  84. package/dist/cli/commands/setup.js.map +1 -1
  85. package/dist/providers/core/types.d.ts +12 -1
  86. package/dist/providers/core/types.d.ts.map +1 -1
  87. package/dist/providers/core/types.js.map +1 -1
  88. package/dist/providers/plugins/bedrock/bedrock.template.d.ts.map +1 -1
  89. package/dist/providers/plugins/bedrock/bedrock.template.js +21 -2
  90. package/dist/providers/plugins/bedrock/bedrock.template.js.map +1 -1
  91. package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -1
  92. package/dist/providers/plugins/litellm/litellm.setup-steps.js +21 -5
  93. package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -1
  94. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.d.ts +7 -6
  95. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.d.ts.map +1 -1
  96. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js +13 -7
  97. package/dist/providers/plugins/sso/proxy/plugins/codex-encrypted-content-sanitizer.plugin.js.map +1 -1
  98. package/dist/providers/plugins/sso/proxy/plugins/index.js +1 -1
  99. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  100. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +3 -0
  101. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
  102. package/dist/utils/config.d.ts +6 -2
  103. package/dist/utils/config.d.ts.map +1 -1
  104. package/dist/utils/config.js +30 -8
  105. package/dist/utils/config.js.map +1 -1
  106. package/dist/utils/extensions-scan.d.ts.map +1 -1
  107. package/dist/utils/extensions-scan.js +59 -22
  108. package/dist/utils/extensions-scan.js.map +1 -1
  109. package/dist/utils/mcp-config.d.ts.map +1 -1
  110. package/dist/utils/mcp-config.js +11 -6
  111. package/dist/utils/mcp-config.js.map +1 -1
  112. package/package.json +1 -1
@@ -1,14 +1,81 @@
1
+ import { join } from 'path';
1
2
  import { logger } from '../../../utils/logger.js';
2
3
  import { getModelConfig, getChatCompletionsModelConfigs, getResponsesApiModelConfigs } from './opencode-model-configs.js';
3
4
  import { fetchDynamicModelConfigs } from './opencode-dynamic-models.js';
4
5
  import { BaseAgentAdapter } from '../../core/BaseAgentAdapter.js';
5
6
  import { commandExists } from '../../../utils/processes.js';
6
7
  import { OpenCodeSessionAdapter } from './opencode.session.js';
8
+ import { getOpenCodeConfigDir, getOpenCodeDbPath, getOpenCodeDataDir } from './opencode.paths.js';
9
+ import { startOpenCodeIncrementalSync, stopOpenCodeIncrementalSync, } from './opencode.incremental-sync.js';
7
10
  import { getHooksPluginFileUrl, cleanupHooksPlugin } from '../codemie-code-hooks/index.js';
8
11
  import { toBedrockModelId } from '../../../providers/plugins/bedrock/bedrock.utils.js';
9
12
  import { MAX_ENV_SIZE, writeConfigToTempFile } from '../../core/temp-config.js';
10
13
  import { ensureSessionFile } from '../../core/session/ensure-session.js';
11
14
  const OPENCODE_SUBCOMMANDS = ['run', 'chat', 'config', 'init', 'help', 'version'];
15
+ const OPENCODE_CLIENT_TYPE = 'codemie-opencode';
16
+ /**
17
+ * Hooks the CodeMie CLI always registers with OpenCode, on top of anything the
18
+ * user's profile defines. They measure active session time:
19
+ * UserPromptSubmit → SessionStore.startActivityTracking
20
+ * Stop → SessionStore.accumulateActiveDuration + incremental sync
21
+ *
22
+ * Stop is async (detached spawn) because the plugin executes synchronous hooks
23
+ * with execSync, which would otherwise block OpenCode's event loop while the
24
+ * child re-parses SQLite and rewrites JSONL.
25
+ */
26
+ const DEFAULT_HOOKS = {
27
+ UserPromptSubmit: [{ hooks: [{ type: 'command', command: 'codemie hook', timeout: 5 }] }],
28
+ Stop: [{ hooks: [{ type: 'command', command: 'codemie hook', timeout: 10, async: true }] }],
29
+ };
30
+ /**
31
+ * Merge the CodeMie telemetry hooks with any hooks the active profile defines.
32
+ *
33
+ * Entries are appended per event name rather than spread over the object: a
34
+ * shallow spread lets a profile that defines its own Stop or UserPromptSubmit
35
+ * REPLACE the telemetry hook, which silently zeroes active_duration_ms for
36
+ * exactly the users who customise hooks.
37
+ */
38
+ function buildMergedHooks(env) {
39
+ const mergedHooks = { ...DEFAULT_HOOKS };
40
+ if (!env.CODEMIE_PROFILE_CONFIG) {
41
+ return mergedHooks;
42
+ }
43
+ try {
44
+ const profileConfig = JSON.parse(env.CODEMIE_PROFILE_CONFIG);
45
+ if (profileConfig.hooks && typeof profileConfig.hooks === 'object') {
46
+ for (const [eventName, entries] of Object.entries(profileConfig.hooks)) {
47
+ if (!Array.isArray(entries)) {
48
+ logger.warn(`[opencode] Ignoring non-array profile hook entry: ${eventName}`);
49
+ continue;
50
+ }
51
+ mergedHooks[eventName] = [...(mergedHooks[eventName] ?? []), ...entries];
52
+ }
53
+ logger.debug('[opencode] Merged profile hooks with defaults');
54
+ }
55
+ }
56
+ catch {
57
+ // Non-critical — profile config parse failure doesn't block startup
58
+ }
59
+ return mergedHooks;
60
+ }
61
+ /**
62
+ * Build a hook config object from environment variables.
63
+ * Used by both onSessionStart and onSessionEnd lifecycle hooks.
64
+ */
65
+ function buildHookConfig(env, sessionId) {
66
+ return {
67
+ agentName: env.CODEMIE_AGENT || 'opencode',
68
+ sessionId,
69
+ provider: env.CODEMIE_PROVIDER,
70
+ apiBaseUrl: env.CODEMIE_BASE_URL,
71
+ ssoUrl: env.CODEMIE_URL,
72
+ version: env.CODEMIE_CLI_VERSION,
73
+ profileName: env.CODEMIE_PROFILE_NAME,
74
+ project: env.CODEMIE_PROJECT,
75
+ model: env.CODEMIE_MODEL,
76
+ clientType: OPENCODE_CLIENT_TYPE,
77
+ };
78
+ }
12
79
  export const OpenCodePluginMetadata = {
13
80
  name: 'opencode',
14
81
  displayName: 'OpenCode CLI',
@@ -28,7 +95,52 @@ export const OpenCodePluginMetadata = {
28
95
  model: []
29
96
  },
30
97
  supportedProviders: ['litellm', 'ai-run-sso', 'ollama', 'bedrock', 'bearer-auth'],
31
- ssoConfig: { enabled: true, clientType: 'codemie-opencode' },
98
+ ssoConfig: { enabled: true, clientType: OPENCODE_CLIENT_TYPE },
99
+ // Tool names are lower-cased before they reach the aggregator, and
100
+ // filterErrorTools does an exact match — the global default
101
+ // ['Bash','Execute','Shell'] would silently never match here.
102
+ metricsConfig: {
103
+ excludeErrorsFromTools: ['bash'],
104
+ },
105
+ // MCP servers live under a top-level `mcp` key. OpenCode accepts both the
106
+ // .json and .jsonc filenames, so each scope lists candidates in priority order.
107
+ mcpConfig: {
108
+ project: {
109
+ path: ['opencode.json', 'opencode.jsonc'],
110
+ jsonPath: 'mcp',
111
+ },
112
+ local: {
113
+ path: ['.opencode/opencode.json', '.opencode/opencode.jsonc'],
114
+ jsonPath: 'mcp',
115
+ },
116
+ user: {
117
+ path: [
118
+ join(getOpenCodeConfigDir(), 'opencode.json'),
119
+ join(getOpenCodeConfigDir(), 'opencode.jsonc'),
120
+ '~/.opencode/opencode.json',
121
+ ],
122
+ jsonPath: 'mcp',
123
+ },
124
+ },
125
+ // OpenCode accepts singular and plural directory names for every category.
126
+ // Two deliberate mappings:
127
+ // hooks → plugin/ + plugins/ (OpenCode has no hooks/ directory; plugins are
128
+ // the closest equivalent extension point)
129
+ // rules → [] (OpenCode has no rules/ concept, so the
130
+ // rules_* metric fields stay at zero)
131
+ extensionsConfig: {
132
+ project: '.opencode',
133
+ global: getOpenCodeConfigDir(),
134
+ extraGlobalDirs: ['~/.opencode'],
135
+ skillsEntryFile: 'SKILL.md',
136
+ dirNames: {
137
+ agents: ['agent', 'agents'],
138
+ commands: ['command', 'commands'],
139
+ skills: ['skill', 'skills'],
140
+ hooks: ['plugin', 'plugins'],
141
+ rules: [],
142
+ },
143
+ },
32
144
  flagMappings: {
33
145
  '--resume': {
34
146
  type: 'flag',
@@ -43,23 +155,96 @@ export const OpenCodePluginMetadata = {
43
155
  userOverrideFlags: ['--variant'],
44
156
  },
45
157
  lifecycle: {
158
+ /**
159
+ * Emit the `started` codemie_cli_session_total row and scan MCP/extensions.
160
+ *
161
+ * Runs in-process rather than via a hook: OpenCode's session.created event
162
+ * does not correspond to CLI startup, and this must happen before
163
+ * ensureSessionFile in beforeRun — otherwise the placeholder record with
164
+ * agentSessionId 'unknown' and a fabricated startTime wins, and every
165
+ * downstream metric inherits it.
166
+ *
167
+ * session_id is the CodeMie session UUID: OpenCode's own ses_* id does not
168
+ * exist yet, and using it only at SessionEnd would leave the started and
169
+ * completed rows uncorrelatable.
170
+ *
171
+ * SIDE EFFECT (user-visible, accepted): routing SessionStart through
172
+ * processEvent means handleSessionStart's syncSkillsToClaude step now runs
173
+ * for codemie-opencode too, so running this agent creates
174
+ * `{cwd}/.claude/skills/` in the user's project and copies CodeMie-managed
175
+ * skills into it — the same behaviour codemie-claude has always had.
176
+ * OpenCode does read those skills, so this is intentional rather than
177
+ * incidental, but it means a project where the user only ever ran opencode
178
+ * will now gain a .claude/ directory. Call this out in the release notes
179
+ * for any version that ships this change.
180
+ */
181
+ async onSessionStart(sessionId, env) {
182
+ try {
183
+ const { processEvent } = await import('../../../cli/commands/hook.js');
184
+ await processEvent({
185
+ hook_event_name: 'SessionStart',
186
+ session_id: sessionId,
187
+ transcript_path: '',
188
+ permission_mode: 'default',
189
+ cwd: process.cwd(),
190
+ source: 'startup',
191
+ }, buildHookConfig(env, sessionId));
192
+ logger.info(`[opencode] SessionStart hook completed for session ${sessionId}`);
193
+ }
194
+ catch (error) {
195
+ const msg = error instanceof Error ? error.message : String(error);
196
+ logger.error(`[opencode] SessionStart hook failed (non-blocking): ${msg}`);
197
+ }
198
+ // Failsafe path for metrics and conversations: everything it reads is
199
+ // already durable in opencode.db, so deltas keep flowing even if the
200
+ // injected plugin never loads.
201
+ startOpenCodeIncrementalSync({
202
+ sessionId,
203
+ startedAt: Date.now(),
204
+ cwd: process.cwd(),
205
+ metadata: OpenCodePluginMetadata,
206
+ buildContext: () => ({
207
+ sessionId,
208
+ apiBaseUrl: env.CODEMIE_SYNC_API_URL || env.CODEMIE_BASE_URL || '',
209
+ cookies: '',
210
+ clientType: OPENCODE_CLIENT_TYPE,
211
+ version: env.CODEMIE_CLI_VERSION || '0.0.0',
212
+ dryRun: false,
213
+ gitBranch: env.CODEMIE_GIT_BRANCH,
214
+ }),
215
+ ssoUrl: env.CODEMIE_URL,
216
+ syncApiUrl: env.CODEMIE_SYNC_API_URL || env.CODEMIE_BASE_URL,
217
+ cliVersion: env.CODEMIE_CLI_VERSION,
218
+ });
219
+ },
46
220
  // NOTE: beforeRun signature is (env, config) per AgentLifecycle interface
47
221
  // Claude plugin only uses (env), but interface supports both
48
222
  async beforeRun(env, config) {
49
- // Create session metadata file at startup (before config setup)
50
- // This ensures SessionSyncer can sync metrics to v1/metrics API (matching Claude/Gemini)
223
+ // Safety net only — onSessionStart normally created the record already,
224
+ // and ensureSessionFile early-returns when it exists.
51
225
  const sessionId = env.CODEMIE_SESSION_ID;
52
226
  if (sessionId) {
53
227
  try {
54
- logger.debug(`[opencode] Creating session metadata file before startup`);
55
228
  await ensureSessionFile(sessionId, env, 'opencode');
56
- logger.debug(`[opencode] Session metadata file ready for SessionSyncer`);
57
229
  }
58
230
  catch (error) {
59
231
  logger.error('[opencode] Failed to create session file in beforeRun', { error });
60
232
  // Don't throw - let OpenCode run even if session file creation fails
61
233
  }
62
234
  }
235
+ // Point the injected plugin at the transcript codemie hook must re-parse.
236
+ // performIncrementalSync skips any event without a transcript_path.
237
+ // getOpenCodeDbPath() gates on existsSync, and the DB is only created once
238
+ // opencode itself first writes it — i.e. after beforeRun. Falling back to
239
+ // the expected location keeps transcript_path non-empty on a first-ever
240
+ // run; without it validateHookEvent rejects every UserPromptSubmit and
241
+ // Stop with exit 2 for that entire first session.
242
+ env.CODEMIE_OPENCODE_TRANSCRIPT = getOpenCodeDbPath() ?? join(getOpenCodeDataDir(), 'opencode.db');
243
+ // Register the telemetry hooks BEFORE the base-URL early returns below.
244
+ // Hook registration does not depend on the proxy config, and leaving it
245
+ // downstream meant any run without CODEMIE_BASE_URL got no turn
246
+ // boundaries at all, so active_duration_ms stayed 0.
247
+ env.OPENCODE_HOOKS = JSON.stringify({ hooks: buildMergedHooks(env) });
63
248
  const provider = env.CODEMIE_PROVIDER;
64
249
  const baseUrl = env.CODEMIE_BASE_URL;
65
250
  if (!baseUrl) {
@@ -145,27 +330,13 @@ export const OpenCodePluginMetadata = {
145
330
  },
146
331
  model: `${activeProvider}/${isBedrock ? toBedrockModelId(modelConfig.id, env.AWS_REGION || env.CODEMIE_AWS_REGION) : modelConfig.id}`
147
332
  };
148
- // --- Hooks injection ---
149
- // 1. Forward hooks configuration from profile
150
- if (env.CODEMIE_PROFILE_CONFIG) {
151
- try {
152
- const profileConfig = JSON.parse(env.CODEMIE_PROFILE_CONFIG);
153
- if (profileConfig.hooks && Object.keys(profileConfig.hooks).length > 0) {
154
- env.OPENCODE_HOOKS = JSON.stringify({ hooks: profileConfig.hooks });
155
- logger.debug('[opencode] Forwarded hooks config to opencode binary');
156
- }
157
- }
158
- catch {
159
- // Non-critical — profile config parse failure doesn't block startup
160
- }
161
- }
162
- // 2. Inject shell-hooks plugin if hooks are configured
163
- if (env.OPENCODE_HOOKS) {
164
- const pluginUrl = getHooksPluginFileUrl();
165
- openCodeConfig.plugin = openCodeConfig.plugin || [];
166
- openCodeConfig.plugin.push(pluginUrl);
167
- logger.debug(`[opencode] Injected hooks plugin: ${pluginUrl}`);
168
- }
333
+ // Inject the shell-hooks plugin — it is what delivers OPENCODE_HOOKS
334
+ // (already registered above, before the base-URL early return) to
335
+ // `codemie hook`. Only this half genuinely depends on the proxy config.
336
+ const pluginUrl = getHooksPluginFileUrl();
337
+ openCodeConfig.plugin = openCodeConfig.plugin || [];
338
+ openCodeConfig.plugin.push(pluginUrl);
339
+ logger.debug(`[opencode] Injected hooks plugin: ${pluginUrl}`);
169
340
  env.OPENCODE_DISABLE_SHARE = 'true';
170
341
  const configJson = JSON.stringify(openCodeConfig);
171
342
  // Config injection strategy:
@@ -210,69 +381,64 @@ export const OpenCodePluginMetadata = {
210
381
  return args;
211
382
  },
212
383
  /**
213
- * Process OpenCode session metrics before SessionSyncer runs
214
- *
215
- * Called by BaseAgentAdapter when OpenCode session ends, BEFORE SessionSyncer.
216
- * This hook ensures metrics are written to JSONL in time for SessionSyncer's
217
- * metrics-sync processor to send them to v1/metrics API.
384
+ * Close out the session: flush remaining deltas and conversations, upload
385
+ * them, emit the `completed` codemie_cli_session_total row, and archive the
386
+ * spool files.
218
387
  *
219
- * Lifecycle order:
220
- * 1. OpenCode exits
221
- * 2. Grace period (wait for file writes)
222
- * 3. onSessionEnd ← WE ARE HERE (process metrics to JSONL)
223
- * 4. SessionSyncer runs (reads JSONL, sends to v1/metrics)
224
- * 5. Proxy stops
225
- * 6. afterRun (cleanup)
388
+ * Routed through processEvent rather than calling the adapter directly, so
389
+ * the full SessionEnd pipeline runs in the right order:
390
+ * accumulateActiveDuration → incremental sync → SessionSyncer upload →
391
+ * session-end metrics → status update → rename to completed_*
226
392
  *
227
- * This matches Claude/Gemini real-time sync behavior where SessionSyncer
228
- * automatically sends metrics during the session lifecycle.
393
+ * The previous implementation only wrote JSONL, with an empty cookie jar
394
+ * and no SessionSyncer call, and relied on the proxy's shutdown timer to
395
+ * upload whatever happened to be on disk.
229
396
  */
230
397
  async onSessionEnd(exitCode, env) {
231
398
  const sessionId = env.CODEMIE_SESSION_ID;
232
399
  if (!sessionId) {
233
- logger.debug('[opencode] No CODEMIE_SESSION_ID in environment, skipping metrics processing');
400
+ logger.debug('[opencode] No CODEMIE_SESSION_ID in environment, skipping session end');
234
401
  return;
235
402
  }
403
+ stopOpenCodeIncrementalSync(sessionId);
236
404
  try {
237
- logger.info(`[opencode] Processing session metrics before SessionSyncer (code=${exitCode})`);
238
- // 1. Initialize session adapter
239
- const adapter = new OpenCodeSessionAdapter(OpenCodePluginMetadata);
240
- // 2. Discover recent sessions (last 24 hours)
241
- const sessions = await adapter.discoverSessions({ maxAgeDays: 1 });
242
- if (sessions.length === 0) {
243
- logger.warn('[opencode] No recent OpenCode sessions found for processing');
244
- return;
245
- }
246
- // 3. Process the most recent session
247
- const latestSession = sessions[0];
248
- logger.debug(`[opencode] Processing latest session: ${latestSession.sessionId}`);
249
- logger.debug(`[opencode] OpenCode session ID: ${latestSession.sessionId}`);
250
- logger.debug(`[opencode] CodeMie session ID: ${sessionId}`);
251
- // 4. Build processing context (same as CLI command)
252
- const context = {
253
- sessionId,
254
- apiBaseUrl: env.CODEMIE_BASE_URL || '',
255
- cookies: '', // Will be loaded by processors if needed
256
- clientType: 'codemie-opencode',
257
- version: env.CODEMIE_CLI_VERSION || '1.0.0',
258
- dryRun: false
259
- };
260
- // 5. Process session (extracts metrics + conversations to JSONL)
261
- const result = await adapter.processSession(latestSession.filePath, sessionId, context);
262
- if (result.success) {
263
- logger.info(`[opencode] Metrics processing complete: ${result.totalRecords} records processed`);
264
- logger.info(`[opencode] Metrics written to JSONL - SessionSyncer will sync to v1/metrics next`);
405
+ // Discover the transcript to re-parse. Constrained to this working
406
+ // directory: the CLI reads the user's shared opencode.db, which holds
407
+ // sessions from every project they have open.
408
+ let transcriptPath = '';
409
+ try {
410
+ const adapter = new OpenCodeSessionAdapter(OpenCodePluginMetadata);
411
+ const sessions = await adapter.discoverSessions({
412
+ maxAgeDays: 1,
413
+ limit: 1,
414
+ cwd: process.cwd(),
415
+ });
416
+ if (sessions.length > 0) {
417
+ transcriptPath = sessions[0].filePath;
418
+ logger.debug(`[opencode] Discovered OpenCode session: ${sessions[0].sessionId}`);
419
+ }
420
+ else {
421
+ logger.debug('[opencode] No recent OpenCode sessions found for this directory');
422
+ }
265
423
  }
266
- else {
267
- logger.warn(`[opencode] Metrics processing had failures: ${result.failedProcessors.join(', ')}`);
424
+ catch (discoverError) {
425
+ const msg = discoverError instanceof Error ? discoverError.message : String(discoverError);
426
+ logger.debug(`[opencode] Session discovery failed (non-blocking): ${msg}`);
268
427
  }
269
- // Note: SessionSyncer runs IMMEDIATELY after this hook completes.
270
- // It will read the JSONL deltas we just wrote and send them to v1/metrics API.
271
- // This matches Claude/Gemini real-time sync behavior during session lifecycle.
428
+ const { processEvent } = await import('../../../cli/commands/hook.js');
429
+ await processEvent({
430
+ hook_event_name: 'SessionEnd',
431
+ session_id: sessionId,
432
+ transcript_path: transcriptPath,
433
+ permission_mode: 'default',
434
+ cwd: process.cwd(),
435
+ reason: exitCode === 0 ? 'exit' : `exit(${exitCode})`,
436
+ }, buildHookConfig(env, sessionId));
437
+ logger.info(`[opencode] SessionEnd hook completed for session ${sessionId}`);
272
438
  }
273
439
  catch (error) {
274
440
  const errorMessage = error instanceof Error ? error.message : String(error);
275
- logger.error(`[opencode] Failed to process session metrics automatically: ${errorMessage}`);
441
+ logger.error(`[opencode] SessionEnd hook failed (non-blocking): ${errorMessage}`);
276
442
  // Don't throw - metrics failure shouldn't block exit
277
443
  }
278
444
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.plugin.js","sourceRoot":"","sources":["../../../../src/agents/plugins/opencode/opencode.plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode.plugin.js","sourceRoot":"","sources":["../../../../src/agents/plugins/opencode/opencode.plugin.ts"],"names":[],"mappings":"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"}
@@ -27,12 +27,29 @@ export declare class OpenCodeSessionAdapter implements SessionAdapter {
27
27
  * UPDATED (GPT-5.9): OpenCode uses numeric timestamps (time.created/time.updated)
28
28
  * not ISO strings. We convert to ISO for CodeMie's canonical format.
29
29
  */
30
- parseSessionFile(filePath: string, sessionId: string): Promise<ParsedSession>;
30
+ parseSessionFile(filePath: string, sessionId: string, openCodeSessionId?: string): Promise<ParsedSession>;
31
31
  /**
32
32
  * Parse a session from SQLite database.
33
33
  * Reads session, messages, and all parts in bulk from opencode.db.
34
+ *
35
+ * @param openCodeSessionId - OpenCode's own `ses_*` id when known. The plugin
36
+ * Stop hook supplies it via ProcessingContext.agentSessionId; the in-process
37
+ * SessionEnd path cannot (OpenCode's id does not exist when the CodeMie
38
+ * session record is created), so selection falls back to a cwd match.
34
39
  */
35
40
  private parseSessionFromDb;
41
+ /**
42
+ * Pick which OpenCode session a set of DB rows refers to.
43
+ *
44
+ * Ordering matters: the previous implementation used
45
+ * `sessions.find(s => s.id === sessionId) ?? sessions[0]` where `sessionId`
46
+ * is a CodeMie UUID. That match can never succeed, so it always degraded to
47
+ * "newest session in any directory" — silently attributing another
48
+ * repository's session to this one.
49
+ *
50
+ * @param sessions - Rows already sorted newest-first by readSessionsFromDb
51
+ */
52
+ private selectSessionFromDb;
36
53
  /**
37
54
  * Validate session path has expected structure (GPT-5.8 fix, updated GPT-5.10/5.11)
38
55
  * Expected: .../storage/session/{projectId}/{sessionId}.json
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.session.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/opencode/opencode.session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC5J,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgEzD;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAI/C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,QAAQ,CAAC,SAAS,cAAc;IAChC,OAAO,CAAC,UAAU,CAA0B;gBAEf,QAAQ,EAAE,aAAa;IAOpD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAMpD;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoEnF;;;OAGG;YACW,kBAAkB;IA6DhC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;;;OASG;YACW,YAAY;IA6B1B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IA6D5B;;;;;OAKG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA+JxF"}
1
+ {"version":3,"file":"opencode.session.d.ts","sourceRoot":"","sources":["../../../../src/agents/plugins/opencode/opencode.session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC5J,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgEzD;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAI/C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,QAAQ,CAAC,SAAS,cAAc;IAChC,OAAO,CAAC,UAAU,CAA0B;gBAEf,QAAQ,EAAE,aAAa;IAOpD;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAMpD;;;;;OAKG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,aAAa,CAAC;IAoEzB;;;;;;;;OAQG;YACW,kBAAkB;IAiEhC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;;;OASG;YACW,YAAY;IA6B1B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IA0E5B;;;;;OAKG;IACG,gBAAgB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CA4JxF"}
@@ -91,10 +91,10 @@ export class OpenCodeSessionAdapter {
91
91
  * UPDATED (GPT-5.9): OpenCode uses numeric timestamps (time.created/time.updated)
92
92
  * not ISO strings. We convert to ISO for CodeMie's canonical format.
93
93
  */
94
- async parseSessionFile(filePath, sessionId) {
94
+ async parseSessionFile(filePath, sessionId, openCodeSessionId) {
95
95
  // Route to SQLite parsing if filePath points to a .db file
96
96
  if (filePath.endsWith('.db')) {
97
- return this.parseSessionFromDb(filePath, sessionId);
97
+ return this.parseSessionFromDb(filePath, sessionId, openCodeSessionId);
98
98
  }
99
99
  try {
100
100
  // Validate path shape before proceeding (GPT-5.8 fix)
@@ -152,19 +152,21 @@ export class OpenCodeSessionAdapter {
152
152
  /**
153
153
  * Parse a session from SQLite database.
154
154
  * Reads session, messages, and all parts in bulk from opencode.db.
155
+ *
156
+ * @param openCodeSessionId - OpenCode's own `ses_*` id when known. The plugin
157
+ * Stop hook supplies it via ProcessingContext.agentSessionId; the in-process
158
+ * SessionEnd path cannot (OpenCode's id does not exist when the CodeMie
159
+ * session record is created), so selection falls back to a cwd match.
155
160
  */
156
- async parseSessionFromDb(dbPath, sessionId) {
161
+ async parseSessionFromDb(dbPath, sessionId, openCodeSessionId) {
157
162
  try {
158
163
  logger.debug(`[opencode-adapter] Parsing session ${sessionId} from SQLite: ${dbPath}`);
159
- // Read session data
160
- // Note: sessionId may be a CodeMie UUID (not an OpenCode ses_* ID).
161
- // Try exact match first, then fallback to most recent session (sorted by time_created DESC).
162
164
  const sessions = await readSessionsFromDb(dbPath, { maxAgeDays: 1 });
163
- const session = sessions.find(s => s.id === sessionId) ?? sessions[0];
165
+ const session = this.selectSessionFromDb(sessions, openCodeSessionId);
164
166
  if (!session) {
165
167
  throw new Error(`Session ${sessionId} not found in SQLite DB: ${dbPath}`);
166
168
  }
167
- if (session.id !== sessionId) {
169
+ if (session.id !== openCodeSessionId) {
168
170
  logger.debug(`[opencode-adapter] Mapped CodeMie session ${sessionId} → OpenCode session ${session.id}`);
169
171
  }
170
172
  // Read messages using OpenCode session ID (not CodeMie UUID)
@@ -190,6 +192,9 @@ export class OpenCodeSessionAdapter {
190
192
  openCodeVersion: session.version,
191
193
  partsMap,
192
194
  storageType: 'sqlite',
195
+ // gitBranch is overlaid by processSession from ProcessingContext when
196
+ // available; the metrics processor falls back to detecting it from
197
+ // projectPath.
193
198
  };
194
199
  return {
195
200
  sessionId,
@@ -204,6 +209,36 @@ export class OpenCodeSessionAdapter {
204
209
  throw error;
205
210
  }
206
211
  }
212
+ /**
213
+ * Pick which OpenCode session a set of DB rows refers to.
214
+ *
215
+ * Ordering matters: the previous implementation used
216
+ * `sessions.find(s => s.id === sessionId) ?? sessions[0]` where `sessionId`
217
+ * is a CodeMie UUID. That match can never succeed, so it always degraded to
218
+ * "newest session in any directory" — silently attributing another
219
+ * repository's session to this one.
220
+ *
221
+ * @param sessions - Rows already sorted newest-first by readSessionsFromDb
222
+ */
223
+ selectSessionFromDb(sessions, openCodeSessionId) {
224
+ // 1. Exact match on OpenCode's own id (plugin Stop path).
225
+ if (openCodeSessionId?.startsWith('ses_')) {
226
+ const exact = sessions.find(s => s.id === openCodeSessionId);
227
+ if (exact)
228
+ return exact;
229
+ }
230
+ // 2. Newest session started in this working directory (in-process SessionEnd path).
231
+ const cwd = process.cwd().replace(/\/+$/, '');
232
+ const byCwd = sessions.find(s => s.directory.replace(/\/+$/, '') === cwd);
233
+ if (byCwd)
234
+ return byCwd;
235
+ // 3. Newest session overall — may belong to another repository.
236
+ if (sessions.length > 0) {
237
+ logger.warn(`[opencode-adapter] No OpenCode session matched id=${openCodeSessionId ?? 'n/a'} or cwd=${cwd}; ` +
238
+ `falling back to newest session ${sessions[0].id} (directory=${sessions[0].directory})`);
239
+ }
240
+ return sessions[0];
241
+ }
207
242
  /**
208
243
  * Validate session path has expected structure (GPT-5.8 fix, updated GPT-5.10/5.11)
209
244
  * Expected: .../storage/session/{projectId}/{sessionId}.json
@@ -300,8 +335,16 @@ export class OpenCodeSessionAdapter {
300
335
  async processSession(filePath, sessionId, context) {
301
336
  try {
302
337
  logger.debug(`[opencode-adapter] Processing session ${sessionId} with ${this.processors.length} processors`);
303
- // 1. Parse session once
304
- const parsedSession = await this.parseSessionFile(filePath, sessionId);
338
+ // 1. Parse session once.
339
+ // context.agentSessionId is OpenCode's ses_* id on the plugin Stop path
340
+ // and the CodeMie UUID on the in-process SessionEnd path; the adapter
341
+ // distinguishes them by prefix.
342
+ const parsedSession = await this.parseSessionFile(filePath, sessionId, context.agentSessionId);
343
+ // Carry the branch resolved by the CLI through to the processors so every
344
+ // MetricDelta is attributed to a branch (the aggregator groups on it).
345
+ if (context.gitBranch && parsedSession.metadata) {
346
+ parsedSession.metadata.gitBranch = context.gitBranch;
347
+ }
305
348
  // 2. Run processors in priority order
306
349
  const processorResults = {};
307
350
  const failedProcessors = [];
@@ -359,9 +402,12 @@ export class OpenCodeSessionAdapter {
359
402
  if (dbPath && await isSqliteAvailable()) {
360
403
  logger.debug(`[opencode-discovery] Using SQLite storage: ${dbPath}`);
361
404
  try {
405
+ // Age, directory and limit predicates are applied in SQL — this query
406
+ // runs on every incremental-sync tick against the user's live database.
362
407
  const sessions = await readSessionsFromDb(dbPath, {
363
408
  maxAgeDays: options?.maxAgeDays ?? 30,
364
409
  cwd: options?.cwd,
410
+ limit: options?.limit,
365
411
  });
366
412
  const descriptors = sessions.map(session => ({
367
413
  sessionId: session.id,
@@ -371,14 +417,9 @@ export class OpenCodeSessionAdapter {
371
417
  updatedAt: typeof session.time?.updated === 'number' ? session.time.updated : undefined,
372
418
  agentName: 'opencode',
373
419
  }));
374
- // Sort by createdAt descending (newest first)
420
+ // Already ordered by time_created DESC in SQL; re-sort defensively for
421
+ // the sqlite3 CLI fallback path.
375
422
  descriptors.sort((a, b) => b.createdAt - a.createdAt);
376
- // Apply limit
377
- if (options?.limit && options.limit > 0) {
378
- const limited = descriptors.slice(0, options.limit);
379
- logger.debug(`[opencode-discovery] Found ${descriptors.length} SQLite sessions, returning ${limited.length} (limit: ${options.limit})`);
380
- return limited;
381
- }
382
423
  logger.debug(`[opencode-discovery] Found ${descriptors.length} SQLite sessions`);
383
424
  return descriptors;
384
425
  }