From 68c43c6c16fc219feff9c2eadeaf3ed4420319cc Mon Sep 17 00:00:00 2001 From: Thomas Marchand Date: Wed, 17 Dec 2025 17:03:47 +0000 Subject: [PATCH] feat: new mission completion, tooling & stream fix --- dashboard/public/favicon.svg | 4 +- .../project.pbxproj | 4 + .../AppIcon.appiconset/icon-1024.png | Bin 57020 -> 56939 bytes .../AppIcon.appiconset/icon-120.png | Bin 3600 -> 3627 bytes .../AppIcon.appiconset/icon-152.png | Bin 4699 -> 4647 bytes .../AppIcon.appiconset/icon-167.png | Bin 5156 -> 5129 bytes .../AppIcon.appiconset/icon-180.png | Bin 5554 -> 5551 bytes .../AppIcon.appiconset/icon-20.png | Bin 484 -> 482 bytes .../AppIcon.appiconset/icon-29.png | Bin 765 -> 761 bytes .../AppIcon.appiconset/icon-40.png | Bin 1124 -> 1120 bytes .../AppIcon.appiconset/icon-58.png | Bin 1697 -> 1674 bytes .../AppIcon.appiconset/icon-60.png | Bin 1741 -> 1747 bytes .../AppIcon.appiconset/icon-76.png | Bin 2241 -> 2209 bytes .../AppIcon.appiconset/icon-80.png | Bin 2324 -> 2324 bytes .../AppIcon.appiconset/icon-87.png | Bin 2579 -> 2586 bytes .../OpenAgentDashboardApp.swift | 8 + .../Services/ControlSessionManager.swift | 386 ++++++++++++++++++ .../Views/Control/ControlView.swift | 243 ++--------- scripts/generate_ios_icons.js | 4 +- src/agents/context.rs | 7 + src/api/control.rs | 63 ++- src/tools/mission.rs | 143 +++++++ src/tools/mod.rs | 13 + 23 files changed, 654 insertions(+), 221 deletions(-) create mode 100644 ios_dashboard/OpenAgentDashboard/Services/ControlSessionManager.swift create mode 100644 src/tools/mission.rs diff --git a/dashboard/public/favicon.svg b/dashboard/public/favicon.svg index 768c95b..8248477 100644 --- a/dashboard/public/favicon.svg +++ b/dashboard/public/favicon.svg @@ -3,8 +3,8 @@ - - + + diff --git a/ios_dashboard/OpenAgentDashboard.xcodeproj/project.pbxproj b/ios_dashboard/OpenAgentDashboard.xcodeproj/project.pbxproj index 9cf7278..5c0c36f 100644 --- a/ios_dashboard/OpenAgentDashboard.xcodeproj/project.pbxproj +++ b/ios_dashboard/OpenAgentDashboard.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 02DB7F25245D03FF72DD8E2E /* ControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A84519FDE8FC75084938B292 /* ControlView.swift */; }; 03176DF3878C25A0B557462C /* ToolUIOptionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4D419C8490A0C5FC4DCDF20 /* ToolUIOptionListView.swift */; }; + 04A1B2C3D4E5F67890123456 /* ControlSessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78901234567890ABCDEF1234 /* ControlSessionManager.swift */; }; 0620B298DEF91DFCAE050DAC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 66A48A20D2178760301256C9 /* Assets.xcassets */; }; 0B5E1A6153270BFF21A54C23 /* TerminalState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52DDF35DB8CD7D70F3CFC4A6 /* TerminalState.swift */; }; 1BBE749F3758FD704D1BFA0B /* ToolUIDataTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45213C3E550D451EDC566CDE /* ToolUIDataTableView.swift */; }; @@ -34,6 +35,7 @@ /* Begin PBXFileReference section */ 02CBD2029F8CF6751AD7C4E2 /* ToolUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolUIView.swift; sourceTree = ""; }; + 78901234567890ABCDEF1234 /* ControlSessionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlSessionManager.swift; sourceTree = ""; }; 0AC6317C4EAD4DB9A8190209 /* TerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalView.swift; sourceTree = ""; }; 139C740B7D55C13F3B167EF3 /* OpenAgentDashboardApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAgentDashboardApp.swift; sourceTree = ""; }; 2B9834D4EE32058824F9DF00 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; @@ -184,6 +186,7 @@ children = ( CD8D224B6758B664864F3987 /* ANSIParser.swift */, CBC90C32FEF604E025FFBF78 /* APIService.swift */, + 78901234567890ABCDEF1234 /* ControlSessionManager.swift */, 3729F39FBF53046124D05BC1 /* NavigationState.swift */, 52DDF35DB8CD7D70F3CFC4A6 /* TerminalState.swift */, ); @@ -264,6 +267,7 @@ D64972881E36894950658708 /* APIService.swift in Sources */, CA70EC5A864C3D007D42E781 /* ChatMessage.swift in Sources */, AA02567226057045DDD61CB1 /* ContentView.swift in Sources */, + 04A1B2C3D4E5F67890123456 /* ControlSessionManager.swift in Sources */, 02DB7F25245D03FF72DD8E2E /* ControlView.swift in Sources */, 5152C5313CD5AC01276D0AE6 /* FileEntry.swift in Sources */, 6B87076797C9DFA01E24CC76 /* FilesView.swift in Sources */, diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-1024.png index da76910825d043f1764a449d4446355e4b1a0661..f0b5d388cb0065aa81ffc3d936a935b9655a16a9 100644 GIT binary patch literal 56939 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 b>ac?4h*$b}=pRBD{AaM!ct_ec>x=&j@|t9J literal 57020 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 z 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 z%0Aqx7dlL3skT-}4Uv>)o8JoZ{tZO6>pP zf+&PMlv7;$m8hq&bugW~@)J_3cQ;3)4>_O z6&iDk$>_d1d+VpNN69YCwVqA4XlgDF2&(h{%m^KR6V&P7(%;$K9hp+RH)_x)PaTcI z^)!(vBNsD#Qc_q6zhrP#RQqG8#*V&kr}wRT{u2E(Kg zXPS7s27YVlJUBR!#WfoM6>|;bm8KNcKDBL+Gc3YpuH)*28>Kd>IfM@8qo9EoP1%RK zi;lNm4Em6!IY{;z_K6h^C^eO)zdq{Xk{RHANi@#Svg7QCp_|eai*C7V@Dt)3qgypt zRhPVk4AbHMfyQo)qfzcdZ9F{?;T%oIcNa3~0Yb%+=N839D%vcQlED5N{=iYQYpS}; zU-gn%gN*d1o#e5jj7u^I zHs!-8os|4pnE@~Vn20IA^xHZiFONpQ^@T7B9I4d`SO4Z%vjO zqSzGRnitxmtY}2zOIPB(aFjPg%F@qaKixJTy{}21NFn~`t*1!0su3CC@ZFPe=7TQbW4EX8A tSZFUXjIr#@Sb`06CH^}*(}*|dCDW)h6|fjIcLe(jbu_g6Xn@qZIX9K8Sl diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-120.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-120.png index 33b0678dbb73543534c49a59a2737668cc1402dc..5fb48eba80ca0750ad44271d32735ff3546bc493 100644 GIT binary patch literal 3627 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 Vb6vjPhzs=x(A753D%U`T{vS+b*jKx)-EIDIzA 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 Y?{bGROO37g<%zLequVo+eA3kWatpET3 diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-152.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-152.png index 165eca7444d238b7e201c3713855c1eeaf20c376..a13f475355b3b4e0cadf442329a3a7369852af37 100644 GIT binary patch delta 4229 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 b7mWV_9>j(6Y;NmM00000NkvXXu0mjf&W0(= delta 4263 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 JPDHLkV1fWw5Z(X) diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-167.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-167.png index d226546af9169ebab3fb1e2725721f8f088412a5..4c46e900b04dfe233f49801d7f0a7cb5f7ebc802 100644 GIT binary patch literal 5129 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 IVjcDW03%k7XaE2J literal 5156 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 diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-180.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-180.png index 3cc8b5738dfa43b303b4fc33a845550dd9880a5d..9f89495017cd97bf323ed234cbb78c1dbb6431c5 100644 GIT binary patch literal 5551 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 P0*eDu)>5hlT7>-%z?8Y{ literal 5554 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 diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-20.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-20.png index a80cc62a9a530bd1272df9c82a893247344faf38..6a7892b0d85c4507b3579162b11c60e73c47303b 100644 GIT binary patch delta 435 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 delta 1082 zcmV-A1jYN{2;>NmIe!*OL_t(|ob6a?Yhz^;p5JiiX0qO-ZJM-MYSL+&wMm<$X(r7i zP1>Z{m&rJO5I?w};wXxujH0NFAg-wRK}JDw22p1OQAAuA+!%Cl8P}O2g8qU>&Y=?; z6Kh&iTQDD9NZxzyd!PH9=RD_d_XvWB-MsefGytIwQ0Ox#?ti$>gnp3-yPQF-c0Y_G zap?6yh%(L20n|t~OgU~qAoK|Qv-iX2KZbni97@%1u#|ldxxyEyH&zjjJO!Q33ANe^ zQB-a}Kv7g95IT-p;}Rm#=i&0)hH2kD2!Yx=<*yz zx%NGruA7;)iOFlA)4AH>bUGKR^`9|nN_9MEa_U;-3ZFt06}RNi+p&CCS@8p-M1jI z_}UtKPG(OoAKLI?!O)}3A{E=e0w`(6Ijuu_e^-aNy|*JY_jpIvRBCJU|4iUPtQ0;+ zHh;EjJL(9Kv^E=jxa+q(uy6wQ@xv{9#AbNz3B;49ntRFg8Cb`PSUC6!Jl;FD4v_R^ zwk&rIFn_c1A)B;PX`^ zq#JOvVb>e0%r;pN8MY{@+6>;|ypgMZ(s5nOwSVR82Qd7_{qS!nl)mH_?Iew!0Q5}XiCFxlj`kqRG^|fzdnxli4-95Y4*KB`vqc3% z45ydh>H2w_1}K*gBAfddv4bzeWL|`Cy(6Ou*0jl--ade| z_U+ShYfER|MZS0rspYr1VySqjur9~ZaFI-%Ml61U(@eUfBHOVq3zBx6r=HosLo5N( zD%p&E{HisN+}xPebASR5rv^4)N;v^4S1({-z_Yu)&8XE@u3BP_QmY>h?=FDCnllAa zB}byqbTttC=KzHsu0BAa&!EuPAo@ij{GV;+Po%wSMKdy|9smFU07*qoM6N<$g7iTi A{r~^~ diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-58.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-58.png index 9919b4aa964fbf475656d2853a41e1305ebd0b28..4b18690b56982dc0b562d28b7372278acc1eff4e 100644 GIT binary patch delta 1636 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 Ef@eQMDgXcg delta 1704 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 BBV_;p delta 2208 zcmV;R2w(T15y26VIe&9WL_t(|ob6ioZ(CIq?%!}@C$XD7n>vk?W{;+sj^m_hlV&t= z;>2}m5g-9&t3VNAh%G>X*kx1pkPt&+FBL(Vg$_!YZ77BGFF5Es_I-&*JmQtK_lNU? z-+R9AzVDs!o$tIALg+}DE^G`|D6n)9IgA2KD8MM5QKLLeD1X36d6-x_m0X3SP=Jy0 zFp>OFR3Rx8V5B@uBtHaIND2iQDGw9L54|NDl6t+73JNV`uGmJERp*hp{46Rg>Y~)t z>@yWGJ*B7Tv+4C28b}qD=g`Lfx5+tuf?V59`I&S2AL{FWlgi9fl#-HmdIM%OuBQ5i zE2)3*eR59!?SBQt*u()EpFE=do^s9bb)8+0P+Q0SWU=n1%|jp4lxq&iE%t9|O__r- zvnnVruZ41Q8c3%zEPudKQ?qG(%k5qdyY;O9XmtEX+G78KoUR$|_~zkH$XxCuy*@MW zT4^~{Ua_6V9fue2z!S7-;9V*+PbSm@V+L4uPCbo`?tk-u^e>1 zX{Ow~^&!_Y7)z+T=ecu)-oM=N6fS110B)so$up`zb12 zV<(+1JuL7y4}VTN-O7mef)KTPz(yfha)9OJG=FgNoe$3V?99>s;V!f$*sru zzkj)TOmFce1hK%?XC0t5<@m9;jxfaMo-@PlDPHFcLQ>V_E^Wz5geGRb4L zb(iy+$aT>^(BSZ=b1A}cIOd>*4HzoV(8%7X!zPd+?_u3FWfM`aCCRhgE2?*>ViOm@ z&;+|UaevLtbF4OiP({mxFh_$P&Wr1?Jb%Om#b8+Fbq@PN(LlvE7>c;aV9y}F2?xy9 z`x4)LZRNQ!^)BQx`65DHi(F^xeO_bs;BE8IuQm<3Y01!M{JW^w#zg=HDlIK9k$~xW zgRX6-A||7u%v3tY>-KDTF({}|GNkh1aQ@C<_+Hnu;T1k#-?&RV*4?wm?Pc{l6MqL7 z+7sN=K5-zXV8N=YFW|LX+V0ejpx5@-$RWZ;ABT@6?Jx?D4~vHu-vTz5TF8T5(^zRa9@jeCLN z2kImHH^0Z{(aI$RFjO)q0j_PcWH1y*CEK81l;m~33Tw6Pp_?+yY_Zr`{y7rQYZvw$kaxJOC;y1`|DAdJl|w`w_QV(M3FT6Y6wWSAE{CxE^$fkF{Nl@0Y@sI<5q z9-c73@Milqy`i~(s00cUY3qH#BmJDDrskXc1LUe~5g7?#8WtVIJR=2>2TGga4I#H15Cyw&!sCKiGw_+F1n zB^3oJK(@8t=ix|ml20gugbnQsq%}Xkjn{2zzLDphQZ`2q8H>soQ@}(3>+E_gV52TO z1{k~(o)pfY1M)TK41d-g+VTbGvtXVrEgoaHxByn)xQjR3+J3K(SEN%z)3rSD4#wVL zkY^yv$Pr$k;R+_|01!D9gJa}Etd0B$^%f(zWdT^ON3sbd!Gtn&65wv`&cZ_@?E9&s z^Fhv={9Q$m0w9}t`-`K<&9Dl{wN3>HI-<=WPxC$?COk*#R4ZAl(*K3^tz)RL1mlR;aV|5KXIqcv`_*mF? z)CVn10VcdbgM8!mv=jW5HI5;Sk*jbl(yx0?YY!71Lw|oNRSQX0CG$5%(VU;Qfa&!{ zZR8IU3%Q0p%rz6!>HBE|nD7u%3~uLBh{ko-C2c=T9x&l)dC)fD>mGCY)}-!bSpX)M zkSV}~0*sW0iR6c(3Q3^=BjsTt`5~x6QYgSkd6-Ck=&6tt3NTV0CXyd=DkOyhjFg9o i@DY>yGICN zAvG*fV{n85&k~aXDFB56kj(TVWr0EgNXi05@-hMC!a@N^%6|fd`L3v3SSSF=Y->_U zL?{5sY>QGfMkoL&nT8_LVub-{x93w)@d#Ddo=e__9aQhVl-8CXL+<M&6<=+y7l~Owav9Z5!_+w|nFN2|z0quI?va+nqEy z{q;OhHqU%Z(|>b6>;IqK`a2B_?W5MVUDVuiBQ>|&K%L!>)8y2bLGN|;?4fK|BV}dP zlFQXZ85xz7l9IZz0CeYf&|rvF&29UeHqU%VQ?uU(T^}BMhg}sGy3j`CB z#K*xFJbjSHCJzKzF-HI3%aoZ}m3#oEq@>aY-);IrHu!GWV_htBHa1_Y&p9^v2~|{{ zMCs{8K^E$AdCA*&xen&k><_$YNd;h?_hN0K|IoUs)8a6vm0H{G(7|h3e?6t9W<-1^ zBV#QM41d3>yLGm!J~;r)bGPemi+ColTdmR4kJ`EmwB+(9m90I>@Ouaq{ev%Q@%7!9 zz9At1S}Zm_VSsM*4eaIkBrOMVuz%T_w4j`v^$Z-|uc|&{$=_tR7trMN zH~fA@aPXH~J^q?38 z9_MSnn@Y=$r0ncEvfJ}Gi69P@c&4eP^;X>~Bz*zh37r?!2+z0WS6by*6ZQAm(+g>C z+g}`$SFI{uUI5x`xzyADoW}3|qK3vR*=-gD-Rhu<$`ff~^JjW|LuC^9%%-kK`CdcQ z)qgQBa$x9no~x(tSxQUGULF7BdSAUUt03z1;E#&FAgNJM@ z>5nU?+0Z+veX*f%`B0LLB!`Lw^JQh%@rL{3?jMwyS#1u0qZ1$SM-&y0#~naqN+~*6 zt&T-AERu}miXEK~h6PvF%+hT)bv?w_z#b9~ATqCvCH5F=+;Af|&*!gqCk`w~*nbNO zd%510VZ;x{uCU}>vIG!#c?~gJQm$C*^d$qBliQ*f^dipSVHB^K;Q4#|U(l{uS@VN< z(B83|^~1n~01>vJurKUf;G)u9L$f&&3GR7Hw zP}<%51ZU1XcN?Xoq(z*su&__hwjG@hgnb@W5nKAe-oyfkEGL7u(^($%4yDT0zd*~ zfD1V@D!4@n_mrg{ga^2BWGe$v?&BC1sAwN@`>&WZdrIem6da=i0wPUuq=b+;Zy>Sa4f|&=UKDXcSh@AaQMwbG->>O zKFN?2M?0L(Qe7Mf1%CsJ3j_`s5$Ai?NmKx&8Df;w9+SON|!Tu2mHcoXud zq3J3;{-Rf%^nWK*ZMGb0ZnMFw&?972yrZ(~IRD6|A5RTPwJQf-!f-&m#j z6%U}$n(neohu#OSK@^ZunF3H4?;9g=Kt_`X+7H(O$`xgSLL2K_Zl1>(*OY8l01Cq( zT3LHUgJcSQ-@{R&t!N7r%V;P7g#wV21q$_kG0Fv1jrD%*$08%my zMWlrSkdy@q^IcK7uuuS!+18|zh)@8M*%qZ}j7Thi{{gcQsVgZU-KPKm002ovPDHLk FV1g)}MZ5q2 delta 2283 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 diff --git a/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-87.png b/ios_dashboard/OpenAgentDashboard/Assets.xcassets/AppIcon.appiconset/icon-87.png index 64bf161867822f5925c477cceba7990f2a90604b..9e1684ce3cb211174711e525f497984ddef4b6cc 100644 GIT binary patch delta 2555 zcmV7^B z_5-Tjg3#cS-Ik{h4KCRYg0@^?KUmr=h?6t4a3eIh zWVaQbD$6Y`>!(21J#>EZaSE?LM;9(WPmxQvXk+^yG{5*m8Xo;5H8gHee!kE4y`Cs= zz1}tk2H^Gd-hWHoJ@2CCmKRfHYfn+66yLWPC(cP_a3`92DC zUQPnt6!q3>S^*fZBwx49W*)pByI2fSKYfExlX~JcT#KHD=E-* znK}Zmr@HzT@^~6gH@MAbUPNn~*Y*Loz4ITMTlfx5&3}BEW*5FqYa4&$|Ks?NPdrLx zOhfZ{ULroME^Q-0yN#CTwXA zhnsrN-b>p%yJ~)Xn3eEV1~atsb6zhVm;0561oOorjkEpT0~Dz=QsrCSu<_dKm#g~7c}sjj zx^VFZKZ8J)&K_lu4Xr$r8{i^<4Gw=?Sw$p9@Tcd#NqzkvVD8!4em8aZzMEfeb?x{2 zK!4u6@K5H!d3pJk^G{5DF&ezWS2<9nv)9V1^J-mhar?;z7twoh=_hK#pg~Q|FE}>P zl$3O_rGxXzXQyYs!8FT!UvWvNx}L0`wH^*y+x!d9hxJb^xH!(pq@up?24_izQIOmm z?wWmk7@(W4!}9U}<<;M0ED@NPep0Q6^nW=U2}WAr0z?ET8NKW3LTPQLre>C!ns?&X za4|Q<8iCGxGWO!bqo3O6mPW=toiVzY5pX*?-=O$rs?l2{;U9~<%^90_Z2Xa!um6{t zAMbM_z%3{!qmAvq^QI8UvH`3R28%RNm+)*-&lML3Se7g;?XkQLJ%f38_uCZE@PGaA z@3w<069uSI@o8r!$3%=J3=DlNDPX~|4|~q(ET*kURFlAo!{5u{-^K#!*X;)vY8Ey# zH1a^!fEB`Ep&aY9wZA4Il?=%VD4-OIAiBrj*XZ9=0T{s)|EsB;SMCAHjjiBHmw=6C z3s}P_P>DlL?VRO3i1HPcW32m{{eS1$=AWs&V#MnZZ@Mew4QtbtqN3#xU3-EU{Qw6gX)%QSj9{4470dXqZlR->|NTvac|Cx0HZFq#TA zUq$7pJ>a_CwOO^?5?_#0;kkvU57i{#SEpva!t^N-`4GTLMGP4v{Ik`4@+6#Td5JyX z!WT-FA4e%uDRiLg^1d|MJXY7AW6FfUh9H$_76>2P9(b*?Sg;6>$A9SkNWWPe>b+tQ zxENEjUyV8c2h-Ysx44~#Mt|<#SFVW$q(5~K%1N+z^M45d?W(GtO7NZB ziX)>eZyUH6wROwtC6GxWB|h$%B5yPM&nSt1p1OPAlM<+fo(864qvsx`^{v0g`RJQm z9IdMlCnd%-`nUFy3s;rB;9}tT?D@%S+>~*cn4OpBR74%(I4ZM=u7e{D{|g;MN}Tay zY4w-fy>pyjwYFLh3xDxZn)XE6z-9zojF#4ys$3ldHMFtu&qljm>Ove?s%vIg>rF=V zb~?R$A4=oq`S>|Y+L)Qlae#xM$jpV=TI7g0CRrw3(RKbLqFo8sCf-JurDi-C#S$&i3N<# zt~VaIhRiFPntwjSR(eHa zxx_$qa7!sHG9EOz6j(h9kjU`BeNkD|C?~s3GZy*B+p4paJC$_^FhGe5Kv2 z{3B|kPXXyHeCeL3?O?hk!2#`pmBw2q^xC676j%fjm_(YTPYJk2!UG>bW^b^*cntu4 zSOSTx4nM=f$HMWy9i8Mk4X$9Bb3tW#@YAq*tA7SNNT7D_HRr$;!l1J9LFGr$3W`#@ zyasn7lZiz1Weu*d{(S@3gY>~tLx#Q}OGijJG`J!)3qlu;)Dz%e<^LrE!B1W_xFYrA zx%VTK8~jVns;WuVsh){C*d6C{MVvk>d%xmUFK}rMu1F7H^fkzS1L=da*~50nSgtUG z>~yZ>5|Q2eIF;av6E-xsLW4_oTcNgGVLzbSEeH)R*=>2+a)tdMYPTRXxMa7rY0DM% z1E<}B(BP8YAZW`K_JgI}f;c%t3pYZ8OLkkKwp?L9pxP}64KCSjdFfj2{{e$x&y)&{ RkbnRH002ovPDHLkV1j4c6Mg^y delta 2548 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 KMNUMnLSTX-DE;RE diff --git a/ios_dashboard/OpenAgentDashboard/OpenAgentDashboardApp.swift b/ios_dashboard/OpenAgentDashboard/OpenAgentDashboardApp.swift index f028de9..79389ee 100644 --- a/ios_dashboard/OpenAgentDashboard/OpenAgentDashboardApp.swift +++ b/ios_dashboard/OpenAgentDashboard/OpenAgentDashboardApp.swift @@ -9,6 +9,14 @@ import SwiftUI @main struct OpenAgentDashboardApp: App { + init() { + // Start the control session manager early so it connects immediately + // and maintains connection across tab switches + Task { @MainActor in + ControlSessionManager.shared.start() + } + } + var body: some Scene { WindowGroup { ContentView() diff --git a/ios_dashboard/OpenAgentDashboard/Services/ControlSessionManager.swift b/ios_dashboard/OpenAgentDashboard/Services/ControlSessionManager.swift new file mode 100644 index 0000000..bd37dde --- /dev/null +++ b/ios_dashboard/OpenAgentDashboard/Services/ControlSessionManager.swift @@ -0,0 +1,386 @@ +// +// ControlSessionManager.swift +// OpenAgentDashboard +// +// Manages the SSE stream connection for the control session. +// Handles auto-reconnection, state recovery, and graceful error handling. +// + +import Foundation +import Observation + +@MainActor +@Observable +final class ControlSessionManager { + static let shared = ControlSessionManager() + + // MARK: - State + + var messages: [ChatMessage] = [] + var runState: ControlRunState = .idle + var queueLength: Int = 0 + var currentMission: Mission? + var isLoading: Bool = false + + // MARK: - Private + + private var streamTask: Task? + private var reconnectTask: Task? + private var isConnected = false + private var reconnectAttempts = 0 + private let maxReconnectDelay: TimeInterval = 30 + private let api = APIService.shared + + private init() {} + + // MARK: - Public API + + /// Start the streaming connection. Call once on app launch. + func start() { + guard streamTask == nil else { return } + connect() + } + + /// Stop the streaming connection. + func stop() { + streamTask?.cancel() + streamTask = nil + reconnectTask?.cancel() + reconnectTask = nil + isConnected = false + } + + /// Load a specific mission by ID. + func loadMission(id: String) async { + isLoading = true + defer { isLoading = false } + + do { + let missions = try await api.listMissions() + if let mission = missions.first(where: { $0.id == id }) { + switchToMission(mission) + HapticService.success() + } + } catch { + print("Failed to load mission \(id): \(error)") + } + } + + /// Load the current mission from the server. + func loadCurrentMission() async { + isLoading = true + defer { isLoading = false } + + do { + if let mission = try await api.getCurrentMission() { + switchToMission(mission) + } + } catch { + print("Failed to load current mission: \(error)") + } + } + + /// Create a new mission. + func createNewMission() async { + do { + let mission = try await api.createMission() + currentMission = mission + messages = [] + HapticService.success() + } catch { + print("Failed to create mission: \(error)") + HapticService.error() + } + } + + /// Set mission status. + func setMissionStatus(_ status: MissionStatus) async { + guard let mission = currentMission else { return } + + do { + try await api.setMissionStatus(id: mission.id, status: status) + currentMission?.status = status + HapticService.success() + } catch { + print("Failed to set status: \(error)") + HapticService.error() + } + } + + /// Send a message to the agent. + func sendMessage(content: String) async { + let trimmed = content.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return } + + HapticService.lightTap() + + do { + let _ = try await api.sendMessage(content: trimmed) + } catch { + print("Failed to send message: \(error)") + HapticService.error() + } + } + + /// Cancel the current run. + func cancelRun() async { + do { + try await api.cancelControl() + HapticService.success() + } catch { + print("Failed to cancel: \(error)") + HapticService.error() + } + } + + // MARK: - Private Helpers + + private func switchToMission(_ mission: Mission) { + currentMission = mission + messages = mission.history.enumerated().map { index, entry in + ChatMessage( + id: "\(mission.id)-\(index)", + type: entry.isUser ? .user : .assistant(success: true, costCents: 0, model: nil), + content: entry.content + ) + } + } + + private func connect() { + streamTask = Task { [weak self] in + guard let self = self else { return } + + guard let url = URL(string: "\(api.baseURL)/api/control/stream") else { + scheduleReconnect() + return + } + + var request = URLRequest(url: url) + request.setValue("text/event-stream", forHTTPHeaderField: "Accept") + + if api.isAuthenticated, let token = UserDefaults.standard.string(forKey: "jwt_token") { + request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + } + + do { + let (stream, response) = try await URLSession.shared.bytes(for: request) + + // Check for HTTP errors + if let httpResponse = response as? HTTPURLResponse { + guard (200...299).contains(httpResponse.statusCode) else { + scheduleReconnect() + return + } + } + + // Successfully connected + isConnected = true + reconnectAttempts = 0 + + // Sync mission state on reconnect + await syncMissionState() + + var buffer = "" + for try await byte in stream { + guard !Task.isCancelled else { break } + + if let char = String(bytes: [byte], encoding: .utf8) { + buffer.append(char) + + // Look for double newline (end of SSE event) + while let range = buffer.range(of: "\n\n") { + let eventString = String(buffer[.. localPersistentCount { + switchToMission(refreshed) + } + } + } catch { + print("Failed to sync mission state: \(error)") + } + } + + private func parseAndHandleEvent(_ eventString: String) { + var eventType = "message" + var dataLines: [String] = [] + + for line in eventString.split(separator: "\n", omittingEmptySubsequences: false) { + let lineStr = String(line) + if lineStr.hasPrefix("event:") { + eventType = String(lineStr.dropFirst(6)).trimmingCharacters(in: .whitespaces) + } else if lineStr.hasPrefix("data:") { + dataLines.append(String(lineStr.dropFirst(5)).trimmingCharacters(in: .whitespaces)) + } + // Ignore SSE comments (lines starting with :) + } + + let dataString = dataLines.joined() + guard !dataString.isEmpty else { return } + + do { + guard let data = dataString.data(using: .utf8), + let json = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { + return + } + handleEvent(type: eventType, data: json) + } catch { + // Silently ignore parse errors - could be partial data or keepalive + } + } + + private func handleEvent(type: String, data: [String: Any]) { + switch type { + case "status": + if let state = data["state"] as? String { + runState = ControlRunState(rawValue: state) ?? .idle + } + if let queue = data["queue_len"] as? Int { + queueLength = queue + } + + case "user_message": + if let content = data["content"] as? String, + let id = data["id"] as? String { + // Avoid duplicates (might already have this from mission history) + if !messages.contains(where: { $0.id == id }) { + let message = ChatMessage(id: id, type: .user, content: content) + messages.append(message) + } + } + + case "assistant_message": + if let content = data["content"] as? String, + let id = data["id"] as? String { + let success = data["success"] as? Bool ?? true + let costCents = data["cost_cents"] as? Int ?? 0 + let model = data["model"] as? String + + // Remove any incomplete thinking messages + messages.removeAll { $0.isThinking && !$0.thinkingDone } + + // Avoid duplicates + if !messages.contains(where: { $0.id == id }) { + let message = ChatMessage( + id: id, + type: .assistant(success: success, costCents: costCents, model: model), + content: content + ) + messages.append(message) + } + } + + case "thinking": + if let content = data["content"] as? String { + let done = data["done"] as? Bool ?? false + + // Find existing thinking message or create new + if let index = messages.lastIndex(where: { $0.isThinking && !$0.thinkingDone }) { + messages[index].content += "\n\n---\n\n" + content + if done { + messages[index] = ChatMessage( + id: messages[index].id, + type: .thinking(done: true, startTime: Date()), + content: messages[index].content + ) + } + } else if !done { + let message = ChatMessage( + id: "thinking-\(Date().timeIntervalSince1970)", + type: .thinking(done: false, startTime: Date()), + content: content + ) + messages.append(message) + } + } + + case "error": + // Only show actual agent errors, not stream connection errors + if let errorMessage = data["message"] as? String, + !errorMessage.contains("Stream connection") { + let message = ChatMessage( + id: "error-\(Date().timeIntervalSince1970)", + type: .error, + content: errorMessage + ) + messages.append(message) + } + + case "tool_call": + if let toolCallId = data["tool_call_id"] as? String, + let name = data["name"] as? String, + let args = data["args"] as? [String: Any] { + // Parse UI tool calls + if let toolUI = ToolUIContent.parse(name: name, args: args) { + let message = ChatMessage( + id: toolCallId, + type: .toolUI(name: name), + content: "", + toolUI: toolUI + ) + messages.append(message) + } + } + + default: + break + } + } +} diff --git a/ios_dashboard/OpenAgentDashboard/Views/Control/ControlView.swift b/ios_dashboard/OpenAgentDashboard/Views/Control/ControlView.swift index e2da4a2..813b76e 100644 --- a/ios_dashboard/OpenAgentDashboard/Views/Control/ControlView.swift +++ b/ios_dashboard/OpenAgentDashboard/Views/Control/ControlView.swift @@ -8,22 +8,23 @@ import SwiftUI struct ControlView: View { - @State private var messages: [ChatMessage] = [] @State private var inputText = "" - @State private var runState: ControlRunState = .idle - @State private var queueLength = 0 - @State private var currentMission: Mission? - @State private var isLoading = true - @State private var streamTask: Task? - @State private var showMissionMenu = false @State private var shouldScrollToBottom = false + @State private var lastMessageCount = 0 @FocusState private var isInputFocused: Bool - private let api = APIService.shared + private let session = ControlSessionManager.shared private let nav = NavigationState.shared private let bottomAnchorId = "bottom-anchor" + // Convenience accessors for session state + private var messages: [ChatMessage] { session.messages } + private var runState: ControlRunState { session.runState } + private var queueLength: Int { session.queueLength } + private var currentMission: Mission? { session.currentMission } + private var isLoading: Bool { session.isLoading } + var body: some View { ZStack { // Background with subtle accent glow @@ -67,7 +68,7 @@ struct ControlView: View { ToolbarItem(placement: .topBarTrailing) { Menu { Button { - Task { await createNewMission() } + Task { await session.createNewMission() } } label: { Label("New Mission", systemImage: "plus") } @@ -76,20 +77,20 @@ struct ControlView: View { Divider() Button { - Task { await setMissionStatus(.completed) } + Task { await session.setMissionStatus(.completed) } } label: { Label("Mark Complete", systemImage: "checkmark.circle") } Button(role: .destructive) { - Task { await setMissionStatus(.failed) } + Task { await session.setMissionStatus(.failed) } } label: { Label("Mark Failed", systemImage: "xmark.circle") } if mission.status != .active { Button { - Task { await setMissionStatus(.active) } + Task { await session.setMissionStatus(.active) } } label: { Label("Reactivate", systemImage: "arrow.clockwise") } @@ -102,25 +103,31 @@ struct ControlView: View { } } .task { + // Start the session manager (idempotent) + session.start() + // Check if we're being opened with a specific mission from History if let pendingId = nav.consumePendingMission() { - await loadMission(id: pendingId) - } else { - await loadCurrentMission() + await session.loadMission(id: pendingId) + } else if session.currentMission == nil { + await session.loadCurrentMission() } - startStreaming() } .onChange(of: nav.pendingMissionId) { _, newId in // Handle navigation from History while Control is already visible if let missionId = newId { nav.pendingMissionId = nil Task { - await loadMission(id: missionId) + await session.loadMission(id: missionId) } } } - .onDisappear { - streamTask?.cancel() + .onChange(of: messages.count) { oldCount, newCount in + // Trigger scroll when messages are added + if newCount > lastMessageCount { + shouldScrollToBottom = true + lastMessageCount = newCount + } } } @@ -183,9 +190,6 @@ struct ControlView: View { // Dismiss keyboard when tapping on messages area isInputFocused = false } - .onChange(of: messages.count) { _, _ in - scrollToBottom(proxy: proxy) - } .onChange(of: shouldScrollToBottom) { _, shouldScroll in if shouldScroll { scrollToBottom(proxy: proxy) @@ -299,7 +303,7 @@ struct ControlView: View { // Send/Stop button Button { if runState != .idle { - Task { await cancelRun() } + Task { await session.cancelRun() } } else { sendMessage() } @@ -325,205 +329,14 @@ struct ControlView: View { // MARK: - Actions - private func loadCurrentMission() async { - isLoading = true - defer { isLoading = false } - - do { - if let mission = try await api.getCurrentMission() { - currentMission = mission - messages = mission.history.enumerated().map { index, entry in - ChatMessage( - id: "\(mission.id)-\(index)", - type: entry.isUser ? .user : .assistant(success: true, costCents: 0, model: nil), - content: entry.content - ) - } - - // Scroll to bottom after loading - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - shouldScrollToBottom = true - } - } - } catch { - print("Failed to load mission: \(error)") - } - } - - private func loadMission(id: String) async { - isLoading = true - defer { isLoading = false } - - do { - let missions = try await api.listMissions() - if let mission = missions.first(where: { $0.id == id }) { - currentMission = mission - messages = mission.history.enumerated().map { index, entry in - ChatMessage( - id: "\(mission.id)-\(index)", - type: entry.isUser ? .user : .assistant(success: true, costCents: 0, model: nil), - content: entry.content - ) - } - HapticService.success() - - // Scroll to bottom after loading - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - shouldScrollToBottom = true - } - } - } catch { - print("Failed to load mission: \(error)") - } - } - - private func createNewMission() async { - do { - let mission = try await api.createMission() - currentMission = mission - messages = [] - HapticService.success() - } catch { - print("Failed to create mission: \(error)") - HapticService.error() - } - } - - private func setMissionStatus(_ status: MissionStatus) async { - guard let mission = currentMission else { return } - - do { - try await api.setMissionStatus(id: mission.id, status: status) - currentMission?.status = status - HapticService.success() - } catch { - print("Failed to set status: \(error)") - HapticService.error() - } - } - private func sendMessage() { let content = inputText.trimmingCharacters(in: .whitespacesAndNewlines) guard !content.isEmpty else { return } inputText = "" - HapticService.lightTap() Task { - do { - let _ = try await api.sendMessage(content: content) - } catch { - print("Failed to send message: \(error)") - HapticService.error() - } - } - } - - private func cancelRun() async { - do { - try await api.cancelControl() - HapticService.success() - } catch { - print("Failed to cancel: \(error)") - HapticService.error() - } - } - - private func startStreaming() { - streamTask = api.streamControl { eventType, data in - Task { @MainActor in - handleStreamEvent(type: eventType, data: data) - } - } - } - - private func handleStreamEvent(type: String, data: [String: Any]) { - switch type { - case "status": - if let state = data["state"] as? String { - runState = ControlRunState(rawValue: state) ?? .idle - } - if let queue = data["queue_len"] as? Int { - queueLength = queue - } - - case "user_message": - if let content = data["content"] as? String, - let id = data["id"] as? String { - let message = ChatMessage(id: id, type: .user, content: content) - messages.append(message) - } - - case "assistant_message": - if let content = data["content"] as? String, - let id = data["id"] as? String { - let success = data["success"] as? Bool ?? true - let costCents = data["cost_cents"] as? Int ?? 0 - let model = data["model"] as? String - - // Remove any incomplete thinking messages - messages.removeAll { $0.isThinking && !$0.thinkingDone } - - let message = ChatMessage( - id: id, - type: .assistant(success: success, costCents: costCents, model: model), - content: content - ) - messages.append(message) - } - - case "thinking": - if let content = data["content"] as? String { - let done = data["done"] as? Bool ?? false - - // Find existing thinking message or create new - if let index = messages.lastIndex(where: { $0.isThinking && !$0.thinkingDone }) { - messages[index].content += "\n\n---\n\n" + content - if done { - messages[index] = ChatMessage( - id: messages[index].id, - type: .thinking(done: true, startTime: Date()), - content: messages[index].content - ) - } - } else if !done { - let message = ChatMessage( - id: "thinking-\(Date().timeIntervalSince1970)", - type: .thinking(done: false, startTime: Date()), - content: content - ) - messages.append(message) - } - } - - case "error": - if let errorMessage = data["message"] as? String { - let message = ChatMessage( - id: "error-\(Date().timeIntervalSince1970)", - type: .error, - content: errorMessage - ) - messages.append(message) - } - - case "tool_call": - if let toolCallId = data["tool_call_id"] as? String, - let name = data["name"] as? String, - let args = data["args"] as? [String: Any] { - // Parse UI tool calls - if let toolUI = ToolUIContent.parse(name: name, args: args) { - let message = ChatMessage( - id: toolCallId, - type: .toolUI(name: name), - content: "", - toolUI: toolUI - ) - messages.append(message) - } - } - - default: - break + await session.sendMessage(content: content) } } } diff --git a/scripts/generate_ios_icons.js b/scripts/generate_ios_icons.js index 11795ab..8414d9e 100755 --- a/scripts/generate_ios_icons.js +++ b/scripts/generate_ios_icons.js @@ -30,10 +30,10 @@ function createBrainSvg(size) { const scaleY = contentSize / 1186; const scale = Math.min(scaleX, scaleY); - // Center the brain + // Center the brain with slight rightward shift for visual centering const scaledWidth = 1568 * scale; const scaledHeight = 1186 * scale; - const offsetX = (size - scaledWidth) / 2; + const offsetX = (size - scaledWidth) / 2 + (size * 0.03); // Shift 3% right for visual centering const offsetY = (size - scaledHeight) / 2; return ` diff --git a/src/agents/context.rs b/src/agents/context.rs index 94601b7..686bbcb 100644 --- a/src/agents/context.rs +++ b/src/agents/context.rs @@ -8,6 +8,7 @@ use crate::config::Config; use crate::llm::LlmClient; use crate::memory::MemorySystem; use crate::tools::ToolRegistry; +use crate::tools::mission::MissionControl; use tokio::sync::broadcast; /// Shared context passed to all agents during execution. @@ -59,6 +60,9 @@ pub struct AgentContext { /// Benchmark registry for task-aware model selection. pub benchmarks: Option, + + /// Mission control for allowing the agent to complete/fail missions. + pub mission_control: Option, } impl AgentContext { @@ -84,6 +88,7 @@ impl AgentContext { control_status: None, cancel_token: None, benchmarks: None, + mission_control: None, } } @@ -110,6 +115,7 @@ impl AgentContext { control_status: None, cancel_token: None, benchmarks: None, + mission_control: None, } } @@ -132,6 +138,7 @@ impl AgentContext { control_status: self.control_status.clone(), cancel_token: self.cancel_token.clone(), benchmarks: self.benchmarks.clone(), + mission_control: self.mission_control.clone(), } } diff --git a/src/api/control.rs b/src/api/control.rs index 11b378f..f9670e8 100644 --- a/src/api/control.rs +++ b/src/api/control.rs @@ -106,6 +106,12 @@ pub enum AgentEvent { Error { message: String, }, + /// Mission status changed (by agent or user) + MissionStatusChanged { + mission_id: Uuid, + status: MissionStatus, + summary: Option, + }, } impl AgentEvent { @@ -118,6 +124,7 @@ impl AgentEvent { AgentEvent::ToolCall { .. } => "tool_call", AgentEvent::ToolResult { .. } => "tool_result", AgentEvent::Error { .. } => "error", + AgentEvent::MissionStatusChanged { .. } => "mission_status_changed", } } } @@ -544,6 +551,9 @@ pub fn spawn_control_session( queue_len: 0, })); let current_mission = Arc::new(RwLock::new(None)); + + // Channel for agent-initiated mission control commands + let (mission_cmd_tx, mission_cmd_rx) = mpsc::channel::(64); let state = ControlState { cmd_tx, @@ -559,6 +569,8 @@ pub fn spawn_control_session( memory, benchmarks, cmd_rx, + mission_cmd_rx, + mission_cmd_tx, events_tx, tool_hub, status, @@ -574,6 +586,8 @@ async fn control_actor_loop( memory: Option, benchmarks: crate::budget::SharedBenchmarkRegistry, mut cmd_rx: mpsc::Receiver, + mut mission_cmd_rx: mpsc::Receiver, + mission_cmd_tx: mpsc::Sender, events_tx: broadcast::Sender, tool_hub: Arc, status: Arc>, @@ -706,6 +720,10 @@ async fn control_actor_loop( let cancel = CancellationToken::new(); let pricing = Arc::clone(&pricing); let hist_snapshot = history.clone(); + let mission_ctrl = crate::tools::mission::MissionControl { + current_mission_id: Arc::clone(¤t_mission), + cmd_tx: mission_cmd_tx.clone(), + }; running_cancel = Some(cancel.clone()); running = Some(tokio::spawn(async move { let result = run_single_control_turn( @@ -720,6 +738,7 @@ async fn control_actor_loop( cancel, hist_snapshot, msg.clone(), + Some(mission_ctrl), ) .await; (mid, msg, result) @@ -782,6 +801,13 @@ async fn control_actor_loop( if let Some(mem) = &memory { let result = mem.supabase.update_mission_status(id, &new_status.to_string()).await .map_err(|e| e.to_string()); + if result.is_ok() { + let _ = events_tx.send(AgentEvent::MissionStatusChanged { + mission_id: id, + status: new_status, + summary: None, + }); + } let _ = respond.send(result); } else { let _ = respond.send(Err("Memory not configured".to_string())); @@ -789,6 +815,32 @@ async fn control_actor_loop( } } } + // Handle agent-initiated mission status changes (from complete_mission tool) + mission_cmd = mission_cmd_rx.recv() => { + if let Some(cmd) = mission_cmd { + match cmd { + crate::tools::mission::MissionControlCommand::SetStatus { status, summary } => { + let mission_id = current_mission.read().await.clone(); + if let Some(id) = mission_id { + let new_status = match status { + crate::tools::mission::MissionStatusValue::Completed => MissionStatus::Completed, + crate::tools::mission::MissionStatusValue::Failed => MissionStatus::Failed, + }; + if let Some(mem) = &memory { + if let Ok(()) = mem.supabase.update_mission_status(id, &new_status.to_string()).await { + let _ = events_tx.send(AgentEvent::MissionStatusChanged { + mission_id: id, + status: new_status, + summary, + }); + tracing::info!("Mission {} marked as {} by agent", id, new_status); + } + } + } + } + } + } + } finished = async { match &mut running { Some(handle) => Some(handle.await), @@ -835,6 +887,10 @@ async fn control_actor_loop( let cancel = CancellationToken::new(); let pricing = Arc::clone(&pricing); let hist_snapshot = history.clone(); + let mission_ctrl = crate::tools::mission::MissionControl { + current_mission_id: Arc::clone(¤t_mission), + cmd_tx: mission_cmd_tx.clone(), + }; running_cancel = Some(cancel.clone()); running = Some(tokio::spawn(async move { let result = run_single_control_turn( @@ -849,6 +905,7 @@ async fn control_actor_loop( cancel, hist_snapshot, msg.clone(), + Some(mission_ctrl), ) .await; (mid, msg, result) @@ -919,6 +976,7 @@ async fn run_single_control_turn( cancel: CancellationToken, history: Vec<(String, String)>, user_message: String, + mission_control: Option, ) -> crate::agents::AgentResult { // Build a task prompt that includes conversation context with size limits. // This prevents context overflow when history gets large. @@ -937,7 +995,7 @@ async fn run_single_control_turn( convo.push_str(&history_context); convo.push_str("User:\n"); convo.push_str(&user_message); - convo.push_str("\n\nInstructions:\n- Continue the conversation helpfully.\n- You may use tools to gather information or make changes.\n- When appropriate, use Tool UI tools (ui_*) for structured output or to ask for user selections.\n- For large data processing tasks (>10KB), use run_command to execute Python scripts rather than processing inline.\n"); + convo.push_str("\n\nInstructions:\n- Continue the conversation helpfully.\n- You may use tools to gather information or make changes.\n- When appropriate, use Tool UI tools (ui_*) for structured output or to ask for user selections.\n- For large data processing tasks (>10KB), use run_command to execute Python scripts rather than processing inline.\n- When you have fully completed the user's goal or determined it cannot be completed, use the complete_mission tool to mark the mission status.\n"); let budget = Budget::new(1000); let verification = VerificationCriteria::None; @@ -951,7 +1009,7 @@ async fn run_single_control_turn( // Context for agent execution. let llm = Arc::new(OpenRouterClient::new(config.api_key.clone())); - let tools = ToolRegistry::new(); + let tools = ToolRegistry::with_mission_control(mission_control.clone()); let mut ctx = AgentContext::with_memory( config.clone(), llm, @@ -960,6 +1018,7 @@ async fn run_single_control_turn( config.working_dir.clone(), memory, ); + ctx.mission_control = mission_control; ctx.control_events = Some(events_tx); ctx.frontend_tool_hub = Some(tool_hub); ctx.control_status = Some(status); diff --git a/src/tools/mission.rs b/src/tools/mission.rs new file mode 100644 index 0000000..918a152 --- /dev/null +++ b/src/tools/mission.rs @@ -0,0 +1,143 @@ +//! Mission control tool - allows the agent to complete or fail the current mission. + +use async_trait::async_trait; +use serde::Deserialize; +use serde_json::{json, Value}; +use std::path::Path; +use std::sync::Arc; +use tokio::sync::{mpsc, RwLock}; +use uuid::Uuid; + +use super::Tool; + +/// Command sent by the mission tool to the control session. +#[derive(Debug, Clone)] +pub enum MissionControlCommand { + SetStatus { + status: MissionStatusValue, + summary: Option, + }, +} + +/// Mission status values (mirrors api::control::MissionStatus but simplified for tool use). +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MissionStatusValue { + Completed, + Failed, +} + +impl std::fmt::Display for MissionStatusValue { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Completed => write!(f, "completed"), + Self::Failed => write!(f, "failed"), + } + } +} + +/// Shared state for mission control, passed to the tool. +#[derive(Clone)] +pub struct MissionControl { + pub current_mission_id: Arc>>, + pub cmd_tx: mpsc::Sender, +} + +/// Tool that allows the agent to mark the current mission as completed or failed. +pub struct CompleteMission { + pub control: Option, +} + +impl CompleteMission { + pub fn new() -> Self { + Self { control: None } + } + + pub fn with_control(control: MissionControl) -> Self { + Self { + control: Some(control), + } + } +} + +#[derive(Debug, Deserialize)] +struct CompleteMissionArgs { + /// Status: "completed" or "failed" + status: String, + /// Optional summary explaining the outcome + summary: Option, +} + +#[async_trait] +impl Tool for CompleteMission { + fn name(&self) -> &str { + "complete_mission" + } + + fn description(&self) -> &str { + "Mark the current mission as completed or failed. Use this when you have finished the user's goal or when you cannot complete it. The user can still reopen or change the mission status later." + } + + fn parameters_schema(&self) -> Value { + json!({ + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["completed", "failed"], + "description": "The final status of the mission. Use 'completed' when the goal has been achieved, 'failed' when it cannot be completed." + }, + "summary": { + "type": "string", + "description": "Optional summary explaining the outcome (e.g., what was accomplished or why it failed)." + } + }, + "required": ["status"] + }) + } + + async fn execute(&self, args: Value, _working_dir: &Path) -> anyhow::Result { + let args: CompleteMissionArgs = serde_json::from_value(args) + .map_err(|e| anyhow::anyhow!("Invalid arguments: {}", e))?; + + let status = match args.status.to_lowercase().as_str() { + "completed" => MissionStatusValue::Completed, + "failed" => MissionStatusValue::Failed, + other => { + return Err(anyhow::anyhow!( + "Invalid status '{}'. Must be 'completed' or 'failed'.", + other + )) + } + }; + + let Some(control) = &self.control else { + return Ok("Mission control not available in this context. The mission status was not changed.".to_string()); + }; + + // Check if there's a current mission + let mission_id = control.current_mission_id.read().await.clone(); + if mission_id.is_none() { + return Ok("No active mission to complete. Start a mission first.".to_string()); + } + + // Send the command + control + .cmd_tx + .send(MissionControlCommand::SetStatus { + status, + summary: args.summary.clone(), + }) + .await + .map_err(|_| anyhow::anyhow!("Failed to send mission control command"))?; + + let summary_msg = args + .summary + .map(|s| format!(" Summary: {}", s)) + .unwrap_or_default(); + + Ok(format!( + "Mission marked as {}.{}", + status, summary_msg + )) + } +} diff --git a/src/tools/mod.rs b/src/tools/mod.rs index 5cccce6..5b50a6c 100644 --- a/src/tools/mod.rs +++ b/src/tools/mod.rs @@ -12,6 +12,7 @@ mod directory; mod file_ops; mod git; mod index; +pub mod mission; mod search; mod storage; mod terminal; @@ -61,6 +62,11 @@ pub struct ToolRegistry { impl ToolRegistry { /// Create a new registry with all default tools. pub fn new() -> Self { + Self::with_mission_control(None) + } + + /// Create a new registry with all default tools and optional mission control. + pub fn with_mission_control(mission_control: Option) -> Self { let mut tools: HashMap> = HashMap::new(); // File operations @@ -129,6 +135,13 @@ impl ToolRegistry { tools.insert("desktop_scroll".to_string(), Arc::new(desktop::Scroll)); } + // Mission control (allows agent to complete/fail missions) + let mission_tool: Arc = match mission_control { + Some(ctrl) => Arc::new(mission::CompleteMission::with_control(ctrl)), + None => Arc::new(mission::CompleteMission::new()), + }; + tools.insert("complete_mission".to_string(), mission_tool); + Self { tools } }