@langgraph-js/ui 5.3.0 → 5.5.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 (97) hide show
  1. package/dist/assets/{arc-ByBJT7ix.js → arc-DEKXWMgk.js} +1 -1
  2. package/dist/assets/architectureDiagram-VXUJARFQ-CCAnjRBf.js +36 -0
  3. package/dist/assets/blockDiagram-VD42YOAC-C45FMpSa.js +122 -0
  4. package/dist/assets/c4Diagram-YG6GDRKO-b2FfGD5V.js +10 -0
  5. package/dist/assets/channel-BnP1OHPk.js +1 -0
  6. package/dist/assets/chunk-4BX2VUAB-DZUxlygh.js +1 -0
  7. package/dist/assets/{chunk-55IACEB6-B-dnHx34.js → chunk-55IACEB6-D99w6_wJ.js} +1 -1
  8. package/dist/assets/{chunk-B4BG7PRW-Bd_EmK5n.js → chunk-B4BG7PRW-CINymWls.js} +6 -6
  9. package/dist/assets/chunk-DI55MBZ5-KXNsA5jH.js +220 -0
  10. package/dist/assets/{chunk-FMBD7UC4-Benh4DyV.js → chunk-FMBD7UC4-Ze5lcP7r.js} +1 -1
  11. package/dist/assets/chunk-QN33PNHL-D6csHY9f.js +1 -0
  12. package/dist/assets/{chunk-QZHKN3VN-pD5jwMeq.js → chunk-QZHKN3VN-CQij6uxD.js} +1 -1
  13. package/dist/assets/{chunk-TZMSLE5B-iXGBDV4R.js → chunk-TZMSLE5B-DHgJ2PzL.js} +1 -1
  14. package/dist/assets/classDiagram-2ON5EDUG-BhnxhKIx.js +1 -0
  15. package/dist/assets/classDiagram-v2-WZHVMYZB-BhnxhKIx.js +1 -0
  16. package/dist/assets/clone-CzxHCvWS.js +1 -0
  17. package/dist/assets/cose-bilkent-S5V4N54A-7XsZDF0x.js +1 -0
  18. package/dist/assets/cytoscape.esm-CyJtwmzi.js +331 -0
  19. package/dist/assets/dagre-6UL2VRFP-B7vIHoek.js +4 -0
  20. package/dist/assets/diagram-PSM6KHXK-Dwk0-3lg.js +24 -0
  21. package/dist/assets/diagram-QEK2KX5R-yRItHVGO.js +43 -0
  22. package/dist/assets/diagram-S2PKOQOG-Gl24csy5.js +24 -0
  23. package/dist/assets/{erDiagram-Q2GNP2WA-Cw-3m3iQ.js → erDiagram-Q2GNP2WA-DaoUsHC-.js} +4 -4
  24. package/dist/assets/flowDiagram-NV44I4VS-BvxRwSdK.js +162 -0
  25. package/dist/assets/{ganttDiagram-LVOFAZNH-HFaJpoPe.js → ganttDiagram-LVOFAZNH-DiyXT1u-.js} +1 -1
  26. package/dist/assets/gitGraphDiagram-NY62KEGX-C7GPXV9B.js +65 -0
  27. package/dist/assets/{graph-VOODAD3y.js → graph-BJHoUus9.js} +1 -1
  28. package/dist/assets/index-Cigf7okT.js +1 -0
  29. package/dist/assets/{index-BDnjyX2X.js → index-Cx_WzRmY.js} +410 -119
  30. package/dist/assets/index-z3jA17TL.css +1 -0
  31. package/dist/assets/{infoDiagram-F6ZHWCRC-BhGv_djV.js → infoDiagram-F6ZHWCRC-BPazewwG.js} +1 -1
  32. package/dist/assets/{isUndefined-0vq8NMH-.js → isUndefined-swG3RKv4.js} +1 -1
  33. package/dist/assets/{journeyDiagram-XKPGCS4Q-DyCiaoHe.js → journeyDiagram-XKPGCS4Q-7TQoyFvV.js} +1 -1
  34. package/dist/assets/kanban-definition-3W4ZIXB7-BPW9De0Q.js +89 -0
  35. package/dist/assets/{layout-0ID9q93j.js → layout-DPDnEj2p.js} +1 -1
  36. package/dist/assets/{linear-BuZdgMYG.js → linear-CnAIHHRL.js} +1 -1
  37. package/dist/assets/mermaid.core-Bt6sloa1.js +197 -0
  38. package/dist/assets/{min-piR6L-qa.js → min-DqUZylJ8.js} +1 -1
  39. package/dist/assets/mindmap-definition-VGOIOE7T-C-tiffs0.js +68 -0
  40. package/dist/assets/pieDiagram-ADFJNKIX-0IbvYAbJ.js +30 -0
  41. package/dist/assets/quadrantDiagram-AYHSOK5B-B76yzm9c.js +7 -0
  42. package/dist/assets/{requirementDiagram-UZGBJVZJ-DenFzO4x.js → requirementDiagram-UZGBJVZJ-CAEEUTLr.js} +7 -7
  43. package/dist/assets/{sankeyDiagram-TZEHDZUN-Cf4npYbH.js → sankeyDiagram-TZEHDZUN-DtnGWiEx.js} +7 -7
  44. package/dist/assets/{sequenceDiagram-WL72ISMW-D0B0sUMP.js → sequenceDiagram-WL72ISMW-Cu9Iphhk.js} +16 -16
  45. package/dist/assets/{stateDiagram-FKZM4ZOC-DCkjEhse.js → stateDiagram-FKZM4ZOC-DMmqlSc3.js} +1 -1
  46. package/dist/assets/stateDiagram-v2-4FDKWEC3-C8PNiXpd.js +1 -0
  47. package/dist/assets/timeline-definition-IT6M3QCI-Z39dMt9m.js +61 -0
  48. package/dist/assets/treemap-KMMF4GRG-DMhNl-LE.js +128 -0
  49. package/dist/assets/{xychartDiagram-PRI3JC2R-BfqhPDDy.js → xychartDiagram-PRI3JC2R-3RFvJwDL.js} +1 -1
  50. package/dist/index.html +3 -3
  51. package/index.html +1 -1
  52. package/package.json +14 -8
  53. package/server/graph/debugAgent.ts +42 -0
  54. package/server/index.ts +6 -1
  55. package/src/chat/Chat.tsx +21 -17
  56. package/src/chat/components/MessageAI.tsx +3 -1
  57. package/src/chat/components/MessageTool.tsx +59 -13
  58. package/src/chat/components/Reasoning.tsx +21 -0
  59. package/src/chat/components/UsageMetadata.tsx +2 -2
  60. package/src/components/ai-elements/chain-of-thought.tsx +228 -0
  61. package/src/components/ui/badge.tsx +46 -0
  62. package/src/components/ui/collapsible.tsx +31 -0
  63. package/src/debugPanel/Context.tsx +45 -0
  64. package/src/debugPanel/DebugPanel.tsx +237 -0
  65. package/src/debugPanel/index.ts +1 -0
  66. package/src/index.ts +1 -0
  67. package/src/monitor/index.tsx +1 -4
  68. package/test/App.tsx +8 -2
  69. package/tsconfig.json +1 -1
  70. package/dist/assets/architectureDiagram-VXUJARFQ-TBGn1Rfl.js +0 -36
  71. package/dist/assets/blockDiagram-VD42YOAC-H3aCjd8C.js +0 -122
  72. package/dist/assets/c4Diagram-YG6GDRKO-mLv4gXzg.js +0 -10
  73. package/dist/assets/channel-C2ZY7jsG.js +0 -1
  74. package/dist/assets/chunk-4BX2VUAB-q_t8Wicw.js +0 -1
  75. package/dist/assets/chunk-DI55MBZ5-BC-nx3CQ.js +0 -220
  76. package/dist/assets/chunk-QN33PNHL-evxJkdkh.js +0 -1
  77. package/dist/assets/classDiagram-2ON5EDUG-zN_blmEE.js +0 -1
  78. package/dist/assets/classDiagram-v2-WZHVMYZB-zN_blmEE.js +0 -1
  79. package/dist/assets/clone-DvlZSVEg.js +0 -1
  80. package/dist/assets/cose-bilkent-S5V4N54A-CpE55JUO.js +0 -1
  81. package/dist/assets/cytoscape.esm-TTflUzRS.js +0 -321
  82. package/dist/assets/dagre-6UL2VRFP-EvO-OLhz.js +0 -4
  83. package/dist/assets/diagram-PSM6KHXK-CFY939Qh.js +0 -24
  84. package/dist/assets/diagram-QEK2KX5R-C9Zr7m8k.js +0 -43
  85. package/dist/assets/diagram-S2PKOQOG-DNcS9v33.js +0 -24
  86. package/dist/assets/flowDiagram-NV44I4VS-CLWeIeeE.js +0 -162
  87. package/dist/assets/gitGraphDiagram-NY62KEGX-CCUv-KE0.js +0 -65
  88. package/dist/assets/index-BJ9C6D-a.js +0 -1
  89. package/dist/assets/index-DkUikjP8.css +0 -1
  90. package/dist/assets/kanban-definition-3W4ZIXB7-DSRBn_Rk.js +0 -89
  91. package/dist/assets/mermaid.core-B8WZioq4.js +0 -191
  92. package/dist/assets/mindmap-definition-VGOIOE7T-CZb-iOUH.js +0 -68
  93. package/dist/assets/pieDiagram-ADFJNKIX-Dzw0oI4o.js +0 -30
  94. package/dist/assets/quadrantDiagram-AYHSOK5B-C73fqE74.js +0 -7
  95. package/dist/assets/stateDiagram-v2-4FDKWEC3-BO7ffAwx.js +0 -1
  96. package/dist/assets/timeline-definition-IT6M3QCI-wtq4Ovqb.js +0 -61
  97. package/dist/assets/treemap-KMMF4GRG-HbrSuDxx.js +0 -128
