cogpit 3.3.6 → 3.4.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.
Files changed (34) hide show
  1. package/dist/cli-runtime.js +1204 -633
  2. package/dist/instance-worker.js +221 -20
  3. package/dist/web/assets/{CogpitBlock-DTcsvTF0.js → CogpitBlock-B7SKhn5k.js} +1 -1
  4. package/dist/web/assets/{CommandPaletteHost-DnjXwwFv.js → CommandPaletteHost-Dig9sRnN.js} +1 -1
  5. package/dist/web/assets/{ConfigBrowser-C6-RV3dj.js → ConfigBrowser-C_4UyHta.js} +1 -1
  6. package/dist/web/assets/{CrewPanel-CdPeA3WX.js → CrewPanel-CyCZndfq.js} +1 -1
  7. package/dist/web/assets/{HighlightedEditor-ptPSiZXt.js → HighlightedEditor-YAPOkcjz.js} +1 -1
  8. package/dist/web/assets/{KeyboardShortcutsDialog-CNsqP3xD.js → KeyboardShortcutsDialog-CjA8MBfY.js} +1 -1
  9. package/dist/web/assets/{MissionHome-CJ8aY60N.js → MissionHome-CK5zZCld.js} +1 -1
  10. package/dist/web/assets/{MobileFileChanges-xDTu0VVe.js → MobileFileChanges-DyjwWXMW.js} +1 -1
  11. package/dist/web/assets/PluginsDialog-BHKZ3Esx.js +1 -0
  12. package/dist/web/assets/{PreviewPanel-CXZkRGUI.js → PreviewPanel-CXOXFWWK.js} +1 -1
  13. package/dist/web/assets/{ProjectFilesPanel-DxTA4CcL.js → ProjectFilesPanel-CwBgFc0T.js} +1 -1
  14. package/dist/web/assets/{ProjectSwitcherModal-DVRB-R0l.js → ProjectSwitcherModal-DB-xcVjM.js} +1 -1
  15. package/dist/web/assets/{TerminalOutput-D_7Mor6c.js → TerminalOutput-BA4pFb8E.js} +1 -1
  16. package/dist/web/assets/{ThemeSelectorModal-Bhkx5ikh.js → ThemeSelectorModal-B8nIlHO2.js} +1 -1
  17. package/dist/web/assets/{WorkflowsPanel-Dexz6c1y.js → WorkflowsPanel-BZhR5Ld-.js} +1 -1
  18. package/dist/web/assets/{WorktreePanel-DS4svy6H.js → WorktreePanel-DYxBPlno.js} +1 -1
  19. package/dist/web/assets/{edition-ui-D6tmWJW3.js → edition-ui-CXQDiuhB.js} +1 -1
  20. package/dist/web/assets/{index-BZiOTcnb.js → index-B1Aq64LJ.js} +1 -1
  21. package/dist/web/assets/{index-DUyWfgZU.js → index-C0oae6L9.js} +1 -1
  22. package/dist/web/assets/index-D3WV64DU.js +498 -0
  23. package/dist/web/assets/index-hGMtuUNI.css +1 -0
  24. package/dist/web/assets/index-utwOdTFc.js +2 -0
  25. package/dist/web/assets/session-parser.worker-B1_qLRIm.js +31 -0
  26. package/dist/web/assets/{switch-Bm0VDZET.js → switch-B1AuQGfo.js} +1 -1
  27. package/dist/web/assets/{vendor-ui-DKYSMrjf.js → vendor-ui-DkzcTXCS.js} +190 -195
  28. package/dist/web/index.html +3 -3
  29. package/package.json +3 -2
  30. package/dist/web/assets/PluginsDialog-U4WQVeyc.js +0 -1
  31. package/dist/web/assets/index-BKROBJD1.js +0 -1
  32. package/dist/web/assets/index-C6tWmbrY.css +0 -1
  33. package/dist/web/assets/index-COB3e1_W.js +0 -496
  34. package/dist/web/assets/session-parser.worker-DqoBsPjk.js +0 -30
@@ -2595,16 +2595,24 @@ async function readWholeTranscript(filePath, head) {
2595
2595
  return content.split("\n").filter(Boolean);
2596
2596
  }
2597
2597
 
2598
+ // ../../shared/session/automatedPrompts.ts
2599
+ var CREW_CHAT_DELIVERY_RE = /^Crew chat · ([^\n]+) · message (\d+)(?:\n|$)/;
2600
+ var TASK_WAKEUP_START_RE = /^Delegated task \S+ (?:running|completed|error|cancelled|needs attention)\. Child session: /;
2601
+ function isReaderPrompt(text2) {
2602
+ const trimmed = text2.trim();
2603
+ if (!trimmed) return false;
2604
+ if (CREW_CHAT_DELIVERY_RE.test(trimmed) || TASK_WAKEUP_START_RE.test(trimmed)) return false;
2605
+ return parseAgentEnvelope(trimmed).sender === null;
2606
+ }
2607
+
2598
2608
  // ../../shared/contracts/taskWakeup.ts
2599
- var WAKEUP_START_RE = /^Delegated task \S+ (?:running|completed|error|cancelled|needs attention)\. Child session: /;
2600
2609
  function isTaskWakeup(text2) {
2601
- return WAKEUP_START_RE.test(text2.trim());
2610
+ return TASK_WAKEUP_START_RE.test(text2.trim());
2602
2611
  }
2603
2612
 
2604
2613
  // ../../shared/contracts/crewChat.ts
2605
- var DELIVERY_SOURCE_RE = /^Crew chat · ([^\n]+) · message (\d+)(?:\n|$)/;
2606
2614
  function isCrewChatDelivery(text2) {
2607
- return DELIVERY_SOURCE_RE.test(text2.trim());
2615
+ return CREW_CHAT_DELIVERY_RE.test(text2.trim());
2608
2616
  }
2609
2617
 
2610
2618
  // ../../server/agents/claudeMetadata.ts
