@adhdev/daemon-core 0.9.71 → 0.9.73

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/session-host-core",
3
- "version": "0.9.71",
3
+ "version": "0.9.73",
4
4
  "description": "ADHDev local session host core \u2014 session registry, protocol, buffers",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adhdev/daemon-core",
3
- "version": "0.9.71",
3
+ "version": "0.9.73",
4
4
  "description": "ADHDev daemon core \u2014 CDP, IDE detection, providers, command execution",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,12 +1,20 @@
1
- import { join } from 'path'
1
+ import { existsSync, realpathSync } from 'node:fs'
2
+ import { createRequire } from 'node:module'
3
+ import { dirname, join, resolve } from 'node:path'
2
4
  import type { ProviderModule, MeshCoordinatorMcpConfigFormat } from '../providers/contracts.js'
3
5
 
6
+ export interface MeshCoordinatorMcpServerLaunch {
7
+ command: string
8
+ args: string[]
9
+ }
10
+
4
11
  export type MeshCoordinatorSetup =
5
12
  | {
6
13
  kind: 'auto_import'
7
14
  serverName: string
8
15
  configPath: string
9
16
  configFormat?: MeshCoordinatorMcpConfigFormat
17
+ mcpServer: MeshCoordinatorMcpServerLaunch
10
18
  }
