@cocorograph/hub-agent 0.7.56 → 0.7.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/hub-bundle.mjs +51 -17
package/package.json
CHANGED
package/src/hub-bundle.mjs
CHANGED
|
@@ -300,6 +300,15 @@ function runOnce(argv, { logger } = {}) {
|
|
|
300
300
|
* (Cockpit 用途では install.sh が事前に claude をインストールしている
|
|
301
301
|
* 想定だが、独自運用環境への配慮で fail-soft にする)
|
|
302
302
|
*/
|
|
303
|
+
/**
|
|
304
|
+
* ホスト資格ヘッダ(`X-Cockpit-Agent`)を付与する Hub の MCP サーバー名。
|
|
305
|
+
*
|
|
306
|
+
* Hub backend の acting tenant はこのヘッダで**ホストのテナントに固定**される。両方に
|
|
307
|
+
* 付けるのが正(`hub` だけだと、社内が実際に使う `hub_staff` が固定されず、フロントの
|
|
308
|
+
* ワークスペース切替で実行中セッションがデータを読めなくなる)。
|
|
309
|
+
*/
|
|
310
|
+
export const HUB_MCP_NAMES = new Set(["hub", "hub_staff"])
|
|
311
|
+
|
|
303
312
|
export async function applyMcpServers(bundle, { agentId, agentToken, logger } = {}) {
|
|
304
313
|
const servers = Array.isArray(bundle?.mcp_servers) ? bundle.mcp_servers : []
|
|
305
314
|
if (servers.length === 0) return { added: [], skipped: [] }
|
|
@@ -320,29 +329,54 @@ export async function applyMcpServers(bundle, { agentId, agentToken, logger } =
|
|
|
320
329
|
}
|
|
321
330
|
const transport = s.transport || "http"
|
|
322
331
|
const scope = s.scope || "user"
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
|
|
332
|
+
|
|
333
|
+
// 越境制御 (2026-07-14 訂正): **Hub の MCP(`hub` / `hub_staff`)の両方**に、この
|
|
334
|
+
// ホストの資格 `X-Cockpit-Agent: <agentId>:<agentToken>` をヘッダで付与する。Hub
|
|
335
|
+
// backend はこれを検証してホストのテナントを解決し、acting tenant をそのテナントに
|
|
336
|
+
// **固定**する(フロントエンドのワークスペース切替より優先。端末とワークスペースを
|
|
337
|
+
// 紐づけるのが設計意図)。外部 MCP には付けない。
|
|
338
|
+
//
|
|
339
|
+
// ⚠️ かつて `hub` にしか付けていなかったが、**設計意図が未達だった**。社内の横断作業は
|
|
340
|
+
// decision B により `hub_staff` を使うため、**実際に使う経路が固定されず**、フロントを
|
|
341
|
+
// 個人WSに切り替えると実行中の Cockpit セッションがココログラフのデータを読めなくなる
|
|
342
|
+
// 回帰が残っていた(本番実測 2026-07-14)。
|
|
343
|
+
//
|
|
344
|
+
// `hub_staff` を固定しても社内スタッフの横断は死なない: 提供元(ココログラフ)ホストは
|
|
345
|
+
// ココログラフテナントに固定され、backend の `is_unrestricted` はそこで真になるため
|
|
346
|
+
// (固定 ≠ 横断不可。固定されたテナントが提供元かどうかで決まる)。
|
|
347
|
+
const wantHeader = HUB_MCP_NAMES.has(s.name) && agentId && agentToken
|
|
348
|
+
|
|
349
|
+
// ⚠️ 実 CLI で確認した 2 つの罠(claude-code、モックでは絶対に出ない):
|
|
350
|
+
//
|
|
351
|
+
// 1. `--header` は **可変長引数** (`-H, --header <header...>`)。オプションを
|
|
352
|
+
// 位置引数より前に置くと、後続の `<name> <url>` まで header 値として飲み込み、
|
|
353
|
+
// `error: missing required argument 'name'` で落ちる。
|
|
354
|
+
// → **必ず `<name> <url>` の後ろに置く**(実測: 後置なら headers に正しく入る)。
|
|
355
|
+
//
|
|
356
|
+
// 2. `claude mcp add` は **冪等ではない**。既存の同名 server があると
|
|
357
|
+
// `MCP server <name> already exists in <scope> config` を返して失敗し、
|
|
358
|
+
// **ヘッダは永久に適用されない**(=publish しても pin が発火しない)。
|
|
359
|
+
// → ヘッダを付ける対象は **remove してから add** して確実に再登録する。
|
|
360
|
+
// remove は「存在しなければ失敗する」ので、失敗は握り潰して続行する。
|
|
361
|
+
const argv = [claudeBin, "mcp", "add", "--transport", transport, "--scope", scope, s.name, s.url]
|
|
362
|
+
if (wantHeader) {
|
|
338
363
|
argv.push("--header", `X-Cockpit-Agent: ${agentId}:${agentToken}`)
|
|
339
364
|
}
|
|
340
|
-
|
|
365
|
+
|
|
341
366
|
try {
|
|
367
|
+
if (wantHeader) {
|
|
368
|
+
// 既存があると add が弾かれるため、先に落とす(無ければ失敗するので無視)。
|
|
369
|
+
try {
|
|
370
|
+
await runOnce([claudeBin, "mcp", "remove", s.name, "-s", scope], { logger })
|
|
371
|
+
} catch {
|
|
372
|
+
// 未登録 → remove は失敗するが正常系。
|
|
373
|
+
}
|
|
374
|
+
}
|
|
342
375
|
await runOnce(argv, { logger })
|
|
343
376
|
added.push(s.name)
|
|
344
377
|
} catch (err) {
|
|
345
|
-
//
|
|
378
|
+
// ヘッダ不要の外部 MCP は既存なら "already exists" で失敗する。これは「既に正しく
|
|
379
|
+
// 登録済み」なので実害なし。ログだけ残して継続する。
|
|
346
380
|
logger?.warn({ name: s.name, err: err.message }, "claude mcp add failed")
|
|
347
381
|
skipped.push(s.name)
|
|
348
382
|
}
|