reflex-agent 0.6.0 → 0.7.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 (135) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +89 -89
  3. package/.next/app-path-routes-manifest.json +6 -6
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +7 -7
  6. package/.next/react-loadable-manifest.json +1 -1
  7. package/.next/server/app/_not-found/page.js +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/agents/[agentId]/page.js +3 -3
  10. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/[agentId]/respond/route.js +2 -2
  12. package/.next/server/app/api/agents/[agentId]/respond/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/images/[rootId]/[file]/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/oauth/start/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/roots/[id]/attachments/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route.js +2 -2
  18. package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route.js +2 -2
  20. package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route.js +2 -2
  22. package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/roots/[id]/dashboard/route.js +1 -1
  24. package/.next/server/app/api/roots/[id]/dashboard/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/roots/[id]/suggestions/route.js +1 -1
  26. package/.next/server/app/api/roots/[id]/suggestions/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/utilities/[scope]/[id]/host/route.js +2 -2
  29. package/.next/server/app/api/utilities/[scope]/[id]/host/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/utilities/[scope]/[id]/iframe/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/utilities/[scope]/[id]/style.css/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/audit/page.js +1 -1
  35. package/.next/server/app/audit/page.js.nft.json +1 -1
  36. package/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  37. package/.next/server/app/onboarding/page.js +2 -2
  38. package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  39. package/.next/server/app/page.js +2 -2
  40. package/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/roots/[id]/chat/[topicId]/page.js +2 -2
  43. package/.next/server/app/roots/[id]/chat/[topicId]/page.js.nft.json +1 -1
  44. package/.next/server/app/roots/[id]/chat/[topicId]/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/roots/[id]/kb/[...slug]/page.js +2 -2
  46. package/.next/server/app/roots/[id]/kb/[...slug]/page.js.nft.json +1 -1
  47. package/.next/server/app/roots/[id]/kb/[...slug]/page_client-reference-manifest.js +1 -1
  48. package/.next/server/app/roots/[id]/page.js +3 -3
  49. package/.next/server/app/roots/[id]/page.js.nft.json +1 -1
  50. package/.next/server/app/roots/[id]/page_client-reference-manifest.js +1 -1
  51. package/.next/server/app/roots/[id]/workflows/[wfId]/page.js +2 -2
  52. package/.next/server/app/roots/[id]/workflows/[wfId]/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/roots/[id]/workflows/page.js +1 -1
  54. package/.next/server/app/roots/[id]/workflows/page.js.nft.json +1 -1
  55. package/.next/server/app/roots/[id]/workflows/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/roots/new/page.js +3 -3
  57. package/.next/server/app/roots/new/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/settings/page.js +4 -4
  59. package/.next/server/app/settings/page.js.nft.json +1 -1
  60. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  61. package/.next/server/app/share/[id]/file/page.js +2 -2
  62. package/.next/server/app/share/[id]/file/page_client-reference-manifest.js +1 -1
  63. package/.next/server/app/share/[id]/page.js +2 -2
  64. package/.next/server/app/share/[id]/page.js.nft.json +1 -1
  65. package/.next/server/app/share/[id]/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/utilities/[scope]/[id]/page.js +2 -2
  67. package/.next/server/app/utilities/[scope]/[id]/page.js.nft.json +1 -1
  68. package/.next/server/app/utilities/[scope]/[id]/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/utilities/page.js +2 -2
  70. package/.next/server/app/utilities/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app-paths-manifest.json +6 -6
  72. package/.next/server/chunks/2318.js +1 -1
  73. package/.next/server/chunks/2559.js +1 -0
  74. package/.next/server/chunks/285.js +65 -14
  75. package/.next/server/chunks/3152.js +1 -1
  76. package/.next/server/chunks/3332.js +1 -1
  77. package/.next/server/chunks/3635.js +1 -0
  78. package/.next/server/chunks/383.js +1 -1
  79. package/.next/server/chunks/3868.js +4 -0
  80. package/.next/server/chunks/4812.js +1 -1
  81. package/.next/server/chunks/6149.js +3 -0
  82. package/.next/server/chunks/6909.js +63 -12
  83. package/.next/server/chunks/{6923.js → 6954.js} +1 -1
  84. package/.next/server/chunks/{9537.js → 8142.js} +1 -1
  85. package/.next/server/chunks/9098.js +1 -1
  86. package/.next/server/functions-config-manifest.json +3 -3
  87. package/.next/server/middleware-build-manifest.js +1 -1
  88. package/.next/server/middleware-manifest.json +5 -5
  89. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  90. package/.next/server/pages/500.html +1 -1
  91. package/.next/server/server-reference-manifest.js +1 -1
  92. package/.next/server/server-reference-manifest.json +1 -1
  93. package/.next/static/chunks/{2495-b11b2422a7f01945.js → 1580-740a1a70ef8ffa0d.js} +1 -1
  94. package/.next/static/chunks/1748-53319d5ec4411b05.js +1 -0
  95. package/.next/static/chunks/357-75ffe19a5d55a8b8.js +1 -0
  96. package/.next/static/chunks/4108.86e2092ff9db450c.js +1 -0
  97. package/.next/static/chunks/4971-85de3cd4fda214ae.js +1 -0
  98. package/.next/static/chunks/7882-2b0a83d718b55183.js +1 -0
  99. package/.next/static/chunks/app/{layout-9a1dc11fccf70758.js → layout-64e60b0b8e0282d7.js} +1 -1
  100. package/.next/static/chunks/app/onboarding/page-9601fcb7f4f95bf8.js +1 -0
  101. package/.next/static/chunks/app/{page-4f957a9ee1f7e2aa.js → page-7666e4bab61a7c9a.js} +1 -1
  102. package/.next/static/chunks/app/roots/[id]/chat/[topicId]/{page-971b4c18ab2192d8.js → page-790adae334559fee.js} +1 -1
  103. package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-50409258dd7f5deb.js +1 -0
  104. package/.next/static/chunks/app/roots/[id]/page-976f754ee926503d.js +1 -0
  105. package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-fcc5eebbf3ebc541.js +1 -0
  106. package/.next/static/chunks/app/roots/new/page-2d2e4524a5804faa.js +1 -0
  107. package/.next/static/chunks/app/settings/page-830a2dbc2d81d341.js +1 -0
  108. package/.next/static/chunks/app/share/[id]/page-fc9bee69ce1ab695.js +1 -0
  109. package/.next/static/chunks/app/utilities/[scope]/[id]/page-2fc8d46da0544044.js +1 -0
  110. package/.next/static/chunks/app/utilities/page-14013c0eaaa83a58.js +1 -0
  111. package/.next/static/chunks/{webpack-5087eda6b4198971.js → webpack-84a033e55baef334.js} +1 -1
  112. package/.next/static/css/c46d970256fc7904.css +1 -0
  113. package/.next/trace +89 -89
  114. package/package.json +1 -1
  115. package/.next/server/chunks/1469.js +0 -4
  116. package/.next/server/chunks/3475.js +0 -1
  117. package/.next/server/chunks/4959.js +0 -1
  118. package/.next/server/chunks/5236.js +0 -3
  119. package/.next/static/chunks/4108.74888011d3aa4cf8.js +0 -1
  120. package/.next/static/chunks/4546-6b7685845956a69f.js +0 -1
  121. package/.next/static/chunks/5407-2feacc6f9f69ba5d.js +0 -1
  122. package/.next/static/chunks/5434-407bb17ca2d631c9.js +0 -1
  123. package/.next/static/chunks/9348-912a9c1ec1da16dd.js +0 -1
  124. package/.next/static/chunks/app/onboarding/page-75acce6d5865dd64.js +0 -1
  125. package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-4c8addbba297f0f8.js +0 -1
  126. package/.next/static/chunks/app/roots/[id]/page-0ea2bcca25dec0d0.js +0 -1
  127. package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-6aa86d582b1f2bb0.js +0 -1
  128. package/.next/static/chunks/app/roots/new/page-b5f8ba6c3cd48d1b.js +0 -1
  129. package/.next/static/chunks/app/settings/page-5dde78a2421d0f4f.js +0 -1
  130. package/.next/static/chunks/app/share/[id]/page-162b9b2ab72f796f.js +0 -1
  131. package/.next/static/chunks/app/utilities/[scope]/[id]/page-891588bc6ce662f1.js +0 -1
  132. package/.next/static/chunks/app/utilities/page-8b0b3a9b569dcbe2.js +0 -1
  133. package/.next/static/css/60e9b6cdf1283e83.css +0 -1
  134. /package/.next/static/{-HzWlqabyti20irA-SaOJ → LRmct3V5fYVu_lgUdqH4x}/_buildManifest.js +0 -0
  135. /package/.next/static/{-HzWlqabyti20irA-SaOJ → LRmct3V5fYVu_lgUdqH4x}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ "use strict";exports.id=6149,exports.ids=[6149],exports.modules={7924:(a,b,c)=>{c.d(b,{h:()=>e});var d=c(3265);let e=(0,d.createServerReference)("7027419a080ac59b35fddc6e37eabafe99c092b625",d.callServer,void 0,d.findSourceMapURL,"generateTopicTitleAction")},12650:(a,b,c)=>{c.d(b,{E:()=>f});var d=c(64173),e=c(91344);function f({className:a,...b}){return(0,d.jsx)("div",{"data-slot":"skeleton",className:(0,e.cn)("animate-pulse rounded-md bg-accent",a),...b})}},14425:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]])},15620:(a,b,c)=>{c.d(b,{CommandBar:()=>o});var d=c(64173),e=c(17240),f=c(87671),g=c(71813),h=c(73569),i=c(44052),j=c(41414),k=c(7924),l=c(8836),m=c(88724),n=c(70199);function o({rootId:a,focusFile:b}){let c=(0,g.c)("roots"),[,o]=(0,e.useTransition)(),p=(0,f.useRouter)();return(0,d.jsx)(l.E,{label:c("commandBar.label"),children:(0,d.jsx)(n.L,{rootId:a,placeholder:c("commandBar.placeholder"),submitLabel:c("commandBar.submit"),pendingLabel:c("commandBar.submitPending"),SubmitIcon:h.A,onSubmit:async({message:d,attachments:e})=>await new Promise(f=>{o(async()=>{let g=await (0,j.g)(a,d,e,b);if(!g.ok){i.oR.error(g.error??c("commandBar.startFailed")),f(!1);return}(0,m.$d)(m.Zi.topicsChanged(a)),d.trim()&&(0,k.h)(a,g.topicId,d).then(b=>{b.ok&&(0,m.$d)(m.Zi.topicsChanged(a))}),p.push(`/roots/${a}/chat/${g.topicId}`),f(!0)})})})})}},16551:(a,b,c)=>{c.d(b,{Xi:()=>k,av:()=>l,j7:()=>j,tU:()=>h});var d=c(64173);c(17240);var e=c(20483),f=c(61193),g=c(91344);function h({className:a,orientation:b="horizontal",...c}){return(0,d.jsx)(f.Root,{"data-slot":"tabs","data-orientation":b,orientation:b,className:(0,g.cn)("group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",a),...c})}let i=(0,e.F)("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none",{variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent"}},defaultVariants:{variant:"default"}});function j({className:a,variant:b="default",...c}){return(0,d.jsx)(f.List,{"data-slot":"tabs-list","data-variant":b,className:(0,g.cn)(i({variant:b}),a),...c})}function k({className:a,...b}){return(0,d.jsx)(f.Trigger,{"data-slot":"tabs-trigger",className:(0,g.cn)("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent","data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",a),...b})}function l({className:a,...b}){return(0,d.jsx)(f.Content,{"data-slot":"tabs-content",className:(0,g.cn)("flex-1 outline-none",a),...b})}},16805:(a,b,c)=>{c.d(b,{ShareButton:()=>d});let d=(0,c(54491).registerClientReference)(function(){throw Error("Attempted to call ShareButton() from the server but ShareButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/reflex-agent/reflex-agent/app/_components/share-button.tsx","ShareButton")},21448:(a,b,c)=>{c.d(b,{ShareButton:()=>p});var d=c(64173),e=c(17240);let f=(0,c(42557).A)("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);var g=c(12619),h=c(28082),i=c(66979),j=c(42324),k=c(44052),l=c(71813),m=c(3265);let n=(0,m.createServerReference)("40d743a93d1471d5f57fe5f4440fb41cb460706bd1",m.callServer,void 0,m.findSourceMapURL,"createShareAction");var o=c(14810);function p(a){let b=(0,l.c)("app"),[c,m]=(0,e.useState)(!1),[p,q]=(0,e.useState)(""),[r,s]=(0,e.useTransition)(),[t,u]=(0,e.useState)(null);return c?t?(0,d.jsxs)("div",{className:"rounded border bg-card p-2 text-xs space-y-1.5 w-full max-w-sm",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5 text-emerald-700",children:[(0,d.jsx)(g.A,{className:"h-3.5 w-3.5"}),(0,d.jsx)("span",{className:"font-medium",children:b("share.button.createdTitle")})]}),(0,d.jsx)("a",{href:t.url,target:"_blank",rel:"noopener noreferrer",className:"block font-mono text-[11px] text-violet-700 hover:underline break-all",children:t.url}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsxs)("button",{type:"button",onClick:()=>void navigator.clipboard.writeText(t.url).then(()=>k.oR.success(b("share.button.copied"))),className:"inline-flex items-center gap-1 rounded border px-2 py-0.5 hover:bg-accent",children:[(0,d.jsx)(h.A,{className:"h-3 w-3"}),b("share.button.copy")]}),(0,d.jsx)("button",{type:"button",onClick:()=>{u(null),m(!1),q("")},className:"text-muted-foreground hover:text-foreground",children:b("share.button.done")})]})]}):(0,d.jsxs)("div",{className:"rounded border bg-card p-2 text-xs space-y-1.5 w-full max-w-sm",children:[(0,d.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,d.jsx)(f,{className:"h-3.5 w-3.5 text-violet-600"}),(0,d.jsx)("span",{className:"font-medium",children:b("share.button.newLink")}),(0,d.jsx)("button",{type:"button",onClick:()=>m(!1),className:"ml-auto text-muted-foreground hover:text-foreground",children:(0,d.jsx)(i.A,{className:"h-3 w-3"})})]}),(0,d.jsx)("label",{className:"block text-[10px] text-muted-foreground",children:b("share.button.passwordLabel")}),(0,d.jsxs)("div",{className:"relative",children:[(0,d.jsx)(j.A,{className:"absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground pointer-events-none"}),(0,d.jsx)("input",{type:"password",value:p,onChange:a=>q(a.target.value),autoFocus:!0,placeholder:b("share.button.passwordPlaceholder"),className:"w-full rounded border bg-background pl-6 pr-2 py-1 text-xs focus:outline-none focus:ring-1 focus:ring-violet-400"})]}),(0,d.jsx)("button",{type:"button",onClick:()=>{s(async()=>{let c=await (0,o.N)(),d=await n({kind:a.kind,...a.rootId?{rootId:a.rootId}:{},...a.utilityScope?{utilityScope:a.utilityScope}:{},...a.utilityId?{utilityId:a.utilityId}:{},...a.kbRelPath?{kbRelPath:a.kbRelPath}:{},...a.label?{label:a.label}:{},...p.trim()?{password:p.trim()}:{}});if(!d.ok)return void k.oR.error(d.error);let e=c.status.publicUrl??window.location.origin,f=new URL(`/share/${d.share.id}`,e).toString();u({share:d.share,url:f}),navigator.clipboard.writeText(f).catch(()=>null),k.oR.success(c.status.running?b("share.button.created"):b("share.button.createdNoTunnel"))})},disabled:r,className:"w-full rounded bg-violet-600 text-white px-2 py-1 hover:bg-violet-700 disabled:opacity-50 inline-flex items-center justify-center gap-1",children:r?b("share.button.creating"):b("share.button.create")}),(0,d.jsx)("p",{className:"text-[10px] text-muted-foreground",children:b("share.button.footer")})]}):(0,d.jsxs)("button",{type:"button",onClick:()=>m(!0),className:a.iconOnly?"p-1 rounded hover:bg-accent text-muted-foreground hover:text-violet-700":"inline-flex items-center gap-1 rounded border px-2 py-1 text-xs hover:bg-accent",title:b("share.button.title"),children:[(0,d.jsx)(f,{className:"h-3.5 w-3.5"}),!a.iconOnly&&b("share.button.label")]})}},27129:(a,b,c)=>{c.d(b,{Cz:()=>k,IK:()=>l,hN:()=>j,uA:()=>i});var d=c(73745);c(66493);var e=c(56942),f=c(53905),g=c(84579),h=c(91388);async function i(a){try{let b,c=await (0,g.generateImage)({rootId:a.rootId,prompt:a.prompt,...a.provider?{provider:a.provider}:{},...a.aspectRatio?{aspectRatio:a.aspectRatio}:{},...a.alt?{alt:a.alt}:{}}),d=n(a.alt||a.prompt),e=`![${d}](${c.urlPath})`;return a.attachToKb&&(b=await m(a.rootId,{title:a.alt||a.prompt.slice(0,80),markdown:e,meta:{provider:c.provider,prompt:a.prompt,sha:c.sha,...a.aspectRatio?{aspectRatio:a.aspectRatio}:{}}})),{ok:!0,url:c.urlPath,sha:c.sha,markdown:e,...b?{kbRelPath:b}:{}}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function j(a){try{let b=await (0,g.searchImages)({query:a.query,...a.provider?{provider:a.provider}:{},...a.count?{count:a.count}:{}});return{ok:!0,results:b}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function k(a){try{let b,c=await (0,g.attachRemote)({rootId:a.rootId,sourceUrl:a.sourceUrl}),d=n(a.alt||"image"),e=a.attribution?`
2
+
3
+ _Photo: [${a.attribution.name}](${a.attribution.link})_`:"",f=`![${d}](${c.urlPath})${e}`;return a.attachToKb&&(b=await m(a.rootId,{title:a.alt||"Found image",markdown:f,meta:{source:"web",sourceUrl:a.sourceUrl,sha:c.sha,...a.attribution?{author:a.attribution.name,authorUrl:a.attribution.link}:{}}})),{ok:!0,url:c.urlPath,sha:c.sha,markdown:f,...b?{kbRelPath:b}:{}}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function l(a){try{let b,c=Buffer.from(a.base64,"base64");if(0===c.byteLength)return{ok:!1,error:"Empty upload"};if(!a.mime.startsWith("image/"))return{ok:!1,error:`Unsupported mime: ${a.mime}`};let d=await (0,h.YN)(a.rootId,c,a.mime),e=n(a.alt||"image"),f=`![${e}](${d.urlPath})`;return a.attachToKb&&(b=await m(a.rootId,{title:a.alt||"Uploaded image",markdown:f,meta:{source:"upload",sha:d.sha,mime:a.mime}})),{ok:!0,url:d.urlPath,sha:d.sha,markdown:f,...b?{kbRelPath:b}:{}}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function m(a,b){let c=await (0,f.Zn)(a);if(!c)throw Error(`unknown rootId: ${a}`);return(await (0,e.j)({rootPath:c.path,directive:{kind:"image",title:b.title,body:b.markdown,meta:b.meta}})).relPath}function n(a){return a.replace(/[\[\]\n]/g," ").slice(0,200)}(0,c(63781).D)([i,j,k,l]),(0,d.A)(i,"4025f7fd383d7aaeba853004f970d2f5dc51fc1572",null),(0,d.A)(j,"407e1ec647ac47828a8f71dfd10fd41930d8abd913",null),(0,d.A)(k,"4069f9843caba5ad00f780f3ac4c4aa177d3013261",null),(0,d.A)(l,"40c58744e22bd7a5e6a79e2d723da9c8c61f5a7502",null)},29130:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]])},41414:(a,b,c)=>{c.d(b,{g:()=>e});var d=c(3265);let e=(0,d.createServerReference)("78c5512a5e07397f4abcfe04dfa901cfa1b305a904",d.callServer,void 0,d.findSourceMapURL,"startTopicAction")},42386:(a,b,c)=>{c.d(b,{InsertImageButton:()=>C});var d=c(64173),e=c(17240),f=c(87671),g=c(29130),h=c(71813),i=c(20583),j=c(66979),k=c(69552),l=c(65943);let m=(0,c(42557).A)("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);var n=c(44052),o=c(47071),p=c(45477),q=c(80281),r=c(71155),s=c(16551),t=c(27456),u=c(12650),v=c(3265);let w=(0,v.createServerReference)("4025f7fd383d7aaeba853004f970d2f5dc51fc1572",v.callServer,void 0,v.findSourceMapURL,"generateAction"),x=(0,v.createServerReference)("407e1ec647ac47828a8f71dfd10fd41930d8abd913",v.callServer,void 0,v.findSourceMapURL,"searchAction"),y=(0,v.createServerReference)("4069f9843caba5ad00f780f3ac4c4aa177d3013261",v.callServer,void 0,v.findSourceMapURL,"attachAction"),z=(0,v.createServerReference)("40c58744e22bd7a5e6a79e2d723da9c8c61f5a7502",v.callServer,void 0,v.findSourceMapURL,"uploadAction"),A=["1:1","16:9","9:16","4:3","3:4","21:9"];function B({rootId:a,open:b,onOpenChange:c,onInsert:f}){let v=(0,h.c)("app"),[B,C]=(0,e.useState)(""),[D,E]=(0,e.useState)("gemini"),[F,G]=(0,e.useState)("1:1"),[H,I]=(0,e.useState)(!0),[J,K]=(0,e.useState)(null),[L,M]=(0,e.useTransition)(),[N,O]=(0,e.useState)(""),[P,Q]=(0,e.useState)("unsplash"),[R,S]=(0,e.useState)([]),[T,U]=(0,e.useTransition)(),[V,W]=(0,e.useState)(null),[X,Y]=(0,e.useState)(!0),[Z,$]=(0,e.useState)(""),[_,aa]=(0,e.useState)(!0),[ab,ac]=(0,e.useTransition)();if(!b)return null;let ad=()=>{N.trim()&&(S([]),U(async()=>{let b=await x({rootId:a,query:N.trim(),provider:P,count:12});if(!b.ok)return void n.oR.error(b.error);S(b.results)}))};return(0,d.jsxs)("div",{className:"fixed inset-0 z-50 flex items-center justify-center p-4",onClick:a=>{a.target===a.currentTarget&&c(!1)},children:[(0,d.jsx)("div",{"aria-hidden":!0,className:"absolute inset-0 bg-background/80 backdrop-blur-sm",onClick:()=>c(!1)}),(0,d.jsxs)("div",{className:"relative bg-card border rounded-lg shadow-xl w-full max-w-3xl max-h-[85vh] flex flex-col",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 px-4 py-3 border-b",children:[(0,d.jsx)(g.A,{className:"h-4 w-4 text-violet-600"}),(0,d.jsx)("h2",{className:"text-sm font-medium flex-1",children:v("images.titleHeader")}),(0,d.jsx)(i.$,{type:"button",size:"icon",variant:"ghost",className:"h-7 w-7",onClick:()=>c(!1),children:(0,d.jsx)(j.A,{className:"h-4 w-4"})})]}),(0,d.jsxs)(s.tU,{defaultValue:"generate",className:"flex-1 min-h-0 flex flex-col",children:[(0,d.jsxs)(s.j7,{className:"mx-4 mt-3 self-start",children:[(0,d.jsxs)(s.Xi,{value:"generate",children:[(0,d.jsx)(k.A,{className:"mr-1 h-3.5 w-3.5"})," ",v("images.tabGenerate")]}),(0,d.jsxs)(s.Xi,{value:"search",children:[(0,d.jsx)(l.A,{className:"mr-1 h-3.5 w-3.5"})," ",v("images.tabSearch")]}),(0,d.jsxs)(s.Xi,{value:"upload",children:[(0,d.jsx)(m,{className:"mr-1 h-3.5 w-3.5"})," ",v("images.tabUpload")]})]}),(0,d.jsxs)(t.F,{className:"flex-1 min-h-0",children:[(0,d.jsxs)(s.av,{value:"generate",className:"px-4 py-4 space-y-3",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(q.J,{htmlFor:"img-prompt",children:v("images.promptLabel")}),(0,d.jsx)(p.T,{id:"img-prompt",value:B,onChange:a=>C(a.target.value),placeholder:v("images.promptPlaceholder"),rows:4})]}),(0,d.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(q.J,{children:v("images.providerLabel")}),(0,d.jsxs)(r.l6,{value:D,onValueChange:a=>E(a),children:[(0,d.jsx)(r.bq,{children:(0,d.jsx)(r.yv,{})}),(0,d.jsxs)(r.gC,{children:[(0,d.jsx)(r.eb,{value:"gemini",children:"Gemini Nano Banana"}),(0,d.jsx)(r.eb,{value:"codex",children:"Codex $imagegen"})]})]})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(q.J,{children:v("images.aspectLabel")}),(0,d.jsxs)(r.l6,{value:F,onValueChange:G,children:[(0,d.jsx)(r.bq,{children:(0,d.jsx)(r.yv,{})}),(0,d.jsx)(r.gC,{children:A.map(a=>(0,d.jsx)(r.eb,{value:a,children:a},a))})]})]})]}),(0,d.jsxs)("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[(0,d.jsx)("input",{type:"checkbox",checked:H,onChange:a=>I(a.target.checked)}),v("images.saveToKb")]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)(i.$,{type:"button",size:"sm",onClick:()=>{B.trim()&&(K(null),M(async()=>{let b=await w({rootId:a,prompt:B.trim(),provider:D,aspectRatio:F,attachToKb:H});if(!b.ok)return void n.oR.error(b.error);K({url:b.url,markdown:b.markdown,...b.kbRelPath?{kbRelPath:b.kbRelPath}:{}})}))},disabled:L||!B.trim(),children:L?v("images.generating"):v("images.generate")}),L&&(0,d.jsx)("span",{className:"text-xs text-muted-foreground",children:v("images.takesAMinute")})]}),L?(0,d.jsx)(u.E,{className:"h-64 w-full"}):J?(0,d.jsxs)("div",{className:"space-y-2 border rounded p-3",children:[(0,d.jsx)("img",{src:J.url,alt:B,className:"max-h-80 mx-auto rounded"}),(0,d.jsxs)("div",{className:"flex gap-2 justify-end",children:[(0,d.jsx)(i.$,{type:"button",size:"sm",variant:"outline",onClick:()=>K(null),children:v("images.again")}),(0,d.jsx)(i.$,{type:"button",size:"sm",onClick:()=>{J&&(f?.(J),n.oR.success(J.kbRelPath?v("images.savedToKb",{path:J.kbRelPath}):v("images.ready")),c(!1))},children:v("images.insert")})]})]}):null]}),(0,d.jsxs)(s.av,{value:"search",className:"px-4 py-4 space-y-3",children:[(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(o.p,{value:N,onChange:a=>O(a.target.value),placeholder:v("images.searchPlaceholder"),onKeyDown:a=>{"Enter"===a.key&&ad()}}),(0,d.jsxs)(r.l6,{value:P,onValueChange:a=>Q(a),children:[(0,d.jsx)(r.bq,{className:"w-36",children:(0,d.jsx)(r.yv,{})}),(0,d.jsxs)(r.gC,{children:[(0,d.jsx)(r.eb,{value:"unsplash",children:"Unsplash"}),(0,d.jsx)(r.eb,{value:"pexels",children:"Pexels"}),(0,d.jsx)(r.eb,{value:"brave",children:v("images.braveWeb")})]})]}),(0,d.jsx)(i.$,{type:"button",size:"sm",onClick:ad,disabled:T||!N.trim(),children:v("images.find")})]}),(0,d.jsxs)("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[(0,d.jsx)("input",{type:"checkbox",checked:X,onChange:a=>Y(a.target.checked)}),v("images.saveToKb")]}),T&&0===R.length?(0,d.jsx)("div",{className:"grid grid-cols-3 gap-2",children:Array.from({length:6}).map((a,b)=>(0,d.jsx)(u.E,{className:"h-32 w-full"},b))}):R.length>0?(0,d.jsx)("div",{className:"grid grid-cols-3 gap-2",children:R.map(b=>(0,d.jsxs)("button",{type:"button",disabled:null!==V,onClick:()=>{W(b.url),U(async()=>{let d=await y({rootId:a,sourceUrl:b.url,alt:N.trim()||"image",attribution:b.attribution,attachToKb:X});if(W(null),!d.ok)return void n.oR.error(d.error);f?.({url:d.url,markdown:d.markdown,...d.kbRelPath?{kbRelPath:d.kbRelPath}:{}}),n.oR.success(d.kbRelPath?v("images.savedToKb",{path:d.kbRelPath}):v("images.savedToProject")),c(!1)})},className:"group relative overflow-hidden rounded border hover:border-violet-500 disabled:opacity-50",title:`${b.attribution.name} \xb7 ${b.provider}`,children:[(0,d.jsx)("img",{src:b.thumb,alt:"",className:"h-32 w-full object-cover"}),(0,d.jsx)("div",{className:"absolute bottom-0 inset-x-0 px-1.5 py-0.5 text-[10px] bg-black/60 text-white truncate",children:b.attribution.name}),V===b.url&&(0,d.jsx)("div",{className:"absolute inset-0 bg-black/40 flex items-center justify-center text-xs text-white",children:v("images.saving")})]},b.url))}):(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:v("images.noKeys")})]}),(0,d.jsxs)(s.av,{value:"upload",className:"px-4 py-4 space-y-3",children:[(0,d.jsxs)("div",{className:"space-y-2",children:[(0,d.jsx)(q.J,{htmlFor:"img-alt",children:v("images.altLabel")}),(0,d.jsx)(o.p,{id:"img-alt",value:Z,onChange:a=>$(a.target.value),placeholder:v("images.altPlaceholder")})]}),(0,d.jsxs)("label",{className:"flex items-center gap-2 text-xs text-muted-foreground",children:[(0,d.jsx)("input",{type:"checkbox",checked:_,onChange:a=>aa(a.target.checked)}),v("images.saveToKb")]}),(0,d.jsx)(o.p,{type:"file",accept:"image/*",disabled:ab,onChange:b=>{let d=b.target.files?.[0];d&&ac(async()=>{let b=function(a){let b=new Uint8Array(a),c="";for(let a=0;a<b.length;a+=32768){let d=b.subarray(a,a+32768);c+=String.fromCharCode.apply(null,Array.from(d))}return btoa(c)}(await d.arrayBuffer()),e=await z({rootId:a,base64:b,mime:d.type,alt:Z||d.name.replace(/\.[^.]+$/,""),attachToKb:_});if(!e.ok)return void n.oR.error(e.error);f?.({url:e.url,markdown:e.markdown,...e.kbRelPath?{kbRelPath:e.kbRelPath}:{}}),n.oR.success(e.kbRelPath?v("images.savedToKb",{path:e.kbRelPath}):v("images.uploaded")),c(!1)})}}),ab&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:v("images.uploading")})]})]})]})]})]})}function C({rootId:a,redirectToKb:b=!0}){let[c,j]=(0,e.useState)(!1),k=(0,f.useRouter)(),l=(0,h.c)("app");return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(i.$,{type:"button",variant:"ghost",size:"sm",onClick:()=>j(!0),children:[(0,d.jsx)(g.A,{className:"mr-1 h-4 w-4"})," ",l("images.button")]}),(0,d.jsx)(B,{rootId:a,open:c,onOpenChange:j,onInsert:({kbRelPath:c})=>{if(b&&c){let b=c.split("/").map(encodeURIComponent).join("/");k.push(`/roots/${a}/kb/${b}`)}}})]})}},71155:(a,b,c)=>{c.d(b,{bq:()=>l,eb:()=>n,gC:()=>m,l6:()=>j,yv:()=>k});var d=c(64173);c(17240);var e=c(58405),f=c(12619),g=c(78724),h=c(13976),i=c(91344);function j({...a}){return(0,d.jsx)(h.Root,{"data-slot":"select",...a})}function k({...a}){return(0,d.jsx)(h.Value,{"data-slot":"select-value",...a})}function l({className:a,size:b="default",children:c,...f}){return(0,d.jsxs)(h.Trigger,{"data-slot":"select-trigger","data-size":b,className:(0,i.cn)("flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",a),...f,children:[c,(0,d.jsx)(h.Icon,{asChild:!0,children:(0,d.jsx)(e.A,{className:"size-4 opacity-50"})})]})}function m({className:a,children:b,position:c="item-aligned",align:e="center",...f}){return(0,d.jsx)(h.Portal,{children:(0,d.jsxs)(h.Content,{"data-slot":"select-content",className:(0,i.cn)("relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95","popper"===c&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",a),position:c,align:e,...f,children:[(0,d.jsx)(o,{}),(0,d.jsx)(h.Viewport,{className:(0,i.cn)("p-1","popper"===c&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:b}),(0,d.jsx)(p,{})]})})}function n({className:a,children:b,...c}){return(0,d.jsxs)(h.Item,{"data-slot":"select-item",className:(0,i.cn)("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",a),...c,children:[(0,d.jsx)("span",{"data-slot":"select-item-indicator",className:"absolute right-2 flex size-3.5 items-center justify-center",children:(0,d.jsx)(h.ItemIndicator,{children:(0,d.jsx)(f.A,{className:"size-4"})})}),(0,d.jsx)(h.ItemText,{children:b})]})}function o({className:a,...b}){return(0,d.jsx)(h.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:(0,i.cn)("flex cursor-default items-center justify-center py-1",a),...b,children:(0,d.jsx)(g.A,{className:"size-4"})})}function p({className:a,...b}){return(0,d.jsx)(h.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:(0,i.cn)("flex cursor-default items-center justify-center py-1",a),...b,children:(0,d.jsx)(e.A,{className:"size-4"})})}},78724:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]])},86673:(a,b,c)=>{c.d(b,{InsertImageButton:()=>d});let d=(0,c(54491).registerClientReference)(function(){throw Error("Attempted to call InsertImageButton() from the server but InsertImageButton is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/runner/work/reflex-agent/reflex-agent/app/_components/kb/insert-image-button.tsx","InsertImageButton")},88842:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(19963).A)("FolderOpen",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]])}};
@@ -43,7 +43,58 @@ Tell the user, in one paragraph, what was found and where it lives in the KB. If
43
43
  - Never answer from model memory; every claim flows through WebSearch/WebFetch via a sub-agent.
44
44
  - Don't fabricate dates. Use \`null\` if the page has no clear date.
45
45
  - Don't dispatch the same brief twice if a sub-agent returned empty — that's a Gap, not a retry case.
46
- - Failure modes degrade transparently: rate-limit / network error → mention it in Gaps, continue with what you have.`},{id:"widget-builder",title:"Widget builder",description:"Widget-creation helper - suggests the kind and data format.",author:"builtin",instructions:"## Skill: widget-builder\n\nYou help design and assemble a widget:\n 1. Clarify via `<<reflex:question>>` the widget's purpose and audience (for me alone / for the team / a report).\n 2. Pick the optimal `kind` - justify the choice out loud (one line).\n 3. If the widget needs data, gather it via WebFetch/WebSearch/Read before emitting.\n 4. Emit exactly one `<<reflex:widget-create>>` marker, with a thoughtful `id` and `refresh` cadence.\n 5. Tell the user how to edit the widget (pencil icon -> this same topic)."},{id:"memory-rollup",title:"Memory rollup (RECENT.md)",description:"Replace global RECENT.md with a fresh summary of the last week from journals and recent chats.",author:"builtin",instructions:'## Skill: memory-rollup\n\nRefresh the rolling 7-day memory file. Runs against the GLOBAL scope only — never touches per-project memory.\n\nProcedure:\n 1. Use `Glob` to list `.reflex/kb/journal/*.md` in this project. Read entries from the last 7 days (meta.date ≥ today-7).\n 2. Skim the topic titles + first message of recent chat topics — `Glob` on `.reflex/topics/*.md`, read frontmatter.\n 3. Synthesize: themes, recurring concerns, mood arc, unresolved threads, notable wins. ≤25 lines, one fact per line, terse and third-person about the user.\n 4. Emit exactly one marker — replaces the file in full:\n\n```\n<<reflex:memory>>{\n "scope": "global",\n "file": "RECENT",\n "op": "replace",\n "content": "<25-line summary, newline-joined>"\n}<</reflex:memory>>\n```\n\n 5. After the marker, give the user a 1-2 sentence wrap-up of the dominant theme.\n\nConstraints:\n - Don\'t write to PERSONA/VALUES/INTERESTS/etc. — only RECENT. Those files belong to durable facts, not weekly summaries.\n - Don\'t speculate. If the journal is thin (<4 entries), say so and skip the rollup.\n - Quote one or two of the user\'s own phrasings where they capture a theme. Sparingly.'},{id:"weekly-reflect",title:"Weekly reflection",description:"Read the last 14 journal entries and produce a themed reflection with a generated visual.",author:"builtin",instructions:`## Skill: weekly-reflect
46
+ - Failure modes degrade transparently: rate-limit / network error → mention it in Gaps, continue with what you have.`},{id:"widget-builder",title:"Widget builder",description:"Widget-creation helper - suggests the kind and data format.",author:"builtin",instructions:"## Skill: widget-builder\n\nYou help design and assemble a widget:\n 1. Clarify via `<<reflex:question>>` the widget's purpose and audience (for me alone / for the team / a report).\n 2. Pick the optimal `kind` - justify the choice out loud (one line).\n 3. If the widget needs data, gather it via WebFetch/WebSearch/Read before emitting.\n 4. Emit exactly one `<<reflex:widget-create>>` marker, with a thoughtful `id` and `refresh` cadence.\n 5. Tell the user how to edit the widget (pencil icon -> this same topic)."},{id:"space-onboarding",title:"Space onboarding",description:"Chat-driven intake for a new Space. Captures goals to project memory and proposes utilities, research, and widgets to set up.",author:"builtin",instructions:`## Skill: space-onboarding
47
+
48
+ You are running the first-conversation intake for a freshly-created Space (Reflex project). Goal of this conversation: understand WHY the user opened this Space well enough to propose 3-7 concrete next actions they can approve from the dashboard.
49
+
50
+ ### Tone
51
+ Like a thoughtful colleague taking notes on a napkin. Short questions, one at a time, no lecture. Don't ask the user to summarise their life — ask about THIS space.
52
+
53
+ ### Flow
54
+
55
+ Turn 1 (now): Open with one welcoming sentence and ONE focused question — what's this Space for, in one line? Don't preface with multi-paragraph rules.
56
+
57
+ Turns 2-4: Drill down. Aim for these axes, but order/wording adapts to what they said:
58
+ - **Outcome**: what does success look like here? ("by end of Q3 I want X", "a place to think out loud", "daily tracker")
59
+ - **Cadence**: daily, weekly, one-shot? Long-running or finite?
60
+ - **Inputs**: where will the raw material come from? (URLs, books, transactions, conversations, sensors)
61
+ - **Existing context**: do they already have notes/data sitting in the folder?
62
+ Ask AT MOST ONE question per turn. Two questions in a row makes them feel interrogated.
63
+
64
+ Turn ~4-6 (closing): Once you have a clear picture, switch to proposing.
65
+ 1. Write any durable facts the user mentioned into project memory via \`<<reflex:memory>>{scope:"project",...}\`. Especially:
66
+ - **GOALS** — concrete outcomes for this Space.
67
+ - **PERSONA** — what this Space IS (e.g. "PhD thesis on attention research", "daily fitness log").
68
+ - **INTERESTS** — sub-topics they want explored.
69
+ 2. If you learned something about the user's identity that transcends this Space ("I'm a vegetarian", "I have a 3yo daughter") → write to scope=global instead.
70
+ 3. Emit 3-7 \`<<reflex:suggestion>>\` markers — one per concrete next action you'd recommend.
71
+ 4. Tell the user, in 2 lines: "I've put suggestions on the dashboard — approve the ones you want and ignore the rest." STOP. Do NOT execute them yourself.
72
+
73
+ ### Suggestion marker shape
74
+
75
+ \`\`\`
76
+ <<reflex:suggestion>>{
77
+ "kind": "utility" | "research" | "widget" | "goal" | "skill",
78
+ "title": "<4-9 words, imperative>",
79
+ "description": "<one sentence saying WHY this fits>",
80
+ "prompt": "<exactly what to type into a new chat if approved — usually a slash command like /research, /widget, /util, /distill, or a plain message>"
81
+ }<</reflex:suggestion>>
82
+ \`\`\`
83
+
84
+ Examples by kind:
85
+ - **utility** → \`{kind:"utility",title:"Install Learn-anything",description:"You said you want a structured curriculum — this utility builds one.",prompt:"/util install learn-anything"}\`
86
+ - **research** → \`{kind:"research",title:"Survey resting-HRV trackers",description:"You want to track HRV; let's compare options first.",prompt:"/research best HRV tracking apps for everyday use, with citations"}\`
87
+ - **widget** → \`{kind:"widget",title:"Weekly run distance KPI",description:"You want a single number to check on Sunday.",prompt:"/widget weekly running distance KPI, refresh weekly"}\`
88
+ - **goal** → \`{kind:"goal",title:"Run a half-marathon by October",description:"Anchor goal you mentioned — keep it active.",prompt:"/goal run a half-marathon by 2026-10-15; weekly check-ins on training volume"}\`
89
+ - **skill** → \`{kind:"skill",title:"Use deep-research on study questions",description:"For literature reviews you'll want citation discipline.",prompt:"/skill deep-research"}\`
90
+
91
+ ### Rules
92
+
93
+ - Don't propose more than 7 suggestions. Quality > volume.
94
+ - Don't propose generic utilities (e.g. "unit-converter") unless the user clearly hinted they need one.
95
+ - Cite what they said when describing a suggestion ("Because you mentioned X…"). Makes it easy to approve/reject.
96
+ - Never start the topic for them. The dashboard's approve button does that — your job ends after the markers are out.
97
+ - If the user wraps up early ("that's enough", "let's just see what you suggest") — go straight to closing turn, propose with whatever signal you have.`},{id:"memory-rollup",title:"Memory rollup (RECENT.md)",description:"Replace global RECENT.md with a fresh summary of the last week from journals and recent chats.",author:"builtin",instructions:'## Skill: memory-rollup\n\nRefresh the rolling 7-day memory file. Runs against the GLOBAL scope only — never touches per-project memory.\n\nProcedure:\n 1. Use `Glob` to list `.reflex/kb/journal/*.md` in this project. Read entries from the last 7 days (meta.date ≥ today-7).\n 2. Skim the topic titles + first message of recent chat topics — `Glob` on `.reflex/topics/*.md`, read frontmatter.\n 3. Synthesize: themes, recurring concerns, mood arc, unresolved threads, notable wins. ≤25 lines, one fact per line, terse and third-person about the user.\n 4. Emit exactly one marker — replaces the file in full:\n\n```\n<<reflex:memory>>{\n "scope": "global",\n "file": "RECENT",\n "op": "replace",\n "content": "<25-line summary, newline-joined>"\n}<</reflex:memory>>\n```\n\n 5. After the marker, give the user a 1-2 sentence wrap-up of the dominant theme.\n\nConstraints:\n - Don\'t write to PERSONA/VALUES/INTERESTS/etc. — only RECENT. Those files belong to durable facts, not weekly summaries.\n - Don\'t speculate. If the journal is thin (<4 entries), say so and skip the rollup.\n - Quote one or two of the user\'s own phrasings where they capture a theme. Sparingly.'},{id:"weekly-reflect",title:"Weekly reflection",description:"Read the last 14 journal entries and produce a themed reflection with a generated visual.",author:"builtin",instructions:`## Skill: weekly-reflect
47
98
 
48
99
  Generate a weekly reflection from the user's recent journal entries.
49
100
 
@@ -138,7 +189,7 @@ Procedure:
138
189
  Constraints:
139
190
  - Don't ask more than 3 questions in step 4. Two-line max per question.
140
191
  - Don't speculate about feelings the user didn't state. Inferred mood is best-guess, not therapy.
141
- - If the user explicitly asks for a weekly review during this flow, switch to the \`/skill weekly-reflect\` flow.`}let o=15},11244:(a,b,c)=>{c.d(b,{SYSTEM_WIDGET_IDS:()=>e,VQ:()=>d,hU:()=>f});let d={hourly:36e5,daily:864e5,weekly:6048e5},e=["sys:active-goals","sys:pending","sys:recent-kb","sys:ai-suggestions"],f=["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map","utility-card"]},13295:(a,b,c)=>{c.d(b,{bp:()=>o,listWorkflows:()=>l,lq:()=>q,ni:()=>k,r$:()=>n,readWorkflow:()=>m,v:()=>p});var d=c(73024),e=c(76760),f=c.n(e),g=c(13474);function h(a){return f().join((0,g.FF)(a),"workflows")}function i(a,b){return f().join(h(a),`${k(b)}.json`)}function j(a,b){return f().join(h(a),"runs",k(b))}function k(a){return a.replace(/[^A-Za-z0-9_-]/g,"-").slice(0,80)}async function l(a){let b,c=h(a);try{b=await d.promises.readdir(c,{withFileTypes:!0})}catch{return[]}let e=[];for(let a of b)if(a.isFile()&&a.name.toLowerCase().endsWith(".json"))try{let b=await d.promises.readFile(f().join(c,a.name),"utf8"),g=JSON.parse(b);r(g)&&e.push(g)}catch{}return e.sort((a,b)=>a.updatedAt<b.updatedAt?1:-1),e}async function m(a,b){try{let c=await d.promises.readFile(i(a,b),"utf8"),e=JSON.parse(c);return r(e)?e:null}catch{return null}}async function n(a,b){if(!r(b))throw Error(`Invalid workflow (id=${b.id})`);await d.promises.mkdir(h(a),{recursive:!0}),await d.promises.writeFile(i(a,b.id),JSON.stringify(b,null,2)+"\n","utf8")}async function o(a,b){var c,e;await d.promises.mkdir(j(a,b.workflowId),{recursive:!0}),await d.promises.writeFile((c=b.workflowId,e=b.id,f().join(j(a,c),`${k(e)}.json`)),JSON.stringify(b,null,2)+"\n","utf8")}async function p(a,b,c=20){let e,g=j(a,b);try{e=await d.promises.readdir(g,{withFileTypes:!0})}catch{return[]}let h=(await Promise.all(e.filter(a=>a.isFile()&&a.name.toLowerCase().endsWith(".json")).map(async a=>{let b=f().join(g,a.name);try{let a=await d.promises.stat(b);return{abs:b,mtime:a.mtimeMs}}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>b.mtime-a.mtime).slice(0,c),i=[];for(let a of h)try{let b=await d.promises.readFile(a.abs,"utf8");i.push(JSON.parse(b))}catch{}return i}async function q(a,b){let c,e=j(a,b);try{c=await d.promises.readdir(e,{withFileTypes:!0})}catch{return}for(let a of(await Promise.all(c.filter(a=>a.isFile()&&a.name.toLowerCase().endsWith(".json")).map(async a=>{let b=f().join(e,a.name);try{let a=await d.promises.stat(b);return{abs:b,mtime:a.mtimeMs}}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>b.mtime-a.mtime).slice(50))await d.promises.unlink(a.abs).catch(()=>void 0)}function r(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&!!a.id&&"string"==typeof a.label&&!!Array.isArray(a.steps)&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt}},16909:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{z:()=>I});var e=c(78474),f=c(77598),g=c(74342),h=c(25713),i=c(22830),j=c(47423),k=c(96931),l=c(23956),m=c(18542),n=c(80958),o=c(59835),p=c(7188),q=c(13295),r=c(24058),s=c(49353),t=c(911),u=c(1701),v=c(35053),w=c(61105),x=c(17640),y=c(56843),z=c(8734),A=c(24776),B=a([h,m,r]);[h,m,r]=B.then?(await B)():B;class G{async ensureAgent(a){let b=this.byTopicRole.get(a.topicId)?.get(a.role);if(b){let a=this.agents.get(b);if(a)return{...a.meta}}return this.createAgent(a)}async createAgent(a){let b=E(),c={id:b,topicId:a.topicId,rootId:a.rootId,role:a.role,task:a.task,harness:a.harness,model:a.model,label:a.label,status:"idle",startedAt:C(),...a.parentId?{parentId:a.parentId}:{}};this.agents.set(b,{meta:c,rootPath:a.rootPath,reflexScope:a.reflexScope});let d=this.byTopicRole.get(a.topicId);return d||(d=new Map,this.byTopicRole.set(a.topicId,d)),d.set(a.role,b),await this.emit({type:"agent-start",meta:c,agentId:b,ts:c.startedAt,seq:0}),c}async invoke(a){let b=this.agents.get(a.agentId);if(!b)throw Error(`Agent not found: ${a.agentId}`);if("running"===b.meta.status)throw Error(`Agent ${a.agentId} is already running`);b.meta.status="running",this.lastInvoke.set(a.agentId,{systemPrompt:a.systemPrompt,rootPath:b.rootPath}),this.turnText.set(a.agentId,"");let c=E();a.userMessage&&await this.emit({type:"user-message",text:a.userMessage,agentId:a.agentId,ts:C(),seq:0}),await this.emit({type:"turn-start",turnId:c,agentId:a.agentId,ts:C(),seq:0});let d=null;try{d=await (0,t.Qr)(b.rootPath)}catch{}try{let e={meta:{id:b.meta.id},args:{rootPath:b.rootPath,reflexScope:b.reflexScope,systemPrompt:a.systemPrompt,prompt:a.prompt,model:b.meta.model,allowedTools:a.allowedTools??[]},manager:this};if("claude-code"===b.meta.harness)await (0,h.Z)(e);else if("codex"===b.meta.harness)await (0,i.H)(e);else if("ollama"===b.meta.harness)await (0,j.E)(e);else if("image-gen"===b.meta.harness)await (0,k.R)({meta:e.meta,args:{rootPath:e.args.rootPath,prompt:e.args.prompt},manager:e.manager});else throw Error(`Unsupported harness: ${String(b.meta.harness)}`);await this.applyImageGenDirectives(a.agentId);let f=await this.evaluateGoalContinuation(a.agentId);b.meta.status="idle",await this.emit({type:"turn-end",turnId:c,status:"completed",agentId:a.agentId,ts:C(),seq:0});let{writtenViaKb:g,dispatches:l,youtubeSummaries:m}=await this.detectInteractionDirectives(a.agentId);d&&await this.reindexAfterTurn(a.agentId,d,g),l.length>0&&"orchestrator"===b.meta.role?this.dispatchSubAgents(a.agentId,l).catch(b=>{this.emit({type:"error",message:"sub-agent dispatch failed: "+(b instanceof Error?b.message:String(b)),agentId:a.agentId,ts:C(),seq:0})}):m.length>0&&"orchestrator"===b.meta.role?this.runYoutubeSummaries(a.agentId,m).catch(b=>{this.emit({type:"error",message:"youtube-summary failed: "+(b instanceof Error?b.message:String(b)),agentId:a.agentId,ts:C(),seq:0})}):f&&setTimeout(()=>{this.continueTurn(a.agentId,`[Reflex /goal] Continue execution. Active goal: ${f.goal}. Iteration ${f.iteration}/${z.GX}. If the task is done AND verified, finish with the marker \`GOAL ACHIEVED\` and a kb-entry kind:"goal-completion".`)},50)}catch(e){let d=e instanceof Error?e.message:String(e);b.meta.status="idle",b.meta.error=d,await this.emit({type:"error",message:d,agentId:a.agentId,ts:C(),seq:0}),await this.emit({type:"turn-end",turnId:c,status:"failed",error:d,agentId:a.agentId,ts:C(),seq:0})}finally{this.turnText.delete(a.agentId)}}async respondPermission(a,b){let c,d=this.agents.get(a);if(!d)throw Error("Agent not found");let e="running"===d.meta.status;try{let a=(await (0,g.wj)(d.rootPath,d.meta.topicId)).find(a=>"permission-request"===a.type&&a.requestId===b.requestId);c=a?.action}catch{}await this.emit({type:"permission-response",requestId:b.requestId,decision:b.decision,...b.scope?{scope:b.scope}:{},agentId:a,ts:C(),seq:0});let f="";if("tool-policy"===c&&"allow"===b.decision&&b.tool)try{let a=await (0,x.M)(),c=d.meta.task,e=a.assignments[c];e&&!e.allowedTools.includes(b.tool)&&(e.allowedTools=[...e.allowedTools,b.tool],await (0,x.D)(a),f=` Tool ${b.tool} added to settings.assignments.${c}.allowedTools.`)}catch(b){await this.emit({type:"error",message:"Failed to save allowed tool: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:C(),seq:0})}let h=`[Reflex] Permission for ${b.tool??"action"} (${b.requestId}): ${b.decision}${b.scope?` (${b.scope})`:""}.${f} Continue.`;e||await this.continueTurn(a,h)}async respondQuestion(a,b){let c=this.agents.get(a);if(!c)throw Error("Agent not found");let d="running"===c.meta.status;await this.emit({type:"answer",questionId:b.questionId,answer:b.answer,agentId:a,ts:C(),seq:0});let e=`[Reflex] Answer for question ${b.questionId}: ${b.answer}. Continue.`;d||await this.continueTurn(a,e)}async respondMcpAdd(a,b){let d,e=this.agents.get(a),f=!!(e&&"running"===e.meta.status),h=null,i=e?.meta.topicId??null,j=e?.rootPath??null,k=this.pendingMcpAdds.get(b.requestId);if(k&&k.agentId===a)h=k.directive,this.pendingMcpAdds.delete(b.requestId);else{let a=await (0,u.az)(b.requestId);a&&(h=a.directive,i=i??a.topicId,j=j??a.rootPath)}if(!h)throw Error(`Unknown mcp-add request: ${b.requestId}`);let l=async a=>{if(e)return void await this.emit(a);if(i&&j){let b=await (0,g.v)(j,i);await (0,g.Zn)(j,i,{...a,seq:b})}};if("reject"===b.decision){await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:C(),seq:0}),d=`[Reflex] User rejected adding MCP server "${h.server}". Don't re-propose the same server — either pick a different approach or ask the user what they prefer.`,e&&!f&&await this.continueTurn(a,d);return}try{let e=await D(h.config,h.secrets??[],b.secretValues??{}),{McpConfigSchema:f}=await Promise.resolve().then(c.bind(c,88124)),g=f.parse(e),{addMcpServer:i,updateMcpServer:j,getMcpServer:k}=await Promise.resolve().then(c.bind(c,5243));await k(h.server)?await j(h.server,{label:h.label,...void 0!==h.description?{description:h.description}:{},config:g}):await i({id:h.server,label:h.label,...void 0!==h.description?{description:h.description}:{},config:g}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"approve",server:h.server,agentId:a,ts:C(),seq:0}),d=`[Reflex] MCP server "${h.server}" registered. You can now call its tools via \`mcp__${h.server}__<tool>\` (chat) or \`reflex.mcp.call({server:"${h.server}",tool,args})\` (from a utility that declared it in manifest.mcpServers). Continue.`}catch(e){let c=e instanceof Error?e.message:String(e);await l({type:"error",message:"mcp-add failed: "+c,agentId:a,ts:C(),seq:0}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:C(),seq:0}),d=`[Reflex] Failed to register MCP server "${h.server}": ${c}. Don't retry the exact same config; either fix the issue or ask the user.`}e&&!f&&await this.continueTurn(a,d)}async continueTurn(a,b){let c=this.agents.get(a);if(!c)return;let d=this.lastInvoke.get(a);if(!d)return void await this.emit({type:"error",message:"Cannot continue turn: no cached system prompt. Send another message manually.",agentId:a,ts:C(),seq:0});let e=[];try{let a=await (0,x.M)();e=a.assignments[c.meta.task]?.allowedTools??[]}catch{}let f=await F(d.rootPath,c.meta.topicId),g=`Prior conversation:
192
+ - If the user explicitly asks for a weekly review during this flow, switch to the \`/skill weekly-reflect\` flow.`}let o=15},11244:(a,b,c)=>{c.d(b,{SYSTEM_WIDGET_IDS:()=>e,VQ:()=>d,hU:()=>f});let d={hourly:36e5,daily:864e5,weekly:6048e5},e=["sys:active-goals","sys:pending","sys:recent-kb","sys:ai-suggestions"],f=["markdown","news-list","link-list","kpi","checklist","quote","kb-pinned","progress","image","stat-table","map","utility-card"]},13295:(a,b,c)=>{c.d(b,{bp:()=>o,listWorkflows:()=>l,lq:()=>q,ni:()=>k,r$:()=>n,readWorkflow:()=>m,v:()=>p});var d=c(73024),e=c(76760),f=c.n(e),g=c(13474);function h(a){return f().join((0,g.FF)(a),"workflows")}function i(a,b){return f().join(h(a),`${k(b)}.json`)}function j(a,b){return f().join(h(a),"runs",k(b))}function k(a){return a.replace(/[^A-Za-z0-9_-]/g,"-").slice(0,80)}async function l(a){let b,c=h(a);try{b=await d.promises.readdir(c,{withFileTypes:!0})}catch{return[]}let e=[];for(let a of b)if(a.isFile()&&a.name.toLowerCase().endsWith(".json"))try{let b=await d.promises.readFile(f().join(c,a.name),"utf8"),g=JSON.parse(b);r(g)&&e.push(g)}catch{}return e.sort((a,b)=>a.updatedAt<b.updatedAt?1:-1),e}async function m(a,b){try{let c=await d.promises.readFile(i(a,b),"utf8"),e=JSON.parse(c);return r(e)?e:null}catch{return null}}async function n(a,b){if(!r(b))throw Error(`Invalid workflow (id=${b.id})`);await d.promises.mkdir(h(a),{recursive:!0}),await d.promises.writeFile(i(a,b.id),JSON.stringify(b,null,2)+"\n","utf8")}async function o(a,b){var c,e;await d.promises.mkdir(j(a,b.workflowId),{recursive:!0}),await d.promises.writeFile((c=b.workflowId,e=b.id,f().join(j(a,c),`${k(e)}.json`)),JSON.stringify(b,null,2)+"\n","utf8")}async function p(a,b,c=20){let e,g=j(a,b);try{e=await d.promises.readdir(g,{withFileTypes:!0})}catch{return[]}let h=(await Promise.all(e.filter(a=>a.isFile()&&a.name.toLowerCase().endsWith(".json")).map(async a=>{let b=f().join(g,a.name);try{let a=await d.promises.stat(b);return{abs:b,mtime:a.mtimeMs}}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>b.mtime-a.mtime).slice(0,c),i=[];for(let a of h)try{let b=await d.promises.readFile(a.abs,"utf8");i.push(JSON.parse(b))}catch{}return i}async function q(a,b){let c,e=j(a,b);try{c=await d.promises.readdir(e,{withFileTypes:!0})}catch{return}for(let a of(await Promise.all(c.filter(a=>a.isFile()&&a.name.toLowerCase().endsWith(".json")).map(async a=>{let b=f().join(e,a.name);try{let a=await d.promises.stat(b);return{abs:b,mtime:a.mtimeMs}}catch{return null}}))).filter(a=>null!==a).sort((a,b)=>b.mtime-a.mtime).slice(50))await d.promises.unlink(a.abs).catch(()=>void 0)}function r(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&!!a.id&&"string"==typeof a.label&&!!Array.isArray(a.steps)&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt}},16909:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{z:()=>J});var e=c(78474),f=c(77598),g=c(74342),h=c(25713),i=c(22830),j=c(47423),k=c(96931),l=c(23956),m=c(18542),n=c(80958),o=c(97604),p=c(59835),q=c(7188),r=c(13295),s=c(24058),t=c(49353),u=c(911),v=c(1701),w=c(35053),x=c(61105),y=c(17640),z=c(56843),A=c(8734),B=c(24776),C=a([h,m,s]);[h,m,s]=C.then?(await C)():C;class H{async ensureAgent(a){let b=this.byTopicRole.get(a.topicId)?.get(a.role);if(b){let a=this.agents.get(b);if(a)return{...a.meta}}return this.createAgent(a)}async createAgent(a){let b=F(),c={id:b,topicId:a.topicId,rootId:a.rootId,role:a.role,task:a.task,harness:a.harness,model:a.model,label:a.label,status:"idle",startedAt:D(),...a.parentId?{parentId:a.parentId}:{}};this.agents.set(b,{meta:c,rootPath:a.rootPath,reflexScope:a.reflexScope});let d=this.byTopicRole.get(a.topicId);return d||(d=new Map,this.byTopicRole.set(a.topicId,d)),d.set(a.role,b),await this.emit({type:"agent-start",meta:c,agentId:b,ts:c.startedAt,seq:0}),c}async invoke(a){let b=this.agents.get(a.agentId);if(!b)throw Error(`Agent not found: ${a.agentId}`);if("running"===b.meta.status)throw Error(`Agent ${a.agentId} is already running`);b.meta.status="running",this.lastInvoke.set(a.agentId,{systemPrompt:a.systemPrompt,rootPath:b.rootPath}),this.turnText.set(a.agentId,"");let c=F();a.userMessage&&await this.emit({type:"user-message",text:a.userMessage,agentId:a.agentId,ts:D(),seq:0}),await this.emit({type:"turn-start",turnId:c,agentId:a.agentId,ts:D(),seq:0});let d=null;try{d=await (0,u.Qr)(b.rootPath)}catch{}try{let e={meta:{id:b.meta.id},args:{rootPath:b.rootPath,reflexScope:b.reflexScope,systemPrompt:a.systemPrompt,prompt:a.prompt,model:b.meta.model,allowedTools:a.allowedTools??[]},manager:this};if("claude-code"===b.meta.harness)await (0,h.Z)(e);else if("codex"===b.meta.harness)await (0,i.H)(e);else if("ollama"===b.meta.harness)await (0,j.E)(e);else if("image-gen"===b.meta.harness)await (0,k.R)({meta:e.meta,args:{rootPath:e.args.rootPath,prompt:e.args.prompt},manager:e.manager});else throw Error(`Unsupported harness: ${String(b.meta.harness)}`);await this.applyImageGenDirectives(a.agentId);let f=await this.evaluateGoalContinuation(a.agentId);b.meta.status="idle",await this.emit({type:"turn-end",turnId:c,status:"completed",agentId:a.agentId,ts:D(),seq:0});let{writtenViaKb:g,dispatches:l,youtubeSummaries:m}=await this.detectInteractionDirectives(a.agentId);d&&await this.reindexAfterTurn(a.agentId,d,g),l.length>0&&"orchestrator"===b.meta.role?this.dispatchSubAgents(a.agentId,l).catch(b=>{this.emit({type:"error",message:"sub-agent dispatch failed: "+(b instanceof Error?b.message:String(b)),agentId:a.agentId,ts:D(),seq:0})}):m.length>0&&"orchestrator"===b.meta.role?this.runYoutubeSummaries(a.agentId,m).catch(b=>{this.emit({type:"error",message:"youtube-summary failed: "+(b instanceof Error?b.message:String(b)),agentId:a.agentId,ts:D(),seq:0})}):f&&setTimeout(()=>{this.continueTurn(a.agentId,`[Reflex /goal] Continue execution. Active goal: ${f.goal}. Iteration ${f.iteration}/${A.GX}. If the task is done AND verified, finish with the marker \`GOAL ACHIEVED\` and a kb-entry kind:"goal-completion".`)},50)}catch(e){let d=e instanceof Error?e.message:String(e);b.meta.status="idle",b.meta.error=d,await this.emit({type:"error",message:d,agentId:a.agentId,ts:D(),seq:0}),await this.emit({type:"turn-end",turnId:c,status:"failed",error:d,agentId:a.agentId,ts:D(),seq:0})}finally{this.turnText.delete(a.agentId)}}async respondPermission(a,b){let c,d=this.agents.get(a);if(!d)throw Error("Agent not found");let e="running"===d.meta.status;try{let a=(await (0,g.wj)(d.rootPath,d.meta.topicId)).find(a=>"permission-request"===a.type&&a.requestId===b.requestId);c=a?.action}catch{}await this.emit({type:"permission-response",requestId:b.requestId,decision:b.decision,...b.scope?{scope:b.scope}:{},agentId:a,ts:D(),seq:0});let f="";if("tool-policy"===c&&"allow"===b.decision&&b.tool)try{let a=await (0,y.M)(),c=d.meta.task,e=a.assignments[c];e&&!e.allowedTools.includes(b.tool)&&(e.allowedTools=[...e.allowedTools,b.tool],await (0,y.D)(a),f=` Tool ${b.tool} added to settings.assignments.${c}.allowedTools.`)}catch(b){await this.emit({type:"error",message:"Failed to save allowed tool: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:D(),seq:0})}let h=`[Reflex] Permission for ${b.tool??"action"} (${b.requestId}): ${b.decision}${b.scope?` (${b.scope})`:""}.${f} Continue.`;e||await this.continueTurn(a,h)}async respondQuestion(a,b){let c=this.agents.get(a);if(!c)throw Error("Agent not found");let d="running"===c.meta.status;await this.emit({type:"answer",questionId:b.questionId,answer:b.answer,agentId:a,ts:D(),seq:0});let e=`[Reflex] Answer for question ${b.questionId}: ${b.answer}. Continue.`;d||await this.continueTurn(a,e)}async respondMcpAdd(a,b){let d,e=this.agents.get(a),f=!!(e&&"running"===e.meta.status),h=null,i=e?.meta.topicId??null,j=e?.rootPath??null,k=this.pendingMcpAdds.get(b.requestId);if(k&&k.agentId===a)h=k.directive,this.pendingMcpAdds.delete(b.requestId);else{let a=await (0,v.az)(b.requestId);a&&(h=a.directive,i=i??a.topicId,j=j??a.rootPath)}if(!h)throw Error(`Unknown mcp-add request: ${b.requestId}`);let l=async a=>{if(e)return void await this.emit(a);if(i&&j){let b=await (0,g.v)(j,i);await (0,g.Zn)(j,i,{...a,seq:b})}};if("reject"===b.decision){await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:D(),seq:0}),d=`[Reflex] User rejected adding MCP server "${h.server}". Don't re-propose the same server — either pick a different approach or ask the user what they prefer.`,e&&!f&&await this.continueTurn(a,d);return}try{let e=await E(h.config,h.secrets??[],b.secretValues??{}),{McpConfigSchema:f}=await Promise.resolve().then(c.bind(c,88124)),g=f.parse(e),{addMcpServer:i,updateMcpServer:j,getMcpServer:k}=await Promise.resolve().then(c.bind(c,5243));await k(h.server)?await j(h.server,{label:h.label,...void 0!==h.description?{description:h.description}:{},config:g}):await i({id:h.server,label:h.label,...void 0!==h.description?{description:h.description}:{},config:g}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"approve",server:h.server,agentId:a,ts:D(),seq:0}),d=`[Reflex] MCP server "${h.server}" registered. You can now call its tools via \`mcp__${h.server}__<tool>\` (chat) or \`reflex.mcp.call({server:"${h.server}",tool,args})\` (from a utility that declared it in manifest.mcpServers). Continue.`}catch(e){let c=e instanceof Error?e.message:String(e);await l({type:"error",message:"mcp-add failed: "+c,agentId:a,ts:D(),seq:0}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:D(),seq:0}),d=`[Reflex] Failed to register MCP server "${h.server}": ${c}. Don't retry the exact same config; either fix the issue or ask the user.`}e&&!f&&await this.continueTurn(a,d)}async continueTurn(a,b){let c=this.agents.get(a);if(!c)return;let d=this.lastInvoke.get(a);if(!d)return void await this.emit({type:"error",message:"Cannot continue turn: no cached system prompt. Send another message manually.",agentId:a,ts:D(),seq:0});let e=[];try{let a=await (0,y.M)();e=a.assignments[c.meta.task]?.allowedTools??[]}catch{}let f=await G(d.rootPath,c.meta.topicId),g=`Prior conversation:
142
193
 
143
194
  ${f}
144
195
 
@@ -146,27 +197,27 @@ ${f}
146
197
  ${b}
147
198
 
148
199
  ### assistant
149
- (Reply now.)`;this.invoke({agentId:a,systemPrompt:d.systemPrompt,prompt:g,userMessage:b,allowedTools:e}).catch(()=>{})}async evaluateGoalContinuation(a){let b,c=this.agents.get(a);if(!c||"orchestrator"!==c.meta.role)return null;try{b=await (0,y.eF)(c.rootPath,c.meta.topicId)}catch{return null}if(!b)return null;let d=b.meta;if(!d.goal||"active"!==d.goalStatus)return null;let e=this.turnText.get(a)??"";if(/(^|\n)\s*GOAL ACHIEVED\s*(\n|$)/i.test(e)||/<<reflex:kb>>[\s\S]*?"kind"\s*:\s*"goal-completion"[\s\S]*?<<\/reflex:kb>>/i.test(e)){try{await (0,y._9)(c.rootPath,c.meta.topicId,"completed")}catch{}return null}if(/<<reflex:(?:question|permission)>>[\s\S]*?<<\/reflex:(?:question|permission)>>/i.test(e))return null;try{let b=await (0,y.o0)(c.rootPath,c.meta.topicId);if(b>z.GX)return await (0,y._9)(c.rootPath,c.meta.topicId,"abandoned"),await this.emit({type:"error",message:`Goal iteration cap reached (${z.GX}). Goal marked as abandoned — clear or restart via /goal to keep trying.`,agentId:a,ts:C(),seq:0}),null;return{goal:d.goal,iteration:b}}catch{return null}}async reindexAfterTurn(a,b,c=new Set){let d=this.agents.get(a);if(d)try{let e=(await (0,t.pV)(d.rootPath,b)).filter(a=>!c.has(a.abs));if(0===e.length)return;for(let b of(await (0,t.F8)(d.rootPath,e),e))await this.emit({type:"kb-write",kind:b.kind??"note",title:b.title??b.rel,relPath:b.rel,absPath:b.abs,agentId:a,ts:C(),seq:0})}catch(b){await this.emit({type:"error",message:"kb auto-index failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:C(),seq:0})}}async dispatchSubAgents(a,b){let c=this.agents.get(a);if(!c)return;let d=await (0,x.M)(),e=c.meta.harness,f=c.meta.model,g=d.language,h=(await Promise.all(b.map(async b=>{var d;let h=b.role,i=A.pO[h],j=E(),k=b.harness&&(d=b.harness,H.has(d))?b.harness:e,l="string"==typeof b.model&&b.model.length>0?b.model:f,m={id:j,topicId:c.meta.topicId,rootId:c.meta.rootId,role:"subagent",task:c.meta.task,harness:k,model:l,label:i.label,status:"idle",startedAt:C(),parentId:a};this.agents.set(j,{meta:m,rootPath:c.rootPath,reflexScope:c.reflexScope}),await this.emit({type:"agent-start",meta:m,agentId:j,ts:C(),seq:0});let n=i.systemPrompt({language:g,root:c.rootPath,reflexScope:c.reflexScope,brief:b.brief}),o=b.brief,p=`${o}
200
+ (Reply now.)`;this.invoke({agentId:a,systemPrompt:d.systemPrompt,prompt:g,userMessage:b,allowedTools:e}).catch(()=>{})}async evaluateGoalContinuation(a){let b,c=this.agents.get(a);if(!c||"orchestrator"!==c.meta.role)return null;try{b=await (0,z.eF)(c.rootPath,c.meta.topicId)}catch{return null}if(!b)return null;let d=b.meta;if(!d.goal||"active"!==d.goalStatus)return null;let e=this.turnText.get(a)??"";if(/(^|\n)\s*GOAL ACHIEVED\s*(\n|$)/i.test(e)||/<<reflex:kb>>[\s\S]*?"kind"\s*:\s*"goal-completion"[\s\S]*?<<\/reflex:kb>>/i.test(e)){try{await (0,z._9)(c.rootPath,c.meta.topicId,"completed")}catch{}return null}if(/<<reflex:(?:question|permission)>>[\s\S]*?<<\/reflex:(?:question|permission)>>/i.test(e))return null;try{let b=await (0,z.o0)(c.rootPath,c.meta.topicId);if(b>A.GX)return await (0,z._9)(c.rootPath,c.meta.topicId,"abandoned"),await this.emit({type:"error",message:`Goal iteration cap reached (${A.GX}). Goal marked as abandoned — clear or restart via /goal to keep trying.`,agentId:a,ts:D(),seq:0}),null;return{goal:d.goal,iteration:b}}catch{return null}}async reindexAfterTurn(a,b,c=new Set){let d=this.agents.get(a);if(d)try{let e=(await (0,u.pV)(d.rootPath,b)).filter(a=>!c.has(a.abs));if(0===e.length)return;for(let b of(await (0,u.F8)(d.rootPath,e),e))await this.emit({type:"kb-write",kind:b.kind??"note",title:b.title??b.rel,relPath:b.rel,absPath:b.abs,agentId:a,ts:D(),seq:0})}catch(b){await this.emit({type:"error",message:"kb auto-index failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:D(),seq:0})}}async dispatchSubAgents(a,b){let c=this.agents.get(a);if(!c)return;let d=await (0,y.M)(),e=c.meta.harness,f=c.meta.model,g=d.language,h=(await Promise.all(b.map(async b=>{var d;let h=b.role,i=B.pO[h],j=F(),k=b.harness&&(d=b.harness,I.has(d))?b.harness:e,l="string"==typeof b.model&&b.model.length>0?b.model:f,m={id:j,topicId:c.meta.topicId,rootId:c.meta.rootId,role:"subagent",task:c.meta.task,harness:k,model:l,label:i.label,status:"idle",startedAt:D(),parentId:a};this.agents.set(j,{meta:m,rootPath:c.rootPath,reflexScope:c.reflexScope}),await this.emit({type:"agent-start",meta:m,agentId:j,ts:D(),seq:0});let n=i.systemPrompt({language:g,root:c.rootPath,reflexScope:c.reflexScope,brief:b.brief}),o=b.brief,p=`${o}
150
201
 
151
202
  ### assistant
152
- (Reply now.)`;try{await this.invoke({agentId:j,systemPrompt:n,prompt:p,userMessage:o,allowedTools:i.allowedTools})}catch(c){let a=c instanceof Error?c.message:String(c);return await this.emit({type:"error",message:`sub-agent (${h}) failed: ${a}`,agentId:j,ts:C(),seq:0}),await this.destroy(j,"failed"),{role:h,id:b.id??j,brief:b.brief,output:"",error:a}}let q=(this.turnText.get(j)??"").trim();return await this.destroy(j,"completed"),{role:h,id:b.id??j,brief:b.brief,output:q}}))).map(a=>{let b=`### sub-agent: ${a.role}${a.id?` [${a.id}]`:""}`,c=`**Brief:** ${a.brief.replace(/\n+/g," ").trim()}`,d=a.error?`_failed_ — ${a.error}`:a.output.length>0?a.output:"_(no output)_";return[b,c,"",d].join("\n")}),i=["[Reflex] Sub-agent results follow. Use them to compose the user-facing reply. Do NOT re-dispatch the same brief; if a result is empty or insufficient, either solve it yourself or ask the user.","",...h].join("\n\n");await this.continueTurn(a,i)}async detectInteractionDirectives(a){let b=new Set,d=this.turnText.get(a)??"";if(!d)return{writtenViaKb:b,dispatches:[],youtubeSummaries:[]};let e=this.agents.get(a);for(let b of(0,l.gQ)(d))await this.emit({type:"permission-request",requestId:b.id??E(),...b.tool?{tool:b.tool}:{},...b.action?{action:b.action}:{},...void 0!==b.input?{input:b.input}:{},...b.description?{description:b.description}:{},agentId:a,ts:C(),seq:0});for(let b of(0,l.dJ)(d))await this.emit({type:"question",questionId:b.id??E(),prompt:b.prompt,...b.header?{header:b.header}:{},...b.multiSelect?{multiSelect:!0}:{},...b.choices?{choices:b.choices}:{},...b.options?{options:b.options}:{},agentId:a,ts:C(),seq:0});for(let b of(0,l.eD)(d)){let c=b.id??E();this.pendingMcpAdds.set(c,{agentId:a,directive:b}),e&&await (0,u.GC)({requestId:c,agentId:a,topicId:e.meta.topicId,rootPath:e.rootPath,directive:b}),await this.emit({type:"mcp-add-request",requestId:c,server:b.server,label:b.label,...b.description?{description:b.description}:{},config:function(a,b){if(!a||"object"!=typeof a)return a;let c=a.transport,d="stdio"===c?"env":"http"===c||"sse"===c?"headers":null;if(!d)return a;let e=new Set(b.map(a=>a.envKey));if(0===e.size)return a;let f=a[d];if(!f||"object"!=typeof f)return a;let g={};for(let[a,b]of Object.entries(f))g[a]=e.has(a)?"***":String(b);return{...a,[d]:g}}(b.config,b.secrets??[]),...b.secrets&&b.secrets.length>0?{secrets:b.secrets}:{},agentId:a,ts:C(),seq:0})}if(e){for(let c of(0,l.Bc)(d))try{let d=await (0,s.j)({rootPath:e.rootPath,directive:c});b.add(d.absPath),await this.emit({type:"kb-write",kind:d.kind,title:d.title,relPath:d.relPath,absPath:d.absPath,agentId:a,ts:C(),seq:0})}catch(b){await this.emit({type:"error",message:"kb-write failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:C(),seq:0})}for(let b of(await this.processMemoryWrites(d,a,e.rootPath),(0,l.Oo)(d)))try{let d=b.manifest&&"object"==typeof b.manifest?b.manifest:{},f=d.source&&"object"==typeof d.source?d.source:{},{source:g,...h}=d,i=v.pL.parse(h),j=["agent","github","archive","mcp"],k="string"==typeof f.type&&j.includes(f.type)?f.type:"agent",l=await (0,w.gd)({scope:b.scope,..."project"===b.scope?{rootId:e.meta.rootId}:{},manifest:i,files:b.files,source:{type:k,origin:"string"==typeof f.origin?f.origin:`agent:${e.meta.rootId}:${e.meta.topicId}:${e.meta.id}`,fetchedAt:new Date().toISOString(),installedBy:"agent"}}),m=await c.e(7300).then(c.bind(c,47300));await m.buildUtility(l),await this.emit({type:"utility-installed",utilityId:l.manifest.id,scope:l.scope,name:l.manifest.name,version:l.manifest.version,agentId:a,ts:C(),seq:0})}catch(b){await this.emit({type:"utility-error",message:"utility install failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:C(),seq:0})}}let f=(0,l.Eb)(d).filter(a=>(0,A.Aq)(a.role)),g=(0,l.XZ)(d),h=(0,l.Dq)(d),i=(0,l.Up)(d);e&&(h.length>0||i.length>0)&&await this.applyWidgetDirectives(e.rootPath,e.meta.topicId,a,h,i);let j=(0,l.QN)(d);return e&&j.length>0&&await this.applyWorkflowDirectives(e.rootPath,e.meta.topicId,a,j),{writtenViaKb:b,dispatches:f,youtubeSummaries:g}}async applyImageGenDirectives(a){let b=this.agents.get(a);if(!b)return;let c=this.turnText.get(a)??"";if(!c||!c.includes("reflex:image-gen"))return;let d=(0,l.qk)(c);if(0!==d.length)for(let c of d)try{let d=await (0,o.generateImage)({rootId:b.meta.rootId,prompt:c.prompt,...c.provider?{provider:c.provider}:{},...c.size?{size:c.size}:{},...c.aspectRatio?{aspectRatio:c.aspectRatio}:{},...c.referenceImageUrls?{referenceImageUrls:c.referenceImageUrls}:{}}),e=(c.caption||c.prompt).replace(/[\[\]\n]/g," ").slice(0,200);if(await this.emit({type:"assistant-delta",text:`
203
+ (Reply now.)`;try{await this.invoke({agentId:j,systemPrompt:n,prompt:p,userMessage:o,allowedTools:i.allowedTools})}catch(c){let a=c instanceof Error?c.message:String(c);return await this.emit({type:"error",message:`sub-agent (${h}) failed: ${a}`,agentId:j,ts:D(),seq:0}),await this.destroy(j,"failed"),{role:h,id:b.id??j,brief:b.brief,output:"",error:a}}let q=(this.turnText.get(j)??"").trim();return await this.destroy(j,"completed"),{role:h,id:b.id??j,brief:b.brief,output:q}}))).map(a=>{let b=`### sub-agent: ${a.role}${a.id?` [${a.id}]`:""}`,c=`**Brief:** ${a.brief.replace(/\n+/g," ").trim()}`,d=a.error?`_failed_ — ${a.error}`:a.output.length>0?a.output:"_(no output)_";return[b,c,"",d].join("\n")}),i=["[Reflex] Sub-agent results follow. Use them to compose the user-facing reply. Do NOT re-dispatch the same brief; if a result is empty or insufficient, either solve it yourself or ask the user.","",...h].join("\n\n");await this.continueTurn(a,i)}async detectInteractionDirectives(a){let b=new Set,d=this.turnText.get(a)??"";if(!d)return{writtenViaKb:b,dispatches:[],youtubeSummaries:[]};let e=this.agents.get(a);for(let b of(0,l.gQ)(d))await this.emit({type:"permission-request",requestId:b.id??F(),...b.tool?{tool:b.tool}:{},...b.action?{action:b.action}:{},...void 0!==b.input?{input:b.input}:{},...b.description?{description:b.description}:{},agentId:a,ts:D(),seq:0});for(let b of(0,l.dJ)(d))await this.emit({type:"question",questionId:b.id??F(),prompt:b.prompt,...b.header?{header:b.header}:{},...b.multiSelect?{multiSelect:!0}:{},...b.choices?{choices:b.choices}:{},...b.options?{options:b.options}:{},agentId:a,ts:D(),seq:0});for(let b of(0,l.eD)(d)){let c=b.id??F();this.pendingMcpAdds.set(c,{agentId:a,directive:b}),e&&await (0,v.GC)({requestId:c,agentId:a,topicId:e.meta.topicId,rootPath:e.rootPath,directive:b}),await this.emit({type:"mcp-add-request",requestId:c,server:b.server,label:b.label,...b.description?{description:b.description}:{},config:function(a,b){if(!a||"object"!=typeof a)return a;let c=a.transport,d="stdio"===c?"env":"http"===c||"sse"===c?"headers":null;if(!d)return a;let e=new Set(b.map(a=>a.envKey));if(0===e.size)return a;let f=a[d];if(!f||"object"!=typeof f)return a;let g={};for(let[a,b]of Object.entries(f))g[a]=e.has(a)?"***":String(b);return{...a,[d]:g}}(b.config,b.secrets??[]),...b.secrets&&b.secrets.length>0?{secrets:b.secrets}:{},agentId:a,ts:D(),seq:0})}if(e){for(let c of(0,l.Bc)(d))try{let d=await (0,t.j)({rootPath:e.rootPath,directive:c});b.add(d.absPath),await this.emit({type:"kb-write",kind:d.kind,title:d.title,relPath:d.relPath,absPath:d.absPath,agentId:a,ts:D(),seq:0})}catch(b){await this.emit({type:"error",message:"kb-write failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:D(),seq:0})}for(let b of(await this.processMemoryWrites(d,a,e.rootPath),await this.processSuggestions(d,a,e.rootPath,e.meta.topicId),(0,l.Oo)(d)))try{let d=b.manifest&&"object"==typeof b.manifest?b.manifest:{},f=d.source&&"object"==typeof d.source?d.source:{},{source:g,...h}=d,i=w.pL.parse(h),j=["agent","github","archive","mcp"],k="string"==typeof f.type&&j.includes(f.type)?f.type:"agent",l=await (0,x.gd)({scope:b.scope,..."project"===b.scope?{rootId:e.meta.rootId}:{},manifest:i,files:b.files,source:{type:k,origin:"string"==typeof f.origin?f.origin:`agent:${e.meta.rootId}:${e.meta.topicId}:${e.meta.id}`,fetchedAt:new Date().toISOString(),installedBy:"agent"}}),m=await c.e(7300).then(c.bind(c,47300));await m.buildUtility(l),await this.emit({type:"utility-installed",utilityId:l.manifest.id,scope:l.scope,name:l.manifest.name,version:l.manifest.version,agentId:a,ts:D(),seq:0})}catch(b){await this.emit({type:"utility-error",message:"utility install failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:D(),seq:0})}}let f=(0,l.Eb)(d).filter(a=>(0,B.Aq)(a.role)),g=(0,l.XZ)(d),h=(0,l.Dq)(d),i=(0,l.Up)(d);e&&(h.length>0||i.length>0)&&await this.applyWidgetDirectives(e.rootPath,e.meta.topicId,a,h,i);let j=(0,l.QN)(d);return e&&j.length>0&&await this.applyWorkflowDirectives(e.rootPath,e.meta.topicId,a,j),{writtenViaKb:b,dispatches:f,youtubeSummaries:g}}async applyImageGenDirectives(a){let b=this.agents.get(a);if(!b)return;let c=this.turnText.get(a)??"";if(!c||!c.includes("reflex:image-gen"))return;let d=(0,l.qk)(c);if(0!==d.length)for(let c of d)try{let d=await (0,p.generateImage)({rootId:b.meta.rootId,prompt:c.prompt,...c.provider?{provider:c.provider}:{},...c.size?{size:c.size}:{},...c.aspectRatio?{aspectRatio:c.aspectRatio}:{},...c.referenceImageUrls?{referenceImageUrls:c.referenceImageUrls}:{}}),e=(c.caption||c.prompt).replace(/[\[\]\n]/g," ").slice(0,200);if(await this.emit({type:"assistant-delta",text:`
153
204
 
154
205
  ![${e}](${d.urlPath})
155
- `,agentId:a,ts:C(),seq:0}),c.attachToKb)try{let f=await (0,s.j)({rootPath:b.rootPath,directive:{kind:"image",title:c.caption||c.prompt.slice(0,80),body:`![${e}](${d.urlPath})`,meta:{provider:d.provider,prompt:c.prompt,sha:d.sha,...c.aspectRatio?{aspectRatio:c.aspectRatio}:{}}}});await this.emit({type:"kb-write",kind:f.kind,title:f.title,relPath:f.relPath,absPath:f.absPath,agentId:a,ts:C(),seq:0})}catch(b){await this.emit({type:"error",message:"image-gen kb attach failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:C(),seq:0})}}catch(b){await this.emit({type:"assistant-delta",text:`
206
+ `,agentId:a,ts:D(),seq:0}),c.attachToKb)try{let f=await (0,t.j)({rootPath:b.rootPath,directive:{kind:"image",title:c.caption||c.prompt.slice(0,80),body:`![${e}](${d.urlPath})`,meta:{provider:d.provider,prompt:c.prompt,sha:d.sha,...c.aspectRatio?{aspectRatio:c.aspectRatio}:{}}}});await this.emit({type:"kb-write",kind:f.kind,title:f.title,relPath:f.relPath,absPath:f.absPath,agentId:a,ts:D(),seq:0})}catch(b){await this.emit({type:"error",message:"image-gen kb attach failed: "+(b instanceof Error?b.message:String(b)),agentId:a,ts:D(),seq:0})}}catch(b){await this.emit({type:"assistant-delta",text:`
156
207
 
157
208
  _Failed to generate image: ${b instanceof Error?b.message:String(b)}_
158
- `,agentId:a,ts:C(),seq:0})}}async processMemoryWrites(a,b,c){for(let d of(0,l.tS)(a))try{if(!(0,n.qL)(d.scope)||!(0,n.UV)(d.file)||!(0,n.Tf)(d.op)){await this.emit({type:"error",message:`memory-write: bad marker (scope=${d.scope}, file=${d.file}, op=${d.op})`,agentId:b,ts:C(),seq:0});continue}let a="global"===d.scope?{scope:"global"}:{scope:"project",rootPath:c},e=await (0,m.xP)(a,d.file,d.op,{...void 0!==d.content?{content:d.content}:{},...void 0!==d.match?{match:d.match}:{}});if(!e.ok){await this.emit({type:"error",message:`memory-write rejected (${e.error}) for ${d.scope}/${d.file}`,agentId:b,ts:C(),seq:0});continue}await this.emit({type:"memory-write",scope:d.scope,file:d.file,op:d.op,lines:e.lines,cap:e.cap,agentId:b,ts:C(),seq:0})}catch(a){await this.emit({type:"error",message:"memory-write failed: "+(a instanceof Error?a.message:String(a)),agentId:b,ts:C(),seq:0})}}async applyWorkflowDirectives(a,b,c,d){for(let e of d)try{let d=(0,q.ni)(e.id);if(!d)throw Error("Workflow id is empty");let f=new Date().toISOString(),g=e.steps.map((a,b)=>({id:(0,q.ni)(a.id??`step-${b+1}`),kind:a.kind,label:a.label,params:a.params??{}})),h={id:d,label:e.label,...e.description?{description:e.description}:{},trigger:e.trigger??"manual",steps:g,createdAt:f,updatedAt:f,sourceTopicId:b},i=(0,r.n)(h);if(i)throw Error(i);await (0,q.r$)(a,h),await this.emit({type:"workflow-event",workflowId:h.id,label:h.label,...h.description?{description:h.description}:{},trigger:h.trigger,stepCount:h.steps.length,sourceTopicId:b,agentId:c,ts:f,seq:0})}catch(a){await this.emit({type:"workflow-error",workflowId:e.id,message:"workflow-create failed: "+(a instanceof Error?a.message:String(a)),agentId:c,ts:C(),seq:0})}}async applyWidgetDirectives(a,b,c,d,e){let f=await (0,p.readLayout)(a),g=[...f.order],h=[...f.hidden];for(let f of[...d,...e]){let d=e.includes(f);try{let e={kind:f.kind,data:f.data},i=d?await (0,p.readWidget)(a,f.id):null,j=(0,p.buildRecord)({id:f.id,title:f.title,...f.description?{description:f.description}:{},sourceTopicId:b,payload:e,existing:i,...f.size?{size:f.size}:{},...f.refresh?{refresh:f.refresh}:{},...void 0!==f.memory?{memory:f.memory}:{},...f.memoryFile?{memoryFile:f.memoryFile}:{}});await (0,p.writeWidget)(a,j),i||h.includes(j.id)||g.includes(j.id)||h.push(j.id),await this.emit({type:"widget-event",op:d&&i?"update":"create",widgetId:j.id,title:j.title,...j.description?{description:j.description}:{},kind:j.kind,data:j.data,sourceTopicId:b,agentId:c,ts:C(),seq:0})}catch(a){await this.emit({type:"widget-error",widgetId:f.id,message:(d?"widget-update":"widget-create")+" failed: "+(a instanceof Error?a.message:String(a)),agentId:c,ts:C(),seq:0})}}await (0,p.writeLayout)(a,{order:g,hidden:h})}async runYoutubeSummaries(a,b){if(!this.agents.get(a))return;await this.emit({type:"system",text:`Starting Gemini YouTube summary (${b.length}):
159
- ${b.map(a=>`• ${a.url}`).join("\n")}`,subtype:"reflex.preflight",agentId:a,ts:C(),seq:0});let{summarizeYoutubeAction:d}=await Promise.resolve().then(c.bind(c,18746)),e=await Promise.all(b.map(async a=>{let b=await d({url:a.url,...a.prompt?{prompt:a.prompt}:{}});return b.ok?{url:a.url,text:b.text,model:b.model}:{url:a.url,error:b.error}})),f=e.map(a=>"text"in a?[`### youtube-summary ${a.url}`,`_(Gemini ${a.model} — use as primary source; do not WebFetch the same URL.)_`,"",a.text].join("\n"):`### youtube-summary ${a.url}
160
- _(Gemini failed: ${a.error}. Notify the user and suggest saving the key in Settings -> Gemini, or answer without the summary.)_`);await this.emit({type:"system",text:e.every(a=>"text"in a)?"Summaries received, passing to the agent.":"Some summaries failed — details are in the context.",subtype:"reflex.preflight",agentId:a,ts:C(),seq:0});let g=`[Reflex] Gemini YouTube summaries you requested:
209
+ `,agentId:a,ts:D(),seq:0})}}async processMemoryWrites(a,b,c){for(let d of(0,l.tS)(a))try{if(!(0,n.qL)(d.scope)||!(0,n.UV)(d.file)||!(0,n.Tf)(d.op)){await this.emit({type:"error",message:`memory-write: bad marker (scope=${d.scope}, file=${d.file}, op=${d.op})`,agentId:b,ts:D(),seq:0});continue}let a="global"===d.scope?{scope:"global"}:{scope:"project",rootPath:c},e=await (0,m.xP)(a,d.file,d.op,{...void 0!==d.content?{content:d.content}:{},...void 0!==d.match?{match:d.match}:{}});if(!e.ok){await this.emit({type:"error",message:`memory-write rejected (${e.error}) for ${d.scope}/${d.file}`,agentId:b,ts:D(),seq:0});continue}await this.emit({type:"memory-write",scope:d.scope,file:d.file,op:d.op,lines:e.lines,cap:e.cap,agentId:b,ts:D(),seq:0})}catch(a){await this.emit({type:"error",message:"memory-write failed: "+(a instanceof Error?a.message:String(a)),agentId:b,ts:D(),seq:0})}}async processSuggestions(a,b,c,d){for(let e of(0,l.fU)(a))try{if(!o.vT.includes(e.kind)||!e.title?.trim()||!e.prompt?.trim()){await this.emit({type:"error",message:`suggestion rejected: invalid shape (kind=${e.kind})`,agentId:b,ts:D(),seq:0});continue}let a=await (0,o.Ed)(c,{kind:e.kind,title:e.title,description:e.description??"",prompt:e.prompt,sourceTopicId:d});await this.emit({type:"suggestion-added",suggestionId:a.id,kind:a.kind,title:a.title,agentId:b,ts:D(),seq:0})}catch(a){await this.emit({type:"error",message:"suggestion failed: "+(a instanceof Error?a.message:String(a)),agentId:b,ts:D(),seq:0})}}async applyWorkflowDirectives(a,b,c,d){for(let e of d)try{let d=(0,r.ni)(e.id);if(!d)throw Error("Workflow id is empty");let f=new Date().toISOString(),g=e.steps.map((a,b)=>({id:(0,r.ni)(a.id??`step-${b+1}`),kind:a.kind,label:a.label,params:a.params??{}})),h={id:d,label:e.label,...e.description?{description:e.description}:{},trigger:e.trigger??"manual",steps:g,createdAt:f,updatedAt:f,sourceTopicId:b},i=(0,s.n)(h);if(i)throw Error(i);await (0,r.r$)(a,h),await this.emit({type:"workflow-event",workflowId:h.id,label:h.label,...h.description?{description:h.description}:{},trigger:h.trigger,stepCount:h.steps.length,sourceTopicId:b,agentId:c,ts:f,seq:0})}catch(a){await this.emit({type:"workflow-error",workflowId:e.id,message:"workflow-create failed: "+(a instanceof Error?a.message:String(a)),agentId:c,ts:D(),seq:0})}}async applyWidgetDirectives(a,b,c,d,e){let f=await (0,q.readLayout)(a),g=[...f.order],h=[...f.hidden];for(let f of[...d,...e]){let d=e.includes(f);try{let e={kind:f.kind,data:f.data},i=d?await (0,q.readWidget)(a,f.id):null,j=(0,q.buildRecord)({id:f.id,title:f.title,...f.description?{description:f.description}:{},sourceTopicId:b,payload:e,existing:i,...f.size?{size:f.size}:{},...f.refresh?{refresh:f.refresh}:{},...void 0!==f.memory?{memory:f.memory}:{},...f.memoryFile?{memoryFile:f.memoryFile}:{}});await (0,q.writeWidget)(a,j),i||h.includes(j.id)||g.includes(j.id)||h.push(j.id),await this.emit({type:"widget-event",op:d&&i?"update":"create",widgetId:j.id,title:j.title,...j.description?{description:j.description}:{},kind:j.kind,data:j.data,sourceTopicId:b,agentId:c,ts:D(),seq:0})}catch(a){await this.emit({type:"widget-error",widgetId:f.id,message:(d?"widget-update":"widget-create")+" failed: "+(a instanceof Error?a.message:String(a)),agentId:c,ts:D(),seq:0})}}await (0,q.writeLayout)(a,{order:g,hidden:h})}async runYoutubeSummaries(a,b){if(!this.agents.get(a))return;await this.emit({type:"system",text:`Starting Gemini YouTube summary (${b.length}):
210
+ ${b.map(a=>`• ${a.url}`).join("\n")}`,subtype:"reflex.preflight",agentId:a,ts:D(),seq:0});let{summarizeYoutubeAction:d}=await Promise.resolve().then(c.bind(c,18746)),e=await Promise.all(b.map(async a=>{let b=await d({url:a.url,...a.prompt?{prompt:a.prompt}:{}});return b.ok?{url:a.url,text:b.text,model:b.model}:{url:a.url,error:b.error}})),f=e.map(a=>"text"in a?[`### youtube-summary ${a.url}`,`_(Gemini ${a.model} — use as primary source; do not WebFetch the same URL.)_`,"",a.text].join("\n"):`### youtube-summary ${a.url}
211
+ _(Gemini failed: ${a.error}. Notify the user and suggest saving the key in Settings -> Gemini, or answer without the summary.)_`);await this.emit({type:"system",text:e.every(a=>"text"in a)?"Summaries received, passing to the agent.":"Some summaries failed — details are in the context.",subtype:"reflex.preflight",agentId:a,ts:D(),seq:0});let g=`[Reflex] Gemini YouTube summaries you requested:
161
212
 
162
213
  ${f.join("\n\n")}
163
214
 
164
- Now answer the user based on this context. Do not repeat the summaries verbatim — compose a human-readable response.`;await this.continueTurn(a,g)}async destroy(a,b="completed"){let c=this.agents.get(a);if(!c)return;c.meta.status=b,c.meta.endedAt=C(),await this.emit({type:"agent-end",status:b,agentId:a,ts:c.meta.endedAt,seq:0}),this.agents.delete(a),this.turnText.delete(a),this.lastInvoke.delete(a);let d=this.byTopicRole.get(c.meta.topicId);if(d){for(let[b,c]of d)c===a&&d.delete(b);0===d.size&&this.byTopicRole.delete(c.meta.topicId)}}async emit(a){let b=this.agents.get(a.agentId);if(!b)return;let c=await (0,g.v)(b.rootPath,b.meta.topicId),d={...a,seq:c};if(await (0,g.Zn)(b.rootPath,b.meta.topicId,d),"assistant-delta"===a.type){let b=this.turnText.get(a.agentId)??"";this.turnText.set(a.agentId,b+a.text)}this.emitter.emit(`topic:${b.meta.topicId}`,d),this.emitter.emit(`agent:${a.agentId}`,d)}subscribeTopic(a,b){let c=`topic:${a}`;return this.emitter.on(c,b),()=>this.emitter.off(c,b)}subscribeAgent(a,b){let c=`agent:${a}`;return this.emitter.on(c,b),()=>this.emitter.off(c,b)}list(a){let b=[];for(let c of this.agents.values())(!a?.topicId||c.meta.topicId===a.topicId)&&(a?.rootId&&c.meta.rootId!==a.rootId||b.push({...c.meta}));return b.sort((a,b)=>Date.parse(b.startedAt)-Date.parse(a.startedAt)),b}get(a){let b=this.agents.get(a);return b?{...b.meta}:null}isActive(a){let b=this.byTopicRole.get(a);if(!b)return!1;for(let a of b.values()){let b=this.agents.get(a);if(b?.meta.status==="running")return!0}return!1}listRunningTopicsForRoot(a){let b=new Set;for(let c of this.agents.values())c.meta.rootId===a&&"running"===c.meta.status&&b.add(c.meta.topicId);return[...b]}async stopTopic(a){let b=[];for(let[c,d]of this.agents)d.meta.topicId===a&&b.push(c);let c=0;for(let a of b){let b=this.agents.get(a);b&&"running"===b.meta.status&&(await this.destroy(a,"cancelled"),c+=1)}return{stopped:c}}constructor(){this.agents=new Map,this.byTopicRole=new Map,this.emitter=new e.EventEmitter,this.turnText=new Map,this.lastInvoke=new Map,this.pendingMcpAdds=new Map}}function C(){return new Date().toISOString()}let H=new Set(["claude-code","codex","ollama","image-gen"]);async function D(a,b,d){if(!a||"object"!=typeof a)return a;let e={...a},f=e.transport,g="stdio"===f?"env":"http"===f||"sse"===f?"headers":null;if(!g)return e;let h=e[g]??{},i={};for(let[a,b]of Object.entries(h))i[a]=String(b);for(let a of b){if(a.oauth){let{getOAuthTokens:b}=await c.e(6730).then(c.bind(c,96730)),{isOAuthProviderId:d}=await c.e(3657).then(c.bind(c,63657));if(!d(a.oauth))throw Error(`unknown OAuth provider: ${a.oauth}`);if(!await b(a.oauth))throw Error(`provider "${a.oauth}" not authorized — open Settings → OAuth and Authorize first`);i[a.envKey]=`$oauth:${a.oauth}`;continue}let b=d[a.envKey];if(void 0!==b&&""!==b)i[a.envKey]=b;else if(a.required)throw Error(`secret "${a.envKey}" is required`);else delete i[a.envKey]}return e[g]=i,e}function E(){return(0,f.randomUUID)().replace(/-/g,"").slice(0,12)}async function F(a,b){let c=await (0,g.wj)(a,b),d=[],e=null,f=()=>{e&&(d.push(`### ${e.role}
165
- ${e.text.trim()}`),e=null)};for(let a of c)"user-message"===a.type?(f(),e={role:"user",text:a.text},f()):"assistant-delta"===a.type?(e&&"assistant"===e.role||(f(),e={role:"assistant",text:""}),e.text+=a.text):("turn-end"===a.type||"agent-end"===a.type)&&f();return f(),d.join("\n\n")}let I=globalThis.__reflexAgentManager??new G;globalThis.__reflexAgentManager=I,c.e(3240).then(c.bind(c,93240)).then(a=>a.startWidgetScheduler()).catch(a=>{console.error("[widget-scheduler] failed to start:",a)}),d()}catch(a){d(a)}})},18542:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ab:()=>p,xP:()=>r});var e=c(73024),f=c(76760),g=c.n(f),h=c(29163),i=c(17640),j=c(99048),k=c(80958),l=a([j]);function m(a,b){return g().join(function(a){if("global"===a.scope)return g().join((0,h._)(),"memory");if(!a.rootPath)throw Error("project memory requires rootPath");return g().join(a.rootPath,".reflex","memory")}(a),`${b}.md`)}function n(a){let b=a.trim();return b?b.split("\n").length:0}async function o(a,b){try{let c=(await e.promises.readFile(m(a,b),"utf8")).replace(/\s+$/,"");return{file:b,content:c||null,lines:n(c)}}catch{return{file:b,content:null,lines:0}}}async function p(a){let b=await Promise.all(k.cs.map(b=>o(a,b))),c={};for(let a of b)c[a.file]=a;return c}async function q(a,b){await e.promises.mkdir(g().dirname(a),{recursive:!0}),await e.promises.writeFile(a,b.endsWith("\n")?b:`${b}
215
+ Now answer the user based on this context. Do not repeat the summaries verbatim — compose a human-readable response.`;await this.continueTurn(a,g)}async destroy(a,b="completed"){let c=this.agents.get(a);if(!c)return;c.meta.status=b,c.meta.endedAt=D(),await this.emit({type:"agent-end",status:b,agentId:a,ts:c.meta.endedAt,seq:0}),this.agents.delete(a),this.turnText.delete(a),this.lastInvoke.delete(a);let d=this.byTopicRole.get(c.meta.topicId);if(d){for(let[b,c]of d)c===a&&d.delete(b);0===d.size&&this.byTopicRole.delete(c.meta.topicId)}}async emit(a){let b=this.agents.get(a.agentId);if(!b)return;let c=await (0,g.v)(b.rootPath,b.meta.topicId),d={...a,seq:c};if(await (0,g.Zn)(b.rootPath,b.meta.topicId,d),"assistant-delta"===a.type){let b=this.turnText.get(a.agentId)??"";this.turnText.set(a.agentId,b+a.text)}this.emitter.emit(`topic:${b.meta.topicId}`,d),this.emitter.emit(`agent:${a.agentId}`,d)}subscribeTopic(a,b){let c=`topic:${a}`;return this.emitter.on(c,b),()=>this.emitter.off(c,b)}subscribeAgent(a,b){let c=`agent:${a}`;return this.emitter.on(c,b),()=>this.emitter.off(c,b)}list(a){let b=[];for(let c of this.agents.values())(!a?.topicId||c.meta.topicId===a.topicId)&&(a?.rootId&&c.meta.rootId!==a.rootId||b.push({...c.meta}));return b.sort((a,b)=>Date.parse(b.startedAt)-Date.parse(a.startedAt)),b}get(a){let b=this.agents.get(a);return b?{...b.meta}:null}isActive(a){let b=this.byTopicRole.get(a);if(!b)return!1;for(let a of b.values()){let b=this.agents.get(a);if(b?.meta.status==="running")return!0}return!1}listRunningTopicsForRoot(a){let b=new Set;for(let c of this.agents.values())c.meta.rootId===a&&"running"===c.meta.status&&b.add(c.meta.topicId);return[...b]}async stopTopic(a){let b=[];for(let[c,d]of this.agents)d.meta.topicId===a&&b.push(c);let c=0;for(let a of b){let b=this.agents.get(a);b&&"running"===b.meta.status&&(await this.destroy(a,"cancelled"),c+=1)}return{stopped:c}}constructor(){this.agents=new Map,this.byTopicRole=new Map,this.emitter=new e.EventEmitter,this.turnText=new Map,this.lastInvoke=new Map,this.pendingMcpAdds=new Map}}function D(){return new Date().toISOString()}let I=new Set(["claude-code","codex","ollama","image-gen"]);async function E(a,b,d){if(!a||"object"!=typeof a)return a;let e={...a},f=e.transport,g="stdio"===f?"env":"http"===f||"sse"===f?"headers":null;if(!g)return e;let h=e[g]??{},i={};for(let[a,b]of Object.entries(h))i[a]=String(b);for(let a of b){if(a.oauth){let{getOAuthTokens:b}=await c.e(6730).then(c.bind(c,96730)),{isOAuthProviderId:d}=await c.e(3657).then(c.bind(c,63657));if(!d(a.oauth))throw Error(`unknown OAuth provider: ${a.oauth}`);if(!await b(a.oauth))throw Error(`provider "${a.oauth}" not authorized — open Settings → OAuth and Authorize first`);i[a.envKey]=`$oauth:${a.oauth}`;continue}let b=d[a.envKey];if(void 0!==b&&""!==b)i[a.envKey]=b;else if(a.required)throw Error(`secret "${a.envKey}" is required`);else delete i[a.envKey]}return e[g]=i,e}function F(){return(0,f.randomUUID)().replace(/-/g,"").slice(0,12)}async function G(a,b){let c=await (0,g.wj)(a,b),d=[],e=null,f=()=>{e&&(d.push(`### ${e.role}
216
+ ${e.text.trim()}`),e=null)};for(let a of c)"user-message"===a.type?(f(),e={role:"user",text:a.text},f()):"assistant-delta"===a.type?(e&&"assistant"===e.role||(f(),e={role:"assistant",text:""}),e.text+=a.text):("turn-end"===a.type||"agent-end"===a.type)&&f();return f(),d.join("\n\n")}let J=globalThis.__reflexAgentManager??new H;globalThis.__reflexAgentManager=J,c.e(3240).then(c.bind(c,93240)).then(a=>a.startWidgetScheduler()).catch(a=>{console.error("[widget-scheduler] failed to start:",a)}),d()}catch(a){d(a)}})},18542:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ab:()=>p,xP:()=>r});var e=c(73024),f=c(76760),g=c.n(f),h=c(29163),i=c(17640),j=c(99048),k=c(80958),l=a([j]);function m(a,b){return g().join(function(a){if("global"===a.scope)return g().join((0,h._)(),"memory");if(!a.rootPath)throw Error("project memory requires rootPath");return g().join(a.rootPath,".reflex","memory")}(a),`${b}.md`)}function n(a){let b=a.trim();return b?b.split("\n").length:0}async function o(a,b){try{let c=(await e.promises.readFile(m(a,b),"utf8")).replace(/\s+$/,"");return{file:b,content:c||null,lines:n(c)}}catch{return{file:b,content:null,lines:0}}}async function p(a){let b=await Promise.all(k.cs.map(b=>o(a,b))),c={};for(let a of b)c[a.file]=a;return c}async function q(a,b){await e.promises.mkdir(g().dirname(a),{recursive:!0}),await e.promises.writeFile(a,b.endsWith("\n")?b:`${b}
166
217
  `,"utf8")}async function r(a,b,c,d={}){let f=k.h0[b],g=m(a,b),h=await o(a,b);if("replace"===c){let a=(d.content??"").trim();if(!a)return await e.promises.unlink(g).catch(()=>null),{ok:!0,file:b,lines:0,cap:f};let c=n(a);return c>f?{ok:!1,file:b,lines:c,cap:f,error:"cap-exceeded"}:(await q(g,a),{ok:!0,file:b,lines:c,cap:f})}if("remove"===c){if(!h.content)return{ok:!0,file:b,lines:0,cap:f};let a=(d.match??"").trim();if(!a)return{ok:!1,file:b,lines:h.lines,cap:f,error:"match-required"};let c=h.content.split("\n").filter(b=>!b.includes(a)).join("\n").trim();return c?(await q(g,c),{ok:!0,file:b,lines:n(c),cap:f}):(await e.promises.unlink(g).catch(()=>null),{ok:!0,file:b,lines:0,cap:f})}let i=(d.content??"").trim();if(!i)return{ok:!1,file:b,lines:h.lines,cap:f,error:"empty-content"};let j=i.split("\n").length;if(h.lines+j<=f){let a=h.content?`${h.content.trim()}
167
218
  ${i}`:i;return await q(g,a),{ok:!0,file:b,lines:n(a),cap:f}}let l=await s(b,h.content??"",i);return l?(await q(g,l),{ok:!0,file:b,lines:n(l),cap:f}):{ok:!1,file:b,lines:h.lines,cap:f,error:"compact-failed"}}async function s(a,b,c){let d=k.h0[a];try{let e=(await (0,i.M)()).assignments.quick,f=[`You compress a Reflex memory file. The file is ${a}.md — ${k.lh[a]}.`,`Hard rule: the OUTPUT MUST BE ≤${d} lines.`,"Merge the new entry into the existing content. Keep every distinct fact. Drop duplicates and obsolete entries. Tighten wording but DO NOT invent facts. One line per fact. Plain text, no markdown headers, no surrounding quotes, no commentary — just the new file contents.\n\n## Existing file",b.trim()||"(empty)","\n## New entry to merge in",c.trim()].join("\n"),g=await (0,j.T)(e,f,{timeoutMs:45e3}),h=(function(a){let b=/^```(?:\w+)?\n([\s\S]*?)\n```\s*$/.exec(a.trim());return b?b[1]:a})(g).trim();if(!h)return null;return h.split("\n").map(a=>a.trim()).filter(Boolean).slice(0,d).join("\n")}catch{return null}}j=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},19219:(a,b,c)=>{c.d(b,{YN:()=>p,cC:()=>r,fH:()=>q,tf:()=>m});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g),i=c(24576);let j=f().join(".reflex","assets","images"),k={"image/png":"png","image/jpeg":"jpg","image/jpg":"jpg","image/webp":"webp","image/gif":"gif","image/svg+xml":"svg","image/avif":"avif"},l={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",svg:"image/svg+xml",avif:"image/avif"};function m(a){return l[a.toLowerCase()]??"application/octet-stream"}async function n(a){let b=await (0,i.Zn)(a);if(!b)throw Error(`unknown root: ${a}`);return b.path}async function o(a){let b=f().join(await n(a),j);return await d.promises.mkdir(b,{recursive:!0}),b}async function p(a,b,c){let e=Buffer.isBuffer(b)?b:Buffer.from(b),g=h().createHash("sha256").update(e).digest("hex"),i=k[c.toLowerCase()]??"bin",l=await o(a),m=f().join(l,`${g}.${i}`);try{await d.promises.access(m)}catch{await d.promises.writeFile(m,e)}return{sha:g,ext:i,mime:c,absPath:m,relPath:f().posix.join(j.split(f().sep).join("/"),`${g}.${i}`),urlPath:`/api/images/${encodeURIComponent(a)}/${g}.${i}`,size:e.byteLength}}async function q(a,b){let c=await fetch(b,{redirect:"follow",signal:AbortSignal.timeout(3e4)});if(!c.ok)throw Error(`fetch ${b} -> ${c.status} ${c.statusText}`);let d=c.headers.get("content-type")?.split(";")[0]?.trim()??"";if(!d.startsWith("image/"))throw Error(`not an image: content-type=${d||"(none)"}`);let e=Number(c.headers.get("content-length")??"0");if(e>0x1400000)throw Error(`image too large: ${e} bytes (cap 20971520)`);let f=await c.arrayBuffer();if(f.byteLength>0x1400000)throw Error(`image too large after download: ${f.byteLength} bytes (cap 20971520)`);return p(a,Buffer.from(f),d)}async function r(a,b){if(!/^[a-f0-9]{8,64}\.[a-z0-9]{2,5}$/i.test(b))return null;let c=await o(a),e=f().resolve(c,b);if(!e.startsWith(c+f().sep)&&e!==c)return null;try{let a=await d.promises.stat(e);if(!a.isFile())return null;let c=f().extname(b).slice(1);return{absPath:e,mime:m(c),size:a.size}}catch{return null}}},22830:(a,b,c)=>{c.d(b,{H:()=>e});var d=c(61088);async function e(a){let b=(0,d.Tf)().startThread({model:a.args.model,workingDirectory:a.args.rootPath,sandboxMode:"read-only",additionalDirectories:[a.args.reflexScope],approvalPolicy:"never",skipGitRepoCheck:!0}),c=a.args.systemPrompt.trim().length>0?`${a.args.systemPrompt}
168
219
 
169
- ${a.args.prompt}`:a.args.prompt,e=await b.runStreamed(c),f=new Map;try{for await(let b of e.events)if("item.started"!==b.type){if("item.updated"===b.type||"item.completed"===b.type){let c=b.item;if("agent_message"===c.type){let b=f.get(c.id)??"",d=c.text.slice(b.length);d.length>0&&(f.set(c.id,c.text),await a.manager.emit({type:"assistant-delta",text:d,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}));continue}if("command_execution"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"Bash",input:{command:c.command},agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),await a.manager.emit({type:"tool-result",toolUseId:c.id,content:c.aggregated_output??"",...0!==c.exit_code?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("file_change"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"FileChange",input:{changes:c.changes},agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),await a.manager.emit({type:"tool-result",toolUseId:c.id,content:`${c.status}: ${c.changes.map(a=>`${a.kind} ${a.path}`).join(", ")}`,..."failed"===c.status?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("mcp_tool_call"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:`mcp:${c.server}:${c.tool}`,input:c.arguments,agentId:a.meta.id,ts:new Date().toISOString(),seq:0});let b=c.error?c.error.message:JSON.stringify(c.result?.content??[]).slice(0,4e3);await a.manager.emit({type:"tool-result",toolUseId:c.id,content:b,...c.error?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("web_search"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"WebSearch",input:{query:c.query},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}"error"===c.type&&"item.completed"===b.type&&await a.manager.emit({type:"error",message:c.message,agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("turn.failed"===b.type)throw await a.manager.emit({type:"error",message:`codex turn failed: ${b.error.message}`,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),Error(b.error.message);if("error"===b.type)throw await a.manager.emit({type:"error",message:b.message,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),Error(b.message)}}finally{await (0,d.Nb)(b.id)}}},23956:(a,b,c)=>{function d(a){return q(a,"<<reflex:permission>>","<</reflex:permission>>")}function e(a){let b=q(a,"<<reflex:question>>","<</reflex:question>>"),c=[];for(let a of b)if(a&&"object"==typeof a){if("questions"in a&&Array.isArray(a.questions)){for(let b of a.questions)b&&"object"==typeof b&&"string"==typeof b.prompt&&c.push(b);continue}"string"==typeof a.prompt&&c.push(a)}return c}function f(a){return q(a,"<<reflex:kb>>","<</reflex:kb>>").filter(a=>"string"==typeof a?.kind&&"string"==typeof a?.title)}function g(a){return q(a,"<<reflex:memory>>","<</reflex:memory>>").filter(a=>!!a&&"string"==typeof a.scope&&"string"==typeof a.file&&"string"==typeof a.op)}function h(a){return q(a,"<<reflex:mcp-add>>","<</reflex:mcp-add>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.server&&"string"==typeof a.label&&"object"==typeof a.config&&null!==a.config)}function i(a){return q(a,"<<reflex:dispatch>>","<</reflex:dispatch>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.role&&"string"==typeof a.brief&&a.brief.trim().length>0)}function j(a){return q(a,"<<reflex:youtube-summary>>","<</reflex:youtube-summary>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.url)}function k(a){return q(a,"<<reflex:workflow-create>>","<</reflex:workflow-create>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.id&&"string"==typeof a.label&&Array.isArray(a.steps)&&a.steps.length>0)}function l(a){return q(a,"<<reflex:widget-create>>","<</reflex:widget-create>>").filter(n)}function m(a){return q(a,"<<reflex:widget-update>>","<</reflex:widget-update>>").filter(n)}function n(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&a.id.length>0&&"string"==typeof a.title&&"string"==typeof a.kind&&!!a.data&&"object"==typeof a.data}function o(a){return q(a,"<<reflex:image-gen>>","<</reflex:image-gen>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.prompt&&a.prompt.trim().length>0)}function p(a){return q(a,"<<reflex:utility>>","<</reflex:utility>>").filter(a=>null!==a&&"object"==typeof a&&("global"===a.scope||"project"===a.scope)&&"object"==typeof a.files&&null!==a.files)}function q(a,b,c){let d=b.replace(/^<+/,"").replace(/>+$/,""),e=c.replace(/^<+/,"").replace(/>+$/,""),f=RegExp(`<{1,2}${r(d)}>{1,2}`,"g"),g=RegExp(`<{1,2}${r(e)}>{1,2}`,"g"),h=[],i=0;for(;i<a.length;){f.lastIndex=i;let b=f.exec(a);if(!b)break;let c=b.index+b[0].length;g.lastIndex=c;let d=g.exec(a);if(!d)break;let e=a.slice(c,d.index).trim();i=d.index+d[0].length;try{h.push(JSON.parse(e))}catch{}}return h}function r(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}c.d(b,{Bc:()=>f,Dq:()=>l,Eb:()=>i,Oo:()=>p,QN:()=>k,Up:()=>m,XZ:()=>j,dJ:()=>e,eD:()=>h,gQ:()=>d,qk:()=>o,tS:()=>g})},24058:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>n,runWorkflow:()=>m});var e=c(77598),f=c.n(e),g=c(24576),h=c(13295),i=c(64011),j=c(79178),k=c(72440),l=a([k]);async function m(a,b,c){let d=await (0,g.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=await (0,h.readWorkflow)(d.path,b);if(!e)return{ok:!1,error:"Workflow not found"};let l={id:function(){let a=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),b=f().randomBytes(3).toString("hex");return`${a}-${b}`}(),workflowId:e.id,workflowLabel:e.label,status:"running",startedAt:new Date().toISOString(),steps:e.steps.map(a=>({stepId:a.id,status:"pending"})),...void 0!==c?{initialInput:c}:{}};await (0,h.bp)(d.path,l);let m={},n=c,o={rootId:a,rootPath:d.path,workflow:{id:e.id,label:e.label}};for(let a=0;a<e.steps.length;a++){let b=e.steps[a],f=l.steps[a];f.status="running",f.startedAt=new Date().toISOString(),await (0,h.bp)(d.path,l);try{let a=k.L[b.kind];if(!a)throw Error(`Unknown node kind: ${b.kind}`);let d=(0,j.V)(b.params,{prev:n,steps:m,input:c,workflow:{id:e.id,label:e.label}}),g=(0,i.P)(b.kind,d);f.renderedParams=g;let h=await a(g,o);f.output=h,f.status="completed",f.finishedAt=new Date().toISOString(),m[b.id]={output:h},n=h}catch(a){return f.status="failed",f.error=a instanceof Error?a.message:String(a),f.finishedAt=new Date().toISOString(),l.status="failed",l.finishedAt=new Date().toISOString(),await (0,h.bp)(d.path,l),(0,h.lq)(d.path,e.id),{ok:!0,run:l}}await (0,h.bp)(d.path,l)}return l.status="completed",l.finishedAt=new Date().toISOString(),await (0,h.bp)(d.path,l),(0,h.lq)(d.path,e.id),{ok:!0,run:l}}function n(a){if(!a.id||"string"!=typeof a.id)return"id is required";if(!a.label||"string"!=typeof a.label)return"label is required";if(!Array.isArray(a.steps)||0===a.steps.length)return"steps[] cannot be empty";let b=new Set;for(let c of a.steps){if(!c.id)return"every step must have an id";if(b.has(c.id))return`Duplicate step id: ${c.id}`;if(b.add(c.id),!k.L[c.kind])return`Unknown step kind: ${c.kind}`}return null}k=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},24776:(a,b,c)=>{c.d(b,{Aq:()=>i,pO:()=>h});let d=["Read","Glob","Grep","WebFetch","WebSearch"],e=[...d,"Write","Edit","MultiEdit"];function f(a,b,c){return[`## Specialist role: ${a}`,"",`Reply in ${b}. You are a focused specialist, not a general assistant. Do exactly the task in the brief — no more.`,"\n## Brief from the orchestrator",c.trim(),""].join("\n")}function g(a){return["\n## Rules",a,"\n- Don't ask clarifying questions to the user — you don't have a chat surface. If the brief is ambiguous, do your best with stated assumptions and note them in your output.\n- Don't emit `<<reflex:kb>>`, `<<reflex:utility>>`, `<<reflex:permission>>`, `<<reflex:question>>`, `<<reflex:dispatch>>` markers — those are for the orchestrator only. Just write your answer as plain text/markdown.\n- End with a tight summary the orchestrator can quote verbatim if the user asks for the result."].join("\n")}let h={researcher:{id:"researcher",label:"Researcher",description:"Deep KB reading / project search / web research. Read-only — never writes files. Use when you need to find or gather facts.",allowedTools:d,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("researcher",a,d),`Project root: \`${b}\``,`Knowledge base scope: \`${c}\``,g("- You are READ-ONLY: never Write/Edit/MultiEdit. Use Read/Glob/Grep to scan the KB and WebFetch/WebSearch for external lookups.\n- Cite sources by rel-path inside the KB (or URL for web).\n- If the brief asks for something that requires a write, explicitly say `cannot complete — write required` instead of doing it.")].join("\n")},coder:{id:"coder",label:"Coder",description:"Writes/edits source code, configs, schemas. Can create a utility. Use when file changes are required.",allowedTools:e,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("coder",a,d),`Project root: \`${b}\``,`Reflex scope (write here for KB files): \`${c}\``,g("- You may Write/Edit/MultiEdit files. Stay inside the project root.\n- Don't run shell or invoke other agents. If the brief implies installing a utility, write the utility files but do NOT emit `<<reflex:utility>>` — that's the orchestrator's job.\n- Report what you changed: list each touched file with a one-line summary.")].join("\n")},summarizer:{id:"summarizer",label:"Summarizer",description:"Compresses a large text / long transcript / file list into a short summary. No tools — only the text in the brief.",allowedTools:[],systemPrompt:({language:a,brief:b})=>[f("summarizer",a,b),g("- You have NO tools — work only from the text in the brief.\n- Compress aggressively: bullet points, ~10x reduction is the target unless the brief says otherwise.\n- Preserve names, numbers, dates, file paths verbatim. Drop filler.")].join("\n")},"kb-writer":{id:"kb-writer",label:"KB Writer",description:"Structured knowledge-base entry (kind/title/body/frontmatter). Use when the orchestrator decides to save something.",allowedTools:d,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("kb-writer",a,d),`KB root: \`${c}\``,`Project: \`${b}\``,g('- You DO NOT write the file yourself. Output a JSON object the orchestrator will pass to <<reflex:kb>>:\n ```json\n {"kind":"<entity-type>","title":"…","body":"…markdown…","meta":{…optional frontmatter fields…}}\n ```\n- Pick a sensible `kind` (fact / task / meeting / product / decision / source / …).\n- `body` is full markdown. Frontmatter `meta` should hold structured fields the user might filter/group on.')].join("\n")},"utility-builder":{id:"utility-builder",label:"Utility Builder",description:"Design a utility: manifest + ui.tsx + (optional) server actions. Use when the user explicitly asks to create a utility.",allowedTools:d,systemPrompt:({language:a,root:b,brief:c})=>[f("utility-builder",a,c),`Project: \`${b}\``,g("- Output the utility files inline in markdown code fences with file paths as headers:\n ### manifest.json\n ```json\n { … }\n ```\n ### ui.tsx\n ```tsx\n … React functional component, default-export …\n ```\n- Follow Reflex utility contract: imports only from `react`, `react-dom/client`, `react/jsx-runtime`, `@host/api`, `@host/ui`. Declare needed permissions and secrets in manifest.\n- Don't emit `<<reflex:utility>>` yourself — the orchestrator wraps your output and emits the marker.")].join("\n")}};function i(a){return a in h}},25608:(a,b,c)=>{c.d(b,{dr:()=>e});let d=[{id:"plan",trigger:"plan",label:"/plan",description:"Show the plan first — Reflex lays out the steps and waits for approval.",kind:"agent-mode",usage:"/plan <task>",icon:"ListChecks"},{id:"goal",trigger:"goal",label:"/goal",description:"Set a goal — Reflex will work toward it on its own, without reminders.",kind:"agent-mode",usage:"/goal <what to achieve>",icon:"Target"},{id:"research",trigger:"research",label:"/research",description:"Deep research on a topic — web search + summary with sources.",kind:"agent-mode",usage:"/research <topic>",icon:"Telescope"},{id:"widget",trigger:"widget",label:"/widget",description:"Create a card on the space dashboard.",kind:"agent-mode",usage:"/widget <what to show>",icon:"LayoutGrid"},{id:"workflow",trigger:"workflow",label:"/workflow",description:"Build a recipe — linear step-based automation for the task.",kind:"agent-mode",usage:"/workflow <what to automate>",icon:"Workflow"},{id:"distill",trigger:"distill",label:"/distill",description:"Pull a URL into the KB — extract key facts, action items, and links to related notes.",kind:"agent-mode",usage:"/distill <url> [focus]",icon:"BookOpenCheck"},{id:"practice",trigger:"practice",label:"/practice",description:"Roleplay a tough conversation — Reflex plays the counterpart and coaches you between turns.",kind:"agent-mode",usage:"/practice <scenario>",icon:"MessagesSquare"},{id:"reflect",trigger:"reflect",label:"/reflect",description:"Daily check-in — three questions adapted to your recent entries, saved as a journal note.",kind:"agent-mode",usage:"/reflect",allowEmpty:!0,icon:"Sunrise"},{id:"remember",trigger:"remember",label:"/remember",description:"Save a note — straight into memory, no AI involved.",kind:"direct",usage:"/remember <what to remember>",icon:"BookmarkPlus"},{id:"mcp",trigger:"mcp",label:"/mcp",description:"Connect an external service (setup wizard opens in chat).",kind:"agent-mode",usage:"/mcp <what you need>",icon:"PackagePlus"},{id:"skill",trigger:"skill",label:"/skill",description:"Attach a role — a ready-made instruction set for this conversation.",kind:"agent-mode",usage:"/skill <role-id> [prompt]",icon:"Sparkles"},{id:"delete-topic",trigger:"delete-topic",label:"/delete-topic",description:"Delete this conversation (with confirmation).",kind:"direct",usage:"/delete-topic",requiresConfirm:!0,allowEmpty:!0,icon:"Trash2"},{id:"clear-project",trigger:"clear-project",label:"/clear-project",description:"DANGER: clear the space — all conversations, cards, memory. Double confirmation.",kind:"direct",usage:"/clear-project",requiresConfirm:!0,allowEmpty:!0,icon:"AlertOctagon"},{id:"util",trigger:"util",label:"/util",description:"Open a mini-app (by partial name or from the list).",kind:"direct",usage:"/util <partial name or id>",allowEmpty:!0,icon:"Boxes"},{id:"help",trigger:"help",label:"/help",description:"List available commands.",kind:"direct",usage:"/help",allowEmpty:!0,icon:"HelpCircle"}];function e(a){var b;let c=a.trim();if(!c.startsWith("/"))return null;let e=/^\/([a-z][a-z0-9-]*)(?:\s+([\s\S]*))?$/.exec(c);if(!e)return null;let f=(b=e[1],d.find(a=>a.trigger===b)??null);return f?{def:f,payload:(e[2]??"").trim()}:null}},25713:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Z:()=>j});var e=c(7206),f=c(77598),g=c.n(f),h=c(91147),i=a([e]);e=(i.then?(await i)():i)[0];let l=["Read","LS","Glob","Grep","WebSearch","WebFetch"];async function j(a){let b=await (0,h._)(a.meta.id),c=a.args.allowedTools&&a.args.allowedTools.length>0?a.args.allowedTools:l,d=b?[...c,...b.serverIds.map(a=>`mcp__${a}__*`)]:c,f=["-p",a.args.prompt,"--append-system-prompt",a.args.systemPrompt,"--permission-mode","default","--allowedTools",d.join(","),"--add-dir",a.args.reflexScope,"--output-format","stream-json","--verbose","--model",a.args.model,...b?["--mcp-config",b.path]:[]],i=(0,e.execa)("claude",f,{cwd:a.args.rootPath,buffer:!1,stdin:"ignore"}),j=new Map;try{for await(let b of k(i.stdout)){let c=function(a){try{return JSON.parse(a)}catch{return null}}(b);if(c)for(let b of function(a,b,c){let d=new Date().toISOString();if("system"===a.type)return[{type:"system",text:a.subtype??"system",subtype:a.subtype,agentId:b,ts:d,seq:0}];if("assistant"===a.type){let e=[];for(let f of a.message?.content??[])"text"===f.type?e.push({type:"assistant-delta",text:f.text,agentId:b,ts:d,seq:0}):"tool_use"===f.type&&(c.set(f.id,f.name),e.push({type:"tool-use",toolUseId:f.id,name:f.name,input:f.input??{},agentId:b,ts:d,seq:0}));return e}if("user"===a.type){let h=[];for(let i of a.message?.content??[])if("tool_result"===i.type){var e,f;let a=(e=i.content)?"string"==typeof e?e:e.map(a=>"text"===a.type&&a.text?a.text:"").join(""):"";if(h.push({type:"tool-result",toolUseId:i.tool_use_id,content:a,...i.is_error?{isError:!0}:{},agentId:b,ts:d,seq:0}),i.is_error){let e=c.get(i.tool_use_id)??function(a){let b=/requested permissions to use\s+([A-Za-z_]\w*)/i.exec(a);if(b?.[1])return b[1];if(/requested permissions to write\b/i.test(a))return"Write";if(/requested permissions to edit\b/i.test(a))return"Edit";if(/requested permissions to run\b/i.test(a))return"Bash";if(/requested permissions to read\b/i.test(a))return"Read";let c=/permission .* tool[:\s]+([A-Za-z_]\w*)/i.exec(a);return c?.[1]??null}(a);if(e){let c=function(a){let b=/requested permissions to (?:write to|edit|read)\s+(\S+?)(?:,|\s+but\b|\s*$)/i.exec(a)??/requested permissions to run\s+(.+?)(?:,\s+but\b|\s*$)/i.exec(a);return b?.[1]?.trim()??null}(a);h.push({type:"permission-request",requestId:g().randomUUID().replace(/-/g,"").slice(0,12),tool:e,action:"tool-policy",...c?{input:{target:c}}:{},description:c?`The agent wants to ${f=e,"Write"===f?"write to":"Edit"===f||"MultiEdit"===f?"edit":"Read"===f?"read":"Bash"===f?"run a command":"NotebookEdit"===f?"edit a notebook":"WebFetch"===f?"fetch a URL":"WebSearch"===f?"search the web":"use"} \`${c}\` via "${e}". Allow?`:`The agent tried to call the "${e}" tool, but it is not in the allowed list for this task. Allow?`,agentId:b,ts:d,seq:0})}}}return h}return a.type,[]}(c,a.meta.id,j))await a.manager.emit(b)}await i}finally{b&&await b.cleanup()}}async function*k(a){if(!a)return;let b="";for await(let c of a){let a;for(b+="string"==typeof c?c:c.toString("utf8");(a=b.indexOf("\n"))>=0;){let c=b.slice(0,a);b=b.slice(a+1),c.trim()&&(yield c)}}b.trim()&&(yield b)}d()}catch(a){d(a)}})},31900:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{W:()=>s});var e=c(76760),f=c.n(e),g=c(13474),h=c(61992),i=c(17640),j=c(24576),k=c(16909),l=c(74342),m=c(8734),n=c(25608),o=c(56843),p=c(3613),q=c(330),r=a([k,q]);[k,q]=r.then?(await r)():r;let u="рус";async function s(a){let b=await (0,j.Zn)(a.rootId);if(!b)return{error:"Root not found",status:404};if(k.z.isActive(a.topicId))return{error:"Topic already has a running agent",status:409};let c=await (0,i.M)(),d=c.assignments.chat,e=a.harness??d.harness,l=a.model??d.model,r=c.language,s=(0,g.FF)(b.path),w=(0,m.wr)(a.message),x=(0,n.dr)(a.message),y=a.message;w?"goal"===w.kind&&w.text?(await (0,o.PF)(b.path,a.topicId,w.text),y=w.text):"plan"===w.kind&&(y=w.text||a.message):x&&"agent-mode"===x.def.kind&&(y=x.payload||a.message);let z=null;if(x?.def.id==="skill"){let[a,...b]=x.payload.split(/\s+/);if(a){let c=await (0,p.k)(a);c&&(z=c.instructions,y=b.join(" ").trim()||y)}}let A=await (0,o.eF)(b.path,a.topicId),B=A?.meta.goal&&"active"===A.meta.goalStatus?A.meta.goal:void 0,C=await (0,h.M)({root:b.path,scope:b.path,reflexScope:s,language:r}),D=await (0,q.f)({rootPath:b.path}),E=function(a){let b=[],c=new Set;for(let d of a.matchAll(/https?:\/\/[^\s)>'"]+/g)){let a=d[0];try{let d=new URL(a);if(!v.has(d.hostname.toLowerCase())||c.has(a))continue;c.add(a),b.push(a)}catch{}}return b}(y),F=[C,D,B?(0,m.FB)(B,r):"",w?.kind==="plan"?(0,m.$4)(r):"",x?.def.id==="research"?(0,m.dA)(x.payload,r):"",x?.def.id==="widget"?(0,m.wt)(x.payload,r):"",x?.def.id==="mcp"?(0,m.YE)(x.payload,r):"",x?.def.id==="workflow"?(0,m.vl)(x.payload,r):"",x?.def.id==="distill"?(0,m.VM)(x.payload,r):"",x?.def.id==="practice"?(0,m.z7)(x.payload,r):"",x?.def.id==="reflect"?(0,m.zM)(r):"",z??"",a.focusFile?function(a,b,c){let d=f().join(b,a);return/russ/i.test(c)||RegExp(u,"i").test(c)?`## Open document — primary context
220
+ ${a.args.prompt}`:a.args.prompt,e=await b.runStreamed(c),f=new Map;try{for await(let b of e.events)if("item.started"!==b.type){if("item.updated"===b.type||"item.completed"===b.type){let c=b.item;if("agent_message"===c.type){let b=f.get(c.id)??"",d=c.text.slice(b.length);d.length>0&&(f.set(c.id,c.text),await a.manager.emit({type:"assistant-delta",text:d,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}));continue}if("command_execution"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"Bash",input:{command:c.command},agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),await a.manager.emit({type:"tool-result",toolUseId:c.id,content:c.aggregated_output??"",...0!==c.exit_code?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("file_change"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"FileChange",input:{changes:c.changes},agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),await a.manager.emit({type:"tool-result",toolUseId:c.id,content:`${c.status}: ${c.changes.map(a=>`${a.kind} ${a.path}`).join(", ")}`,..."failed"===c.status?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("mcp_tool_call"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:`mcp:${c.server}:${c.tool}`,input:c.arguments,agentId:a.meta.id,ts:new Date().toISOString(),seq:0});let b=c.error?c.error.message:JSON.stringify(c.result?.content??[]).slice(0,4e3);await a.manager.emit({type:"tool-result",toolUseId:c.id,content:b,...c.error?{isError:!0}:{},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("web_search"===c.type&&"item.completed"===b.type){await a.manager.emit({type:"tool-use",toolUseId:c.id,name:"WebSearch",input:{query:c.query},agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}"error"===c.type&&"item.completed"===b.type&&await a.manager.emit({type:"error",message:c.message,agentId:a.meta.id,ts:new Date().toISOString(),seq:0});continue}if("turn.failed"===b.type)throw await a.manager.emit({type:"error",message:`codex turn failed: ${b.error.message}`,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),Error(b.error.message);if("error"===b.type)throw await a.manager.emit({type:"error",message:b.message,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),Error(b.message)}}finally{await (0,d.Nb)(b.id)}}},23956:(a,b,c)=>{function d(a){return r(a,"<<reflex:permission>>","<</reflex:permission>>")}function e(a){let b=r(a,"<<reflex:question>>","<</reflex:question>>"),c=[];for(let a of b)if(a&&"object"==typeof a){if("questions"in a&&Array.isArray(a.questions)){for(let b of a.questions)b&&"object"==typeof b&&"string"==typeof b.prompt&&c.push(b);continue}"string"==typeof a.prompt&&c.push(a)}return c}function f(a){return r(a,"<<reflex:kb>>","<</reflex:kb>>").filter(a=>"string"==typeof a?.kind&&"string"==typeof a?.title)}function g(a){return r(a,"<<reflex:memory>>","<</reflex:memory>>").filter(a=>!!a&&"string"==typeof a.scope&&"string"==typeof a.file&&"string"==typeof a.op)}function h(a){return r(a,"<<reflex:suggestion>>","<</reflex:suggestion>>").filter(a=>!!a&&"string"==typeof a.kind&&"string"==typeof a.title&&"string"==typeof a.description&&"string"==typeof a.prompt)}function i(a){return r(a,"<<reflex:mcp-add>>","<</reflex:mcp-add>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.server&&"string"==typeof a.label&&"object"==typeof a.config&&null!==a.config)}function j(a){return r(a,"<<reflex:dispatch>>","<</reflex:dispatch>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.role&&"string"==typeof a.brief&&a.brief.trim().length>0)}function k(a){return r(a,"<<reflex:youtube-summary>>","<</reflex:youtube-summary>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.url)}function l(a){return r(a,"<<reflex:workflow-create>>","<</reflex:workflow-create>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.id&&"string"==typeof a.label&&Array.isArray(a.steps)&&a.steps.length>0)}function m(a){return r(a,"<<reflex:widget-create>>","<</reflex:widget-create>>").filter(o)}function n(a){return r(a,"<<reflex:widget-update>>","<</reflex:widget-update>>").filter(o)}function o(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&a.id.length>0&&"string"==typeof a.title&&"string"==typeof a.kind&&!!a.data&&"object"==typeof a.data}function p(a){return r(a,"<<reflex:image-gen>>","<</reflex:image-gen>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.prompt&&a.prompt.trim().length>0)}function q(a){return r(a,"<<reflex:utility>>","<</reflex:utility>>").filter(a=>null!==a&&"object"==typeof a&&("global"===a.scope||"project"===a.scope)&&"object"==typeof a.files&&null!==a.files)}function r(a,b,c){let d=b.replace(/^<+/,"").replace(/>+$/,""),e=c.replace(/^<+/,"").replace(/>+$/,""),f=RegExp(`<{1,2}${s(d)}>{1,2}`,"g"),g=RegExp(`<{1,2}${s(e)}>{1,2}`,"g"),h=[],i=0;for(;i<a.length;){f.lastIndex=i;let b=f.exec(a);if(!b)break;let c=b.index+b[0].length;g.lastIndex=c;let d=g.exec(a);if(!d)break;let e=a.slice(c,d.index).trim();i=d.index+d[0].length;try{h.push(JSON.parse(e))}catch{}}return h}function s(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}c.d(b,{Bc:()=>f,Dq:()=>m,Eb:()=>j,Oo:()=>q,QN:()=>l,Up:()=>n,XZ:()=>k,dJ:()=>e,eD:()=>i,fU:()=>h,gQ:()=>d,qk:()=>p,tS:()=>g})},24058:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{n:()=>n,runWorkflow:()=>m});var e=c(77598),f=c.n(e),g=c(24576),h=c(13295),i=c(64011),j=c(79178),k=c(72440),l=a([k]);async function m(a,b,c){let d=await (0,g.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=await (0,h.readWorkflow)(d.path,b);if(!e)return{ok:!1,error:"Workflow not found"};let l={id:function(){let a=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),b=f().randomBytes(3).toString("hex");return`${a}-${b}`}(),workflowId:e.id,workflowLabel:e.label,status:"running",startedAt:new Date().toISOString(),steps:e.steps.map(a=>({stepId:a.id,status:"pending"})),...void 0!==c?{initialInput:c}:{}};await (0,h.bp)(d.path,l);let m={},n=c,o={rootId:a,rootPath:d.path,workflow:{id:e.id,label:e.label}};for(let a=0;a<e.steps.length;a++){let b=e.steps[a],f=l.steps[a];f.status="running",f.startedAt=new Date().toISOString(),await (0,h.bp)(d.path,l);try{let a=k.L[b.kind];if(!a)throw Error(`Unknown node kind: ${b.kind}`);let d=(0,j.V)(b.params,{prev:n,steps:m,input:c,workflow:{id:e.id,label:e.label}}),g=(0,i.P)(b.kind,d);f.renderedParams=g;let h=await a(g,o);f.output=h,f.status="completed",f.finishedAt=new Date().toISOString(),m[b.id]={output:h},n=h}catch(a){return f.status="failed",f.error=a instanceof Error?a.message:String(a),f.finishedAt=new Date().toISOString(),l.status="failed",l.finishedAt=new Date().toISOString(),await (0,h.bp)(d.path,l),(0,h.lq)(d.path,e.id),{ok:!0,run:l}}await (0,h.bp)(d.path,l)}return l.status="completed",l.finishedAt=new Date().toISOString(),await (0,h.bp)(d.path,l),(0,h.lq)(d.path,e.id),{ok:!0,run:l}}function n(a){if(!a.id||"string"!=typeof a.id)return"id is required";if(!a.label||"string"!=typeof a.label)return"label is required";if(!Array.isArray(a.steps)||0===a.steps.length)return"steps[] cannot be empty";let b=new Set;for(let c of a.steps){if(!c.id)return"every step must have an id";if(b.has(c.id))return`Duplicate step id: ${c.id}`;if(b.add(c.id),!k.L[c.kind])return`Unknown step kind: ${c.kind}`}return null}k=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},24776:(a,b,c)=>{c.d(b,{Aq:()=>i,pO:()=>h});let d=["Read","Glob","Grep","WebFetch","WebSearch"],e=[...d,"Write","Edit","MultiEdit"];function f(a,b,c){return[`## Specialist role: ${a}`,"",`Reply in ${b}. You are a focused specialist, not a general assistant. Do exactly the task in the brief — no more.`,"\n## Brief from the orchestrator",c.trim(),""].join("\n")}function g(a){return["\n## Rules",a,"\n- Don't ask clarifying questions to the user — you don't have a chat surface. If the brief is ambiguous, do your best with stated assumptions and note them in your output.\n- Don't emit `<<reflex:kb>>`, `<<reflex:utility>>`, `<<reflex:permission>>`, `<<reflex:question>>`, `<<reflex:dispatch>>` markers — those are for the orchestrator only. Just write your answer as plain text/markdown.\n- End with a tight summary the orchestrator can quote verbatim if the user asks for the result."].join("\n")}let h={researcher:{id:"researcher",label:"Researcher",description:"Deep KB reading / project search / web research. Read-only — never writes files. Use when you need to find or gather facts.",allowedTools:d,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("researcher",a,d),`Project root: \`${b}\``,`Knowledge base scope: \`${c}\``,g("- You are READ-ONLY: never Write/Edit/MultiEdit. Use Read/Glob/Grep to scan the KB and WebFetch/WebSearch for external lookups.\n- Cite sources by rel-path inside the KB (or URL for web).\n- If the brief asks for something that requires a write, explicitly say `cannot complete — write required` instead of doing it.")].join("\n")},coder:{id:"coder",label:"Coder",description:"Writes/edits source code, configs, schemas. Can create a utility. Use when file changes are required.",allowedTools:e,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("coder",a,d),`Project root: \`${b}\``,`Reflex scope (write here for KB files): \`${c}\``,g("- You may Write/Edit/MultiEdit files. Stay inside the project root.\n- Don't run shell or invoke other agents. If the brief implies installing a utility, write the utility files but do NOT emit `<<reflex:utility>>` — that's the orchestrator's job.\n- Report what you changed: list each touched file with a one-line summary.")].join("\n")},summarizer:{id:"summarizer",label:"Summarizer",description:"Compresses a large text / long transcript / file list into a short summary. No tools — only the text in the brief.",allowedTools:[],systemPrompt:({language:a,brief:b})=>[f("summarizer",a,b),g("- You have NO tools — work only from the text in the brief.\n- Compress aggressively: bullet points, ~10x reduction is the target unless the brief says otherwise.\n- Preserve names, numbers, dates, file paths verbatim. Drop filler.")].join("\n")},"kb-writer":{id:"kb-writer",label:"KB Writer",description:"Structured knowledge-base entry (kind/title/body/frontmatter). Use when the orchestrator decides to save something.",allowedTools:d,systemPrompt:({language:a,root:b,reflexScope:c,brief:d})=>[f("kb-writer",a,d),`KB root: \`${c}\``,`Project: \`${b}\``,g('- You DO NOT write the file yourself. Output a JSON object the orchestrator will pass to <<reflex:kb>>:\n ```json\n {"kind":"<entity-type>","title":"…","body":"…markdown…","meta":{…optional frontmatter fields…}}\n ```\n- Pick a sensible `kind` (fact / task / meeting / product / decision / source / …).\n- `body` is full markdown. Frontmatter `meta` should hold structured fields the user might filter/group on.')].join("\n")},"utility-builder":{id:"utility-builder",label:"Utility Builder",description:"Design a utility: manifest + ui.tsx + (optional) server actions. Use when the user explicitly asks to create a utility.",allowedTools:d,systemPrompt:({language:a,root:b,brief:c})=>[f("utility-builder",a,c),`Project: \`${b}\``,g("- Output the utility files inline in markdown code fences with file paths as headers:\n ### manifest.json\n ```json\n { … }\n ```\n ### ui.tsx\n ```tsx\n … React functional component, default-export …\n ```\n- Follow Reflex utility contract: imports only from `react`, `react-dom/client`, `react/jsx-runtime`, `@host/api`, `@host/ui`. Declare needed permissions and secrets in manifest.\n- Don't emit `<<reflex:utility>>` yourself — the orchestrator wraps your output and emits the marker.")].join("\n")}};function i(a){return a in h}},25608:(a,b,c)=>{c.d(b,{dr:()=>e});let d=[{id:"plan",trigger:"plan",label:"/plan",description:"Show the plan first — Reflex lays out the steps and waits for approval.",kind:"agent-mode",usage:"/plan <task>",icon:"ListChecks"},{id:"goal",trigger:"goal",label:"/goal",description:"Set a goal — Reflex will work toward it on its own, without reminders.",kind:"agent-mode",usage:"/goal <what to achieve>",icon:"Target"},{id:"research",trigger:"research",label:"/research",description:"Deep research on a topic — web search + summary with sources.",kind:"agent-mode",usage:"/research <topic>",icon:"Telescope"},{id:"widget",trigger:"widget",label:"/widget",description:"Create a card on the space dashboard.",kind:"agent-mode",usage:"/widget <what to show>",icon:"LayoutGrid"},{id:"workflow",trigger:"workflow",label:"/workflow",description:"Build a recipe — linear step-based automation for the task.",kind:"agent-mode",usage:"/workflow <what to automate>",icon:"Workflow"},{id:"distill",trigger:"distill",label:"/distill",description:"Pull a URL into the KB — extract key facts, action items, and links to related notes.",kind:"agent-mode",usage:"/distill <url> [focus]",icon:"BookOpenCheck"},{id:"practice",trigger:"practice",label:"/practice",description:"Roleplay a tough conversation — Reflex plays the counterpart and coaches you between turns.",kind:"agent-mode",usage:"/practice <scenario>",icon:"MessagesSquare"},{id:"reflect",trigger:"reflect",label:"/reflect",description:"Daily check-in — three questions adapted to your recent entries, saved as a journal note.",kind:"agent-mode",usage:"/reflect",allowEmpty:!0,icon:"Sunrise"},{id:"remember",trigger:"remember",label:"/remember",description:"Save a note — straight into memory, no AI involved.",kind:"direct",usage:"/remember <what to remember>",icon:"BookmarkPlus"},{id:"mcp",trigger:"mcp",label:"/mcp",description:"Connect an external service (setup wizard opens in chat).",kind:"agent-mode",usage:"/mcp <what you need>",icon:"PackagePlus"},{id:"skill",trigger:"skill",label:"/skill",description:"Attach a role — a ready-made instruction set for this conversation.",kind:"agent-mode",usage:"/skill <role-id> [prompt]",icon:"Sparkles"},{id:"delete-topic",trigger:"delete-topic",label:"/delete-topic",description:"Delete this conversation (with confirmation).",kind:"direct",usage:"/delete-topic",requiresConfirm:!0,allowEmpty:!0,icon:"Trash2"},{id:"clear-project",trigger:"clear-project",label:"/clear-project",description:"DANGER: clear the space — all conversations, cards, memory. Double confirmation.",kind:"direct",usage:"/clear-project",requiresConfirm:!0,allowEmpty:!0,icon:"AlertOctagon"},{id:"util",trigger:"util",label:"/util",description:"Open a mini-app (by partial name or from the list).",kind:"direct",usage:"/util <partial name or id>",allowEmpty:!0,icon:"Boxes"},{id:"help",trigger:"help",label:"/help",description:"List available commands.",kind:"direct",usage:"/help",allowEmpty:!0,icon:"HelpCircle"}];function e(a){var b;let c=a.trim();if(!c.startsWith("/"))return null;let e=/^\/([a-z][a-z0-9-]*)(?:\s+([\s\S]*))?$/.exec(c);if(!e)return null;let f=(b=e[1],d.find(a=>a.trigger===b)??null);return f?{def:f,payload:(e[2]??"").trim()}:null}},25713:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Z:()=>j});var e=c(7206),f=c(77598),g=c.n(f),h=c(91147),i=a([e]);e=(i.then?(await i)():i)[0];let l=["Read","LS","Glob","Grep","WebSearch","WebFetch"];async function j(a){let b=await (0,h._)(a.meta.id),c=a.args.allowedTools&&a.args.allowedTools.length>0?a.args.allowedTools:l,d=b?[...c,...b.serverIds.map(a=>`mcp__${a}__*`)]:c,f=["-p",a.args.prompt,"--append-system-prompt",a.args.systemPrompt,"--permission-mode","default","--allowedTools",d.join(","),"--add-dir",a.args.reflexScope,"--output-format","stream-json","--verbose","--model",a.args.model,...b?["--mcp-config",b.path]:[]],i=(0,e.execa)("claude",f,{cwd:a.args.rootPath,buffer:!1,stdin:"ignore"}),j=new Map;try{for await(let b of k(i.stdout)){let c=function(a){try{return JSON.parse(a)}catch{return null}}(b);if(c)for(let b of function(a,b,c){let d=new Date().toISOString();if("system"===a.type)return[{type:"system",text:a.subtype??"system",subtype:a.subtype,agentId:b,ts:d,seq:0}];if("assistant"===a.type){let e=[];for(let f of a.message?.content??[])"text"===f.type?e.push({type:"assistant-delta",text:f.text,agentId:b,ts:d,seq:0}):"tool_use"===f.type&&(c.set(f.id,f.name),e.push({type:"tool-use",toolUseId:f.id,name:f.name,input:f.input??{},agentId:b,ts:d,seq:0}));return e}if("user"===a.type){let h=[];for(let i of a.message?.content??[])if("tool_result"===i.type){var e,f;let a=(e=i.content)?"string"==typeof e?e:e.map(a=>"text"===a.type&&a.text?a.text:"").join(""):"";if(h.push({type:"tool-result",toolUseId:i.tool_use_id,content:a,...i.is_error?{isError:!0}:{},agentId:b,ts:d,seq:0}),i.is_error){let e=c.get(i.tool_use_id)??function(a){let b=/requested permissions to use\s+([A-Za-z_]\w*)/i.exec(a);if(b?.[1])return b[1];if(/requested permissions to write\b/i.test(a))return"Write";if(/requested permissions to edit\b/i.test(a))return"Edit";if(/requested permissions to run\b/i.test(a))return"Bash";if(/requested permissions to read\b/i.test(a))return"Read";let c=/permission .* tool[:\s]+([A-Za-z_]\w*)/i.exec(a);return c?.[1]??null}(a);if(e){let c=function(a){let b=/requested permissions to (?:write to|edit|read)\s+(\S+?)(?:,|\s+but\b|\s*$)/i.exec(a)??/requested permissions to run\s+(.+?)(?:,\s+but\b|\s*$)/i.exec(a);return b?.[1]?.trim()??null}(a);h.push({type:"permission-request",requestId:g().randomUUID().replace(/-/g,"").slice(0,12),tool:e,action:"tool-policy",...c?{input:{target:c}}:{},description:c?`The agent wants to ${f=e,"Write"===f?"write to":"Edit"===f||"MultiEdit"===f?"edit":"Read"===f?"read":"Bash"===f?"run a command":"NotebookEdit"===f?"edit a notebook":"WebFetch"===f?"fetch a URL":"WebSearch"===f?"search the web":"use"} \`${c}\` via "${e}". Allow?`:`The agent tried to call the "${e}" tool, but it is not in the allowed list for this task. Allow?`,agentId:b,ts:d,seq:0})}}}return h}return a.type,[]}(c,a.meta.id,j))await a.manager.emit(b)}await i}finally{b&&await b.cleanup()}}async function*k(a){if(!a)return;let b="";for await(let c of a){let a;for(b+="string"==typeof c?c:c.toString("utf8");(a=b.indexOf("\n"))>=0;){let c=b.slice(0,a);b=b.slice(a+1),c.trim()&&(yield c)}}b.trim()&&(yield b)}d()}catch(a){d(a)}})},31900:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{W:()=>s});var e=c(76760),f=c.n(e),g=c(13474),h=c(61992),i=c(17640),j=c(24576),k=c(16909),l=c(74342),m=c(8734),n=c(25608),o=c(56843),p=c(3613),q=c(330),r=a([k,q]);[k,q]=r.then?(await r)():r;let u="рус";async function s(a){let b=await (0,j.Zn)(a.rootId);if(!b)return{error:"Root not found",status:404};if(k.z.isActive(a.topicId))return{error:"Topic already has a running agent",status:409};let c=await (0,i.M)(),d=c.assignments.chat,e=a.harness??d.harness,l=a.model??d.model,r=c.language,s=(0,g.FF)(b.path),w=(0,m.wr)(a.message),x=(0,n.dr)(a.message),y=a.message;w?"goal"===w.kind&&w.text?(await (0,o.PF)(b.path,a.topicId,w.text),y=w.text):"plan"===w.kind&&(y=w.text||a.message):x&&"agent-mode"===x.def.kind&&(y=x.payload||a.message);let z=null;if(x?.def.id==="skill"){let[a,...b]=x.payload.split(/\s+/);if(a){let c=await (0,p.k)(a);c&&(z=c.instructions,y=b.join(" ").trim()||y)}}let A=await (0,o.eF)(b.path,a.topicId),B=A?.meta.goal&&"active"===A.meta.goalStatus?A.meta.goal:void 0,C=await (0,h.M)({root:b.path,scope:b.path,reflexScope:s,language:r}),D=await (0,q.f)({rootPath:b.path}),E=function(a){let b=[],c=new Set;for(let d of a.matchAll(/https?:\/\/[^\s)>'"]+/g)){let a=d[0];try{let d=new URL(a);if(!v.has(d.hostname.toLowerCase())||c.has(a))continue;c.add(a),b.push(a)}catch{}}return b}(y),F=[C,D,B?(0,m.FB)(B,r):"",w?.kind==="plan"?(0,m.$4)(r):"",x?.def.id==="research"?(0,m.dA)(x.payload,r):"",x?.def.id==="widget"?(0,m.wt)(x.payload,r):"",x?.def.id==="mcp"?(0,m.YE)(x.payload,r):"",x?.def.id==="workflow"?(0,m.vl)(x.payload,r):"",x?.def.id==="distill"?(0,m.VM)(x.payload,r):"",x?.def.id==="practice"?(0,m.z7)(x.payload,r):"",x?.def.id==="reflect"?(0,m.zM)(r):"",z??"",a.focusFile?function(a,b,c){let d=f().join(b,a);return/russ/i.test(c)||RegExp(u,"i").test(c)?`## Open document — primary context
170
221
 
171
222
  The user is currently reading this KB file: \`${a}\`
172
223
  Absolute path: \`${d}\`
@@ -624,4 +675,4 @@ Then continue the conversation. Short confirmation in prose: "Noted — early ho
624
675
 
625
676
  _generated: ${e.provider} \xb7 ${(f=e.size)<1024?`${f} B`:f<1048576?`${(f/1024).toFixed(1)} KB`:`${(f/1048576).toFixed(2)} MB`}_
626
677
  `;await a.manager.emit({type:"assistant-delta",text:h,agentId:a.meta.id,ts:new Date().toISOString(),seq:0})}catch(c){let b=c instanceof Error?c.message:String(c);throw await a.manager.emit({type:"assistant-delta",text:`Failed to generate image: ${b}
627
- `,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),c}}}};
678
+ `,agentId:a.meta.id,ts:new Date().toISOString(),seq:0}),c}}},97604:(a,b,c)=>{c.d(b,{Ed:()=>m,vT:()=>i});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g);let i=["utility","research","widget","goal","skill"];function j(a){return f().join(a,".reflex","suggestions.json")}async function k(a){try{let b=await d.promises.readFile(j(a),"utf8"),c=JSON.parse(b);if(1===c.version&&Array.isArray(c.items))return c}catch{}return{version:1,items:[]}}async function l(a,b){let c=j(a);await d.promises.mkdir(f().dirname(c),{recursive:!0}),await d.promises.writeFile(c,JSON.stringify(b,null,2)+"\n","utf8")}async function m(a,b){let c=await k(a),d=b.title.trim().toLowerCase(),e=c.items.find(a=>a.kind===b.kind&&a.title.trim().toLowerCase()===d&&"pending"===a.status);if(e)return e;let f={id:h().randomBytes(6).toString("hex"),kind:b.kind,title:b.title.trim(),description:b.description.trim(),prompt:b.prompt.trim(),...b.sourceTopicId?{sourceTopicId:b.sourceTopicId}:{},createdAt:new Date().toISOString(),status:"pending"};return c.items.push(f),await l(a,c),f}}};