@schoolai/shipyard 3.11.0 → 3.11.1-nightly.20260612.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.
- package/README.md +2 -2
- package/dist/{auth-GGM253LQ.js → auth-DY3AOBIE.js} +4 -4
- package/dist/capability-detector-worker.js +12 -11
- package/dist/capability-detector-worker.js.map +1 -1
- package/dist/{chunk-GM6MH4CD.js → chunk-3C2PO35N.js} +2 -2
- package/dist/{chunk-R3XQ6W7L.js → chunk-56IW4AFX.js} +6 -6
- package/dist/{chunk-ZRJTZLRF.js → chunk-COXXKMNA.js} +5 -5
- package/dist/{chunk-YXPPZQBJ.js → chunk-H24YSVLO.js} +654 -198
- package/dist/chunk-H24YSVLO.js.map +1 -0
- package/dist/{chunk-3WEEGJJN.js → chunk-HA2A36QQ.js} +3 -3
- package/dist/{chunk-CNR7O5YH.js → chunk-JCEWPG3R.js} +1247 -501
- package/dist/chunk-JCEWPG3R.js.map +1 -0
- package/dist/{chunk-RW2OTTUA.js → chunk-JKKKUMTY.js} +5 -5
- package/dist/chunk-JKKKUMTY.js.map +1 -0
- package/dist/{chunk-6LINHACK.js → chunk-JMAANHA3.js} +48 -25
- package/dist/chunk-JMAANHA3.js.map +1 -0
- package/dist/chunk-KHDDLCZA.js +219 -0
- package/dist/chunk-KHDDLCZA.js.map +1 -0
- package/dist/chunk-MA6LKK5N.js +62 -0
- package/dist/chunk-MA6LKK5N.js.map +1 -0
- package/dist/{chunk-RMLQ5DRP.js → chunk-NV6C52I4.js} +13 -3
- package/dist/chunk-NV6C52I4.js.map +1 -0
- package/dist/{chunk-C6QOTETH.js → chunk-PQOSU5NG.js} +95 -27
- package/dist/chunk-PQOSU5NG.js.map +1 -0
- package/dist/{chunk-IJHF4OM4.js → chunk-PSW2XYRT.js} +2 -2
- package/dist/{chunk-2EQOL57Z.js → chunk-SFZAOGRS.js} +29 -7
- package/dist/chunk-SFZAOGRS.js.map +1 -0
- package/dist/chunk-SOMRAWDG.js +120 -0
- package/dist/chunk-SOMRAWDG.js.map +1 -0
- package/dist/{chunk-Z37T5W6S.js → chunk-SU6LPOYA.js} +30 -9
- package/dist/chunk-SU6LPOYA.js.map +1 -0
- package/dist/chunk-UNGAIUEX.js +165 -0
- package/dist/chunk-UNGAIUEX.js.map +1 -0
- package/dist/{chunk-NACJENDW.js → chunk-WW4UGZBY.js} +2 -2
- package/dist/{chunk-A2UK6TW2.js → chunk-Y4EUOS7M.js} +19 -2
- package/dist/{chunk-A2UK6TW2.js.map → chunk-Y4EUOS7M.js.map} +1 -1
- package/dist/{chunk-L7ELOV3S.js → chunk-ZIRG54EX.js} +5 -5
- package/dist/chunk-ZIRG54EX.js.map +1 -0
- package/dist/cursor-runner.js +90 -64
- package/dist/cursor-runner.js.map +1 -1
- package/dist/electron-utility.js +12 -7
- package/dist/electron-utility.js.map +1 -1
- package/dist/{git-repo-QNGPCJLI.js → git-repo-XMQJZQWX.js} +7 -5
- package/dist/index.js +23 -11
- package/dist/index.js.map +1 -1
- package/dist/logger-R475E5HD.js +23 -0
- package/dist/login-OPQCELNH.js +20 -0
- package/dist/{logout-HY3MPOY5.js → logout-IRZ2MUGX.js} +6 -6
- package/dist/{mcp-servers-ICHOWXZB.js → mcp-servers-OHMIWJDV.js} +5 -5
- package/dist/{roi-YM5OOWHG.js → roi-BNKU3IVT.js} +4 -4
- package/dist/{serve-D5GKV2RU.js → serve-LI4UGX3O.js} +4651 -1618
- package/dist/{serve-D5GKV2RU.js.map → serve-LI4UGX3O.js.map} +1 -1
- package/dist/skills-WSCUCIUI.js +13 -0
- package/dist/{start-JY26XC5R.js → start-3DNHPHDL.js} +131 -16
- package/dist/start-3DNHPHDL.js.map +1 -0
- package/dist/worker.js +2 -2
- package/package.json +9 -9
- package/dist/chunk-2EQOL57Z.js.map +0 -1
- package/dist/chunk-6LINHACK.js.map +0 -1
- package/dist/chunk-7H34LI75.js +0 -40
- package/dist/chunk-7H34LI75.js.map +0 -1
- package/dist/chunk-C6QOTETH.js.map +0 -1
- package/dist/chunk-CNR7O5YH.js.map +0 -1
- package/dist/chunk-L7ELOV3S.js.map +0 -1
- package/dist/chunk-QJP7JCIS.js +0 -76
- package/dist/chunk-QJP7JCIS.js.map +0 -1
- package/dist/chunk-RMLQ5DRP.js.map +0 -1
- package/dist/chunk-RW2OTTUA.js.map +0 -1
- package/dist/chunk-YXPPZQBJ.js.map +0 -1
- package/dist/chunk-Z37T5W6S.js.map +0 -1
- package/dist/logger-2F3CBS3V.js +0 -19
- package/dist/login-U256OVOJ.js +0 -20
- package/dist/skills-W2Y6TWHA.js +0 -11
- package/dist/start-JY26XC5R.js.map +0 -1
- /package/dist/{auth-GGM253LQ.js.map → auth-DY3AOBIE.js.map} +0 -0
- /package/dist/{chunk-GM6MH4CD.js.map → chunk-3C2PO35N.js.map} +0 -0
- /package/dist/{chunk-R3XQ6W7L.js.map → chunk-56IW4AFX.js.map} +0 -0
- /package/dist/{chunk-ZRJTZLRF.js.map → chunk-COXXKMNA.js.map} +0 -0
- /package/dist/{chunk-3WEEGJJN.js.map → chunk-HA2A36QQ.js.map} +0 -0
- /package/dist/{chunk-IJHF4OM4.js.map → chunk-PSW2XYRT.js.map} +0 -0
- /package/dist/{chunk-NACJENDW.js.map → chunk-WW4UGZBY.js.map} +0 -0
- /package/dist/{git-repo-QNGPCJLI.js.map → git-repo-XMQJZQWX.js.map} +0 -0
- /package/dist/{logger-2F3CBS3V.js.map → logger-R475E5HD.js.map} +0 -0
- /package/dist/{login-U256OVOJ.js.map → login-OPQCELNH.js.map} +0 -0
- /package/dist/{logout-HY3MPOY5.js.map → logout-IRZ2MUGX.js.map} +0 -0
- /package/dist/{mcp-servers-ICHOWXZB.js.map → mcp-servers-OHMIWJDV.js.map} +0 -0
- /package/dist/{roi-YM5OOWHG.js.map → roi-BNKU3IVT.js.map} +0 -0
- /package/dist/{skills-W2Y6TWHA.js.map → skills-WSCUCIUI.js.map} +0 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1>Shipyard</h1>
|
|
3
|
-
<p><strong>Ship together with AI
|
|
4
|
-
<p>The collaboration workspace where engineering teams build alongside AI coding agents.</p>
|
|
3
|
+
<p><strong>Ship together with AI.</strong></p>
|
|
4
|
+
<p>Ship fast without shipping blind. The collaboration workspace where engineering teams build alongside AI coding agents.</p>
|
|
5
5
|
|
|
6
6
|
<p>
|
|
7
7
|
<a href="https://www.npmjs.com/package/@schoolai/shipyard"><img src="https://img.shields.io/npm/v/@schoolai/shipyard" alt="npm"></a>
|
|
@@ -5,9 +5,9 @@ import {
|
|
|
5
5
|
loadAuthToken,
|
|
6
6
|
readConfig,
|
|
7
7
|
writeConfig
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-HA2A36QQ.js";
|
|
9
|
+
import "./chunk-SU6LPOYA.js";
|
|
10
|
+
import "./chunk-JCEWPG3R.js";
|
|
11
11
|
import "./chunk-2H7UOFLK.js";
|
|
12
12
|
export {
|
|
13
13
|
deleteConfig,
|
|
@@ -16,4 +16,4 @@ export {
|
|
|
16
16
|
readConfig,
|
|
17
17
|
writeConfig
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=auth-
|
|
19
|
+
//# sourceMappingURL=auth-DY3AOBIE.js.map
|
|
@@ -3,28 +3,28 @@ import {
|
|
|
3
3
|
detectCapabilities,
|
|
4
4
|
refreshMcpServers,
|
|
5
5
|
registerBuiltInProfiles
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-PQOSU5NG.js";
|
|
7
|
+
import "./chunk-3C2PO35N.js";
|
|
8
8
|
import {
|
|
9
9
|
getRepoMetadata
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-JMAANHA3.js";
|
|
11
11
|
import "./chunk-4T2OQAVL.js";
|
|
12
12
|
import {
|
|
13
13
|
MCPTokenStore
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-JKKKUMTY.js";
|
|
15
15
|
import "./chunk-RR6V6SNM.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-SFZAOGRS.js";
|
|
17
17
|
import "./chunk-ZFKJAYAN.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-H24YSVLO.js";
|
|
19
|
+
import "./chunk-NV6C52I4.js";
|
|
20
20
|
import "./chunk-EHQITHQX.js";
|
|
21
21
|
import "./chunk-X3MULCV5.js";
|
|
22
22
|
import {
|
|
23
23
|
flushLogger,
|
|
24
24
|
logger
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-SOMRAWDG.js";
|
|
26
|
+
import "./chunk-SU6LPOYA.js";
|
|
27
|
+
import "./chunk-JCEWPG3R.js";
|
|
28
28
|
import "./chunk-2H7UOFLK.js";
|
|
29
29
|
|
|
30
30
|
// src/shared/capabilities/detector-runner/worker.ts
|
|
@@ -75,7 +75,8 @@ async function runRequest(request, abortSignal) {
|
|
|
75
75
|
request.lastKnownCapabilities,
|
|
76
76
|
request.codexMethodHint,
|
|
77
77
|
request.lastKnownCodexAuth,
|
|
78
|
-
abortSignal
|
|
78
|
+
abortSignal,
|
|
79
|
+
request.activeRepoRoot
|
|
79
80
|
);
|
|
80
81
|
case "refreshMcpServers":
|
|
81
82
|
return refreshMcpServers({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/capabilities/detector-runner/worker.ts","../src/services/cwd-capability-refresh.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads';\nimport type { MachineCapabilities } from '@shipyard/session';\nimport { buildCwdScopedPatch } from '../../../services/cwd-capability-refresh.js';\nimport { registerBuiltInProfiles } from '../../../services/session/profiles/profile-registry.js';\nimport { flushLogger, logger } from '../../logger.js';\nimport { MCPTokenStore } from '../../mcp/token-store.js';\nimport { detectCapabilities } from '../index.js';\nimport { refreshMcpServers, type ScopedCapabilitiesPatch } from '../refresh-helpers.js';\nimport type {\n CapabilityDetectorReply,\n CapabilityDetectorRequest,\n CapabilityDetectorWorkRequest,\n} from './runner.js';\n\nfunction tokenStoreFromHome(home: string | undefined): MCPTokenStore | undefined {\n return home ? new MCPTokenStore(home) : undefined;\n}\n\nexport function ensureCapabilityDetectorWorkerProfilesRegistered(): void {\n /**\n * Worker threads get a fresh module graph, so the main daemon's\n * registerBuiltInProfiles() call does not populate this process singleton.\n */\n registerBuiltInProfiles();\n}\n\nasync function runRequest(\n request: CapabilityDetectorWorkRequest,\n abortSignal: AbortSignal\n): Promise<MachineCapabilities | ScopedCapabilitiesPatch> {\n ensureCapabilityDetectorWorkerProfilesRegistered();\n switch (request.kind) {\n case 'detectFull':\n return detectCapabilities(\n tokenStoreFromHome(request.tokenStoreHome),\n request.methodHint,\n request.lastKnownAuth,\n request.lastKnownAgents,\n request.lastKnownCapabilities,\n request.codexMethodHint,\n request.lastKnownCodexAuth,\n abortSignal\n );\n case 'refreshMcpServers':\n return refreshMcpServers({\n environments: request.environments,\n tokenStore: tokenStoreFromHome(request.tokenStoreHome),\n preferredAuth: request.preferredAuth,\n lastKnown: request.lastKnown,\n });\n case 'buildCwdScopedPatch':\n return buildCwdScopedPatch({\n newCwd: request.newCwd,\n environments: request.environments,\n preferredAuth: request.preferredAuth,\n tokenStore: tokenStoreFromHome(request.tokenStoreHome),\n lastKnownMcpServers: request.lastKnownMcpServers,\n });\n }\n}\n\ninterface WorkerPort {\n postMessage: (reply: CapabilityDetectorReply) => void;\n}\n\n/**\n * Handle one incoming request message. Exported for testing — the flush\n * ordering contract (flushLogger before postMessage) is verified there.\n *\n * Root cause context: runner.ts calls worker.terminate() shortly after\n * receiving the reply, which can kill pino's transport worker before it\n * drains — dropping the bootstrap_phase_end log. Flushing before postMessage\n * ensures buffered log entries reach disk before the runner tears the thread.\n *\n * Accepts an `abortSignal` so the runtime caller can wire it to the parent\n * port's `'close'` event; tests pass an unused fresh AbortController.\n */\nexport async function handleCapabilityDetectorMessage(\n request: CapabilityDetectorWorkRequest,\n port: WorkerPort,\n flush: () => Promise<void> = flushLogger,\n abortSignal: AbortSignal = new AbortController().signal\n): Promise<void> {\n const requestId = request.requestId ?? '';\n try {\n const data = await runRequest(request, abortSignal);\n await flush();\n port.postMessage({ requestId, ok: true, data } satisfies CapabilityDetectorReply);\n } catch (err: unknown) {\n const error = err instanceof Error ? err.message : String(err);\n logger.warn({\n event: 'capability_detector_worker_request_failed',\n kind: request.kind,\n error,\n });\n await flush();\n port.postMessage({ requestId, ok: false, error } satisfies CapabilityDetectorReply);\n }\n}\n\n/**\n * Handle a 'shutdown' signal from the runner. Aborts all in-flight requests\n * and exits the worker process cleanly, avoiding the c-ares destructor SIGTRAP\n * that fires when worker.terminate() abruptly tears down the V8 isolate while\n * DNS queries are still pending.\n *\n * Exported for testing — callers inject the abort controller set and the exit\n * function so neither I/O side-effect is required in unit tests.\n */\nexport function handleShutdownSignal(\n requestAbortControllers: Set<AbortController>,\n exit: (code: number) => void = process.exit\n): void {\n for (const ctrl of requestAbortControllers) ctrl.abort();\n requestAbortControllers.clear();\n exit(0);\n}\n\nif (parentPort !== null) {\n const port = parentPort;\n /**\n * Outer worker timeout terminates this thread without warning. The\n * port 'close' event is our only signal; abort all in-flight phases so\n * each stuck `bootstrapPhase` emits `outcome:'worker_killed'` before the\n * thread dies. Without it, the log shows `_start` but never `_end` for\n * the stuck phase.\n */\n const requestAbortControllers = new Set<AbortController>();\n port.on('close', () => {\n for (const ctrl of requestAbortControllers) ctrl.abort();\n requestAbortControllers.clear();\n });\n port.on('message', (request: CapabilityDetectorRequest) => {\n if (request.kind === 'shutdown') {\n handleShutdownSignal(requestAbortControllers);\n return;\n }\n const controller = new AbortController();\n requestAbortControllers.add(controller);\n void handleCapabilityDetectorMessage(request, port, flushLogger, controller.signal).finally(\n () => {\n requestAbortControllers.delete(controller);\n }\n );\n });\n}\n","import type { AnthropicAuthMethod } from '@shipyard/loro-schema';\nimport type { GitRepoInfo, MCPServerInfo } from '@shipyard/session';\nimport { getRepoMetadata } from '../shared/capabilities/git-repo.js';\nimport {\n refreshMcpServers,\n type ScopedCapabilitiesPatch,\n} from '../shared/capabilities/refresh-helpers.js';\nimport type { MCPTokenStore } from '../shared/mcp/token-store.js';\n\n/**\n * Pure helper: build the scoped capability patch for a cwd change.\n *\n * Only the cwd-dependent slices are populated — `environments` (so the new\n * cwd appears in the broadcast snapshot if it isn't already there) and\n * `mcpServers` (which scan project-level `.claude/settings.json` in each\n * environment). All other capability slices refresh via the FSEvents-driven\n * capability-watcher and the safety-net backstop tick — re-running them on\n * every task switch wasted ~25min CPU per 10.8h on the 24h log window and\n * accounted for 70% of event-loop stalls (P50 696ms, P99 15.6s).\n */\nexport async function buildCwdScopedPatch(deps: {\n newCwd: string;\n environments: GitRepoInfo[];\n preferredAuth: AnthropicAuthMethod | null | undefined;\n tokenStore: MCPTokenStore | undefined;\n lastKnownMcpServers: MCPServerInfo[] | undefined;\n}): Promise<ScopedCapabilitiesPatch> {\n const { newCwd, environments, preferredAuth, tokenStore, lastKnownMcpServers } = deps;\n const alreadyKnown = environments.some((e) => e.path === newCwd);\n const meta = alreadyKnown ? null : await getRepoMetadata(newCwd);\n const nextEnvironments = meta ? [...environments, meta] : environments;\n const mcpPatch = await refreshMcpServers({\n environments: nextEnvironments,\n tokenStore,\n preferredAuth,\n lastKnown: lastKnownMcpServers,\n /**\n * Incremental scope: only the new cwd's `.claude/settings.json` (and\n * sibling project-tier configs) need a fresh read. The other 180+ env\n * scans were the dominant cost (4-10s combined across the worktree-\n * creation flow's 4 back-to-back scoped refreshes); now they reuse\n * `lastKnownMcpServers` for project entries from unchanged envs.\n */\n changedCwd: newCwd,\n });\n return {\n ...(meta ? { environments: nextEnvironments } : {}),\n ...mcpPatch,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/capabilities/detector-runner/worker.ts","../src/services/cwd-capability-refresh.ts"],"sourcesContent":["import { parentPort } from 'node:worker_threads';\nimport type { MachineCapabilities } from '@shipyard/session';\nimport { buildCwdScopedPatch } from '../../../services/cwd-capability-refresh.js';\nimport { registerBuiltInProfiles } from '../../../services/session/profiles/profile-registry.js';\nimport { flushLogger, logger } from '../../logger.js';\nimport { MCPTokenStore } from '../../mcp/token-store.js';\nimport { detectCapabilities } from '../index.js';\nimport { refreshMcpServers, type ScopedCapabilitiesPatch } from '../refresh-helpers.js';\nimport type {\n CapabilityDetectorReply,\n CapabilityDetectorRequest,\n CapabilityDetectorWorkRequest,\n} from './runner.js';\n\nfunction tokenStoreFromHome(home: string | undefined): MCPTokenStore | undefined {\n return home ? new MCPTokenStore(home) : undefined;\n}\n\nexport function ensureCapabilityDetectorWorkerProfilesRegistered(): void {\n /**\n * Worker threads get a fresh module graph, so the main daemon's\n * registerBuiltInProfiles() call does not populate this process singleton.\n */\n registerBuiltInProfiles();\n}\n\nasync function runRequest(\n request: CapabilityDetectorWorkRequest,\n abortSignal: AbortSignal\n): Promise<MachineCapabilities | ScopedCapabilitiesPatch> {\n ensureCapabilityDetectorWorkerProfilesRegistered();\n switch (request.kind) {\n case 'detectFull':\n return detectCapabilities(\n tokenStoreFromHome(request.tokenStoreHome),\n request.methodHint,\n request.lastKnownAuth,\n request.lastKnownAgents,\n request.lastKnownCapabilities,\n request.codexMethodHint,\n request.lastKnownCodexAuth,\n abortSignal,\n request.activeRepoRoot\n );\n case 'refreshMcpServers':\n return refreshMcpServers({\n environments: request.environments,\n tokenStore: tokenStoreFromHome(request.tokenStoreHome),\n preferredAuth: request.preferredAuth,\n lastKnown: request.lastKnown,\n });\n case 'buildCwdScopedPatch':\n return buildCwdScopedPatch({\n newCwd: request.newCwd,\n environments: request.environments,\n preferredAuth: request.preferredAuth,\n tokenStore: tokenStoreFromHome(request.tokenStoreHome),\n lastKnownMcpServers: request.lastKnownMcpServers,\n });\n }\n}\n\ninterface WorkerPort {\n postMessage: (reply: CapabilityDetectorReply) => void;\n}\n\n/**\n * Handle one incoming request message. Exported for testing — the flush\n * ordering contract (flushLogger before postMessage) is verified there.\n *\n * Root cause context: runner.ts calls worker.terminate() shortly after\n * receiving the reply, which can kill pino's transport worker before it\n * drains — dropping the bootstrap_phase_end log. Flushing before postMessage\n * ensures buffered log entries reach disk before the runner tears the thread.\n *\n * Accepts an `abortSignal` so the runtime caller can wire it to the parent\n * port's `'close'` event; tests pass an unused fresh AbortController.\n */\nexport async function handleCapabilityDetectorMessage(\n request: CapabilityDetectorWorkRequest,\n port: WorkerPort,\n flush: () => Promise<void> = flushLogger,\n abortSignal: AbortSignal = new AbortController().signal\n): Promise<void> {\n const requestId = request.requestId ?? '';\n try {\n const data = await runRequest(request, abortSignal);\n await flush();\n port.postMessage({ requestId, ok: true, data } satisfies CapabilityDetectorReply);\n } catch (err: unknown) {\n const error = err instanceof Error ? err.message : String(err);\n logger.warn({\n event: 'capability_detector_worker_request_failed',\n kind: request.kind,\n error,\n });\n await flush();\n port.postMessage({ requestId, ok: false, error } satisfies CapabilityDetectorReply);\n }\n}\n\n/**\n * Handle a 'shutdown' signal from the runner. Aborts all in-flight requests\n * and exits the worker process cleanly, avoiding the c-ares destructor SIGTRAP\n * that fires when worker.terminate() abruptly tears down the V8 isolate while\n * DNS queries are still pending.\n *\n * Exported for testing — callers inject the abort controller set and the exit\n * function so neither I/O side-effect is required in unit tests.\n */\nexport function handleShutdownSignal(\n requestAbortControllers: Set<AbortController>,\n exit: (code: number) => void = process.exit\n): void {\n for (const ctrl of requestAbortControllers) ctrl.abort();\n requestAbortControllers.clear();\n exit(0);\n}\n\nif (parentPort !== null) {\n const port = parentPort;\n /**\n * Outer worker timeout terminates this thread without warning. The\n * port 'close' event is our only signal; abort all in-flight phases so\n * each stuck `bootstrapPhase` emits `outcome:'worker_killed'` before the\n * thread dies. Without it, the log shows `_start` but never `_end` for\n * the stuck phase.\n */\n const requestAbortControllers = new Set<AbortController>();\n port.on('close', () => {\n for (const ctrl of requestAbortControllers) ctrl.abort();\n requestAbortControllers.clear();\n });\n port.on('message', (request: CapabilityDetectorRequest) => {\n if (request.kind === 'shutdown') {\n handleShutdownSignal(requestAbortControllers);\n return;\n }\n const controller = new AbortController();\n requestAbortControllers.add(controller);\n void handleCapabilityDetectorMessage(request, port, flushLogger, controller.signal).finally(\n () => {\n requestAbortControllers.delete(controller);\n }\n );\n });\n}\n","import type { AnthropicAuthMethod } from '@shipyard/loro-schema';\nimport type { GitRepoInfo, MCPServerInfo } from '@shipyard/session';\nimport { getRepoMetadata } from '../shared/capabilities/git-repo.js';\nimport {\n refreshMcpServers,\n type ScopedCapabilitiesPatch,\n} from '../shared/capabilities/refresh-helpers.js';\nimport type { MCPTokenStore } from '../shared/mcp/token-store.js';\n\n/**\n * Pure helper: build the scoped capability patch for a cwd change.\n *\n * Only the cwd-dependent slices are populated — `environments` (so the new\n * cwd appears in the broadcast snapshot if it isn't already there) and\n * `mcpServers` (which scan project-level `.claude/settings.json` in each\n * environment). All other capability slices refresh via the FSEvents-driven\n * capability-watcher and the safety-net backstop tick — re-running them on\n * every task switch wasted ~25min CPU per 10.8h on the 24h log window and\n * accounted for 70% of event-loop stalls (P50 696ms, P99 15.6s).\n */\nexport async function buildCwdScopedPatch(deps: {\n newCwd: string;\n environments: GitRepoInfo[];\n preferredAuth: AnthropicAuthMethod | null | undefined;\n tokenStore: MCPTokenStore | undefined;\n lastKnownMcpServers: MCPServerInfo[] | undefined;\n}): Promise<ScopedCapabilitiesPatch> {\n const { newCwd, environments, preferredAuth, tokenStore, lastKnownMcpServers } = deps;\n const alreadyKnown = environments.some((e) => e.path === newCwd);\n const meta = alreadyKnown ? null : await getRepoMetadata(newCwd);\n const nextEnvironments = meta ? [...environments, meta] : environments;\n const mcpPatch = await refreshMcpServers({\n environments: nextEnvironments,\n tokenStore,\n preferredAuth,\n lastKnown: lastKnownMcpServers,\n /**\n * Incremental scope: only the new cwd's `.claude/settings.json` (and\n * sibling project-tier configs) need a fresh read. The other 180+ env\n * scans were the dominant cost (4-10s combined across the worktree-\n * creation flow's 4 back-to-back scoped refreshes); now they reuse\n * `lastKnownMcpServers` for project entries from unchanged envs.\n */\n changedCwd: newCwd,\n });\n return {\n ...(meta ? { environments: nextEnvironments } : {}),\n ...mcpPatch,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveNodeExecPath
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SU6LPOYA.js";
|
|
5
5
|
|
|
6
6
|
// src/shared/spawn-as-node.ts
|
|
7
7
|
var isElectronOverride = null;
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
buildNodeSpawnEnv,
|
|
35
35
|
rewriteElectronNodeScriptSpawn
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-3C2PO35N.js.map
|
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
import {
|
|
3
3
|
print,
|
|
4
4
|
printError
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PSW2XYRT.js";
|
|
6
6
|
import {
|
|
7
7
|
getConfigPath,
|
|
8
8
|
loadAuthToken,
|
|
9
9
|
readConfig,
|
|
10
10
|
writeConfig
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-HA2A36QQ.js";
|
|
12
12
|
import {
|
|
13
13
|
DeviceExchangeCodeResponseSchema,
|
|
14
14
|
DevicePollPendingSchema,
|
|
15
15
|
DevicePollResponseSchema,
|
|
16
16
|
DeviceStartResponseSchema,
|
|
17
17
|
ROUTES
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-NV6C52I4.js";
|
|
19
19
|
import {
|
|
20
20
|
isDevMode,
|
|
21
21
|
validateEnv
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-SU6LPOYA.js";
|
|
23
23
|
import {
|
|
24
24
|
external_exports
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-JCEWPG3R.js";
|
|
26
26
|
|
|
27
27
|
// src/shared/commands/login.ts
|
|
28
28
|
var DEFAULT_DEV_SIGNALING_URL = "http://localhost:4444";
|
|
@@ -223,4 +223,4 @@ export {
|
|
|
223
223
|
ensureAuthenticated,
|
|
224
224
|
loginCommand
|
|
225
225
|
};
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
226
|
+
//# sourceMappingURL=chunk-56IW4AFX.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
validateEnv
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SU6LPOYA.js";
|
|
5
5
|
import {
|
|
6
6
|
external_exports
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JCEWPG3R.js";
|
|
8
8
|
|
|
9
9
|
// src/shared/daemon-version.ts
|
|
10
10
|
import { readFileSync } from "fs";
|
|
@@ -18,8 +18,8 @@ function getDaemonVersion() {
|
|
|
18
18
|
return cached;
|
|
19
19
|
}
|
|
20
20
|
function readDaemonVersion() {
|
|
21
|
-
if ("3.11.
|
|
22
|
-
return "3.11.
|
|
21
|
+
if ("3.11.1".length > 0) {
|
|
22
|
+
return "3.11.1";
|
|
23
23
|
}
|
|
24
24
|
try {
|
|
25
25
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
@@ -48,4 +48,4 @@ function readDaemonVersion() {
|
|
|
48
48
|
export {
|
|
49
49
|
getDaemonVersion
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
51
|
+
//# sourceMappingURL=chunk-COXXKMNA.js.map
|