@@ -3071,6 +3079,19 @@ function createAcpStore(home = process.env.COGPIT_ACP_HOME || join3(homedir2(),
3071
3079
  }
3072
3080
  var acpStore = createAcpStore();
3073
3081
 
3082
+ // ../../server/plugins/skillContext.ts
3083
+ var provider = null;
3084
+ function registerPluginSkills(value) {
3085
+ provider = value;
3086
+ return () => {
3087
+ if (provider === value) provider = null;
3088
+ };
3089
+ }
3090
+ function pluginSkillContext(workspacePath) {
3091
+ const current2 = provider;
3092
+ return current2 ? Promise.resolve().then(() => current2(workspacePath)).catch(() => "") : null;
3093
+ }
3094
+
3074
3095
  // ../../server/agents/runtimeTypes.ts
3075
3096
  function resolvedApproval({ requestId, toolUseId, toolName }) {
3076
3097
  return { requestId, toolUseId, toolName };
@@ -3247,23 +3268,34 @@ async function send(id, request) {
3247
3268
  if (sending.has(id)) return { delivery: "busy" };
3248
3269
  sending.add(id);
3249
3270
  let started = false;
3271
+ let preparation;
3250
3272
  try {
3251
3273
  const session = await load(id, request);
3252
3274
  if (session.running) return { delivery: "busy" };
3253
3275
  if (requests >= 64) throw error(429, "ACP request limit reached");
3254
3276
  if (request.images?.length && !initialization?.agentCapabilities?.promptCapabilities?.image) throw error(400, "This ACP provider does not accept images");
3255
3277
  if (request.effort || request.fastMode || request.ultracode || request.mcpConfig || request.contextWindowTokens || request.permissions?.mode && !["default", "manual", "auto"].includes(request.permissions.mode) || request.permissions?.allowedTools?.length || request.permissions?.disallowedTools?.length) throw error(400, "These settings are not supported by this ACP provider");
3278
+ const abort = new AbortController();
3279
+ preparation = { session, abort };
3280
+ session.preparing = abort;
3281
+ session.running = true;
3282
+ session.terminalWritten = true;
3256
3283
  if (request.model) {
3257
3284
  const option = session.configOptions?.find((value) => value.category === "model" && value.type === "select");
3258
3285
  if (!option || option.type !== "select" || !selectOptions(option).some((value) => value.value === request.model)) throw error(400, "The ACP provider did not offer this model");
3259
3286
  const result = await bounded(connection.agent.request("session/set_config_option", { sessionId: session.nativeId, configId: option.id, value: request.model }), 15e3);
3260
3287
  session.configOptions = result.configOptions;
3261
3288
  }
3262
- session.running = true;
3289
+ if (abort.signal.aborted || sessions2.get(id) !== session || !connection) return { delivery: "busy" };
3290
+ const instructions = await pluginSkillContext(session.cwd);
3291
+ if (abort.signal.aborted || sessions2.get(id) !== session || !connection) return { delivery: "busy" };
3292
+ if (requests >= 64) throw error(429, "ACP request limit reached");
3293
+ session.preparing = void 0;
3294
+ preparation = void 0;
3263
3295
  session.terminalWritten = false;
3264
3296
  requests++;
3265
3297
  append(id, { type: "user", cwd: session.cwd, message: { role: "user", content: request.message ?? "" } });
3266
- const prompt = [{ type: "text", text: request.message ?? "" }, ...(request.images ?? []).map((image) => ({ type: "image", data: image.data, mimeType: image.mediaType }))];
3298
+ const prompt = [...instructions ? [{ type: "text", text: instructions }] : [], { type: "text", text: request.message ?? "" }, ...(request.images ?? []).map((image) => ({ type: "image", data: image.data, mimeType: image.mediaType }))];
3267
3299
  const completion = connection.agent.request("session/prompt", { sessionId: session.nativeId, prompt }).then((response) => {
3268
3300
  finishPrompt(id, session, response.stopReason, response.stopReason === "cancelled");
3269
3301
  return { isError: response.stopReason === "cancelled", message: response.stopReason };
@@ -3281,7 +3313,13 @@ async function send(id, request) {
3281
3313
  started = true;
3282
3314
  return { delivery: "started", completion };
3283
3315
  } finally {
3284
- if (!started) sending.delete(id);
3316
+ if (!started) {
3317
+ if (preparation && preparation.session.preparing === preparation.abort) {
3318
+ preparation.session.preparing = void 0;
3319
+ preparation.session.running = false;
3320
+ }
3321
+ sending.delete(id);
3322
+ }
3285
3323
  }
3286
3324
  }
3287
3325
  function selectOptions(option) {
@@ -3324,6 +3362,7 @@ var acpRuntime = {
3324
3362
  send,
3325
3363
  async interrupt(id) {
3326
3364
  const session = sessions2.get(id);
3365
+ session?.preparing?.abort();
3327
3366
  if (!session?.running || !connection) return false;
3328
3367
  await connection.agent.notify("session/cancel", { sessionId: session.nativeId });
3329
3368
  if (session.completion) await bounded(session.completion, 15e3);
@@ -3440,6 +3479,52 @@ function appendAssistantText(turn, text2, timestamp) {
3440
3479
  turn.contentBlocks.push({ kind: "text", text: [text2], timestamp });
3441
3480
  }
3442
3481
 
3482
+ // ../../shared/session/asyncAnswers.ts
3483
+ function promptText(content) {
3484
+ if (content === null) return "";
3485
+ if (typeof content === "string") return content;
3486
+ return content.flatMap((block) => block.type === "text" ? [block.text] : []).join("\n");
3487
+ }
3488
+ function linkAsyncAnswers(turns) {
3489
+ const answers2 = /* @__PURE__ */ new Map();
3490
+ let open6 = [];
3491
+ const answer = (text2) => {
3492
+ if (open6.length === 0 || !isReaderPrompt(text2)) return;
3493
+ for (const id of open6) answers2.set(id, text2.trim());
3494
+ open6 = [];
3495
+ };
3496
+ for (const turn of turns) {
3497
+ answer(promptText(turn.userMessage));
3498
+ for (const block of turn.contentBlocks) {
3499
+ if (block.kind === "queued_prompt") answer(block.content);
3500
+ else if (block.kind === "tool_calls") {
3501
+ for (const call of block.toolCalls) if (call.asyncQuestion) open6.push(call.id);
3502
+ }
3503
+ }
3504
+ }
3505
+ const stale = (call) => call.asyncQuestion === true && call.asyncAnswer !== answers2.get(call.id);
3506
+ const relinked = /* @__PURE__ */ new Map();
3507
+ const relink = (call) => {
3508
+ if (!stale(call)) return call;
3509
+ let next = relinked.get(call);
3510
+ if (!next) {
3511
+ const { asyncAnswer: _previous, ...rest } = call;
3512
+ const reply = answers2.get(call.id);
3513
+ next = reply === void 0 ? rest : { ...rest, asyncAnswer: reply };
3514
+ relinked.set(call, next);
3515
+ }
3516
+ return next;
3517
+ };
3518
+ return turns.map((turn) => {
3519
+ if (!turn.toolCalls.some(stale)) return turn;
3520
+ return {
3521
+ ...turn,
3522
+ toolCalls: turn.toolCalls.map(relink),
3523
+ contentBlocks: turn.contentBlocks.map((block) => block.kind === "tool_calls" ? { ...block, toolCalls: block.toolCalls.map(relink) } : block)
3524
+ };
3525
+ });
3526
+ }
3527
+
3443
3528
  // ../../shared/session/codex-exec.ts
3444
3529
  var JS_SIMPLE_ESCAPES = {
3445
3530
  "0": "\0",
@@ -4288,6 +4373,7 @@ function walkCodexRecords(records, options) {
4288
4373
  }
4289
4374
  let current2 = null;
4290
4375
  let currentTurnId = null;
4376
+ let queuedPromptEcho = false;
4291
4377
  let currentModel = metadata.model || null;
4292
4378
  let lastTurnTimestamp = "";
4293
4379
  let pendingCompaction = null;
@@ -4342,6 +4428,7 @@ function walkCodexRecords(records, options) {
4342
4428
  recordIndex = index;
4343
4429
  const payload = isObject3(record3.payload) ? record3.payload : void 0;
4344
4430
  const timestamp = record3.timestamp ?? "";
4431
+ if (record3.type !== "event_msg") queuedPromptEcho = false;
4345
4432
  if (record3.type === "compacted") {
4346
4433
  current2 = commitTurn(current2);
4347
4434
  pendingCompaction = "Conversation compacted";
@@ -4359,11 +4446,17 @@ function walkCodexRecords(records, options) {
4359
4446
  continue;
4360
4447
  }
4361
4448
  if (record3.type === "event_msg" && payload?.type === "user_message" && typeof payload.message === "string") {
4449
+ if (queuedPromptEcho) {
4450
+ queuedPromptEcho = false;
4451
+ continue;
4452
+ }
4362
4453
  if (current2 && (current2.assistantText.length > 0 || current2.toolCalls.length > 0 || current2.thinking.length > 0)) {
4363
4454
  current2 = commitTurn(current2);
4364
4455
  }
4456
+ const opensWindow = !sawTurnStart;
4365
4457
  sawTurnStart = true;
4366
4458
  current2 ??= createActiveTurn(currentTurnId, timestamp, currentModel);
4459
+ if (opensWindow) current2.opensOnPrompt = true;
4367
4460
  const localImages = (Array.isArray(payload.local_images) ? payload.local_images : []).filter(
4368
4461
  (p) => typeof p === "string" && p.length > 0
4369
4462
  );
@@ -4478,8 +4571,15 @@ function walkCodexRecords(records, options) {
4478
4571
  appendAssistantText(current2, extractMessageText(payload, "output_text"), timestamp);
4479
4572
  continue;
4480
4573
  }
4481
- if (payload.type === "message" && payload.role === "user" && current2.userMessage === null) {
4574
+ if (payload.type === "message" && payload.role === "user") {
4482
4575
  const text2 = normalizePromptText(extractMessageText(payload, "input_text"));
4576
+ if (current2.userMessage !== null || current2.contentBlocks.length > 0) {
4577
+ if (text2) {
4578
+ current2.contentBlocks.push({ kind: "queued_prompt", content: text2, timestamp });
4579
+ queuedPromptEcho = true;
4580
+ }
4581
+ continue;
4582
+ }
4483
4583
  const images = extractResponseMessageImages(payload);
4484
4584
  const audio = extractResponseMessageAudio(payload);
4485
4585
  if (text2 || images.length > 0 || audio.length > 0) {
@@ -4721,6 +4821,7 @@ function walkCodexRecords(records, options) {
4721
4821
  }
4722
4822
  }
4723
4823
  commitTurn(current2);
4824
+ const linkedTurns = linkAsyncAnswers(turns);
4724
4825
  return {
4725
4826
  turnStartIndices,
4726
4827
  sessionId: metadata.sessionId,
@@ -4730,8 +4831,8 @@ function walkCodexRecords(records, options) {
4730
4831
  slug: metadata.slug,
4731
4832
  name: "",
4732
4833
  model: metadata.model,
4733
- turns,
4734
- stats: options?.skipStats ? createEmptySessionStats(turns.length) : computeStats(turns),
4834
+ turns: linkedTurns,
4835
+ stats: options?.skipStats ? createEmptySessionStats(linkedTurns.length) : computeStats(linkedTurns),
4735
4836
  rawMessages: options?.skipStats ? [] : records,
4736
4837
  branchedFrom: metadata.branchedFrom,
4737
4838
  agentKind: "codex"
@@ -9034,12 +9135,42 @@ var SDKMessageStream = class {
9034
9135
  return this;
9035
9136
  }
9036
9137
  };
9037
- function runQuery(state, prompt, opts) {
9038
- state.abort = new AbortController();
9138
+ function runQuery(state, prompt, opts, pluginInstructions, preparation) {
9139
+ if (pluginInstructions === void 0) {
9140
+ const loading = pluginSkillContext(state.cwd);
9141
+ if (loading) {
9142
+ const abort = new AbortController();
9143
+ state.abort = abort;
9144
+ state.running = true;
9145
+ state.pluginSkillLoading = true;
9146
+ void loading.then((instructions) => {
9147
+ if (state.abort === abort && !abort.signal.aborted) {
9148
+ state.pluginSkillLoading = false;
9149
+ runQuery(state, prompt, opts, instructions, abort);
9150
+ }
9151
+ }).catch((error2) => {
9152
+ if (state.abort !== abort || abort.signal.aborted) return;
9153
+ state.pluginSkillLoading = false;
9154
+ state.running = false;
9155
+ state.messageStream?.close();
9156
+ state.messageStream = null;
9157
+ abort.abort();
9158
+ const result = { type: "result", is_error: true, result: String(error2) };
9159
+ notifyResultObservers(state, result, true);
9160
+ const callback = state.onResult;
9161
+ state.onResult = null;
9162
+ if (callback) callback(result);
9163
+ else publishError(state.sessionId, result.result);
9164
+ });
9165
+ return;
9166
+ }
9167
+ }
9168
+ state.abort = preparation ?? new AbortController();
9039
9169
  state.running = true;
9040
9170
  state.backgroundAgents = NO_BACKGROUND_AGENTS;
9041
9171
  state.stderr = "";
9042
9172
  const queryOpts = buildQueryOptions(state, opts);
9173
+ if (pluginInstructions) queryOpts.systemPrompt = appendToSystemPrompt(queryOpts.systemPrompt, pluginInstructions);
9043
9174
  const messageStream = new SDKMessageStream();
9044
9175
  const first = buildUserMessage(prompt, opts.images);
9045
9176
  inputTurns.set(state, { sent: [first.uuid], completed: 0, taken: null });
@@ -9429,6 +9560,7 @@ function teardownState(state) {
9429
9560
  state.activeQuery = null;
9430
9561
  }
9431
9562
  state.abort?.abort();
9563
+ state.pluginSkillLoading = false;
9432
9564
  state.running = false;
9433
9565
  state.backgroundAgents = NO_BACKGROUND_AGENTS;
9434
9566
  }
@@ -9441,7 +9573,20 @@ function stopSDKSession(sessionId) {
9441
9573
  }
9442
9574
  async function interruptSDKTurn(sessionId) {
9443
9575
  const state = sdkSessions.get(sessionId);
9444
- if (!state?.running || !state.activeQuery) return false;
9576
+ if (!state?.running) return false;
9577
+ if (state.pluginSkillLoading) {
9578
+ state.abort?.abort();
9579
+ state.pluginSkillLoading = false;
9580
+ state.running = false;
9581
+ const result = { type: "result", is_error: true, result: "Turn interrupted" };
9582
+ notifyResultObservers(state, result, true);
9583
+ const callback = state.onResult;
9584
+ state.onResult = null;
9585
+ clear(sessionId);
9586
+ callback?.(result);
9587
+ return true;
9588
+ }
9589
+ if (!state.activeQuery) return false;
9445
9590
  await state.activeQuery.interrupt();
9446
9591
  return true;
9447
9592
  }
@@ -9639,6 +9784,7 @@ var claudeRuntime = {
9639
9784
  },
9640
9785
  async send(sessionId, req) {
9641
9786
  const live = sdkSessions.get(sessionId);
9787
+ if (live?.pluginSkillLoading) return { delivery: "busy" };
9642
9788
  if (req.onlyWhileRunning && (!isSDKQueryLive(live) || !live.running)) return { delivery: "busy" };
9643
9789
  if (isSDKQueryLive(live)) {
9644
9790
  const joinsTurn = live.running;
@@ -15792,7 +15938,7 @@ import { createInterface as createInterface2 } from "node:readline";
15792
15938
  var package_default = {
15793
15939
  name: "cogpit",
15794
15940
  private: true,
15795
- version: "3.3.6",
15941
+ version: "3.4.1",
15796
15942
  description: "Control center for Claude Code, OpenAI Codex, and GitHub Copilot CLI sessions",
15797
15943
  license: "MIT",
15798
15944
  author: {
@@ -15869,11 +16015,12 @@ var package_default = {
15869
16015
  "node-pty": "^1.1.0",
15870
16016
  "proper-lockfile": "4.1.2",
15871
16017
  semver: "7.8.5",
16018
+ "signal-exit": "3.0.7",
15872
16019
  "smol-toml": "1.9.0",
15873
16020
  "tuf-js": "3.1.0",
15874
16021
  "vscode-jsonrpc": "8.2.1",
15875
16022
  ws: "^8.21.1",
15876
- zod: "4.6.5"
16023
+ zod: "4.6.6"
15877
16024
  },
15878
16025
  devDependencies: {
15879
16026
  "@anthropic-ai/sdk": "^0.112.4",
@@ -15898,6 +16045,7 @@ var package_default = {
15898
16045
  "@types/react": "^19.0.2",
15899
16046
  "@types/react-dom": "^19.0.2",
15900
16047
  "@types/semver": "7.7.1",
16048
+ "@types/signal-exit": "3.0.4",
15901
16049
  "@types/ws": "^8.18.1",
15902
16050
  "@vitejs/plugin-react": "^4.3.4",
15903
16051
  "@vitest/coverage-v8": "^4.1.12",
@@ -15909,7 +16057,7 @@ var package_default = {
15909
16057
  clsx: "^2.1.1",
15910
16058
  cmdk: "^1.1.1",
15911
16059
  "css-tree": "3.2.1",
15912
- electron: "^41.10.7",
16060
+ electron: "^42.11.16",
15913
16061
  "electron-builder": "^26.15.3",
15914
16062
  "electron-vite": "5.0.0",
15915
16063
  esbuild: "0.25.12",
@@ -15941,14 +16089,14 @@ var package_default = {
15941
16089
  "@hono/node-server": "1.19.15",
15942
16090
  "@xmldom/xmldom": "0.8.15",
15943
16091
  "app-builder-lib": "26.15.3",
15944
- "body-parser": "2.3.0",
16092
+ "body-parser": "2.4.0",
15945
16093
  "builder-util-runtime": "9.7.0",
15946
- "fast-uri": "4.1.5",
16094
+ "fast-uri": "4.2.3",
15947
16095
  flatted: "3.4.2",
15948
16096
  "form-data": "4.0.6",
15949
16097
  hono: "4.13.13",
15950
16098
  "http-cache-semantics": "4.3.0",
15951
- "ip-address": "10.7.3",
16099
+ "ip-address": "10.7.4",
15952
16100
  "js-yaml": "4.3.2",
15953
16101
  lodash: "4.18.1",
15954
16102
  nanoid: "3.3.18",
@@ -15958,7 +16106,7 @@ var package_default = {
15958
16106
  "source-map-js": "1.2.2",
15959
16107
  tar: "7.5.21",
15960
16108
  tmp: "0.2.7",
15961
- undici: "7.30.0"
16109
+ undici: "7.30.1"
15962
16110
  },
15963
16111
  patchedDependencies: {
15964
16112
  "electron-vite@5.0.0": "patches/electron-vite@5.0.0.patch"
@@ -17350,6 +17498,11 @@ async function threadSettings(client2, options, sessionId) {
17350
17498
  if (tier !== void 0) settings.serviceTier = tier;
17351
17499
  const browserConfig = await codexBrowserConfig(client2, options.cwd, sessionId);
17352
17500
  const config = { ...browserConfig };
17501
+ const instructions = await pluginSkillContext(options.cwd);
17502
+ if (instructions) {
17503
+ const existing = typeof config.developer_instructions === "string" ? config.developer_instructions : (await client2.call("config/read", { cwd: options.cwd })).config.developer_instructions;
17504
+ config.developer_instructions = [existing, instructions].filter(Boolean).join("\n\n");
17505
+ }
17353
17506
  if (options.contextWindowTokens != null) {
17354
17507
  config.model_context_window = options.contextWindowTokens;
17355
17508
  }
@@ -18168,6 +18321,12 @@ import {
18168
18321
  StreamMessageReader,
18169
18322
  StreamMessageWriter
18170
18323
  } from "vscode-jsonrpc/node.js";
18324
+ async function withPluginSkills(options) {
18325
+ const instructions = await pluginSkillContext(options.workingDirectory ?? process.cwd());
18326
+ if (!instructions) return options;
18327
+ const existing = isRecord(options.systemMessage) ? options.systemMessage : {};
18328
+ return { ...options, systemMessage: { mode: "append", ...existing, content: [typeof existing.content === "string" ? existing.content : "", instructions].filter(Boolean).join("\n\n") } };
18329
+ }
18171
18330
  var PROTOCOL_VERSION2 = 3;
18172
18331
  var DEFAULT_TRANSPORT_TIMEOUT_MS = 3e4;
18173
18332
  var DEFAULT_REQUEST_TIMEOUT_MS2 = 12e4;
@@ -18417,6 +18576,7 @@ var CopilotRuntime = class {
18417
18576
  return usage;
18418
18577
  }
18419
18578
  async createSession(options = {}) {
18579
+ options = await withPluginSkills(options);
18420
18580
  const sessionId = options.sessionId ?? randomUUID6();
18421
18581
  this.assertSessionAvailable(sessionId);
18422
18582
  this.openingSessions.add(sessionId);
@@ -18439,6 +18599,7 @@ var CopilotRuntime = class {
18439
18599
  }
18440
18600
  }
18441
18601
  async resumeSession(sessionId, options = {}) {
18602
+ options = await withPluginSkills(options);
18442
18603
  this.assertSessionAvailable(sessionId);
18443
18604
  this.openingSessions.add(sessionId);
18444
18605
  this.conflictingResumes.delete(sessionId);
@@ -20013,6 +20174,14 @@ function createInstanceRuntime(instance, dataRoot2) {
20013
20174
  });
20014
20175
  worker.on("message", (message) => {
20015
20176
  if (child2 !== worker || !isRecord(message)) return;
20177
+ if (message.type === "plugin-skills" && Number.isSafeInteger(message.requestId) && typeof message.cwd === "string" && message.cwd.length <= 8192) {
20178
+ const requestId = message.requestId;
20179
+ void Promise.resolve(pluginSkillContext(message.cwd)).then((instructions) => {
20180
+ if (child2 === worker && worker.connected) worker.send({ type: "plugin-skills-result", requestId, instructions: instructions ?? "" }, () => {
20181
+ });
20182
+ });
20183
+ return;
20184
+ }
20016
20185
  if (message.type === "stream" && typeof message.sessionId === "string" && isRecord(message.event) && watched2.has(message.sessionId)) {
20017
20186
  forwardEvent(qualified(message.sessionId), message.event);
20018
20187
  return;
@@ -20208,6 +20377,22 @@ var methods = /* @__PURE__ */ new Set(["start", "send", "interrupt", "stop", "st
20208
20377
  function send2(message) {
20209
20378
  if (process.connected) process.send?.(message);
20210
20379
  }
20380
+ var skillRequestId = 0;
20381
+ var skillRequests = /* @__PURE__ */ new Map();
20382
+ var unregisterSkills = registerPluginSkills((cwd) => new Promise((resolve9) => {
20383
+ if (skillRequests.size >= 64) {
20384
+ resolve9("");
20385
+ return;
20386
+ }
20387
+ const requestId = ++skillRequestId;
20388
+ const timer = setTimeout(() => {
20389
+ skillRequests.delete(requestId);
20390
+ resolve9("");
20391
+ }, 5e3);
20392
+ timer.unref();
20393
+ skillRequests.set(requestId, { resolve: resolve9, timer });
20394
+ send2({ type: "plugin-skills", requestId, cwd });
20395
+ }));
20211
20396
  function snapshot() {
20212
20397
  const ids = runtime.listActive().map((s) => s.sessionId);
20213
20398
  return { active: runtime.listActive(), activity: Object.fromEntries(ids.map((id) => [id, runtime.activity(id)])), approvals: runtime.listPendingApprovals(), questions: runtime.listPendingQuestions(), plans: runtime.listPendingPlans?.() ?? [] };
@@ -20231,6 +20416,15 @@ function publishSnapshot() {
20231
20416
  var poll = setInterval(publishSnapshot, 300);
20232
20417
  poll.unref();
20233
20418
  process.on("message", (message) => {
20419
+ if (isRecord(message) && message.type === "plugin-skills-result" && typeof message.requestId === "number") {
20420
+ const request = skillRequests.get(message.requestId);
20421
+ if (request) {
20422
+ clearTimeout(request.timer);
20423
+ skillRequests.delete(message.requestId);
20424
+ request.resolve(typeof message.instructions === "string" && Buffer.byteLength(message.instructions) <= 131072 ? message.instructions : "");
20425
+ }
20426
+ return;
20427
+ }
20234
20428
  if (!isRecord(message) || typeof message.id !== "number" || typeof message.method !== "string" || !methods.has(message.method) || !Array.isArray(message.args)) return;
20235
20429
  const { id, method, args } = message;
20236
20430
  void (async () => {
@@ -20277,6 +20471,13 @@ process.on("message", (message) => {
20277
20471
  });
20278
20472
  async function close() {
20279
20473
  clearInterval(poll);
20474
+ unregisterSkills();
20475
+ for (const request of skillRequests.values()) {
20476
+ clearTimeout(request.timer);
20477
+ request.resolve("");
20478
+ }
20479
+ ;
20480
+ skillRequests.clear();
20280
20481
  await runtime.shutdown();
20281
20482
  process.disconnect?.();
20282
20483
  }
@@ -1,4 +1,4 @@
1
- import{c as qe,j as O,r as ge}from"./vendor-react-gGw_S5I_.js";import{aM as si,aN as fi,aO as ai,aP as pi,R as di,J as xe,B as Ue}from"./index-COB3e1_W.js";import{N as Kn,Y as hi}from"./vendor-ui-DKYSMrjf.js";import"./vendor-shiki-DOn6sF-i.js";import"./vendor-markdown-BE1gYnO9.js";function mi(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var U={},Fe={},te={},gn;function ke(){if(gn)return te;gn=1;function t(s){return typeof s>"u"||s===null}function i(s){return typeof s=="object"&&s!==null}function m(s){return Array.isArray(s)?s:t(s)?[]:[s]}function y(s,c){if(c){const A=Object.keys(c);for(let r=0,f=A.length;r<f;r+=1){const C=A[r];s[C]=c[C]}}return s}function p(s,c){let A="";for(let r=0;r<c;r+=1)A+=s;return A}function h(s){return s===0&&Number.NEGATIVE_INFINITY===1/s}return te.isNothing=t,te.isObject=i,te.toArray=m,te.repeat=p,te.isNegativeZero=h,te.extend=y,te}var $e,xn;function Ee(){if(xn)return $e;xn=1;function t(m,y){let p="";const h=m.reason||"(unknown reason)";return m.mark?(m.mark.name&&(p+='in "'+m.mark.name+'" '),p+="("+(m.mark.line+1)+":"+(m.mark.column+1)+")",!y&&m.mark.snippet&&(p+=`
1
+ import{c as qe,j as O,r as ge}from"./vendor-react-gGw_S5I_.js";import{aM as si,aN as fi,aO as ai,aP as pi,R as di,J as xe,B as Ue}from"./index-D3WV64DU.js";import{N as Kn,Y as hi}from"./vendor-ui-DkzcTXCS.js";import"./vendor-shiki-DOn6sF-i.js";import"./vendor-markdown-BE1gYnO9.js";function mi(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var U={},Fe={},te={},gn;function ke(){if(gn)return te;gn=1;function t(s){return typeof s>"u"||s===null}function i(s){return typeof s=="object"&&s!==null}function m(s){return Array.isArray(s)?s:t(s)?[]:[s]}function y(s,c){if(c){const A=Object.keys(c);for(let r=0,f=A.length;r<f;r+=1){const C=A[r];s[C]=c[C]}}return s}function p(s,c){let A="";for(let r=0;r<c;r+=1)A+=s;return A}function h(s){return s===0&&Number.NEGATIVE_INFINITY===1/s}return te.isNothing=t,te.isObject=i,te.toArray=m,te.repeat=p,te.isNegativeZero=h,te.extend=y,te}var $e,xn;function Ee(){if(xn)return $e;xn=1;function t(m,y){let p="";const h=m.reason||"(unknown reason)";return m.mark?(m.mark.name&&(p+='in "'+m.mark.name+'" '),p+="("+(m.mark.line+1)+":"+(m.mark.column+1)+")",!y&&m.mark.snippet&&(p+=`
2
2
 
3
3
  `+m.mark.snippet),h+" "+p):h}function i(m,y){Error.call(this),this.name="YAMLException",this.reason=m,this.mark=y,this.message=t(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}return i.prototype=Object.create(Error.prototype),i.prototype.constructor=i,i.prototype.toString=function(y){return this.name+": "+t(this,y)},$e=i,$e}var Ge,An;function gi(){if(An)return Ge;An=1;const t=ke();function i(p,h,s,c,A){let r="",f="";const C=Math.floor(A/2)-1;return c-h>C&&(r=" ... ",h=c-C+r.length),s-c>C&&(f=" ...",s=c+C-f.length),{str:r+p.slice(h,s).replace(/\t/g,"→")+f,pos:c-h+r.length}}function m(p,h){return t.repeat(" ",h-p.length)+p}function y(p,h){if(h=Object.create(h||null),!p.buffer)return null;h.maxLength||(h.maxLength=79),typeof h.indent!="number"&&(h.indent=1),typeof h.linesBefore!="number"&&(h.linesBefore=3),typeof h.linesAfter!="number"&&(h.linesAfter=2);const s=/\r?\n|\r|\0/g,c=[0],A=[];let r,f=-1;for(;r=s.exec(p.buffer);)A.push(r.index),c.push(r.index+r[0].length),p.position<=r.index&&f<0&&(f=c.length-2);f<0&&(f=c.length-1);let C="";const L=Math.min(p.line+h.linesAfter,A.length).toString().length,R=h.maxLength-(h.indent+L+3);for(let F=1;F<=h.linesBefore&&!(f-F<0);F++){const H=i(p.buffer,c[f-F],A[f-F],p.position-(c[f]-c[f-F]),R);C=t.repeat(" ",h.indent)+m((p.line-F+1).toString(),L)+" | "+H.str+`
4
4
  `+C}const V=i(p.buffer,c[f],A[f],p.position,R);C+=t.repeat(" ",h.indent)+m((p.line+1).toString(),L)+" | "+V.str+`
@@ -1 +1 @@
1
- import{c as ie,j as u,r as M}from"./vendor-react-gGw_S5I_.js";import{af as h,ag as Z,ah as ue,ai as he,aj as ge,ak as fe,al as ve,am as we,an as Ce,ao as Se,ap as je,aq as be,ar as ye,as as xe,at as ee,au as _,av as Pe,aw as Te,ax as Oe,ay as ke,az as Ne,aA as Fe,aB as Ee,U as Ie}from"./index-COB3e1_W.js";import{P as $e,l as Ae,m as te,S as Re,L as De,H as Le,n as He,o as Me,c as ne,G as Be,F as qe,p as Ge,q as Ke,r as ze,s as Ue,t as We,u as pe,v as ae,w as _e,x as Ve,y as Je,K as Xe,E as Qe,z as Ye,A as Ze,B as oe,D as et,I as tt,J as nt}from"./vendor-ui-DKYSMrjf.js";import"./vendor-shiki-DOn6sF-i.js";import"./vendor-markdown-BE1gYnO9.js";function a(t,e,s,c,l,m,d){return{id:t,label:e,icon:c,run:l,shortcut:m,description:d,value:`${e} ${s}`}}function V(...t){return t.filter(e=>e!==!1&&e!==void 0)}function at(t){const e=ie.c(40);let s,c,l,m,d,w,C,r,S,g,b,f,y,N,x;if(e[0]!==t){const $=V(a("home","Go to Mission Control","home overview dashboard",Le,t.onGoHome),a("mission-control",t.showMission?"Exit Mission Control":"Open Mission Control","live sessions blocked waiting answer everything at once",De,t.onToggleMissionControl,h("missionControl")),...(t.extraActions??[]).map(ot),a("new-session","Start a new session","project agent chat create",$e,t.onNewSession,h("newSession")),t.onDuplicateSession&&a("duplicate-session","Duplicate this session","copy fork clone branch thread",Ae,t.onDuplicateSession),t.canFocusComposer&&a("focus-composer","Focus message composer","chat prompt input",te,t.onFocusComposer,h("focusComposer")),t.onFindInConversation&&a("find-in-conversation","Find in conversation","search text transcript turns matches",Re,t.onFindInConversation,h("findInConversation"))),F=(t.projects??[]).slice(0,8).map(n=>a(`project-${n.dirName}`,n.shortName,`${n.path} ${n.dirName} project workspace`,He,()=>{var i;return(i=t.onOpenProject)==null?void 0:i.call(t,n.dirName)},void 0,`${n.path} · ${n.sessionCount} session${n.sessionCount===1?"":"s"}`)),E=(t.recentSessions??[]).slice(0,10).map(n=>{const v=(n.aiTitle||n.name||n.slug||n.lastUserMessage||n.firstUserMessage||n.sessionId).replace(/\s+/g," ").trim().slice(0,160)||n.sessionId,L=[n.projectShortName,n.gitBranch].filter(Boolean).join(" · ");return a(`session-${n.dirName}-${n.fileName}`,v,`${n.projectShortName} ${n.cwd??""} ${n.gitBranch??""} ${n.sessionId} recent thread conversation`,te,()=>{var q;return(q=t.onOpenSession)==null?void 0:q.call(t,n.dirName,n.fileName)},void 0,L)}),A=t.devices??[],I=A.length>1&&t.onSwitchDevice?A.slice(0,Z.length).map((n,i)=>a(`device-${n.id}`,n.isActive?`${n.name} (current)`:`Switch to ${n.name}`,`device machine host remote ${n.id}`,n.isLocal?Me:ne,()=>{var v;return(v=t.onSwitchDevice)==null?void 0:v.call(t,n.id)},h(Z[i]))):[],o=V(a("toggle-sidebar",t.showSidebar?"Hide session sidebar":"Show session sidebar","projects navigation panel",Ue,t.onToggleSidebar,h("toggleSidebar")),t.hasSession&&a("toggle-stats",t.showStats?"Hide session details":"Show session details","stats tokens usage panel",ze,t.onToggleStats,h("toggleStats")),t.onToggleProjectFiles&&a("project-files",t.showProjectFiles?"Close project files":"Open project files","browse edit save workspace source code",Ke,t.onToggleProjectFiles,h("projectFiles")),t.onToggleBrowser&&a("toggle-browser",t.showBrowser?"Hide browser":"Show browser","web page live view browse panel",Ge,t.onToggleBrowser),t.hasFileChanges&&a("toggle-file-changes",t.showFileChanges?"Hide file changes":"Show file changes","diff edits review panel",qe,t.onToggleFileChanges),t.supportsWorktrees&&t.canOpenTerminal&&a("toggle-worktrees",t.showWorktrees?"Hide worktrees":"Show worktrees","git branches panel",Be,t.onToggleWorktrees)),R=V(t.onOpenProjectInEditor&&a("open-project-editor","Open project in editor","code cursor vscode zed workspace",tt,t.onOpenProjectInEditor),t.onRevealProject&&a("reveal-project","Reveal project in file manager","finder explorer folder directory",et,t.onRevealProject),t.onCopyResumeCommand&&a("copy-resume-command","Copy resume command","cli claude codex copilot terminal clipboard continue session",oe,t.onCopyResumeCommand),t.onCopyProjectPath&&a("copy-project-path","Copy project path","workspace directory clipboard",oe,t.onCopyProjectPath),t.onOpenIntegratedTerminal&&a("integrated-terminal","New integrated terminal","embedded shell command line process panel",Ze,t.onOpenIntegratedTerminal,h("newIntegratedTerminal")),t.canOpenTerminal&&a("terminal","Open in system terminal","external shell command line app",Ye,t.onOpenTerminal,h("systemTerminal")),t.onTogglePreview&&a("preview","Toggle development preview","browser localhost dev server website",Qe,t.onTogglePreview,h("preview")),t.onOpenKeyboardShortcuts&&a("keyboard-shortcuts","Customize keyboard shortcuts","keybindings hotkeys settings",Xe,t.onOpenKeyboardShortcuts),t.onOpenConfig&&a("config",t.showConfig?"Close agent configuration":"Open agent configuration","skills commands claude settings files",Je,t.onOpenConfig),a("settings","Open Cogpit settings","preferences network",Ve,t.onOpenSettings),a("theme","Change theme & chat width","appearance light dark oled width narrow wide",_e,t.onOpenTheme,h("themeSelector")),a("expand","Expand all groups","conversation details",ae,t.onExpandAll,h("expandAll")),a("expand-payloads","Expand all tool payloads","raw input result diff conversation details",ae,t.onExpandToolPayloads,h("expandToolPayloads")),a("collapse","Collapse all","conversation groups payloads details",pe,t.onCollapseAll),t.onKillAll&&a("kill-all","Kill all agent processes","stop terminate halt everything runaway",We,t.onKillAll),t.onOpenDevices&&a("manage-devices","Manage devices…","remote machines hub hosts edit rename remove switch",nt,()=>{var n;return(n=t.onOpenDevices)==null?void 0:n.call(t,"manage")}),t.onOpenDevices&&a("add-device","Add device…","remote machine hub host connect pair new",ne,()=>{var n;return(n=t.onOpenDevices)==null?void 0:n.call(t,"add")})),k=[{value:"Navigation",items:$},...E.length>0?[{value:"Recent sessions",items:E}]:[],...F.length>0?[{value:"Projects",items:F}]:[],...I.length>0?[{value:"Devices",items:I}]:[],{value:"View",items:o},{value:"Tools",items:R}],D=function(i){t.onOpenChange(!1),i.run()};l=ve,y=t.open,N=t.onOpenChange,x="Command palette",w="Search for a Cogpit action to run.",C="max-w-xl",c=we,S="Search commands",g=!0,e[16]===Symbol.for("react.memo_cache_sentinel")?(b=u.jsx(Ce,{"aria-label":"Search commands",autoFocus:!0,placeholder:"Search commands..."}),e[16]=b):b=e[16],e[17]!==t.loadingNavigation?(f=t.loadingNavigation&&u.jsxs("div",{className:"motion-enter flex items-center gap-2 px-3 py-2 text-xs text-muted-foreground",role:"status",children:[u.jsx(ue,{className:"size-3.5"}),"Loading projects and sessions..."]}),e[17]=t.loadingNavigation,e[18]=f):f=e[18],s=Se,m="max-h-[min(26rem,60vh)]",e[19]===Symbol.for("react.memo_cache_sentinel")?(d=u.jsx(je,{children:"No matching actions."}),e[19]=d):d=e[19],r=k.map(n=>u.jsx(he,{heading:n.value,children:n.items.map(i=>{const v=i.icon;return u.jsxs(ge,{value:i.value,onSelect:()=>D(i),children:[u.jsx(v,{"aria-hidden":"true"}),u.jsxs("span",{className:"min-w-0 flex-1",children:[u.jsx("span",{className:"block truncate",children:i.label}),i.description&&u.jsx("span",{className:"block truncate text-xs text-muted-foreground",children:i.description})]}),i.shortcut&&u.jsx(fe,{children:i.shortcut})]},i.id)})},n.value)),e[0]=t,e[1]=s,e[2]=c,e[3]=l,e[4]=m,e[5]=d,e[6]=w,e[7]=C,e[8]=r,e[9]=S,e[10]=g,e[11]=b,e[12]=f,e[13]=y,e[14]=N,e[15]=x}else s=e[1],c=e[2],l=e[3],m=e[4],d=e[5],w=e[6],C=e[7],r=e[8],S=e[9],g=e[10],b=e[11],f=e[12],y=e[13],N=e[14],x=e[15];let P;e[20]!==s||e[21]!==m||e[22]!==d||e[23]!==r?(P=u.jsxs(s,{className:m,children:[d,r]}),e[20]=s,e[21]=m,e[22]=d,e[23]=r,e[24]=P):P=e[24];let T;e[25]!==c||e[26]!==P||e[27]!==S||e[28]!==g||e[29]!==b||e[30]!==f?(T=u.jsxs(c,{label:S,loop:g,children:[b,f,P]}),e[25]=c,e[26]=P,e[27]=S,e[28]=g,e[29]=b,e[30]=f,e[31]=T):T=e[31];let O;return e[32]!==l||e[33]!==w||e[34]!==C||e[35]!==T||e[36]!==y||e[37]!==N||e[38]!==x?(O=u.jsx(l,{open:y,onOpenChange:N,title:x,description:w,className:C,children:T}),e[32]=l,e[33]=w,e[34]=C,e[35]=T,e[36]=y,e[37]=N,e[38]=x,e[39]=O):O=e[39],O}function ot(t){return a(t.id,t.label,t.keywords,t.icon,t.onSelect)}async function se(t,e){const s=await Ie(t,{signal:e});if(!s.ok)throw new Error(`Request failed (${s.status})`);const c=await s.json();return Array.isArray(c)?c:[]}function dt(t){var J;const e=ie.c(51);let s,c,l,m,d,w;e[0]!==t?({open:l,currentProjectDirName:s,projectCwd:d,onProcessStarted:c,launchTerminalRequest:w,...m}=t,e[0]=t,e[1]=s,e[2]=c,e[3]=l,e[4]=m,e[5]=d,e[6]=w):(s=e[1],c=e[2],l=e[3],m=e[4],d=e[5],w=e[6]);const C=w===void 0?0:w,r=be();let S;e[7]===Symbol.for("react.memo_cache_sentinel")?(S=[],e[7]=S):S=e[7];const[g,b]=M.useState(S);let f;e[8]===Symbol.for("react.memo_cache_sentinel")?(f=[],e[8]=f):f=e[8];const[y,N]=M.useState(f),[x,P]=M.useState(!1),T=M.useRef(0),O=ye();let $,F;e[9]!==O||e[10]!==l?($=()=>{if(!l)return;const j=new AbortController,B=Te();return P(!0),Promise.allSettled([se("/api/projects",j.signal),se(Oe({limit:"12",perProject:"3"},O),j.signal)]).then(me=>{const[X,Q]=me;if(j.signal.aborted)return;const Y=Q.status==="fulfilled"?Q.value:[];ke(Y,B),b(X.status==="fulfilled"?X.value:[]),N(Y),P(!1)}),()=>j.abort()},F=[l,O],e[9]=O,e[10]=l,e[11]=$,e[12]=F):($=e[11],F=e[12]),M.useEffect($,F);let E;e[13]!==g?(E=xe(g),e[13]=g,e[14]=E):E=e[14];const A=E;let I;e:{if(d){I=d;break e}if(!s){I=null;break e}let j;e[15]!==s||e[16]!==g?(j=((J=g.find(B=>B.dirName===s))==null?void 0:J.path)??null,e[15]=s,e[16]=g,e[17]=j):j=e[17],I=j}const o=I;let R;e[18]!==c||e[19]!==r||e[20]!==o?(R=()=>{if(!o)return;const j=r.spawnTerminal({cwd:o}),B=o.replace(/\/+$/,"").split("/").at(-1)||"Terminal";c({id:j,name:B,type:"terminal",status:"running",source:o})},e[18]=c,e[19]=r,e[20]=o,e[21]=R):R=e[21];const k=R;let D,n;e[22]!==k||e[23]!==C||e[24]!==r.status||e[25]!==o?(n=()=>{C<=T.current||!o||r.status!=="connected"||(T.current=C,k())},D=[k,C,r.status,o],e[22]=k,e[23]=C,e[24]=r.status,e[25]=o,e[26]=D,e[27]=n):(D=e[26],n=e[27]),M.useEffect(n,D);let i;e[28]!==s||e[29]!==o?(i={path:o,dirName:s},e[28]=s,e[29]=o,e[30]=i):i=e[30];const v=i;let L;e[31]!==v?(L=()=>Ne(v),e[31]=v,e[32]=L):L=e[32];const q=L;let G;e[33]!==v?(G=()=>Fe(v),e[33]=v,e[34]=G):G=e[34];const le=G,ce=!ee()&&_("hostFiles"),re=_("hostFiles")&&(!ee()||Pe());let K;e[35]!==o?(K=()=>{o&&Ee(o)},e[35]=o,e[36]=K):K=e[36];const de=K;let H;e[37]!==k||e[38]!==r.status||e[39]!==o?(H=o&&r.status==="connected"&&_("terminal")?k:void 0,e[37]=k,e[38]=r.status,e[39]=o,e[40]=H):H=e[40];const U=o&&re?q:void 0,W=o&&ce?le:void 0,p=o?de:void 0;let z;return e[41]!==x||e[42]!==l||e[43]!==m||e[44]!==y||e[45]!==A||e[46]!==H||e[47]!==U||e[48]!==W||e[49]!==p?(z=u.jsx(at,{...m,open:l,projects:A,recentSessions:y,loadingNavigation:x,onOpenIntegratedTerminal:H,onOpenProjectInEditor:U,onRevealProject:W,onCopyProjectPath:p}),e[41]=x,e[42]=l,e[43]=m,e[44]=y,e[45]=A,e[46]=H,e[47]=U,e[48]=W,e[49]=p,e[50]=z):z=e[50],z}export{dt as CommandPaletteHost};
1
+ import{c as ie,j as u,r as M}from"./vendor-react-gGw_S5I_.js";import{af as h,ag as Z,ah as ue,ai as he,aj as ge,ak as fe,al as ve,am as we,an as Ce,ao as Se,ap as je,aq as be,ar as ye,as as xe,at as ee,au as _,av as Pe,aw as Te,ax as Oe,ay as ke,az as Ne,aA as Fe,aB as Ee,U as Ie}from"./index-D3WV64DU.js";import{P as $e,l as Ae,m as te,S as Re,L as De,H as Le,n as He,o as Me,c as ne,G as Be,F as qe,p as Ge,q as Ke,r as ze,s as Ue,t as We,u as pe,v as ae,w as _e,x as Ve,y as Je,K as Xe,E as Qe,z as Ye,A as Ze,B as oe,D as et,I as tt,J as nt}from"./vendor-ui-DkzcTXCS.js";import"./vendor-shiki-DOn6sF-i.js";import"./vendor-markdown-BE1gYnO9.js";function a(t,e,s,c,l,m,d){return{id:t,label:e,icon:c,run:l,shortcut:m,description:d,value:`${e} ${s}`}}function V(...t){return t.filter(e=>e!==!1&&e!==void 0)}function at(t){const e=ie.c(40);let s,c,l,m,d,w,C,r,S,g,b,f,y,N,x;if(e[0]!==t){const $=V(a("home","Go to Mission Control","home overview dashboard",Le,t.onGoHome),a("mission-control",t.showMission?"Exit Mission Control":"Open Mission Control","live sessions blocked waiting answer everything at once",De,t.onToggleMissionControl,h("missionControl")),...(t.extraActions??[]).map(ot),a("new-session","Start a new session","project agent chat create",$e,t.onNewSession,h("newSession")),t.onDuplicateSession&&a("duplicate-session","Duplicate this session","copy fork clone branch thread",Ae,t.onDuplicateSession),t.canFocusComposer&&a("focus-composer","Focus message composer","chat prompt input",te,t.onFocusComposer,h("focusComposer")),t.onFindInConversation&&a("find-in-conversation","Find in conversation","search text transcript turns matches",Re,t.onFindInConversation,h("findInConversation"))),F=(t.projects??[]).slice(0,8).map(n=>a(`project-${n.dirName}`,n.shortName,`${n.path} ${n.dirName} project workspace`,He,()=>{var i;return(i=t.onOpenProject)==null?void 0:i.call(t,n.dirName)},void 0,`${n.path} · ${n.sessionCount} session${n.sessionCount===1?"":"s"}`)),E=(t.recentSessions??[]).slice(0,10).map(n=>{const v=(n.aiTitle||n.name||n.slug||n.lastUserMessage||n.firstUserMessage||n.sessionId).replace(/\s+/g," ").trim().slice(0,160)||n.sessionId,L=[n.projectShortName,n.gitBranch].filter(Boolean).join(" · ");return a(`session-${n.dirName}-${n.fileName}`,v,`${n.projectShortName} ${n.cwd??""} ${n.gitBranch??""} ${n.sessionId} recent thread conversation`,te,()=>{var q;return(q=t.onOpenSession)==null?void 0:q.call(t,n.dirName,n.fileName)},void 0,L)}),A=t.devices??[],I=A.length>1&&t.onSwitchDevice?A.slice(0,Z.length).map((n,i)=>a(`device-${n.id}`,n.isActive?`${n.name} (current)`:`Switch to ${n.name}`,`device machine host remote ${n.id}`,n.isLocal?Me:ne,()=>{var v;return(v=t.onSwitchDevice)==null?void 0:v.call(t,n.id)},h(Z[i]))):[],o=V(a("toggle-sidebar",t.showSidebar?"Hide session sidebar":"Show session sidebar","projects navigation panel",Ue,t.onToggleSidebar,h("toggleSidebar")),t.hasSession&&a("toggle-stats",t.showStats?"Hide session details":"Show session details","stats tokens usage panel",ze,t.onToggleStats,h("toggleStats")),t.onToggleProjectFiles&&a("project-files",t.showProjectFiles?"Close project files":"Open project files","browse edit save workspace source code",Ke,t.onToggleProjectFiles,h("projectFiles")),t.onToggleBrowser&&a("toggle-browser",t.showBrowser?"Hide browser":"Show browser","web page live view browse panel",Ge,t.onToggleBrowser),t.hasFileChanges&&a("toggle-file-changes",t.showFileChanges?"Hide file changes":"Show file changes","diff edits review panel",qe,t.onToggleFileChanges),t.supportsWorktrees&&t.canOpenTerminal&&a("toggle-worktrees",t.showWorktrees?"Hide worktrees":"Show worktrees","git branches panel",Be,t.onToggleWorktrees)),R=V(t.onOpenProjectInEditor&&a("open-project-editor","Open project in editor","code cursor vscode zed workspace",tt,t.onOpenProjectInEditor),t.onRevealProject&&a("reveal-project","Reveal project in file manager","finder explorer folder directory",et,t.onRevealProject),t.onCopyResumeCommand&&a("copy-resume-command","Copy resume command","cli claude codex copilot terminal clipboard continue session",oe,t.onCopyResumeCommand),t.onCopyProjectPath&&a("copy-project-path","Copy project path","workspace directory clipboard",oe,t.onCopyProjectPath),t.onOpenIntegratedTerminal&&a("integrated-terminal","New integrated terminal","embedded shell command line process panel",Ze,t.onOpenIntegratedTerminal,h("newIntegratedTerminal")),t.canOpenTerminal&&a("terminal","Open in system terminal","external shell command line app",Ye,t.onOpenTerminal,h("systemTerminal")),t.onTogglePreview&&a("preview","Toggle development preview","browser localhost dev server website",Qe,t.onTogglePreview,h("preview")),t.onOpenKeyboardShortcuts&&a("keyboard-shortcuts","Customize keyboard shortcuts","keybindings hotkeys settings",Xe,t.onOpenKeyboardShortcuts),t.onOpenConfig&&a("config",t.showConfig?"Close agent configuration":"Open agent configuration","skills commands claude settings files",Je,t.onOpenConfig),a("settings","Open Cogpit settings","preferences network",Ve,t.onOpenSettings),a("theme","Change theme & chat width","appearance light dark oled width narrow wide",_e,t.onOpenTheme,h("themeSelector")),a("expand","Expand all groups","conversation details",ae,t.onExpandAll,h("expandAll")),a("expand-payloads","Expand all tool payloads","raw input result diff conversation details",ae,t.onExpandToolPayloads,h("expandToolPayloads")),a("collapse","Collapse all","conversation groups payloads details",pe,t.onCollapseAll),t.onKillAll&&a("kill-all","Kill all agent processes","stop terminate halt everything runaway",We,t.onKillAll),t.onOpenDevices&&a("manage-devices","Manage devices…","remote machines hub hosts edit rename remove switch",nt,()=>{var n;return(n=t.onOpenDevices)==null?void 0:n.call(t,"manage")}),t.onOpenDevices&&a("add-device","Add device…","remote machine hub host connect pair new",ne,()=>{var n;return(n=t.onOpenDevices)==null?void 0:n.call(t,"add")})),k=[{value:"Navigation",items:$},...E.length>0?[{value:"Recent sessions",items:E}]:[],...F.length>0?[{value:"Projects",items:F}]:[],...I.length>0?[{value:"Devices",items:I}]:[],{value:"View",items:o},{value:"Tools",items:R}],D=function(i){t.onOpenChange(!1),i.run()};l=ve,y=t.open,N=t.onOpenChange,x="Command palette",w="Search for a Cogpit action to run.",C="max-w-xl",c=we,S="Search commands",g=!0,e[16]===Symbol.for("react.memo_cache_sentinel")?(b=u.jsx(Ce,{"aria-label":"Search commands",autoFocus:!0,placeholder:"Search commands..."}),e[16]=b):b=e[16],e[17]!==t.loadingNavigation?(f=t.loadingNavigation&&u.jsxs("div",{className:"motion-enter flex items-center gap-2 px-3 py-2 text-xs text-muted-foreground",role:"status",children:[u.jsx(ue,{className:"size-3.5"}),"Loading projects and sessions..."]}),e[17]=t.loadingNavigation,e[18]=f):f=e[18],s=Se,m="max-h-[min(26rem,60vh)]",e[19]===Symbol.for("react.memo_cache_sentinel")?(d=u.jsx(je,{children:"No matching actions."}),e[19]=d):d=e[19],r=k.map(n=>u.jsx(he,{heading:n.value,children:n.items.map(i=>{const v=i.icon;return u.jsxs(ge,{value:i.value,onSelect:()=>D(i),children:[u.jsx(v,{"aria-hidden":"true"}),u.jsxs("span",{className:"min-w-0 flex-1",children:[u.jsx("span",{className:"block truncate",children:i.label}),i.description&&u.jsx("span",{className:"block truncate text-xs text-muted-foreground",children:i.description})]}),i.shortcut&&u.jsx(fe,{children:i.shortcut})]},i.id)})},n.value)),e[0]=t,e[1]=s,e[2]=c,e[3]=l,e[4]=m,e[5]=d,e[6]=w,e[7]=C,e[8]=r,e[9]=S,e[10]=g,e[11]=b,e[12]=f,e[13]=y,e[14]=N,e[15]=x}else s=e[1],c=e[2],l=e[3],m=e[4],d=e[5],w=e[6],C=e[7],r=e[8],S=e[9],g=e[10],b=e[11],f=e[12],y=e[13],N=e[14],x=e[15];let P;e[20]!==s||e[21]!==m||e[22]!==d||e[23]!==r?(P=u.jsxs(s,{className:m,children:[d,r]}),e[20]=s,e[21]=m,e[22]=d,e[23]=r,e[24]=P):P=e[24];let T;e[25]!==c||e[26]!==P||e[27]!==S||e[28]!==g||e[29]!==b||e[30]!==f?(T=u.jsxs(c,{label:S,loop:g,children:[b,f,P]}),e[25]=c,e[26]=P,e[27]=S,e[28]=g,e[29]=b,e[30]=f,e[31]=T):T=e[31];let O;return e[32]!==l||e[33]!==w||e[34]!==C||e[35]!==T||e[36]!==y||e[37]!==N||e[38]!==x?(O=u.jsx(l,{open:y,onOpenChange:N,title:x,description:w,className:C,children:T}),e[32]=l,e[33]=w,e[34]=C,e[35]=T,e[36]=y,e[37]=N,e[38]=x,e[39]=O):O=e[39],O}function ot(t){return a(t.id,t.label,t.keywords,t.icon,t.onSelect)}async function se(t,e){const s=await Ie(t,{signal:e});if(!s.ok)throw new Error(`Request failed (${s.status})`);const c=await s.json();return Array.isArray(c)?c:[]}function dt(t){var J;const e=ie.c(51);let s,c,l,m,d,w;e[0]!==t?({open:l,currentProjectDirName:s,projectCwd:d,onProcessStarted:c,launchTerminalRequest:w,...m}=t,e[0]=t,e[1]=s,e[2]=c,e[3]=l,e[4]=m,e[5]=d,e[6]=w):(s=e[1],c=e[2],l=e[3],m=e[4],d=e[5],w=e[6]);const C=w===void 0?0:w,r=be();let S;e[7]===Symbol.for("react.memo_cache_sentinel")?(S=[],e[7]=S):S=e[7];const[g,b]=M.useState(S);let f;e[8]===Symbol.for("react.memo_cache_sentinel")?(f=[],e[8]=f):f=e[8];const[y,N]=M.useState(f),[x,P]=M.useState(!1),T=M.useRef(0),O=ye();let $,F;e[9]!==O||e[10]!==l?($=()=>{if(!l)return;const j=new AbortController,B=Te();return P(!0),Promise.allSettled([se("/api/projects",j.signal),se(Oe({limit:"12",perProject:"3"},O),j.signal)]).then(me=>{const[X,Q]=me;if(j.signal.aborted)return;const Y=Q.status==="fulfilled"?Q.value:[];ke(Y,B),b(X.status==="fulfilled"?X.value:[]),N(Y),P(!1)}),()=>j.abort()},F=[l,O],e[9]=O,e[10]=l,e[11]=$,e[12]=F):($=e[11],F=e[12]),M.useEffect($,F);let E;e[13]!==g?(E=xe(g),e[13]=g,e[14]=E):E=e[14];const A=E;let I;e:{if(d){I=d;break e}if(!s){I=null;break e}let j;e[15]!==s||e[16]!==g?(j=((J=g.find(B=>B.dirName===s))==null?void 0:J.path)??null,e[15]=s,e[16]=g,e[17]=j):j=e[17],I=j}const o=I;let R;e[18]!==c||e[19]!==r||e[20]!==o?(R=()=>{if(!o)return;const j=r.spawnTerminal({cwd:o}),B=o.replace(/\/+$/,"").split("/").at(-1)||"Terminal";c({id:j,name:B,type:"terminal",status:"running",source:o})},e[18]=c,e[19]=r,e[20]=o,e[21]=R):R=e[21];const k=R;let D,n;e[22]!==k||e[23]!==C||e[24]!==r.status||e[25]!==o?(n=()=>{C<=T.current||!o||r.status!=="connected"||(T.current=C,k())},D=[k,C,r.status,o],e[22]=k,e[23]=C,e[24]=r.status,e[25]=o,e[26]=D,e[27]=n):(D=e[26],n=e[27]),M.useEffect(n,D);let i;e[28]!==s||e[29]!==o?(i={path:o,dirName:s},e[28]=s,e[29]=o,e[30]=i):i=e[30];const v=i;let L;e[31]!==v?(L=()=>Ne(v),e[31]=v,e[32]=L):L=e[32];const q=L;let G;e[33]!==v?(G=()=>Fe(v),e[33]=v,e[34]=G):G=e[34];const le=G,ce=!ee()&&_("hostFiles"),re=_("hostFiles")&&(!ee()||Pe());let K;e[35]!==o?(K=()=>{o&&Ee(o)},e[35]=o,e[36]=K):K=e[36];const de=K;let H;e[37]!==k||e[38]!==r.status||e[39]!==o?(H=o&&r.status==="connected"&&_("terminal")?k:void 0,e[37]=k,e[38]=r.status,e[39]=o,e[40]=H):H=e[40];const U=o&&re?q:void 0,W=o&&ce?le:void 0,p=o?de:void 0;let z;return e[41]!==x||e[42]!==l||e[43]!==m||e[44]!==y||e[45]!==A||e[46]!==H||e[47]!==U||e[48]!==W||e[49]!==p?(z=u.jsx(at,{...m,open:l,projects:A,recentSessions:y,loadingNavigation:x,onOpenIntegratedTerminal:H,onOpenProjectInEditor:U,onRevealProject:W,onCopyProjectPath:p}),e[41]=x,e[42]=l,e[43]=m,e[44]=y,e[45]=A,e[46]=H,e[47]=U,e[48]=W,e[49]=p,e[50]=z):z=e[50],z}export{dt as CommandPaletteHost};