@@ -1,4 +1,4 @@
1
- import{_ as a,s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,l as Nt,I as mi,d as yi,y as bi,F as St,E as Yt,G as Ai,a0 as wi,h as Ci,az as Si,a8 as Wt}from"./mermaid.core-B8WZioq4.js";import"./index-BDnjyX2X.js";import{i as _i}from"./init-Gi6I4Gst.js";import{o as ki}from"./ordinal-Cboi1Yqb.js";import{l as zt}from"./linear-BuZdgMYG.js";import"./defaultLocale-C4B-KCzX.js";function Ri(e,t,i){e=+e,t=+t,i=(n=arguments.length)<2?(t=e,e=0,1):n<3?1:+i;for(var s=-1,n=Math.max(0,Math.ceil((t-e)/i))|0,o=new Array(n);++s<n;)o[s]=e+s*i;return o}function yt(){var e=ki().unknown(void 0),t=e.domain,i=e.range,s=0,n=1,o,g,m=!1,p=0,k=0,v=.5;delete e.unknown;function C(){var b=t().length,E=n<s,D=E?n:s,P=E?s:n;o=(P-D)/Math.max(1,b-p+k*2),m&&(o=Math.floor(o)),D+=(P-D-o*(b-p))*v,g=o*(1-p),m&&(D=Math.round(D),g=Math.round(g));var I=Ri(b).map(function(y){return D+o*y});return i(E?I.reverse():I)}return e.domain=function(b){return arguments.length?(t(b),C()):t()},e.range=function(b){return arguments.length?([s,n]=b,s=+s,n=+n,C()):[s,n]},e.rangeRound=function(b){return[s,n]=b,s=+s,n=+n,m=!0,C()},e.bandwidth=function(){return g},e.step=function(){return o},e.round=function(b){return arguments.length?(m=!!b,C()):m},e.padding=function(b){return arguments.length?(p=Math.min(1,k=+b),C()):p},e.paddingInner=function(b){return arguments.length?(p=Math.min(1,b),C()):p},e.paddingOuter=function(b){return arguments.length?(k=+b,C()):k},e.align=function(b){return arguments.length?(v=Math.max(0,Math.min(1,b)),C()):v},e.copy=function(){return yt(t(),[s,n]).round(m).paddingInner(p).paddingOuter(k).align(v)},_i.apply(C(),arguments)}var bt=function(){var e=a(function(F,h,u,x){for(u=u||{},x=F.length;x--;u[F[x]]=h);return u},"o"),t=[1,10,12,14,16,18,19,21,23],i=[2,6],s=[1,3],n=[1,5],o=[1,6],g=[1,7],m=[1,5,10,12,14,16,18,19,21,23,34,35,36],p=[1,25],k=[1,26],v=[1,28],C=[1,29],b=[1,30],E=[1,31],D=[1,32],P=[1,33],I=[1,34],y=[1,35],_=[1,36],c=[1,37],W=[1,43],z=[1,42],U=[1,47],X=[1,50],l=[1,10,12,14,16,18,19,21,23,34,35,36],L=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],S=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],R=[1,64],$={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(h,u,x,d,w,r,at){var f=r.length-1;switch(w){case 5:d.setOrientation(r[f]);break;case 9:d.setDiagramTitle(r[f].text.trim());break;case 12:d.setLineData({text:"",type:"text"},r[f]);break;case 13:d.setLineData(r[f-1],r[f]);break;case 14:d.setBarData({text:"",type:"text"},r[f]);break;case 15:d.setBarData(r[f-1],r[f]);break;case 16:this.$=r[f].trim(),d.setAccTitle(this.$);break;case 17:case 18:this.$=r[f].trim(),d.setAccDescription(this.$);break;case 19:this.$=r[f-1];break;case 20:this.$=[Number(r[f-2]),...r[f]];break;case 21:this.$=[Number(r[f])];break;case 22:d.setXAxisTitle(r[f]);break;case 23:d.setXAxisTitle(r[f-1]);break;case 24:d.setXAxisTitle({type:"text",text:""});break;case 25:d.setXAxisBand(r[f]);break;case 26:d.setXAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 27:this.$=r[f-1];break;case 28:this.$=[r[f-2],...r[f]];break;case 29:this.$=[r[f]];break;case 30:d.setYAxisTitle(r[f]);break;case 31:d.setYAxisTitle(r[f-1]);break;case 32:d.setYAxisTitle({type:"text",text:""});break;case 33:d.setYAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 37:this.$={text:r[f],type:"text"};break;case 38:this.$={text:r[f],type:"text"};break;case 39:this.$={text:r[f],type:"markdown"};break;case 40:this.$=r[f];break;case 41:this.$=r[f-1]+""+r[f];break}},"anonymous"),table:[e(t,i,{3:1,4:2,7:4,5:s,34:n,35:o,36:g}),{1:[3]},e(t,i,{4:2,7:4,3:8,5:s,34:n,35:o,36:g}),e(t,i,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:o,36:g}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},e(m,[2,34]),e(m,[2,35]),e(m,[2,36]),{1:[2,1]},e(t,i,{4:2,7:4,3:21,5:s,34:n,35:o,36:g}),{1:[2,3]},e(m,[2,5]),e(t,[2,7],{4:22,34:n,35:o,36:g}),{11:23,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:39,13:38,24:W,27:z,29:40,30:41,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:45,15:44,27:U,33:46,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:49,17:48,24:X,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:52,17:51,24:X,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{20:[1,53]},{22:[1,54]},e(l,[2,18]),{1:[2,2]},e(l,[2,8]),e(l,[2,9]),e(L,[2,37],{40:55,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c}),e(L,[2,38]),e(L,[2,39]),e(S,[2,40]),e(S,[2,42]),e(S,[2,43]),e(S,[2,44]),e(S,[2,45]),e(S,[2,46]),e(S,[2,47]),e(S,[2,48]),e(S,[2,49]),e(S,[2,50]),e(S,[2,51]),e(l,[2,10]),e(l,[2,22],{30:41,29:56,24:W,27:z}),e(l,[2,24]),e(l,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},e(l,[2,11]),e(l,[2,30],{33:60,27:U}),e(l,[2,32]),{31:[1,61]},e(l,[2,12]),{17:62,24:X},{25:63,27:R},e(l,[2,14]),{17:65,24:X},e(l,[2,16]),e(l,[2,17]),e(S,[2,41]),e(l,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},e(l,[2,31]),{27:[1,69]},e(l,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},e(l,[2,15]),e(l,[2,26]),e(l,[2,27]),{11:59,32:72,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},e(l,[2,33]),e(l,[2,19]),{25:73,27:R},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(h,u){if(u.recoverable)this.trace(h);else{var x=new Error(h);throw x.hash=u,x}},"parseError"),parse:a(function(h){var u=this,x=[0],d=[],w=[null],r=[],at=this.table,f="",lt=0,It=0,hi=2,Mt=1,li=r.slice.call(arguments,1),T=Object.create(this.lexer),Y={yy:{}};for(var dt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,dt)&&(Y.yy[dt]=this.yy[dt]);T.setInput(h,Y.yy),Y.yy.lexer=T,Y.yy.parser=this,typeof T.yylloc>"u"&&(T.yylloc={});var ft=T.yylloc;r.push(ft);var ci=T.options&&T.options.ranges;typeof Y.yy.parseError=="function"?this.parseError=Y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ui(V){x.length=x.length-2*V,w.length=w.length-V,r.length=r.length-V}a(ui,"popStack");function Vt(){var V;return V=d.pop()||T.lex()||Mt,typeof V!="number"&&(V instanceof Array&&(d=V,V=d.pop()),V=u.symbols_[V]||V),V}a(Vt,"lex");for(var M,H,B,pt,q={},ct,O,Bt,ut;;){if(H=x[x.length-1],this.defaultActions[H]?B=this.defaultActions[H]:((M===null||typeof M>"u")&&(M=Vt()),B=at[H]&&at[H][M]),typeof B>"u"||!B.length||!B[0]){var mt="";ut=[];for(ct in at[H])this.terminals_[ct]&&ct>hi&&ut.push("'"+this.terminals_[ct]+"'");T.showPosition?mt="Parse error on line "+(lt+1)+`:
1
+ import{_ as a,s as gi,g as xi,q as Xt,p as di,a as fi,b as pi,l as Nt,I as mi,d as yi,y as bi,F as St,E as Yt,G as Ai,a0 as wi,h as Ci,az as Si,a8 as Wt}from"./mermaid.core-Bt6sloa1.js";import"./index-Cx_WzRmY.js";import{i as _i}from"./init-Gi6I4Gst.js";import{o as ki}from"./ordinal-Cboi1Yqb.js";import{l as zt}from"./linear-CnAIHHRL.js";import"./defaultLocale-C4B-KCzX.js";function Ri(e,t,i){e=+e,t=+t,i=(n=arguments.length)<2?(t=e,e=0,1):n<3?1:+i;for(var s=-1,n=Math.max(0,Math.ceil((t-e)/i))|0,o=new Array(n);++s<n;)o[s]=e+s*i;return o}function yt(){var e=ki().unknown(void 0),t=e.domain,i=e.range,s=0,n=1,o,g,m=!1,p=0,k=0,v=.5;delete e.unknown;function C(){var b=t().length,E=n<s,D=E?n:s,P=E?s:n;o=(P-D)/Math.max(1,b-p+k*2),m&&(o=Math.floor(o)),D+=(P-D-o*(b-p))*v,g=o*(1-p),m&&(D=Math.round(D),g=Math.round(g));var I=Ri(b).map(function(y){return D+o*y});return i(E?I.reverse():I)}return e.domain=function(b){return arguments.length?(t(b),C()):t()},e.range=function(b){return arguments.length?([s,n]=b,s=+s,n=+n,C()):[s,n]},e.rangeRound=function(b){return[s,n]=b,s=+s,n=+n,m=!0,C()},e.bandwidth=function(){return g},e.step=function(){return o},e.round=function(b){return arguments.length?(m=!!b,C()):m},e.padding=function(b){return arguments.length?(p=Math.min(1,k=+b),C()):p},e.paddingInner=function(b){return arguments.length?(p=Math.min(1,b),C()):p},e.paddingOuter=function(b){return arguments.length?(k=+b,C()):k},e.align=function(b){return arguments.length?(v=Math.max(0,Math.min(1,b)),C()):v},e.copy=function(){return yt(t(),[s,n]).round(m).paddingInner(p).paddingOuter(k).align(v)},_i.apply(C(),arguments)}var bt=function(){var e=a(function(F,h,u,x){for(u=u||{},x=F.length;x--;u[F[x]]=h);return u},"o"),t=[1,10,12,14,16,18,19,21,23],i=[2,6],s=[1,3],n=[1,5],o=[1,6],g=[1,7],m=[1,5,10,12,14,16,18,19,21,23,34,35,36],p=[1,25],k=[1,26],v=[1,28],C=[1,29],b=[1,30],E=[1,31],D=[1,32],P=[1,33],I=[1,34],y=[1,35],_=[1,36],c=[1,37],W=[1,43],z=[1,42],U=[1,47],X=[1,50],l=[1,10,12,14,16,18,19,21,23,34,35,36],L=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],S=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],R=[1,64],$={trace:a(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:a(function(h,u,x,d,w,r,at){var f=r.length-1;switch(w){case 5:d.setOrientation(r[f]);break;case 9:d.setDiagramTitle(r[f].text.trim());break;case 12:d.setLineData({text:"",type:"text"},r[f]);break;case 13:d.setLineData(r[f-1],r[f]);break;case 14:d.setBarData({text:"",type:"text"},r[f]);break;case 15:d.setBarData(r[f-1],r[f]);break;case 16:this.$=r[f].trim(),d.setAccTitle(this.$);break;case 17:case 18:this.$=r[f].trim(),d.setAccDescription(this.$);break;case 19:this.$=r[f-1];break;case 20:this.$=[Number(r[f-2]),...r[f]];break;case 21:this.$=[Number(r[f])];break;case 22:d.setXAxisTitle(r[f]);break;case 23:d.setXAxisTitle(r[f-1]);break;case 24:d.setXAxisTitle({type:"text",text:""});break;case 25:d.setXAxisBand(r[f]);break;case 26:d.setXAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 27:this.$=r[f-1];break;case 28:this.$=[r[f-2],...r[f]];break;case 29:this.$=[r[f]];break;case 30:d.setYAxisTitle(r[f]);break;case 31:d.setYAxisTitle(r[f-1]);break;case 32:d.setYAxisTitle({type:"text",text:""});break;case 33:d.setYAxisRangeData(Number(r[f-2]),Number(r[f]));break;case 37:this.$={text:r[f],type:"text"};break;case 38:this.$={text:r[f],type:"text"};break;case 39:this.$={text:r[f],type:"markdown"};break;case 40:this.$=r[f];break;case 41:this.$=r[f-1]+""+r[f];break}},"anonymous"),table:[e(t,i,{3:1,4:2,7:4,5:s,34:n,35:o,36:g}),{1:[3]},e(t,i,{4:2,7:4,3:8,5:s,34:n,35:o,36:g}),e(t,i,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:o,36:g}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},e(m,[2,34]),e(m,[2,35]),e(m,[2,36]),{1:[2,1]},e(t,i,{4:2,7:4,3:21,5:s,34:n,35:o,36:g}),{1:[2,3]},e(m,[2,5]),e(t,[2,7],{4:22,34:n,35:o,36:g}),{11:23,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:39,13:38,24:W,27:z,29:40,30:41,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:45,15:44,27:U,33:46,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:49,17:48,24:X,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{11:52,17:51,24:X,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},{20:[1,53]},{22:[1,54]},e(l,[2,18]),{1:[2,2]},e(l,[2,8]),e(l,[2,9]),e(L,[2,37],{40:55,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c}),e(L,[2,38]),e(L,[2,39]),e(S,[2,40]),e(S,[2,42]),e(S,[2,43]),e(S,[2,44]),e(S,[2,45]),e(S,[2,46]),e(S,[2,47]),e(S,[2,48]),e(S,[2,49]),e(S,[2,50]),e(S,[2,51]),e(l,[2,10]),e(l,[2,22],{30:41,29:56,24:W,27:z}),e(l,[2,24]),e(l,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},e(l,[2,11]),e(l,[2,30],{33:60,27:U}),e(l,[2,32]),{31:[1,61]},e(l,[2,12]),{17:62,24:X},{25:63,27:R},e(l,[2,14]),{17:65,24:X},e(l,[2,16]),e(l,[2,17]),e(S,[2,41]),e(l,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},e(l,[2,31]),{27:[1,69]},e(l,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},e(l,[2,15]),e(l,[2,26]),e(l,[2,27]),{11:59,32:72,37:24,38:p,39:k,40:27,41:v,42:C,43:b,44:E,45:D,46:P,47:I,48:y,49:_,50:c},e(l,[2,33]),e(l,[2,19]),{25:73,27:R},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:a(function(h,u){if(u.recoverable)this.trace(h);else{var x=new Error(h);throw x.hash=u,x}},"parseError"),parse:a(function(h){var u=this,x=[0],d=[],w=[null],r=[],at=this.table,f="",lt=0,It=0,hi=2,Mt=1,li=r.slice.call(arguments,1),T=Object.create(this.lexer),Y={yy:{}};for(var dt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,dt)&&(Y.yy[dt]=this.yy[dt]);T.setInput(h,Y.yy),Y.yy.lexer=T,Y.yy.parser=this,typeof T.yylloc>"u"&&(T.yylloc={});var ft=T.yylloc;r.push(ft);var ci=T.options&&T.options.ranges;typeof Y.yy.parseError=="function"?this.parseError=Y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ui(V){x.length=x.length-2*V,w.length=w.length-V,r.length=r.length-V}a(ui,"popStack");function Vt(){var V;return V=d.pop()||T.lex()||Mt,typeof V!="number"&&(V instanceof Array&&(d=V,V=d.pop()),V=u.symbols_[V]||V),V}a(Vt,"lex");for(var M,H,B,pt,q={},ct,O,Bt,ut;;){if(H=x[x.length-1],this.defaultActions[H]?B=this.defaultActions[H]:((M===null||typeof M>"u")&&(M=Vt()),B=at[H]&&at[H][M]),typeof B>"u"||!B.length||!B[0]){var mt="";ut=[];for(ct in at[H])this.terminals_[ct]&&ct>hi&&ut.push("'"+this.terminals_[ct]+"'");T.showPosition?mt="Parse error on line "+(lt+1)+`:
2
2
  `+T.showPosition()+`
3
3
  Expecting `+ut.join(", ")+", got '"+(this.terminals_[M]||M)+"'":mt="Parse error on line "+(lt+1)+": Unexpected "+(M==Mt?"end of input":"'"+(this.terminals_[M]||M)+"'"),this.parseError(mt,{text:T.match,token:this.terminals_[M]||M,line:T.yylineno,loc:ft,expected:ut})}if(B[0]instanceof Array&&B.length>1)throw new Error("Parse Error: multiple actions possible at state: "+H+", token: "+M);switch(B[0]){case 1:x.push(M),w.push(T.yytext),r.push(T.yylloc),x.push(B[1]),M=null,It=T.yyleng,f=T.yytext,lt=T.yylineno,ft=T.yylloc;break;case 2:if(O=this.productions_[B[1]][1],q.$=w[w.length-O],q._$={first_line:r[r.length-(O||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(O||1)].first_column,last_column:r[r.length-1].last_column},ci&&(q._$.range=[r[r.length-(O||1)].range[0],r[r.length-1].range[1]]),pt=this.performAction.apply(q,[f,It,lt,Y.yy,B[1],w,r].concat(li)),typeof pt<"u")return pt;O&&(x=x.slice(0,-1*O*2),w=w.slice(0,-1*O),r=r.slice(0,-1*O)),x.push(this.productions_[B[1]][0]),w.push(q.$),r.push(q._$),Bt=at[x[x.length-2]][x[x.length-1]],x.push(Bt);break;case 3:return!0}}return!0},"parse")},Et=function(){var F={EOF:1,parseError:a(function(u,x){if(this.yy.parser)this.yy.parser.parseError(u,x);else throw new Error(u)},"parseError"),setInput:a(function(h,u){return this.yy=u||this.yy||{},this._input=h,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:a(function(){var h=this._input[0];this.yytext+=h,this.yyleng++,this.offset++,this.match+=h,this.matched+=h;var u=h.match(/(?:\r\n?|\n).*/g);return u?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),h},"input"),unput:a(function(h){var u=h.length,x=h.split(/(?:\r\n?|\n)/g);this._input=h+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-u),this.offset-=u;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),x.length-1&&(this.yylineno-=x.length-1);var w=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:x?(x.length===d.length?this.yylloc.first_column:0)+d[d.length-x.length].length-x[0].length:this.yylloc.first_column-u},this.options.ranges&&(this.yylloc.range=[w[0],w[0]+this.yyleng-u]),this.yyleng=this.yytext.length,this},"unput"),more:a(function(){return this._more=!0,this},"more"),reject:a(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).
4
4
  `+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:a(function(h){this.unput(this.match.slice(h))},"less"),pastInput:a(function(){var h=this.matched.substr(0,this.matched.length-this.match.length);return(h.length>20?"...":"")+h.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:a(function(){var h=this.match;return h.length<20&&(h+=this._input.substr(0,20-h.length)),(h.substr(0,20)+(h.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:a(function(){var h=this.pastInput(),u=new Array(h.length+1).join("-");return h+this.upcomingInput()+`
package/dist/index.html CHANGED
@@ -12,10 +12,10 @@
12
12
  padding: 0;
13
13
  }
14
14
  </style>
15
- <script type="module" crossorigin src="/assets/index-BDnjyX2X.js"></script>
16
- <link rel="stylesheet" crossorigin href="/assets/index-DkUikjP8.css">
15
+ <script type="module" crossorigin src="/assets/index-Cx_WzRmY.js"></script>
16
+ <link rel="stylesheet" crossorigin href="/assets/index-z3jA17TL.css">
17
17
  </head>
18
18
  <body>
19
- <div id="root" class="h-screen w-screen"></div>
19
+ <div id="root" class="h-screen w-screen flex"></div>
20
20
  </body>
21
21
  </html>
package/index.html CHANGED
@@ -14,7 +14,7 @@
14
14
  </style>
15
15
  </head>
16
16
  <body>
17
- <div id="root" class="h-screen w-screen"></div>
17
+ <div id="root" class="h-screen w-screen flex"></div>
18
18
  <script type="module" src="./test/main.tsx"></script>
19
19
  </body>
20
20
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langgraph-js/ui",
3
- "version": "5.3.0",
3
+ "version": "5.5.0",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -12,17 +12,23 @@
12
12
  "main": "./dist/react/src/index.js",
13
13
  "type": "module",
14
14
  "dependencies": {
15
+ "@langchain/core": "^1.0.2",
16
+ "@langchain/langgraph": "^1.0.2",
17
+ "@langchain/openai": "^1.0.0",
15
18
  "@langgraph-js/open-smith": "^2.3.0",
19
+ "@langgraph-js/pro": "^2.0.1",
20
+ "@langgraph-js/pure-graph": "^2.5.1",
21
+ "@radix-ui/react-collapsible": "^1.1.12",
22
+ "@radix-ui/react-use-controllable-state": "^1.2.2",
16
23
  "@tailwindcss/vite": "^4.1.14",
17
24
  "@vitejs/plugin-basic-ssl": "^2.1.0",
18
- "@vitejs/plugin-react": "^5.0.4",
25
+ "@vitejs/plugin-react": "^5.1.1",
19
26
  "ai-artifacts": "^1.3.1",
27
+ "hono": "^4.10.4",
28
+ "langchain": "^1.1.1",
20
29
  "next-themes": "^0.4.6",
21
30
  "sonner": "^2.0.7",
22
- "@langchain/core": "^1.0.2",
23
- "@langchain/openai": "^1.0.0",
24
- "hono": "^4.10.4",
25
- "vite": "^7"
31
+ "vite": "^6"
26
32
  },
27
33
  "devDependencies": {
28
34
  "@andypf/json-viewer": "^2.2.0",
@@ -46,7 +52,7 @@
46
52
  "minisearch": "^7.1.2",
47
53
  "motion": "^12.16.0",
48
54
  "nanostores": "^1.0.1",
49
- "react": "^19",
55
+ "react": "^19.2.0",
50
56
  "react-dom": "^19.2.0",
51
57
  "react-syntax-highlighter": "^15.6.6",
52
58
  "streamdown": "^1.4.0",
@@ -54,7 +60,7 @@
54
60
  "tailwindcss": "^4.1.14",
55
61
  "tw-animate-css": "^1.4.0",
56
62
  "zod": "^4",
57
- "@langgraph-js/sdk": "3.6.0"
63
+ "@langgraph-js/sdk": "3.7.0"
58
64
  },
59
65
  "scripts": {
60
66
  "dev": "vite",
@@ -0,0 +1,42 @@
1
+ import { entrypoint } from "@langchain/langgraph";
2
+ import { z } from "zod";
3
+ import { createEntrypointGraph } from "@langgraph-js/pure-graph";
4
+ import { ChatOpenAI } from "@langchain/openai";
5
+ import { createAgent, humanInTheLoopMiddleware } from "langchain";
6
+ import { AgentState } from "@langgraph-js/pro";
7
+
8
+ const State = AgentState.merge(
9
+ z.object({
10
+ model_name: z.string().default("gpt-4o-mini"),
11
+ api_key: z.string().optional(),
12
+ api_host: z.string().optional(),
13
+ })
14
+ );
15
+
16
+ const workflow = entrypoint({ name: "debug-agent" }, async (state: z.infer<typeof State>) => {
17
+ const model = new ChatOpenAI({
18
+ model: state.model_name,
19
+ useResponsesApi: false,
20
+ apiKey: state.api_key,
21
+ configuration: {
22
+ baseURL: state.api_host,
23
+ },
24
+ });
25
+ const agent = createAgent({
26
+ model,
27
+ systemPrompt: "你是一个消息检查助手,能够使用工具检查用户和 AI 之间的对话",
28
+ tools: [],
29
+ middleware: [
30
+ humanInTheLoopMiddleware({
31
+ interruptOn: {},
32
+ }),
33
+ ],
34
+ stateSchema: State,
35
+ });
36
+ return agent.invoke(state);
37
+ });
38
+
39
+ export const graph = createEntrypointGraph({
40
+ stateSchema: State,
41
+ graph: workflow,
42
+ });
package/server/index.ts CHANGED
@@ -1,7 +1,12 @@
1
- import { Hono } from "hono";
2
1
  import testModelApp from "./test-for-model";
2
+ import { Hono } from "hono";
3
+ import LangGraphApp from "@langgraph-js/pure-graph/dist/adapter/hono/index.js";
4
+ import { registerGraph } from "@langgraph-js/pure-graph";
5
+ import { graph } from "./graph/debugAgent";
3
6
 
4
7
  export default (app: Hono) => {
8
+ registerGraph("graph", graph);
5
9
  app.route("/llm", testModelApp);
10
+ app.route("/graph", LangGraphApp);
6
11
  return app;
7
12
  };
package/src/chat/Chat.tsx CHANGED
@@ -11,7 +11,7 @@ import type { SupportedFileType } from "./components/FileList";
11
11
  import JsonEditorPopup from "./components/JsonEditorPopup";
12
12
  import { GraphPanel } from "../graph/GraphPanel";
13
13
  import { setLocalConfig } from "./store";
14
- import { History, Network, FileJson, Settings, Send, UploadCloudIcon, GitBranch, TestTube, Terminal, Printer, BotIcon } from "lucide-react";
14
+ import { History, Network, FileJson, Settings, Send, UploadCloudIcon, GitBranch, TestTube, Terminal, Printer, BotIcon, Bug } from "lucide-react";
15
15
  import { ArtifactViewer } from "../artifacts/ArtifactViewer";
16
16
  import "github-markdown-css/github-markdown.css";
17
17
 
@@ -19,19 +19,20 @@ import "./index.css";
19
19
  import { show_form } from "./tools/index";
20
20
  import { create_artifacts } from "./tools/create_artifacts";
21
21
  import SettingPanel from "../settings/SettingPanel";
22
- import ModelTesterPopup from "./components/ModelTesterPopup";
23
22
  import { toast } from "sonner";
24
23
  import { Toaster } from "@/components/ui/sonner";
25
24
 
26
25
  import { MonitorProvider, Monitor, useMonitor } from "../monitor";
27
26
  import UploadButton from "./components/UploadButton";
28
27
  import { __default_tool__ } from "./tools/human-in-the-loop";
28
+ import DebugPanel from "../debugPanel/DebugPanel";
29
+ import { useDebugPanel } from "../debugPanel/Context";
29
30
 
30
31
  const ChatMessages: React.FC = () => {
31
32
  const { renderMessages, loading, inChatError, client, collapsedTools, toggleToolCollapse, isFELocking } = useChat();
32
33
  const messagesEndRef = useRef<HTMLDivElement>(null);
33
34
  const MessageContainer = useRef<HTMLDivElement>(null);
34
-
35
+ const { setMessagesContext } = useDebugPanel();
35
36
  const scrollToBottom = () => {
36
37
  messagesEndRef.current?.scrollIntoView({ behavior: "instant" });
37
38
  };
@@ -50,11 +51,11 @@ const ChatMessages: React.FC = () => {
50
51
 
51
52
  useEffect(() => {
52
53
  if (renderMessages.length > 0 && MessageContainer.current) {
53
- console.log(renderMessages);
54
54
  // 切换消息时,自动滚动到底部
55
55
  if (!loading) {
56
56
  scrollToBottom();
57
57
  }
58
+ setMessagesContext(renderMessages);
58
59
  }
59
60
  }, [renderMessages]);
60
61
 
@@ -89,7 +90,7 @@ const ChatMessages: React.FC = () => {
89
90
  const ChatInput: React.FC = () => {
90
91
  const { userInput, renderMessages, setUserInput, loading, sendMessage, stopGeneration, currentAgent, setCurrentAgent, client, currentChatId } = useChat();
91
92
  const { extraParams } = useExtraParams();
92
- const { openMonitorWithChat } = useMonitor();
93
+ const monitor = useMonitor();
93
94
  const { mediaUrls, isFileTextMode, setIsFileTextMode } = useFileList();
94
95
  const _setCurrentAgent = (agent: string) => {
95
96
  localStorage.setItem("defaultAgent", agent);
@@ -216,7 +217,7 @@ const ChatInput: React.FC = () => {
216
217
  <UsageMetadata usage_metadata={client?.tokenCounter || {}} />
217
218
  <div className="flex items-center gap-2">
218
219
  {!!currentChatId && (
219
- <span className="cursor-pointer text-xs text-gray-300 dark:text-gray-500" onClick={() => openMonitorWithChat(currentChatId)}>
220
+ <span className="cursor-pointer text-xs text-gray-300 dark:text-gray-500" onClick={() => monitor?.openMonitorWithChat(currentChatId)}>
220
221
  会话 ID: {currentChatId}
221
222
  </span>
222
223
  )}
@@ -229,11 +230,11 @@ const ChatInput: React.FC = () => {
229
230
  const Chat: React.FC = () => {
230
231
  const [isPopupOpen, setIsPopupOpen] = useState(false);
231
232
  const [isSettingsOpen, setIsSettingsOpen] = useState(false);
232
- const [isModelTesterOpen, setIsModelTesterOpen] = useState(false);
233
233
  const { showHistory, toggleHistoryVisible, showGraph, toggleGraphVisible, renderMessages, setTools, client } = useChat();
234
234
  const { extraParams, setExtraParams } = useExtraParams();
235
235
  const { showArtifact, sendMessage } = useChat();
236
- const { openMonitor } = useMonitor();
236
+ const monitor = useMonitor();
237
+ const { toggleDebugPanel, isDebugPanelVisible } = useDebugPanel();
237
238
  useEffect(() => {
238
239
  setTools([show_form, create_artifacts, __default_tool__]);
239
240
  }, []);
@@ -265,13 +266,7 @@ const Chat: React.FC = () => {
265
266
  <FileJson className="w-4 h-4" />
266
267
  额外参数
267
268
  </button>
268
- <button
269
- onClick={() => setIsModelTesterOpen(true)}
270
- className="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-200 cursor-pointer rounded-xl hover:bg-gray-100 focus:outline-none transition-colors flex items-center gap-2"
271
- >
272
- <BotIcon className="w-4 h-4" />
273
- 模型测试器
274
- </button>
269
+
275
270
  <button
276
271
  id="setting-button"
277
272
  onClick={() => setIsSettingsOpen(true)}
@@ -290,6 +285,7 @@ const Chat: React.FC = () => {
290
285
  <Printer className="w-4 h-4" />
291
286
  打印 State
292
287
  </button>
288
+
293
289
  {/* <button
294
290
  className="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-200 cursor-pointer rounded-xl hover:bg-gray-100 focus:outline-none transition-colors flex items-center gap-2"
295
291
  onClick={() => {
@@ -303,12 +299,21 @@ const Chat: React.FC = () => {
303
299
  <button
304
300
  className="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-200 cursor-pointer rounded-xl hover:bg-gray-100 focus:outline-none transition-colors flex items-center gap-2"
305
301
  onClick={() => {
306
- openMonitor("/api/open-smith/ui/index.html");
302
+ monitor?.openMonitor("/api/open-smith/ui/index.html");
307
303
  }}
308
304
  >
309
305
  <Terminal className="w-4 h-4" />
310
306
  控制台
311
307
  </button>
308
+ <button
309
+ onClick={toggleDebugPanel}
310
+ className={`px-4 py-2 text-sm font-medium cursor-pointer rounded-xl focus:outline-none transition-colors flex items-center gap-2 ${
311
+ isDebugPanelVisible ? "text-blue-700 bg-blue-50 border border-blue-200 hover:bg-blue-100" : "text-gray-700 bg-white border border-gray-200 hover:bg-gray-100"
312
+ }`}
313
+ >
314
+ <Bug className="w-4 h-4" />
315
+ 调试面板
316
+ </button>
312
317
  </header>
313
318
  <main className="flex-1 overflow-hidden max-w-6xl w-full h-full flex flex-col">
314
319
  <ChatMessages />
@@ -324,7 +329,6 @@ const Chat: React.FC = () => {
324
329
  title="编辑额外参数"
325
330
  description="额外参数用于在发送消息时附加到 LangGraph 的 State 中。"
326
331
  />
327
- <ModelTesterPopup isOpen={isModelTesterOpen} onClose={() => setIsModelTesterOpen(false)} />
328
332
  <SettingPanel isOpen={isSettingsOpen} onClose={() => setIsSettingsOpen(false)} />
329
333
  </section>
330
334
  {(showGraph || showArtifact) && (
@@ -3,7 +3,7 @@ import { RenderMessage } from "@langgraph-js/sdk";
3
3
  import { UsageMetadata } from "./UsageMetadata";
4
4
  import { getMessageContent } from "@langgraph-js/sdk";
5
5
  import { Response } from "@/components/ai-elements/response";
6
-
6
+ import { Reasoning } from "./Reasoning";
7
7
  interface MessageAIProps {
8
8
  message: RenderMessage;
9
9
  }
@@ -12,6 +12,8 @@ const MessageAI: React.FC<MessageAIProps> = ({ message }) => {
12
12
  return (
13
13
  <div className="flex flex-col w-[80%] bg-white rounded-2xl px-5 py-4 border border-gray-200">
14
14
  <div className="text-xs font-medium text-gray-500 mb-3">{message.name}</div>
15
+ {message.additional_kwargs?.reasoning_content ? <Reasoning message={message} className="mb-4" /> : null}
16
+
15
17
  <div className="markdown-body max-w-none">
16
18
  <Response>{getMessageContent(message.content)}</Response>
17
19
  </div>
@@ -5,7 +5,35 @@ import { useChat } from "@langgraph-js/sdk/react";
5
5
  import { MessagesBox } from "./MessageBox";
6
6
  import { Response } from "@/components/ai-elements/response";
7
7
  import { CodeBlock } from "../../components/ai-elements/code-block";
8
+ import { Reasoning } from "./Reasoning";
8
9
 
10
+ const getStatusColor = (status: string) => {
11
+ switch (status) {
12
+ case "done":
13
+ return "text-green-600 bg-green-50 border-green-200";
14
+ case "loading":
15
+ return "text-blue-600 bg-blue-50 border-blue-200";
16
+ case "processing":
17
+ return "text-orange-600 bg-orange-50 border-orange-200";
18
+ case "idle":
19
+ default:
20
+ return "text-gray-600 bg-gray-50 border-gray-200";
21
+ }
22
+ };
23
+
24
+ const getStatusIcon = (status: string) => {
25
+ switch (status) {
26
+ case "done":
27
+ return "✓";
28
+ case "loading":
29
+ return "⟳";
30
+ case "processing":
31
+ return "⋯";
32
+ case "idle":
33
+ default:
34
+ return "○";
35
+ }
36
+ };
9
37
  const TOOL_COLORS = ["bg-white", "bg-white", "bg-white", "bg-white", "bg-white", "bg-white", "bg-white"];
10
38
 
11
39
  interface MessageToolProps {
@@ -27,14 +55,22 @@ const MessageTool: React.FC<MessageToolProps> = ({ message, isCollapsed, onToggl
27
55
  const { getToolUIRender, client } = useChat();
28
56
  const render = getToolUIRender(message.name || "");
29
57
  const bgColorClass = getToolColorClass(message.name || "");
30
- const onHumanClick = (type: string) => {
31
- return client?.doneFEToolWaiting(message.id as string, {
32
- decisions: [
33
- {
34
- type: type as "approve",
35
- },
36
- ],
37
- });
58
+ const [processingDecision, setProcessingDecision] = useState<string | null>(null);
59
+
60
+ const onHumanClick = async (type: string) => {
61
+ setProcessingDecision(type);
62
+ try {
63
+ await client?.doneFEToolWaiting(message.id as string, {
64
+ decisions: [
65
+ {
66
+ type: type as "approve",
67
+ },
68
+ ],
69
+ });
70
+ } finally {
71
+ // 短暂延迟后清除处理状态,让状态更新有时间生效
72
+ setTimeout(() => setProcessingDecision(null), 500);
73
+ }
38
74
  };
39
75
  const tool = new ToolRenderData(message, client!);
40
76
  const humanInTheLoopButton = () => {
@@ -44,13 +80,19 @@ const MessageTool: React.FC<MessageToolProps> = ({ message, isCollapsed, onToggl
44
80
  for (let j of i.value.reviewConfigs) {
45
81
  if (j.actionName === message.name) {
46
82
  return j.allowedDecisions.map((k) => {
83
+ const isProcessing = processingDecision === k;
47
84
  return (
48
85
  <button
49
86
  key={k}
50
- className="px-3 py-1 text-xs font-medium text-gray-700 bg-white border border-gray-200 rounded-lg hover:bg-gray-100 transition-colors cursor-pointer"
51
- onClick={() => onHumanClick(k)}
87
+ className={`px-3 py-1 text-xs font-medium rounded-lg transition-colors ${
88
+ isProcessing
89
+ ? "text-orange-700 bg-orange-100 border border-orange-300 cursor-not-allowed"
90
+ : "text-gray-700 bg-white border border-gray-200 hover:bg-gray-100 cursor-pointer"
91
+ }`}
92
+ onClick={() => !isProcessing && onHumanClick(k)}
93
+ disabled={isProcessing}
52
94
  >
53
- {k}
95
+ {isProcessing ? "处理中..." : k}
54
96
  </button>
55
97
  );
56
98
  });
@@ -70,15 +112,19 @@ const MessageTool: React.FC<MessageToolProps> = ({ message, isCollapsed, onToggl
70
112
  <div className="text-xs font-medium text-gray-600" onClick={() => console.log(message)}>
71
113
  {message.node_name} | {message.name}
72
114
  </div>
73
- <div>
115
+ <div className="flex gap-2">
74
116
  {humanInTheLoopButton()}
75
117
 
76
- <div className="text-sm">{tool.state}</div>
118
+ <div className={`inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-md border ${getStatusColor(tool.state)}`}>
119
+ <span>{getStatusIcon(tool.state)}</span>
120
+ <span>{tool.state}</span>
121
+ </div>
77
122
  </div>
78
123
  </div>
79
124
 
80
125
  {!isCollapsed && (
81
126
  <div className="flex flex-col gap-4 px-5 pb-4">
127
+ {message.additional_kwargs?.reasoning_content ? <Reasoning message={message} /> : null}
82
128
  <Previewer content={JSON.stringify(tool.getInputRepaired(), null, 2) || ""} />
83
129
  <Previewer content={getMessageContent(message.content)} />
84
130
  <UsageMetadata
@@ -0,0 +1,21 @@
1
+ import {
2
+ ChainOfThought,
3
+ ChainOfThoughtContent,
4
+ ChainOfThoughtHeader,
5
+ ChainOfThoughtImage,
6
+ ChainOfThoughtSearchResult,
7
+ ChainOfThoughtSearchResults,
8
+ ChainOfThoughtStep,
9
+ } from "../../components/ai-elements/chain-of-thought";
10
+ import { RenderMessage } from "@langgraph-js/sdk";
11
+
12
+ export const Reasoning = (props: { message: RenderMessage; className?: string }) => {
13
+ return (
14
+ <ChainOfThought defaultOpen className={props.className}>
15
+ <ChainOfThoughtHeader>思考内容</ChainOfThoughtHeader>
16
+ <ChainOfThoughtContent>
17
+ <ChainOfThoughtStep label={(props.message.additional_kwargs?.reasoning_content as string) || ""} status="complete" />
18
+ </ChainOfThoughtContent>
19
+ </ChainOfThought>
20
+ );
21
+ };
@@ -25,7 +25,7 @@ export const UsageMetadata: React.FC<UsageMetadataProps> = ({ usage_metadata, sp
25
25
  const speed = spend_time ? ((usage_metadata.output_tokens || 0) * 1000) / (spend_time || 1) : 0;
26
26
  spend_time = spend_time && !isNaN(spend_time) ? spend_time : 0;
27
27
  const { currentChatId } = useChat();
28
- const { openMonitorWithChat } = useMonitor();
28
+ const monitor = useMonitor();
29
29
  return (
30
30
  <div className="flex items-center justify-between text-xs text-gray-400 mt-3">
31
31
  <div className="flex items-center gap-3">
@@ -37,7 +37,7 @@ export const UsageMetadata: React.FC<UsageMetadataProps> = ({ usage_metadata, sp
37
37
  {response_metadata?.model_name && <span className="text-gray-500">{response_metadata.model_name}</span>}
38
38
  {tool_call_id && <span className="text-gray-400">Tool: {tool_call_id}</span>}
39
39
  {id && (
40
- <span className="text-gray-400" onClick={() => openMonitorWithChat(currentChatId!, id)}>
40
+ <span className="text-gray-400" onClick={() => monitor?.openMonitorWithChat(currentChatId!, id)}>
41
41
  ID: {id}
42
42
  </span>
43
43
  )}