@frumu/tandem-panel 0.5.5 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/assets/{AutomationsPage-6mRHsh9V.js → AutomationsPage-BGqpmilp.js} +12 -12
  2. package/dist/assets/BugMonitorPage-BVzdj9y-.js +4 -0
  3. package/dist/assets/{ChannelsPage-oJ5a717t.js → ChannelsPage-B-InJ4Yh.js} +1 -1
  4. package/dist/assets/{ChatInterfacePanel-3nvwn0cJ.js → ChatInterfacePanel-BrMo4cXg.js} +1 -1
  5. package/dist/assets/{ChatPage-CGKFC9ev.js → ChatPage-Bc-BfOG1.js} +1 -1
  6. package/dist/assets/CodingWorkflowsPage-xgfwLRlt.js +8 -0
  7. package/dist/assets/{ControlPanelDialogs-BBIPHXnw.js → ControlPanelDialogs-yFfCht3Y.js} +1 -1
  8. package/dist/assets/DashboardPage-CrA1itFc.js +1 -0
  9. package/dist/assets/{ExperimentsPage-DuYHzo7d.js → ExperimentsPage-Bkg1_6rw.js} +2 -2
  10. package/dist/assets/FilesPage-DChyHlO_.js +1 -0
  11. package/dist/assets/{IntentPlannerPage-BwlF9wfW.js → IntentPlannerPage-Dti1h8Tm.js} +4 -4
  12. package/dist/assets/MarketplacePage-90fAVNGg.js +1 -0
  13. package/dist/assets/{McpToolAllowlistEditor-B3qCkiFT.js → McpToolAllowlistEditor-BzQ64HrZ.js} +1 -1
  14. package/dist/assets/{MemoryImportDialog-BWT93PW1.js → MemoryImportDialog-DSpS1JF5.js} +1 -1
  15. package/dist/assets/MemoryPage-DRRLgoc0.js +1 -0
  16. package/dist/assets/{OrchestratorPage-HDyjjwF-.js → OrchestratorPage-CYU-ESPI.js} +1 -1
  17. package/dist/assets/PacksPage-dRmjjdKD.js +3 -0
  18. package/dist/assets/PlannerDiagnosticsPanel-C1uIuRIx.js +1 -0
  19. package/dist/assets/RunsPage-DEy8vbRT.js +1 -0
  20. package/dist/assets/SettingsPage-CwH_FzOs.js +5 -0
  21. package/dist/assets/{TeamsPage-CwMnVES9.js → TeamsPage-Dn81V0EB.js} +3 -3
  22. package/dist/assets/{WorkflowStudioPage-CyWDhEEE.js → WorkflowStudioPage-yFhlA4KV.js} +1 -1
  23. package/dist/assets/WorkflowsPage-vmaKHFox.js +2 -0
  24. package/dist/assets/{index-DAWzCKcg.css → index-C8Bjo7hU.css} +1 -1
  25. package/dist/assets/index-TvymvGva.js +3 -0
  26. package/dist/assets/{useEngineStream-ChEkuUVV.js → useEngineStream-Diqri33l.js} +1 -1
  27. package/dist/index.html +3 -5
  28. package/package.json +3 -3
  29. package/dist/assets/BugMonitorPage-B9mcxV8k.js +0 -4
  30. package/dist/assets/CodingWorkflowsPage-DosUtoeO.js +0 -8
  31. package/dist/assets/DashboardPage-Cv9_TUZQ.js +0 -1
  32. package/dist/assets/FilesPage-NAInb3WU.js +0 -1
  33. package/dist/assets/MarketplacePage-Wo7biaBa.js +0 -1
  34. package/dist/assets/MemoryPage-gSBH1OKG.js +0 -1
  35. package/dist/assets/PacksPage-BWnL4dRB.js +0 -3
  36. package/dist/assets/PlannerDiagnosticsPanel-VyacxaCM.js +0 -1
  37. package/dist/assets/RunsPage-B6ttNeUJ.js +0 -1
  38. package/dist/assets/SettingsPage-DhAKDQHw.js +0 -5
  39. package/dist/assets/WorkflowsPage-BWGWH8uD.js +0 -2
  40. package/dist/assets/api-CpR5ozpc.js +0 -1
  41. package/dist/assets/index-picB46b5.js +0 -3
  42. package/dist/assets/ui-CV-Z6sqF.js +0 -1
  43. /package/dist/assets/{LazyJson-DYncL_RR.js → LazyJson-vfWw7G9F.js} +0 -0
  44. /package/dist/assets/{ProviderModelSelector-B_IE0-e7.js → ProviderModelSelector-BdtOpkJR.js} +0 -0
  45. /package/dist/assets/{TaskBoard-DSRrmiyQ.js → TaskBoard-CCY_Qy5S.js} +0 -0
  46. /package/dist/assets/{TimezoneField-DKINpKxU.js → TimezoneField-B5i---lF.js} +0 -0
  47. /package/dist/assets/{chatPageHelpers-D-NhHk4M.js → chatPageHelpers-Dmb4waDk.js} +0 -0
  48. /package/dist/assets/{explorerHandoff-KpFRPNQc.js → explorerHandoff-BPKxMR82.js} +0 -0
  49. /package/dist/assets/{format-CimuGHiH.js → format-DyX5imzJ.js} +0 -0
  50. /package/dist/assets/{markdown-DJurGVIJ.js → markdown-Dwwtq3bu.js} +0 -0
  51. /package/dist/assets/{messages-AWZpX-Rw.js → messages-uD0aB_MZ.js} +0 -0
  52. /package/dist/assets/{plannerShared-1kHFyAp-.js → plannerShared-Dx7-Sxpc.js} +0 -0
  53. /package/dist/assets/{sse-B1wvyjPI.js → sse-B4A2m-Nk.js} +0 -0
  54. /package/dist/assets/{workflowStability-Dsk2DR6F.js → workflowStability-C8USyGOY.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{C as e,g as t,h as n,v as r}from"./fullcalendar-Bn75j0xM.js";import{a as i,n as a,t as o}from"./react-query-BIbNygEJ.js";import{i as s}from"./motion-B3ZE8SGR.js";import{t as c}from"./api-CpR5ozpc.js";import{a as ee,c as l,s as u,t as d}from"./index-picB46b5.js";import{a as f,i as p,n as te,t as m}from"./TimezoneField-DKINpKxU.js";import{t as h}from"./ProviderModelSelector-B_IE0-e7.js";import{r as ne}from"./plannerShared-1kHFyAp-.js";var g={type:`run_once`};function _(e){let t=String(e||``).trim();return t?t.startsWith(`/`)?``:`Workspace root must be an absolute path.`:`Workspace root is required.`}function v(e){let t=String(e?.type||``).trim().toLowerCase();if(t===`cron`)return String(e?.cron_expression||e?.cronExpression||`cron`);if(t===`interval`){let t=Number(e?.interval_seconds||e?.intervalSeconds||0);return!Number.isFinite(t)||t<=0?`interval`:t%3600==0?`Every ${t/3600}h`:t%60==0?`Every ${t/60}m`:`Every ${t}s`}return`manual`}function y(e,t){let n=String(t||``).trim()||`UTC`;return e.scheduleKind===`interval`?{type:`interval`,interval_seconds:Math.max(1,Number.parseInt(String(e.intervalSeconds||`3600`),10)||3600),timezone:n,misfire_policy:g}:e.scheduleKind===`cron`?{type:`cron`,cron_expression:String(e.cronExpression||``).trim()||`0 9 * * *`,timezone:n,misfire_policy:g}:{type:`manual`,timezone:n,misfire_policy:g}}function b(e){let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n?null:{default_model:{provider_id:t,model_id:n}}}function x(e,t){let n=String(t?.default||``).trim(),r=e.find(e=>e.id===n)?.id||e[0]?.id||``;if(!r)return{provider:``,model:``};let i=e.find(e=>e.id===r)?.models||[];return{provider:r,model:String(t?.providers?.[r]?.default_model||i[0]||``).trim()}}function re({client:l,toast:d,workspaceRoot:p,onWorkspaceRootChange:g,defaultWorkspaceRoot:re,templates:S,timezone:C,onTimezoneChange:ie}){let ae=i(),oe=n(null),[w,T]=r(`Daily Engineering Standup`),[E,D]=r(!1),[O,k]=r(``),[A,j]=r(``),[M,N]=r({scheduleKind:`cron`,cronExpression:`0 9 * * *`,intervalSeconds:`3600`}),[P,se]=r(`docs/standups/{{date}}.md`),[F,ce]=r([]),[I,L]=r({provider:``,model:``}),[R,z]=r(null),B=n(!1),le=a({queryKey:[`providers`,`catalog`],queryFn:()=>l?.providers?.catalog?.().catch(()=>({all:[]}))??Promise.resolve({all:[]}),refetchInterval:6e4}),V=a({queryKey:[`providers`,`config`],queryFn:()=>l?.providers?.config?.().catch(()=>({}))??Promise.resolve({}),refetchInterval:6e4}),H=a({queryKey:[`teams`,`standup`,`workspace-browser`,O],enabled:E&&!!O,queryFn:()=>c(`/api/orchestrator/workspaces/list?dir=${encodeURIComponent(O)}`,{method:`GET`}),refetchInterval:E?15e3:!1}),U=Array.isArray(H.data?.directories)?H.data.directories:[],W=String(H.data?.parent||``).trim(),G=String(H.data?.dir||O||``).trim(),K=String(A||``).trim().toLowerCase(),q=t(()=>K?U.filter(e=>String(e?.name||e?.path||``).trim().toLowerCase().includes(K)):U,[U,K]),J=String(C||``).trim().length>0&&!f(C)?`Timezone must be a valid IANA timezone like Europe/Berlin.`:``,Y=t(()=>ne({providerCatalog:le.data,providerConfig:V.data,defaultProvider:String(V.data?.default||``).trim(),defaultModel:String(V.data?.providers?.[String(V.data?.default||``).trim()]?.default_model||V.data?.providers?.[String(V.data?.default||``).trim()]?.defaultModel||``).trim()}),[le.data,V.data]),X=t(()=>x(Y,V.data),[Y,V.data]),Z=t(()=>b(I),[I]),ue=Z?`${String(I.provider||``).trim()}/${String(I.model||``).trim()}`:`not selected`;e(()=>{let e=new Set(S.map(e=>e.templateId));ce(t=>{let n=t.filter(t=>e.has(t));return n.length===t.length?t:n})},[S]),e(()=>{B.current||!X.provider||!X.model||(L(X),B.current=!0)},[X]);let Q=o({mutationFn:async()=>{let e=String(w||``).trim(),t=String(p||``).trim();if(!e)throw Error(`Standup name is required.`);let n=_(t);if(n)throw Error(n);if(J)throw Error(J);if(!F.length)throw Error(`Select at least one participant template.`);if(!Z)throw Error(`Choose a provider and model for this standup.`);return await l?.agentTeams?.composeStandup?.({name:e,workspaceRoot:t,schedule:y(M,C),participantTemplateIds:F,reportPathTemplate:String(P||``).trim()||void 0,modelPolicy:Z})||null},onSuccess:e=>{z(e?.automation||null)},onError:e=>d(`err`,e instanceof Error?e.message:String(e))}),$=o({mutationFn:async()=>{let e=R||(await Q.mutateAsync())?.automation;if(!e)throw Error(`Standup compose failed.`);return l?.automationsV2?.create?.(e)},onSuccess:async()=>{d(`ok`,`Agent standup automation created.`),z(null),await ae.invalidateQueries({queryKey:[`automations`]})},onError:e=>d(`err`,e instanceof Error?e.message:String(e))});return e(()=>{let e=oe.current;e&&ee(e)},[w,p,C,M.scheduleKind,M.cronExpression,M.intervalSeconds,P,F.join(`,`),I.provider,I.model,S.length,E,A,Q.isPending,$.isPending,!!R]),s(`div`,{ref:oe,className:`grid gap-4 rounded-2xl border border-emerald-500/20 bg-emerald-500/5 p-4`,children:[s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-emerald-300`,children:`Agent Standup`}),s(`h3`,{className:`mt-1 text-lg font-semibold text-white`,children:`Build a scheduled standup from saved agents`}),s(`p`,{className:`mt-1 text-sm text-slate-300`,children:`Choose the personalities that should participate, preview the workflow, and create the automation from the same place you manage those agents.`})]}),s(`span`,{className:`tcp-badge-ok`,children:`MVP`})]}),s(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[s(`input`,{className:`tcp-input`,placeholder:`Standup name`,value:w,onInput:e=>T(e.target.value)}),s(`div`,{className:`grid gap-2 md:grid-cols-[auto_1fr_auto]`,children:[s(`button`,{className:`tcp-btn h-10 px-3`,type:`button`,onClick:()=>{k(String(p||re||`/`).trim()||`/`),j(``),D(!0)},children:[s(`i`,{"data-lucide":`folder-open`}),`Browse`]}),s(`input`,{className:`tcp-input ${_(p)?`border-red-500/60 text-red-100`:``}`,placeholder:`No local directory selected. Use Browse.`,value:p,readOnly:!0}),s(`button`,{className:`tcp-btn h-10 px-3`,type:`button`,onClick:()=>g(``),disabled:!p,children:[s(`i`,{"data-lucide":`x`}),`Clear`]})]}),s(`div`,{className:`md:col-span-2`,children:s(m,{value:C,onChange:ie,error:J,label:`Timezone`,hint:`Use the timezone that matches the standup's local morning or evening.`})}),s(`div`,{className:`md:col-span-2`,children:s(te,{value:M,onChange:N,timezone:C})})]}),s(`div`,{className:`grid gap-3 rounded-2xl border border-slate-800/80 bg-slate-950/40 p-4`,children:[s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Model`}),s(`div`,{className:`mt-1 text-sm text-slate-300`,children:`Pick the explicit model every standup participant and the coordinator should use.`})]}),s(`span`,{className:`tcp-badge-info`,children:ue})]}),s(h,{providerLabel:`Provider`,modelLabel:`Model`,draft:I,providers:Y,onChange:L,inheritLabel:`Select provider`,disabled:Q.isPending||$.isPending}),s(`div`,{className:`text-xs text-slate-400`,children:`This is prefilled from the workspace default when available, then stored directly on the generated standup agents so the run does not depend on implicit model resolution.`})]}),s(`input`,{className:`tcp-input font-mono text-sm`,placeholder:`docs/standups/{{date}}.md`,value:P,onInput:e=>se(e.target.value)}),s(`div`,{className:`rounded-2xl border border-slate-800/80 bg-slate-950/40 px-4 py-3 text-sm text-slate-300`,children:`The markdown report path controls where the synthesized standup is written. Participant personalities come from the saved agents below.`}),s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Participants`}),S.length?s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:S.map(e=>s(`button`,{type:`button`,className:`tcp-list-item text-left transition-all ${F.includes(e.templateId)?`border-emerald-400/60 bg-emerald-400/10`:``}`,onClick:()=>ce(t=>t.includes(e.templateId)?t.filter(t=>t!==e.templateId):[...t,e.templateId]),children:[s(`div`,{className:`flex items-center justify-between gap-2`,children:[s(`strong`,{children:e.displayName}),s(`span`,{className:`tcp-badge-info`,children:e.role})]}),s(`div`,{className:`tcp-subtle mt-1 text-xs`,children:e.templateId}),e.modelLabel?s(`div`,{className:`mt-2 text-xs text-emerald-200`,children:e.modelLabel}):null]},e.templateId))}):s(u,{text:`Create at least one saved agent below before composing a standup.`})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn`,disabled:Q.isPending||!S.length,onClick:()=>Q.mutate(),children:[s(`i`,{"data-lucide":`file-search`}),Q.isPending?`Composing…`:`Preview Standup Workflow`]}),s(`button`,{type:`button`,className:`tcp-btn-primary`,disabled:$.isPending||!S.length,onClick:()=>$.mutate(),children:[s(`i`,{"data-lucide":`rocket`}),$.isPending?`Creating…`:`Create Standup Automation`]})]}),R?s(`div`,{className:`rounded-xl border border-slate-700/50 bg-slate-950/40 p-3`,children:[s(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[s(`strong`,{children:String(R?.name||`Standup preview`)}),s(`span`,{className:`tcp-badge-info`,children:[Array.isArray(R?.flow?.nodes)?R.flow.nodes.length:0,` nodes`]})]}),s(`div`,{className:`grid gap-2 text-xs text-slate-300`,children:[s(`div`,{children:[`schedule: `,v(R?.schedule)]}),s(`div`,{children:[`timezone: `,String(R?.schedule?.timezone||C||`UTC`)]}),s(`div`,{children:[`model:`,` `,String(R?.agents?.[0]?.model_policy?.default_model?.provider_id&&R?.agents?.[0]?.model_policy?.default_model?.model_id?`${R.agents[0].model_policy.default_model.provider_id}/${R.agents[0].model_policy.default_model.model_id}`:ue)]}),s(`div`,{children:[`report:`,` `,String(R?.metadata?.standup?.report_path_template||P)]}),s(`div`,{children:[`participants:`,` `,String((R?.metadata?.standup?.participant_template_ids||F).join(`, `))]})]})]}):null,E?s(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4`,children:[s(`button`,{type:`button`,className:`tcp-confirm-backdrop`,"aria-label":`Close workspace directory dialog`,onClick:()=>{D(!1),j(``)}}),s(`div`,{className:`tcp-confirm-dialog max-w-2xl`,children:[s(`h3`,{className:`tcp-confirm-title`,children:`Select Workspace Folder`}),s(`p`,{className:`tcp-confirm-message`,children:[`Current: `,G||O||`n/a`]}),s(`div`,{className:`mb-2 flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn`,type:`button`,onClick:()=>{W&&k(W)},disabled:!W,children:[s(`i`,{"data-lucide":`arrow-left-to-line`}),`Up`]}),s(`button`,{className:`tcp-btn-primary`,type:`button`,onClick:()=>{G&&(g(G),D(!1),j(``),d(`ok`,`Workspace selected: ${G}`))},disabled:!G,children:[s(`i`,{"data-lucide":`badge-check`}),`Select This Folder`]}),s(`button`,{className:`tcp-btn`,type:`button`,onClick:()=>{D(!1),j(``)},children:[s(`i`,{"data-lucide":`x`}),`Close`]})]}),s(`div`,{className:`mb-2`,children:s(`input`,{className:`tcp-input`,placeholder:`Type to filter folders...`,value:A,onInput:e=>j(e.target.value)})}),s(`div`,{className:`max-h-[360px] overflow-auto rounded-lg border border-slate-700/60 bg-slate-900/20 p-2`,children:q.length?q.map(e=>s(`button`,{className:`tcp-list-item mb-1 w-full text-left`,type:`button`,onClick:()=>k(String(e?.path||``)),children:s(`span`,{className:`inline-flex items-center gap-2`,children:[s(`i`,{"data-lucide":`folder-open`}),s(`span`,{children:String(e?.name||e?.path||``)})]})},String(e?.path||e?.name))):s(u,{text:A.trim()?`No folders match your search.`:`No subdirectories in this folder.`})})]})]}):null]})}var S={generated_at:`2026-04-06T07:44:33.809Z`,source_root:`@tandem-agents`,categories:[{id:`business-product`,title:`Business & Product`,summary:`Support agents for requirements, UX, and engineering-adjacent writing tasks.`,source_path:`@tandem-agents/categories/08-business-product`,count:11},{id:`core-development`,title:`Core Development`,summary:`Core agents for application architecture, cross-layer implementation, UI work, and protocol-specific development.`,source_path:`@tandem-agents/categories/01-core-development`,count:12},{id:`data-ai`,title:`Data & AI`,summary:`Agents for data pipelines, LLM integrations, and database behavior.`,source_path:`@tandem-agents/categories/05-data-ai`,count:12},{id:`developer-experience`,title:`Developer Experience`,summary:`Agents for builds, developer tooling, documentation, MCP integrations, and refactors.`,source_path:`@tandem-agents/categories/06-developer-experience`,count:13},{id:`infrastructure`,title:`Infrastructure`,summary:`Infrastructure-focused agents for deployment, containerization, orchestration, and IaC work.`,source_path:`@tandem-agents/categories/03-infrastructure`,count:16},{id:`language-specialists`,title:`Language Specialists`,summary:`Language and framework specialists for ecosystem-specific implementation, debugging, and architectural guidance.`,source_path:`@tandem-agents/categories/02-language-specialists`,count:27},{id:`meta-orchestration`,title:`Meta & Orchestration`,summary:`Agents that help plan or coordinate multi-agent Codex workflows without inventing unsupported mechanics.`,source_path:`@tandem-agents/categories/09-meta-orchestration`,count:10},{id:`quality-security`,title:`Quality & Security`,summary:`Review and verification agents that work especially well as read-heavy Codex subagents.`,source_path:`@tandem-agents/categories/04-quality-security`,count:16},{id:`research-analysis`,title:`Research & Analysis`,summary:`Read-heavy research agents for searching, validating, comparing, and synthesizing information.`,source_path:`@tandem-agents/categories/10-research-analysis`,count:7},{id:`specialized-domains`,title:`Specialized Domains`,summary:`Focused domain agents that still have a clear implementation or verification boundary.`,source_path:`@tandem-agents/categories/07-specialized-domains`,count:12}],agents:[{id:`business-analyst`,name:`business-analyst`,summary:`Use when a task needs requirements clarified, scope normalized, or acceptance criteria extracted from messy inputs before engineering work starts.`,category_id:`business-product`,category_title:`Business & Product`,category_summary:`Support agents for requirements, UX, and engineering-adjacent writing tasks.`,source_path:`@tandem-agents/categories/08-business-product/business-analyst.toml`,source_file:`business-analyst.toml`,sandbox_mode:`read-only`,target_surfaces:[`desktop`,`control-panel`],instructions:`Own business analysis as requirement clarity and scope-risk control, not requirement theater.
1
+ import{C as e,g as t,h as n,v as r}from"./fullcalendar-Bn75j0xM.js";import{a as i,n as a,t as o}from"./react-query-BIbNygEJ.js";import{i as s}from"./motion-B3ZE8SGR.js";import{a as ee,c,d as l,s as u,t as d}from"./index-TvymvGva.js";import{a as f,i as p,n as te,t as m}from"./TimezoneField-B5i---lF.js";import{t as h}from"./ProviderModelSelector-BdtOpkJR.js";import{r as ne}from"./plannerShared-Dx7-Sxpc.js";var g={type:`run_once`};function _(e){let t=String(e||``).trim();return t?t.startsWith(`/`)?``:`Workspace root must be an absolute path.`:`Workspace root is required.`}function v(e){let t=String(e?.type||``).trim().toLowerCase();if(t===`cron`)return String(e?.cron_expression||e?.cronExpression||`cron`);if(t===`interval`){let t=Number(e?.interval_seconds||e?.intervalSeconds||0);return!Number.isFinite(t)||t<=0?`interval`:t%3600==0?`Every ${t/3600}h`:t%60==0?`Every ${t/60}m`:`Every ${t}s`}return`manual`}function y(e,t){let n=String(t||``).trim()||`UTC`;return e.scheduleKind===`interval`?{type:`interval`,interval_seconds:Math.max(1,Number.parseInt(String(e.intervalSeconds||`3600`),10)||3600),timezone:n,misfire_policy:g}:e.scheduleKind===`cron`?{type:`cron`,cron_expression:String(e.cronExpression||``).trim()||`0 9 * * *`,timezone:n,misfire_policy:g}:{type:`manual`,timezone:n,misfire_policy:g}}function b(e){let t=String(e.provider||``).trim(),n=String(e.model||``).trim();return!t||!n?null:{default_model:{provider_id:t,model_id:n}}}function re(e,t){let n=String(t?.default||``).trim(),r=e.find(e=>e.id===n)?.id||e[0]?.id||``;if(!r)return{provider:``,model:``};let i=e.find(e=>e.id===r)?.models||[];return{provider:r,model:String(t?.providers?.[r]?.default_model||i[0]||``).trim()}}function ie({client:c,toast:d,workspaceRoot:p,onWorkspaceRootChange:g,defaultWorkspaceRoot:ie,templates:x,timezone:S,onTimezoneChange:ae}){let oe=i(),C=n(null),[w,T]=r(`Daily Engineering Standup`),[E,D]=r(!1),[O,k]=r(``),[A,j]=r(``),[M,N]=r({scheduleKind:`cron`,cronExpression:`0 9 * * *`,intervalSeconds:`3600`}),[P,se]=r(`docs/standups/{{date}}.md`),[F,ce]=r([]),[I,L]=r({provider:``,model:``}),[R,z]=r(null),B=n(!1),le=a({queryKey:[`providers`,`catalog`],queryFn:()=>c?.providers?.catalog?.().catch(()=>({all:[]}))??Promise.resolve({all:[]}),refetchInterval:6e4}),V=a({queryKey:[`providers`,`config`],queryFn:()=>c?.providers?.config?.().catch(()=>({}))??Promise.resolve({}),refetchInterval:6e4}),H=a({queryKey:[`teams`,`standup`,`workspace-browser`,O],enabled:E&&!!O,queryFn:()=>l(`/api/orchestrator/workspaces/list?dir=${encodeURIComponent(O)}`,{method:`GET`}),refetchInterval:E?15e3:!1}),U=Array.isArray(H.data?.directories)?H.data.directories:[],W=String(H.data?.parent||``).trim(),G=String(H.data?.dir||O||``).trim(),K=String(A||``).trim().toLowerCase(),q=t(()=>K?U.filter(e=>String(e?.name||e?.path||``).trim().toLowerCase().includes(K)):U,[U,K]),J=String(S||``).trim().length>0&&!f(S)?`Timezone must be a valid IANA timezone like Europe/Berlin.`:``,Y=t(()=>ne({providerCatalog:le.data,providerConfig:V.data,defaultProvider:String(V.data?.default||``).trim(),defaultModel:String(V.data?.providers?.[String(V.data?.default||``).trim()]?.default_model||V.data?.providers?.[String(V.data?.default||``).trim()]?.defaultModel||``).trim()}),[le.data,V.data]),X=t(()=>re(Y,V.data),[Y,V.data]),Z=t(()=>b(I),[I]),ue=Z?`${String(I.provider||``).trim()}/${String(I.model||``).trim()}`:`not selected`;e(()=>{let e=new Set(x.map(e=>e.templateId));ce(t=>{let n=t.filter(t=>e.has(t));return n.length===t.length?t:n})},[x]),e(()=>{B.current||!X.provider||!X.model||(L(X),B.current=!0)},[X]);let Q=o({mutationFn:async()=>{let e=String(w||``).trim(),t=String(p||``).trim();if(!e)throw Error(`Standup name is required.`);let n=_(t);if(n)throw Error(n);if(J)throw Error(J);if(!F.length)throw Error(`Select at least one participant template.`);if(!Z)throw Error(`Choose a provider and model for this standup.`);return await c?.agentTeams?.composeStandup?.({name:e,workspaceRoot:t,schedule:y(M,S),participantTemplateIds:F,reportPathTemplate:String(P||``).trim()||void 0,modelPolicy:Z})||null},onSuccess:e=>{z(e?.automation||null)},onError:e=>d(`err`,e instanceof Error?e.message:String(e))}),$=o({mutationFn:async()=>{let e=R||(await Q.mutateAsync())?.automation;if(!e)throw Error(`Standup compose failed.`);return c?.automationsV2?.create?.(e)},onSuccess:async()=>{d(`ok`,`Agent standup automation created.`),z(null),await oe.invalidateQueries({queryKey:[`automations`]})},onError:e=>d(`err`,e instanceof Error?e.message:String(e))});return e(()=>{let e=C.current;e&&ee(e)},[w,p,S,M.scheduleKind,M.cronExpression,M.intervalSeconds,P,F.join(`,`),I.provider,I.model,x.length,E,A,Q.isPending,$.isPending,!!R]),s(`div`,{ref:C,className:`grid gap-4 rounded-2xl border border-emerald-500/20 bg-emerald-500/5 p-4`,children:[s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-emerald-300`,children:`Agent Standup`}),s(`h3`,{className:`mt-1 text-lg font-semibold text-white`,children:`Build a scheduled standup from saved agents`}),s(`p`,{className:`mt-1 text-sm text-slate-300`,children:`Choose the personalities that should participate, preview the workflow, and create the automation from the same place you manage those agents.`})]}),s(`span`,{className:`tcp-badge-ok`,children:`MVP`})]}),s(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[s(`input`,{className:`tcp-input`,placeholder:`Standup name`,value:w,onInput:e=>T(e.target.value)}),s(`div`,{className:`grid gap-2 md:grid-cols-[auto_1fr_auto]`,children:[s(`button`,{className:`tcp-btn h-10 px-3`,type:`button`,onClick:()=>{k(String(p||ie||`/`).trim()||`/`),j(``),D(!0)},children:[s(`i`,{"data-lucide":`folder-open`}),`Browse`]}),s(`input`,{className:`tcp-input ${_(p)?`border-red-500/60 text-red-100`:``}`,placeholder:`No local directory selected. Use Browse.`,value:p,readOnly:!0}),s(`button`,{className:`tcp-btn h-10 px-3`,type:`button`,onClick:()=>g(``),disabled:!p,children:[s(`i`,{"data-lucide":`x`}),`Clear`]})]}),s(`div`,{className:`md:col-span-2`,children:s(m,{value:S,onChange:ae,error:J,label:`Timezone`,hint:`Use the timezone that matches the standup's local morning or evening.`})}),s(`div`,{className:`md:col-span-2`,children:s(te,{value:M,onChange:N,timezone:S})})]}),s(`div`,{className:`grid gap-3 rounded-2xl border border-slate-800/80 bg-slate-950/40 p-4`,children:[s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Model`}),s(`div`,{className:`mt-1 text-sm text-slate-300`,children:`Pick the explicit model every standup participant and the coordinator should use.`})]}),s(`span`,{className:`tcp-badge-info`,children:ue})]}),s(h,{providerLabel:`Provider`,modelLabel:`Model`,draft:I,providers:Y,onChange:L,inheritLabel:`Select provider`,disabled:Q.isPending||$.isPending}),s(`div`,{className:`text-xs text-slate-400`,children:`This is prefilled from the workspace default when available, then stored directly on the generated standup agents so the run does not depend on implicit model resolution.`})]}),s(`input`,{className:`tcp-input font-mono text-sm`,placeholder:`docs/standups/{{date}}.md`,value:P,onInput:e=>se(e.target.value)}),s(`div`,{className:`rounded-2xl border border-slate-800/80 bg-slate-950/40 px-4 py-3 text-sm text-slate-300`,children:`The markdown report path controls where the synthesized standup is written. Participant personalities come from the saved agents below.`}),s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Participants`}),x.length?s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:x.map(e=>s(`button`,{type:`button`,className:`tcp-list-item text-left transition-all ${F.includes(e.templateId)?`border-emerald-400/60 bg-emerald-400/10`:``}`,onClick:()=>ce(t=>t.includes(e.templateId)?t.filter(t=>t!==e.templateId):[...t,e.templateId]),children:[s(`div`,{className:`flex items-center justify-between gap-2`,children:[s(`strong`,{children:e.displayName}),s(`span`,{className:`tcp-badge-info`,children:e.role})]}),s(`div`,{className:`tcp-subtle mt-1 text-xs`,children:e.templateId}),e.modelLabel?s(`div`,{className:`mt-2 text-xs text-emerald-200`,children:e.modelLabel}):null]},e.templateId))}):s(u,{text:`Create at least one saved agent below before composing a standup.`})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn`,disabled:Q.isPending||!x.length,onClick:()=>Q.mutate(),children:[s(`i`,{"data-lucide":`file-search`}),Q.isPending?`Composing…`:`Preview Standup Workflow`]}),s(`button`,{type:`button`,className:`tcp-btn-primary`,disabled:$.isPending||!x.length,onClick:()=>$.mutate(),children:[s(`i`,{"data-lucide":`rocket`}),$.isPending?`Creating…`:`Create Standup Automation`]})]}),R?s(`div`,{className:`rounded-xl border border-slate-700/50 bg-slate-950/40 p-3`,children:[s(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[s(`strong`,{children:String(R?.name||`Standup preview`)}),s(`span`,{className:`tcp-badge-info`,children:[Array.isArray(R?.flow?.nodes)?R.flow.nodes.length:0,` nodes`]})]}),s(`div`,{className:`grid gap-2 text-xs text-slate-300`,children:[s(`div`,{children:[`schedule: `,v(R?.schedule)]}),s(`div`,{children:[`timezone: `,String(R?.schedule?.timezone||S||`UTC`)]}),s(`div`,{children:[`model:`,` `,String(R?.agents?.[0]?.model_policy?.default_model?.provider_id&&R?.agents?.[0]?.model_policy?.default_model?.model_id?`${R.agents[0].model_policy.default_model.provider_id}/${R.agents[0].model_policy.default_model.model_id}`:ue)]}),s(`div`,{children:[`report:`,` `,String(R?.metadata?.standup?.report_path_template||P)]}),s(`div`,{children:[`participants:`,` `,String((R?.metadata?.standup?.participant_template_ids||F).join(`, `))]})]})]}):null,E?s(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4`,children:[s(`button`,{type:`button`,className:`tcp-confirm-backdrop`,"aria-label":`Close workspace directory dialog`,onClick:()=>{D(!1),j(``)}}),s(`div`,{className:`tcp-confirm-dialog max-w-2xl`,children:[s(`h3`,{className:`tcp-confirm-title`,children:`Select Workspace Folder`}),s(`p`,{className:`tcp-confirm-message`,children:[`Current: `,G||O||`n/a`]}),s(`div`,{className:`mb-2 flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn`,type:`button`,onClick:()=>{W&&k(W)},disabled:!W,children:[s(`i`,{"data-lucide":`arrow-left-to-line`}),`Up`]}),s(`button`,{className:`tcp-btn-primary`,type:`button`,onClick:()=>{G&&(g(G),D(!1),j(``),d(`ok`,`Workspace selected: ${G}`))},disabled:!G,children:[s(`i`,{"data-lucide":`badge-check`}),`Select This Folder`]}),s(`button`,{className:`tcp-btn`,type:`button`,onClick:()=>{D(!1),j(``)},children:[s(`i`,{"data-lucide":`x`}),`Close`]})]}),s(`div`,{className:`mb-2`,children:s(`input`,{className:`tcp-input`,placeholder:`Type to filter folders...`,value:A,onInput:e=>j(e.target.value)})}),s(`div`,{className:`max-h-[360px] overflow-auto rounded-lg border border-slate-700/60 bg-slate-900/20 p-2`,children:q.length?q.map(e=>s(`button`,{className:`tcp-list-item mb-1 w-full text-left`,type:`button`,onClick:()=>k(String(e?.path||``)),children:s(`span`,{className:`inline-flex items-center gap-2`,children:[s(`i`,{"data-lucide":`folder-open`}),s(`span`,{children:String(e?.name||e?.path||``)})]})},String(e?.path||e?.name))):s(u,{text:A.trim()?`No folders match your search.`:`No subdirectories in this folder.`})})]})]}):null]})}var x={generated_at:`2026-04-06T07:44:33.809Z`,source_root:`@tandem-agents`,categories:[{id:`business-product`,title:`Business & Product`,summary:`Support agents for requirements, UX, and engineering-adjacent writing tasks.`,source_path:`@tandem-agents/categories/08-business-product`,count:11},{id:`core-development`,title:`Core Development`,summary:`Core agents for application architecture, cross-layer implementation, UI work, and protocol-specific development.`,source_path:`@tandem-agents/categories/01-core-development`,count:12},{id:`data-ai`,title:`Data & AI`,summary:`Agents for data pipelines, LLM integrations, and database behavior.`,source_path:`@tandem-agents/categories/05-data-ai`,count:12},{id:`developer-experience`,title:`Developer Experience`,summary:`Agents for builds, developer tooling, documentation, MCP integrations, and refactors.`,source_path:`@tandem-agents/categories/06-developer-experience`,count:13},{id:`infrastructure`,title:`Infrastructure`,summary:`Infrastructure-focused agents for deployment, containerization, orchestration, and IaC work.`,source_path:`@tandem-agents/categories/03-infrastructure`,count:16},{id:`language-specialists`,title:`Language Specialists`,summary:`Language and framework specialists for ecosystem-specific implementation, debugging, and architectural guidance.`,source_path:`@tandem-agents/categories/02-language-specialists`,count:27},{id:`meta-orchestration`,title:`Meta & Orchestration`,summary:`Agents that help plan or coordinate multi-agent Codex workflows without inventing unsupported mechanics.`,source_path:`@tandem-agents/categories/09-meta-orchestration`,count:10},{id:`quality-security`,title:`Quality & Security`,summary:`Review and verification agents that work especially well as read-heavy Codex subagents.`,source_path:`@tandem-agents/categories/04-quality-security`,count:16},{id:`research-analysis`,title:`Research & Analysis`,summary:`Read-heavy research agents for searching, validating, comparing, and synthesizing information.`,source_path:`@tandem-agents/categories/10-research-analysis`,count:7},{id:`specialized-domains`,title:`Specialized Domains`,summary:`Focused domain agents that still have a clear implementation or verification boundary.`,source_path:`@tandem-agents/categories/07-specialized-domains`,count:12}],agents:[{id:`business-analyst`,name:`business-analyst`,summary:`Use when a task needs requirements clarified, scope normalized, or acceptance criteria extracted from messy inputs before engineering work starts.`,category_id:`business-product`,category_title:`Business & Product`,category_summary:`Support agents for requirements, UX, and engineering-adjacent writing tasks.`,source_path:`@tandem-agents/categories/08-business-product/business-analyst.toml`,source_file:`business-analyst.toml`,sandbox_mode:`read-only`,target_surfaces:[`desktop`,`control-panel`],instructions:`Own business analysis as requirement clarity and scope-risk control, not requirement theater.
2
2
 
3
3
  Turn ambiguous requests into implementation-ready inputs that engineering can execute without hidden assumptions.
4
4
 
@@ -4467,6 +4467,6 @@ Return:
4467
4467
  - validations performed and remaining environment-level checks
4468
4468
  - residual risk and prioritized next actions
4469
4469
 
4470
- Do not guarantee ranking outcomes or propose manipulative tactics unless explicitly requested by the parent agent.`,tags:[`seo`,`specialist`,`specialized`,`domains`,`read-only`],requires:[],role:`worker`}]},C=`tandem.studio.agentCatalogHandoff`,ie=[`worker`,`reviewer`,`tester`,`watcher`,`delegator`,`committer`,`orchestrator`],ae={worker:`Executes hands-on work and reports concrete progress.`,reviewer:`Critiques output, spots risks, and improves quality.`,tester:`Validates behavior and looks for regressions or gaps.`,watcher:`Monitors activity, incidents, and changes over time.`,delegator:`Breaks work down and routes tasks across participants.`,committer:`Finalizes work and drives it toward completion.`,orchestrator:`Coordinates multi-agent flow and synthesizes updates.`},oe=[`You are the frontend lead. Focus on shipped UI changes, active branches, visual regressions, and blockers from design or review.`,`You are the backend lead. Focus on APIs, database work, deploys, incidents, and blockers from reliability or dependencies.`,`You are the product and ops agent. Focus on launches, customer feedback, analytics, triage, and operational blockers.`],w={templateId:``,displayName:``,avatarUrl:``,role:`worker`,systemPrompt:``,modelProvider:``,modelId:``};function T(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function E(e){let t=e?.default_model||e?.defaultModel||{};return{templateId:String(e?.template_id||e?.templateID||e?.id||``).trim(),displayName:String(e?.display_name||e?.displayName||e?.name||``).trim(),avatarUrl:String(e?.avatar_url||e?.avatarUrl||``).trim(),role:String(e?.role||`worker`).trim()||`worker`,systemPrompt:String(e?.system_prompt||e?.systemPrompt||``).trim(),modelProvider:String(t?.provider_id||t?.providerId||``).trim(),modelId:String(t?.model_id||t?.modelId||``).trim()}}function D(e){let t={templateID:e.templateId.trim(),display_name:e.displayName.trim()||void 0,avatar_url:e.avatarUrl.trim()||void 0,role:e.role,system_prompt:e.systemPrompt.trim()||void 0,skills:[],default_budget:{},capabilities:{}};return e.modelProvider.trim()&&e.modelId.trim()&&(t.default_model={provider_id:e.modelProvider.trim(),model_id:e.modelId.trim()}),t}function O(e){return String(e||``).trim().toLowerCase()}function k(e){return String(e.instructions||``).trim().split(/\n\s*\n/).find(Boolean)?.trim()||e.summary}function A({client:c,toast:f,navigate:te}){let m=i(),h=c?.agentTeams,ne=n(null),[g,_]=r(w),[v,y]=r(null),[b,x]=r(``),[A,j]=r(`all`),[M,N]=r(``),[P,se]=r(``),[F,ce]=r(()=>p()),I=n(null),L=n(null),R=d().data?.agent_teams===!0,z=a({queryKey:[`teams`,`health`],queryFn:()=>c?.health?.().catch(()=>({}))??Promise.resolve({}),refetchInterval:3e4}),B=String(z.data?.workspaceRoot||z.data?.workspace_root||``).trim(),le=String(P||B||``).trim();e(()=>{B&&se(e=>e||B)},[B]);let V=a({queryKey:[`teams`,`templates`],queryFn:()=>h?.listTemplates?.().catch(()=>({templates:[]}))??Promise.resolve({templates:[]}),refetchInterval:8e3}),H=a({queryKey:[`teams`,`instances`],queryFn:()=>h?.listInstances?.().catch(()=>({instances:[]}))??Promise.resolve({instances:[]}),refetchInterval:8e3}),U=a({queryKey:[`teams`,`approvals`],queryFn:()=>h?.listApprovals?.().catch(()=>({spawnApprovals:[]}))??Promise.resolve({spawnApprovals:[]}),refetchInterval:6e3}),W=o({mutationFn:async()=>{if(!g.templateId.trim())throw Error(`Template ID is required.`);return v?h?.updateTemplate?.(v,{display_name:g.displayName.trim()||void 0,avatar_url:g.avatarUrl.trim()||void 0,role:g.role,system_prompt:g.systemPrompt.trim()||void 0,default_model:g.modelProvider.trim()&&g.modelId.trim()?{provider_id:g.modelProvider.trim(),model_id:g.modelId.trim()}:void 0}):h?.createTemplate?.({template:D(g)})},onSuccess:async()=>{f(`ok`,v?`Template updated.`:`Template created.`),_(w),y(null),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),G=o({mutationFn:e=>h?.deleteTemplate?.(e),onSuccess:async()=>{f(`ok`,`Template deleted.`),v&&(y(null),_(w)),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),K=o({mutationFn:({requestId:e,decision:t})=>t===`approve`?h?.approveSpawn?.(e):h?.denySpawn?.(e),onSuccess:async()=>{f(`ok`,`Approval updated.`),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),q=t(()=>T(V.data,`templates`).map(E).filter(e=>e.templateId),[V.data]),J=T(H.data,`instances`),Y=T(U.data,`spawnApprovals`),X=!!(v||g.templateId||g.displayName||g.systemPrompt),Z=g.displayName.trim()||g.templateId.trim()||`New Agent`,ue=Z.slice(0,1).toUpperCase()||`A`,Q=ae[g.role],$=g.avatarUrl.trim(),de=t(()=>{let e=O(b);return S.agents.filter(t=>A!==`all`&&t.category_id!==A?!1:e?[t.name,t.summary,t.category_title,t.category_id,t.source_path,t.source_file,t.sandbox_mode,t.role,...t.tags||[],...t.requires||[]].join(` `).toLowerCase().includes(e):!0)},[A,b]),fe=t(()=>{let e=new Map;for(let t of de){let n=e.get(t.category_id)||[];n.push(t),e.set(t.category_id,n)}return S.categories.map(t=>({...t,agents:e.get(t.id)||[]})).filter(e=>e.agents.length>0)},[de]);e(()=>{let e=ne.current;e&&ee(e)},[q.length,J.length,Y.length,g.role,g.templateId,g.displayName,g.avatarUrl,g.modelProvider,g.modelId,g.systemPrompt,v,W.isPending,G.isPending,K.isPending]);let[pe,me]=r(``),he=async e=>{try{await navigator.clipboard.writeText(e),me(e),N(`Copied: ${e}`),setTimeout(()=>me(t=>t===e?``:t),2e3)}catch(e){N(e instanceof Error?e.message:String(e))}},ge=e=>{try{sessionStorage.setItem(C,JSON.stringify({agentId:e.id,displayName:e.name,categoryId:e.category_id,categoryTitle:e.category_title,summary:e.summary,sourcePath:e.source_path,sandboxMode:e.sandbox_mode,role:e.role,tags:e.tags,requires:e.requires,instructions:e.instructions}));let t=window.location.href.replace(/#.*$/,``);window.open(`${t}#studio`,`_blank`,`noopener`)}catch(e){f(`err`,e instanceof Error?e.message:String(e))}},_e=e=>{let t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``),n={worker:`worker`,reviewer:`reviewer`,delegator:`delegator`,orchestrator:`orchestrator`,watcher:`watcher`,committer:`committer`,tester:`tester`}[e.role]??`worker`;y(null),_({templateId:t,displayName:e.name,avatarUrl:``,role:n,systemPrompt:[e.summary,k(e)===e.summary?``:k(e)].filter(Boolean).join(`
4470
+ Do not guarantee ranking outcomes or propose manipulative tactics unless explicitly requested by the parent agent.`,tags:[`seo`,`specialist`,`specialized`,`domains`,`read-only`],requires:[],role:`worker`}]},S=`tandem.studio.agentCatalogHandoff`,ae=[`worker`,`reviewer`,`tester`,`watcher`,`delegator`,`committer`,`orchestrator`],oe={worker:`Executes hands-on work and reports concrete progress.`,reviewer:`Critiques output, spots risks, and improves quality.`,tester:`Validates behavior and looks for regressions or gaps.`,watcher:`Monitors activity, incidents, and changes over time.`,delegator:`Breaks work down and routes tasks across participants.`,committer:`Finalizes work and drives it toward completion.`,orchestrator:`Coordinates multi-agent flow and synthesizes updates.`},C=[`You are the frontend lead. Focus on shipped UI changes, active branches, visual regressions, and blockers from design or review.`,`You are the backend lead. Focus on APIs, database work, deploys, incidents, and blockers from reliability or dependencies.`,`You are the product and ops agent. Focus on launches, customer feedback, analytics, triage, and operational blockers.`],w={templateId:``,displayName:``,avatarUrl:``,role:`worker`,systemPrompt:``,modelProvider:``,modelId:``};function T(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function E(e){let t=e?.default_model||e?.defaultModel||{};return{templateId:String(e?.template_id||e?.templateID||e?.id||``).trim(),displayName:String(e?.display_name||e?.displayName||e?.name||``).trim(),avatarUrl:String(e?.avatar_url||e?.avatarUrl||``).trim(),role:String(e?.role||`worker`).trim()||`worker`,systemPrompt:String(e?.system_prompt||e?.systemPrompt||``).trim(),modelProvider:String(t?.provider_id||t?.providerId||``).trim(),modelId:String(t?.model_id||t?.modelId||``).trim()}}function D(e){let t={templateID:e.templateId.trim(),display_name:e.displayName.trim()||void 0,avatar_url:e.avatarUrl.trim()||void 0,role:e.role,system_prompt:e.systemPrompt.trim()||void 0,skills:[],default_budget:{},capabilities:{}};return e.modelProvider.trim()&&e.modelId.trim()&&(t.default_model={provider_id:e.modelProvider.trim(),model_id:e.modelId.trim()}),t}function O(e){return String(e||``).trim().toLowerCase()}function k(e){return String(e.instructions||``).trim().split(/\n\s*\n/).find(Boolean)?.trim()||e.summary}function A({client:l,toast:f,navigate:te}){let m=i(),h=l?.agentTeams,ne=n(null),[g,_]=r(w),[v,y]=r(null),[b,re]=r(``),[A,j]=r(`all`),[M,N]=r(``),[P,se]=r(``),[F,ce]=r(()=>p()),I=n(null),L=n(null),R=d().data?.agent_teams===!0,z=a({queryKey:[`teams`,`health`],queryFn:()=>l?.health?.().catch(()=>({}))??Promise.resolve({}),refetchInterval:3e4}),B=String(z.data?.workspaceRoot||z.data?.workspace_root||``).trim(),le=String(P||B||``).trim();e(()=>{B&&se(e=>e||B)},[B]);let V=a({queryKey:[`teams`,`templates`],queryFn:()=>h?.listTemplates?.().catch(()=>({templates:[]}))??Promise.resolve({templates:[]}),refetchInterval:8e3}),H=a({queryKey:[`teams`,`instances`],queryFn:()=>h?.listInstances?.().catch(()=>({instances:[]}))??Promise.resolve({instances:[]}),refetchInterval:8e3}),U=a({queryKey:[`teams`,`approvals`],queryFn:()=>h?.listApprovals?.().catch(()=>({spawnApprovals:[]}))??Promise.resolve({spawnApprovals:[]}),refetchInterval:6e3}),W=o({mutationFn:async()=>{if(!g.templateId.trim())throw Error(`Template ID is required.`);return v?h?.updateTemplate?.(v,{display_name:g.displayName.trim()||void 0,avatar_url:g.avatarUrl.trim()||void 0,role:g.role,system_prompt:g.systemPrompt.trim()||void 0,default_model:g.modelProvider.trim()&&g.modelId.trim()?{provider_id:g.modelProvider.trim(),model_id:g.modelId.trim()}:void 0}):h?.createTemplate?.({template:D(g)})},onSuccess:async()=>{f(`ok`,v?`Template updated.`:`Template created.`),_(w),y(null),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),G=o({mutationFn:e=>h?.deleteTemplate?.(e),onSuccess:async()=>{f(`ok`,`Template deleted.`),v&&(y(null),_(w)),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),K=o({mutationFn:({requestId:e,decision:t})=>t===`approve`?h?.approveSpawn?.(e):h?.denySpawn?.(e),onSuccess:async()=>{f(`ok`,`Approval updated.`),await m.invalidateQueries({queryKey:[`teams`]})},onError:e=>f(`err`,e instanceof Error?e.message:String(e))}),q=t(()=>T(V.data,`templates`).map(E).filter(e=>e.templateId),[V.data]),J=T(H.data,`instances`),Y=T(U.data,`spawnApprovals`),X=!!(v||g.templateId||g.displayName||g.systemPrompt),Z=g.displayName.trim()||g.templateId.trim()||`New Agent`,ue=Z.slice(0,1).toUpperCase()||`A`,Q=oe[g.role],$=g.avatarUrl.trim(),de=t(()=>{let e=O(b);return x.agents.filter(t=>A!==`all`&&t.category_id!==A?!1:e?[t.name,t.summary,t.category_title,t.category_id,t.source_path,t.source_file,t.sandbox_mode,t.role,...t.tags||[],...t.requires||[]].join(` `).toLowerCase().includes(e):!0)},[A,b]),fe=t(()=>{let e=new Map;for(let t of de){let n=e.get(t.category_id)||[];n.push(t),e.set(t.category_id,n)}return x.categories.map(t=>({...t,agents:e.get(t.id)||[]})).filter(e=>e.agents.length>0)},[de]);e(()=>{let e=ne.current;e&&ee(e)},[q.length,J.length,Y.length,g.role,g.templateId,g.displayName,g.avatarUrl,g.modelProvider,g.modelId,g.systemPrompt,v,W.isPending,G.isPending,K.isPending]);let[pe,me]=r(``),he=async e=>{try{await navigator.clipboard.writeText(e),me(e),N(`Copied: ${e}`),setTimeout(()=>me(t=>t===e?``:t),2e3)}catch(e){N(e instanceof Error?e.message:String(e))}},ge=e=>{try{sessionStorage.setItem(S,JSON.stringify({agentId:e.id,displayName:e.name,categoryId:e.category_id,categoryTitle:e.category_title,summary:e.summary,sourcePath:e.source_path,sandboxMode:e.sandbox_mode,role:e.role,tags:e.tags,requires:e.requires,instructions:e.instructions}));let t=window.location.href.replace(/#.*$/,``);window.open(`${t}#studio`,`_blank`,`noopener`)}catch(e){f(`err`,e instanceof Error?e.message:String(e))}},_e=e=>{let t=e.name.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``),n={worker:`worker`,reviewer:`reviewer`,delegator:`delegator`,orchestrator:`orchestrator`,watcher:`watcher`,committer:`committer`,tester:`tester`}[e.role]??`worker`;y(null),_({templateId:t,displayName:e.name,avatarUrl:``,role:n,systemPrompt:[e.summary,k(e)===e.summary?``:k(e)].filter(Boolean).join(`
4471
4471
 
4472
- `).trim(),modelProvider:``,modelId:``}),N(`Imported "${e.name}" into the agent form — review and save below.`),setTimeout(()=>{L.current?.scrollIntoView({behavior:`smooth`,block:`start`})},80)},ve=e=>{if(!e)return;if(e.size>10*1024*1024){f(`err`,`Avatar image is too large (max 10 MB).`);return}let t=new FileReader;t.onload=()=>{let e=typeof t.result==`string`?t.result:``;if(!e){f(`err`,`Failed to read avatar image.`);return}_(t=>({...t,avatarUrl:e}))},t.onerror=()=>f(`err`,`Failed to read avatar image.`),t.readAsDataURL(e)};return s(`div`,{ref:ne,className:`grid gap-4`,children:[R&&s(l,{title:`Agent Standup`,subtitle:`Compose scheduled standups from the same saved agents you manage here`,children:s(re,{client:c,toast:f,workspaceRoot:le,onWorkspaceRootChange:se,defaultWorkspaceRoot:B,timezone:F,onTimezoneChange:ce,templates:q.map(e=>({templateId:e.templateId,displayName:e.displayName||e.templateId,role:e.role,modelLabel:e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:``}))})}),s(l,{title:`Agent Catalog`,subtitle:`Browse and import from the canonical Codex subagent set. Use any entry to pre-fill the agent form below.`,children:s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`grid gap-2 md:grid-cols-[1fr_auto]`,children:[s(`input`,{className:`tcp-input`,placeholder:`Search agent name, category, tag, or path`,value:b,onInput:e=>x(e.target.value)}),s(`button`,{className:`tcp-btn`,onClick:()=>{x(``),j(`all`)},disabled:!b&&A===`all`,children:`Clear`})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${A===`all`?`border-amber-400/60 bg-amber-400/10`:``}`,onClick:()=>j(`all`),children:`All`}),S.categories.map(e=>s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${A===e.id?`border-amber-400/60 bg-amber-400/10`:``}`,onClick:()=>j(e.id),children:[e.title,` (`,e.count,`)`]},e.id))]}),M?s(`div`,{className:`text-xs text-slate-400`,children:M}):null,fe.length?fe.map(e=>s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`flex items-start justify-between gap-2`,children:[s(`div`,{children:[s(`div`,{className:`font-medium text-slate-100`,children:e.title}),s(`div`,{className:`text-xs text-slate-400`,children:e.summary})]}),s(`div`,{className:`tcp-badge-info`,children:[e.agents.length,` agents`]})]}),s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:e.agents.map(e=>s(`div`,{className:`tcp-list-item grid gap-2`,children:[s(`div`,{className:`flex items-start justify-between gap-2`,children:[s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`truncate font-semibold text-slate-100`,children:e.name}),s(`div`,{className:`text-xs text-slate-400`,children:e.summary})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`span`,{className:`tcp-badge-info`,children:e.role}),s(`span`,{className:e.sandbox_mode===`read-only`?`tcp-badge-warn`:`tcp-badge-ok`,children:e.sandbox_mode})]})]}),s(`div`,{className:`font-mono text-xs text-slate-400`,children:e.source_path}),s(`div`,{className:`line-clamp-3 text-xs text-slate-200`,children:k(e)}),s(`div`,{className:`flex flex-wrap gap-1`,children:[e.tags.slice(0,4).map(t=>s(`span`,{className:`tcp-badge-muted`,children:t},`${e.id}-${t}`)),e.requires.slice(0,3).map(t=>s(`span`,{className:`tcp-badge-info`,children:t},`${e.id}-${t}`))]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn h-8 px-3 text-xs`,title:`Pre-fill the agent creation form from this catalog entry`,onClick:()=>_e(e),children:[s(`i`,{"data-lucide":`download`}),`Import as Agent`]}),s(`button`,{className:`tcp-btn h-8 px-3 text-xs`,title:`Open this agent in Studio (new tab)`,onClick:()=>ge(e),children:[s(`i`,{"data-lucide":`external-link`}),`Studio ↗`]}),s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${pe===e.source_path?`border-emerald-400/60 bg-emerald-400/10 text-emerald-300`:``}`,title:`Copy source path to clipboard`,onClick:()=>void he(e.source_path),children:[s(`i`,{"data-lucide":pe===e.source_path?`check`:`copy`}),pe===e.source_path?`Copied`:`Copy path`]})]})]},e.source_path))})]},e.id)):s(u,{text:`No agents match your search.`})]})}),s(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[s(`div`,{ref:L,children:s(l,{title:`Agents`,subtitle:`Create reusable agent personalities, prompts, and default models for automation workflows`,children:s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`rounded-2xl border border-cyan-500/20 bg-cyan-500/5 p-4`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-cyan-300`,children:`Reusable Personalities`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:`Each saved agent defines a persistent personality for automation workflows. Define who the agent is, what kind of work it owns, and which default model it should use. These personalities can be reused in standups and other workflow responses.`})]}),s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:[s(`input`,{className:`tcp-input`,placeholder:`template-id`,value:g.templateId,disabled:!!v,onInput:e=>_(t=>({...t,templateId:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Display name`,value:g.displayName,onInput:e=>_(t=>({...t,displayName:e.target.value}))}),s(`select`,{className:`tcp-input`,value:g.role,onInput:e=>_(t=>({...t,role:e.target.value})),children:ie.map(e=>s(`option`,{value:e,children:e},e))}),s(`input`,{className:`tcp-input`,placeholder:`Avatar URL or upload (optional)`,value:g.avatarUrl,onInput:e=>_(t=>({...t,avatarUrl:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Model provider (optional)`,value:g.modelProvider,onInput:e=>_(t=>({...t,modelProvider:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Model ID (optional)`,value:g.modelId,onInput:e=>_(t=>({...t,modelId:e.target.value}))})]}),s(`div`,{className:`grid gap-3 lg:grid-cols-[1.15fr_0.85fr]`,children:[s(`div`,{className:`rounded-2xl border border-slate-800/80 bg-slate-950/40 px-4 py-3`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Prompt Guidance`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:`Write the lasting perspective for this agent, not a one-off task. Good prompts describe ownership and judgment: frontend lead, backend lead, product ops, incident watcher.`}),s(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:oe.map(e=>s(`button`,{type:`button`,className:`tcp-btn h-auto min-h-8 px-3 py-2 text-left text-xs`,onClick:()=>_(t=>({...t,systemPrompt:e})),children:`Use Example`},e))})]}),s(`div`,{className:`rounded-[28px] border border-slate-800/80 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.18),_transparent_45%),linear-gradient(180deg,rgba(15,23,42,0.9),rgba(2,6,23,0.96))] p-5`,children:[s(`div`,{className:`flex items-start justify-between gap-4`,children:[s(`div`,{className:`flex items-start gap-4`,children:[s(`div`,{className:`flex h-14 w-14 items-center justify-center overflow-hidden rounded-2xl border border-cyan-400/30 bg-cyan-400/10 text-lg font-semibold text-cyan-100`,children:$?s(`img`,{src:$,alt:Z,className:`h-full w-full object-cover`}):ue}),s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`flex flex-wrap items-center gap-2`,children:[s(`strong`,{className:`text-white`,children:Z}),s(`span`,{className:`tcp-badge-info`,children:g.role})]}),s(`div`,{className:`mt-1 text-xs text-slate-400`,children:g.templateId.trim()||`template-id`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:Q})]})]}),s(`div`,{className:`flex items-center gap-2`,children:[s(`button`,{type:`button`,className:`tcp-icon-btn`,title:`Upload avatar`,"aria-label":`Upload avatar`,onClick:()=>I.current?.click(),children:s(`i`,{"data-lucide":`pencil`})}),s(`button`,{type:`button`,className:`tcp-icon-btn`,title:`Clear avatar`,"aria-label":`Clear avatar`,onClick:()=>_(e=>({...e,avatarUrl:``})),children:s(`i`,{"data-lucide":`trash-2`})})]})]}),s(`div`,{className:`mt-3 text-xs text-slate-400`,children:`Upload an image like Settings Identity preview, or paste a direct avatar URL.`}),s(`input`,{ref:I,type:`file`,accept:`image/*`,className:`hidden`,onChange:e=>{ve(e.target.files?.[0]||null),e.target.value=``}}),s(`div`,{className:`mt-4 rounded-2xl border border-slate-800/70 bg-black/20 p-4`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Personality Preview`}),s(`div`,{className:`mt-2 whitespace-pre-wrap text-sm leading-6 text-slate-200`,children:g.systemPrompt.trim()||`This agent will respond from the persistent personality you define here across workflows and standups.`})]}),(g.modelProvider.trim()||g.modelId.trim())&&s(`div`,{className:`mt-3 text-xs text-cyan-200`,children:[`Default model: `,g.modelProvider.trim()||`provider`,`/`,g.modelId.trim()||`model`]})]})]}),s(`textarea`,{className:`tcp-input min-h-[140px]`,placeholder:`Persistent system prompt`,value:g.systemPrompt,onInput:e=>_(t=>({...t,systemPrompt:e.target.value}))}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn`,disabled:W.isPending,onClick:()=>W.mutate(),children:[s(`i`,{"data-lucide":`save`}),v?`Update Agent`:`Create Agent`]}),X&&s(`button`,{type:`button`,className:`tcp-btn`,onClick:()=>{y(null),_(w)},children:[s(`i`,{"data-lucide":`rotate-ccw`}),`Reset`]})]}),s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`flex items-center justify-between gap-2`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Saved Agents`}),s(`div`,{className:`tcp-subtle text-xs`,children:[q.length,` saved`]})]}),q.length?q.map(e=>s(`div`,{className:`tcp-list-item`,children:s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`flex items-center gap-2`,children:[s(`strong`,{children:e.displayName||e.templateId}),s(`span`,{className:`tcp-badge-info`,children:e.role}),e.modelProvider&&e.modelId?s(`span`,{className:`tcp-badge-ok`,children:[e.modelProvider,`/`,e.modelId]}):null]}),s(`div`,{className:`tcp-subtle text-xs`,children:e.templateId}),e.systemPrompt?s(`div`,{className:`mt-2 line-clamp-4 text-xs text-slate-300`,children:e.systemPrompt}):s(`div`,{className:`mt-2 text-xs text-slate-500`,children:`No persistent prompt set yet.`})]}),s(`div`,{className:`flex gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn h-7 px-2 text-xs`,onClick:()=>{y(e.templateId),_({templateId:e.templateId,displayName:e.displayName,avatarUrl:e.avatarUrl,role:ie.includes(e.role)?e.role:`worker`,systemPrompt:e.systemPrompt,modelProvider:e.modelProvider,modelId:e.modelId})},children:[s(`i`,{"data-lucide":`pencil`}),`Edit`]}),s(`button`,{type:`button`,className:`tcp-btn-danger h-7 px-2 text-xs`,onClick:()=>G.mutate(e.templateId),children:[s(`i`,{"data-lucide":`trash-2`}),`Delete`]})]})]})},e.templateId)):s(u,{title:`No agents yet`,text:`Create your first saved personality here, then reuse it across automation workflows and standups.`})]})]})})}),s(l,{title:`Team Instances`,subtitle:`Running collaborative agent instances`,children:s(`div`,{className:`grid gap-2`,children:J.length?J.map((e,t)=>s(`div`,{className:`tcp-list-item`,children:[s(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[s(`strong`,{children:String(e?.template_id||e?.templateID||e?.instance_id||`Instance`)}),s(`span`,{className:`tcp-badge-info`,children:String(e?.status||`active`)})]}),s(`div`,{className:`tcp-subtle text-xs`,children:[`mission: `,String(e?.mission_id||e?.missionID||`n/a`)]})]},String(e?.instance_id||e?.id||t))):s(u,{text:`No team instances found.`})})}),s(l,{title:`Spawn Approvals`,subtitle:`Pending team approval requests`,children:s(`div`,{className:`grid gap-2`,children:Y.length?Y.map((e,t)=>{let n=String(e?.approval_id||e?.request_id||e?.id||`request-${t}`);return s(`div`,{className:`tcp-list-item`,children:[s(`div`,{className:`mb-1 font-medium`,children:String(e?.reason||e?.title||n)}),s(`div`,{className:`tcp-subtle text-xs`,children:n}),s(`div`,{className:`mt-2 flex gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn h-7 px-2 text-xs`,onClick:()=>K.mutate({requestId:n,decision:`approve`}),children:[s(`i`,{"data-lucide":`badge-check`}),`Approve`]}),s(`button`,{type:`button`,className:`tcp-btn-danger h-7 px-2 text-xs`,onClick:()=>K.mutate({requestId:n,decision:`deny`}),children:[s(`i`,{"data-lucide":`x`}),`Deny`]})]})]},n)}):s(u,{text:`No pending approvals.`})})})]})]})}export{A as TeamsPage};
4472
+ `).trim(),modelProvider:``,modelId:``}),N(`Imported "${e.name}" into the agent form — review and save below.`),setTimeout(()=>{L.current?.scrollIntoView({behavior:`smooth`,block:`start`})},80)},ve=e=>{if(!e)return;if(e.size>10*1024*1024){f(`err`,`Avatar image is too large (max 10 MB).`);return}let t=new FileReader;t.onload=()=>{let e=typeof t.result==`string`?t.result:``;if(!e){f(`err`,`Failed to read avatar image.`);return}_(t=>({...t,avatarUrl:e}))},t.onerror=()=>f(`err`,`Failed to read avatar image.`),t.readAsDataURL(e)};return s(`div`,{ref:ne,className:`grid gap-4`,children:[R&&s(c,{title:`Agent Standup`,subtitle:`Compose scheduled standups from the same saved agents you manage here`,children:s(ie,{client:l,toast:f,workspaceRoot:le,onWorkspaceRootChange:se,defaultWorkspaceRoot:B,timezone:F,onTimezoneChange:ce,templates:q.map(e=>({templateId:e.templateId,displayName:e.displayName||e.templateId,role:e.role,modelLabel:e.modelProvider&&e.modelId?`${e.modelProvider}/${e.modelId}`:``}))})}),s(c,{title:`Agent Catalog`,subtitle:`Browse and import from the canonical Codex subagent set. Use any entry to pre-fill the agent form below.`,children:s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`grid gap-2 md:grid-cols-[1fr_auto]`,children:[s(`input`,{className:`tcp-input`,placeholder:`Search agent name, category, tag, or path`,value:b,onInput:e=>re(e.target.value)}),s(`button`,{className:`tcp-btn`,onClick:()=>{re(``),j(`all`)},disabled:!b&&A===`all`,children:`Clear`})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${A===`all`?`border-amber-400/60 bg-amber-400/10`:``}`,onClick:()=>j(`all`),children:`All`}),x.categories.map(e=>s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${A===e.id?`border-amber-400/60 bg-amber-400/10`:``}`,onClick:()=>j(e.id),children:[e.title,` (`,e.count,`)`]},e.id))]}),M?s(`div`,{className:`text-xs text-slate-400`,children:M}):null,fe.length?fe.map(e=>s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`flex items-start justify-between gap-2`,children:[s(`div`,{children:[s(`div`,{className:`font-medium text-slate-100`,children:e.title}),s(`div`,{className:`text-xs text-slate-400`,children:e.summary})]}),s(`div`,{className:`tcp-badge-info`,children:[e.agents.length,` agents`]})]}),s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:e.agents.map(e=>s(`div`,{className:`tcp-list-item grid gap-2`,children:[s(`div`,{className:`flex items-start justify-between gap-2`,children:[s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`truncate font-semibold text-slate-100`,children:e.name}),s(`div`,{className:`text-xs text-slate-400`,children:e.summary})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`span`,{className:`tcp-badge-info`,children:e.role}),s(`span`,{className:e.sandbox_mode===`read-only`?`tcp-badge-warn`:`tcp-badge-ok`,children:e.sandbox_mode})]})]}),s(`div`,{className:`font-mono text-xs text-slate-400`,children:e.source_path}),s(`div`,{className:`line-clamp-3 text-xs text-slate-200`,children:k(e)}),s(`div`,{className:`flex flex-wrap gap-1`,children:[e.tags.slice(0,4).map(t=>s(`span`,{className:`tcp-badge-muted`,children:t},`${e.id}-${t}`)),e.requires.slice(0,3).map(t=>s(`span`,{className:`tcp-badge-info`,children:t},`${e.id}-${t}`))]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{className:`tcp-btn h-8 px-3 text-xs`,title:`Pre-fill the agent creation form from this catalog entry`,onClick:()=>_e(e),children:[s(`i`,{"data-lucide":`download`}),`Import as Agent`]}),s(`button`,{className:`tcp-btn h-8 px-3 text-xs`,title:`Open this agent in Studio (new tab)`,onClick:()=>ge(e),children:[s(`i`,{"data-lucide":`external-link`}),`Studio ↗`]}),s(`button`,{className:`tcp-btn h-8 px-3 text-xs ${pe===e.source_path?`border-emerald-400/60 bg-emerald-400/10 text-emerald-300`:``}`,title:`Copy source path to clipboard`,onClick:()=>void he(e.source_path),children:[s(`i`,{"data-lucide":pe===e.source_path?`check`:`copy`}),pe===e.source_path?`Copied`:`Copy path`]})]})]},e.source_path))})]},e.id)):s(u,{text:`No agents match your search.`})]})}),s(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[s(`div`,{ref:L,children:s(c,{title:`Agents`,subtitle:`Create reusable agent personalities, prompts, and default models for automation workflows`,children:s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`rounded-2xl border border-cyan-500/20 bg-cyan-500/5 p-4`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-cyan-300`,children:`Reusable Personalities`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:`Each saved agent defines a persistent personality for automation workflows. Define who the agent is, what kind of work it owns, and which default model it should use. These personalities can be reused in standups and other workflow responses.`})]}),s(`div`,{className:`grid gap-2 md:grid-cols-2`,children:[s(`input`,{className:`tcp-input`,placeholder:`template-id`,value:g.templateId,disabled:!!v,onInput:e=>_(t=>({...t,templateId:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Display name`,value:g.displayName,onInput:e=>_(t=>({...t,displayName:e.target.value}))}),s(`select`,{className:`tcp-input`,value:g.role,onInput:e=>_(t=>({...t,role:e.target.value})),children:ae.map(e=>s(`option`,{value:e,children:e},e))}),s(`input`,{className:`tcp-input`,placeholder:`Avatar URL or upload (optional)`,value:g.avatarUrl,onInput:e=>_(t=>({...t,avatarUrl:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Model provider (optional)`,value:g.modelProvider,onInput:e=>_(t=>({...t,modelProvider:e.target.value}))}),s(`input`,{className:`tcp-input`,placeholder:`Model ID (optional)`,value:g.modelId,onInput:e=>_(t=>({...t,modelId:e.target.value}))})]}),s(`div`,{className:`grid gap-3 lg:grid-cols-[1.15fr_0.85fr]`,children:[s(`div`,{className:`rounded-2xl border border-slate-800/80 bg-slate-950/40 px-4 py-3`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Prompt Guidance`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:`Write the lasting perspective for this agent, not a one-off task. Good prompts describe ownership and judgment: frontend lead, backend lead, product ops, incident watcher.`}),s(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:C.map(e=>s(`button`,{type:`button`,className:`tcp-btn h-auto min-h-8 px-3 py-2 text-left text-xs`,onClick:()=>_(t=>({...t,systemPrompt:e})),children:`Use Example`},e))})]}),s(`div`,{className:`rounded-[28px] border border-slate-800/80 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.18),_transparent_45%),linear-gradient(180deg,rgba(15,23,42,0.9),rgba(2,6,23,0.96))] p-5`,children:[s(`div`,{className:`flex items-start justify-between gap-4`,children:[s(`div`,{className:`flex items-start gap-4`,children:[s(`div`,{className:`flex h-14 w-14 items-center justify-center overflow-hidden rounded-2xl border border-cyan-400/30 bg-cyan-400/10 text-lg font-semibold text-cyan-100`,children:$?s(`img`,{src:$,alt:Z,className:`h-full w-full object-cover`}):ue}),s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`flex flex-wrap items-center gap-2`,children:[s(`strong`,{className:`text-white`,children:Z}),s(`span`,{className:`tcp-badge-info`,children:g.role})]}),s(`div`,{className:`mt-1 text-xs text-slate-400`,children:g.templateId.trim()||`template-id`}),s(`div`,{className:`mt-2 text-sm text-slate-300`,children:Q})]})]}),s(`div`,{className:`flex items-center gap-2`,children:[s(`button`,{type:`button`,className:`tcp-icon-btn`,title:`Upload avatar`,"aria-label":`Upload avatar`,onClick:()=>I.current?.click(),children:s(`i`,{"data-lucide":`pencil`})}),s(`button`,{type:`button`,className:`tcp-icon-btn`,title:`Clear avatar`,"aria-label":`Clear avatar`,onClick:()=>_(e=>({...e,avatarUrl:``})),children:s(`i`,{"data-lucide":`trash-2`})})]})]}),s(`div`,{className:`mt-3 text-xs text-slate-400`,children:`Upload an image like Settings Identity preview, or paste a direct avatar URL.`}),s(`input`,{ref:I,type:`file`,accept:`image/*`,className:`hidden`,onChange:e=>{ve(e.target.files?.[0]||null),e.target.value=``}}),s(`div`,{className:`mt-4 rounded-2xl border border-slate-800/70 bg-black/20 p-4`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Personality Preview`}),s(`div`,{className:`mt-2 whitespace-pre-wrap text-sm leading-6 text-slate-200`,children:g.systemPrompt.trim()||`This agent will respond from the persistent personality you define here across workflows and standups.`})]}),(g.modelProvider.trim()||g.modelId.trim())&&s(`div`,{className:`mt-3 text-xs text-cyan-200`,children:[`Default model: `,g.modelProvider.trim()||`provider`,`/`,g.modelId.trim()||`model`]})]})]}),s(`textarea`,{className:`tcp-input min-h-[140px]`,placeholder:`Persistent system prompt`,value:g.systemPrompt,onInput:e=>_(t=>({...t,systemPrompt:e.target.value}))}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn`,disabled:W.isPending,onClick:()=>W.mutate(),children:[s(`i`,{"data-lucide":`save`}),v?`Update Agent`:`Create Agent`]}),X&&s(`button`,{type:`button`,className:`tcp-btn`,onClick:()=>{y(null),_(w)},children:[s(`i`,{"data-lucide":`rotate-ccw`}),`Reset`]})]}),s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`flex items-center justify-between gap-2`,children:[s(`div`,{className:`text-xs font-medium uppercase tracking-[0.24em] text-slate-500`,children:`Saved Agents`}),s(`div`,{className:`tcp-subtle text-xs`,children:[q.length,` saved`]})]}),q.length?q.map(e=>s(`div`,{className:`tcp-list-item`,children:s(`div`,{className:`flex items-start justify-between gap-3`,children:[s(`div`,{className:`min-w-0`,children:[s(`div`,{className:`flex items-center gap-2`,children:[s(`strong`,{children:e.displayName||e.templateId}),s(`span`,{className:`tcp-badge-info`,children:e.role}),e.modelProvider&&e.modelId?s(`span`,{className:`tcp-badge-ok`,children:[e.modelProvider,`/`,e.modelId]}):null]}),s(`div`,{className:`tcp-subtle text-xs`,children:e.templateId}),e.systemPrompt?s(`div`,{className:`mt-2 line-clamp-4 text-xs text-slate-300`,children:e.systemPrompt}):s(`div`,{className:`mt-2 text-xs text-slate-500`,children:`No persistent prompt set yet.`})]}),s(`div`,{className:`flex gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn h-7 px-2 text-xs`,onClick:()=>{y(e.templateId),_({templateId:e.templateId,displayName:e.displayName,avatarUrl:e.avatarUrl,role:ae.includes(e.role)?e.role:`worker`,systemPrompt:e.systemPrompt,modelProvider:e.modelProvider,modelId:e.modelId})},children:[s(`i`,{"data-lucide":`pencil`}),`Edit`]}),s(`button`,{type:`button`,className:`tcp-btn-danger h-7 px-2 text-xs`,onClick:()=>G.mutate(e.templateId),children:[s(`i`,{"data-lucide":`trash-2`}),`Delete`]})]})]})},e.templateId)):s(u,{title:`No agents yet`,text:`Create your first saved personality here, then reuse it across automation workflows and standups.`})]})]})})}),s(c,{title:`Team Instances`,subtitle:`Running collaborative agent instances`,children:s(`div`,{className:`grid gap-2`,children:J.length?J.map((e,t)=>s(`div`,{className:`tcp-list-item`,children:[s(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[s(`strong`,{children:String(e?.template_id||e?.templateID||e?.instance_id||`Instance`)}),s(`span`,{className:`tcp-badge-info`,children:String(e?.status||`active`)})]}),s(`div`,{className:`tcp-subtle text-xs`,children:[`mission: `,String(e?.mission_id||e?.missionID||`n/a`)]})]},String(e?.instance_id||e?.id||t))):s(u,{text:`No team instances found.`})})}),s(c,{title:`Spawn Approvals`,subtitle:`Pending team approval requests`,children:s(`div`,{className:`grid gap-2`,children:Y.length?Y.map((e,t)=>{let n=String(e?.approval_id||e?.request_id||e?.id||`request-${t}`);return s(`div`,{className:`tcp-list-item`,children:[s(`div`,{className:`mb-1 font-medium`,children:String(e?.reason||e?.title||n)}),s(`div`,{className:`tcp-subtle text-xs`,children:n}),s(`div`,{className:`mt-2 flex gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn h-7 px-2 text-xs`,onClick:()=>K.mutate({requestId:n,decision:`approve`}),children:[s(`i`,{"data-lucide":`badge-check`}),`Approve`]}),s(`button`,{type:`button`,className:`tcp-btn-danger h-7 px-2 text-xs`,onClick:()=>K.mutate({requestId:n,decision:`deny`}),children:[s(`i`,{"data-lucide":`x`}),`Deny`]})]})]},n)}):s(u,{text:`No pending approvals.`})})})]})]})}export{A as TeamsPage};
@@ -1,4 +1,4 @@
1
- import{C as e,E as t,g as n,v as r}from"./fullcalendar-Bn75j0xM.js";import{a as i,n as a,t as o}from"./react-query-BIbNygEJ.js";import{t as s}from"./vendor-DSaYtO9f.js";import{i as c,n as l,r as u}from"./motion-B3ZE8SGR.js";import{a as d,c as f,n as p,s as m}from"./index-picB46b5.js";import{g as h}from"./workflowStability-Dsk2DR6F.js";import{r as g,t as _}from"./McpToolAllowlistEditor-B3qCkiFT.js";import{r as v}from"./plannerShared-1kHFyAp-.js";var y=Object.assign({"./templates/competitor-research-pipeline.yaml":`id: competitor-research-pipeline
1
+ import{C as e,E as t,g as n,v as r}from"./fullcalendar-Bn75j0xM.js";import{a as i,n as a,t as o}from"./react-query-BIbNygEJ.js";import{t as s}from"./vendor-DSaYtO9f.js";import{i as c,n as l,r as u}from"./motion-B3ZE8SGR.js";import{a as d,c as f,n as p,s as m}from"./index-TvymvGva.js";import{g as h}from"./workflowStability-C8USyGOY.js";import{r as g,t as _}from"./McpToolAllowlistEditor-BzQ64HrZ.js";import{r as v}from"./plannerShared-Dx7-Sxpc.js";var y=Object.assign({"./templates/competitor-research-pipeline.yaml":`id: competitor-research-pipeline
2
2
  order: 2
3
3
  name: Competitor Research Pipeline
4
4
  icon: radar
@@ -0,0 +1,2 @@
1
+ import{C as e,E as t,g as n,v as r,x as i}from"./fullcalendar-Bn75j0xM.js";import{a as ee,n as a,t as o}from"./react-query-BIbNygEJ.js";import{i as s}from"./motion-B3ZE8SGR.js";import{S as te,b as ne,h as c,m as re,s as l,x as u}from"./index-TvymvGva.js";import{n as d}from"./LazyJson-vfWw7G9F.js";var f=`tandem.workflow.importHandoff.v1`;function p(e){return String(e||``).trim()}function m(e,t){return Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[]}function h(e){let t=p(e);if(!t)throw Error(`Paste a workflow bundle JSON object first.`);let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))throw Error(`Workflow bundle must be a JSON object.`);return n}function g(e,t=``){let n=p(e?.absPath||e?.abs_path||e?.url);if(n)return n;let r=p(e?.root),i=p(e?.path);return r&&i?`${r.replace(/\/+$/,``)}/${i.replace(/^\/+/,``)}`:p(i||t)}function _(e,t){return new Promise((n,r)=>{let i=new XMLHttpRequest;i.open(`POST`,`/api/files/upload?dir=${encodeURIComponent(t)}`),i.withCredentials=!0,i.responseType=`json`,i.setRequestHeader(`x-file-name`,encodeURIComponent(e.name)),i.onerror=()=>r(Error(`Upload failed: ${e.name}`)),i.onload=()=>{let e=i.response||{};if(i.status<200||i.status>=300||e?.ok===!1){r(Error(String(e?.error||`Upload failed (${i.status})`)));return}n(e)},i.send(e)})}function ie(e){let t=p(e);return t?t.startsWith(`/api/engine/`)?t:t.startsWith(`/`)?`/api/engine${t}`:t:``}function v({client:v,toast:y,navigate:b,identity:ae}){let x=ee(),[S,oe]=r(``),[C,se]=r(ae.botName||`workflow_planner`),[w,ce]=r(`workflow-imports`),[T,le]=r(``),[E,D]=r(``),[O,k]=r(null),[A,j]=r(``),[M,ue]=r(``),[de,fe]=r(``),[N,P]=r(null),[F,I]=r(``),[L,R]=r(``),[z,B]=r(``),[V,H]=r(``),[U,pe]=r(`0.1.0`),[W,G]=r(``),[K,q]=r(null),J=a({queryKey:[`workflow-center`,`sessions`],queryFn:()=>v.workflowPlannerSessions.list().catch(()=>({sessions:[]})),refetchInterval:15e3}),Y=n(()=>m(J.data,`sessions`).sort((e,t)=>Number(t?.updated_at_ms||0)-Number(e?.updated_at_ms||0)),[J.data]),X=a({queryKey:[`workflow-center`,`session`,E],enabled:!!E,queryFn:()=>v.workflowPlannerSessions.get(E).catch(()=>({session:null}))}).data?.session||null;e(()=>{if(!X){B(``),H(``),G(``),I(``),R(``),q(null);return}B(p(X.title)),H(p(X.title).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``)),G(p(X.goal)),I(``),R(``),q(null)},[X?.session_id]);let me=i(async e=>{if(e){j(``);try{ue(g(await _(e,`uploads/workflow-pack-imports`),e.name)),fe(e.name),P(null),y(`ok`,`Workflow pack uploaded. Preview it before installing.`)}catch(e){let t=e instanceof Error?e.message:String(e);j(t),y(`err`,t)}}},[y]),he=i(async e=>{if(e)try{I(g(await _(e,`uploads/workflow-pack-covers`),e.name)),R(URL.createObjectURL(e)),y(`ok`,`Cover image added to export.`)}catch(e){y(`err`,e instanceof Error?e.message:String(e))}},[y]),Z=o({mutationFn:async()=>(j(``),v.workflowPlans.importPackPreview({path:M,creatorId:C,creator_id:C,projectSlug:w,project_slug:w,title:p(T)||void 0})),onSuccess:e=>{P(e),y(`ok`,`Workflow pack preview generated.`)},onError:e=>{let t=e instanceof Error?e.message:String(e);j(t),y(`err`,t)}}),Q=o({mutationFn:async()=>(j(``),v.workflowPlans.importPack({path:M,creatorId:C,creator_id:C,projectSlug:w,project_slug:w,title:p(T)||void 0})),onSuccess:async e=>{let t=e?.sessions?.[0]||e?.session;if(t?.session_id){try{localStorage.setItem(f,JSON.stringify({session_id:t.session_id,title:t.title,project_slug:t.project_slug,source_kind:t.source_kind||`workflow_pack`,source_bundle_digest:t.source_bundle_digest||null,current_plan_id:t.current_plan_id||null}))}catch{}D(t.session_id)}P(e),await Promise.all([x.invalidateQueries({queryKey:[`workflow-center`]}),x.invalidateQueries({queryKey:[`intent-planner`]})]),y(`ok`,`Workflow pack installed.`),b(`planner`)},onError:e=>{let t=e instanceof Error?e.message:String(e);j(t),y(`err`,t)}}),$=o({mutationFn:async()=>{if(!E)throw Error(`Select a workflow session to export.`);return v.workflowPlans.exportPack({sessionId:E,session_id:E,name:p(V)||void 0,title:p(z||X?.title)||void 0,version:p(U)||void 0,description:p(W)||void 0,creatorId:C,creator_id:C,coverImagePath:p(F)||void 0,cover_image_path:p(F)||void 0})},onSuccess:e=>{q(e),y(`ok`,`Workflow pack exported.`)},onError:e=>y(`err`,e instanceof Error?e.message:String(e))}),ge=o({mutationFn:async()=>{j(``);let e=h(S);return v.workflowPlans.importPreview({bundle:e,creatorId:C,creator_id:C,projectSlug:w,project_slug:w,title:p(T)||void 0})},onSuccess:e=>{k(e),y(`ok`,`Import preview generated.`)},onError:e=>{let t=e instanceof Error?e.message:String(e);j(t),y(`err`,t)}}),_e=o({mutationFn:async()=>{j(``);let e=h(S);return v.workflowPlans.importPlan({bundle:e,creatorId:C,creator_id:C,projectSlug:w,project_slug:w,title:p(T)||void 0})},onSuccess:async e=>{let t=e?.session;if(t?.session_id){try{localStorage.setItem(f,JSON.stringify({session_id:t.session_id,title:t.title,project_slug:t.project_slug,source_kind:t.source_kind||`imported_bundle`,source_bundle_digest:t.source_bundle_digest||null,current_plan_id:t.current_plan_id||null}))}catch{}D(t.session_id)}k(e),await Promise.all([x.invalidateQueries({queryKey:[`workflow-center`]}),x.invalidateQueries({queryKey:[`intent-planner`]})]),y(`ok`,`Workflow imported and saved.`),b(`planner`)},onError:e=>{let t=e instanceof Error?e.message:String(e);j(t),y(`err`,t)}}),ve=async e=>{try{await navigator.clipboard.writeText(e),y(`ok`,`Session id copied.`)}catch{y(`warn`,`Could not copy session id.`)}},ye=()=>{if(E){try{let e=X;e&&localStorage.setItem(f,JSON.stringify({session_id:e.session_id,title:e.title,project_slug:e.project_slug,source_kind:e.source_kind||`planner`,source_bundle_digest:e.source_bundle_digest||null,current_plan_id:e.current_plan_id||null}))}catch{}b(`planner`)}},be=e=>p(e?.source_kind||`planner`);return s(re,{className:`grid gap-4`,children:[s(ne,{eyebrow:`Workflow center`,title:`Workflow packs, sessions, and provenance`,subtitle:`Import marketplace-ready workflow packs, export your planner sessions, and keep JSON bundles available for advanced debugging.`,badges:s(t,{children:[s(c,{tone:`info`,children:[Y.length,` sessions`]}),s(c,{tone:`warn`,children:[Y.filter(e=>[`imported_bundle`,`workflow_pack`].includes(e?.source_kind)).length,` `,`imports`]})]})}),s(u,{title:`Import workflow pack`,subtitle:`Upload a .zip pack, preview its manifest and workflow contents, then install it into your local workflow library.`,children:s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`grid gap-3 md:grid-cols-3`,children:[s(`label`,{className:`grid gap-2 text-sm md:col-span-3`,children:[s(`span`,{className:`tcp-subtle`,children:`Workflow pack ZIP`}),s(`input`,{className:`tcp-input`,type:`file`,accept:`.zip,application/zip`,onChange:e=>me(e.currentTarget.files?.[0]||null)}),M?s(`span`,{className:`text-xs text-white/70`,children:[de||`Uploaded pack`,` · `,M]}):null]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Creator id`}),s(`input`,{className:`tcp-input`,value:C,onChange:e=>se(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Project slug`}),s(`input`,{className:`tcp-input`,value:w,onChange:e=>ce(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Session title`}),s(`input`,{className:`tcp-input`,value:T,onChange:e=>le(e.target.value),placeholder:`Optional`})]})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn-secondary`,disabled:!M||Z.isPending,onClick:()=>Z.mutate(),children:`Preview pack`}),s(`button`,{type:`button`,className:`tcp-btn-primary`,disabled:!M||Q.isPending,onClick:()=>Q.mutate(),children:`Install and open planner`})]}),A?s(`div`,{className:`text-sm text-red-300`,children:A}):null,N?s(`div`,{className:`grid gap-3 rounded-2xl border border-white/10 bg-black/20 p-4`,children:[s(`div`,{className:`flex flex-wrap items-start gap-4`,children:[N?.cover_image_data_url?s(`img`,{alt:``,className:`h-24 w-40 border border-white/10 object-cover`,src:N.cover_image_data_url}):null,s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`flex flex-wrap items-center gap-2`,children:[s(c,{tone:N?.persisted?`ok`:`info`,children:N?.persisted?`installed`:`preview only`}),s(c,{tone:`ghost`,children:p(N?.pack?.name||`workflow pack`)}),s(c,{tone:`ghost`,children:p(N?.pack?.version||`version`)}),s(c,{tone:`info`,children:[m(N?.workflows,`workflows`).length,` workflows`]})]}),s(`div`,{className:`text-sm text-white/75`,children:p(N?.manifest?.marketplace?.listing?.display_name||N?.manifest?.name)}),s(`div`,{className:`flex flex-wrap gap-2 text-xs`,children:m(N?.manifest?.capabilities?.required,`required`).map(e=>s(`span`,{className:`rounded border border-white/10 px-2 py-1 text-white/70`,children:String(e)},String(e)))})]})]}),s(d,{value:N?.workflows?.[0]?.plan_package_validation||N?.workflows?.[0]?.import_validation||N,label:`Show validation details`,preClassName:`max-h-64 overflow-auto rounded-xl bg-black/30 p-3 text-xs text-white/80`})]}):null,s(`details`,{className:`rounded-2xl border border-white/10 bg-black/10 p-3`,children:[s(`summary`,{className:`cursor-pointer text-sm font-semibold text-white`,children:`Advanced JSON bundle import`}),s(`div`,{className:`mt-3 grid gap-3`,children:[s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Bundle JSON`}),s(`textarea`,{className:`min-h-40 w-full rounded-xl border border-white/10 bg-black/20 p-3 font-mono text-xs text-white outline-none`,placeholder:`{"plan_id":"...","mission":{...},"routine_graph":[...]}`,value:S,onChange:e=>oe(e.target.value)})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn-secondary`,onClick:()=>ge.mutate(),children:`Preview JSON`}),s(`button`,{type:`button`,className:`tcp-btn-secondary`,onClick:()=>_e.mutate(),children:`Import JSON`})]}),O?s(d,{value:O?.plan_package_validation||O?.import_validation||O,label:`Show JSON import validation`,preClassName:`max-h-64 overflow-auto rounded-xl bg-black/30 p-3 text-xs text-white/80`}):null]})]})]})}),s(u,{title:`Export workflow pack`,subtitle:X?`Turn this planner session into a marketplace-ready .zip pack with an optional cover image.`:`Select a planner session below before exporting a workflow pack.`,children:[s(`div`,{className:`grid gap-3 md:grid-cols-4`,children:[s(`label`,{className:`grid gap-2 text-sm md:col-span-2`,children:[s(`span`,{className:`tcp-subtle`,children:`Pack title`}),s(`input`,{className:`tcp-input`,disabled:!X,placeholder:`Select a workflow session`,value:z,onChange:e=>B(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Pack slug`}),s(`input`,{className:`tcp-input`,disabled:!X,placeholder:`workflow-pack-slug`,value:V,onChange:e=>H(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Version`}),s(`input`,{className:`tcp-input`,disabled:!X,value:U,onChange:e=>pe(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm md:col-span-3`,children:[s(`span`,{className:`tcp-subtle`,children:`Description`}),s(`input`,{className:`tcp-input`,disabled:!X,placeholder:`Short marketplace description`,value:W,onChange:e=>G(e.target.value)})]}),s(`label`,{className:`grid gap-2 text-sm`,children:[s(`span`,{className:`tcp-subtle`,children:`Cover image`}),s(`input`,{className:`tcp-input`,type:`file`,disabled:!X,accept:`image/png,image/jpeg,image/webp`,onChange:e=>he(e.currentTarget.files?.[0]||null)})]})]}),s(`div`,{className:`mt-3 flex flex-wrap items-center gap-3`,children:[L?s(`img`,{alt:``,className:`h-20 w-32 border border-white/10 object-cover`,src:L}):null,s(`button`,{type:`button`,className:`tcp-btn-primary`,disabled:!X||$.isPending,onClick:()=>$.mutate(),children:`Export workflow pack`})]}),K?s(`div`,{className:`mt-3 grid gap-2 rounded-2xl border border-emerald-400/30 bg-emerald-950/20 p-3 text-sm`,children:[s(`div`,{className:`font-semibold`,children:`Marketplace-ready workflow pack`}),s(`div`,{className:`break-all text-white/75`,children:p(K?.exported?.path)}),s(`div`,{className:`text-xs text-white/60`,children:[`SHA-256 `,p(K?.exported?.sha256)]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[K?.exported?.download_url?s(`a`,{className:`tcp-btn-primary`,href:ie(K.exported.download_url),children:`Download ZIP`}):null,s(c,{tone:`ok`,children:`tandempack.yaml`}),s(c,{tone:`ok`,children:`workflow plan bundle`}),K?.pack?.cover_image?s(c,{tone:`ok`,children:`cover image`}):s(c,{tone:`ghost`,children:`no cover image`}),s(c,{tone:`info`,children:`Upload as Workflow in marketplace`})]}),s(d,{value:K?.manifest||K,label:`Show manifest`,preClassName:`max-h-64 overflow-auto rounded-xl bg-black/30 p-3 text-xs text-white/80`})]}):null]}),s(te,{main:s(u,{title:`Planner sessions`,subtitle:`Imported bundles, local drafts, and applied workflow sessions all show up here.`,children:s(`div`,{className:`grid gap-2`,children:Y.length?Y.map(e=>{let t=e.session_id===E,n=be(e);return s(`button`,{type:`button`,className:`tcp-list-item text-left ${t?`border-amber-400/70`:``}`,onClick:()=>D(e.session_id),children:[s(`div`,{className:`mb-1 flex items-center justify-between gap-2`,children:[s(`strong`,{children:p(e.title||e.session_id)}),s(c,{tone:n===`imported_bundle`?`warn`:`info`,children:n})]}),s(`div`,{className:`flex flex-wrap gap-2 text-xs`,children:[s(`span`,{className:`tcp-subtle`,children:p(e.project_slug)}),s(`span`,{className:`tcp-subtle`,children:p(e.source_bundle_digest||``)}),s(`span`,{className:`tcp-subtle`,children:new Date(Number(e.updated_at_ms||e.created_at_ms||0)).toLocaleString()})]})]},e.session_id)}):s(l,{text:`No workflow sessions have been saved yet.`})})}),aside:s(u,{title:`Selected session`,subtitle:`This is the durable stored record, including provenance and draft linkage when available.`,children:X?s(`div`,{className:`grid gap-3`,children:[s(`div`,{className:`flex flex-wrap items-center gap-2`,children:[s(c,{tone:X.source_kind===`imported_bundle`?`warn`:`info`,children:p(X.source_kind||`planner`)}),s(c,{tone:`ghost`,children:p(X.session_id)})]}),s(`div`,{className:`grid gap-2 text-sm`,children:[s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Title`}),s(`div`,{children:p(X.title)})]}),s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Project`}),s(`div`,{children:p(X.project_slug)})]}),s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Bundle digest`}),s(`div`,{children:p(X.source_bundle_digest||`—`)})]}),s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Current plan id`}),s(`div`,{children:p(X.current_plan_id||`—`)})]}),s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Goal`}),s(`div`,{className:`whitespace-pre-wrap`,children:p(X.goal||`—`)})]}),s(`div`,{children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Import validation`}),s(d,{value:X.import_validation||{},label:`Show import validation`,preClassName:`max-h-40 overflow-auto rounded-xl bg-black/20 p-3 text-xs text-white/75`})]})]}),s(`div`,{className:`flex flex-wrap gap-2`,children:[s(`button`,{type:`button`,className:`tcp-btn-primary`,onClick:ye,children:`Open in planner`}),s(`button`,{type:`button`,className:`tcp-btn-secondary`,onClick:()=>ve(X.session_id),children:`Copy session id`})]}),X.import_transform_log?.length?s(`div`,{className:`grid gap-2`,children:[s(`div`,{className:`tcp-subtle text-xs`,children:`Import transform log`}),s(`pre`,{className:`max-h-40 overflow-auto rounded-xl bg-black/20 p-3 text-xs text-white/75`,children:X.import_transform_log.join(`
2
+ `)})]}):null]}):s(l,{text:`Select a session to inspect its provenance.`})})})]})}export{v as WorkflowsPage};