@dotobokuri/fleet-console 1.16.1 → 1.17.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 (65) hide show
  1. package/AGENTS.md +5 -2
  2. package/dist/cli.mjs +499 -299
  3. package/dist/client/assets/{_baseUniq-Bvbp_jlP.js → _baseUniq-B7sqIsqm.js} +1 -1
  4. package/dist/client/assets/{arc-BIE5Buf8.js → arc-CvtYLN8U.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-Q4EWVU46-D5XMG93D.js → architectureDiagram-Q4EWVU46-rlI7pNrR.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-DXYQGD6D-DF6L79td.js → blockDiagram-DXYQGD6D-nwx9BNRz.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AHTNJAMY-DhF1h0OW.js → c4Diagram-AHTNJAMY-CRL_0Ism.js} +1 -1
  8. package/dist/client/assets/channel-Ct9EqqyG.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-HIDhmpsY.js → chunk-4BX2VUAB-DEkncDR3.js} +1 -1
  10. package/dist/client/assets/{chunk-4TB4RGXK-WM3UvlRe.js → chunk-4TB4RGXK-Bnot0Ti1.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-D9kCAM0-.js → chunk-55IACEB6-EgKmMTlI.js} +1 -1
  12. package/dist/client/assets/{chunk-EDXVE4YY-CHGSf6YA.js → chunk-EDXVE4YY-BKiKnVQE.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-saa1UCmo.js → chunk-FMBD7UC4-BRC398vL.js} +1 -1
  14. package/dist/client/assets/{chunk-OYMX7WX6-BrlxxClZ.js → chunk-OYMX7WX6-D82gQaXN.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-CVnd5MX8.js → chunk-QZHKN3VN-BYdI5fky.js} +1 -1
  16. package/dist/client/assets/{chunk-YZCP3GAM-BpsFNlbM.js → chunk-YZCP3GAM-BhBgOoc0.js} +1 -1
  17. package/dist/client/assets/classDiagram-6PBFFD2Q-CPMS8Qpo.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CPMS8Qpo.js +1 -0
  19. package/dist/client/assets/clone-C5XNYXHD.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-AdFIrmD1.js → cose-bilkent-S5V4N54A-J8dfEdWD.js} +1 -1
  21. package/dist/client/assets/{dagre-KV5264BT-YPE_DPjG.js → dagre-KV5264BT-zGd_6_Kv.js} +1 -1
  22. package/dist/client/assets/{diagram-5BDNPKRD-sW7JSe_o.js → diagram-5BDNPKRD-BQpQGgZ3.js} +1 -1
  23. package/dist/client/assets/{diagram-G4DWMVQ6-CdoUA7HM.js → diagram-G4DWMVQ6-BbgPVITm.js} +1 -1
  24. package/dist/client/assets/{diagram-MMDJMWI5-Dr_Q44k2.js → diagram-MMDJMWI5-lJsMf0Ic.js} +1 -1
  25. package/dist/client/assets/{diagram-TYMM5635-CgWLDdO4.js → diagram-TYMM5635-BpEKTzOh.js} +1 -1
  26. package/dist/client/assets/{erDiagram-SMLLAGMA-BS5jKQII.js → erDiagram-SMLLAGMA-CHHVwJ_a.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-DWJPFMVM-DM_ZIfsi.js → flowDiagram-DWJPFMVM-Cun8a4NF.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-D1ASi2pt.js → ganttDiagram-T4ZO3ILL-CGCwH_yf.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-DTS8qu5f.js → gitGraphDiagram-UUTBAWPF-BkY4qdoV.js} +1 -1
  30. package/dist/client/assets/{graph-BSP3V12O.js → graph-HbRzXQtt.js} +1 -1
  31. package/dist/client/assets/{index-DNtncJ2Y.css → index-CfNSyAUJ.css} +1 -1
  32. package/dist/client/assets/index-CzCMC0e-.js +402 -0
  33. package/dist/client/assets/{infoDiagram-42DDH7IO-C6rS44Vv.js → infoDiagram-42DDH7IO-B21Xtz8v.js} +1 -1
  34. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-BysMV0Yj.js → ishikawaDiagram-UXIWVN3A-DiABngEH.js} +1 -1
  35. package/dist/client/assets/{journeyDiagram-VCZTEJTY-Cq1tDTjK.js → journeyDiagram-VCZTEJTY-BKZ-Uivu.js} +1 -1
  36. package/dist/client/assets/{kanban-definition-6JOO6SKY-CV7fuoIo.js → kanban-definition-6JOO6SKY-CoJzTtsH.js} +1 -1
  37. package/dist/client/assets/{layout-mBwNdhT9.js → layout-D5tmQpxt.js} +1 -1
  38. package/dist/client/assets/{linear-B8Mqzhqu.js → linear-B_riNOXk.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-mTVIRAe-.js → mermaid.core-CyRCP3U3.js} +4 -4
  40. package/dist/client/assets/{min-LkS4GBrL.js → min-Cn8LZZXB.js} +1 -1
  41. package/dist/client/assets/{mindmap-definition-QFDTVHPH-CuK4DHsN.js → mindmap-definition-QFDTVHPH-BN_7mZUt.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-DEJITSTG-yKtYS0aG.js → pieDiagram-DEJITSTG-DPP2-sYA.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-CQYBuUXw.js → quadrantDiagram-34T5L4WZ-CQ_oo-f9.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-MS252O5E-DExCsGb_.js → requirementDiagram-MS252O5E-BkGq7nxD.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-XADWPNL6-kqoN-VmQ.js → sankeyDiagram-XADWPNL6-BVcoktBR.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-FGHM5R23-Dsk6zp0F.js → sequenceDiagram-FGHM5R23-B5rr_VYJ.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-FHFEXIEX-Bg-kY2ci.js → stateDiagram-FHFEXIEX-BV8RqzB9.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-Bx_fpQWQ.js +1 -0
  49. package/dist/client/assets/{timeline-definition-GMOUNBTQ-DkeszYPW.js → timeline-definition-GMOUNBTQ-CJ8TM-3t.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-DHZGUBPP-a9aq_CaS.js → vennDiagram-DHZGUBPP-BETSq-Pu.js} +1 -1
  51. package/dist/client/assets/{wardley-RL74JXVD-BioIIFLl.js → wardley-RL74JXVD-CyT2qapq.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-Bpy2nx7x.js → wardleyDiagram-NUSXRM2D-CWHaiUEG.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-5P7HB3ND-N7vhpanC.js → xychartDiagram-5P7HB3ND-oVPlZ_Yn.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/fleet-plugins/diff/routes.mjs +224 -57
  56. package/dist/fleet-plugins/file-explorer/routes.mjs +130 -0
  57. package/dist/fleet-plugins/skills/routes.mjs +17052 -0
  58. package/dist/fleet-plugins/terminal/routes.mjs +164 -67
  59. package/package.json +1 -1
  60. package/dist/client/assets/channel-BSjWiXu9.js +0 -1
  61. package/dist/client/assets/classDiagram-6PBFFD2Q-DIEVc5gp.js +0 -1
  62. package/dist/client/assets/classDiagram-v2-HSJHXN6E-DIEVc5gp.js +0 -1
  63. package/dist/client/assets/clone-VuQnnBA0.js +0 -1
  64. package/dist/client/assets/index-D3a51i1X.js +0 -402
  65. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-Dlqv8bJ9.js +0 -1
@@ -17438,6 +17438,27 @@ function isChildProcessRunning(child) {
17438
17438
  }
17439
17439
 
17440
17440
  // ../../packages/core-unified-agent/src/connection/BaseConnection.ts
17441
+ var STDERR_DIAGNOSTIC_LINE_LIMIT = 20;
17442
+ var STDERR_DIAGNOSTIC_LINE_CHAR_LIMIT = 2e3;
17443
+ var STDERR_DIAGNOSTIC_TOTAL_BYTE_LIMIT = 8e3;
17444
+ var ANSI_PATTERN = /\x1b\[[0-?]*[ -/]*[@-~]/g;
17445
+ var CONTROL_PATTERN = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
17446
+ var SECRET_PATTERNS = [
17447
+ { label: "aws_access_key", pattern: /AKIA[0-9A-Z]{16}/g },
17448
+ { label: "github_token", pattern: /gh[psour]_[A-Za-z0-9]{36}/g },
17449
+ { label: "jwt", pattern: /eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g },
17450
+ { label: "openai_key", pattern: /\bsk-[A-Za-z0-9_-]{20,}\b/g },
17451
+ {
17452
+ label: "generic_secret",
17453
+ pattern: /\b[A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL)[A-Z0-9_]*\s*[:=]\s*["']?[^\s"']+["']?/gi
17454
+ },
17455
+ {
17456
+ label: "pem_private_key",
17457
+ pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]+?-----END [A-Z ]*PRIVATE KEY-----/g
17458
+ }
17459
+ ];
17460
+ var PEM_BEGIN_PATTERN = /-----BEGIN [A-Z ]*PRIVATE KEY-----/;
17461
+ var PEM_END_PATTERN = /-----END [A-Z ]*PRIVATE KEY-----/;
17441
17462
  var BaseConnection = class extends EventEmitter {
17442
17463
  child = null;
17443
17464
  state = "disconnected";
@@ -17451,6 +17472,9 @@ var BaseConnection = class extends EventEmitter {
17451
17472
  initTimeout;
17452
17473
  promptIdleTimeout;
17453
17474
  stderrBuffer = "";
17475
+ diagnosticStderrTail = [];
17476
+ // PEM 블록 내부 여부 추적 (줄 단위 수신 시 바디 라인 누출 방지)
17477
+ inPemBlock = false;
17454
17478
  constructor(options) {
17455
17479
  super();
17456
17480
  this.command = options.command;
@@ -17582,9 +17606,32 @@ var BaseConnection = class extends EventEmitter {
17582
17606
  if (!message) {
17583
17607
  return;
17584
17608
  }
17609
+ this.recordDiagnosticStderrLine(message);
17585
17610
  this.emit("log", message);
17586
17611
  this.emit("logEntry", this.createStructuredLogEntry(message));
17587
17612
  }
17613
+ /** 실패 메시지에 붙일 수 있는 짧고 마스킹된 stderr tail을 반환합니다. */
17614
+ getStderrDiagnosticTail() {
17615
+ return this.diagnosticStderrTail.join("\n");
17616
+ }
17617
+ /** 원본 에러에 stderr tail 진단을 붙여 상위 계층으로 전달합니다. */
17618
+ withStderrDiagnostics(error51, phase) {
17619
+ const baseError = error51 instanceof Error ? error51 : new Error(String(error51));
17620
+ this.flushStderrBuffer();
17621
+ const stderrTail = this.getStderrDiagnosticTail();
17622
+ if (!stderrTail || baseError.message.includes(`${phase} stderr tail:`)) {
17623
+ return baseError;
17624
+ }
17625
+ const diagnosticError = new Error(
17626
+ `${baseError.message}
17627
+
17628
+ ${phase} stderr tail:
17629
+ ${stderrTail}`,
17630
+ { cause: baseError }
17631
+ );
17632
+ diagnosticError.name = baseError.name;
17633
+ return diagnosticError;
17634
+ }
17588
17635
  /** 기본 구조화 stderr 로그 항목을 생성합니다. */
17589
17636
  createStructuredLogEntry(message) {
17590
17637
  return {
@@ -17621,6 +17668,27 @@ var BaseConnection = class extends EventEmitter {
17621
17668
  })
17622
17669
  ]);
17623
17670
  }
17671
+ recordDiagnosticStderrLine(message) {
17672
+ const pemMarkerLine = normalizePemMarkerLine(message);
17673
+ if (PEM_BEGIN_PATTERN.test(pemMarkerLine)) {
17674
+ this.inPemBlock = true;
17675
+ }
17676
+ const inBlock = this.inPemBlock;
17677
+ if (PEM_END_PATTERN.test(pemMarkerLine)) {
17678
+ this.inPemBlock = false;
17679
+ }
17680
+ const sanitized = sanitizeDiagnosticStderrLine(message, inBlock);
17681
+ if (!sanitized) {
17682
+ return;
17683
+ }
17684
+ this.diagnosticStderrTail.push(sanitized);
17685
+ while (this.diagnosticStderrTail.length > STDERR_DIAGNOSTIC_LINE_LIMIT) {
17686
+ this.diagnosticStderrTail.shift();
17687
+ }
17688
+ while (byteLength(this.getStderrDiagnosticTail()) > STDERR_DIAGNOSTIC_TOTAL_BYTE_LIMIT && this.diagnosticStderrTail.length > 1) {
17689
+ this.diagnosticStderrTail.shift();
17690
+ }
17691
+ }
17624
17692
  };
17625
17693
  function quoteForCmd(token) {
17626
17694
  if (token === "") {
@@ -17635,6 +17703,26 @@ function buildWindowsCmdArgs(command, args) {
17635
17703
  const line = [command, ...args].map(quoteForCmd).join(" ");
17636
17704
  return ["/S", "/C", `"${line}"`];
17637
17705
  }
17706
+ function sanitizeDiagnosticStderrLine(value, isPemLine) {
17707
+ const cleaned = (isPemLine ? "[REDACTED:pem_private_key]" : redactDiagnosticSecrets(value.replace(ANSI_PATTERN, "").replace(CONTROL_PATTERN, ""))).trim();
17708
+ if (cleaned.length <= STDERR_DIAGNOSTIC_LINE_CHAR_LIMIT) {
17709
+ return cleaned;
17710
+ }
17711
+ const omitted = cleaned.length - STDERR_DIAGNOSTIC_LINE_CHAR_LIMIT;
17712
+ return `${cleaned.slice(0, STDERR_DIAGNOSTIC_LINE_CHAR_LIMIT)} [truncated ${omitted} chars]`;
17713
+ }
17714
+ function normalizePemMarkerLine(value) {
17715
+ return value.replace(ANSI_PATTERN, "").replace(CONTROL_PATTERN, "").trim();
17716
+ }
17717
+ function redactDiagnosticSecrets(value) {
17718
+ return SECRET_PATTERNS.reduce(
17719
+ (text, { label, pattern }) => text.replace(pattern, `[REDACTED:${label}]`),
17720
+ value
17721
+ );
17722
+ }
17723
+ function byteLength(value) {
17724
+ return Buffer.byteLength(value, "utf8");
17725
+ }
17638
17726
 
17639
17727
  // ../../packages/core-unified-agent/src/connection/AcpConnection.ts
17640
17728
  var AcpConnection = class extends BaseConnection {
@@ -17695,7 +17783,7 @@ var AcpConnection = class extends BaseConnection {
17695
17783
  await this.disconnect();
17696
17784
  } catch {
17697
17785
  }
17698
- throw error51;
17786
+ throw this.withStderrDiagnostics(error51, "ACP initialize");
17699
17787
  }
17700
17788
  }
17701
17789
  /**
@@ -17707,46 +17795,50 @@ var AcpConnection = class extends BaseConnection {
17707
17795
  * @returns 세션 정보
17708
17796
  */
17709
17797
  async createSession(workspace, sessionId, mcpServers, systemPrompt, strictMcp, effort) {
17710
- const agent = this.getAgent();
17711
- const servers = mcpServers ?? [];
17712
- let session;
17713
- if (sessionId) {
17714
- if (!agent.loadSession) {
17715
- throw new Error("\uC5F0\uACB0\uB41C \uC5D0\uC774\uC804\uD2B8\uAC00 session/load\uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");
17716
- }
17717
- const loadSessionParams = {
17718
- sessionId,
17719
- cwd: workspace,
17720
- mcpServers: servers
17721
- };
17722
- const meta3 = this.buildClaudeSessionMeta(systemPrompt, strictMcp, effort);
17723
- if (meta3) {
17724
- loadSessionParams._meta = meta3;
17798
+ try {
17799
+ const agent = this.getAgent();
17800
+ const servers = mcpServers ?? [];
17801
+ let session;
17802
+ if (sessionId) {
17803
+ if (!agent.loadSession) {
17804
+ throw new Error("\uC5F0\uACB0\uB41C \uC5D0\uC774\uC804\uD2B8\uAC00 session/load\uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");
17805
+ }
17806
+ const loadSessionParams = {
17807
+ sessionId,
17808
+ cwd: workspace,
17809
+ mcpServers: servers
17810
+ };
17811
+ const meta3 = this.buildClaudeSessionMeta(systemPrompt, strictMcp, effort);
17812
+ if (meta3) {
17813
+ loadSessionParams._meta = meta3;
17814
+ }
17815
+ const loadResult = await this.withFixedTimeout(
17816
+ agent.loadSession(loadSessionParams),
17817
+ this.initTimeout,
17818
+ "session/load"
17819
+ );
17820
+ session = { ...loadResult, sessionId };
17821
+ } else {
17822
+ const newSessionParams = {
17823
+ cwd: workspace,
17824
+ mcpServers: servers
17825
+ };
17826
+ const meta3 = this.buildClaudeSessionMeta(systemPrompt, strictMcp, effort);
17827
+ if (meta3) {
17828
+ newSessionParams._meta = meta3;
17829
+ }
17830
+ session = await this.withFixedTimeout(
17831
+ agent.newSession(newSessionParams),
17832
+ this.initTimeout,
17833
+ "session/new"
17834
+ );
17725
17835
  }
17726
- const loadResult = await this.withFixedTimeout(
17727
- agent.loadSession(loadSessionParams),
17728
- this.initTimeout,
17729
- "session/load"
17730
- );
17731
- session = { ...loadResult, sessionId };
17732
- } else {
17733
- const newSessionParams = {
17734
- cwd: workspace,
17735
- mcpServers: servers
17736
- };
17737
- const meta3 = this.buildClaudeSessionMeta(systemPrompt, strictMcp, effort);
17738
- if (meta3) {
17739
- newSessionParams._meta = meta3;
17740
- }
17741
- session = await this.withFixedTimeout(
17742
- agent.newSession(newSessionParams),
17743
- this.initTimeout,
17744
- "session/new"
17745
- );
17836
+ this.setState("ready");
17837
+ this.activeSessionId = session.sessionId;
17838
+ return session;
17839
+ } catch (error51) {
17840
+ throw this.withStderrDiagnostics(error51, sessionId ? "ACP session/load" : "ACP session/new");
17746
17841
  }
17747
- this.setState("ready");
17748
- this.activeSessionId = session.sessionId;
17749
- return session;
17750
17842
  }
17751
17843
  /**
17752
17844
  * ACP 연결을 시작합니다.
@@ -17789,14 +17881,18 @@ var AcpConnection = class extends BaseConnection {
17789
17881
  if (meta3) {
17790
17882
  loadSessionParams._meta = meta3;
17791
17883
  }
17792
- const result = await this.withFixedTimeout(
17793
- agent.loadSession(loadSessionParams),
17794
- this.requestTimeout,
17795
- "session/load"
17796
- );
17797
- this.activeSessionId = params.sessionId;
17798
- this.setState("ready");
17799
- return result;
17884
+ try {
17885
+ const result = await this.withFixedTimeout(
17886
+ agent.loadSession(loadSessionParams),
17887
+ this.requestTimeout,
17888
+ "session/load"
17889
+ );
17890
+ this.activeSessionId = params.sessionId;
17891
+ this.setState("ready");
17892
+ return result;
17893
+ } catch (error51) {
17894
+ throw this.withStderrDiagnostics(error51, "ACP session/load");
17895
+ }
17800
17896
  }
17801
17897
  /**
17802
17898
  * 현재 세션을 종료합니다 (프로세스는 유지).
@@ -25390,9 +25486,9 @@ function buildJobSummaryText(prefix, status, successCount, failureCount, error51
25390
25486
  var HEAD_BYTE_RATIO = 0.25;
25391
25487
  var MAX_TEXT_CHARS = 24e3;
25392
25488
  var MAX_RAW_OUTPUT_CHARS = 12e3;
25393
- var ANSI_PATTERN = /\x1b\[[0-?]*[ -/]*[@-~]/g;
25394
- var CONTROL_PATTERN = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
25395
- var SECRET_PATTERNS = [
25489
+ var ANSI_PATTERN2 = /\x1b\[[0-?]*[ -/]*[@-~]/g;
25490
+ var CONTROL_PATTERN2 = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
25491
+ var SECRET_PATTERNS2 = [
25396
25492
  { label: "aws_access_key", pattern: /AKIA[0-9A-Z]{16}/g },
25397
25493
  { label: "jwt", pattern: /eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g },
25398
25494
  { label: "github_token", pattern: /gh[psour]_[A-Za-z0-9]{36}/g },
@@ -25474,7 +25570,7 @@ function emptyGroupPlaceholderBlock(label, timestamp) {
25474
25570
  function applyByteCap(blocks, maxBytes, truncatedInLabel, enableSingleBlockCharSlice = false) {
25475
25571
  if (!maxBytes || maxBytes <= 0) return blocks;
25476
25572
  const full = blocks.map((block) => renderBlock(block)).join("\n\n").trimEnd();
25477
- if (byteLength(full) <= maxBytes) return blocks;
25573
+ if (byteLength2(full) <= maxBytes) return blocks;
25478
25574
  if (enableSingleBlockCharSlice) {
25479
25575
  const sliced = trySliceOversizedSingleOrHeaderPayload(blocks, maxBytes, truncatedInLabel);
25480
25576
  if (sliced) return sliced;
@@ -25513,7 +25609,7 @@ function trySliceOversizedSingleOrHeaderPayload(blocks, maxBytes, truncatedInLab
25513
25609
  if (blocks.length === 1) {
25514
25610
  const block = blocks[0];
25515
25611
  const rendered = renderBlock(block);
25516
- if (byteLength(rendered) <= maxBytes) return null;
25612
+ if (byteLength2(rendered) <= maxBytes) return null;
25517
25613
  return sliceSingleOversizedTextBlock(block, rendered, maxBytes, truncatedInLabel);
25518
25614
  }
25519
25615
  if (blocks.length === 2 && isSerializerGroupHeaderBlock(blocks[0]) && blocks[1]?.kind === "text") {
@@ -25522,12 +25618,12 @@ function trySliceOversizedSingleOrHeaderPayload(blocks, maxBytes, truncatedInLab
25522
25618
  const headerRendered = renderBlock(headerBlock);
25523
25619
  const bodyRendered = renderBlock(payloadBlock);
25524
25620
  const sep2 = "\n\n";
25525
- const prefixBytes = byteLength(headerRendered) + byteLength(sep2);
25621
+ const prefixBytes = byteLength2(headerRendered) + byteLength2(sep2);
25526
25622
  const innerBudget = maxBytes - prefixBytes;
25527
25623
  if (innerBudget <= 0) {
25528
25624
  return [headerBlock, buildCharTruncatedMarkerBlock(payloadBlock.timestamp, countCodepointsInUtf8Buffer(Buffer.from(bodyRendered, "utf8")), truncatedInLabel)];
25529
25625
  }
25530
- if (byteLength(bodyRendered) <= innerBudget) return null;
25626
+ if (byteLength2(bodyRendered) <= innerBudget) return null;
25531
25627
  const { head, marker, tail } = splitRenderedUtf8AtByteCap(bodyRendered, innerBudget, truncatedInLabel);
25532
25628
  return [
25533
25629
  headerBlock,
@@ -25563,7 +25659,7 @@ function splitRenderedUtf8AtByteCap(rendered, maxBytes, charLabel) {
25563
25659
  if (buf.length <= maxBytes) {
25564
25660
  return { head: rendered, marker: "", tail: "" };
25565
25661
  }
25566
- const sepLen = byteLength("\n\n");
25662
+ const sepLen = byteLength2("\n\n");
25567
25663
  let headBudget = Math.min(buf.length, Math.floor(maxBytes * HEAD_BYTE_RATIO));
25568
25664
  const tailBudget = Math.min(buf.length, Math.floor(maxBytes * (1 - HEAD_BYTE_RATIO)));
25569
25665
  for (let iter = 0; iter < 200; iter++) {
@@ -25580,7 +25676,7 @@ function splitRenderedUtf8AtByteCap(rendered, maxBytes, charLabel) {
25580
25676
  const marker2 = buildCharTruncatedMarker(omittedChars, charLabel);
25581
25677
  const headStr = buf.subarray(0, headLen2).toString("utf8");
25582
25678
  const tailStr = buf.subarray(tailStart2).toString("utf8");
25583
- const total = byteLength(headStr) + sepLen + byteLength(marker2) + sepLen + byteLength(tailStr);
25679
+ const total = byteLength2(headStr) + sepLen + byteLength2(marker2) + sepLen + byteLength2(tailStr);
25584
25680
  if (total <= maxBytes) {
25585
25681
  return { head: headStr, marker: marker2, tail: tailStr };
25586
25682
  }
@@ -25588,7 +25684,7 @@ function splitRenderedUtf8AtByteCap(rendered, maxBytes, charLabel) {
25588
25684
  if (headBudget === 0) break;
25589
25685
  }
25590
25686
  const marker = buildCharTruncatedMarker(Math.max(1, countCodepointsInUtf8Buffer(buf) - 1), charLabel);
25591
- const markerTotal = byteLength(marker) + 2 * sepLen;
25687
+ const markerTotal = byteLength2(marker) + 2 * sepLen;
25592
25688
  const room = Math.max(1, maxBytes - markerTotal);
25593
25689
  const tailBudgetFallback = Math.min(buf.length, Math.max(1, Math.floor(room * (1 - HEAD_BYTE_RATIO))));
25594
25690
  let tailStart = utf8SuffixStartIndex(buf, tailBudgetFallback);
@@ -25660,12 +25756,12 @@ function buildTruncatedMarker(blocks, omittedStart, omittedCount, truncatedInLab
25660
25756
  };
25661
25757
  }
25662
25758
  function serializedBlocksBytes(blocks) {
25663
- return byteLength(blocks.map((block) => renderBlock(block)).join("\n\n").trimEnd());
25759
+ return byteLength2(blocks.map((block) => renderBlock(block)).join("\n\n").trimEnd());
25664
25760
  }
25665
25761
  function serializedBlockBytes(block, includeSeparator) {
25666
- return byteLength(`${includeSeparator ? "\n\n" : ""}${renderBlock(block)}`);
25762
+ return byteLength2(`${includeSeparator ? "\n\n" : ""}${renderBlock(block)}`);
25667
25763
  }
25668
- function byteLength(value) {
25764
+ function byteLength2(value) {
25669
25765
  return Buffer.byteLength(value, "utf8");
25670
25766
  }
25671
25767
  function toArchiveBlock(kind, source, text, label, timestamp = Date.now()) {
@@ -25696,13 +25792,13 @@ function toToolCallArchiveBlock(source, title, status, rawOutput, toolCallId, la
25696
25792
  };
25697
25793
  }
25698
25794
  function sanitizeArchiveText(value, maxChars = MAX_TEXT_CHARS) {
25699
- const cleaned = value.replace(ANSI_PATTERN, "").replace(CONTROL_PATTERN, "");
25795
+ const cleaned = value.replace(ANSI_PATTERN2, "").replace(CONTROL_PATTERN2, "");
25700
25796
  if (cleaned.length <= maxChars) return cleaned;
25701
25797
  return `${cleaned.slice(0, maxChars)}
25702
25798
  [truncated ${cleaned.length - maxChars} chars]`;
25703
25799
  }
25704
25800
  function redactSecrets(value) {
25705
- return SECRET_PATTERNS.reduce(
25801
+ return SECRET_PATTERNS2.reduce(
25706
25802
  (text, { label, pattern }) => text.replace(pattern, `[REDACTED:${label}]`),
25707
25803
  value
25708
25804
  );
@@ -31351,6 +31447,9 @@ async function runCarrierJobInBackground(opts) {
31351
31447
  try {
31352
31448
  result = await runSingleCarrier(opts);
31353
31449
  finalStatus = result.status;
31450
+ if (finalStatus === "error") {
31451
+ finalError = result.error ?? result.responseText;
31452
+ }
31354
31453
  } catch (error51) {
31355
31454
  finalStatus = "error";
31356
31455
  finalError = error51 instanceof Error ? error51.message : String(error51);
@@ -36545,7 +36644,7 @@ function buildQueueIdHelp(prefix, availableIds) {
36545
36644
  }
36546
36645
 
36547
36646
  // ../../packages/fleet-wiki/src/safety.ts
36548
- var SECRET_PATTERNS2 = [
36647
+ var SECRET_PATTERNS3 = [
36549
36648
  /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/i,
36550
36649
  /\b(?:api[_-]?key|secret|password|token)\s*[:=]\s*["']?[a-z0-9_\-]{16,}/i,
36551
36650
  /\bghp_[a-z0-9_]{20,}\b/i,
@@ -36558,7 +36657,7 @@ var PROMPT_INJECTION_PATTERNS = [
36558
36657
  ];
36559
36658
  function findUnsafeMemoryText(content) {
36560
36659
  const issues = [];
36561
- if (SECRET_PATTERNS2.some((pattern) => pattern.test(content))) {
36660
+ if (SECRET_PATTERNS3.some((pattern) => pattern.test(content))) {
36562
36661
  issues.push({
36563
36662
  code: "unsafe_secret",
36564
36663
  severity: "error",
@@ -40570,9 +40669,8 @@ function execFileVersion(bin, args) {
40570
40669
 
40571
40670
  // ../fleet-plugins/terminal/server/agent-api/agent-cli-launch-kinds.ts
40572
40671
  var UNSUPPORTED_AGENT_CLI_IDS = /* @__PURE__ */ new Set(["claude-kimi", "claude-glm"]);
40573
- var UNSUPPORTED_AGENT_CLI_DISABLED_REASON = "Not supported";
40574
40672
  function buildAgentCliLaunchKinds(metadata, operationType) {
40575
- return metadata.map((cli) => {
40673
+ return metadata.filter((cli) => !UNSUPPORTED_AGENT_CLI_IDS.has(cli.id)).map((cli) => {
40576
40674
  const disabledReason = resolveDisabledReason(cli);
40577
40675
  return {
40578
40676
  id: cli.id,
@@ -40583,7 +40681,6 @@ function buildAgentCliLaunchKinds(metadata, operationType) {
40583
40681
  });
40584
40682
  }
40585
40683
  function resolveDisabledReason(cli) {
40586
- if (UNSUPPORTED_AGENT_CLI_IDS.has(cli.id)) return UNSUPPORTED_AGENT_CLI_DISABLED_REASON;
40587
40684
  if (!cli.available) return "Not installed";
40588
40685
  if (!cli.signedIn) return "Sign in required";
40589
40686
  return void 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotobokuri/fleet-console",
3
- "version": "1.16.1",
3
+ "version": "1.17.1",
4
4
  "description": "Fleet Console - standalone web surface for observing Fleet CLI workspaces, carrier jobs, live output streams, and terminals.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./mermaid.core-mTVIRAe-.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-WM3UvlRe.js";import{_ as i}from"./mermaid.core-mTVIRAe-.js";import"./chunk-FMBD7UC4-saa1UCmo.js";import"./chunk-YZCP3GAM-BpsFNlbM.js";import"./chunk-55IACEB6-D9kCAM0-.js";import"./chunk-EDXVE4YY-CHGSf6YA.js";import"./index-D3a51i1X.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-WM3UvlRe.js";import{_ as i}from"./mermaid.core-mTVIRAe-.js";import"./chunk-FMBD7UC4-saa1UCmo.js";import"./chunk-YZCP3GAM-BpsFNlbM.js";import"./chunk-55IACEB6-D9kCAM0-.js";import"./chunk-EDXVE4YY-CHGSf6YA.js";import"./index-D3a51i1X.js";var n={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./graph-BSP3V12O.js";var e=4;function a(o){return r(o,e)}export{a as c};