@dotobokuri/fleet-console 1.17.1 → 1.19.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.
Files changed (68) hide show
  1. package/AGENTS.md +10 -9
  2. package/dist/cli.d.ts +13 -14
  3. package/dist/cli.mjs +1181 -2428
  4. package/dist/client/assets/SymbolsNerdFontMono-Regular-CoUzE12l.woff2 +0 -0
  5. package/dist/client/assets/{_baseUniq-B7sqIsqm.js → _baseUniq-C4_iQlZS.js} +1 -1
  6. package/dist/client/assets/{arc-CvtYLN8U.js → arc-BBAWxYi5.js} +1 -1
  7. package/dist/client/assets/{architectureDiagram-Q4EWVU46-rlI7pNrR.js → architectureDiagram-Q4EWVU46-_oQqhexV.js} +1 -1
  8. package/dist/client/assets/{blockDiagram-DXYQGD6D-nwx9BNRz.js → blockDiagram-DXYQGD6D-3xT9VFiD.js} +1 -1
  9. package/dist/client/assets/{c4Diagram-AHTNJAMY-CRL_0Ism.js → c4Diagram-AHTNJAMY-S-IMcMW2.js} +1 -1
  10. package/dist/client/assets/channel-5tV1napa.js +1 -0
  11. package/dist/client/assets/{chunk-4BX2VUAB-DEkncDR3.js → chunk-4BX2VUAB-tS9Ys0P9.js} +1 -1
  12. package/dist/client/assets/{chunk-4TB4RGXK-Bnot0Ti1.js → chunk-4TB4RGXK-YZgAG7SW.js} +1 -1
  13. package/dist/client/assets/{chunk-55IACEB6-EgKmMTlI.js → chunk-55IACEB6-m-CtqHoO.js} +1 -1
  14. package/dist/client/assets/{chunk-EDXVE4YY-BKiKnVQE.js → chunk-EDXVE4YY-yoymxaEV.js} +1 -1
  15. package/dist/client/assets/{chunk-FMBD7UC4-BRC398vL.js → chunk-FMBD7UC4-REUkrQAG.js} +1 -1
  16. package/dist/client/assets/{chunk-OYMX7WX6-D82gQaXN.js → chunk-OYMX7WX6-DzMuL105.js} +1 -1
  17. package/dist/client/assets/{chunk-QZHKN3VN-BYdI5fky.js → chunk-QZHKN3VN-DXFFll8-.js} +1 -1
  18. package/dist/client/assets/{chunk-YZCP3GAM-BhBgOoc0.js → chunk-YZCP3GAM-CmY7W-gg.js} +1 -1
  19. package/dist/client/assets/classDiagram-6PBFFD2Q-WDM904ap.js +1 -0
  20. package/dist/client/assets/classDiagram-v2-HSJHXN6E-WDM904ap.js +1 -0
  21. package/dist/client/assets/clone-BJg9p0cC.js +1 -0
  22. package/dist/client/assets/{cose-bilkent-S5V4N54A-J8dfEdWD.js → cose-bilkent-S5V4N54A-BupE-a40.js} +1 -1
  23. package/dist/client/assets/{dagre-KV5264BT-zGd_6_Kv.js → dagre-KV5264BT-Jn67LxMS.js} +1 -1
  24. package/dist/client/assets/{diagram-5BDNPKRD-BQpQGgZ3.js → diagram-5BDNPKRD-BAeFEORH.js} +1 -1
  25. package/dist/client/assets/{diagram-G4DWMVQ6-BbgPVITm.js → diagram-G4DWMVQ6-CnZrDABY.js} +1 -1
  26. package/dist/client/assets/{diagram-MMDJMWI5-lJsMf0Ic.js → diagram-MMDJMWI5-DefG-kXU.js} +1 -1
  27. package/dist/client/assets/{diagram-TYMM5635-BpEKTzOh.js → diagram-TYMM5635-BPkXKB-Q.js} +1 -1
  28. package/dist/client/assets/{erDiagram-SMLLAGMA-CHHVwJ_a.js → erDiagram-SMLLAGMA-Bi4jlild.js} +1 -1
  29. package/dist/client/assets/{flowDiagram-DWJPFMVM-Cun8a4NF.js → flowDiagram-DWJPFMVM-BoZyLO7h.js} +1 -1
  30. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-CGCwH_yf.js → ganttDiagram-T4ZO3ILL-LgzSNjrh.js} +1 -1
  31. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-BkY4qdoV.js → gitGraphDiagram-UUTBAWPF-B4fH-hPT.js} +1 -1
  32. package/dist/client/assets/{graph-HbRzXQtt.js → graph-D3ZAYMLG.js} +1 -1
  33. package/dist/client/assets/index-DctP_CJP.css +1 -0
  34. package/dist/client/assets/index-vgEn_EkG.js +404 -0
  35. package/dist/client/assets/{infoDiagram-42DDH7IO-B21Xtz8v.js → infoDiagram-42DDH7IO-pENdunXd.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-DiABngEH.js → ishikawaDiagram-UXIWVN3A-WakLHKte.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-VCZTEJTY-BKZ-Uivu.js → journeyDiagram-VCZTEJTY-CrqXKtzk.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-6JOO6SKY-CoJzTtsH.js → kanban-definition-6JOO6SKY-DdSC9eJ-.js} +1 -1
  39. package/dist/client/assets/{layout-D5tmQpxt.js → layout-BI1Oko_a.js} +1 -1
  40. package/dist/client/assets/{linear-B_riNOXk.js → linear-KUjZtfMe.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-CyRCP3U3.js → mermaid.core-DNlIf4_3.js} +4 -4
  42. package/dist/client/assets/{min-Cn8LZZXB.js → min-DCAecveI.js} +1 -1
  43. package/dist/client/assets/{mindmap-definition-QFDTVHPH-BN_7mZUt.js → mindmap-definition-QFDTVHPH-BSCyQA-4.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-DEJITSTG-DPP2-sYA.js → pieDiagram-DEJITSTG-C_1I63z5.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-CQ_oo-f9.js → quadrantDiagram-34T5L4WZ-CtqeYPcA.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-MS252O5E-BkGq7nxD.js → requirementDiagram-MS252O5E-Cpakdg-s.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-XADWPNL6-BVcoktBR.js → sankeyDiagram-XADWPNL6-CK_eMH3e.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-FGHM5R23-B5rr_VYJ.js → sequenceDiagram-FGHM5R23-D2YygHqF.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-FHFEXIEX-BV8RqzB9.js → stateDiagram-FHFEXIEX-DEDhnbhU.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-ji50PgJQ.js +1 -0
  51. package/dist/client/assets/{timeline-definition-GMOUNBTQ-CJ8TM-3t.js → timeline-definition-GMOUNBTQ-Brgny70W.js} +1 -1
  52. package/dist/client/assets/{vennDiagram-DHZGUBPP-BETSq-Pu.js → vennDiagram-DHZGUBPP-B1I5E8Hy.js} +1 -1
  53. package/dist/client/assets/{wardley-RL74JXVD-CyT2qapq.js → wardley-RL74JXVD-P0VCYfKI.js} +1 -1
  54. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-CWHaiUEG.js → wardleyDiagram-NUSXRM2D-DhYC5Sus.js} +1 -1
  55. package/dist/client/assets/{xychartDiagram-5P7HB3ND-oVPlZ_Yn.js → xychartDiagram-5P7HB3ND-ByJX99rJ.js} +1 -1
  56. package/dist/client/index.html +2 -2
  57. package/dist/fleet-plugins/diff/routes.mjs +260 -32
  58. package/dist/fleet-plugins/file-explorer/routes.mjs +1 -1
  59. package/dist/fleet-plugins/skills/routes.mjs +108 -201
  60. package/dist/fleet-plugins/terminal/routes.mjs +821 -1283
  61. package/package.json +1 -1
  62. package/dist/client/assets/channel-Ct9EqqyG.js +0 -1
  63. package/dist/client/assets/classDiagram-6PBFFD2Q-CPMS8Qpo.js +0 -1
  64. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CPMS8Qpo.js +0 -1
  65. package/dist/client/assets/clone-C5XNYXHD.js +0 -1
  66. package/dist/client/assets/index-CfNSyAUJ.css +0 -1
  67. package/dist/client/assets/index-CzCMC0e-.js +0 -402
  68. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-Bx_fpQWQ.js +0 -1
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import path2 from 'path';
2
+ import path from 'path';
3
3
  import { execFile } from 'child_process';
