@cocorograph/hub-agent 0.7.105 → 0.8.1
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/claude-history.mjs +0 -113
- package/src/claude-stream-bridge.mjs +183 -10
- package/src/codex-profiles.mjs +43 -0
- package/src/codex-stream-bridge.mjs +30 -42
- package/src/main.mjs +216 -1120
- package/src/profiles.mjs +42 -0
- package/src/tmux.mjs +6 -763
- package/src/usage.mjs +184 -3
- package/src/extract-paragraph.mjs +0 -149
- package/src/jsonl-live-watchers.mjs +0 -283
- package/src/tui-permission-bridge.mjs +0 -280
- package/src/tui-viewer-registry.mjs +0 -201
package/src/profiles.mjs
CHANGED
|
@@ -153,6 +153,48 @@ export async function getActiveProjectsRoot() {
|
|
|
153
153
|
return path.join(await getActiveConfigDir(), "projects")
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
+
/**
|
|
157
|
+
* profile_id から config ディレクトリを解決する (self-describing read 用)。
|
|
158
|
+
*
|
|
159
|
+
* 【なぜ env でなくリクエストの id から引くのか — Read-plane 案C ①】
|
|
160
|
+
* read (履歴・セッション一覧) は spawn から分離され順序キューの外を並行に走る。
|
|
161
|
+
* このとき dir 解決を `process.env.CLAUDE_CONFIG_DIR` に頼ると、プロファイル切替が
|
|
162
|
+
* env を書き換えた瞬間に in-flight の read が **別アカウントの dir** を読む競合が起きる
|
|
163
|
+
* (env は揮発値で「いつの active か」を表せない)。read リクエスト自身に profile_id を
|
|
164
|
+
* 載せ、読む対象をリクエスト時点で固定することでこの競合を根絶する。
|
|
165
|
+
*
|
|
166
|
+
* @param {string|null|undefined} profileId 未指定/空/未知 → active へフォールバック
|
|
167
|
+
* (profile_id を送らない旧 browser との後方互換)
|
|
168
|
+
* @returns {Promise<{configDir:string, profileId:string, resolved:boolean}>}
|
|
169
|
+
* resolved=true: 要求された id で解決 / false: active フォールバック
|
|
170
|
+
*/
|
|
171
|
+
export async function resolveConfigDir(profileId) {
|
|
172
|
+
const reg = await loadRegistry()
|
|
173
|
+
if (profileId) {
|
|
174
|
+
const hit = reg.profiles.find((p) => p.id === profileId)
|
|
175
|
+
if (hit) {
|
|
176
|
+
return { configDir: hit.configDir, profileId: hit.id, resolved: true }
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const active =
|
|
180
|
+
reg.profiles.find((p) => p.id === reg.activeId) || makeDefaultProfile()
|
|
181
|
+
return { configDir: active.configDir, profileId: active.id, resolved: false }
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* profile_id から会話履歴ルート (`<configDir>/projects`) を解決する。
|
|
186
|
+
* @param {string|null|undefined} profileId
|
|
187
|
+
* @returns {Promise<{projectsRoot:string, profileId:string, resolved:boolean}>}
|
|
188
|
+
*/
|
|
189
|
+
export async function resolveProjectsRoot(profileId) {
|
|
190
|
+
const r = await resolveConfigDir(profileId)
|
|
191
|
+
return {
|
|
192
|
+
projectsRoot: path.join(r.configDir, "projects"),
|
|
193
|
+
profileId: r.profileId,
|
|
194
|
+
resolved: r.resolved,
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
156
198
|
/**
|
|
157
199
|
* active プロファイルを切り替える。存在しない id はエラー。
|
|
158
200
|
* env (CLAUDE_CONFIG_DIR) の反映と全セッション再起動は呼び出し側 (main.mjs) の責務。
|