@jiggai/kitchen 0.3.9 → 0.3.11
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/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +4 -4
- package/.next/server/app/channels.segments/_full.segment.rsc +4 -4
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +4 -4
- package/.next/server/app/goals/new.segments/_full.segment.rsc +4 -4
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +4 -4
- package/.next/server/app/goals.segments/_full.segment.rsc +4 -4
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals.segment.rsc +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/recipes/[id]/page.js +3 -3
- package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page.js +2 -2
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page.js +3 -3
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +4 -4
- package/.next/server/app/settings.segments/_full.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/page.js +3 -3
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js +2 -2
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +3 -3
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page.js +3 -3
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__ff69832c._.js.map +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__24c20736._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__24c20736._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__30619465._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__30619465._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c66998a._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c66998a._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7fcc6175._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7fcc6175._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8e001110._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8e001110._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bd20cf10._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bd20cf10._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cefae8c8._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cefae8c8._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_10fb6ad9._.js → _7f9e89d2._.js} +2 -2
- package/.next/server/chunks/ssr/_7f9e89d2._.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +3 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -0
- package/.next/server/chunks/ssr/src_lib_errors_ts_f440efeb._.js +3 -0
- package/.next/server/chunks/ssr/src_lib_errors_ts_f440efeb._.js.map +1 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/3e0d3a43014c0ad2.css +3 -0
- package/.next/static/chunks/43d0024279c6160e.js +1 -0
- package/.next/static/chunks/4f5e02a609758a0b.js +1 -0
- package/.next/static/chunks/5e3b1d0f61a651bf.js +1 -0
- package/.next/static/chunks/5f77499ca309ab9d.js +10 -0
- package/.next/static/chunks/be12a66bd736fad8.js +1 -0
- package/.next/static/chunks/{b28737d6a10af30d.js → ecdc9465f0e4d954.js} +1 -1
- package/README.md +6 -5
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/public/images/clawkitchen/home.png +0 -0
- package/public/images/clawkitchen/recipes.png +0 -0
- package/public/images/clawkitchen/runs.png +0 -0
- package/public/images/clawkitchen/team.png +0 -0
- package/public/images/clawkitchen/tickets.png +0 -0
- package/public/images/clawkitchen/workflows.png +0 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1d65fddf._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1d65fddf._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__450d6006._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__450d6006._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__76f9757d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__76f9757d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9ffebe91._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__9ffebe91._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a26db919._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a26db919._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__afaa71fe._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__afaa71fe._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b577b475._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b577b475._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fb6781d4._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__fb6781d4._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_10fb6ad9._.js.map +0 -1
- package/.next/server/chunks/ssr/src_e54f24fb._.js +0 -3
- package/.next/server/chunks/ssr/src_e54f24fb._.js.map +0 -1
- package/.next/static/chunks/42b3230688d0834c.js +0 -1
- package/.next/static/chunks/635adeaf329f2446.js +0 -1
- package/.next/static/chunks/6427cd3eaffdd572.js +0 -10
- package/.next/static/chunks/be874907adf946fd.js +0 -1
- package/.next/static/chunks/cfe32a0bce2eab2b.css +0 -3
- package/.next/static/chunks/e397a21bf5f13650.js +0 -1
- /package/.next/static/{AKnetF2w3rOYqZBVpzsLP → pW5SAQ1dzPcsq_66yy5po}/_buildManifest.js +0 -0
- /package/.next/static/{AKnetF2w3rOYqZBVpzsLP → pW5SAQ1dzPcsq_66yy5po}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{AKnetF2w3rOYqZBVpzsLP → pW5SAQ1dzPcsq_66yy5po}/_ssgManifest.js +0 -0
package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/team-editor/index.tsx","../../../../src/app/teams/%5BteamId%5D/PublishChangesModal.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-utils.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-data.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamRecipeTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamAgentsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamSkillsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamCronTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamFilesTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamMemoryTab.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorSetupModal.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { parse as parseYaml } from \"yaml\";\nimport { useRouter } from \"next/navigation\";\nimport { DeleteTeamModal } from \"@/components/delete-modals\";\nimport { PublishChangesModal } from \"../PublishChangesModal\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport {\n loadTeamEditorInitial,\n handleAddAgentToTeam,\n} from \"./team-editor-data\";\nimport { forceFrontmatterId, forceFrontmatterTeamTeamId } from \"./team-editor-utils\";\nimport type { RecipeDetail, RecipeListItem, TeamAgentEntry } from \"./types\";\nimport { TeamRecipeTab } from \"./TeamRecipeTab\";\nimport { TeamAgentsTab } from \"./TeamAgentsTab\";\nimport { TeamSkillsTab } from \"./TeamSkillsTab\";\nimport { TeamCronTab } from \"./TeamCronTab\";\nimport { TeamFilesTab } from \"./TeamFilesTab\";\nimport { TeamMemoryTab } from \"./TeamMemoryTab\";\nimport { OrchestratorPanel } from \"../OrchestratorPanel\";\nimport WorkflowsClient from \"../workflows/workflows-client\";\n\nconst BASE_TABS = [\n { id: \"recipe\" as const, label: \"Recipe\" },\n { id: \"agents\" as const, label: \"Agents\" },\n { id: \"skills\" as const, label: \"Skills\" },\n { id: \"cron\" as const, label: \"Cron\" },\n { id: \"files\" as const, label: \"Files\" },\n { id: \"orchestrator\" as const, label: \"Orchestrator\" },\n] as const;\n\nconst EXPERIMENTAL_TABS = [\n { id: \"memory\" as const, label: \"Memory\" },\n { id: \"workflows\" as const, label: \"Workflows\" },\n] as const;\n\n\ntype TabId = (typeof BASE_TABS | typeof EXPERIMENTAL_TABS)[number][\"id\"];\n\nexport default function TeamEditor({ teamId, initialTab }: { teamId: string; initialTab?: string }) {\n const router = useRouter();\n const [recipes, setRecipes] = useState<RecipeListItem[]>([]);\n const [fromId, setFromId] = useState<string>(\"\");\n const [lockedFromId, setLockedFromId] = useState<string | null>(null);\n const [lockedFromName, setLockedFromName] = useState<string | null>(null);\n const [provenanceMissing, setProvenanceMissing] = useState(false);\n const [toId, setToId] = useState<string>(teamId);\n const [toName, setToName] = useState<string>(teamId);\n const [content, setContent] = useState<string>(\"\");\n const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);\n\n // Must be declared BEFORE any hook initializers that reference it.\n // (Avoids SSR/minifier TDZ issues like \"Cannot access before initialization\".)\n\n const [activeTab, setActiveTab] = useState<TabId>(() => {\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n return valid.includes(initialTab as TabId) ? (initialTab as TabId) : \"recipe\";\n });\n const tabs = useMemo(() => [...BASE_TABS, ...EXPERIMENTAL_TABS], []);\n\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [loadingSource, setLoadingSource] = useState(false);\n const [recipeLoadError, setRecipeLoadError] = useState<string>(\"\");\n const toast = useToast();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [publishOpen, setPublishOpen] = useState(false);\n const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);\n\n function flashMessage(next: string, kind: \"success\" | \"error\" | \"info\" = \"info\") {\n const msg = String(next ?? \"\").trim();\n if (!msg) return;\n toast.push({ kind, message: msg });\n }\n\n const [teamFiles, setTeamFiles] = useState<{ name: string; missing: boolean; required?: boolean; rationale?: string }[]>([]);\n const [teamFilesLoading, setTeamFilesLoading] = useState(false);\n const [teamFileError, setTeamFileError] = useState<string>(\"\");\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const [cronJobs, setCronJobs] = useState<unknown[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const [teamAgents, setTeamAgents] = useState<TeamAgentEntry[]>([]);\n const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);\n\n const recipeAgents = useMemo(() => {\n const md = String(content ?? \"\");\n if (!md.startsWith(\"---\\n\")) return [] as Array<{ role: string; name?: string }>;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return [] as Array<{ role: string; name?: string }>;\n const fmText = md.slice(4, end + 1);\n try {\n const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };\n const agents = Array.isArray(fm.agents) ? fm.agents : [];\n return agents\n .map((a) => a as { role?: unknown; name?: unknown })\n .map((a) => ({ role: String(a.role ?? \"\").trim(), name: typeof a.name === \"string\" ? a.name : undefined }))\n .filter((a) => Boolean(a.role));\n } catch {\n return [] as Array<{ role: string; name?: string }>;\n }\n }, [content]);\n\n const [newRole, setNewRole] = useState<string>(\"\");\n const [customRole, setCustomRole] = useState<string>(\"\");\n const [newRoleName, setNewRoleName] = useState<string>(\"\");\n\n const derivedRole = useMemo(() => {\n const v = (newRole === \"__custom__\" ? customRole : newRole).trim();\n return v || \"\";\n }, [newRole, customRole]);\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n const [teamSkillMsg, setTeamSkillMsg] = useState<string>(\"\");\n const [teamSkillError, setTeamSkillError] = useState<string>(\"\");\n\n const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === \"team\"), [recipes]);\n\n const toRecipe = useMemo(() => {\n const ws = recipes.find((r) => r.id === toId && r.source === \"workspace\");\n return ws ?? recipes.find((r) => r.id === toId) ?? null;\n }, [recipes, toId]);\n\n const teamIdValid = Boolean(teamId.trim());\n const targetIdValid = Boolean(toId.trim());\n const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === \"workspace\");\n const targetIsBuiltin = Boolean(toRecipe?.source === \"builtin\" && !hasWorkspaceOverride);\n const canEditTargetId = true;\n\n useEffect(() => {\n setToId(teamId);\n setToName(teamId);\n setContent(\"\");\n setLoadedRecipeHash(null);\n setTeamMetaRecipeHash(null);\n setPublishOpen(false);\n setDeleteOpen(false);\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n if (initialTab && valid.includes(initialTab as TabId)) {\n setActiveTab(initialTab as TabId);\n }\n }, [teamId, initialTab]);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n loadTeamEditorInitial(teamId, {\n setRecipes,\n setLockedFromId,\n setLockedFromName,\n setProvenanceMissing,\n setFromId,\n setTeamMetaRecipeHash,\n setTeamFiles,\n setCronJobs,\n setTeamAgents,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setTeamFilesLoading,\n setCronLoading,\n setTeamAgentsLoading,\n setSkillsLoading,\n })\n .then(() => {\n if (!cancelled) setLoading(false);\n })\n .catch((e: unknown) => {\n flashMessage(errorMessage(e), \"error\");\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Initial load only; flashMessage and setters are stable.\n }, [teamId]);\n\n async function onLoadTeamRecipeMarkdown() {\n const id = toId.trim();\n if (!id) return;\n setLoadingSource(true);\n setRecipeLoadError(\"\");\n try {\n const json = await fetchJson<{ recipe?: RecipeDetail; recipeHash?: string }>(`/api/recipes/${encodeURIComponent(id)}`, {\n cache: \"no-store\",\n });\n const r = json.recipe as RecipeDetail;\n setContent(r.content);\n setLoadedRecipeHash(typeof json.recipeHash === \"string\" ? json.recipeHash : null);\n } catch (e: unknown) {\n setRecipeLoadError(errorMessage(e));\n } finally {\n setLoadingSource(false);\n }\n }\n\n useEffect(() => {\n const id = toId.trim();\n if (!id) return;\n if (content.trim()) return;\n if (loadingSource) return;\n void onLoadTeamRecipeMarkdown();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Sync toId to load; onLoadTeamRecipeMarkdown and content are intentionally omitted.\n }, [toId]);\n\n async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {\n const f = fromId.trim();\n const id = String(args.toId ?? toId).trim();\n const name = String(args.toName ?? toName).trim();\n const overwrite = Boolean(args.overwrite);\n const scaffold = Boolean(args.scaffold);\n if (!f) throw new Error(\"Source recipe id is required\");\n if (!id) throw new Error(\"Custom recipe id is required\");\n const json = await fetchJson<{ filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null }>(\n \"/api/recipes/clone\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),\n }\n );\n return json;\n }\n\n async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {\n setSaving(true);\n flashMessage(\"\");\n try {\n const json = await ensureCustomRecipeExists({ overwrite, ...overrides });\n if (json.scaffold && !json.scaffold.ok) {\n flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || \"Unknown error\"}`, \"error\");\n }\n const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();\n if (hasEdits) {\n const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());\n await fetchJson(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: nextContent }),\n });\n setContent(nextContent);\n } else {\n setContent(json.content);\n }\n try {\n const next = await fetchJson<{ recipeHash?: string }>(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n cache: \"no-store\",\n });\n if (typeof next.recipeHash === \"string\") setLoadedRecipeHash(next.recipeHash);\n } catch {\n setLoadedRecipeHash(null);\n }\n flashMessage(`Saved team recipe: ${json.filePath}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadTeamFile(name: string) {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,\n { cache: \"no-store\" }\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileName(name);\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveTeamFile() {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean }>(\"/api/teams/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onAddAgent() {\n setSaving(true);\n try {\n await handleAddAgentToTeam({\n teamId,\n toId,\n newRole,\n derivedRole,\n newRoleName,\n content,\n setContent,\n setTeamAgents,\n flashMessage,\n ensureCustomRecipeExists,\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onCronAction(id: string, label: string, action: \"enable\" | \"disable\" | \"run\") {\n setSaving(true);\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n flashMessage(`Cron ${action}: ${label}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onInstallSkill() {\n setInstallingSkill(true);\n setTeamSkillMsg(\"\");\n setTeamSkillError(\"\");\n try {\n await fetchJson(\"/api/teams/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, skill: selectedSkill }),\n });\n setTeamSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setTeamSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team editor</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.\n </p>\n\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {tabs.map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id as TabId)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {activeTab === \"recipe\" && (\n <TeamRecipeTab\n loading={loading}\n fromId={fromId}\n setFromId={setFromId}\n toId={toId}\n setToId={setToId}\n toName={toName}\n setToName={setToName}\n canEditTargetId={canEditTargetId}\n teamRecipes={teamRecipes}\n lockedFromId={lockedFromId}\n lockedFromName={lockedFromName}\n provenanceMissing={provenanceMissing}\n saving={saving}\n teamIdValid={teamIdValid}\n targetIdValid={targetIdValid}\n targetIsBuiltin={targetIsBuiltin}\n loadedRecipeHash={loadedRecipeHash}\n teamMetaRecipeHash={teamMetaRecipeHash}\n publishing={publishing}\n content={content}\n setContent={setContent}\n setLoadedRecipeHash={setLoadedRecipeHash}\n recipeLoadError={recipeLoadError}\n onSaveCustom={onSaveCustom}\n onPublishOpen={() => setPublishOpen(true)}\n onDeleteOpen={() => setDeleteOpen(true)}\n />\n )}\n\n {activeTab === \"agents\" && (\n <TeamAgentsTab\n teamId={teamId}\n toId={toId}\n recipeAgents={recipeAgents}\n newRole={newRole}\n setNewRole={setNewRole}\n customRole={customRole}\n setCustomRole={setCustomRole}\n newRoleName={newRoleName}\n setNewRoleName={setNewRoleName}\n derivedRole={derivedRole}\n saving={saving}\n teamAgents={teamAgents}\n teamAgentsLoading={teamAgentsLoading}\n onAddAgent={onAddAgent}\n />\n )}\n\n {activeTab === \"skills\" && (\n <TeamSkillsTab\n teamId={teamId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n setSelectedSkill={setSelectedSkill}\n installingSkill={installingSkill}\n teamSkillMsg={teamSkillMsg}\n teamSkillError={teamSkillError}\n onInstallSkill={onInstallSkill}\n />\n )}\n\n {activeTab === \"cron\" && (\n <TeamCronTab\n cronJobs={cronJobs}\n cronLoading={cronLoading}\n saving={saving}\n onCronAction={onCronAction}\n />\n )}\n\n\n {activeTab === \"orchestrator\" && <OrchestratorPanel teamId={teamId} />}\n\n {activeTab === \"memory\" && (\n <div className=\"mt-6\">\n <TeamMemoryTab teamId={teamId} />\n </div>\n )}\n\n {activeTab === \"workflows\" && (\n <div className=\"mt-6\">\n <WorkflowsClient teamId={teamId} />\n </div>\n )}\n\n\n {activeTab === \"files\" && (\n <TeamFilesTab\n teamFiles={teamFiles}\n teamFilesLoading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n setShowOptionalFiles={setShowOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n setFileContent={setFileContent}\n teamFileError={teamFileError}\n saving={saving}\n onLoadTeamFile={onLoadTeamFile}\n onSaveTeamFile={onSaveTeamFile}\n />\n )}\n\n <PublishChangesModal\n open={publishOpen}\n teamId={teamId}\n recipeId={toId}\n busy={publishing}\n onClose={() => setPublishOpen(false)}\n onConfirm={async () => {\n setPublishing(true);\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n overwrite: true,\n applyConfig: true,\n }),\n });\n try {\n const metaJson = await fetchJson<{ ok?: boolean; meta?: { recipeHash?: string } }>(\n `/api/teams/meta?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === \"string\") {\n setTeamMetaRecipeHash(metaJson.meta.recipeHash);\n }\n } catch {\n // ignore\n }\n setPublishOpen(false);\n flashMessage(\"Published changes to active team\", \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setPublishing(false);\n }\n }}\n />\n\n <DeleteTeamModal\n open={deleteOpen}\n teamId={teamId}\n busy={deleting}\n onClose={() => setDeleteOpen(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n await fetchJson(\"/api/teams/remove-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId }),\n });\n flashMessage(\"Deleted team successfully\", \"success\");\n setDeleteOpen(false);\n setTimeout(() => router.push(\"/\"), 250);\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setDeleting(false);\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function PublishChangesModal({\n open,\n teamId,\n recipeId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n recipeId: string;\n busy?: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Publish changes\"\n confirmLabel=\"Publish changes\"\n confirmBusyLabel=\"Publishing…\"\n busy={busy}\n onConfirm={onConfirm}\n confirmButtonClassName=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-emerald-500 disabled:opacity-50\"\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n This will re-scaffold team <code className=\"font-mono\">{teamId}</code> from recipe <code className=\"font-mono\">{recipeId}</code>.\n </p>\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-3 text-sm text-amber-100\">\n <div className=\"font-medium\">Complete overwrite</div>\n <div className=\"mt-1\">\n All existing team workspace files managed by the recipe will be overwritten (for example: <code className=\"font-mono\">AGENTS.md</code>,{\" \"}\n <code className=\"font-mono\">SOUL.md</code>, role templates, and other scaffolded files). Any manual edits in those files will be lost.\n </div>\n </div>\n </ConfirmationModal>\n );\n}\n","export function safeParseJson<T>(text: string, def: T): T {\n try {\n return JSON.parse(text) as T;\n } catch {\n return def;\n }\n}\n\nfunction replaceOrAddIdInLines(lines: string[], id: string): string[] {\n let found = false;\n const next = lines.map((line) => {\n if (/^id\\s*:/i.test(line)) {\n found = true;\n return `id: ${id}`;\n }\n return line;\n });\n if (!found) next.unshift(`id: ${id}`);\n return next;\n}\n\nexport function forceFrontmatterId(md: string, id: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const nextLines = replaceOrAddIdInLines(fm.split(\"\\n\"), id);\n return `---\\n${nextLines.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nfunction patchTeamIdInLines(\n lines: string[],\n teamId: string\n): { next: string[]; sawTeamBlock: boolean; patched: boolean } {\n const next: string[] = [];\n let inTeam = false;\n let sawTeamBlock = false;\n let patched = false;\n\n for (const line of lines) {\n if (/^team\\s*:\\s*$/i.test(line)) {\n inTeam = true;\n sawTeamBlock = true;\n next.push(line);\n continue;\n }\n if (inTeam && /^\\S/.test(line)) inTeam = false;\n if (inTeam && /^\\s+teamId\\s*:/i.test(line)) {\n next.push(` teamId: ${teamId}`);\n patched = true;\n continue;\n }\n next.push(line);\n }\n return { next, sawTeamBlock, patched };\n}\n\nexport function forceFrontmatterTeamTeamId(md: string, teamId: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const lines = fm.split(\"\\n\");\n const { next, sawTeamBlock, patched } = patchTeamIdInLines(lines, teamId);\n\n if (sawTeamBlock && !patched) {\n const out: string[] = [];\n for (const line of next) {\n out.push(line);\n if (/^team\\s*:\\s*$/i.test(line)) out.push(` teamId: ${teamId}`);\n }\n return `---\\n${out.join(\"\\n\")}\\n---\\n${body}`;\n }\n return `---\\n${next.join(\"\\n\")}\\n---\\n${body}`;\n}\n","import { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport type { RecipeListItem, TeamAgentEntry, TeamTabSetters } from \"./types\";\nimport { safeParseJson } from \"./team-editor-utils\";\n\nasync function fetchRecipesAndMeta(teamId: string) {\n const [recipesData, metaRes] = await Promise.all([\n fetchJson<{ recipes?: RecipeListItem[] }>(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n return { recipesData, metaRes };\n}\n\nconst TEAM_TAB_URLS = (teamId: string) => [\n `/api/teams/files?teamId=${encodeURIComponent(teamId)}`,\n `/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`,\n \"/api/agents\",\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n \"/api/skills/available\",\n];\n\nasync function fetchTeamTabResponses(teamId: string) {\n const responses = await fetchAll(TEAM_TAB_URLS(teamId));\n const texts = await Promise.all(responses.map((r) => r.text()));\n return { responses, texts };\n}\n\nexport async function loadTeamTabData(teamId: string, setters: TeamTabSetters): Promise<void> {\n setters.setTeamFilesLoading(true);\n setters.setCronLoading(true);\n setters.setTeamAgentsLoading(true);\n setters.setSkillsLoading(true);\n try {\n const { responses, texts } = await fetchTeamTabResponses(teamId);\n const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes] = responses;\n const [filesText, cronText, agentsText, skillsText, availableText] = texts;\n\n const filesJson = safeParseJson<{ ok?: boolean; files?: unknown[] }>(filesText, {});\n if (filesRes.ok && filesJson.ok && Array.isArray(filesJson.files)) {\n setters.setTeamFiles(\n filesJson.files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean(entry.required),\n rationale: typeof entry.rationale === \"string\" ? entry.rationale : undefined,\n };\n }),\n );\n }\n\n const cronJson = safeParseJson<{ ok?: boolean; jobs?: unknown[] }>(cronText, {});\n if (cronRes.ok && cronJson.ok && Array.isArray(cronJson.jobs)) setters.setCronJobs(cronJson.jobs);\n\n const agentsJson = safeParseJson<{ agents?: unknown[] }>(agentsText, {});\n if (agentsRes.ok && Array.isArray(agentsJson.agents)) {\n const filtered = agentsJson.agents.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n setters.setTeamAgents(\n filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n }),\n );\n }\n\n const skillsJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(skillsText, {});\n if (skillsRes.ok && skillsJson.ok && Array.isArray(skillsJson.skills)) setters.setSkillsList(skillsJson.skills as string[]);\n\n const availableJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(availableText, {});\n if (availableSkillsRes.ok && availableJson.ok && Array.isArray(availableJson.skills)) {\n const list = availableJson.skills as string[];\n setters.setAvailableSkills(list);\n setters.setSelectedSkill((prev) => {\n const p = String(prev ?? \"\").trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? \"\";\n });\n }\n } finally {\n setters.setTeamFilesLoading(false);\n setters.setCronLoading(false);\n setters.setTeamAgentsLoading(false);\n setters.setSkillsLoading(false);\n }\n}\n\nexport type LoadTeamEditorInitialSetters = TeamTabSetters & {\n setRecipes: (r: RecipeListItem[]) => void;\n setLockedFromId: (v: string | null) => void;\n setLockedFromName: (v: string | null) => void;\n setProvenanceMissing: (v: boolean) => void;\n setFromId: (v: string) => void;\n setTeamMetaRecipeHash: (v: string | null) => void;\n};\n\nexport async function loadTeamEditorInitial(teamId: string, setters: LoadTeamEditorInitialSetters): Promise<void> {\n const initialData = await fetchRecipesAndMeta(teamId);\n setters.setRecipes((initialData.recipesData.recipes ?? []) as RecipeListItem[]);\n\n let locked: { recipeId: string; recipeName?: string } | null = null;\n try {\n const metaJson = await initialData.metaRes.json();\n const meta = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown } | undefined;\n if (initialData.metaRes.ok && metaJson.ok && meta?.recipeId) {\n locked = {\n recipeId: String(meta.recipeId),\n recipeName: typeof meta.recipeName === \"string\" ? meta.recipeName : undefined,\n };\n setters.setTeamMetaRecipeHash(typeof meta.recipeHash === \"string\" ? meta.recipeHash : null);\n } else {\n setters.setTeamMetaRecipeHash(null);\n }\n } catch {\n setters.setTeamMetaRecipeHash(null);\n }\n\n if (locked) {\n setters.setLockedFromId(locked.recipeId);\n setters.setLockedFromName(locked.recipeName ?? null);\n setters.setProvenanceMissing(false);\n setters.setFromId(locked.recipeId);\n } else {\n setters.setLockedFromId(null);\n setters.setLockedFromName(null);\n setters.setProvenanceMissing(true);\n const list = (initialData.recipesData.recipes ?? []) as RecipeListItem[];\n const preferred = list.find((r) => r.kind === \"team\" && r.id === teamId);\n const fallback = list.find((r) => r.kind === \"team\");\n const pick = preferred ?? fallback;\n if (pick) setters.setFromId(pick.id);\n }\n\n await loadTeamTabData(teamId, {\n setTeamFiles: setters.setTeamFiles,\n setCronJobs: setters.setCronJobs,\n setTeamAgents: setters.setTeamAgents,\n setSkillsList: setters.setSkillsList,\n setAvailableSkills: setters.setAvailableSkills,\n setSelectedSkill: setters.setSelectedSkill,\n setTeamFilesLoading: setters.setTeamFilesLoading,\n setCronLoading: setters.setCronLoading,\n setTeamAgentsLoading: setters.setTeamAgentsLoading,\n setSkillsLoading: setters.setSkillsLoading,\n });\n}\n\nexport async function fetchTeamAgentsOnce(teamId: string): Promise<{ ok: boolean; agents: TeamAgentEntry[] }> {\n try {\n const agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n const mapped = filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n });\n return { ok: true, agents: mapped };\n } catch {\n return { ok: false, agents: [] };\n }\n}\n\nasync function applyScaffoldAfterTeamAgentsChange(\n teamId: string,\n toId: string,\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void\n): Promise<void> {\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n applyConfig: true,\n overwrite: false,\n allowExisting: true,\n cronInstallChoice: \"no\",\n }),\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n }\n}\n\nasync function pollTeamAgentsUntil(\n teamId: string,\n expectedAgentId: string,\n setTeamAgents: (a: TeamAgentEntry[]) => void,\n maxMs: number\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < maxMs) {\n try {\n const r = await fetchTeamAgentsOnce(teamId);\n if (r.ok) {\n setTeamAgents(r.agents);\n const hasExpected = expectedAgentId ? r.agents.some((a) => a.id === expectedAgentId) : false;\n if (!expectedAgentId || hasExpected) return true;\n }\n } catch {\n // ignore\n }\n await new Promise((res) => setTimeout(res, 500));\n }\n return false;\n}\n\nexport async function handleAddAgentToTeam(opts: {\n teamId: string;\n toId: string;\n newRole: string;\n derivedRole: string;\n newRoleName: string;\n content: string;\n setContent: (c: string) => void;\n setTeamAgents: (a: TeamAgentEntry[]) => void;\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void;\n ensureCustomRecipeExists: (args: { overwrite: boolean }) => Promise<unknown>;\n}): Promise<void> {\n const { teamId, toId, newRole, derivedRole, newRoleName, content, setContent, setTeamAgents, flashMessage, ensureCustomRecipeExists } =\n opts;\n try {\n await ensureCustomRecipeExists({ overwrite: false });\n } catch (e: unknown) {\n const msg = errorMessage(e);\n if (!/Recipe id already exists:/i.test(msg)) throw e;\n }\n const json = await fetchJson<{ ok?: boolean; content?: string; addedAgentId?: string }>(\"/api/recipes/team-agents\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n newRole === \"__custom__\"\n ? { recipeId: toId.trim(), op: \"add\", role: derivedRole, name: newRoleName }\n : { recipeId: toId.trim(), op: \"addLike\", baseRole: derivedRole, teamId, name: newRoleName },\n ),\n });\n if (!json.ok) throw new Error(\"Failed updating agents list\");\n setContent(String(json.content ?? content));\n\n await applyScaffoldAfterTeamAgentsChange(teamId, toId, flashMessage);\n\n const expectedAgentId = typeof json.addedAgentId === \"string\" ? json.addedAgentId : \"\";\n const appeared = await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 5000);\n if (!appeared && expectedAgentId) {\n try {\n void fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // ignore\n }\n await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 10000);\n }\n flashMessage(`Updated agents list in ${toId}`, \"success\");\n}\n","\"use client\";\n\nimport type { RecipeListItem } from \"./types\";\n\ntype TeamRecipeTabProps = {\n loading?: boolean;\n fromId: string;\n setFromId: (v: string) => void;\n toId: string;\n setToId: (v: string) => void;\n toName: string;\n setToName: (v: string) => void;\n canEditTargetId: boolean;\n teamRecipes: RecipeListItem[];\n lockedFromId: string | null;\n lockedFromName: string | null;\n provenanceMissing: boolean;\n saving: boolean;\n teamIdValid: boolean;\n targetIdValid: boolean;\n targetIsBuiltin: boolean;\n loadedRecipeHash: string | null;\n teamMetaRecipeHash: string | null;\n publishing: boolean;\n content: string;\n setContent: (v: string) => void;\n setLoadedRecipeHash: (v: string | null) => void;\n recipeLoadError: string;\n onSaveCustom: (overwrite: boolean) => void;\n onPublishOpen: () => void;\n onDeleteOpen: () => void;\n};\n\nexport function TeamRecipeTab(props: TeamRecipeTabProps) {\n const p = props;\n return (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Custom recipe target</div>\n {p.loading ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading team…</div>\n ) : null}\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</label>\n <input\n value={p.toId}\n onChange={(e) => p.setToId(e.target.value)}\n disabled={!p.canEditTargetId}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This is the custom recipe id that will be created when you save.\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team name</label>\n <input\n value={p.toName}\n onChange={(e) => p.setToName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-4 grid grid-cols-1 gap-2\">\n <button\n type=\"button\"\n disabled={p.saving || !p.teamIdValid || !p.targetIdValid || p.targetIsBuiltin}\n onClick={() => p.onSaveCustom(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.saving ? \"Saving\" : \"Save\"}\n </button>\n <button\n type=\"button\"\n disabled={\n p.saving ||\n !p.teamIdValid ||\n !p.targetIdValid ||\n p.targetIsBuiltin ||\n !p.loadedRecipeHash ||\n !p.teamMetaRecipeHash ||\n p.loadedRecipeHash === p.teamMetaRecipeHash\n }\n onClick={p.onPublishOpen}\n className=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.publishing ? \"Publishing\" : \"Publish changes\"}\n </button>\n <button\n type=\"button\"\n disabled={p.saving}\n onClick={p.onDeleteOpen}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] disabled:opacity-50\"\n >\n Delete Team\n </button>\n </div>\n </div>\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Notes</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Parent recipe (locked)</div>\n <select\n disabled\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n value={p.fromId}\n onChange={(e) => p.setFromId(e.target.value)}\n >\n {p.teamRecipes.map((r) => (\n <option key={`${r.source}:${r.id}`} value={r.id}>\n {r.id} ({r.source})\n </option>\n ))}\n </select>\n {p.lockedFromId && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <code>{p.lockedFromId}</code>\n {p.lockedFromName ? ` (${p.lockedFromName})` : \"\"}\n </div>\n )}\n {!p.lockedFromId && p.provenanceMissing && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provenance not found for this team.\n </div>\n )}\n </div>\n <ul className=\"mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Save writes the custom recipe file identified by Team id.</li>\n <li>Publish changes re-scaffolds this team from your custom recipe.</li>\n <li>Delete Team runs openclaw recipes remove-team.</li>\n </ul>\n </div>\n </div>\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n {p.recipeLoadError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.recipeLoadError}\n </div>\n ) : null}\n <textarea\n value={p.content}\n onChange={(e) => {\n p.setContent(e.target.value);\n p.setLoadedRecipeHash(null);\n }}\n className=\"mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport type { TeamAgentEntry } from \"./types\";\n\ntype RecipeAgent = { role: string; name?: string };\n\ntype TeamAgentsTabProps = {\n teamId: string;\n toId: string;\n recipeAgents: RecipeAgent[];\n newRole: string;\n setNewRole: (v: string) => void;\n customRole: string;\n setCustomRole: (v: string) => void;\n newRoleName: string;\n setNewRoleName: (v: string) => void;\n derivedRole: string;\n saving: boolean;\n teamAgents: TeamAgentEntry[];\n teamAgentsLoading: boolean;\n onAddAgent: () => Promise<void>;\n};\n\nexport function TeamAgentsTab(props: TeamAgentsTabProps) {\n const {\n teamId,\n toId,\n recipeAgents,\n newRole,\n setNewRole,\n customRole,\n setCustomRole,\n newRoleName,\n setNewRoleName,\n derivedRole,\n saving,\n teamAgents,\n teamAgentsLoading,\n onAddAgent,\n } = props;\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agents in this team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).\n </p>\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role</label>\n <select\n value={newRole}\n onChange={(e) => {\n const v = e.target.value;\n setNewRole(v);\n if (v === \"__custom__\") {\n setCustomRole(\"\");\n setNewRoleName(\"\");\n return;\n }\n setCustomRole(\"\");\n const match = recipeAgents.find((a) => a.role === v);\n setNewRoleName(match?.name || \"\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Select…</option>\n {recipeAgents.map((a) => (\n <option key={a.role} value={a.role}>\n {a.name || a.role}\n </option>\n ))}\n <option value=\"__custom__\">Other…</option>\n </select>\n\n {newRole === \"__custom__\" ? (\n <input\n value={customRole}\n onChange={(e) => setCustomRole(e.target.value)}\n placeholder=\"role (e.g. researcher)\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n ) : null}\n\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This writes to the recipe's <code>agents:</code> list.\n </div>\n </div>\n\n <div className=\"sm:col-span-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</label>\n <input\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"Onchain Researcher\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={saving || !derivedRole}\n onClick={onAddAgent}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n Add agent\n </button>\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Detected installed team agents (read-only)</div>\n <ul className=\"mt-2 space-y-2\">\n {teamAgents.length ? (\n teamAgents.map((a) => (\n <li key={a.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">{a.id}</div>\n </div>\n <a\n className=\"text-sm font-medium text-[var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]\"\n href={\"/agents/\" + encodeURIComponent(a.id) + \"?returnTo=\" + encodeURIComponent(\"/teams/\" + teamId + \"?tab=agents\")}\n >\n Edit\n </a>\n </li>\n ))\n ) : null}\n {teamAgents.length === 0 && !teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No team agents detected.</li>\n )}\n {teamAgents.length === 0 && teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n )}\n </ul>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype TeamSkillsTabProps = {\n teamId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n setSelectedSkill: (v: string) => void;\n installingSkill: boolean;\n teamSkillMsg: string;\n teamSkillError: string;\n onInstallSkill: () => Promise<void>;\n};\n\nexport function TeamSkillsTab(props: TeamSkillsTabProps) {\n const p = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this team workspace. For agent-specific skills, open the agent from the Agents tab.\n </p>\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {p.skillsList.length ? p.skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}\n </ul>\n </div>\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={p.selectedSkill}\n onChange={(e) => p.setSelectedSkill(e.target.value)}\n disabled={p.installingSkill || p.skillsLoading || !p.availableSkills.length}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {p.availableSkills.length\n ? p.availableSkills.map((s) => <option key={s} value={s}>{s}</option>)\n : <option value=\"\">No skills found</option>}\n </select>\n <button\n type=\"button\"\n disabled={p.installingSkill || p.skillsLoading || !p.selectedSkill}\n onClick={p.onInstallSkill}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.installingSkill ? \"Adding\" : \"Add\"}\n </button>\n </div>\n {p.teamSkillError && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.teamSkillError}\n </div>\n )}\n {p.teamSkillMsg && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {p.teamSkillMsg}\n </div>\n )}\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Uses openclaw recipes install-skill with team-id {p.teamId}.\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype CronJob = {\n id?: unknown;\n jobId?: unknown;\n name?: unknown;\n enabled?: unknown;\n state?: { enabled?: unknown };\n};\n\ntype TeamCronTabProps = {\n cronJobs: unknown[];\n cronLoading: boolean;\n saving: boolean;\n onCronAction: (id: string, label: string, action: \"enable\" | \"disable\" | \"run\") => Promise<void>;\n};\n\nexport function TeamCronTab(props: TeamCronTabProps) {\n const { cronJobs, cronLoading, saving, onCronAction } = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron jobs (filtered by team name)</div>\n <ul className=\"mt-3 space-y-3\">\n {cronJobs.length ? (\n cronJobs.map((j) => {\n const job = j as CronJob;\n const id = String(job.id ?? job.jobId ?? \"\").trim();\n const key = id || String(job.name ?? \"job\");\n const label = String(job.name ?? job.id ?? job.jobId ?? \"(unnamed)\");\n const enabled = job.enabled ?? job.state?.enabled;\n return (\n <li key={key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{label}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Enabled: {String(enabled ?? \"?\")}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"run\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Run\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"enable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Enable\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"disable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Disable\n </button>\n {!id ? <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(missing id)</div> : null}\n </div>\n </li>\n );\n })\n ) : null}\n {cronJobs.length === 0 && cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading</li>\n )}\n {cronJobs.length === 0 && !cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No cron jobs detected for this team.</li>\n )}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\nimport type { TeamFileEntry } from \"./types\";\n\ntype TeamFilesTabProps = {\n teamFiles: TeamFileEntry[];\n teamFilesLoading: boolean;\n showOptionalFiles: boolean;\n setShowOptionalFiles: (v: boolean) => void;\n fileName: string;\n fileContent: string;\n setFileContent: (v: string) => void;\n teamFileError: string;\n saving: boolean;\n onLoadTeamFile: (name: string) => void;\n onSaveTeamFile: () => void;\n};\n\nexport function TeamFilesTab(props: TeamFilesTabProps) {\n const {\n teamFiles,\n teamFilesLoading,\n showOptionalFiles,\n setShowOptionalFiles,\n fileName,\n fileContent,\n setFileContent,\n teamFileError,\n saving,\n onLoadTeamFile,\n onSaveTeamFile,\n } = props;\n\n return (\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Team files\"\n files={teamFiles}\n loading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={setShowOptionalFiles}\n selectedFileName={fileName}\n onSelectFile={onLoadTeamFile}\n />\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <button\n disabled={saving}\n onClick={onSaveTeamFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n\n {teamFileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {teamFileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype MemoryItem = {\n ts: string;\n author: string;\n type: string;\n content: string;\n source?: unknown;\n _file?: string;\n _line?: number;\n};\n\ntype PinnedItem = MemoryItem & {\n pinnedAt: string;\n pinnedBy: string;\n _key: string;\n};\n\nfunction memoryKey(it: { _file?: string; _line?: number }): string {\n return `${it._file ?? \"\"}:${it._line ?? 0}`;\n}\n\nexport function TeamMemoryTab({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [files, setFiles] = useState<string[]>([]);\n const [pinnedItems, setPinnedItems] = useState<PinnedItem[]>([]);\n const [items, setItems] = useState<MemoryItem[]>([]);\n\n const [newType, setNewType] = useState(\"learning\");\n const [newContent, setNewContent] = useState(\"\");\n const [newSource, setNewSource] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [pinningKey, setPinningKey] = useState<string | null>(null);\n\n async function refresh() {\n setLoading(true);\n setError(\"\");\n try {\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const json = (await res.json()) as {\n ok?: boolean;\n error?: string;\n files?: string[];\n pinnedItems?: PinnedItem[];\n items?: MemoryItem[];\n };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load memory\");\n setFiles(Array.isArray(json.files) ? json.files : []);\n setPinnedItems(Array.isArray(json.pinnedItems) ? json.pinnedItems : []);\n setItems(Array.isArray(json.items) ? json.items : []);\n } catch (e: unknown) {\n setError(errorMessage(e));\n setFiles([]);\n setPinnedItems([]);\n setItems([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh is defined inline; teamId is the only intended trigger.\n }, [teamId]);\n\n const examples = useMemo(\n () => [\n { label: \"decision\", value: \"decision\" },\n { label: \"learning\", value: \"learning\" },\n { label: \"bug\", value: \"bug\" },\n { label: \"customer\", value: \"customer\" },\n { label: \"release\", value: \"release\" },\n ],\n []\n );\n\n const pinnedKeySet = useMemo(() => new Set(pinnedItems.map((x) => x._key)), [pinnedItems]);\n\n async function pin(it: MemoryItem) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"pin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n item: { ts: it.ts, author: it.author, type: it.type, content: it.content, source: it.source },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to pin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n async function unpin(it: { _file?: string; _line?: number }) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"unpin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to unpin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team memory (file-first)</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Stored in <span className=\"font-mono\">shared-context/memory/*.jsonl</span>. Items must be attributable.\n </div>\n </div>\n <button\n type=\"button\"\n onClick={refresh}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n\n {error ? (\n <div className=\"mt-3 rounded border border-red-400/30 bg-red-500/10 p-2 text-sm text-red-100\">{error}</div>\n ) : null}\n\n <div className=\"mt-3 text-xs text-[color:var(--ck-text-secondary)]\">Files: {files.length ? files.join(\", \") : \"(none)\"}</div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Add memory item</div>\n <div className=\"mt-3 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {examples.map((x) => (\n <option key={x.value} value={x.value}>\n {x.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">source (ticket/pr/path)</div>\n <input\n value={newSource}\n onChange={(e) => setNewSource(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. ticket 0088, PR https://..., shared-context/DECISIONS.md\"\n />\n </label>\n\n <label className=\"block md:col-span-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">content</div>\n <textarea\n value={newContent}\n onChange={(e) => setNewContent(e.target.value)}\n className=\"mt-1 h-[110px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Write a small, specific memory item…\"\n />\n </label>\n\n <div className=\"md:col-span-2\">\n <button\n type=\"button\"\n disabled={saving || !newContent.trim()}\n onClick={async () => {\n setSaving(true);\n setError(\"\");\n try {\n const payload = {\n op: \"append\",\n ts: new Date().toISOString(),\n author: `${teamId}-lead`,\n type: newType,\n content: newContent.trim(),\n source: newSource.trim() ? { text: newSource.trim() } : undefined,\n file: \"team.jsonl\",\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to append memory\");\n setNewContent(\"\");\n setNewSource(\"\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Append to team.jsonl\"}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Pinned memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{pinnedItems.length} pinned</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {pinnedItems.length ? (\n pinnedItems.map((it) => (\n <div key={it._key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">pinned {it.pinnedAt}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => void unpin(it)}\n disabled={pinningKey === it._key}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {pinningKey === it._key ? \"Unpinning…\" : \"Unpin\"}\n </button>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n ))\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No pinned items yet.</div>\n )}\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recent memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Showing {items.length} (max 200)</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {items.length ? (\n items.map((it) => {\n const k = memoryKey(it);\n const isPinned = pinnedKeySet.has(k);\n return (\n <div key={`${it._file ?? \"?\"}:${it._line ?? 0}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {it._file ? (\n <span className=\"text-[10px] text-[color:var(--ck-text-tertiary)] font-mono\">\n {it._file}:{it._line}\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => void pin(it)}\n disabled={isPinned || pinningKey === k || !it._file || !it._line}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {isPinned ? \"Pinned\" : pinningKey === k ? \"Pinning…\" : \"Pin\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n })\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No memory items yet.</div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\nexport function OrchestratorSetupModal({\n open,\n onClose,\n teamId,\n onInstalled,\n}: {\n open: boolean;\n onClose: () => void;\n teamId: string;\n onInstalled: () => void;\n}) {\n const defaultAgentId = useMemo(() => `${teamId}-swarm-orchestrator`, [teamId]);\n const [agentId, setAgentId] = useState(defaultAgentId);\n const [repoDir, setRepoDir] = useState(\"\");\n const [worktreeRoot, setWorktreeRoot] = useState(\"/home/control/swarm-worktrees\");\n const [baseRef, setBaseRef] = useState(\"origin/main\");\n const [applyConfig, setApplyConfig] = useState(true);\n const [makeExecutable, setMakeExecutable] = useState(true);\n\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<{ orchestratorAgentId: string; workspace: string } | null>(null);\n\n const normalized = useMemo(() => {\n const effectiveAgentId = slugifyId(agentId);\n return { effectiveAgentId };\n }, [agentId]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[210]\">\n <div\n className=\"fixed inset-0 bg-black/60\"\n onClick={() => {\n if (!submitting) onClose();\n }}\n />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Add Orchestrator</div>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n This will scaffold a new <span className=\"font-mono text-xs\">swarm-orchestrator</span> agent workspace for this team and\n prefill its config.\n </p>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Orchestrator agent id</label>\n <input\n value={agentId}\n onChange={(e) => setAgentId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default: <span className=\"font-mono\">{defaultAgentId}</span> (normalized: <span className=\"font-mono\">{normalized.effectiveAgentId}</span>)\n </div>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Repo directory (SWARM_REPO_DIR)</label>\n <input\n value={repoDir}\n onChange={(e) => setRepoDir(e.target.value)}\n placeholder=\"/home/control/clawkitchen\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Worktree root (SWARM_WORKTREE_ROOT)</label>\n <input\n value={worktreeRoot}\n onChange={(e) => setWorktreeRoot(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Recommend a dedicated folder outside the repo.</div>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Base ref (SWARM_BASE_REF)</label>\n <input\n value={baseRef}\n onChange={(e) => setBaseRef(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <label className=\"mt-5 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={applyConfig} onChange={(e) => setApplyConfig(e.target.checked)} className=\"mt-1\" />\n <span>\n Add this agent to OpenClaw config (recommended).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n This will modify <span className=\"font-mono\">~/.openclaw/openclaw.json</span> to add <span className=\"font-mono\">{normalized.effectiveAgentId}</span>.\n </span>\n </span>\n </label>\n\n <label className=\"mt-3 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={makeExecutable} onChange={(e) => setMakeExecutable(e.target.checked)} className=\"mt-1\" />\n <span>\n Make scripts executable (developer convenience).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Runs <span className=\"font-mono\">chmod +x .clawdbot/*.sh</span> in the orchestrator workspace.\n </span>\n </span>\n </label>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">{error}</div>\n ) : null}\n\n {result ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n Installed <span className=\"font-mono\">{result.orchestratorAgentId}</span> → <span className=\"font-mono\">{result.workspace}</span>\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={submitting}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={submitting || !normalized.effectiveAgentId || !repoDir.trim()}\n onClick={async () => {\n setSubmitting(true);\n setError(null);\n setResult(null);\n try {\n const json = await fetchJson<\n | { ok: true; orchestratorAgentId: string; workspace: string }\n | { ok: false; error: string }\n >(\"/api/teams/orchestrator/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n teamId,\n orchestratorAgentId: normalized.effectiveAgentId,\n repoDir: repoDir.trim(),\n worktreeRoot: worktreeRoot.trim(),\n baseRef: baseRef.trim(),\n applyConfig,\n makeExecutable,\n }),\n });\n if (!json.ok) throw new Error(json.error);\n setResult({ orchestratorAgentId: json.orchestratorAgentId, workspace: json.workspace });\n onInstalled();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSubmitting(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {submitting ? \"Installing…\" : \"Install\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n , document.body);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { OrchestratorSetupModal } from \"./OrchestratorSetupModal\";\n\ntype OrchestratorState =\n | {\n ok: true;\n teamId: string;\n present: false;\n reason?: string;\n }\n | {\n ok: true;\n teamId: string;\n present: true;\n agent: { id: string; identityName?: string; workspace: string };\n tmuxSessions: Array<{ name: string; attached: boolean; windows?: number; created?: string }>;\n worktrees: Array<{ path: string; branch?: string; sha?: string }>;\n activeTasksSummary: null | { path: string; taskCount?: number; rawType?: string };\n settingsPaths: string[];\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function OrchestratorPanel({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(true);\n const [state, setState] = useState<OrchestratorState | null>(null);\n const [lastLoadedAt, setLastLoadedAt] = useState<string | null>(null);\n const [setupOpen, setSetupOpen] = useState(false);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const json = await fetchJson<OrchestratorState>(\n `/api/teams/orchestrator?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n setState(json);\n setLastLoadedAt(new Date().toISOString());\n } catch (e: unknown) {\n setState({ ok: false, error: e instanceof Error ? e.message : String(e) });\n setLastLoadedAt(new Date().toISOString());\n } finally {\n setLoading(false);\n }\n }, [teamId]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n if (loading) {\n return <div className=\"mt-6 ck-glass-strong p-4\">Loading orchestrator state…</div>;\n }\n\n if (!state) {\n return <div className=\"mt-6 ck-glass-strong p-4\">No orchestrator state available.</div>;\n }\n\n if (!state.ok) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {state.error}\n </div>\n </div>\n );\n }\n\n if (!state.present) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No swarm/orchestrator detected for this team.</p>\n </div>\n <button\n type=\"button\"\n onClick={() => setSetupOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Add Orchestrator\n </button>\n </div>\n\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-tertiary)]\">Detection</div>\n <div className=\"mt-1 font-mono text-xs\">{state.reason || \"(no reason provided)\"}</div>\n </div>\n\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n Default convention is <code><teamId>-swarm-orchestrator</code>. Once installed, this tab will show: tmux sessions,\n git worktrees/branches, and active task state.\n </p>\n\n <OrchestratorSetupModal\n open={setupOpen}\n onClose={() => setSetupOpen(false)}\n teamId={teamId}\n onInstalled={() => {\n setSetupOpen(false);\n void load();\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Agent: <span className=\"font-mono\">{state.agent.id}</span>\n {state.agent.identityName ? ` (${state.agent.identityName})` : \"\"}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Workspace: <span className=\"font-mono\">{state.agent.workspace}</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {lastLoadedAt ? (\n <span>\n Last updated: <span className=\"font-mono\">{lastLoadedAt}</span>\n </span>\n ) : null}\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n {loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-5 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">tmux sessions</div>\n {state.tmuxSessions.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.tmuxSessions.map((s) => (\n <li key={s.name} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{s.name}</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n attached={String(s.attached)}\n {typeof s.windows === \"number\" ? ` windows=${s.windows}` : \"\"}\n </span>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No sessions detected (or tmux not running).</div>\n )}\n </section>\n\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">git worktrees</div>\n {state.worktrees.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.worktrees.map((w) => (\n <li key={w.path} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{w.path}</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {w.branch ? w.branch : \"(no branch)\"}\n {w.sha ? ` @ ${w.sha.slice(0, 7)}` : \"\"}\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No worktrees detected.</div>\n )}\n </section>\n </div>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Active tasks</div>\n {state.activeTasksSummary ? (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{state.activeTasksSummary.path}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {typeof state.activeTasksSummary.taskCount === \"number\" ? `tasks=${state.activeTasksSummary.taskCount}` : \"tasks=?\"}\n {state.activeTasksSummary.rawType ? ` type=${state.activeTasksSummary.rawType}` : \"\"}\n </div>\n </div>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No active-tasks.json found.</div>\n )}\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">CLI quick actions</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n The orchestrator is designed to be driven from the CLI (and usually tmux). Common commands:\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <span className=\"font-mono text-xs\">tmux ls</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(list sessions)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">tmux attach -t <session></span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(jump into a running swarm)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">git -C {state.agent.workspace} worktree list</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(inspect worktrees)</span>\n </li>\n </ul>\n <p className=\"mt-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: ClawKitchen is read-only here; it surfaces status and pointers, but does not run or attach to tmux.\n </p>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Human approval gate (recommended)</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n For workflows that publish, deploy, or send outbound messages, keep a <strong>human approval step</strong>.\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Generate a proposed change/post as a draft.</li>\n <li>Send the draft to a bound messaging channel (e.g. Telegram) for approval.</li>\n <li>Only execute the final action after explicit approve/deny.</li>\n </ul>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Where to change settings</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n These are the common knobs for a swarm/orchestrator scaffold (read-only references):\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {state.settingsPaths.map((p) => (\n <li key={p} className=\"font-mono text-xs\">\n {p}\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/team-editor/index.tsx","../../../../src/app/teams/%5BteamId%5D/PublishChangesModal.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-utils.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-data.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamRecipeTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamAgentsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamSkillsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamCronTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamFilesTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamMemoryTab.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorSetupModal.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { parse as parseYaml } from \"yaml\";\nimport { useRouter } from \"next/navigation\";\nimport { DeleteTeamModal } from \"@/components/delete-modals\";\nimport { PublishChangesModal } from \"../PublishChangesModal\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport {\n loadTeamEditorInitial,\n handleAddAgentToTeam,\n} from \"./team-editor-data\";\nimport { forceFrontmatterId, forceFrontmatterTeamTeamId } from \"./team-editor-utils\";\nimport type { RecipeDetail, RecipeListItem, TeamAgentEntry } from \"./types\";\nimport { TeamRecipeTab } from \"./TeamRecipeTab\";\nimport { TeamAgentsTab } from \"./TeamAgentsTab\";\nimport { TeamSkillsTab } from \"./TeamSkillsTab\";\nimport { TeamCronTab } from \"./TeamCronTab\";\nimport { TeamFilesTab } from \"./TeamFilesTab\";\nimport { TeamMemoryTab } from \"./TeamMemoryTab\";\nimport { OrchestratorPanel } from \"../OrchestratorPanel\";\nimport WorkflowsClient from \"../workflows/workflows-client\";\n\nconst BASE_TABS = [\n { id: \"recipe\" as const, label: \"Recipe\" },\n { id: \"agents\" as const, label: \"Agents\" },\n { id: \"skills\" as const, label: \"Skills\" },\n { id: \"cron\" as const, label: \"Cron\" },\n { id: \"files\" as const, label: \"Files\" },\n { id: \"orchestrator\" as const, label: \"Orchestrator\" },\n] as const;\n\nconst EXPERIMENTAL_TABS = [\n { id: \"memory\" as const, label: \"Memory\" },\n { id: \"workflows\" as const, label: \"Workflows\" },\n] as const;\n\n\ntype TabId = (typeof BASE_TABS | typeof EXPERIMENTAL_TABS)[number][\"id\"];\n\nexport default function TeamEditor({ teamId, initialTab }: { teamId: string; initialTab?: string }) {\n const router = useRouter();\n const [recipes, setRecipes] = useState<RecipeListItem[]>([]);\n const [fromId, setFromId] = useState<string>(\"\");\n const [lockedFromId, setLockedFromId] = useState<string | null>(null);\n const [lockedFromName, setLockedFromName] = useState<string | null>(null);\n const [provenanceMissing, setProvenanceMissing] = useState(false);\n const [toId, setToId] = useState<string>(teamId);\n const [toName, setToName] = useState<string>(teamId);\n const [content, setContent] = useState<string>(\"\");\n const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);\n\n // Must be declared BEFORE any hook initializers that reference it.\n // (Avoids SSR/minifier TDZ issues like \"Cannot access before initialization\".)\n\n const [activeTab, setActiveTab] = useState<TabId>(() => {\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n return valid.includes(initialTab as TabId) ? (initialTab as TabId) : \"recipe\";\n });\n const tabs = useMemo(() => [...BASE_TABS, ...EXPERIMENTAL_TABS], []);\n\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [loadingSource, setLoadingSource] = useState(false);\n const [recipeLoadError, setRecipeLoadError] = useState<string>(\"\");\n const toast = useToast();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [publishOpen, setPublishOpen] = useState(false);\n const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);\n\n function flashMessage(next: string, kind: \"success\" | \"error\" | \"info\" = \"info\") {\n const msg = String(next ?? \"\").trim();\n if (!msg) return;\n toast.push({ kind, message: msg });\n }\n\n const [teamFiles, setTeamFiles] = useState<{ name: string; missing: boolean; required?: boolean; rationale?: string }[]>([]);\n const [teamFilesLoading, setTeamFilesLoading] = useState(false);\n const [teamFileError, setTeamFileError] = useState<string>(\"\");\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const [cronJobs, setCronJobs] = useState<unknown[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const [teamAgents, setTeamAgents] = useState<TeamAgentEntry[]>([]);\n const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);\n\n const recipeAgents = useMemo(() => {\n const md = String(content ?? \"\");\n if (!md.startsWith(\"---\\n\")) return [] as Array<{ role: string; name?: string }>;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return [] as Array<{ role: string; name?: string }>;\n const fmText = md.slice(4, end + 1);\n try {\n const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };\n const agents = Array.isArray(fm.agents) ? fm.agents : [];\n return agents\n .map((a) => a as { role?: unknown; name?: unknown })\n .map((a) => ({ role: String(a.role ?? \"\").trim(), name: typeof a.name === \"string\" ? a.name : undefined }))\n .filter((a) => Boolean(a.role));\n } catch {\n return [] as Array<{ role: string; name?: string }>;\n }\n }, [content]);\n\n const [newRole, setNewRole] = useState<string>(\"\");\n const [customRole, setCustomRole] = useState<string>(\"\");\n const [newRoleName, setNewRoleName] = useState<string>(\"\");\n\n const derivedRole = useMemo(() => {\n const v = (newRole === \"__custom__\" ? customRole : newRole).trim();\n return v || \"\";\n }, [newRole, customRole]);\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n const [teamSkillMsg, setTeamSkillMsg] = useState<string>(\"\");\n const [teamSkillError, setTeamSkillError] = useState<string>(\"\");\n\n const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === \"team\"), [recipes]);\n\n const toRecipe = useMemo(() => {\n const ws = recipes.find((r) => r.id === toId && r.source === \"workspace\");\n return ws ?? recipes.find((r) => r.id === toId) ?? null;\n }, [recipes, toId]);\n\n const teamIdValid = Boolean(teamId.trim());\n const targetIdValid = Boolean(toId.trim());\n const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === \"workspace\");\n const targetIsBuiltin = Boolean(toRecipe?.source === \"builtin\" && !hasWorkspaceOverride);\n const canEditTargetId = true;\n\n useEffect(() => {\n setToId(teamId);\n setToName(teamId);\n setContent(\"\");\n setLoadedRecipeHash(null);\n setTeamMetaRecipeHash(null);\n setPublishOpen(false);\n setDeleteOpen(false);\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n if (initialTab && valid.includes(initialTab as TabId)) {\n setActiveTab(initialTab as TabId);\n }\n }, [teamId, initialTab]);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n loadTeamEditorInitial(teamId, {\n setRecipes,\n setLockedFromId,\n setLockedFromName,\n setProvenanceMissing,\n setFromId,\n setTeamMetaRecipeHash,\n setTeamFiles,\n setCronJobs,\n setTeamAgents,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setTeamFilesLoading,\n setCronLoading,\n setTeamAgentsLoading,\n setSkillsLoading,\n })\n .then(() => {\n if (!cancelled) setLoading(false);\n })\n .catch((e: unknown) => {\n flashMessage(errorMessage(e), \"error\");\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Initial load only; flashMessage and setters are stable.\n }, [teamId]);\n\n async function onLoadTeamRecipeMarkdown() {\n const id = toId.trim();\n if (!id) return;\n setLoadingSource(true);\n setRecipeLoadError(\"\");\n try {\n const json = await fetchJson<{ recipe?: RecipeDetail; recipeHash?: string }>(`/api/recipes/${encodeURIComponent(id)}`, {\n cache: \"no-store\",\n });\n const r = json.recipe as RecipeDetail;\n setContent(r.content);\n setLoadedRecipeHash(typeof json.recipeHash === \"string\" ? json.recipeHash : null);\n } catch (e: unknown) {\n setRecipeLoadError(errorMessage(e));\n } finally {\n setLoadingSource(false);\n }\n }\n\n useEffect(() => {\n const id = toId.trim();\n if (!id) return;\n if (content.trim()) return;\n if (loadingSource) return;\n void onLoadTeamRecipeMarkdown();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Sync toId to load; onLoadTeamRecipeMarkdown and content are intentionally omitted.\n }, [toId]);\n\n async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {\n const f = fromId.trim();\n const id = String(args.toId ?? toId).trim();\n const name = String(args.toName ?? toName).trim();\n const overwrite = Boolean(args.overwrite);\n const scaffold = Boolean(args.scaffold);\n if (!f) throw new Error(\"Source recipe id is required\");\n if (!id) throw new Error(\"Custom recipe id is required\");\n const json = await fetchJson<{ filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null }>(\n \"/api/recipes/clone\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),\n }\n );\n return json;\n }\n\n async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {\n setSaving(true);\n flashMessage(\"\");\n try {\n const json = await ensureCustomRecipeExists({ overwrite, ...overrides });\n if (json.scaffold && !json.scaffold.ok) {\n flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || \"Unknown error\"}`, \"error\");\n }\n const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();\n if (hasEdits) {\n const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());\n await fetchJson(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: nextContent }),\n });\n setContent(nextContent);\n } else {\n setContent(json.content);\n }\n try {\n const next = await fetchJson<{ recipeHash?: string }>(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n cache: \"no-store\",\n });\n if (typeof next.recipeHash === \"string\") setLoadedRecipeHash(next.recipeHash);\n } catch {\n setLoadedRecipeHash(null);\n }\n flashMessage(`Saved team recipe: ${json.filePath}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadTeamFile(name: string) {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,\n { cache: \"no-store\" }\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileName(name);\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveTeamFile() {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean }>(\"/api/teams/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onAddAgent() {\n setSaving(true);\n try {\n await handleAddAgentToTeam({\n teamId,\n toId,\n newRole,\n derivedRole,\n newRoleName,\n content,\n setContent,\n setTeamAgents,\n flashMessage,\n ensureCustomRecipeExists,\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onCronAction(id: string, label: string, action: \"enable\" | \"disable\" | \"run\") {\n setSaving(true);\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n flashMessage(`Cron ${action}: ${label}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onInstallSkill() {\n setInstallingSkill(true);\n setTeamSkillMsg(\"\");\n setTeamSkillError(\"\");\n try {\n await fetchJson(\"/api/teams/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, skill: selectedSkill }),\n });\n setTeamSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setTeamSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team editor</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.\n </p>\n\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {tabs.map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id as TabId)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {activeTab === \"recipe\" && (\n <TeamRecipeTab\n loading={loading}\n fromId={fromId}\n setFromId={setFromId}\n toId={toId}\n setToId={setToId}\n toName={toName}\n setToName={setToName}\n canEditTargetId={canEditTargetId}\n teamRecipes={teamRecipes}\n lockedFromId={lockedFromId}\n lockedFromName={lockedFromName}\n provenanceMissing={provenanceMissing}\n saving={saving}\n teamIdValid={teamIdValid}\n targetIdValid={targetIdValid}\n targetIsBuiltin={targetIsBuiltin}\n loadedRecipeHash={loadedRecipeHash}\n teamMetaRecipeHash={teamMetaRecipeHash}\n publishing={publishing}\n content={content}\n setContent={setContent}\n setLoadedRecipeHash={setLoadedRecipeHash}\n recipeLoadError={recipeLoadError}\n onSaveCustom={onSaveCustom}\n onPublishOpen={() => setPublishOpen(true)}\n onDeleteOpen={() => setDeleteOpen(true)}\n />\n )}\n\n {activeTab === \"agents\" && (\n <TeamAgentsTab\n teamId={teamId}\n toId={toId}\n recipeAgents={recipeAgents}\n newRole={newRole}\n setNewRole={setNewRole}\n customRole={customRole}\n setCustomRole={setCustomRole}\n newRoleName={newRoleName}\n setNewRoleName={setNewRoleName}\n derivedRole={derivedRole}\n saving={saving}\n teamAgents={teamAgents}\n teamAgentsLoading={teamAgentsLoading}\n onAddAgent={onAddAgent}\n />\n )}\n\n {activeTab === \"skills\" && (\n <TeamSkillsTab\n teamId={teamId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n setSelectedSkill={setSelectedSkill}\n installingSkill={installingSkill}\n teamSkillMsg={teamSkillMsg}\n teamSkillError={teamSkillError}\n onInstallSkill={onInstallSkill}\n />\n )}\n\n {activeTab === \"cron\" && (\n <TeamCronTab\n cronJobs={cronJobs}\n cronLoading={cronLoading}\n saving={saving}\n onCronAction={onCronAction}\n />\n )}\n\n\n {activeTab === \"orchestrator\" && <OrchestratorPanel teamId={teamId} />}\n\n {activeTab === \"memory\" && (\n <div className=\"mt-6\">\n <TeamMemoryTab teamId={teamId} />\n </div>\n )}\n\n {activeTab === \"workflows\" && (\n <div className=\"mt-6\">\n <WorkflowsClient teamId={teamId} />\n </div>\n )}\n\n\n {activeTab === \"files\" && (\n <TeamFilesTab\n teamFiles={teamFiles}\n teamFilesLoading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n setShowOptionalFiles={setShowOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n setFileContent={setFileContent}\n teamFileError={teamFileError}\n saving={saving}\n onLoadTeamFile={onLoadTeamFile}\n onSaveTeamFile={onSaveTeamFile}\n />\n )}\n\n <PublishChangesModal\n open={publishOpen}\n teamId={teamId}\n recipeId={toId}\n busy={publishing}\n onClose={() => setPublishOpen(false)}\n onConfirm={async () => {\n setPublishing(true);\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n overwrite: true,\n applyConfig: true,\n }),\n });\n try {\n const metaJson = await fetchJson<{ ok?: boolean; meta?: { recipeHash?: string } }>(\n `/api/teams/meta?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === \"string\") {\n setTeamMetaRecipeHash(metaJson.meta.recipeHash);\n }\n } catch {\n // ignore\n }\n setPublishOpen(false);\n flashMessage(\"Published changes to active team\", \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setPublishing(false);\n }\n }}\n />\n\n <DeleteTeamModal\n open={deleteOpen}\n teamId={teamId}\n busy={deleting}\n onClose={() => setDeleteOpen(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n await fetchJson(\"/api/teams/remove-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId }),\n });\n flashMessage(\"Deleted team successfully\", \"success\");\n setDeleteOpen(false);\n setTimeout(() => router.push(\"/\"), 250);\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setDeleting(false);\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function PublishChangesModal({\n open,\n teamId,\n recipeId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n recipeId: string;\n busy?: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Publish changes\"\n confirmLabel=\"Publish changes\"\n confirmBusyLabel=\"Publishing…\"\n busy={busy}\n onConfirm={onConfirm}\n confirmButtonClassName=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-emerald-500 disabled:opacity-50\"\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n This will re-scaffold team <code className=\"font-mono\">{teamId}</code> from recipe <code className=\"font-mono\">{recipeId}</code>.\n </p>\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-3 text-sm text-amber-100\">\n <div className=\"font-medium\">Complete overwrite</div>\n <div className=\"mt-1\">\n All existing team workspace files managed by the recipe will be overwritten (for example: <code className=\"font-mono\">AGENTS.md</code>,{\" \"}\n <code className=\"font-mono\">SOUL.md</code>, role templates, and other scaffolded files). Any manual edits in those files will be lost.\n </div>\n </div>\n </ConfirmationModal>\n );\n}\n","export function safeParseJson<T>(text: string, def: T): T {\n try {\n return JSON.parse(text) as T;\n } catch {\n return def;\n }\n}\n\nfunction replaceOrAddIdInLines(lines: string[], id: string): string[] {\n let found = false;\n const next = lines.map((line) => {\n if (/^id\\s*:/i.test(line)) {\n found = true;\n return `id: ${id}`;\n }\n return line;\n });\n if (!found) next.unshift(`id: ${id}`);\n return next;\n}\n\nexport function forceFrontmatterId(md: string, id: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const nextLines = replaceOrAddIdInLines(fm.split(\"\\n\"), id);\n return `---\\n${nextLines.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nfunction patchTeamIdInLines(\n lines: string[],\n teamId: string\n): { next: string[]; sawTeamBlock: boolean; patched: boolean } {\n const next: string[] = [];\n let inTeam = false;\n let sawTeamBlock = false;\n let patched = false;\n\n for (const line of lines) {\n if (/^team\\s*:\\s*$/i.test(line)) {\n inTeam = true;\n sawTeamBlock = true;\n next.push(line);\n continue;\n }\n if (inTeam && /^\\S/.test(line)) inTeam = false;\n if (inTeam && /^\\s+teamId\\s*:/i.test(line)) {\n next.push(` teamId: ${teamId}`);\n patched = true;\n continue;\n }\n next.push(line);\n }\n return { next, sawTeamBlock, patched };\n}\n\nexport function forceFrontmatterTeamTeamId(md: string, teamId: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const lines = fm.split(\"\\n\");\n const { next, sawTeamBlock, patched } = patchTeamIdInLines(lines, teamId);\n\n if (sawTeamBlock && !patched) {\n const out: string[] = [];\n for (const line of next) {\n out.push(line);\n if (/^team\\s*:\\s*$/i.test(line)) out.push(` teamId: ${teamId}`);\n }\n return `---\\n${out.join(\"\\n\")}\\n---\\n${body}`;\n }\n return `---\\n${next.join(\"\\n\")}\\n---\\n${body}`;\n}\n","import { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport type { RecipeListItem, TeamAgentEntry, TeamTabSetters } from \"./types\";\nimport { safeParseJson } from \"./team-editor-utils\";\n\nasync function fetchRecipesAndMeta(teamId: string) {\n const [recipesData, metaRes] = await Promise.all([\n fetchJson<{ recipes?: RecipeListItem[] }>(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n return { recipesData, metaRes };\n}\n\nconst TEAM_TAB_URLS = (teamId: string) => [\n `/api/teams/files?teamId=${encodeURIComponent(teamId)}`,\n `/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`,\n \"/api/agents\",\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n \"/api/skills/available\",\n];\n\nasync function fetchTeamTabResponses(teamId: string) {\n const responses = await fetchAll(TEAM_TAB_URLS(teamId));\n const texts = await Promise.all(responses.map((r) => r.text()));\n return { responses, texts };\n}\n\nexport async function loadTeamTabData(teamId: string, setters: TeamTabSetters): Promise<void> {\n setters.setTeamFilesLoading(true);\n setters.setCronLoading(true);\n setters.setTeamAgentsLoading(true);\n setters.setSkillsLoading(true);\n try {\n const { responses, texts } = await fetchTeamTabResponses(teamId);\n const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes] = responses;\n const [filesText, cronText, agentsText, skillsText, availableText] = texts;\n\n const filesJson = safeParseJson<{ ok?: boolean; files?: unknown[] }>(filesText, {});\n if (filesRes.ok && filesJson.ok && Array.isArray(filesJson.files)) {\n setters.setTeamFiles(\n filesJson.files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean(entry.required),\n rationale: typeof entry.rationale === \"string\" ? entry.rationale : undefined,\n };\n }),\n );\n }\n\n const cronJson = safeParseJson<{ ok?: boolean; jobs?: unknown[] }>(cronText, {});\n if (cronRes.ok && cronJson.ok && Array.isArray(cronJson.jobs)) setters.setCronJobs(cronJson.jobs);\n\n const agentsJson = safeParseJson<{ agents?: unknown[] }>(agentsText, {});\n if (agentsRes.ok && Array.isArray(agentsJson.agents)) {\n const filtered = agentsJson.agents.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n setters.setTeamAgents(\n filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n }),\n );\n }\n\n const skillsJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(skillsText, {});\n if (skillsRes.ok && skillsJson.ok && Array.isArray(skillsJson.skills)) setters.setSkillsList(skillsJson.skills as string[]);\n\n const availableJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(availableText, {});\n if (availableSkillsRes.ok && availableJson.ok && Array.isArray(availableJson.skills)) {\n const list = availableJson.skills as string[];\n setters.setAvailableSkills(list);\n setters.setSelectedSkill((prev) => {\n const p = String(prev ?? \"\").trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? \"\";\n });\n }\n } finally {\n setters.setTeamFilesLoading(false);\n setters.setCronLoading(false);\n setters.setTeamAgentsLoading(false);\n setters.setSkillsLoading(false);\n }\n}\n\nexport type LoadTeamEditorInitialSetters = TeamTabSetters & {\n setRecipes: (r: RecipeListItem[]) => void;\n setLockedFromId: (v: string | null) => void;\n setLockedFromName: (v: string | null) => void;\n setProvenanceMissing: (v: boolean) => void;\n setFromId: (v: string) => void;\n setTeamMetaRecipeHash: (v: string | null) => void;\n};\n\nexport async function loadTeamEditorInitial(teamId: string, setters: LoadTeamEditorInitialSetters): Promise<void> {\n const initialData = await fetchRecipesAndMeta(teamId);\n setters.setRecipes((initialData.recipesData.recipes ?? []) as RecipeListItem[]);\n\n let locked: { recipeId: string; recipeName?: string } | null = null;\n try {\n const metaJson = await initialData.metaRes.json();\n const meta = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown } | undefined;\n if (initialData.metaRes.ok && metaJson.ok && meta?.recipeId) {\n locked = {\n recipeId: String(meta.recipeId),\n recipeName: typeof meta.recipeName === \"string\" ? meta.recipeName : undefined,\n };\n setters.setTeamMetaRecipeHash(typeof meta.recipeHash === \"string\" ? meta.recipeHash : null);\n } else {\n setters.setTeamMetaRecipeHash(null);\n }\n } catch {\n setters.setTeamMetaRecipeHash(null);\n }\n\n if (locked) {\n setters.setLockedFromId(locked.recipeId);\n setters.setLockedFromName(locked.recipeName ?? null);\n setters.setProvenanceMissing(false);\n setters.setFromId(locked.recipeId);\n } else {\n setters.setLockedFromId(null);\n setters.setLockedFromName(null);\n setters.setProvenanceMissing(true);\n const list = (initialData.recipesData.recipes ?? []) as RecipeListItem[];\n const preferred = list.find((r) => r.kind === \"team\" && r.id === teamId);\n const fallback = list.find((r) => r.kind === \"team\");\n const pick = preferred ?? fallback;\n if (pick) setters.setFromId(pick.id);\n }\n\n await loadTeamTabData(teamId, {\n setTeamFiles: setters.setTeamFiles,\n setCronJobs: setters.setCronJobs,\n setTeamAgents: setters.setTeamAgents,\n setSkillsList: setters.setSkillsList,\n setAvailableSkills: setters.setAvailableSkills,\n setSelectedSkill: setters.setSelectedSkill,\n setTeamFilesLoading: setters.setTeamFilesLoading,\n setCronLoading: setters.setCronLoading,\n setTeamAgentsLoading: setters.setTeamAgentsLoading,\n setSkillsLoading: setters.setSkillsLoading,\n });\n}\n\nexport async function fetchTeamAgentsOnce(teamId: string): Promise<{ ok: boolean; agents: TeamAgentEntry[] }> {\n try {\n const agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n const mapped = filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n });\n return { ok: true, agents: mapped };\n } catch {\n return { ok: false, agents: [] };\n }\n}\n\nasync function applyScaffoldAfterTeamAgentsChange(\n teamId: string,\n toId: string,\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void\n): Promise<void> {\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n applyConfig: true,\n overwrite: false,\n allowExisting: true,\n cronInstallChoice: \"no\",\n }),\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n }\n}\n\nasync function pollTeamAgentsUntil(\n teamId: string,\n expectedAgentId: string,\n setTeamAgents: (a: TeamAgentEntry[]) => void,\n maxMs: number\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < maxMs) {\n try {\n const r = await fetchTeamAgentsOnce(teamId);\n if (r.ok) {\n setTeamAgents(r.agents);\n const hasExpected = expectedAgentId ? r.agents.some((a) => a.id === expectedAgentId) : false;\n if (!expectedAgentId || hasExpected) return true;\n }\n } catch {\n // ignore\n }\n await new Promise((res) => setTimeout(res, 500));\n }\n return false;\n}\n\nexport async function handleAddAgentToTeam(opts: {\n teamId: string;\n toId: string;\n newRole: string;\n derivedRole: string;\n newRoleName: string;\n content: string;\n setContent: (c: string) => void;\n setTeamAgents: (a: TeamAgentEntry[]) => void;\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void;\n ensureCustomRecipeExists: (args: { overwrite: boolean }) => Promise<unknown>;\n}): Promise<void> {\n const { teamId, toId, newRole, derivedRole, newRoleName, content, setContent, setTeamAgents, flashMessage, ensureCustomRecipeExists } =\n opts;\n try {\n await ensureCustomRecipeExists({ overwrite: false });\n } catch (e: unknown) {\n const msg = errorMessage(e);\n if (!/Recipe id already exists:/i.test(msg)) throw e;\n }\n const json = await fetchJson<{ ok?: boolean; content?: string; addedAgentId?: string }>(\"/api/recipes/team-agents\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n newRole === \"__custom__\"\n ? { recipeId: toId.trim(), op: \"add\", role: derivedRole, name: newRoleName }\n : { recipeId: toId.trim(), op: \"addLike\", baseRole: derivedRole, teamId, name: newRoleName },\n ),\n });\n if (!json.ok) throw new Error(\"Failed updating agents list\");\n setContent(String(json.content ?? content));\n\n await applyScaffoldAfterTeamAgentsChange(teamId, toId, flashMessage);\n\n const expectedAgentId = typeof json.addedAgentId === \"string\" ? json.addedAgentId : \"\";\n const appeared = await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 5000);\n if (!appeared && expectedAgentId) {\n try {\n void fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // ignore\n }\n await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 10000);\n }\n flashMessage(`Updated agents list in ${toId}`, \"success\");\n}\n","\"use client\";\n\nimport type { RecipeListItem } from \"./types\";\n\ntype TeamRecipeTabProps = {\n loading?: boolean;\n fromId: string;\n setFromId: (v: string) => void;\n toId: string;\n setToId: (v: string) => void;\n toName: string;\n setToName: (v: string) => void;\n canEditTargetId: boolean;\n teamRecipes: RecipeListItem[];\n lockedFromId: string | null;\n lockedFromName: string | null;\n provenanceMissing: boolean;\n saving: boolean;\n teamIdValid: boolean;\n targetIdValid: boolean;\n targetIsBuiltin: boolean;\n loadedRecipeHash: string | null;\n teamMetaRecipeHash: string | null;\n publishing: boolean;\n content: string;\n setContent: (v: string) => void;\n setLoadedRecipeHash: (v: string | null) => void;\n recipeLoadError: string;\n onSaveCustom: (overwrite: boolean) => void;\n onPublishOpen: () => void;\n onDeleteOpen: () => void;\n};\n\nexport function TeamRecipeTab(props: TeamRecipeTabProps) {\n const p = props;\n return (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Custom recipe target</div>\n {p.loading ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading team…</div>\n ) : null}\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</label>\n <input\n value={p.toId}\n onChange={(e) => p.setToId(e.target.value)}\n disabled={!p.canEditTargetId}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This is the custom recipe id that will be created when you save.\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team name</label>\n <input\n value={p.toName}\n onChange={(e) => p.setToName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-4 grid grid-cols-1 gap-2\">\n <button\n type=\"button\"\n disabled={p.saving || !p.teamIdValid || !p.targetIdValid || p.targetIsBuiltin}\n onClick={() => p.onSaveCustom(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.saving ? \"Saving\" : \"Save\"}\n </button>\n <button\n type=\"button\"\n disabled={\n p.saving ||\n !p.teamIdValid ||\n !p.targetIdValid ||\n p.targetIsBuiltin ||\n !p.loadedRecipeHash ||\n !p.teamMetaRecipeHash ||\n p.loadedRecipeHash === p.teamMetaRecipeHash\n }\n onClick={p.onPublishOpen}\n className=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.publishing ? \"Publishing\" : \"Publish changes\"}\n </button>\n <button\n type=\"button\"\n disabled={p.saving}\n onClick={p.onDeleteOpen}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] disabled:opacity-50\"\n >\n Delete Team\n </button>\n </div>\n </div>\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Notes</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Parent recipe (locked)</div>\n <select\n disabled\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n value={p.fromId}\n onChange={(e) => p.setFromId(e.target.value)}\n >\n {p.teamRecipes.map((r) => (\n <option key={`${r.source}:${r.id}`} value={r.id}>\n {r.id} ({r.source})\n </option>\n ))}\n </select>\n {p.lockedFromId && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <code>{p.lockedFromId}</code>\n {p.lockedFromName ? ` (${p.lockedFromName})` : \"\"}\n </div>\n )}\n {!p.lockedFromId && p.provenanceMissing && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provenance not found for this team.\n </div>\n )}\n </div>\n <ul className=\"mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Save writes the custom recipe file identified by Team id.</li>\n <li>Publish changes re-scaffolds this team from your custom recipe.</li>\n <li>Delete Team runs openclaw recipes remove-team.</li>\n </ul>\n </div>\n </div>\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n {p.recipeLoadError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.recipeLoadError}\n </div>\n ) : null}\n <textarea\n value={p.content}\n onChange={(e) => {\n p.setContent(e.target.value);\n p.setLoadedRecipeHash(null);\n }}\n className=\"mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport type { TeamAgentEntry } from \"./types\";\n\ntype RecipeAgent = { role: string; name?: string };\n\ntype TeamAgentsTabProps = {\n teamId: string;\n toId: string;\n recipeAgents: RecipeAgent[];\n newRole: string;\n setNewRole: (v: string) => void;\n customRole: string;\n setCustomRole: (v: string) => void;\n newRoleName: string;\n setNewRoleName: (v: string) => void;\n derivedRole: string;\n saving: boolean;\n teamAgents: TeamAgentEntry[];\n teamAgentsLoading: boolean;\n onAddAgent: () => Promise<void>;\n};\n\nexport function TeamAgentsTab(props: TeamAgentsTabProps) {\n const {\n teamId,\n toId,\n recipeAgents,\n newRole,\n setNewRole,\n customRole,\n setCustomRole,\n newRoleName,\n setNewRoleName,\n derivedRole,\n saving,\n teamAgents,\n teamAgentsLoading,\n onAddAgent,\n } = props;\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agents in this team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).\n </p>\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role</label>\n <select\n value={newRole}\n onChange={(e) => {\n const v = e.target.value;\n setNewRole(v);\n if (v === \"__custom__\") {\n setCustomRole(\"\");\n setNewRoleName(\"\");\n return;\n }\n setCustomRole(\"\");\n const match = recipeAgents.find((a) => a.role === v);\n setNewRoleName(match?.name || \"\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Select…</option>\n {recipeAgents.map((a) => (\n <option key={a.role} value={a.role}>\n {a.name || a.role}\n </option>\n ))}\n <option value=\"__custom__\">Other…</option>\n </select>\n\n {newRole === \"__custom__\" ? (\n <input\n value={customRole}\n onChange={(e) => setCustomRole(e.target.value)}\n placeholder=\"role (e.g. researcher)\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n ) : null}\n\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This writes to the recipe's <code>agents:</code> list.\n </div>\n </div>\n\n <div className=\"sm:col-span-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</label>\n <input\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"Onchain Researcher\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={saving || !derivedRole}\n onClick={onAddAgent}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n Add agent\n </button>\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Detected installed team agents (read-only)</div>\n <ul className=\"mt-2 space-y-2\">\n {teamAgents.length ? (\n teamAgents.map((a) => (\n <li key={a.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">{a.id}</div>\n </div>\n <a\n className=\"text-sm font-medium text-[var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]\"\n href={\"/agents/\" + encodeURIComponent(a.id) + \"?returnTo=\" + encodeURIComponent(\"/teams/\" + teamId + \"?tab=agents\")}\n >\n Edit\n </a>\n </li>\n ))\n ) : null}\n {teamAgents.length === 0 && !teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No team agents detected.</li>\n )}\n {teamAgents.length === 0 && teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n )}\n </ul>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype TeamSkillsTabProps = {\n teamId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n setSelectedSkill: (v: string) => void;\n installingSkill: boolean;\n teamSkillMsg: string;\n teamSkillError: string;\n onInstallSkill: () => Promise<void>;\n};\n\nexport function TeamSkillsTab(props: TeamSkillsTabProps) {\n const p = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this team workspace. For agent-specific skills, open the agent from the Agents tab.\n </p>\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {p.skillsList.length ? p.skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}\n </ul>\n </div>\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={p.selectedSkill}\n onChange={(e) => p.setSelectedSkill(e.target.value)}\n disabled={p.installingSkill || p.skillsLoading || !p.availableSkills.length}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {p.availableSkills.length\n ? p.availableSkills.map((s) => <option key={s} value={s}>{s}</option>)\n : <option value=\"\">No skills found</option>}\n </select>\n <button\n type=\"button\"\n disabled={p.installingSkill || p.skillsLoading || !p.selectedSkill}\n onClick={p.onInstallSkill}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.installingSkill ? \"Adding\" : \"Add\"}\n </button>\n </div>\n {p.teamSkillError && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.teamSkillError}\n </div>\n )}\n {p.teamSkillMsg && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {p.teamSkillMsg}\n </div>\n )}\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Uses openclaw recipes install-skill with team-id {p.teamId}.\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype CronJob = {\n id?: unknown;\n jobId?: unknown;\n name?: unknown;\n enabled?: unknown;\n state?: { enabled?: unknown };\n};\n\ntype TeamCronTabProps = {\n cronJobs: unknown[];\n cronLoading: boolean;\n saving: boolean;\n onCronAction: (id: string, label: string, action: \"enable\" | \"disable\" | \"run\") => Promise<void>;\n};\n\nexport function TeamCronTab(props: TeamCronTabProps) {\n const { cronJobs, cronLoading, saving, onCronAction } = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron jobs (filtered by team name)</div>\n <ul className=\"mt-3 space-y-3\">\n {cronJobs.length ? (\n cronJobs.map((j) => {\n const job = j as CronJob;\n const id = String(job.id ?? job.jobId ?? \"\").trim();\n const key = id || String(job.name ?? \"job\");\n const label = String(job.name ?? job.id ?? job.jobId ?? \"(unnamed)\");\n const enabled = job.enabled ?? job.state?.enabled;\n return (\n <li key={key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{label}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Enabled: {String(enabled ?? \"?\")}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"run\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Run\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"enable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Enable\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"disable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Disable\n </button>\n {!id ? <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(missing id)</div> : null}\n </div>\n </li>\n );\n })\n ) : null}\n {cronJobs.length === 0 && cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading</li>\n )}\n {cronJobs.length === 0 && !cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No cron jobs detected for this team.</li>\n )}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\nimport type { TeamFileEntry } from \"./types\";\n\ntype TeamFilesTabProps = {\n teamFiles: TeamFileEntry[];\n teamFilesLoading: boolean;\n showOptionalFiles: boolean;\n setShowOptionalFiles: (v: boolean) => void;\n fileName: string;\n fileContent: string;\n setFileContent: (v: string) => void;\n teamFileError: string;\n saving: boolean;\n onLoadTeamFile: (name: string) => void;\n onSaveTeamFile: () => void;\n};\n\nexport function TeamFilesTab(props: TeamFilesTabProps) {\n const {\n teamFiles,\n teamFilesLoading,\n showOptionalFiles,\n setShowOptionalFiles,\n fileName,\n fileContent,\n setFileContent,\n teamFileError,\n saving,\n onLoadTeamFile,\n onSaveTeamFile,\n } = props;\n\n return (\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Team files\"\n files={teamFiles}\n loading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={setShowOptionalFiles}\n selectedFileName={fileName}\n onSelectFile={onLoadTeamFile}\n />\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <button\n disabled={saving}\n onClick={onSaveTeamFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n\n {teamFileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {teamFileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype MemoryItem = {\n ts: string;\n author: string;\n type: string;\n content: string;\n source?: unknown;\n _file?: string;\n _line?: number;\n};\n\ntype PinnedItem = MemoryItem & {\n pinnedAt: string;\n pinnedBy: string;\n _key: string;\n};\n\nfunction memoryKey(it: { _file?: string; _line?: number }): string {\n return `${it._file ?? \"\"}:${it._line ?? 0}`;\n}\n\nexport function TeamMemoryTab({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [files, setFiles] = useState<string[]>([]);\n const [pinnedItems, setPinnedItems] = useState<PinnedItem[]>([]);\n const [items, setItems] = useState<MemoryItem[]>([]);\n\n const [newType, setNewType] = useState(\"learning\");\n const [newContent, setNewContent] = useState(\"\");\n const [newSource, setNewSource] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [pinningKey, setPinningKey] = useState<string | null>(null);\n\n async function refresh() {\n setLoading(true);\n setError(\"\");\n try {\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const json = (await res.json()) as {\n ok?: boolean;\n error?: string;\n files?: string[];\n pinnedItems?: PinnedItem[];\n items?: MemoryItem[];\n };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load memory\");\n setFiles(Array.isArray(json.files) ? json.files : []);\n setPinnedItems(Array.isArray(json.pinnedItems) ? json.pinnedItems : []);\n setItems(Array.isArray(json.items) ? json.items : []);\n } catch (e: unknown) {\n setError(errorMessage(e));\n setFiles([]);\n setPinnedItems([]);\n setItems([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh is defined inline; teamId is the only intended trigger.\n }, [teamId]);\n\n const examples = useMemo(\n () => [\n { label: \"decision\", value: \"decision\" },\n { label: \"learning\", value: \"learning\" },\n { label: \"bug\", value: \"bug\" },\n { label: \"customer\", value: \"customer\" },\n { label: \"release\", value: \"release\" },\n ],\n []\n );\n\n const pinnedKeySet = useMemo(() => new Set(pinnedItems.map((x) => x._key)), [pinnedItems]);\n\n async function pin(it: MemoryItem) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"pin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n item: { ts: it.ts, author: it.author, type: it.type, content: it.content, source: it.source },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to pin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n async function unpin(it: { _file?: string; _line?: number }) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"unpin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to unpin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team memory (file-first)</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Stored in <span className=\"font-mono\">shared-context/memory/*.jsonl</span>. Items must be attributable.\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">\n Canonical memory model doc:{\" \"}\n <a\n className=\"underline decoration-white/20 underline-offset-4 hover:decoration-white/40\"\n href=\"https://github.com/JIGGAI/ClawRecipes/blob/main/docs/MEMORY_MODEL.md\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n ClawRecipes/docs/MEMORY_MODEL.md\n </a>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={refresh}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n\n {error ? (\n <div className=\"mt-3 rounded border border-red-400/30 bg-red-500/10 p-2 text-sm text-red-100\">{error}</div>\n ) : null}\n\n <div className=\"mt-3 text-xs text-[color:var(--ck-text-secondary)]\">Files: {files.length ? files.join(\", \") : \"(none)\"}</div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Add memory item</div>\n <div className=\"mt-3 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {examples.map((x) => (\n <option key={x.value} value={x.value}>\n {x.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">source (ticket/pr/path)</div>\n <input\n value={newSource}\n onChange={(e) => setNewSource(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. ticket 0088, PR https://..., shared-context/DECISIONS.md\"\n />\n </label>\n\n <label className=\"block md:col-span-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">content</div>\n <textarea\n value={newContent}\n onChange={(e) => setNewContent(e.target.value)}\n className=\"mt-1 h-[110px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Write a small, specific memory item…\"\n />\n </label>\n\n <div className=\"md:col-span-2\">\n <button\n type=\"button\"\n disabled={saving || !newContent.trim()}\n onClick={async () => {\n setSaving(true);\n setError(\"\");\n try {\n const payload = {\n op: \"append\",\n ts: new Date().toISOString(),\n author: `${teamId}-lead`,\n type: newType,\n content: newContent.trim(),\n source: newSource.trim() ? { text: newSource.trim() } : undefined,\n file: \"team.jsonl\",\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to append memory\");\n setNewContent(\"\");\n setNewSource(\"\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Append to team.jsonl\"}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Pinned memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{pinnedItems.length} pinned</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {pinnedItems.length ? (\n pinnedItems.map((it) => (\n <div key={it._key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">pinned {it.pinnedAt}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => void unpin(it)}\n disabled={pinningKey === it._key}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {pinningKey === it._key ? \"Unpinning…\" : \"Unpin\"}\n </button>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n ))\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No pinned items yet.</div>\n )}\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recent memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Showing {items.length} (max 200)</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {items.length ? (\n items.map((it) => {\n const k = memoryKey(it);\n const isPinned = pinnedKeySet.has(k);\n return (\n <div key={`${it._file ?? \"?\"}:${it._line ?? 0}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {it._file ? (\n <span className=\"text-[10px] text-[color:var(--ck-text-tertiary)] font-mono\">\n {it._file}:{it._line}\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => void pin(it)}\n disabled={isPinned || pinningKey === k || !it._file || !it._line}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {isPinned ? \"Pinned\" : pinningKey === k ? \"Pinning…\" : \"Pin\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n })\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No memory items yet.</div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\nexport function OrchestratorSetupModal({\n open,\n onClose,\n teamId,\n onInstalled,\n}: {\n open: boolean;\n onClose: () => void;\n teamId: string;\n onInstalled: () => void;\n}) {\n const defaultAgentId = useMemo(() => `${teamId}-swarm-orchestrator`, [teamId]);\n const [agentId, setAgentId] = useState(defaultAgentId);\n const [repoDir, setRepoDir] = useState(\"\");\n const [worktreeRoot, setWorktreeRoot] = useState(\"/home/control/swarm-worktrees\");\n const [baseRef, setBaseRef] = useState(\"origin/main\");\n const [applyConfig, setApplyConfig] = useState(true);\n const [makeExecutable, setMakeExecutable] = useState(true);\n\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<{ orchestratorAgentId: string; workspace: string } | null>(null);\n\n const normalized = useMemo(() => {\n const effectiveAgentId = slugifyId(agentId);\n return { effectiveAgentId };\n }, [agentId]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[210]\">\n <div\n className=\"fixed inset-0 bg-black/60\"\n onClick={() => {\n if (!submitting) onClose();\n }}\n />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Add Orchestrator</div>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n This will scaffold a new <span className=\"font-mono text-xs\">swarm-orchestrator</span> agent workspace for this team and\n prefill its config.\n </p>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Orchestrator agent id</label>\n <input\n value={agentId}\n onChange={(e) => setAgentId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default: <span className=\"font-mono\">{defaultAgentId}</span> (normalized: <span className=\"font-mono\">{normalized.effectiveAgentId}</span>)\n </div>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Repo directory (SWARM_REPO_DIR)</label>\n <input\n value={repoDir}\n onChange={(e) => setRepoDir(e.target.value)}\n placeholder=\"/home/control/clawkitchen\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Worktree root (SWARM_WORKTREE_ROOT)</label>\n <input\n value={worktreeRoot}\n onChange={(e) => setWorktreeRoot(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Recommend a dedicated folder outside the repo.</div>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Base ref (SWARM_BASE_REF)</label>\n <input\n value={baseRef}\n onChange={(e) => setBaseRef(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <label className=\"mt-5 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={applyConfig} onChange={(e) => setApplyConfig(e.target.checked)} className=\"mt-1\" />\n <span>\n Add this agent to OpenClaw config (recommended).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n This will modify <span className=\"font-mono\">~/.openclaw/openclaw.json</span> to add <span className=\"font-mono\">{normalized.effectiveAgentId}</span>.\n </span>\n </span>\n </label>\n\n <label className=\"mt-3 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={makeExecutable} onChange={(e) => setMakeExecutable(e.target.checked)} className=\"mt-1\" />\n <span>\n Make scripts executable (developer convenience).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Runs <span className=\"font-mono\">chmod +x .clawdbot/*.sh</span> in the orchestrator workspace.\n </span>\n </span>\n </label>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">{error}</div>\n ) : null}\n\n {result ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n Installed <span className=\"font-mono\">{result.orchestratorAgentId}</span> → <span className=\"font-mono\">{result.workspace}</span>\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={submitting}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={submitting || !normalized.effectiveAgentId || !repoDir.trim()}\n onClick={async () => {\n setSubmitting(true);\n setError(null);\n setResult(null);\n try {\n const json = await fetchJson<\n | { ok: true; orchestratorAgentId: string; workspace: string }\n | { ok: false; error: string }\n >(\"/api/teams/orchestrator/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n teamId,\n orchestratorAgentId: normalized.effectiveAgentId,\n repoDir: repoDir.trim(),\n worktreeRoot: worktreeRoot.trim(),\n baseRef: baseRef.trim(),\n applyConfig,\n makeExecutable,\n }),\n });\n if (!json.ok) throw new Error(json.error);\n setResult({ orchestratorAgentId: json.orchestratorAgentId, workspace: json.workspace });\n onInstalled();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSubmitting(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {submitting ? \"Installing…\" : \"Install\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n , document.body);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { OrchestratorSetupModal } from \"./OrchestratorSetupModal\";\n\ntype OrchestratorState =\n | {\n ok: true;\n teamId: string;\n present: false;\n reason?: string;\n }\n | {\n ok: true;\n teamId: string;\n present: true;\n agent: { id: string; identityName?: string; workspace: string };\n tmuxSessions: Array<{ name: string; attached: boolean; windows?: number; created?: string }>;\n worktrees: Array<{ path: string; branch?: string; sha?: string }>;\n activeTasksSummary: null | { path: string; taskCount?: number; rawType?: string };\n settingsPaths: string[];\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function OrchestratorPanel({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(true);\n const [state, setState] = useState<OrchestratorState | null>(null);\n const [lastLoadedAt, setLastLoadedAt] = useState<string | null>(null);\n const [setupOpen, setSetupOpen] = useState(false);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const json = await fetchJson<OrchestratorState>(\n `/api/teams/orchestrator?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n setState(json);\n setLastLoadedAt(new Date().toISOString());\n } catch (e: unknown) {\n setState({ ok: false, error: e instanceof Error ? e.message : String(e) });\n setLastLoadedAt(new Date().toISOString());\n } finally {\n setLoading(false);\n }\n }, [teamId]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n if (loading) {\n return <div className=\"mt-6 ck-glass-strong p-4\">Loading orchestrator state…</div>;\n }\n\n if (!state) {\n return <div className=\"mt-6 ck-glass-strong p-4\">No orchestrator state available.</div>;\n }\n\n if (!state.ok) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {state.error}\n </div>\n </div>\n );\n }\n\n if (!state.present) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No swarm/orchestrator detected for this team.</p>\n </div>\n <button\n type=\"button\"\n onClick={() => setSetupOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Add Orchestrator\n </button>\n </div>\n\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-tertiary)]\">Detection</div>\n <div className=\"mt-1 font-mono text-xs\">{state.reason || \"(no reason provided)\"}</div>\n </div>\n\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n Default convention is <code><teamId>-swarm-orchestrator</code>. Once installed, this tab will show: tmux sessions,\n git worktrees/branches, and active task state.\n </p>\n\n <OrchestratorSetupModal\n open={setupOpen}\n onClose={() => setSetupOpen(false)}\n teamId={teamId}\n onInstalled={() => {\n setSetupOpen(false);\n void load();\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Agent: <span className=\"font-mono\">{state.agent.id}</span>\n {state.agent.identityName ? ` (${state.agent.identityName})` : \"\"}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Workspace: <span className=\"font-mono\">{state.agent.workspace}</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {lastLoadedAt ? (\n <span>\n Last updated: <span className=\"font-mono\">{lastLoadedAt}</span>\n </span>\n ) : null}\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n {loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-5 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">tmux sessions</div>\n {state.tmuxSessions.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.tmuxSessions.map((s) => (\n <li key={s.name} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{s.name}</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n attached={String(s.attached)}\n {typeof s.windows === \"number\" ? ` windows=${s.windows}` : \"\"}\n </span>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No sessions detected (or tmux not running).</div>\n )}\n </section>\n\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">git worktrees</div>\n {state.worktrees.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.worktrees.map((w) => (\n <li key={w.path} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{w.path}</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {w.branch ? w.branch : \"(no branch)\"}\n {w.sha ? ` @ ${w.sha.slice(0, 7)}` : \"\"}\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No worktrees detected.</div>\n )}\n </section>\n </div>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Active tasks</div>\n {state.activeTasksSummary ? (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{state.activeTasksSummary.path}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {typeof state.activeTasksSummary.taskCount === \"number\" ? `tasks=${state.activeTasksSummary.taskCount}` : \"tasks=?\"}\n {state.activeTasksSummary.rawType ? ` type=${state.activeTasksSummary.rawType}` : \"\"}\n </div>\n </div>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No active-tasks.json found.</div>\n )}\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">CLI quick actions</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n The orchestrator is designed to be driven from the CLI (and usually tmux). Common commands:\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <span className=\"font-mono text-xs\">tmux ls</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(list sessions)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">tmux attach -t <session></span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(jump into a running swarm)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">git -C {state.agent.workspace} worktree list</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(inspect worktrees)</span>\n </li>\n </ul>\n <p className=\"mt-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: ClawKitchen is read-only here; it surfaces status and pointers, but does not run or attach to tmux.\n </p>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Human approval gate (recommended)</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n For workflows that publish, deploy, or send outbound messages, keep a <strong>human approval step</strong>.\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Generate a proposed change/post as a draft.</li>\n <li>Send the draft to a bound messaging channel (e.g. Telegram) for approval.</li>\n <li>Only execute the final action after explicit approve/deny.</li>\n </ul>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Where to change settings</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n These are the common knobs for a swarm/orchestrator scaffold (read-only references):\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {state.settingsPaths.map((p) => (\n <li key={p} className=\"font-mono text-xs\">\n {p}\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|