11
19
  | {
12
20
  kind: 'manual'
@@ -27,6 +35,8 @@ export interface ResolveMeshCoordinatorSetupOptions {
27
35
  meshId: string
28
36
  workspace: string
29
37
  adhdevMcpCommand?: string
38
+ adhdevMcpEntryPath?: string
39
+ nodeExecutable?: string
30
40
  }
31
41
 
32
42
  const DEFAULT_SERVER_NAME = 'adhdev-mesh'
@@ -56,11 +66,23 @@ export function resolveMeshCoordinatorSetup(options: ResolveMeshCoordinatorSetup
56
66
  if (!path) {
57
67
  return { kind: 'unsupported', reason: 'Provider auto-import MCP config is missing a config path' }
58
68
  }
69
+ const mcpServer = resolveAdhdevMcpServerLaunch({
70
+ meshId,
71
+ nodeExecutable: options.nodeExecutable,
72
+ adhdevMcpEntryPath: options.adhdevMcpEntryPath,
73
+ })
74
+ if (!mcpServer) {
75
+ return {
76
+ kind: 'unsupported',
77
+ reason: 'Could not resolve the ADHDev MCP server entrypoint without relying on a PATH bin shim',
78
+ }
79
+ }
59
80
  return {
60
81
  kind: 'auto_import',
61
82
  serverName,
62
83
  configPath: join(workspace, path),
63
84
  configFormat: mcpConfig.format,
85
+ mcpServer,
64
86
  }
65
87
  }
66
88
 
@@ -95,3 +117,62 @@ export function resolveMeshCoordinatorSetup(options: ResolveMeshCoordinatorSetup
95
117
  function renderMeshCoordinatorTemplate(template: string, values: Record<string, string>): string {
96
118
  return template.replace(/\{\{\s*(meshId|workspace|serverName|adhdevMcpCommand)\s*\}\}/g, (_, key: string) => values[key] || '')
97
119
  }
120
+
121
+ function resolveAdhdevMcpServerLaunch(options: {
122
+ meshId: string
123
+ nodeExecutable?: string
124
+ adhdevMcpEntryPath?: string
125
+ }): MeshCoordinatorMcpServerLaunch | null {
126
+ const entryPath = resolveAdhdevMcpEntryPath(options.adhdevMcpEntryPath)
127
+ if (!entryPath) return null
128
+ return {
129
+ command: options.nodeExecutable?.trim() || process.execPath,
130
+ args: [entryPath, '--repo-mesh', options.meshId],
131
+ }
132
+ }
133
+
134
+ function resolveAdhdevMcpEntryPath(explicitPath?: string): string | null {
135
+ const explicit = explicitPath?.trim()
136
+ if (explicit) return normalizeExistingPath(explicit) || explicit
137
+
138
+ const envPath = process.env.ADHDEV_MCP_SERVER_PATH?.trim()
139
+ if (envPath) return normalizeExistingPath(envPath) || envPath
140
+
141
+ const candidates: string[] = []
142
+ const addCandidate = (candidate: string) => {
143
+ if (!candidates.includes(candidate)) candidates.push(candidate)
144
+ }
145
+ const addPackagedCandidates = (baseFile?: string) => {
146
+ if (!baseFile) return
147
+ const realBase = normalizeExistingPath(baseFile) || baseFile
148
+ const dir = dirname(realBase)
149
+ addCandidate(resolve(dir, '../vendor/mcp-server/index.js'))
150
+ addCandidate(resolve(dir, '../../vendor/mcp-server/index.js'))
151
+ addCandidate(resolve(dir, '../../../vendor/mcp-server/index.js'))
152
+ }
153
+
154
+ addPackagedCandidates(process.argv[1])
155
+
156
+ for (const candidate of candidates) {
157
+ const normalized = normalizeExistingPath(candidate)
158
+ if (normalized) return normalized
159
+ }
160
+
161
+ try {
162
+ const requireBase = process.argv[1] ? (normalizeExistingPath(process.argv[1]) || process.argv[1]) : join(process.cwd(), 'adhdev-daemon.js')
163
+ const req = createRequire(requireBase)
164
+ const resolvedModule = req.resolve('@adhdev/mcp-server')
165
+ return normalizeExistingPath(resolvedModule) || resolvedModule
166
+ } catch {
167
+ return null
168
+ }
169
+ }
170
+
171
+ function normalizeExistingPath(filePath: string): string | null {
172
+ try {
173
+ if (!existsSync(filePath)) return null
174
+ return realpathSync.native(filePath)
175
+ } catch {
176
+ return null
177
+ }
178
+ }
@@ -1019,7 +1019,25 @@ export class DaemonCommandRouter {
1019
1019
  if (!mesh) return { success: false, error: 'Mesh not found' };
1020
1020
  if (!Array.isArray(mesh.nodes) || mesh.nodes.length === 0) return { success: false, error: 'No nodes in mesh' };
1021
1021
 
1022
- const workspace = mesh.nodes[0].workspace;
1022
+ const requestedCoordinatorNodeId = typeof args?.coordinatorNodeId === 'string'
1023
+ ? args.coordinatorNodeId.trim()
1024
+ : '';
1025
+ const preferredCoordinatorNodeId = requestedCoordinatorNodeId
1026
+ || (typeof mesh.coordinator?.preferredNodeId === 'string' ? mesh.coordinator.preferredNodeId.trim() : '');
1027
+ const coordinatorNode = preferredCoordinatorNodeId
1028
+ ? mesh.nodes.find((node: any) => node?.id === preferredCoordinatorNodeId || node?.nodeId === preferredCoordinatorNodeId)
1029
+ : mesh.nodes[0];
1030
+ if (!coordinatorNode) {
1031
+ return {
1032
+ success: false,
1033
+ code: 'mesh_coordinator_node_not_found',
1034
+ error: `Coordinator node ${preferredCoordinatorNodeId} was not found in mesh`,
1035
+ meshId,
1036
+ cliType,
1037
+ };
1038
+ }
1039
+ const workspace = typeof coordinatorNode.workspace === 'string' ? coordinatorNode.workspace.trim() : '';
1040
+ if (!workspace) return { success: false, error: 'Coordinator node workspace required', meshId, cliType };
1023
1041
  const providerMeta = this.deps.providerLoader.resolve?.(cliType) || this.deps.providerLoader.getMeta(cliType);
1024
1042
  const coordinatorSetup = resolveMeshCoordinatorSetup({
1025
1043
  provider: providerMeta,
@@ -1081,8 +1099,8 @@ export class DaemonCommandRouter {
1081
1099
  mcpServers: {
1082
1100
  ...(existingMcpConfig.mcpServers || {}),
1083
1101
  [coordinatorSetup.serverName]: {
1084
- command: 'adhdev-mcp',
1085
- args: ['--repo-mesh', meshId],
1102
+ command: coordinatorSetup.mcpServer.command,
1103
+ args: coordinatorSetup.mcpServer.args,
1086
1104
  },
1087
1105
  },
1088
1106
  };