4
4
  import fs3 from 'fs/promises';
5
5
  import os2 from 'os';
6
6
  import crypto4 from 'crypto';
7
7
  import 'http';
8
8
  import 'stream';
9
- import { existsSync } from 'fs';
9
+ import { existsSync, accessSync, constants } from 'fs';
10
10
 
11
11
  var __defProp = Object.defineProperty;
12
12
  var __export = (target, all) => {
@@ -15932,14 +15932,101 @@ external_exports.union([
15932
15932
  id: zRequestId
15933
15933
  })
15934
15934
  ]);
15935
+ var DEFAULT_WINDOWS_PATHEXT = ".COM;.EXE;.BAT;.CMD";
15936
+ var WINDOWS_PATH_SEPARATOR = ";";
15937
+ var WINDOWS_SHIM_EXTENSIONS = /* @__PURE__ */ new Set([".cmd", ".bat"]);
15938
+ var CMD_EXPANSION_SENSITIVE_PATTERN = /[%^]/;
15939
+ function resolvePathBinary(command, env, options = {}) {
15940
+ const resolved = findBinaryPath(command, env, options);
15941
+ return resolved ? wrapWindowsShim(resolved, env, options.platform ?? process.platform) : void 0;
15942
+ }
15943
+ function findBinaryPath(command, env, options = {}) {
15944
+ const platform = options.platform ?? process.platform;
15945
+ const isWindows2 = platform === "win32";
15946
+ const pathValue = isWindows2 ? env.Path ?? env.PATH ?? "" : env.PATH ?? "";
15947
+ const pathExts = isWindows2 ? parsePathExt(env.PATHEXT) : [""];
15948
+ return findOnPath(command, pathValue, pathExts, platform);
15949
+ }
15950
+ function wrapWindowsShim(resolved, env, platform) {
15951
+ if (platform !== "win32" || !WINDOWS_SHIM_EXTENSIONS.has(path.extname(resolved).toLowerCase())) {
15952
+ return { bin: resolved, prefixArgs: [] };
15953
+ }
15954
+ rejectCmdExpansionSensitiveShim(resolved);
15955
+ return {
15956
+ bin: env.ComSpec ?? "cmd.exe",
15957
+ prefixArgs: ["/d", "/s", "/c", "call", forceWindowsArgQuoting(resolved)]
15958
+ };
15959
+ }
15960
+ function rejectCmdExpansionSensitiveShim(resolved) {
15961
+ if (CMD_EXPANSION_SENSITIVE_PATTERN.test(resolved)) {
15962
+ throw new Error(`Refusing to run Windows shim path with cmd.exe expansion-sensitive characters (% or ^): ${resolved}`);
15963
+ }
15964
+ }
15965
+ function forceWindowsArgQuoting(value) {
15966
+ return `${value} `;
15967
+ }
15968
+ function findOnPath(bin, pathValue, pathExts, platform) {
15969
+ const pathSeparator = platform === "win32" ? WINDOWS_PATH_SEPARATOR : path.delimiter;
15970
+ if (hasPathSeparator(bin, platform) || path.isAbsolute(bin)) {
15971
+ return resolveWithExtensions(bin, pathExts, platform);
15972
+ }
15973
+ for (const entry of pathValue.split(pathSeparator)) {
15974
+ const searchDir = entry.length === 0 ? "." : entry;
15975
+ const candidate = resolveWithExtensions(path.join(searchDir, bin), pathExts, platform);
15976
+ if (candidate) {
15977
+ return candidate;
15978
+ }
15979
+ }
15980
+ return void 0;
15981
+ }
15982
+ function resolveWithExtensions(candidate, pathExts, platform) {
15983
+ if (platform !== "win32" || path.extname(candidate).length > 0) {
15984
+ return isAccessibleExecutable(candidate, platform) ? candidate : void 0;
15985
+ }
15986
+ for (const ext of pathExts) {
15987
+ if (ext.length === 0) {
15988
+ continue;
15989
+ }
15990
+ const withExt = `${candidate}${ext}`;
15991
+ if (existsSync(withExt)) {
15992
+ return withExt;
15993
+ }
15994
+ }
15995
+ return isAccessibleExecutable(candidate, platform) ? candidate : void 0;
15996
+ }
15997
+ function isAccessibleExecutable(candidate, platform) {
15998
+ if (!existsSync(candidate)) return false;
15999
+ if (platform === "win32") return true;
16000
+ try {
16001
+ accessSync(candidate, constants.X_OK);
16002
+ return true;
16003
+ } catch {
16004
+ return false;
16005
+ }
16006
+ }
16007
+ function hasPathSeparator(value, platform) {
16008
+ if (value.includes("/")) {
16009
+ return true;
16010
+ }
16011
+ return platform === "win32" && value.includes("\\");
16012
+ }
16013
+ function parsePathExt(pathExt) {
16014
+ const raw = pathExt && pathExt.trim().length > 0 ? pathExt : DEFAULT_WINDOWS_PATHEXT;
16015
+ return raw.split(WINDOWS_PATH_SEPARATOR).map((entry) => entry.trim()).filter((entry) => entry.length > 0);
16016
+ }
16017
+
16018
+ // ../../packages/core-process/src/hidden.ts
16019
+ function withHidden(options) {
16020
+ return { ...options ?? {}, windowsHide: true };
16021
+ }
15935
16022
 
