reflex-agent 0.3.1 → 0.4.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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +90 -90
- package/.next/app-path-routes-manifest.json +7 -7
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/agents/[agentId]/page.js +2 -2
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/[agentId]/respond/route.js +1 -1
- package/.next/server/app/api/agents/[agentId]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/images/[rootId]/[file]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/start/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/attachments/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route.js +1 -1
- package/.next/server/app/api/roots/[id]/chat/[topicId]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route.js +1 -1
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stop/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route.js +2 -2
- package/.next/server/app/api/roots/[id]/chat/[topicId]/stream/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/dashboard/route.js +1 -1
- package/.next/server/app/api/roots/[id]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/roots/[id]/suggestions/route.js +1 -1
- package/.next/server/app/api/roots/[id]/suggestions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/bundle.js/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/host/route.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/host/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/host-api.mjs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/host-ui.mjs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/iframe/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/utilities/[scope]/[id]/style.css/route_client-reference-manifest.js +1 -1
- package/.next/server/app/audit/page.js +1 -1
- package/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/server/app/onboarding/page.js +3 -3
- package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/[id]/chat/[topicId]/page.js +2 -2
- package/.next/server/app/roots/[id]/chat/[topicId]/page.js.nft.json +1 -1
- package/.next/server/app/roots/[id]/chat/[topicId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/[id]/kb/[...slug]/page.js +2 -2
- package/.next/server/app/roots/[id]/kb/[...slug]/page.js.nft.json +1 -1
- package/.next/server/app/roots/[id]/kb/[...slug]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/[id]/page.js +2 -2
- package/.next/server/app/roots/[id]/page.js.nft.json +1 -1
- package/.next/server/app/roots/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/[id]/workflows/[wfId]/page.js +2 -2
- package/.next/server/app/roots/[id]/workflows/[wfId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/[id]/workflows/page.js +1 -1
- package/.next/server/app/roots/[id]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/roots/[id]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/roots/new/page.js +4 -4
- package/.next/server/app/roots/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +5 -5
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/share/[id]/file/page.js +1 -1
- package/.next/server/app/share/[id]/file/page_client-reference-manifest.js +1 -1
- package/.next/server/app/share/[id]/page.js +2 -2
- package/.next/server/app/share/[id]/page.js.nft.json +1 -1
- package/.next/server/app/share/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/utilities/[scope]/[id]/page.js +2 -2
- package/.next/server/app/utilities/[scope]/[id]/page.js.nft.json +1 -1
- package/.next/server/app/utilities/[scope]/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/utilities/page.js +2 -2
- package/.next/server/app/utilities/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +7 -7
- package/.next/server/chunks/2035.js +1 -1
- package/.next/server/chunks/285.js +108 -5
- package/.next/server/chunks/2995.js +1 -1
- package/.next/server/chunks/3332.js +1 -1
- package/.next/server/chunks/{9427.js → 3662.js} +1 -1
- package/.next/server/chunks/4347.js +3 -0
- package/.next/server/chunks/4812.js +1 -1
- package/.next/server/chunks/4836.js +1 -0
- package/.next/server/chunks/6909.js +106 -3
- package/.next/server/chunks/{5068.js → 7264.js} +2 -2
- package/.next/server/chunks/8823.js +1 -0
- package/.next/server/chunks/9098.js +1 -1
- package/.next/server/chunks/9402.js +1 -0
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +5 -5
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/3873-924fc0f386eb1005.js +1 -0
- package/.next/static/chunks/4108.e2aef54ba9b68f73.js +1 -0
- package/.next/static/chunks/4690-3065e11cc18ad056.js +1 -0
- package/.next/static/chunks/5779-bf4e7d8930f04f49.js +1 -0
- package/.next/static/chunks/{8871-2948840b33c0863d.js → 6886-4b169c08d9745ce0.js} +1 -1
- package/.next/static/chunks/8982-137b26d526f24a8b.js +1 -0
- package/.next/static/chunks/app/layout-f939333a791cb267.js +1 -0
- package/.next/static/chunks/app/onboarding/page-4291d58b0c6b16e1.js +1 -0
- package/.next/static/chunks/app/{page-97d312db91d569f7.js → page-c84defded9ae76c3.js} +1 -1
- package/.next/static/chunks/app/roots/[id]/chat/[topicId]/page-9de733628c6de625.js +1 -0
- package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-f7772a63468ff75d.js +1 -0
- package/.next/static/chunks/app/roots/[id]/page-db94c337847a0543.js +1 -0
- package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-cc556969ba89dab1.js +1 -0
- package/.next/static/chunks/app/roots/new/page-70df040d98ddfcb9.js +1 -0
- package/.next/static/chunks/app/settings/page-0451927b1906fdf0.js +1 -0
- package/.next/static/chunks/app/share/[id]/page-04701cd3e2f42faf.js +1 -0
- package/.next/static/chunks/app/utilities/[scope]/[id]/page-b5c5ca2c72af92a4.js +1 -0
- package/.next/static/chunks/app/utilities/page-d66b3d654623ac67.js +1 -0
- package/.next/static/chunks/{webpack-bddc3babcbc30dd7.js → webpack-4f6b598d96af4ca7.js} +1 -1
- package/.next/trace +47 -47
- package/package.json +1 -1
- package/.next/server/chunks/2959.js +0 -1
- package/.next/server/chunks/4514.js +0 -3
- package/.next/server/chunks/9538.js +0 -1
- package/.next/server/chunks/963.js +0 -1
- package/.next/static/chunks/2865-134f546f21ca4330.js +0 -1
- package/.next/static/chunks/4108.5abdb7812a13eafd.js +0 -1
- package/.next/static/chunks/5254-4196f25e56270de5.js +0 -1
- package/.next/static/chunks/5521-cbc665104c7e59d3.js +0 -1
- package/.next/static/chunks/8855-9b941d2b78f398ce.js +0 -1
- package/.next/static/chunks/app/layout-d4cf24375db6d793.js +0 -1
- package/.next/static/chunks/app/onboarding/page-7303664b62ccc24a.js +0 -1
- package/.next/static/chunks/app/roots/[id]/chat/[topicId]/page-123f60a544619a3c.js +0 -1
- package/.next/static/chunks/app/roots/[id]/kb/[...slug]/page-e253597edb1b2440.js +0 -1
- package/.next/static/chunks/app/roots/[id]/page-91a8de6a1c79f8a3.js +0 -1
- package/.next/static/chunks/app/roots/[id]/workflows/[wfId]/page-4300a52e163883df.js +0 -1
- package/.next/static/chunks/app/roots/new/page-6b104aad46a38173.js +0 -1
- package/.next/static/chunks/app/settings/page-afe1b80f7f45c5eb.js +0 -1
- package/.next/static/chunks/app/share/[id]/page-a5fb565bd892d4df.js +0 -1
- package/.next/static/chunks/app/utilities/[scope]/[id]/page-eb713a2b5209942c.js +0 -1
- package/.next/static/chunks/app/utilities/page-b7f30c151c42a27c.js +0 -1
- /package/.next/static/{IGuuMcet1qtGZQCP2MEn4 → qL2ylFt2IFmDVVrLaCl4u}/_buildManifest.js +0 -0
- /package/.next/static/{IGuuMcet1qtGZQCP2MEn4 → qL2ylFt2IFmDVVrLaCl4u}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,71 @@ Auto-generated index. Edit freely — Reflex only appends new entries below.
|
|
|
4
4
|
|
|
5
5
|
## Files
|
|
6
6
|
|
|
7
|
-
`}m+=l+"\n",await d.promises.writeFile(g,m,"utf8"),e.add(g)}}return[...e]}async function n(a,b,c){let e;try{e=await d.promises.readdir(b,{withFileTypes:!0})}catch{return}for(let g of e){if(g.isDirectory()){if(b===a&&j.has(g.name)||"utilities"===g.name)continue;await n(a,f().join(b,g.name),c);continue}if(!g.name.toLowerCase().endsWith(".md"))continue;let e=f().join(b,g.name);try{let a=await d.promises.stat(e);c.set(e,a.mtimeMs)}catch{}}}async function o(a){try{let b=await d.promises.readFile(a,"utf8");if(!b.startsWith("---"))return{};let c=h()(b).data,e={};return"string"==typeof c.title&&(e.title=c.title),"string"==typeof c.kind&&(e.kind=c.kind),e}catch{return{}}}async function p(a){try{return await d.promises.access(a),!0}catch{return!1}}},1701:(a,b,c)=>{c.d(b,{GC:()=>l,Mn:()=>m,az:()=>n});var d=c(73024),e=c(76760),f=c.n(e),g=c(29163);let h=f().join((0,g._)(),"pending-mcp-adds.json");async function i(){try{let a=await d.promises.readFile(h,"utf8"),b=JSON.parse(a);if(1!==b.version||!Array.isArray(b.entries))return{version:1,entries:[]};return b}catch{return{version:1,entries:[]}}}async function j(a){await d.promises.mkdir(f().dirname(h),{recursive:!0}),await d.promises.writeFile(h,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(h,384)}catch{}}function k(a){let b=Date.now()-2592e6;return{version:1,entries:a.entries.filter(a=>{let c=Date.parse(a.createdAt);return Number.isFinite(c)&&c>b})}}async function l(a){let b=k(await i());b.entries=b.entries.filter(b=>b.requestId!==a.requestId),b.entries.push({...a,createdAt:new Date().toISOString()}),await j(b)}async function m(){return k(await i()).entries}async function n(a){let b=k(await i()),c=b.entries.findIndex(b=>b.requestId===a);if(c<0)return null;let d=b.entries[c];return b.entries.splice(c,1),await j(b),d}},3613:(a,b,c)=>{c.d(b,{k:()=>m});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(29163);let j=f().join((0,i._)(),"skills"),k=[{id:"deep-research",title:"Deep research",description:"
|
|
7
|
+
`}m+=l+"\n",await d.promises.writeFile(g,m,"utf8"),e.add(g)}}return[...e]}async function n(a,b,c){let e;try{e=await d.promises.readdir(b,{withFileTypes:!0})}catch{return}for(let g of e){if(g.isDirectory()){if(b===a&&j.has(g.name)||"utilities"===g.name)continue;await n(a,f().join(b,g.name),c);continue}if(!g.name.toLowerCase().endsWith(".md"))continue;let e=f().join(b,g.name);try{let a=await d.promises.stat(e);c.set(e,a.mtimeMs)}catch{}}}async function o(a){try{let b=await d.promises.readFile(a,"utf8");if(!b.startsWith("---"))return{};let c=h()(b).data,e={};return"string"==typeof c.title&&(e.title=c.title),"string"==typeof c.kind&&(e.kind=c.kind),e}catch{return{}}}async function p(a){try{return await d.promises.access(a),!0}catch{return!1}}},1701:(a,b,c)=>{c.d(b,{GC:()=>l,Mn:()=>m,az:()=>n});var d=c(73024),e=c(76760),f=c.n(e),g=c(29163);let h=f().join((0,g._)(),"pending-mcp-adds.json");async function i(){try{let a=await d.promises.readFile(h,"utf8"),b=JSON.parse(a);if(1!==b.version||!Array.isArray(b.entries))return{version:1,entries:[]};return b}catch{return{version:1,entries:[]}}}async function j(a){await d.promises.mkdir(f().dirname(h),{recursive:!0}),await d.promises.writeFile(h,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(h,384)}catch{}}function k(a){let b=Date.now()-2592e6;return{version:1,entries:a.entries.filter(a=>{let c=Date.parse(a.createdAt);return Number.isFinite(c)&&c>b})}}async function l(a){let b=k(await i());b.entries=b.entries.filter(b=>b.requestId!==a.requestId),b.entries.push({...a,createdAt:new Date().toISOString()}),await j(b)}async function m(){return k(await i()).entries}async function n(a){let b=k(await i()),c=b.entries.findIndex(b=>b.requestId===a);if(c<0)return null;let d=b.entries[c];return b.entries.splice(c,1),await j(b),d}},3613:(a,b,c)=>{c.d(b,{k:()=>m});var d=c(73024),e=c(76760),f=c.n(e),g=c(30192),h=c.n(g),i=c(29163);let j=f().join((0,i._)(),"skills"),k=[{id:"deep-research",title:"Deep research",description:"Multi-agent research with citation discipline — facts and synthesis land as cross-linked KB entries.",author:"builtin",instructions:`## Skill: deep-research
|
|
8
|
+
|
|
9
|
+
Run the investigation like a professional analyst. This skill is NOT a chat answer; it produces durable, cited KB artifacts.
|
|
10
|
+
|
|
11
|
+
### Step 1 — Scope (this turn)
|
|
12
|
+
Read the user's request. If it's ambiguous (timeframe, depth, perspective), ask up to 3 questions in a single \`<<reflex:question>>\` block. Otherwise, write a short search plan: 3–8 key sub-questions that, answered together, fully address the user's request. Pick the plan; then continue to Step 2 in the SAME turn.
|
|
13
|
+
|
|
14
|
+
### Step 2 — Parallel dispatch (this turn)
|
|
15
|
+
For each sub-question, emit a \`<<reflex:dispatch>>\` to a \`researcher\` sub-agent with role-specific brief:
|
|
16
|
+
|
|
17
|
+
\`\`\`
|
|
18
|
+
<<reflex:dispatch>>{"id":"r1","role":"researcher","brief":"Question: <sub-question>. Use WebSearch + WebFetch. Return STRICTLY: a JSON array of findings. Each finding = {claim: '<one-sentence fact>', url: '<source>', date: '<ISO if findable, else null>', confidence: 'high'|'medium'|'low'}. Reject any claim you cannot back with a real URL — return an empty array rather than guess. No prose."}<</reflex:dispatch>>
|
|
19
|
+
\`\`\`
|
|
20
|
+
|
|
21
|
+
Multiple dispatches in one turn run in parallel. STOP after emitting markers — Reflex re-invokes you with results.
|
|
22
|
+
|
|
23
|
+
### Step 3 — Citation triage (next turn)
|
|
24
|
+
When sub-agent outputs arrive, parse each into the {claim,url,date,confidence} shape. If a sub-agent returned uncited claims OR an empty array on a critical question, re-dispatch ONE retry with a tighter brief ("Your previous reply lacked citations. Find 1–3 verifiable sources for: <sub-question>.").
|
|
25
|
+
|
|
26
|
+
### Step 4 — Synthesis + KB write (final turn)
|
|
27
|
+
Compose the master \`research-note\`. The body must be markdown with three sections: **Findings** (every claim with inline \`[source](url)\` citation), **Gaps** (what couldn't be sourced), **Open questions** (what to investigate next). Emit:
|
|
28
|
+
|
|
29
|
+
\`\`\`
|
|
30
|
+
<<reflex:kb>>{"kind":"research-note","title":"<topic — 4-9 words>","body":"<full markdown report>","meta":{"questionsPlanned":<n>,"factsCount":<n>,"researchedAt":"<ISO>"}}<</reflex:kb>>
|
|
31
|
+
\`\`\`
|
|
32
|
+
|
|
33
|
+
Then emit ONE \`<<reflex:kb>>\` per sourced fact:
|
|
34
|
+
|
|
35
|
+
\`\`\`
|
|
36
|
+
<<reflex:kb>>{"kind":"research-fact","title":"<claim — 4-12 words>","body":"<claim sentence>\\n\\nSource: [<domain>](<url>) (<date>)","meta":{"sourceUrl":"<url>","sourceDate":"<ISO or null>","confidence":"<high|medium|low>","researchNote":"<title of master note>"}}<</reflex:kb>>
|
|
37
|
+
\`\`\`
|
|
38
|
+
|
|
39
|
+
### Step 5 — Reply
|
|
40
|
+
Tell the user, in one paragraph, what was found and where it lives in the KB. If \`>=5\` facts came back, propose a \`link-list\` or \`news-list\` widget via \`<<reflex:widget-create>>\`.
|
|
41
|
+
|
|
42
|
+
### Rules
|
|
43
|
+
- Never answer from model memory; every claim flows through WebSearch/WebFetch via a sub-agent.
|
|
44
|
+
- Don't fabricate dates. Use \`null\` if the page has no clear date.
|
|
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:"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
|
+
|
|
48
|
+
Generate a weekly reflection from the user's recent journal entries.
|
|
49
|
+
|
|
50
|
+
Procedure:
|
|
51
|
+
1. Use \`Glob\` to list \`.reflex/kb/journal/*.md\`. Read the last 14 entries (most recent by meta.date).
|
|
52
|
+
2. Analyze across them: recurring themes, mood drift, goals raised vs progress made, cognitive distortions you can name (overgeneralization, catastrophizing, mind-reading, etc.) — only when clearly evidenced in the text, never as armchair diagnosis.
|
|
53
|
+
3. Pick ONE central theme for the week (e.g. "work-life boundary slipping", "momentum on the side project", "loneliness on weekends").
|
|
54
|
+
4. Emit ONE \`<<reflex:image-gen>>\` marker with a metaphorical visual for the theme (style: minimalist illustration; aspectRatio: 16:9; provider: gemini). Set \`attachToKb: true\`.
|
|
55
|
+
5. Emit ONE \`<<reflex:kb>>\` marker for the reflection:
|
|
56
|
+
|
|
57
|
+
\`\`\`
|
|
58
|
+
<<reflex:kb>>{
|
|
59
|
+
"kind": "weekly-reflection",
|
|
60
|
+
"title": "Week of <Mon date> — <theme>",
|
|
61
|
+
"body": "<markdown: image, theme paragraph, themes-list with evidence quotes from journal entries, distortions-noticed list with gentle reframes, one suggested experiment for next week>",
|
|
62
|
+
"meta": { "weekStart": "<ISO Monday>", "weekEnd": "<ISO Sunday>", "entriesAnalyzed": <n>, "theme": "<theme>" }
|
|
63
|
+
}<</reflex:kb>>
|
|
64
|
+
\`\`\`
|
|
65
|
+
|
|
66
|
+
6. Reply to the user with a 2-sentence summary and a single open question they could sit with for the coming week.
|
|
67
|
+
|
|
68
|
+
Constraints:
|
|
69
|
+
- Quote the user's own words when illustrating themes — don't paraphrase into something they didn't say.
|
|
70
|
+
- If fewer than 4 entries exist in the window, say so and skip the reflection (it's not enough signal yet).
|
|
71
|
+
- Avoid clinical language. "Notice" not "diagnose".`},{id:"kb-curator",title:"KB curator",description:"Turns raw content into clean KB notes with the right kind and meta.",author:"builtin",instructions:"## Skill: kb-curator\n\nYou are the knowledge-base curator. Every input - note, fact, or link - becomes a tidy KB entry:\n 1. Determine the `kind` (fact | task | meeting | product | person | place | event | ...). If ambiguous - ask.\n 2. Title: 4-9 words, no quotes, no trailing period.\n 3. `meta`: put structured fields here (ISO dates, links, tags). Do NOT duplicate them in the body.\n 4. `body`: anything that didn't fit in meta - context, nuance, quotes with sources.\n 5. Emit a `<<reflex:kb>>` marker; do not write via Write - the manager places it in the correct folder.\n 6. If the entry adds to an existing topic - mention sibling files via @-mentions in chat (for context, not for the agent)."}];async function l(){let a;try{a=await d.promises.readdir(j,{withFileTypes:!0})}catch{return[]}let b=[];for(let c of a)if(c.isFile()&&c.name.toLowerCase().endsWith(".md"))try{let a=await d.promises.readFile(f().join(j,c.name),"utf8"),e=h()(a),g=e.data,i="string"==typeof g.id?g.id:null;if(!i)continue;b.push({id:i,title:"string"==typeof g.title?g.title:i,description:"string"==typeof g.description?g.description:"",author:"user",instructions:e.content.trim()})}catch{}return b}async function m(a){let b=(await l()).find(b=>b.id===a);return b||(k.find(b=>b.id===a)??null)}},5243:(a,b,c)=>{c.d(b,{addMcpServer:()=>r,getMcpServer:()=>q,listMcpServers:()=>p,updateMcpServer:()=>s});var d=c(73024),e=c(76760),f=c.n(e),g=c(14126),h=c(88124),i=c(29163);let j=f().join((0,i._)(),"mcp"),k=f().join(j,"servers.json"),l=g.Ik({id:g.Yj().min(1).max(64).regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"id must start with a letter; letters, digits, '_' and '-' allowed"),label:g.Yj().min(1).max(120),description:g.Yj().max(2e3).default(""),config:h.McpConfigSchema,addedAt:g.Yj(),lastVerifiedAt:g.Yj().optional()}),m=g.Ik({version:g.eu(1),servers:g.YO(l)});async function n(){try{let a=await d.promises.readFile(k,"utf8"),b=m.safeParse(JSON.parse(a));if(!b.success)return{version:1,servers:[]};return b.data}catch{return{version:1,servers:[]}}}async function o(a){await d.promises.mkdir(j,{recursive:!0}),await d.promises.writeFile(k,JSON.stringify(a,null,2)+"\n",{encoding:"utf8",mode:384});try{await d.promises.chmod(k,384)}catch{}}async function p(){return[...(await n()).servers].sort((a,b)=>a.id.localeCompare(b.id))}async function q(a){return(await n()).servers.find(b=>b.id===a)??null}async function r(a){let b=l.parse({id:a.id,label:a.label,description:a.description??"",config:a.config,addedAt:new Date().toISOString()}),c=await n();if(c.servers.some(a=>a.id===b.id))throw Error(`MCP server "${b.id}" already exists`);return c.servers.push(b),await o(c),b}async function s(a,b){let c=await n(),d=c.servers.findIndex(b=>b.id===a);if(d<0)throw Error(`MCP server "${a}" not found`);let e=l.parse({...c.servers[d],...b});return c.servers[d]=e,await o(c),e}},7188:(a,b,c)=>{c.d(b,{buildRecord:()=>w,iq:()=>p,listWidgets:()=>m,readLayout:()=>s,readWidget:()=>n,reconcileLayout:()=>u,writeLayout:()=>t,writeWidget:()=>o});var d=c(73024),e=c(76760),f=c.n(e),g=c(13474),h=c(11244);function i(a){return f().join((0,g.FF)(a),"widgets")}function j(a,b){return f().join(i(a),`${l(b)}.json`)}function k(a){return f().join((0,g.FF)(a),"dashboard-layout.json")}function l(a){return a.replace(/[^A-Za-z0-9_-]/g,"-").slice(0,80)}async function m(a){let b,c=i(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);v(g)&&e.push(g)}catch{}return e}async function n(a,b){try{let c=await d.promises.readFile(j(a,b),"utf8"),e=JSON.parse(c);return v(e)?e:null}catch{return null}}async function o(a,b){if(!v(b))throw Error(`Invalid widget record (id=${b.id}, kind=${b.kind})`);await d.promises.mkdir(i(a),{recursive:!0}),await d.promises.writeFile(j(a,b.id),JSON.stringify(b,null,2)+"\n","utf8")}async function p(a,b){try{let c=(0,g.FF)(a),e=f().resolve(c,b),h=f().relative(c,e);if(h.startsWith("..")||f().isAbsolute(h))return null;return await d.promises.readFile(e,"utf8")}catch{return null}}let q={order:["sys:active-goals","sys:pending","sys:recent-kb","sys:ai-suggestions"],hidden:[],sizes:{}},r=new Set(["sm","md","wide"]);async function s(a){try{let b=await d.promises.readFile(k(a),"utf8"),c=JSON.parse(b);if(!Array.isArray(c.order)||!Array.isArray(c.hidden))return q;let e={};if(c.sizes&&"object"==typeof c.sizes)for(let[a,b]of Object.entries(c.sizes))"string"==typeof b&&r.has(b)&&(e[a]=b);return{order:c.order.filter(a=>"string"==typeof a),hidden:c.hidden.filter(a=>"string"==typeof a),sizes:e}}catch{return q}}async function t(a,b){await d.promises.mkdir((0,g.FF)(a),{recursive:!0}),await d.promises.writeFile(k(a),JSON.stringify(b,null,2)+"\n","utf8")}function u(a,b,c){let d=new Set([...b,...c]),e=a.order.filter(a=>d.has(a)),f=a.hidden.filter(a=>d.has(a)),g=new Set([...e,...f]);for(let a of[...c,...b])g.has(a)||e.push(a);let h={};if(a.sizes)for(let[b,c]of Object.entries(a.sizes))d.has(b)&&(h[b]=c);return{order:e,hidden:f,sizes:h}}function v(a){return!!a&&"object"==typeof a&&"string"==typeof a.id&&!!a.id&&"string"==typeof a.title&&"string"==typeof a.kind&&!!h.hU.includes(a.kind)&&!!a.data&&"object"==typeof a.data&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt&&!0}function w(a){let b=new Date().toISOString(),c=l(a.id);if(!c)throw Error("Widget id is empty after sanitization");if(!h.hU.includes(a.payload.kind))throw Error(`Unknown widget kind: ${a.payload.kind}`);let d=a.refresh??a.existing?.refresh,e=a.memory??a.existing?.memory,f=a.memoryFile??a.existing?.memoryFile,g=a.lastRefreshAt??a.existing?.lastRefreshAt;return{id:c,title:a.title||c,...a.description?{description:a.description}:{},...a.sourceTopicId?{sourceTopicId:a.sourceTopicId}:{},kind:a.payload.kind,data:a.payload.data,createdAt:a.existing?.createdAt??b,updatedAt:b,...a.size?{size:a.size}:a.existing?.size?{size:a.existing.size}:{},...d?{refresh:d}:{},...void 0!==e?{memory:e}:{},...f?{memoryFile:f}:{},...g?{lastRefreshAt:g}:{}}}},8734:(a,b,c)=>{c.d(b,{$4:()=>f,FB:()=>g,GX:()=>o,VM:()=>l,YE:()=>k,dA:()=>h,vl:()=>j,wr:()=>e,wt:()=>i,z7:()=>m,zM:()=>n});var d=c(25608);function e(a){let b=(0,d.dr)(a);return b&&("plan"===b.def.id||"goal"===b.def.id)?{kind:b.def.id,text:b.payload}:null}function f(a){return`## /plan — Plan-first mode
|
|
8
72
|
|
|
9
73
|
Reply in ${a}. **Before doing anything**, lay out a clear, numbered step-by-step plan. Each step should be concrete and verifiable.
|
|
10
74
|
|
|
@@ -35,7 +99,46 @@ Workflow each turn:
|
|
|
35
99
|
|
|
36
100
|
GOAL ACHIEVED
|
|
37
101
|
|
|
38
|
-
If you genuinely need user input mid-flight (clarification, permission for a risky action, missing data), pause via <<reflex:question>> or <<reflex:permission>>. Those markers stop auto-continuation; everything else keeps the loop going.`}function h(a,b){return["## /research — Deep research mode (this turn)","",`Reply in ${b}.`,a?`Topic: ${a}`:"","","Approach:"," 1. Delegate the main search to a sub-agent with role `researcher` via `<<reflex:dispatch>>` (one marker — it will sweep web + KB on its own).",' 2. If possible — multiple researchers in parallel with different angles (e.g. "history", "current state", "criticism").'," 3. Wait for results, **compose a synthesis**: similarities, disagreements, blind spots. Cite sources with links.",' 4. At the end, propose saving key facts to the KB via the `<<reflex:kb>>` marker (kind="research-note") — but wait for confirmation.'," 5. If the topic is deep — propose a `news-list` or `link-list` widget via `<<reflex:widget-create>>`.","","Don't answer from model memory — drive everything through WebSearch/WebFetch."].filter(Boolean).join("\n")}function i(a,b){return["## /widget — Create a dashboard widget","",`Reply in ${b}.`,a?`User request: ${a}`:"","","Rules:"," 1. Pick the appropriate `kind` (see the widgets block in the system prompt). If the request is ambiguous — ask via `<<reflex:question>>`."," 2. Pick a stable kebab-case `id` that can later be reused for widget-update."," 3. If you need fresh data (news, prices, statuses) — gather it via WebSearch/WebFetch before emitting."," 4. Emit **one** `<<reflex:widget-create>>` marker in this turn, then briefly tell the user what appeared on the dashboard.",' 5. If the widget makes sense to auto-refresh — set `refresh: "hourly"|"daily"|"weekly"` and describe `memory` for dedup/history.'].filter(Boolean).join("\n")}function j(a,b){return["## /workflow — Build a workflow (n8n-style linear recipe)","",`Reply in ${b}.`,a?`User request: ${a}`:"","","Rules:"," 1. If the task is ambiguous (what's included, where to write, how often) — ask 1-3 clarifying questions via `<<reflex:question>>` in a SINGLE block. Don't guess."," 2. Steps are SHORT (3-5). Supported kinds: `text-template`, `http-request`, `web-fetch`, `ask-agent`, `kb-write`. If the task is broader — split it into multiple workflows."," 3. Each step's `id` is stable kebab-case (templates use it: `{{steps.<id>.output}}`)."," 4. Trigger defaults to `manual`. Set `hourly/daily/weekly` only if the user explicitly asked for a schedule."," 5. Emit **one** `<<reflex:workflow-create>>` marker in this turn. Don't duplicate the JSON in text — the preview card renders in chat automatically."," 6. After the marker — a short plan in words: what the workflow does step by step, how to run it, what appears as the result."].filter(Boolean).join("\n")}function k(a,b){return["## /mcp — Connect an MCP server","",`Reply in ${b}.`,a?`Request: ${a}`:"The user wants to connect an MCP server but didn't specify which one.","","Act as an MCP wizard:",' 1. If the request is concrete (e.g. "github mcp", "notion") — pick a config right away and propose it via `<<reflex:mcp-add>>`. Don\'t forget secrets slots with a description of where to get the token.'," 2. If the request is abstract — ask via `<<reflex:question>>` what to connect (Notion / Slack / GitHub / Linear / other)."," 3. If it's about an existing server — ask the user to use its tools; don't propose the add card again."].filter(Boolean).join("\n")}let l=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:()=>G});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(59835),n=c(7188),o=c(13295),p=c(24058),q=c(49353),r=c(911),s=c(1701),t=c(35053),u=c(61105),v=c(17640),w=c(56843),x=c(8734),y=c(24776),z=a([h,p]);[h,p]=z.then?(await z)():z;class E{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=C(),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:A(),...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=C();a.userMessage&&await this.emit({type:"user-message",text:a.userMessage,agentId:a.agentId,ts:A(),seq:0}),await this.emit({type:"turn-start",turnId:c,agentId:a.agentId,ts:A(),seq:0});let d=null;try{d=await (0,r.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:A(),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:A(),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:A(),seq:0})}):f&&setTimeout(()=>{this.continueTurn(a.agentId,`[Reflex /goal] Continue execution. Active goal: ${f.goal}. Iteration ${f.iteration}/${x.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:A(),seq:0}),await this.emit({type:"turn-end",turnId:c,status:"failed",error:d,agentId:a.agentId,ts:A(),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:A(),seq:0});let f="";if("tool-policy"===c&&"allow"===b.decision&&b.tool)try{let a=await (0,v.M)(),c=d.meta.task,e=a.assignments[c];e&&!e.allowedTools.includes(b.tool)&&(e.allowedTools=[...e.allowedTools,b.tool],await (0,v.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:A(),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:A(),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,s.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:A(),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 B(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:A(),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:A(),seq:0}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:A(),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:A(),seq:0});let e=[];try{let a=await (0,v.M)();e=a.assignments[c.meta.task]?.allowedTools??[]}catch{}let f=await D(d.rootPath,c.meta.topicId),g=`Prior conversation:
|
|
102
|
+
If you genuinely need user input mid-flight (clarification, permission for a risky action, missing data), pause via <<reflex:question>> or <<reflex:permission>>. Those markers stop auto-continuation; everything else keeps the loop going.`}function h(a,b){return["## /research — Deep research mode (this turn)","",`Reply in ${b}.`,a?`Topic: ${a}`:"","","Approach:"," 1. Delegate the main search to a sub-agent with role `researcher` via `<<reflex:dispatch>>` (one marker — it will sweep web + KB on its own).",' 2. If possible — multiple researchers in parallel with different angles (e.g. "history", "current state", "criticism").'," 3. Wait for results, **compose a synthesis**: similarities, disagreements, blind spots. Cite sources with links.",' 4. At the end, propose saving key facts to the KB via the `<<reflex:kb>>` marker (kind="research-note") — but wait for confirmation.'," 5. If the topic is deep — propose a `news-list` or `link-list` widget via `<<reflex:widget-create>>`.","","Don't answer from model memory — drive everything through WebSearch/WebFetch."].filter(Boolean).join("\n")}function i(a,b){return["## /widget — Create a dashboard widget","",`Reply in ${b}.`,a?`User request: ${a}`:"","","Rules:"," 1. Pick the appropriate `kind` (see the widgets block in the system prompt). If the request is ambiguous — ask via `<<reflex:question>>`."," 2. Pick a stable kebab-case `id` that can later be reused for widget-update."," 3. If you need fresh data (news, prices, statuses) — gather it via WebSearch/WebFetch before emitting."," 4. Emit **one** `<<reflex:widget-create>>` marker in this turn, then briefly tell the user what appeared on the dashboard.",' 5. If the widget makes sense to auto-refresh — set `refresh: "hourly"|"daily"|"weekly"` and describe `memory` for dedup/history.'].filter(Boolean).join("\n")}function j(a,b){return["## /workflow — Build a workflow (n8n-style linear recipe)","",`Reply in ${b}.`,a?`User request: ${a}`:"","","Rules:"," 1. If the task is ambiguous (what's included, where to write, how often) — ask 1-3 clarifying questions via `<<reflex:question>>` in a SINGLE block. Don't guess."," 2. Steps are SHORT (3-5). Supported kinds: `text-template`, `http-request`, `web-fetch`, `ask-agent`, `kb-write`. If the task is broader — split it into multiple workflows."," 3. Each step's `id` is stable kebab-case (templates use it: `{{steps.<id>.output}}`)."," 4. Trigger defaults to `manual`. Set `hourly/daily/weekly` only if the user explicitly asked for a schedule."," 5. Emit **one** `<<reflex:workflow-create>>` marker in this turn. Don't duplicate the JSON in text — the preview card renders in chat automatically."," 6. After the marker — a short plan in words: what the workflow does step by step, how to run it, what appears as the result."].filter(Boolean).join("\n")}function k(a,b){return["## /mcp — Connect an MCP server","",`Reply in ${b}.`,a?`Request: ${a}`:"The user wants to connect an MCP server but didn't specify which one.","","Act as an MCP wizard:",' 1. If the request is concrete (e.g. "github mcp", "notion") — pick a config right away and propose it via `<<reflex:mcp-add>>`. Don\'t forget secrets slots with a description of where to get the token.'," 2. If the request is abstract — ask via `<<reflex:question>>` what to connect (Notion / Slack / GitHub / Linear / other)."," 3. If it's about an existing server — ask the user to use its tools; don't propose the add card again."].filter(Boolean).join("\n")}function l(a,b){let c=a.trim().split(/\s+/),d=c[0]??"",e=c.slice(1).join(" ");return["## /distill — Pull a source into the second brain","",`Reply in ${b}.`,d?`Source URL: ${d}`:"No URL provided — ask the user for one and stop.",e?`User focus: ${e}`:"","","Procedure (must follow in order):"," 1. Use `WebFetch` on the URL to read the actual content. If it's a YouTube link, emit `<<reflex:youtube-summary>>` instead and stop — the rest of this protocol resumes on the next turn with the summary in context."," 2. Extract structured fields:"," - **keyFacts** (3-8 bullets, each verifiable from the source)"," - **contrarianView** (the strongest counter-argument or a credible disagreement)"," - **actionItems** (concrete next steps the reader could take)"," - **followUpQuestions** (what the article didn't answer)"," 3. Search the existing KB via `Glob`/`Grep` for 1-3 adjacent notes — same topic, same domain, same people. Note their rel-paths."," 4. Pick a hero image: try `reflex.images.search` for a visual that fits the topic; if no provider key is set, skip this step silently."," 5. Emit exactly one `<<reflex:kb>>` marker:","","```","<<reflex:kb>>{",' "kind": "distilled-source",',` "title": "<succinct article title — 4-9 words>",`,' "body": "<markdown: hero image (if any), keyFacts list, contrarianView paragraph, actionItems list, followUpQuestions list, link to source, links to adjacent notes>",',' "meta": {',' "sourceUrl": "<original URL>",',' "sourceDate": "<ISO date from the page if present>",',' "backlinks": ["<rel-path>", ...]'," }","}<</reflex:kb>>","```",""," 6. After the marker, reply with a 2-3 sentence summary plus a list of the adjacent notes found (if any), so the user knows the new entry connects into their graph."," 7. Don't paraphrase the article in the reply — the entry IS the artifact; the reply is just orientation."].filter(Boolean).join("\n")}function m(a,b){return"end"===a.trim().toLowerCase()?`## /practice end — Session post-mortem
|
|
103
|
+
|
|
104
|
+
Reply in ${b}.
|
|
105
|
+
|
|
106
|
+
Review the entire conversation in this topic. Produce a written analysis covering:
|
|
107
|
+
- Timeline (who said what, key inflection points)
|
|
108
|
+
- Missed openings (places where the user could have steered differently)
|
|
109
|
+
- Suggested phrasings for the trickiest moments
|
|
110
|
+
- One-line key insight
|
|
111
|
+
|
|
112
|
+
Emit a single KB marker:
|
|
113
|
+
|
|
114
|
+
<<reflex:kb>>{"kind":"practice-session","title":"<scenario summary>","body":"<full analysis markdown>","meta":{"scenario":"<from earlier in topic>","turns":<n>}}<</reflex:kb>>
|
|
115
|
+
|
|
116
|
+
After the marker, give the user a 2-sentence wrap-up and suggest one drill they could practice next.`:["## /practice — Difficult-conversation roleplay","",`Reply in ${b}.`,a?`Scenario: ${a}`:"No scenario provided.","","This is a roleplay session. **You are not the counterpart** — you orchestrate.","","First turn protocol (now):"," 1. If the scenario is thin, ask 1-3 scoping questions via `<<reflex:question>>` in a single block:"," - Who is the counterpart (relationship, role, stake)?"," - What's the user's goal in this conversation?"," - Any history that matters (prior conflicts, shared context)?",' 2. If scoping is sufficient, write a brief persona sketch (2-3 lines) and announce "Session ready — say your opening line."'," 3. Persist the scenario + persona to topic memory by emitting:","",` <<reflex:kb>>{"kind":"practice-session","title":"<scenario>","body":"### Scenario\\n...\\n### Persona\\n...","meta":{"phase":"setup","scenario":"<short>"}}<</reflex:kb>>`,"","Subsequent turns (when the user has spoken their line):"," 1. Dispatch the counterpart to deliver one reply, then the coach for feedback. ONE turn = TWO concurrent dispatches:","",` <<reflex:dispatch>>{"id":"cp","role":"counterpart","brief":"Persona: <persona>. Goal of the user: <goal>. Respond in character to: <user's last line>. Be realistic — resist, push back, ask clarifying questions when it fits. 1-3 sentences. Don't break character."}<</reflex:dispatch>>`,' <<reflex:dispatch>>{"id":"co","role":"coach","brief":"You are a communication coach. The user is practicing: <scenario>. They just said: <user\'s last line>. The counterpart will reply. In 1-2 sentences, name ONE thing the user did well AND ONE thing to improve. Suggest an alternate phrasing for next turn. Plain prose, no marker."}<</reflex:dispatch>>',""," 2. On the next turn, you'll see both outputs. Compose the reply as:","",' **<Counterpart name>:** "<counterpart\'s words>"',""," <details><summary>Coach feedback</summary>"," <coach output>"," </details>","","End-of-session:"," - When the user types `/practice end`, the post-mortem protocol kicks in (separate command)."].filter(Boolean).join("\n")}function n(a){return`## /reflect — Daily check-in
|
|
117
|
+
|
|
118
|
+
Reply in ${a}.
|
|
119
|
+
|
|
120
|
+
Procedure:
|
|
121
|
+
1. Use \`Glob\` against \`.reflex/kb/journal/*.md\` (or \`Grep\` for \`kind: journal\` frontmatter) to find the last 7 journal entries. Read them — actual content, not just titles.
|
|
122
|
+
2. If TODAY's journal already exists (meta.date matches today's date), tell the user it's already done and offer to revisit specific entries instead. Stop.
|
|
123
|
+
3. Pick 3 questions. The first is general (mood / one-liner today). The next two are ADAPTED — reference something concrete from the recent entries ("yesterday you mentioned X — where did that land?", "three days ago you set goal Y — any movement?"). If no recent entries exist, fall back to general prompts (energy, one thing learned, one thing avoided).
|
|
124
|
+
4. Emit a SINGLE \`<<reflex:question>>\` block with all 3 questions formatted as a numbered list in the \`prompt\` field; mark \`freeText: true\`. STOP.
|
|
125
|
+
5. On the user's next turn (their answers), emit exactly one KB marker:
|
|
126
|
+
|
|
127
|
+
\`\`\`
|
|
128
|
+
<<reflex:kb>>{
|
|
129
|
+
"kind": "journal",
|
|
130
|
+
"title": "<one-line summary of today's entry — derived from the answers>",
|
|
131
|
+
"body": "### Question 1\\n<question>\\n\\n<answer>\\n\\n### Question 2\\n<question>\\n\\n<answer>\\n\\n### Question 3\\n<question>\\n\\n<answer>",
|
|
132
|
+
"meta": { "date": "<today ISO date>", "mood": "<one-word inferred mood: calm|tense|excited|tired|focused|scattered|down|other>" }
|
|
133
|
+
}<</reflex:kb>>
|
|
134
|
+
\`\`\`
|
|
135
|
+
|
|
136
|
+
6. After the marker, give the user a 1-sentence reflection — what stood out across their last few entries vs today. Don't psychoanalyse; just notice.
|
|
137
|
+
|
|
138
|
+
Constraints:
|
|
139
|
+
- Don't ask more than 3 questions in step 4. Two-line max per question.
|
|
140
|
+
- 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:()=>G});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(59835),n=c(7188),o=c(13295),p=c(24058),q=c(49353),r=c(911),s=c(1701),t=c(35053),u=c(61105),v=c(17640),w=c(56843),x=c(8734),y=c(24776),z=a([h,p]);[h,p]=z.then?(await z)():z;class E{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=C(),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:A(),...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=C();a.userMessage&&await this.emit({type:"user-message",text:a.userMessage,agentId:a.agentId,ts:A(),seq:0}),await this.emit({type:"turn-start",turnId:c,agentId:a.agentId,ts:A(),seq:0});let d=null;try{d=await (0,r.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:A(),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:A(),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:A(),seq:0})}):f&&setTimeout(()=>{this.continueTurn(a.agentId,`[Reflex /goal] Continue execution. Active goal: ${f.goal}. Iteration ${f.iteration}/${x.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:A(),seq:0}),await this.emit({type:"turn-end",turnId:c,status:"failed",error:d,agentId:a.agentId,ts:A(),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:A(),seq:0});let f="";if("tool-policy"===c&&"allow"===b.decision&&b.tool)try{let a=await (0,v.M)(),c=d.meta.task,e=a.assignments[c];e&&!e.allowedTools.includes(b.tool)&&(e.allowedTools=[...e.allowedTools,b.tool],await (0,v.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:A(),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:A(),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,s.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:A(),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 B(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:A(),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:A(),seq:0}),await l({type:"mcp-add-response",requestId:b.requestId,decision:"reject",agentId:a,ts:A(),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:A(),seq:0});let e=[];try{let a=await (0,v.M)();e=a.assignments[c.meta.task]?.allowedTools??[]}catch{}let f=await D(d.rootPath,c.meta.topicId),g=`Prior conversation:
|
|
39
142
|
|
|
40
143
|
${f}
|
|
41
144
|
|
|
@@ -61,7 +164,7 @@ ${f.join("\n\n")}
|
|
|
61
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=A(),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 A(){return new Date().toISOString()}let F=new Set(["claude-code","codex","ollama","image-gen"]);async function B(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 C(){return(0,f.randomUUID)().replace(/-/g,"").slice(0,12)}async function D(a,b){let c=await (0,g.wj)(a,b),d=[],e=null,f=()=>{e&&(d.push(`### ${e.role}
|
|
62
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 G=globalThis.__reflexAgentManager??new E;globalThis.__reflexAgentManager=G,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)}})},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}
|
|
63
166
|
|
|
64
|
-
${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 p(a,"<<reflex:permission>>","<</reflex:permission>>")}function e(a){let b=p(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 p(a,"<<reflex:kb>>","<</reflex:kb>>").filter(a=>"string"==typeof a?.kind&&"string"==typeof a?.title)}function g(a){return p(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 h(a){return p(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 i(a){return p(a,"<<reflex:youtube-summary>>","<</reflex:youtube-summary>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.url)}function j(a){return p(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 k(a){return p(a,"<<reflex:widget-create>>","<</reflex:widget-create>>").filter(m)}function l(a){return p(a,"<<reflex:widget-update>>","<</reflex:widget-update>>").filter(m)}function m(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 n(a){return p(a,"<<reflex:image-gen>>","<</reflex:image-gen>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.prompt&&a.prompt.trim().length>0)}function o(a){return p(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 p(a,b,c){let d=b.replace(/^<+/,"").replace(/>+$/,""),e=c.replace(/^<+/,"").replace(/>+$/,""),f=RegExp(`<{1,2}${q(d)}>{1,2}`,"g"),g=RegExp(`<{1,2}${q(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 q(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}c.d(b,{Bc:()=>f,Dq:()=>k,Eb:()=>h,Oo:()=>o,QN:()=>j,Up:()=>l,XZ:()=>i,dJ:()=>e,eD:()=>g,gQ:()=>d,qk:()=>n})},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:"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:()=>r});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=a([k]);k=(q.then?(await q)():q)[0];let t="рус";async function r(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,q=c.language,r=(0,g.FF)(b.path),v=(0,m.wr)(a.message),w=(0,n.dr)(a.message),x=a.message;v?"goal"===v.kind&&v.text?(await (0,o.PF)(b.path,a.topicId,v.text),x=v.text):"plan"===v.kind&&(x=v.text||a.message):w&&"agent-mode"===w.def.kind&&(x=w.payload||a.message);let y=null;if(w?.def.id==="skill"){let[a,...b]=w.payload.split(/\s+/);if(a){let c=await (0,p.k)(a);c&&(y=c.instructions,x=b.join(" ").trim()||x)}}let z=await (0,o.eF)(b.path,a.topicId),A=z?.meta.goal&&"active"===z.meta.goalStatus?z.meta.goal:void 0,B=await (0,h.M)({root:b.path,scope:b.path,reflexScope:r,language:q}),C=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(!u.has(d.hostname.toLowerCase())||c.has(a))continue;c.add(a),b.push(a)}catch{}}return b}(x),D=[B,A?(0,m.FB)(A,q):"",v?.kind==="plan"?(0,m.$4)(q):"",w?.def.id==="research"?(0,m.dA)(w.payload,q):"",w?.def.id==="widget"?(0,m.wt)(w.payload,q):"",w?.def.id==="mcp"?(0,m.YE)(w.payload,q):"",w?.def.id==="workflow"?(0,m.vl)(w.payload,q):"",y??"",a.focusFile?function(a,b,c){let d=f().join(b,a);return/russ/i.test(c)||RegExp(t,"i").test(c)?`## Open document — primary context
|
|
167
|
+
${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 p(a,"<<reflex:permission>>","<</reflex:permission>>")}function e(a){let b=p(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 p(a,"<<reflex:kb>>","<</reflex:kb>>").filter(a=>"string"==typeof a?.kind&&"string"==typeof a?.title)}function g(a){return p(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 h(a){return p(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 i(a){return p(a,"<<reflex:youtube-summary>>","<</reflex:youtube-summary>>").filter(a=>null!==a&&"object"==typeof a&&"string"==typeof a.url)}function j(a){return p(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 k(a){return p(a,"<<reflex:widget-create>>","<</reflex:widget-create>>").filter(m)}function l(a){return p(a,"<<reflex:widget-update>>","<</reflex:widget-update>>").filter(m)}function m(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 n(a){return p(a,"<<reflex:image-gen>>","<</reflex:image-gen>>").filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.prompt&&a.prompt.trim().length>0)}function o(a){return p(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 p(a,b,c){let d=b.replace(/^<+/,"").replace(/>+$/,""),e=c.replace(/^<+/,"").replace(/>+$/,""),f=RegExp(`<{1,2}${q(d)}>{1,2}`,"g"),g=RegExp(`<{1,2}${q(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 q(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}c.d(b,{Bc:()=>f,Dq:()=>k,Eb:()=>h,Oo:()=>o,QN:()=>j,Up:()=>l,XZ:()=>i,dJ:()=>e,eD:()=>g,gQ:()=>d,qk:()=>n})},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:()=>r});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=a([k]);k=(q.then?(await q)():q)[0];let t="рус";async function r(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,q=c.language,r=(0,g.FF)(b.path),v=(0,m.wr)(a.message),w=(0,n.dr)(a.message),x=a.message;v?"goal"===v.kind&&v.text?(await (0,o.PF)(b.path,a.topicId,v.text),x=v.text):"plan"===v.kind&&(x=v.text||a.message):w&&"agent-mode"===w.def.kind&&(x=w.payload||a.message);let y=null;if(w?.def.id==="skill"){let[a,...b]=w.payload.split(/\s+/);if(a){let c=await (0,p.k)(a);c&&(y=c.instructions,x=b.join(" ").trim()||x)}}let z=await (0,o.eF)(b.path,a.topicId),A=z?.meta.goal&&"active"===z.meta.goalStatus?z.meta.goal:void 0,B=await (0,h.M)({root:b.path,scope:b.path,reflexScope:r,language:q}),C=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(!u.has(d.hostname.toLowerCase())||c.has(a))continue;c.add(a),b.push(a)}catch{}}return b}(x),D=[B,A?(0,m.FB)(A,q):"",v?.kind==="plan"?(0,m.$4)(q):"",w?.def.id==="research"?(0,m.dA)(w.payload,q):"",w?.def.id==="widget"?(0,m.wt)(w.payload,q):"",w?.def.id==="mcp"?(0,m.YE)(w.payload,q):"",w?.def.id==="workflow"?(0,m.vl)(w.payload,q):"",w?.def.id==="distill"?(0,m.VM)(w.payload,q):"",w?.def.id==="practice"?(0,m.z7)(w.payload,q):"",w?.def.id==="reflect"?(0,m.zM)(q):"",y??"",a.focusFile?function(a,b,c){let d=f().join(b,a);return/russ/i.test(c)||RegExp(t,"i").test(c)?`## Open document — primary context
|
|
65
168
|
|
|
66
169
|
The user is currently reading this KB file: \`${a}\`
|
|
67
170
|
Absolute path: \`${d}\`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=
|
|
1
|
+
"use strict";exports.id=7264,exports.ids=[7264],exports.modules={16856:(a,b,c)=>{c.d(b,{Is:()=>g,L8:()=>h,ns:()=>i});var d=c(73745);c(66493);var e=c(65326),f=c(30878);async function g(a){try{if("utility"===a.kind&&(!a.utilityId||!a.utilityScope))return{ok:!1,error:"share kind=utility requires utilityId + utilityScope"};if("kb-file"===a.kind&&(!a.rootId||!a.kbRelPath))return{ok:!1,error:"share kind=kb-file requires rootId + kbRelPath"};if(("kb-tree"===a.kind||"project"===a.kind)&&!a.rootId)return{ok:!1,error:`share kind=${a.kind} requires rootId`};let b=await (0,f.cn)(a);return(0,e.revalidatePath)("/settings"),{ok:!0,share:b}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function h(){return{shares:await (0,f.Bg)()}}async function i(a){let b=await (0,f.Ru)(a);return(0,e.revalidatePath)("/settings"),{ok:b}}(0,c(63781).D)([g,h,i]),(0,d.A)(g,"400ce1c228adf378b3a87ae041eb73dbf272a6baef",null),(0,d.A)(h,"00805085007fe043265d98aa8fd03d583e55cafef8",null),(0,d.A)(i,"404ff3fce1c6c6e9e81ab3aba0f9550c3f5f31d727",null)},30878:(a,b,c)=>{c.d(b,{BE:()=>o,Bg:()=>m,Ru:()=>q,cn:()=>p,er:()=>n});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598),h=c.n(g),i=c(73652);let j=f().join((0,i._)(),"shares.json");async function k(){try{let a=await d.promises.readFile(j,"utf8"),b=JSON.parse(a);if(b&&Array.isArray(b.shares))return b}catch{}return{version:1,shares:[]}}async function l(a){await d.promises.mkdir(f().dirname(j),{recursive:!0}),await d.promises.writeFile(j,JSON.stringify(a,null,2)+"\n",{mode:384})}async function m(){return(await k()).shares}async function n(a){return(await k()).shares.find(b=>b.id===a)??null}function o(a,b){if(!a.passwordHash)return!0;if(!a.passwordSalt)return!1;let c=h().createHash("sha256").update(a.passwordSalt+":"+b).digest("hex");return h().timingSafeEqual(Buffer.from(c,"hex"),Buffer.from(a.passwordHash,"hex"))}async function p(a){let b=await k(),c={id:function(){let a="abcdefghjkmnpqrstuvwxyz23456789",b="";for(let c=0;c<12;c++)b+=a[h().randomInt(0,a.length)];return b}(),kind:a.kind,createdAt:new Date().toISOString(),...a.rootId?{rootId:a.rootId}:{},...a.utilityScope?{utilityScope:a.utilityScope}:{},...a.utilityId?{utilityId:a.utilityId}:{},...a.kbRelPath?{kbRelPath:a.kbRelPath}:{},...a.expiresAt?{expiresAt:a.expiresAt}:{},...a.label?{label:a.label}:{}};if(a.password){let{salt:b,hash:d}=function(a){let b=h().randomBytes(16).toString("hex"),c=h().createHash("sha256").update(b+":"+a).digest("hex");return{salt:b,hash:c}}(a.password);c.passwordSalt=b,c.passwordHash=d}return b.shares=[c,...b.shares],await l(b),c}async function q(a){let b=await k(),c=b.shares.length;return b.shares=b.shares.filter(b=>b.id!==a),b.shares.length!==c&&(await l(b),!0)}},42382:(a,b,c)=>{c.d(b,{E:()=>i});var d=c(64173);c(17240);var e=c(20483),f=c(91520),g=c(91344);let h=(0,e.F)("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",outline:"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",ghost:"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",link:"text-primary underline-offset-4 [a&]:hover:underline"}},defaultVariants:{variant:"default"}});function i({className:a,variant:b="default",asChild:c=!1,...e}){let i=c?f.bL:"span";return(0,d.jsx)(i,{"data-slot":"badge","data-variant":b,className:(0,g.cn)(h({variant:b}),a),...e})}},47071:(a,b,c)=>{c.d(b,{p:()=>f});var d=c(64173);c(17240);var e=c(91344);function f({className:a,type:b,...c}){return(0,d.jsx)("input",{type:b,"data-slot":"input",className:(0,e.cn)("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30","focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",a),...c})}},57058:(a,b,c)=>{c.d(b,{N:()=>e});var d=c(3265);let e=(0,d.createServerReference)("001fe697dc2a997924f9989fd6e8b33deefb2f912f",d.callServer,void 0,d.findSourceMapURL,"getTunnelStatusAction")},60524:(a,b,c)=>{c.d(b,{Separator:()=>d});let d=(0,c(54491).registerClientReference)(function(){throw Error("Attempted to call Separator() from the server but Separator 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/components/ui/separator.tsx","Separator")},80281:(a,b,c)=>{c.d(b,{J:()=>g});var d=c(64173);c(17240);var e=c(90044),f=c(91344);function g({className:a,...b}){return(0,d.jsx)(e.Root,{"data-slot":"label",className:(0,f.cn)("flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",a),...b})}},92814:(a,b,c)=>{c.d(b,{Ng:()=>s,bt:()=>v,Zl:()=>w,Nt:()=>t,Fm:()=>u});var d=c(73745);c(66493);var e=c(65326),f=c(36017),g=c(31421),h=c(73024),i=c(76760),j=c.n(i),k=c(73652);let l="__reflex_ngrok_tunnel__";function m(){return globalThis[l]}function n(a){globalThis[l]=a}async function o(a){let b;if(!a.authtoken)return{ok:!1,error:"ngrok authtoken is required"};let c=m();if(c&&null===c.child.exitCode)return{ok:!1,error:"Tunnel already running — stop it first."};let d=(0,k._)();await h.promises.mkdir(d,{recursive:!0});let e=j().join(d,"ngrok.yml");await h.promises.writeFile(e,`version: 3
|
|
2
2
|
agent:
|
|
3
3
|
authtoken: ${a.authtoken}
|
|
4
|
-
`,{mode:384});let f=["http",String(a.port),"--config",e,"--log","stdout","--log-format","json"];a.domain&&f.push(`--domain=${a.domain}`);try{b=(0,g.spawn)("ngrok",f,{detached:!1,stdio:["ignore","pipe","pipe"]})}catch(a){return{ok:!1,error:"Failed to spawn ngrok — is the CLI installed and on PATH? "+(a instanceof Error?a.message:String(a))}}return b.on("error",a=>{console.error("[ngrok] spawn error:",a)}),b.on("exit",(a,c)=>{console.log(`[ngrok] tunnel exited code=${a} signal=${c??"-"}`);let d=m();d?.child===b&&n(void 0)}),b.stdout?.on("data",a=>{let b=a.toString().trim();b&&console.log("[ngrok]",b)}),b.stderr?.on("data",a=>{let b=a.toString().trim();b&&console.error("[ngrok!]",b)}),n({child:b,startedAt:new Date().toISOString(),port:a.port,...a.domain?{domain:a.domain}:{}}),{ok:!0}}async function p(){let a=Date.now()+6e3;for(;Date.now()<a;){try{let a=await fetch("http://127.0.0.1:4040/api/tunnels");if(a.ok){let b=await a.json(),c=b.tunnels.find(a=>"https"===a.proto),d=b.tunnels[0],e=c?.public_url??d?.public_url;if(e){let a=m();return a&&(a.publicUrl=e,n(a)),e}}}catch{}await new Promise(a=>setTimeout(a,400))}return null}async function q(){return new Promise(a=>{try{let b=(0,g.spawn)("ngrok",["version"],{stdio:["ignore","pipe","ignore"]}),c="";b.stdout?.on("data",a=>{c+=a.toString()}),b.on("close",()=>a(c.trim()||null)),b.on("error",()=>a(null))}catch{a(null)}})}async function r(a){if(!a)return{ok:!1,error:"ngrok API key not configured"};try{let b=await fetch("https://api.ngrok.com/reserved_domains",{headers:{Authorization:`Bearer ${a}`,"Ngrok-Version":"2"}});if(!b.ok)return{ok:!1,error:`ngrok API ${b.status}: ${(await b.text()).slice(0,200)}`};let c=await b.json();return{ok:!0,domains:(c.reserved_domains??[]).map(a=>({id:a.id,domain:a.domain,region:a.region}))}}catch(a){return{ok:!1,error:"ngrok API call failed: "+(a instanceof Error?a.message:String(a))}}}async function s(){let a=function(){let a=m();return a?null!==a.child.exitCode?(n(void 0),{running:!1}):{running:!0,...a.publicUrl?{publicUrl:a.publicUrl}:{},startedAt:a.startedAt,port:a.port,...a.domain?{domain:a.domain}:{}}:{running:!1}}();return{status:a,cliVersion:await q(),publicHost:process.env.REFLEX_NGROK_HOST??null}}async function t(){let a=await (0,f.M)();if(!a.ngrok.authtoken)return{ok:!1,error:"ngrok.authtoken is empty — fill it in the settings above."};let b=await o({port:a.ngrok.port,authtoken:a.ngrok.authtoken,...a.ngrok.domain?{domain:a.ngrok.domain}:{}});if(!b.ok)return b;let c=await p();if(c)try{let a=new URL(c);process.env.REFLEX_NGROK_HOST=a.host}catch{}return(0,e.revalidatePath)("/settings"),{ok:!0,publicUrl:c}}async function u(){let a=await new Promise(a=>{let b=m();if(!b)return void a(!1);let{child:c}=b,d=!1,e=b=>{d||(d=!0,n(void 0),a(b))};if(c.once("exit",()=>e(!0)),null!==c.exitCode)return void e(!0);try{c.kill("SIGTERM")}catch(a){console.error("[ngrok] SIGTERM failed:",a)}setTimeout(()=>{if(!d){try{c.kill("SIGKILL")}catch{}e(!0)}},2500)});return delete process.env.REFLEX_NGROK_HOST,(0,e.revalidatePath)("/settings"),{ok:a}}async function v(a){try{let b=await (0,f.M)(),c={...b,ngrok:{...b.ngrok,...a}};return await (0,f.D)(c),(0,e.revalidatePath)("/settings"),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function w(){return r((await (0,f.M)()).ngrok.apiKey)}(0,c(63781).D)([s,t,u,v,w]),(0,d.A)(s,"
|
|
4
|
+
`,{mode:384});let f=["http",String(a.port),"--config",e,"--log","stdout","--log-format","json"];a.domain&&f.push(`--domain=${a.domain}`);try{b=(0,g.spawn)("ngrok",f,{detached:!1,stdio:["ignore","pipe","pipe"]})}catch(a){return{ok:!1,error:"Failed to spawn ngrok — is the CLI installed and on PATH? "+(a instanceof Error?a.message:String(a))}}return b.on("error",a=>{console.error("[ngrok] spawn error:",a)}),b.on("exit",(a,c)=>{console.log(`[ngrok] tunnel exited code=${a} signal=${c??"-"}`);let d=m();d?.child===b&&n(void 0)}),b.stdout?.on("data",a=>{let b=a.toString().trim();b&&console.log("[ngrok]",b)}),b.stderr?.on("data",a=>{let b=a.toString().trim();b&&console.error("[ngrok!]",b)}),n({child:b,startedAt:new Date().toISOString(),port:a.port,...a.domain?{domain:a.domain}:{}}),{ok:!0}}async function p(){let a=Date.now()+6e3;for(;Date.now()<a;){try{let a=await fetch("http://127.0.0.1:4040/api/tunnels");if(a.ok){let b=await a.json(),c=b.tunnels.find(a=>"https"===a.proto),d=b.tunnels[0],e=c?.public_url??d?.public_url;if(e){let a=m();return a&&(a.publicUrl=e,n(a)),e}}}catch{}await new Promise(a=>setTimeout(a,400))}return null}async function q(){return new Promise(a=>{try{let b=(0,g.spawn)("ngrok",["version"],{stdio:["ignore","pipe","ignore"]}),c="";b.stdout?.on("data",a=>{c+=a.toString()}),b.on("close",()=>a(c.trim()||null)),b.on("error",()=>a(null))}catch{a(null)}})}async function r(a){if(!a)return{ok:!1,error:"ngrok API key not configured"};try{let b=await fetch("https://api.ngrok.com/reserved_domains",{headers:{Authorization:`Bearer ${a}`,"Ngrok-Version":"2"}});if(!b.ok)return{ok:!1,error:`ngrok API ${b.status}: ${(await b.text()).slice(0,200)}`};let c=await b.json();return{ok:!0,domains:(c.reserved_domains??[]).map(a=>({id:a.id,domain:a.domain,region:a.region}))}}catch(a){return{ok:!1,error:"ngrok API call failed: "+(a instanceof Error?a.message:String(a))}}}async function s(){let a=function(){let a=m();return a?null!==a.child.exitCode?(n(void 0),{running:!1}):{running:!0,...a.publicUrl?{publicUrl:a.publicUrl}:{},startedAt:a.startedAt,port:a.port,...a.domain?{domain:a.domain}:{}}:{running:!1}}();return{status:a,cliVersion:await q(),publicHost:process.env.REFLEX_NGROK_HOST??null}}async function t(){let a=await (0,f.M)();if(!a.ngrok.authtoken)return{ok:!1,error:"ngrok.authtoken is empty — fill it in the settings above."};let b=await o({port:a.ngrok.port,authtoken:a.ngrok.authtoken,...a.ngrok.domain?{domain:a.ngrok.domain}:{}});if(!b.ok)return b;let c=await p();if(c)try{let a=new URL(c);process.env.REFLEX_NGROK_HOST=a.host}catch{}return(0,e.revalidatePath)("/settings"),{ok:!0,publicUrl:c}}async function u(){let a=await new Promise(a=>{let b=m();if(!b)return void a(!1);let{child:c}=b,d=!1,e=b=>{d||(d=!0,n(void 0),a(b))};if(c.once("exit",()=>e(!0)),null!==c.exitCode)return void e(!0);try{c.kill("SIGTERM")}catch(a){console.error("[ngrok] SIGTERM failed:",a)}setTimeout(()=>{if(!d){try{c.kill("SIGKILL")}catch{}e(!0)}},2500)});return delete process.env.REFLEX_NGROK_HOST,(0,e.revalidatePath)("/settings"),{ok:a}}async function v(a){try{let b=await (0,f.M)(),c={...b,ngrok:{...b.ngrok,...a}};return await (0,f.D)(c),(0,e.revalidatePath)("/settings"),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function w(){return r((await (0,f.M)()).ngrok.apiKey)}(0,c(63781).D)([s,t,u,v,w]),(0,d.A)(s,"001fe697dc2a997924f9989fd6e8b33deefb2f912f",null),(0,d.A)(t,"00efe795bfbc812bb432cfa6c21d029b27d8f00b98",null),(0,d.A)(u,"00254255118a179f49e1ef9bcf0d453ec69b8af754",null),(0,d.A)(v,"40f162947c94d3a14feaeae90a256cf324a439bde2",null),(0,d.A)(w,"005f2ec69cc26f4a9b961ac74a6482f8fe88c0401d",null)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=8823,exports.ids=[8823],exports.modules={879:(a,b,c)=>{c.d(b,{G:()=>k});var d=c(73024),e=c(76760),f=c.n(e),g=c(55136),h=c.n(g),i=c(54287);class j{constructor(a,b){this.root=a,this.layers=b}static async create(a){return new j(a,[]).enter(a)}async enter(a){let b,c=f().join(a,i.KZ);try{b=await d.promises.readFile(c,"utf8")}catch{return this}let e=h()().add(b);return new j(this.root,[...this.layers,{dir:a,ig:e}])}ignores(a){let b=f().basename(a);if(i.Lj.has(b))return!0;for(let{dir:b,ig:c}of this.layers){let d=f().relative(b,a);if(!(!d||d.startsWith(".."))&&c.ignores(d))return!0}return!1}}async function*k(a,b={}){let{maxDepth:c=1/0,followSymlinks:d=!1}=b,e=f().resolve(a),g=await j.create(e);yield{abs:e,rel:".",isDir:!0},yield*l(e,e,g,0,c,d)}async function*l(a,b,c,e,g,h){let i;if(!(e>=g)){try{i=await d.promises.readdir(b,{withFileTypes:!0})}catch{return}for(let d of(i.sort((a,b)=>a.name.localeCompare(b.name)),i)){var j,k;let i=f().join(b,d.name);if(c.ignores(i))continue;let n=d.isSymbolicLink();if(n&&!h)continue;let o=d.isDirectory()||n&&await m(i),p=(j=a,k=i,f().relative(j,k).split(f().sep).join("/"));if(yield{abs:i,rel:p,isDir:o},o){let b=await c.enter(i);yield*l(a,i,b,e+1,g,h)}}}}async function m(a){try{return(await d.promises.stat(a)).isDirectory()}catch{return!1}}},4168:(a,b,c)=>{c.d(b,{S:()=>j});var d=c(73745);c(66493);var e=c(76760),f=c.n(e),g=c(53905),h=c(54287),i=c(879);async function j(a,b){try{let d=await (0,g.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=(b??"").toLowerCase().trim(),j=[];try{let{listUtilities:b}=await Promise.resolve().then(c.bind(c,8118));for(let c of(await b({rootId:a})))j.push({kind:"utility",relPath:`util:${c.scope}/${c.manifest.id}`,absPath:"",label:`${c.manifest.name} (${c.scope})`,parent:"utilities"})}catch{}for await(let a of(0,i.G)((0,h.FF)(d.path))){if(a.isDir||!a.rel.toLowerCase().endsWith(".md")||a.rel.startsWith("topics/")||a.rel.startsWith("attachments/"))continue;let b=`${h.fW}/${a.rel}`;j.push({kind:"kb",relPath:b,absPath:a.abs,label:a.rel,parent:"."===f().dirname(a.rel)?h.fW:`${h.fW}/${f().dirname(a.rel)}`})}for await(let a of(0,i.G)(d.path))a.isDir||j.push({kind:"file",relPath:a.rel,absPath:a.abs,label:a.rel,parent:"."===f().dirname(a.rel)?"":f().dirname(a.rel)});let k=e?j.filter(a=>{let b=a.relPath.toLowerCase();return f().basename(a.relPath).toLowerCase().includes(e)||b.includes(e)}):j,l={utility:0,kb:1,file:2};return k.sort((a,b)=>{if(a.kind!==b.kind)return l[a.kind]-l[b.kind];if(e){let c=f().basename(a.label).toLowerCase(),d=f().basename(b.label).toLowerCase(),g=+!c.startsWith(e),h=+!d.startsWith(e);if(g!==h)return g-h}return a.relPath.localeCompare(b.relPath)}),{ok:!0,items:k.slice(0,30)}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(63781).D)([j]),(0,d.A)(j,"60113dcdb3fc200bcacd70c8bd134301a21e6815de",null)},8836:(a,b,c)=>{c.d(b,{E:()=>g});var d=c(64173),e=c(71813),f=c(69552);function g({label:a,headerRight:b,children:c}){let g=(0,e.c)("roots"),h=a??g("commandBarFrame.label");return(0,d.jsx)("div",{className:"border-t bg-background",children:(0,d.jsx)("div",{className:"mx-auto max-w-3xl px-6 py-5",children:(0,d.jsx)("div",{className:"reflex-gradient rounded-2xl p-[2px] shadow-[0_8px_40px_-12px_oklch(0.55_0.2_290/0.45)]",children:(0,d.jsxs)("div",{className:"rounded-[14px] bg-background/85 backdrop-blur-xl px-5 py-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-3",children:[(0,d.jsx)("span",{className:"reflex-gradient inline-flex h-6 w-6 items-center justify-center rounded-full text-white shadow-sm",children:(0,d.jsx)(f.A,{className:"h-3.5 w-3.5"})}),(0,d.jsx)("span",{className:"text-[11px] uppercase tracking-[0.18em] text-muted-foreground",children:h}),b&&(0,d.jsx)("span",{className:"ml-auto flex items-center gap-1",children:b})]}),c]})})})})}},26290:(a,b,c)=>{c.d(b,{cn:()=>f});var d=c(83243),e=c(86103);function f(...a){return(0,e.QP)((0,d.$)(a))}},45477:(a,b,c)=>{c.d(b,{T:()=>f});var d=c(64173);c(17240);var e=c(91344);function f({className:a,...b}){return(0,d.jsx)("textarea",{"data-slot":"textarea",className:(0,e.cn)("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground 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 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40",a),...b})}},67248:(a,b,c)=>{c.d(b,{E:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",{variants:{variant:{default:"bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",outline:"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",ghost:"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",link:"text-primary underline-offset-4 [a&]:hover:underline"}},defaultVariants:{variant:"default"}});function i({className:a,variant:b="default",asChild:c=!1,...e}){let i=c?f.bL:"span";return(0,d.jsx)(i,{"data-slot":"badge","data-variant":b,className:(0,g.cn)(h({variant:b}),a),...e})}},72901:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{LL:()=>v,ZC:()=>z,b2:()=>u,qO:()=>t,wd:()=>y});var e=c(73745);c(66493);var f=c(73024),g=c(76760),h=c.n(g),i=c(65326),j=c(53905),k=c(54287),l=c(56942),m=c(5492),n=c(13415),o=c(93554),p=c(49410),q=c(96921),r=c(63781),s=a([n,o]);async function t(a,b){try{let c=b.trim();if(!c)return{ok:!1,error:"Empty — nothing to remember."};let d=await (0,j.Zn)(a);if(!d)return{ok:!1,error:"Root not found"};let e=c.split(/\r?\n/,1)[0].trim(),f=e.length>80?e.slice(0,77).trimEnd()+"…":e,g=await (0,l.j)({rootPath:d.path,directive:{kind:"note",title:f,body:c}});return(0,i.revalidatePath)(`/roots/${a}`),{ok:!0,message:`Saved to ${g.relPath}`}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function u(a,b){let c=await (0,n.L4)(a,b);return c.ok?{ok:!0,redirectTo:`/roots/${a}`,message:"Topic deleted"}:{ok:!1,error:c.error??"Failed"}}async function v(a){try{let b=await (0,j.Zn)(a);if(!b)return{ok:!1,error:"Root not found"};let c=(0,k.FF)(b.path);for(let a of(await (0,m.hk)(b.path)))await o.z.stopTopic(a.meta.id).catch(()=>void 0);return await w(h().join(c,"widgets")),await w(h().join(c,"dashboard-layout.json")),await w(h().join(c,"topics")),await x(c),(0,i.revalidatePath)(`/roots/${a}`),{ok:!0,redirectTo:`/roots/${a}`,message:"Project cleared. Starting fresh."}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function w(a){try{await f.promises.rm(a,{recursive:!0,force:!0})}catch{}}async function x(a){let b;try{b=await f.promises.readdir(a,{withFileTypes:!0})}catch{return}for(let c of b){let b=h().join(a,c.name);if(c.isDirectory()){await x(b);try{let a=await f.promises.readdir(b);0===a.length&&await f.promises.rmdir(b)}catch{}continue}c.name.toLowerCase().endsWith(".md")&&await f.promises.unlink(b).catch(()=>void 0)}}async function y(){let a=await (0,p.b)();return{ok:!0,commands:q.Lo,skills:a}}async function z(a,b){let{listUtilities:d}=await Promise.resolve().then(c.bind(c,8118)),e=await d({rootId:a}),f=b.trim().toLowerCase(),g=e.map(a=>({id:a.manifest.id,name:a.manifest.name,scope:a.scope,rootId:a.rootId})),h=a=>{let b=a.rootId?`?rootId=${encodeURIComponent(a.rootId)}`:"";return`/utilities/${a.scope}/${a.id}${b}`};if(!f)return 0===g.length?{ok:!1,error:"No mini-apps installed yet."}:{ok:!0,kind:"choices",items:g.map(a=>({url:h(a),id:a.id,name:a.name,scope:a.scope}))};let i=g.find(a=>a.id.toLowerCase()===f);if(i)return{ok:!0,kind:"redirect",url:h(i)};let j=g.filter(a=>a.id.toLowerCase().includes(f)||a.name.toLowerCase().includes(f));return 1===j.length?{ok:!0,kind:"redirect",url:h(j[0])}:0===j.length?{ok:!1,error:`Nothing found for "${b}". Installed: ${g.length}.`}:{ok:!0,kind:"choices",items:j.map(a=>({url:h(a),id:a.id,name:a.name,scope:a.scope}))}}[n,o]=s.then?(await s)():s,(0,r.D)([t,u,v,y,z]),(0,e.A)(t,"60365b51bdeb7d61567abb3bb048112670577d4fa2",null),(0,e.A)(u,"601c0220638780ac1e60aa49b287a7bca3c9326253",null),(0,e.A)(v,"4084891a74df1c3668b64fce007fd10f321cd6aa89",null),(0,e.A)(y,"00a5e31d06ea24ea80715e045983fd6f327cf17c11",null),(0,e.A)(z,"601d24761e1cc946a3c30c50145fb37c18d8f53ad1",null),d()}catch(a){d(a)}})},84913:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(63003);c(34750);var e=c(86209),f=c(65715),g=c(26290);let h=(0,e.F)("inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",xs:"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9","icon-xs":"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-8","icon-lg":"size-10"}},defaultVariants:{variant:"default",size:"default"}});function i({className:a,variant:b="default",size:c="default",asChild:e=!1,...i}){let j=e?f.bL:"button";return(0,d.jsx)(j,{"data-slot":"button","data-variant":b,"data-size":c,className:(0,g.cn)(h({variant:b,size:c,className:a})),...i})}},93476:(a,b,c)=>{c.d(b,{L:()=>N});var d=c(64173),e=c(17240),f=c(71813),g=c(54249),h=c(75430),i=c(34719),j=c(56189),k=c(41856),l=c(33120),m=c(69552),n=c(97338),o=c(25299),p=c(63387),q=c(53834),r=c(97162),s=c(62261),t=c(77311),u=c(25436),v=c(24555),w=c(68669),x=c(79145),y=c(66979),z=c(87671),A=c(44052),B=c(20583),C=c(45477),D=c(91344),E=c(3265);let F=(0,E.createServerReference)("60113dcdb3fc200bcacd70c8bd134301a21e6815de",E.callServer,void 0,E.findSourceMapURL,"searchMentionsAction"),G=[{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"}],H=(0,E.createServerReference)("60365b51bdeb7d61567abb3bb048112670577d4fa2",E.callServer,void 0,E.findSourceMapURL,"rememberAction"),I=(0,E.createServerReference)("601c0220638780ac1e60aa49b287a7bca3c9326253",E.callServer,void 0,E.findSourceMapURL,"deleteCurrentTopicCommand"),J=(0,E.createServerReference)("601d24761e1cc946a3c30c50145fb37c18d8f53ad1",E.callServer,void 0,E.findSourceMapURL,"openUtilityAction"),K=(0,E.createServerReference)("4084891a74df1c3668b64fce007fd10f321cd6aa89",E.callServer,void 0,E.findSourceMapURL,"clearProjectAction");var L=c(88724);let M={ListChecks:g.A,Target:h.A,Telescope:i.A,LayoutGrid:j.A,BookmarkPlus:k.A,PackagePlus:l.A,Sparkles:m.A,Trash2:n.A,AlertOctagon:o.A,HelpCircle:p.A,Workflow:q.A,Boxes:r.A};function N({rootId:a,topicId:b,placeholder:c,submitLabel:g,pendingLabel:h,SubmitIcon:i,disabled:j,onSubmit:k,active:l,onStop:m,clarifyLabel:n,stopLabel:o}){let p=(0,f.c)("roots"),q=n??p("chatInputForm.clarifyLabel"),r=o??p("chatInputForm.stopLabel"),v=(0,z.useRouter)(),[w,x]=(0,e.useState)(""),[y,E]=(0,e.useState)([]),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(!1),N=(0,e.useRef)(null),S=(0,e.useRef)(null),[T,U]=(0,e.useState)(null),[V,W]=(0,e.useState)([]),[X,Y]=(0,e.useState)(0),[Z,$]=(0,e.useState)(!1),_=(0,e.useRef)(0),[aa,ab]=(0,e.useState)(null);(0,e.useCallback)(()=>{let a=N.current;a&&(a.style.height="auto",a.style.height=Math.min(a.scrollHeight,240)+"px")},[]);let ac=(0,e.useCallback)((b,c)=>{let d=c;for(;d>0;){let a=b[d-1];if("@"===a){d-=1;break}if(/\s/.test(a)){d=-1;break}d-=1}if(d<0||"@"!==b[d]||d>0&&!/\s/.test(b[d-1])){U(null),W([]);return}let e=b.slice(d+1,c);U({start:d,end:c}),Y(0),$(!0);let f=++_.current;(async()=>{let b=await F(a,e);_.current===f&&($(!1),W(b.ok?b.items:[]))})()},[a]),ad=(0,e.useCallback)(()=>{U(null),W([]),_.current++},[]),ae=(0,e.useCallback)(a=>{if(!a.startsWith("/")||a.indexOf(" ")>=0)return void ab(null);let b=a.slice(1).toLowerCase(),c=G.filter(a=>a.trigger.startsWith(b)||a.label.toLowerCase().includes(b)||a.description.toLowerCase().includes(b));if(0===c.length)return void ab(null);ab({items:c,index:0})},[]),af=(0,e.useCallback)(()=>ab(null),[]),ag=(0,e.useCallback)(a=>{let b=N.current,c=`/${a.trigger}${a.allowEmpty&&"direct"===a.kind?"":" "}`;x(c),ab(null),requestAnimationFrame(()=>{b&&(b.focus(),b.setSelectionRange(c.length,c.length))})},[]),ah=(0,e.useCallback)(a=>{let b=N.current;if(!b||!T)return;let c=w.slice(0,T.start),d=w.slice(T.end),e=`@${a.relPath} `;x(c+e+d),ad();let f=c.length+e.length;requestAnimationFrame(()=>{b.focus(),b.setSelectionRange(f,f)})},[w,T,ad]),ai=(0,e.useCallback)(async b=>{if(0!==b.length){I(!0);try{let c=new FormData;for(let a of b)c.append("files",a);let d=await fetch(`/api/roots/${a}/attachments`,{method:"POST",body:c});if(!d.ok){let a=await d.json().catch(()=>({}));A.oR.error(a.error??p("chatInputForm.uploadFailed",{status:d.status}));return}let e=await d.json();E(a=>[...a,...e.files])}catch(a){A.oR.error(a instanceof Error?a.message:String(a))}finally{I(!1)}}},[a]),aj=w.trim().length>0||y.length>0,ak=l&&m?aj?"clarify":"stop":"send",al=(0,e.useCallback)(async()=>{if(J)return;if("stop"===ak){if(!m)return;K(!0);try{await m()}finally{K(!1)}return}let c=w.trim();if(!c&&0===y.length||j&&"send"===ak)return;let d=function(a){var b;let c=a.trim();if(!c.startsWith("/"))return null;let d=/^\/([a-z][a-z0-9-]*)(?:\s+([\s\S]*))?$/.exec(c);if(!d)return null;let e=(b=d[1],G.find(a=>a.trigger===b)??null);return e?{def:e,payload:(d[2]??"").trim()}:null}(c);if(d&&"direct"===d.def.kind){K(!0);try{await O({cmd:d.def,payload:d.payload,rootId:a,topicId:b,router:v,t:p}),x("")}finally{K(!1)}return}K(!0);try{"clarify"===ak&&m&&await m(),await k({message:c,attachments:y})&&(x(""),E([]))}finally{K(!1)}},[w,y,J,j,ak,m,k,a,b,v,p]),am=!J&&!H&&("stop"===ak||aj&&(!j||"clarify"===ak));return(0,d.jsxs)("form",{onSubmit:a=>{a.preventDefault(),al()},onDragEnter:a=>{Array.from(a.dataTransfer.types).includes("Files")&&(a.preventDefault(),M(!0))},onDragOver:a=>{Array.from(a.dataTransfer.types).includes("Files")&&(a.preventDefault(),M(!0))},onDragLeave:a=>{a.currentTarget.contains(a.relatedTarget)||M(!1)},onDrop:a=>{a.preventDefault(),M(!1);let b=Array.from(a.dataTransfer.files);b.length>0&&ai(b)},className:(0,D.cn)("space-y-2 rounded-md transition-colors",L&&"ring-2 ring-ring/60 bg-accent/40"),children:[y.length>0&&(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5",children:y.map((a,b)=>(0,d.jsx)(R,{attachment:a,onRemove:()=>E(b=>b.filter(b=>b!==a))},a.absPath+b))}),(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"relative flex-1",children:[(0,d.jsx)(C.T,{ref:N,value:w,onChange:a=>{x(a.target.value),ac(a.target.value,a.target.selectionStart),ae(a.target.value)},onKeyUp:a=>{let b=a.currentTarget;ac(b.value,b.selectionStart),ae(b.value)},onClick:a=>{let b=a.currentTarget;ac(b.value,b.selectionStart),ae(b.value)},onBlur:()=>{setTimeout(()=>{ad(),af()},150)},onKeyDown:a=>{if(aa){if("ArrowDown"===a.key){a.preventDefault(),ab(a=>a?{...a,index:Math.min(a.items.length-1,a.index+1)}:null);return}if("ArrowUp"===a.key){a.preventDefault(),ab(a=>a?{...a,index:Math.max(0,a.index-1)}:null);return}if("Tab"===a.key){a.preventDefault();let b=aa.items[aa.index];b&&ag(b);return}if("Escape"===a.key){a.preventDefault(),af();return}}if(T&&V.length>0){if("ArrowDown"===a.key){a.preventDefault(),Y(a=>Math.min(V.length-1,a+1));return}if("ArrowUp"===a.key){a.preventDefault(),Y(a=>Math.max(0,a-1));return}if("Enter"===a.key||"Tab"===a.key){a.preventDefault();let b=V[X];b&&ah(b);return}if("Escape"===a.key){a.preventDefault(),ad();return}}"Enter"!==a.key||a.shiftKey||a.nativeEvent.isComposing||(a.preventDefault(),al())},onPaste:a=>{let b=Array.from(a.clipboardData.files);b.length>0&&(a.preventDefault(),ai(b))},placeholder:c,rows:1,disabled:j||J,className:"resize-none min-h-[44px] max-h-60 text-base bg-background/70 border-transparent focus-visible:border-ring py-2.5 w-full"}),T&&(0,d.jsx)(Q,{items:V,index:X,loading:Z,onPick:ah,onHover:a=>Y(a)}),aa&&!T&&(0,d.jsx)(P,{items:aa.items,index:aa.index,onPick:ag,onHover:a=>ab(b=>b?{...b,index:a}:null),topicAvailable:!!b})]}),(0,d.jsx)("input",{ref:S,type:"file",multiple:!0,className:"hidden",onChange:a=>{let b=Array.from(a.target.files??[]);b.length>0&&ai(b),a.target.value=""}}),(0,d.jsx)(B.$,{type:"button",size:"icon",variant:"ghost",onClick:()=>S.current?.click(),disabled:H||J||j,title:p("chatInputForm.attachTitle"),className:"h-11 w-11 shrink-0",children:H?(0,d.jsx)(s.A,{className:"h-4 w-4 animate-spin"}):(0,d.jsx)(t.A,{className:"h-4 w-4"})}),(0,d.jsx)(B.$,{type:"submit",size:"lg",disabled:!am,variant:"stop"===ak?"destructive":"default",className:"h-11 px-6 shadow-md shrink-0",children:J?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.A,{className:"mr-2 h-4 w-4 animate-spin"}),h]}):"stop"===ak?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(u.A,{className:"mr-2 h-4 w-4",fill:"currentColor"}),r]}):"clarify"===ak?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i,{className:"mr-2 h-4 w-4"}),q]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i,{className:"mr-2 h-4 w-4"}),g]})})]}),(0,d.jsx)("div",{className:"text-[10px] text-muted-foreground",children:p("chatInputForm.helperRow")})]})}async function O({cmd:a,payload:b,rootId:c,topicId:d,router:e,t:f}){if("help"===a.id){let a=G.map(a=>`• ${a.label} — ${a.description}`);A.oR.info(f("chatInputForm.availableCommands",{list:a.join("\n")}),{duration:12e3});return}if("remember"===a.id){if(!b)return void A.oR.error(f("chatInputForm.rememberEmpty"));let a=await H(c,b);return void(a.ok?(A.oR.success(a.message??f("chatInputForm.savedToKb")),(0,L.$d)(L.Zi.kbChanged(c))):A.oR.error(a.error))}if("delete-topic"===a.id){if(!d)return void A.oR.error(f("chatInputForm.topicOnlyCommand"));if(!confirm(f("chatInputForm.deleteTopicConfirm")))return;let a=await I(c,d);return void(a.ok?(A.oR.success(a.message??f("chatInputForm.deleted")),(0,L.$d)(L.Zi.topicsChanged(c)),a.redirectTo&&e.push(a.redirectTo)):A.oR.error(a.error))}if("util"===a.id){let a=await J(c,b);if(!a.ok)return void A.oR.error(a.error);if("redirect"===a.kind)return void e.push(a.url);let d=a.items.slice(0,8).map(a=>`• ${a.name} (${a.scope}/${a.id})`).join("\n");return void A.oR.message(f("chatInputForm.multipleMatches",{list:d}),{duration:12e3})}if("clear-project"===a.id){if(!confirm(f("chatInputForm.clearProjectConfirm")))return;let a=prompt(f("chatInputForm.clearProjectPrompt"));if(a?.trim().toLowerCase()!==f("chatInputForm.clearProjectPhrase"))return void A.oR.message(f("chatInputForm.confirmFailed"));let b=await K(c);return void(b.ok?(A.oR.success(b.message??f("chatInputForm.projectCleared")),(0,L.$d)(L.Zi.topicsChanged(c)),(0,L.$d)(L.Zi.kbChanged(c)),b.redirectTo&&e.push(b.redirectTo)):A.oR.error(b.error))}A.oR.error(f("chatInputForm.unknownCommand",{label:a.label}))}function P({items:a,index:b,onPick:c,onHover:e,topicAvailable:g}){let h=(0,f.c)("roots");return(0,d.jsxs)("div",{className:"absolute bottom-full left-0 right-0 mb-2 z-50 max-h-80 overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-lg",children:[(0,d.jsx)("div",{className:"px-3 py-1.5 text-[10px] uppercase tracking-wider text-muted-foreground border-b",children:h("chatInputForm.commandsPaletteHeader")}),(0,d.jsx)("ul",{children:a.map((a,f)=>{let i=M[a.icon]??m.A,j="delete-topic"===a.id&&!g;return(0,d.jsx)("li",{children:(0,d.jsxs)("button",{type:"button",onMouseDown:b=>{b.preventDefault(),j||c(a)},onMouseEnter:()=>e(f),disabled:j,className:(0,D.cn)("w-full flex items-start gap-2 px-3 py-2 text-left",f===b?"bg-accent":"hover:bg-accent/60",j&&"opacity-40 cursor-not-allowed"),children:[(0,d.jsx)(i,{className:(0,D.cn)("h-3.5 w-3.5 mt-0.5 shrink-0","direct"===a.kind?"text-amber-600":"text-violet-600")}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsxs)("div",{className:"flex items-baseline gap-2 flex-wrap",children:[(0,d.jsx)("span",{className:"font-mono text-xs font-medium",children:a.label}),"direct"===a.kind&&(0,d.jsx)("span",{className:"text-[9px] uppercase tracking-wider text-amber-700",children:h("chatInputForm.directAction")}),a.requiresConfirm&&(0,d.jsx)("span",{className:"text-[9px] uppercase tracking-wider text-destructive",children:h("chatInputForm.withConfirm")})]}),(0,d.jsx)("p",{className:"text-[11px] text-muted-foreground leading-snug mt-0.5",children:a.description}),(0,d.jsx)("p",{className:"text-[10px] text-muted-foreground/80 font-mono mt-0.5",children:a.usage})]})]})},a.id)})})]})}function Q({items:a,index:b,loading:c,onPick:e,onHover:g}){let h=(0,f.c)("roots");return(0,d.jsx)("div",{className:"absolute bottom-full left-0 right-0 mb-2 z-50 max-h-72 overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-lg",children:c&&0===a.length?(0,d.jsxs)("div",{className:"px-3 py-2 text-xs text-muted-foreground flex items-center gap-2",children:[(0,d.jsx)(s.A,{className:"h-3 w-3 animate-spin"})," ",h("chatInputForm.mentionSearching")]}):0===a.length?(0,d.jsx)("div",{className:"px-3 py-2 text-xs text-muted-foreground italic",children:h("chatInputForm.mentionNothing")}):(0,d.jsx)("ul",{children:a.map((a,c)=>{let f="kb"===a.kind?v.A:w.A;return(0,d.jsx)("li",{children:(0,d.jsxs)("button",{type:"button",onMouseDown:b=>{b.preventDefault(),e(a)},onMouseEnter:()=>g(c),className:(0,D.cn)("w-full flex items-center gap-2 px-3 py-1.5 text-sm text-left",c===b?"bg-accent":"hover:bg-accent/60"),children:[(0,d.jsx)(f,{className:(0,D.cn)("h-3.5 w-3.5 shrink-0","kb"===a.kind?"text-primary":"text-muted-foreground")}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("div",{className:"truncate font-mono text-xs",children:a.relPath}),a.parent&&(0,d.jsx)("div",{className:"truncate text-[10px] text-muted-foreground",children:a.parent})]}),(0,d.jsx)("span",{className:(0,D.cn)("text-[10px] uppercase tracking-wider shrink-0","kb"===a.kind?"text-primary":"text-muted-foreground"),children:a.kind})]})},a.absPath)})})})}function R({attachment:a,onRemove:b}){var c;let e=a.mime.startsWith("image/")?x.A:w.A;return(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-1 text-[11px] max-w-[18rem]",children:[(0,d.jsx)(e,{className:"h-3 w-3 text-muted-foreground shrink-0"}),(0,d.jsx)("span",{className:"truncate",title:a.name,children:a.name}),(0,d.jsx)("span",{className:"text-muted-foreground",children:(c=a.size)<1024?`${c} B`:c<1048576?`${(c/1024).toFixed(1)} KB`:`${(c/1048576).toFixed(1)} MB`}),(0,d.jsx)("button",{type:"button",onClick:b,className:"ml-0.5 text-muted-foreground hover:text-foreground",children:(0,d.jsx)(y.A,{className:"h-3 w-3"})})]})}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=9098,exports.ids=[9098],exports.modules={39098:(a,b,c)=>{c.d(b,{O1:()=>p,Gh:()=>q,AZ:()=>o,rD:()=>r,summarizeYoutubeAction:()=>n});var d=c(73745);c(66493);var e=c(70333);let f=globalThis.__reflexGeminiModelsCache??new Map;async function g(a){let b,c=await (0,e.CG)("gemini");if(!c)throw Error("Gemini API key not configured");let d=c.slice(0,16),g=f.get(d);if(!a?.refresh&&g&&Date.now()-g.fetchedAt<36e5)return g.models;let i=[];do{let a=new URL("https://generativelanguage.googleapis.com/v1beta/models");a.searchParams.set("key",c),a.searchParams.set("pageSize","100"),b&&a.searchParams.set("pageToken",b);let d=await fetch(a.toString(),{headers:{Accept:"application/json"}});if(!d.ok){let a=await d.text();throw Error(`models.list HTTP ${d.status}: ${a.slice(0,500)}`)}let e=await d.json();for(let a of e.models??[]){if(!a.name)continue;let b=a.supportedGenerationMethods??[];if(!b.includes("generateContent"))continue;let c=a.name.toLowerCase();!c.includes("embedding")&&(c.includes("aqa")||i.push({name:a.name,id:a.name.replace(/^models\//,""),...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{},supportedGenerationMethods:b}))}b=e.nextPageToken}while(b);return i.sort(h),f.set(d,{fetchedAt:Date.now(),models:i}),i}function h(a,b){let c=i(a.id),d=i(b.id);if(c!==d)return c-d;let e=j(a.id),f=j(b.id);return e!==f?f-e:a.id.localeCompare(b.id)}function i(a){return a.endsWith("flash-latest")?0:a.includes("flash")&&!a.includes("lite")?1:a.includes("flash-lite")?2:a.endsWith("pro-latest")||a.includes("pro")?3:4}function j(a){let b=/gemini-(\d+)\.(\d+)/.exec(a);return b?100*Number(b[1])+Number(b[2]):0}async function k(a="general"){let b=await (0,e.$L)("gemini");if("video"===a&&b?.videoModel)return b.videoModel;if(b?.model)return b.model;try{let a=await g();if(a.length>0)return a[0].id}catch{}return"gemini-flash-latest"}async function l(a){let b=`https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(a.model)}:generateContent?key=${encodeURIComponent(a.apiKey)}`,c=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:a.contents,...a.generationConfig?{generationConfig:a.generationConfig}:{}})}),d=await c.text();if(!c.ok)throw Error(`Gemini HTTP ${c.status}: ${d.slice(0,800)}`);let e=JSON.parse(d);if(e.promptFeedback?.blockReason)throw Error(`Gemini blocked: ${e.promptFeedback.blockReason}`);return{text:(e.candidates??[]).flatMap(a=>a.content?.parts??[]).map(a=>a.text??"").filter(Boolean).join("\n").trim(),raw:e}}globalThis.__reflexGeminiModelsCache=f;var m=c(36017);async function n(a){var b;let c=await (0,e.CG)("gemini");if(!c)return{ok:!1,needsKey:!0,error:"Gemini API key is not saved — enter it to summarize videos."};let d=(await (0,m.M)()).language??"russian",f=a.prompt?.trim()||(b=d,/russ/i.test(b)||RegExp("рус","i").test(b)?"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (any memorable phrases) — with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway: the main point worth retaining.\n\nRespond in Russian, concisely. No filler.":"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (if any) with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway.\n\nBe concise. No filler."),g=a.modelOverride?.trim()||await k("video");try{let{text:b}=await l({model:g,apiKey:c,contents:[{parts:[{file_data:{file_uri:a.url,mime_type:"video/*"}},{text:f}]}]});if(!b)return{ok:!1,error:"Gemini returned an empty response — the video may be unavailable or private."};return{ok:!0,text:b,model:g}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a){try{if(!a.trim())return{ok:!1,error:"API key is empty"};return await (0,e.Pc)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function p(a){return{ok:!0,present:await (0,e.hasApiKey)(a)}}async function q(a=!1){try{let b=await g({refresh:a});return{ok:!0,models:b.map(a=>({id:a.id,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{}})),currentModel:await k("general"),currentVideoModel:await k("video")}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function r(a){try{return await (0,e.ND)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(63781).D)([n,o,p,q,r]),(0,d.A)(n,"
|
|
1
|
+
"use strict";exports.id=9098,exports.ids=[9098],exports.modules={39098:(a,b,c)=>{c.d(b,{O1:()=>p,Gh:()=>q,AZ:()=>o,rD:()=>r,summarizeYoutubeAction:()=>n});var d=c(73745);c(66493);var e=c(70333);let f=globalThis.__reflexGeminiModelsCache??new Map;async function g(a){let b,c=await (0,e.CG)("gemini");if(!c)throw Error("Gemini API key not configured");let d=c.slice(0,16),g=f.get(d);if(!a?.refresh&&g&&Date.now()-g.fetchedAt<36e5)return g.models;let i=[];do{let a=new URL("https://generativelanguage.googleapis.com/v1beta/models");a.searchParams.set("key",c),a.searchParams.set("pageSize","100"),b&&a.searchParams.set("pageToken",b);let d=await fetch(a.toString(),{headers:{Accept:"application/json"}});if(!d.ok){let a=await d.text();throw Error(`models.list HTTP ${d.status}: ${a.slice(0,500)}`)}let e=await d.json();for(let a of e.models??[]){if(!a.name)continue;let b=a.supportedGenerationMethods??[];if(!b.includes("generateContent"))continue;let c=a.name.toLowerCase();!c.includes("embedding")&&(c.includes("aqa")||i.push({name:a.name,id:a.name.replace(/^models\//,""),...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{},supportedGenerationMethods:b}))}b=e.nextPageToken}while(b);return i.sort(h),f.set(d,{fetchedAt:Date.now(),models:i}),i}function h(a,b){let c=i(a.id),d=i(b.id);if(c!==d)return c-d;let e=j(a.id),f=j(b.id);return e!==f?f-e:a.id.localeCompare(b.id)}function i(a){return a.endsWith("flash-latest")?0:a.includes("flash")&&!a.includes("lite")?1:a.includes("flash-lite")?2:a.endsWith("pro-latest")||a.includes("pro")?3:4}function j(a){let b=/gemini-(\d+)\.(\d+)/.exec(a);return b?100*Number(b[1])+Number(b[2]):0}async function k(a="general"){let b=await (0,e.$L)("gemini");if("video"===a&&b?.videoModel)return b.videoModel;if(b?.model)return b.model;try{let a=await g();if(a.length>0)return a[0].id}catch{}return"gemini-flash-latest"}async function l(a){let b=`https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(a.model)}:generateContent?key=${encodeURIComponent(a.apiKey)}`,c=await fetch(b,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({contents:a.contents,...a.generationConfig?{generationConfig:a.generationConfig}:{}})}),d=await c.text();if(!c.ok)throw Error(`Gemini HTTP ${c.status}: ${d.slice(0,800)}`);let e=JSON.parse(d);if(e.promptFeedback?.blockReason)throw Error(`Gemini blocked: ${e.promptFeedback.blockReason}`);return{text:(e.candidates??[]).flatMap(a=>a.content?.parts??[]).map(a=>a.text??"").filter(Boolean).join("\n").trim(),raw:e}}globalThis.__reflexGeminiModelsCache=f;var m=c(36017);async function n(a){var b;let c=await (0,e.CG)("gemini");if(!c)return{ok:!1,needsKey:!0,error:"Gemini API key is not saved — enter it to summarize videos."};let d=(await (0,m.M)()).language??"russian",f=a.prompt?.trim()||(b=d,/russ/i.test(b)||RegExp("рус","i").test(b)?"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (any memorable phrases) — with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway: the main point worth retaining.\n\nRespond in Russian, concisely. No filler.":"Produce a structured summary of this YouTube video:\n\n1. One paragraph — what the video is about and who it's for.\n2. Main points as a bulleted list with `[mm:ss]` timestamps.\n3. Notable quotes (if any) with timestamps.\n4. If diagrams / slides / code are shown — briefly describe them.\n5. 1-3 sentence takeaway.\n\nBe concise. No filler."),g=a.modelOverride?.trim()||await k("video");try{let{text:b}=await l({model:g,apiKey:c,contents:[{parts:[{file_data:{file_uri:a.url,mime_type:"video/*"}},{text:f}]}]});if(!b)return{ok:!1,error:"Gemini returned an empty response — the video may be unavailable or private."};return{ok:!0,text:b,model:g}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function o(a){try{if(!a.trim())return{ok:!1,error:"API key is empty"};return await (0,e.Pc)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function p(a){return{ok:!0,present:await (0,e.hasApiKey)(a)}}async function q(a=!1){try{let b=await g({refresh:a});return{ok:!0,models:b.map(a=>({id:a.id,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...void 0!==a.inputTokenLimit?{inputTokenLimit:a.inputTokenLimit}:{},...void 0!==a.outputTokenLimit?{outputTokenLimit:a.outputTokenLimit}:{}})),currentModel:await k("general"),currentVideoModel:await k("video")}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function r(a){try{return await (0,e.ND)("gemini",a),{ok:!0}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}(0,c(63781).D)([n,o,p,q,r]),(0,d.A)(n,"404911b95ce93cd41766578b74740989ed34bea687",null),(0,d.A)(o,"40b4d6f367570699418de4236311b8169545fa7e9e",null),(0,d.A)(p,"401a9b484e6639a1fa393bdf2bd3ed270abc0fdd88",null),(0,d.A)(q,"4022839a1b29da575a6c867dfa153d3887871ae7d8",null),(0,d.A)(r,"401de30f69c6a9957c082df1cace4f601e61d51bcf",null)}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";exports.id=9402,exports.ids=[9402],exports.modules={65177:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]])},66979:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},73569:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(42557).A)("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]])},79402:(a,b,c)=>{c.d(b,{UtilityIframe:()=>s});var d=c(64173),e=c(17240),f=c(53186),g=c(71813),h=c(65177),i=c(66979),j=c(69552),k=c(62261),l=c(73569),m=c(1056),n=c.n(m),o=c(44052),p=c(3265);function q({scope:a,utilityId:b,utilityName:c,rootId:m,requestSnapshot:p,onClose:q}){let s=(0,g.c)("app"),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)([]),[x,y]=(0,e.useState)(""),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useTransition)(),[D,E]=(0,e.useState)(!1),F=(0,e.useRef)(null);(0,e.useRef)(null),(0,e.useRef)("");let[G,H]=(0,e.useState)(""),I=()=>{let a=x.trim();a&&m&&t&&(y(""),w(b=>[...b,{role:"user",text:a,ts:new Date().toISOString()}]),C(async()=>{let b;try{b=await Promise.race([p(),new Promise(a=>setTimeout(()=>a(void 0),600))])}catch{}let c=void 0!==b?function(a,b){let c;try{c="string"==typeof b?b:JSON.stringify(b,null,2)}catch{c=String(b)}return c.length>4e3&&(c=c.slice(0,4e3)+"\n…[truncated]"),["[Mini-app context]",c,"[/context]\n",a].join("\n")}(a,b):a;try{let a=await fetch(`/api/roots/${m}/chat/${t}/send`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:c})});if(!a.ok){let b=await a.json().catch(()=>({}));o.oR.error(b.error??`HTTP ${a.status}`)}}catch(a){o.oR.error(String(a))}}))};return(0,d.jsxs)("aside",{className:"flex h-full flex-col border-l bg-card",children:[(0,d.jsxs)("header",{className:"border-b px-3 py-2 flex items-center gap-2",children:[(0,d.jsx)(f.A,{className:"h-3.5 w-3.5 text-violet-600"}),(0,d.jsx)("span",{className:"text-sm font-medium",children:s("utilities.helper.title")}),(0,d.jsx)("span",{className:"text-[10px] text-muted-foreground ml-1",children:s("utilities.helper.hint")}),m&&t&&(0,d.jsx)(n(),{href:`/roots/${m}/chat/${t}`,className:"ml-auto p-1 rounded hover:bg-accent text-muted-foreground hover:text-foreground",title:s("utilities.helper.openFull"),children:(0,d.jsx)(h.A,{className:"h-3.5 w-3.5"})}),q&&(0,d.jsx)("button",{type:"button",onClick:q,className:"p-1 rounded hover:bg-accent "+(m&&t?"":"ml-auto"),title:s("utilities.helper.hide"),children:(0,d.jsx)(i.A,{className:"h-3.5 w-3.5"})})]}),(0,d.jsxs)("div",{ref:F,className:"flex-1 overflow-y-auto px-3 py-2 space-y-2 text-sm",children:[z&&(0,d.jsx)("p",{className:"text-xs text-red-600",children:z}),!z&&0===v.length&&!G&&(0,d.jsxs)("div",{className:"text-xs text-muted-foreground flex items-start gap-2",children:[(0,d.jsx)(j.A,{className:"h-3 w-3 mt-0.5 text-violet-600 shrink-0"}),(0,d.jsx)("span",{children:s("utilities.helper.welcome")})]}),v.map((a,b)=>(0,d.jsx)(r,{role:a.role,text:a.text},b)),D&&G&&(0,d.jsx)(r,{role:"assistant",text:G,streaming:!0}),B&&!D&&(0,d.jsxs)("div",{className:"mr-6 rounded-md bg-muted/40 px-2 py-1.5 text-xs text-muted-foreground inline-flex items-center gap-2",children:[(0,d.jsx)(k.A,{className:"h-3 w-3 animate-spin"}),s("utilities.helper.thinking")]})]}),(0,d.jsxs)("div",{className:"border-t px-3 py-2 flex items-end gap-1.5",children:[(0,d.jsx)("textarea",{value:x,onChange:a=>y(a.target.value),onKeyDown:a=>{"Enter"===a.key&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),I())},rows:1,placeholder:s("utilities.helper.placeholder"),disabled:B||!!z||!t,className:"flex-1 resize-none rounded border bg-background px-2 py-1 text-xs focus:outline-none focus:ring-1 focus:ring-violet-400 max-h-24"}),(0,d.jsx)("button",{type:"button",onClick:I,disabled:B||!x.trim()||!!z||!t,className:"inline-flex items-center justify-center rounded bg-violet-600 px-2 py-1 text-white hover:bg-violet-700 disabled:opacity-50",children:B?(0,d.jsx)(k.A,{className:"h-3 w-3 animate-spin"}):(0,d.jsx)(l.A,{className:"h-3 w-3"})})]})]})}function r({role:a,text:b,streaming:c}){let e=(0,g.c)("app"),f=b;return("user"===a&&(f=f.replace(/^\s*\[Mini-app context\][\s\S]*?\[\/context\]\s*/,"").trim()),f.trim())?(0,d.jsxs)("div",{className:"user"===a?"ml-6 rounded-md bg-violet-50 dark:bg-violet-950/30 px-2 py-1.5":"mr-6 rounded-md bg-muted/40 px-2 py-1.5 whitespace-pre-wrap",children:[(0,d.jsxs)("div",{className:"text-[10px] uppercase tracking-wider text-muted-foreground mb-0.5",children:[e("user"===a?"utilities.helper.you":"assistant"===a?"utilities.helper.reflex":"utilities.helper.system"),c&&(0,d.jsx)("span",{className:"ml-1 text-violet-600",children:"●"})]}),f]}):null}function s({scope:a,id:b,rootId:c,className:h,title:i,agentChat:j,utilityName:k}){let l=(0,g.c)("app"),m=(0,e.useRef)(null),n=(0,e.useRef)(null),[o,p]=(0,e.useState)(!0),r=c?`?rootId=${encodeURIComponent(c)}`:"",s=`/api/utilities/${a}/${b}/iframe${r}`,t=(0,d.jsx)("iframe",{ref:m,src:s,sandbox:"allow-scripts allow-forms allow-same-origin",className:h??"h-full w-full border-0 bg-white",title:i??`utility-${b}`});return j?(0,d.jsxs)("div",{className:"flex h-full w-full",children:[(0,d.jsxs)("div",{className:"flex-1 min-w-0 relative",children:[t,!o&&(0,d.jsxs)("button",{type:"button",onClick:()=>p(!0),className:"absolute right-3 bottom-3 inline-flex items-center gap-1 rounded-full bg-violet-600 px-3 py-1.5 text-xs text-white shadow-lg hover:bg-violet-700",title:l("utilities.iframe.openHelper"),children:[(0,d.jsx)(f.A,{className:"h-3.5 w-3.5"}),l("utilities.iframe.helper")]})]}),o&&(0,d.jsx)("div",{className:"w-80 shrink-0",children:(0,d.jsx)(q,{scope:a,utilityId:b,...k?{utilityName:k}:{},...c?{rootId:c}:{},requestSnapshot:()=>{let a=m.current?.contentWindow;return a?(n.current&&(clearTimeout(n.current.timer),n.current.resolve(void 0),n.current=null),new Promise(b=>{let c=setTimeout(()=>{n.current?.resolve===b&&(n.current=null,b(void 0))},500);n.current={resolve:b,timer:c};try{a.postMessage({type:"request-snapshot"},"*")}catch{clearTimeout(c),n.current=null,b(void 0)}})):Promise.resolve(void 0)},onClose:()=>p(!1)})})]}):t}p.callServer,p.findSourceMapURL,p.callServer,p.findSourceMapURL}};
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
"/api/roots/[id]/chat/[topicId]/send": {},
|
|
10
10
|
"/api/roots/[id]/chat/[topicId]/stop": {},
|
|
11
11
|
"/api/roots/[id]/chat/[topicId]/stream": {},
|
|
12
|
-
"/api/roots/[id]/dashboard": {},
|
|
13
12
|
"/api/roots/[id]/suggestions": {},
|
|
13
|
+
"/api/roots/[id]/dashboard": {},
|
|
14
14
|
"/api/utilities/[scope]/[id]/bundle.js": {},
|
|
15
15
|
"/api/utilities/[scope]/[id]/host-api.mjs": {},
|
|
16
16
|
"/api/utilities/[scope]/[id]/host-ui.mjs": {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-
|
|
1
|
+
globalThis.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-42372ed130431b0a.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],rootMainFiles:["static/chunks/webpack-4f6b598d96af4ca7.js","static/chunks/6fe292aa-7126ff9d6732e864.js","static/chunks/146-ccee3b26755b68c8.js","static/chunks/main-app-ebe67847147d19aa.js"],rootMainFilesTree:{},pages:{"/_app":["static/chunks/webpack-4f6b598d96af4ca7.js","static/chunks/framework-aaa7c1a953276299.js","static/chunks/main-bfb98fc1d6aa1d45.js","static/chunks/pages/_app-bf8bc157ace53d59.js"],"/_error":["static/chunks/webpack-4f6b598d96af4ca7.js","static/chunks/framework-aaa7c1a953276299.js","static/chunks/main-bfb98fc1d6aa1d45.js","static/chunks/pages/_error-da89ab2956f0cf38.js"]},ampFirstPages:[]},globalThis.__BUILD_MANIFEST.lowPriorityFiles=["/static/"+process.env.__NEXT_BUILD_ID+"/_buildManifest.js",,"/static/"+process.env.__NEXT_BUILD_ID+"/_ssgManifest.js"];
|