15936
16023
  // ../../packages/core-unified-agent/models.json
15937
16024
  var models_default = {
15938
16025
  version: 1,
15939
- updatedAt: "2026-06-16T00:00:00Z",
16026
+ updatedAt: "2026-07-04T00:00:00Z",
15940
16027
  providers: {
15941
16028
  claude: {
15942
- name: "Claude Code with Anthropic",
16029
+ name: "Claude Code",
15943
16030
  defaultModel: "opus[1m]",
15944
16031
  models: [
15945
16032
  { modelId: "haiku", name: "Claude Haiku", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "low" } },
@@ -15951,50 +16038,8 @@ var models_default = {
15951
16038
  { modelId: "claude-opus-4-8[1m]", name: "Claude Opus 4.8 [1M]", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } }
15952
16039
  ]
15953
16040
  },
15954
- "claude-zai": {
15955
- name: "Claude Code with Z.AI GLM",
15956
- defaultModel: "opus",
15957
- models: [
15958
- { modelId: "haiku", name: "GLM-4.5 Air (Haiku slot)", effort: { supported: false } },
15959
- { modelId: "sonnet", name: "GLM-5 Turbo (Sonnet slot)", effort: { supported: false } },
15960
- { modelId: "opus", name: "GLM-5.1 (Opus slot)", effort: { supported: false } }
15961
- ],
15962
- modelsMapping: {
15963
- haiku: "glm-4.5-air",
15964
- sonnet: "glm-5-turbo",
15965
- opus: "glm-5.1"
15966
- }
15967
- },
15968
- "claude-kimi": {
15969
- name: "Claude Code with Moonshot Kimi",
15970
- defaultModel: "opus",
15971
- models: [
15972
- { modelId: "haiku", name: "Kimi K2.7 Code (Haiku slot)", effort: { supported: false } },
15973
- { modelId: "sonnet", name: "Kimi K2.7 Code (Sonnet slot)", effort: { supported: false } },
15974
- { modelId: "opus", name: "Kimi K2.7 Code (Opus slot)", effort: { supported: false } }
15975
- ],
15976
- modelsMapping: {
15977
- haiku: "kimi-k2.7-code",
15978
- sonnet: "kimi-k2.7-code",
15979
- opus: "kimi-k2.7-code"
15980
- }
15981
- },
15982
- "claude-glm": {
15983
- name: "Claude Code with ZhipuAI GLM",
15984
- defaultModel: "opus",
15985
- models: [
15986
- { modelId: "haiku", name: "GLM-4.5-Air (Haiku slot)", effort: { supported: false } },
15987
- { modelId: "sonnet", name: "GLM-4.7 (Sonnet slot)", effort: { supported: false } },
15988
- { modelId: "opus", name: "GLM-5.1 (Opus slot)", effort: { supported: false } }
15989
- ],
15990
- modelsMapping: {
15991
- haiku: "glm-4.5-air",
15992
- sonnet: "glm-4.7",
15993
- opus: "glm-5.1"
15994
- }
15995
- },
15996
16041
  codex: {
15997
- name: "OpenAI Codex CLI",
16042
+ name: "Codex",
15998
16043
  defaultModel: "gpt-5.4",
15999
16044
  models: [
16000
16045
  { modelId: "gpt-5.4", name: "GPT-5.4", effort: { supported: true, levels: ["low", "medium", "high", "xhigh"], default: "high" } },
@@ -16010,7 +16055,9 @@ var models_default = {
16010
16055
  { modelId: "opencode-go/deepseek-v4-pro", name: "DeepSeek V4 Pro", effort: { supported: false } },
16011
16056
  { modelId: "opencode-go/glm-5", name: "GLM-5", effort: { supported: false } },
16012
16057
  { modelId: "opencode-go/glm-5.1", name: "GLM-5.1", effort: { supported: false } },
16013
- { modelId: "opencode-go/kimi-k2.6", name: "Kimi K2.6 (3x limits)", effort: { supported: false } }
16058
+ { modelId: "opencode-go/glm-5.2", name: "GLM-5.2", effort: { supported: false } },
16059
+ { modelId: "opencode-go/kimi-k2.6", name: "Kimi K2.6 (3x limits)", effort: { supported: false } },
16060
+ { modelId: "opencode-go/kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } }
16014
16061
  ]
16015
16062
  },
16016
16063
  cursor: {
@@ -16023,9 +16070,9 @@ var models_default = {
16023
16070
  { modelId: "gemini-3.1-pro", name: "Gemini 3.1 Pro", effort: { supported: false } },
16024
16071
  { modelId: "gemini-3-flash", name: "Gemini 3 Flash", effort: { supported: false } },
16025
16072
  { modelId: "gemini-3.5-flash", name: "Gemini 3.5 Flash", effort: { supported: false } },
16026
- { modelId: "claude-opus-4-7-thinking", name: "Claude Opus 4.7 Thinking", spawnModelTemplate: "claude-opus-4-7-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16027
- { modelId: "claude-opus-4-8-thinking", name: "Claude Opus 4.8 Thinking", spawnModelTemplate: "claude-opus-4-8-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16028
- { modelId: "claude-4.6-sonnet-medium-thinking", name: "Claude Sonnet 4.6 Medium Thinking", effort: { supported: false } }
16073
+ { modelId: "kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } },
16074
+ { modelId: "glm-5.2", name: "GLM 5.2", spawnModelTemplate: "glm-5.2-{effort}", effort: { supported: true, levels: ["high", "max"], default: "max" } },
16075
+ { modelId: "claude-opus-4-8-thinking", name: "Claude Opus 4.8 Thinking", spawnModelTemplate: "claude-opus-4-8-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } }
16029
16076
  ]
16030
16077
  }
16031
16078
  }
@@ -16139,77 +16186,6 @@ var CLI_BACKENDS = {
16139
16186
  usesNpxBridge: true,
16140
16187
  defaultMaxTokens: 16384
16141
16188
  },
16142
- "claude-zai": {
16143
- id: "claude-zai",
16144
- cliCommand: "claude",
16145
- protocol: "acp",
16146
- authRequired: true,
16147
- npxPackage: "@agentclientprotocol/claude-agent-acp@0.33.1",
16148
- modes: [
16149
- { id: "default", label: "Default" },
16150
- { id: "plan", label: "Plan" },
16151
- { id: "bypassPermissions", label: "YOLO" }
16152
- ],
16153
- supportsSessionClose: true,
16154
- supportsSessionLoad: true,
16155
- requiresModelAtSpawn: false,
16156
- usesNpxBridge: true,
16157
- defaultMaxTokens: 16384,
16158
- defaultEnv: {
16159
- ANTHROPIC_BASE_URL: "https://api.z.ai/api/anthropic",
16160
- API_TIMEOUT_MS: "3000000"
16161
- }
16162
- },
16163
- "claude-kimi": {
16164
- id: "claude-kimi",
16165
- cliCommand: "claude",
16166
- protocol: "acp",
16167
- authRequired: true,
16168
- npxPackage: "@agentclientprotocol/claude-agent-acp@0.33.1",
16169
- modes: [
16170
- { id: "default", label: "Default" },
16171
- { id: "plan", label: "Plan" },
16172
- { id: "bypassPermissions", label: "YOLO" }
16173
- ],
16174
- supportsSessionClose: true,
16175
- supportsSessionLoad: true,
16176
- requiresModelAtSpawn: false,
16177
- usesNpxBridge: true,
16178
- defaultMaxTokens: 16384,
16179
- defaultEnv: {
16180
- ANTHROPIC_BASE_URL: "https://api.kimi.com/coding/",
16181
- ENABLE_TOOL_SEARCH: "false",
16182
- ANTHROPIC_MODEL: "kimi-k2.7-code",
16183
- CLAUDE_CODE_SUBAGENT_MODEL: "kimi-k2.7-code",
16184
- API_TIMEOUT_MS: "3000000"
16185
- }
16186
- },
16187
- "claude-glm": {
16188
- id: "claude-glm",
16189
- cliCommand: "claude",
16190
- protocol: "acp",
16191
- authRequired: true,
16192
- npxPackage: "@agentclientprotocol/claude-agent-acp@0.33.1",
16193
- modes: [
16194
- { id: "default", label: "Default" },
16195
- { id: "plan", label: "Plan" },
16196
- { id: "bypassPermissions", label: "YOLO" }
16197
- ],
16198
- supportsSessionClose: true,
16199
- supportsSessionLoad: true,
16200
- requiresModelAtSpawn: false,
16201
- usesNpxBridge: true,
16202
- defaultMaxTokens: 16384,
16203
- defaultEnv: {
16204
- ANTHROPIC_BASE_URL: "https://open.bigmodel.cn/api/anthropic",
16205
- // ZhipuAI Claude Code 권장 슬롯 매핑 — 직접 launch(Native PTY) 경로에서도
16206
- // haiku/sonnet/opus 별칭이 GLM 모델로 해석되도록 env로 고정한다.
16207
- ANTHROPIC_DEFAULT_HAIKU_MODEL: "glm-4.5-air",
16208
- ANTHROPIC_DEFAULT_SONNET_MODEL: "glm-4.7",
16209
- ANTHROPIC_DEFAULT_OPUS_MODEL: "glm-5.1",
16210
- API_TIMEOUT_MS: "3000000"
16211
- }
16212
- },
16213
16189
  codex: {
16214
16190
  id: "codex",
16215
16191
  cliCommand: "codex",
@@ -16271,75 +16247,6 @@ Object.entries(CLI_BACKENDS).map(([id, backend]) => ({
16271
16247
 
16272
16248
  // ../../packages/core-unified-agent/src/client/UnifiedCodexAgentClient.ts
16273
16249
  process.platform === "win32";
16274
- var DEFAULT_WINDOWS_PATHEXT = ".COM;.EXE;.BAT;.CMD";
16275
- var WINDOWS_PATH_SEPARATOR = ";";
16276
- var WINDOWS_SHIM_EXTENSIONS = /* @__PURE__ */ new Set([".cmd", ".bat"]);
16277
- var CMD_EXPANSION_SENSITIVE_PATTERN = /[%^]/;
16278
- function resolvePathBinary(command, env, options = {}) {
16279
- const platform = options.platform ?? process.platform;
16280
- const isWindows2 = platform === "win32";
16281
- const pathValue = isWindows2 ? env.Path ?? env.PATH ?? "" : env.PATH ?? "";
16282
- const pathExts = isWindows2 ? parsePathExt(env.PATHEXT) : [""];
16283
- const resolved = findOnPath(command, pathValue, pathExts, platform);
16284
- return resolved ? wrapWindowsShim(resolved, env, platform) : void 0;
16285
- }
16286
- function wrapWindowsShim(resolved, env, platform) {
16287
- if (platform !== "win32" || !WINDOWS_SHIM_EXTENSIONS.has(path2.extname(resolved).toLowerCase())) {
16288
- return { bin: resolved, prefixArgs: [] };
16289
- }
16290
- rejectCmdExpansionSensitiveShim(resolved);
16291
- return {
16292
- bin: env.ComSpec ?? "cmd.exe",
16293
- prefixArgs: ["/d", "/s", "/c", "call", forceWindowsArgQuoting(resolved)]
16294
- };
16295
- }
16296
- function rejectCmdExpansionSensitiveShim(resolved) {
16297
- if (CMD_EXPANSION_SENSITIVE_PATTERN.test(resolved)) {
16298
- throw new Error(`Refusing to run Windows shim path with cmd.exe expansion-sensitive characters (% or ^): ${resolved}`);
16299
- }
16300
- }
16301
- function forceWindowsArgQuoting(value) {
16302
- return `${value} `;
16303
- }
16304
- function findOnPath(bin, pathValue, pathExts, platform) {
16305
- const pathSeparator = platform === "win32" ? WINDOWS_PATH_SEPARATOR : path2.delimiter;
16306
- if (hasPathSeparator(bin, platform) || path2.isAbsolute(bin)) {
16307
- return resolveWithExtensions(bin, pathExts, platform);
16308
- }
16309
- for (const entry of pathValue.split(pathSeparator)) {
16310
- const searchDir = entry.length === 0 ? "." : entry;
16311
- const candidate = resolveWithExtensions(path2.join(searchDir, bin), pathExts, platform);
16312
- if (candidate) {
16313
- return candidate;
16314
- }
16315
- }
16316
- return void 0;
16317
- }
16318
- function resolveWithExtensions(candidate, pathExts, platform) {
16319
- if (platform !== "win32" || path2.extname(candidate).length > 0) {
16320
- return existsSync(candidate) ? candidate : void 0;
16321
- }
16322
- for (const ext of pathExts) {
16323
- if (ext.length === 0) {
16324
- continue;
16325
- }
16326
- const withExt = `${candidate}${ext}`;
16327
- if (existsSync(withExt)) {
16328
- return withExt;
16329
- }
16330
- }
16331
- return existsSync(candidate) ? candidate : void 0;
16332
- }
16333
- function hasPathSeparator(value, platform) {
16334
- if (value.includes("/")) {
16335
- return true;
16336
- }
16337
- return platform === "win32" && value.includes("\\");
16338
- }
16339
- function parsePathExt(pathExt) {
16340
- const raw = pathExt && pathExt.trim().length > 0 ? pathExt : DEFAULT_WINDOWS_PATHEXT;
16341
- return raw.split(WINDOWS_PATH_SEPARATOR).map((entry) => entry.trim()).filter((entry) => entry.length > 0);
16342
- }
16343
16250
 
16344
16251
  // ../fleet-plugins/skills/server/cli.ts
16345
16252
  var SKILLS_VERSION = "1.5.14";
@@ -16378,7 +16285,7 @@ async function runNpmInstall(cliHome) {
16378
16285
  file2,
16379
16286
  args,
16380
16287
  // windowsHide: GUI 콘솔에서 하위 프로세스(cmd.exe 심 래퍼) 콘솔 창이 순간 표시되는 것을 막는다.
16381
- { shell: false, windowsHide: true, timeout: BOOTSTRAP_TIMEOUT_MS }
16288
+ withHidden({ shell: false, timeout: BOOTSTRAP_TIMEOUT_MS })
16382
16289
  );
16383
16290
  child.on("close", (code) => {
16384
16291
  if (code === 0) resolve();
@@ -16391,8 +16298,8 @@ async function ensureCliMjs(cliHome, onBootstrap) {
16391
16298
  if (_cliMjsPath) return _cliMjsPath;
16392
16299
  if (_bootstrapPromise) return _bootstrapPromise;
16393
16300
  _bootstrapPromise = (async () => {
16394
- const mjsPath = path2.join(cliHome, "node_modules", SKILLS_PACKAGE, "bin", "cli.mjs");
16395
- const pkgPath = path2.join(cliHome, "node_modules", SKILLS_PACKAGE, "package.json");
16301
+ const mjsPath = path.join(cliHome, "node_modules", SKILLS_PACKAGE, "bin", "cli.mjs");
16302
+ const pkgPath = path.join(cliHome, "node_modules", SKILLS_PACKAGE, "package.json");
16396
16303
  let needsInstall = true;
16397
16304
  try {
16398
16305
  const raw = await fs3.readFile(pkgPath, "utf-8");
@@ -16421,7 +16328,7 @@ function createDefaultExecutor(cliHome) {
16421
16328
  process.execPath,
16422
16329
  [mjsPath, ...args],
16423
16330
  // windowsHide: GUI 콘솔에서 하위 node.exe 콘솔 창이 순간 표시되는 것을 막는다.
16424
- { shell: false, windowsHide: true, cwd, timeout, maxBuffer: 10 * 1024 * 1024 }
16331
+ withHidden({ shell: false, cwd, timeout, maxBuffer: 10 * 1024 * 1024 })
16425
16332
  );
16426
16333
  const stdoutParts = [];
16427
16334
  const stderrParts = [];
@@ -16604,7 +16511,7 @@ var CLI_TIMEOUT_MS = 12e4;
16604
16511
  async function readSkillSources(cwd) {
16605
16512
  const sources = /* @__PURE__ */ new Map();
16606
16513
  try {
16607
- const raw = await fs3.readFile(path2.join(cwd, "skills-lock.json"), "utf-8");
16514
+ const raw = await fs3.readFile(path.join(cwd, "skills-lock.json"), "utf-8");
16608
16515
  const parsed = JSON.parse(raw);
16609
16516
  if (typeof parsed === "object" && parsed !== null) {
16610
16517
  for (const [name, entry] of Object.entries(parsed)) {
@@ -16615,7 +16522,7 @@ async function readSkillSources(cwd) {
16615
16522
  } catch {
16616
16523
  }
16617
16524
  try {
16618
- const raw = await fs3.readFile(path2.join(cwd, ".agents", ".skill-lock.json"), "utf-8");
16525
+ const raw = await fs3.readFile(path.join(cwd, ".agents", ".skill-lock.json"), "utf-8");
16619
16526
  const parsed = JSON.parse(raw);
16620
16527
  if (typeof parsed === "object" && parsed !== null) {
16621
16528
  for (const [name, entry] of Object.entries(parsed)) {
@@ -16980,7 +16887,7 @@ async function handleInstalledFile(req, res, ctx, executor) {
16980
16887
  return;
16981
16888
  }
16982
16889
  const skillRoot = entry.path;
16983
- const skillMdPath = path2.join(skillRoot, "SKILL.md");
16890
+ const skillMdPath = path.join(skillRoot, "SKILL.md");
16984
16891
  const [realAllowedRoot, realRoot, realMd] = await Promise.all([
16985
16892
  // CLI가 보고한 skillRoot 자체도 신뢰하지 않는다 — scope의 정당한 상위 경계
16986
16893
  // (project=theater 루트, global=홈)를 벗어나면 읽지 않는다. `.agents/skills`로
@@ -16993,11 +16900,11 @@ async function handleInstalledFile(req, res, ctx, executor) {
16993
16900
  ctx.host.http.writeJson(res, 404, { error: "skill_not_found" });
16994
16901
  return;
16995
16902
  }
16996
- if (realRoot !== realAllowedRoot && !realRoot.startsWith(realAllowedRoot + path2.sep)) {
16903
+ if (realRoot !== realAllowedRoot && !realRoot.startsWith(realAllowedRoot + path.sep)) {
16997
16904
  ctx.host.http.writeJson(res, 403, { error: "path_outside_theater" });
16998
16905
  return;
16999
16906
  }
17000
- if (realMd !== realRoot && !realMd.startsWith(realRoot + path2.sep)) {
16907
+ if (realMd !== realRoot && !realMd.startsWith(realRoot + path.sep)) {
17001
16908
  ctx.host.http.writeJson(res, 403, { error: "path_outside_theater" });
17002
16909
  return;
17003
16910
  }
@@ -17012,7 +16919,7 @@ async function handleInstalledFile(req, res, ctx, executor) {
17012
16919
  var routes_default = definePlugin({
17013
16920
  id: "skills",
17014
16921
  register(ctx) {
17015
- const cliHome = path2.join(ctx.host.paths.pluginDataDir("skills"), "cli");
16922
+ const cliHome = path.join(ctx.host.paths.pluginDataDir("skills"), "cli");
17016
16923
  const executor = createDefaultExecutor(cliHome);
17017
16924
  registerRouter(ctx, "list", async ({ req, res }) => {
17018
16925
  await handleList(req, res, ctx, executor);