bazilion 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +25 -5
- package/dist/daemon.js.map +1 -1
- package/dist/web/client/assets/AgentTabs-BcmmwYJc.js +1 -0
- package/dist/web/client/assets/ConfigPage-BCLp-FUC.js +1 -0
- package/dist/web/client/assets/ConfirmDialog-CyL9A20V.js +1 -0
- package/dist/web/client/assets/FieldRow-D6REbYUa.js +1 -0
- package/dist/web/client/assets/Page-NV96O47A.js +1 -0
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DBKnOezm.js +7 -0
- package/dist/web/client/assets/{ProfileCommunicationEditor-BcSf2Hao.js → ProfileCommunicationEditor-4RK2laqO.js} +1 -1
- package/dist/web/client/assets/SectionTabs-4kCQXuFY.js +1 -0
- package/dist/web/client/assets/TeamTabs-CdtNEqt4.js +1 -0
- package/dist/web/client/assets/{TemplatesTabs-CyDVzrOl.js → TemplatesTabs-CZyss2Y0.js} +1 -1
- package/dist/web/client/assets/UnsavedChangesGuard-CEoK-ZcN.js +1 -0
- package/dist/web/client/assets/_id-4ZS-w_Aj.js +1 -0
- package/dist/web/client/assets/{_id-DWTMH7Eb.js → _id-DIqtdQij.js} +1 -1
- package/dist/web/client/assets/_id-DbcC2E7F.js +1 -0
- package/dist/web/client/assets/_id-f_r5M0p3.js +1 -0
- package/dist/web/client/assets/activity-CB9Ufth-.js +1 -0
- package/dist/web/client/assets/agents-D-JGXVg9.js +1 -0
- package/dist/web/client/assets/agents-DS2XafoA.js +1 -0
- package/dist/web/client/assets/approvals-Cke_mrJv.js +1 -0
- package/dist/web/client/assets/attention-PYwRM2wC.js +1 -0
- package/dist/web/client/assets/chevron-right-BG4OeFRQ.js +1 -0
- package/dist/web/client/assets/config-DF9Gqmfa.js +3 -0
- package/dist/web/client/assets/{inbox-D2NypLee.js → inbox-DC_HdOfI.js} +1 -1
- package/dist/web/client/assets/index-Cp6UHWr2.js +52 -0
- package/dist/web/client/assets/learning-BfrQ4YZY.js +1 -0
- package/dist/web/client/assets/login-D4n3AcBR.js +1 -0
- package/dist/web/client/assets/mcp-CnjQc_JJ.js +1 -0
- package/dist/web/client/assets/members-wxsVTJdW.js +1 -0
- package/dist/web/client/assets/memory-Du60O3pE.js +1 -0
- package/dist/web/client/assets/{policy-CHM95pMU.js → policy-BOfnkJsL.js} +1 -1
- package/dist/web/client/assets/{preload-helper-mNuBjNXU.js → preload-helper-bztXdkDj.js} +1 -1
- package/dist/web/client/assets/routes-B9CuhzUW.js +1 -0
- package/dist/web/client/assets/services-DyvqJqM2.js +1 -0
- package/dist/web/client/assets/skills-DQo7ioW7.js +1 -0
- package/dist/web/client/assets/styles-B5vcgXln.css +2 -0
- package/dist/web/client/assets/{teams-Dm_huGxn.js → teams-DPggy97H.js} +1 -1
- package/dist/web/client/assets/teams-DdawcfNR.js +1 -0
- package/dist/web/client/assets/telegram-DcTeDpP5.js +1 -0
- package/dist/web/client/assets/tokens-CIEKwZXc.js +1 -0
- package/dist/web/client/assets/triggers-Bc2RrUPm.js +1 -0
- package/dist/web/client/assets/utils-B6KiDbIe.js +1 -0
- package/dist/web/client/assets/welcome-DlhNXUIa.js +1 -0
- package/dist/web/client/assets/wire-constants-BzdHSc6A.js +74 -0
- package/dist/web/client/assets/x-DAXGIe_Q.js +1 -0
- package/dist/web/server/assets/{AgentTabs-aXdsiiMp.js → AgentTabs-Dq8hDM2Q.js} +9 -2
- package/dist/web/server/assets/{ChatPane-Ba5wTsVk.js → ChatPane-CgSe7tsy.js} +81 -43
- package/dist/web/server/assets/{ConfigPage-BKlh5vOU.js → ConfigPage-CiQ-gxmJ.js} +3 -2
- package/dist/web/server/assets/ConfirmDialog-C-MPYYSU.js +99 -0
- package/dist/web/server/assets/FieldRow-DCOF07kl.js +160 -0
- package/dist/web/server/assets/{Page-LENulSXY.js → Page-Bz-ydB8j.js} +4 -10
- package/dist/web/server/assets/{ProductionTeamPolicyEditor-Y4mzFFvR.js → ProductionTeamPolicyEditor-DQSdP7Yx.js} +140 -123
- package/dist/web/server/assets/{SectionTabs-BJTPr5nU.js → SectionTabs-B2Yw81XN.js} +2 -2
- package/dist/web/server/assets/{Sidebar-DsRVCszF.js → Sidebar-DKyk7oIo.js} +563 -283
- package/dist/web/server/assets/{TeamTabs-zZzbP1t_.js → TeamTabs-Co3n2exj.js} +2 -6
- package/dist/web/server/assets/{TemplatesTabs-CcRxZhJe.js → TemplatesTabs-B0fA361R.js} +1 -1
- package/dist/web/server/assets/UnsavedChangesGuard-CiStXyBI.js +40 -0
- package/dist/web/server/assets/{_id-xTD_6ApX.js → _id-BAA9KJBU.js} +1 -1
- package/dist/web/server/assets/{_id-BQ2zoMiR.js → _id-BM5m2FLT.js} +4 -4
- package/dist/web/server/assets/{_id-BENqNBfK.js → _id-BYKpT2Tu.js} +1 -2
- package/dist/web/server/assets/{_id-BreRHYV2.js → _id-BeKhPKw3.js} +350 -185
- package/dist/web/server/assets/{_id-CPIXIqyO.js → _id-BqWTB8Wl.js} +188 -86
- package/dist/web/server/assets/{_id-DkrNqqTw.js → _id-BwvCtzlD.js} +1 -1
- package/dist/web/server/assets/{_id-BZWunvy7.js → _id-DYU6uIBx.js} +0 -1
- package/dist/web/server/assets/{_id-BFELaMIN.js → _id-ndxFHx0t.js} +75 -71
- package/dist/web/server/assets/{_id-CvYqVJPU.js → _id-sNu5aXZt.js} +2 -1
- package/dist/web/server/assets/{_tanstack-start-manifest_v-COkJjXt_.js → _tanstack-start-manifest_v-C-OiOZeM.js} +110 -87
- package/dist/web/server/assets/{activity-B6N1T_5N.js → activity-BWv1goK6.js} +3 -3
- package/dist/web/server/assets/{activity-BazZNfvf.js → activity-LjpblbDL.js} +1 -1
- package/dist/web/server/assets/{agents-BpSeOA30.js → agents-BDFGrU3o.js} +1 -1
- package/dist/web/server/assets/{agents-DY630p6x.js → agents-CJk4pxKu.js} +1 -1
- package/dist/web/server/assets/{agents-wSYNPuyK.js → agents-CYw1xHoY.js} +138 -16
- package/dist/web/server/assets/{agents-DfoLnTyD.js → agents-DfNKc_Q7.js} +52 -8
- package/dist/web/server/assets/{approvals-BkUGmYU9.js → approvals-7JOoBchn.js} +1 -1
- package/dist/web/server/assets/{approvals-BYajNOdE.js → approvals-Bz123liE.js} +59 -21
- package/dist/web/server/assets/{attention-Bw_wiiqI.js → attention-B35JvhOL.js} +1 -1
- package/dist/web/server/assets/{attention-Z3bGuxOD.js → attention-C1pPWSXw.js} +3 -3
- package/dist/web/server/assets/{config-wYtIhkRm.js → config-BlMkHStx.js} +1 -1
- package/dist/web/server/assets/config-ExacOzHX.js +958 -0
- package/dist/web/server/assets/{inbox-DTTfSuGU.js → inbox-RweGCV3D.js} +3 -3
- package/dist/web/server/assets/{inbox-0iiSg-Y1.js → inbox-cu3jLzNP.js} +1 -1
- package/dist/web/server/assets/{learning-DpyLNVe8.js → learning-BaKM6qaw.js} +1 -1
- package/dist/web/server/assets/{learning-fG8316uc.js → learning-CbtNlqYo.js} +76 -23
- package/dist/web/server/assets/{login-D_GDeTrB.js → login-BNj3U6ok.js} +21 -11
- package/dist/web/server/assets/{login-CrFVVUaE.js → login-Be8eP4Jp.js} +2 -2
- package/dist/web/server/assets/{mcp-BQtp2T87.js → mcp-B0goWO8Q.js} +1 -1
- package/dist/web/server/assets/mcp-CiBs8unU.js +332 -0
- package/dist/web/server/assets/members-DHYTVgwb.js +100 -0
- package/dist/web/server/assets/{members-DXu2oAS_.js → members-DiYtr-zm.js} +1 -1
- package/dist/web/server/assets/{memory-C6fX_FKI.js → memory-CkXUgf5s.js} +150 -48
- package/dist/web/server/assets/{memory-Iq2M0-Yc.js → memory-DTFEmfF3.js} +1 -1
- package/dist/web/server/assets/{policy-D7kj3Cy7.js → policy-BddK4xom.js} +1 -1
- package/dist/web/server/assets/{policy-Bg6u-rTq.js → policy-Bvvav8fh.js} +4 -4
- package/dist/web/server/assets/{router-D-6TzLRZ.js → router-pjH2t8Rl.js} +345 -172
- package/dist/web/server/assets/{routes-CiPfEldd.js → routes-BgHisAxH.js} +22 -5
- package/dist/web/server/assets/{routes-CNRzy79H.js → routes-COtkyZG1.js} +1 -1
- package/dist/web/server/assets/{routes-D933ngZS.js → routes-DAU2g7Uz.js} +1 -1
- package/dist/web/server/assets/services-ClyGBU7W.js +83 -0
- package/dist/web/server/assets/{services-OB4LAr2A.js → services-DgoU1udp.js} +1 -1
- package/dist/web/server/assets/{skills-Babb9jsQ.js → skills-CYih9TJw.js} +47 -6
- package/dist/web/server/assets/{skills-D5DQL8bM.js → skills-Dw3cI3si.js} +1 -1
- package/dist/web/server/assets/{start-uKQNK6if.js → start-D4Wq9iTa.js} +1 -1
- package/dist/web/server/assets/{teams-Dz6ZEMRo.js → teams-BJuoNOTB.js} +1 -1
- package/dist/web/server/assets/{teams-Bk6ZT0MD.js → teams-DF3RViAg.js} +3 -3
- package/dist/web/server/assets/{teams-DqC4wZxu.js → teams-DFnuc660.js} +1 -1
- package/dist/web/server/assets/{teams-Cc2Czynq.js → teams-TV6nbEN_.js} +101 -10
- package/dist/web/server/assets/{telegram-J4T0XhwQ.js → telegram-DbOFpTFm.js} +1 -1
- package/dist/web/server/assets/{telegram-DUbDIVGX.js → telegram-Dj4Wwhd6.js} +147 -47
- package/dist/web/server/assets/{tokens-CJM_0NDa.js → tokens-DDwtO15P.js} +88 -19
- package/dist/web/server/assets/{tokens-DO5BzNOn.js → tokens-_2hptHP6.js} +1 -1
- package/dist/web/server/assets/{triggers-BdBx-HwR.js → triggers-BvjYNmmY.js} +1 -1
- package/dist/web/server/assets/triggers-CHk9O3rU.js +367 -0
- package/dist/web/server/assets/utils-C_uf36nf.js +8 -0
- package/dist/web/server/assets/{welcome-DDB11L5j.js → welcome-B8nchXdF.js} +9 -8
- package/dist/web/server/server.js +5 -9
- package/package.json +3 -3
- package/dist/web/client/assets/AgentTabs-R6gSjIj3.js +0 -1
- package/dist/web/client/assets/ConfigPage-BCwfgyjD.js +0 -1
- package/dist/web/client/assets/FieldRow-avAFLgYW.js +0 -1
- package/dist/web/client/assets/Page-CwNuDhWz.js +0 -1
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DdpYInwV.js +0 -7
- package/dist/web/client/assets/SectionTabs-DZzy01az.js +0 -1
- package/dist/web/client/assets/TeamTabs-Bk89JfN7.js +0 -1
- package/dist/web/client/assets/_id-CAJTTnee.js +0 -1
- package/dist/web/client/assets/_id-CN6jPaBu.js +0 -1
- package/dist/web/client/assets/_id-DGwJqqDc.js +0 -1
- package/dist/web/client/assets/activity-DK_M0-bn.js +0 -1
- package/dist/web/client/assets/agents-B-i5pASm.js +0 -1
- package/dist/web/client/assets/agents-n8U7qNxw.js +0 -1
- package/dist/web/client/assets/approvals-CmVxCy0Z.js +0 -1
- package/dist/web/client/assets/attention-F0lUQCWE.js +0 -1
- package/dist/web/client/assets/chevron-down-OndG7r1U.js +0 -1
- package/dist/web/client/assets/config-DuApZ9xS.js +0 -3
- package/dist/web/client/assets/context-C1sMnW6K.js +0 -1
- package/dist/web/client/assets/index-B3vdrEEg.js +0 -12
- package/dist/web/client/assets/learning-zYDCfVxT.js +0 -1
- package/dist/web/client/assets/login-B1Un51Zx.js +0 -1
- package/dist/web/client/assets/mcp-DSVmJBdv.js +0 -1
- package/dist/web/client/assets/members-Pl7hXJcN.js +0 -1
- package/dist/web/client/assets/memory-Co3BEaAq.js +0 -1
- package/dist/web/client/assets/plus-Dor-_wmL.js +0 -1
- package/dist/web/client/assets/routes-D29qjwG0.js +0 -1
- package/dist/web/client/assets/services-CCQ_6YWQ.js +0 -1
- package/dist/web/client/assets/skills-3xAIvzvP.js +0 -1
- package/dist/web/client/assets/styles-D6RPN7RK.css +0 -2
- package/dist/web/client/assets/teams-UGLyjHYj.js +0 -1
- package/dist/web/client/assets/telegram-3KvrJVO6.js +0 -1
- package/dist/web/client/assets/tokens-DUSFmV5_.js +0 -1
- package/dist/web/client/assets/triggers-DlQ2KF1h.js +0 -1
- package/dist/web/client/assets/welcome-DkP8qzK1.js +0 -1
- package/dist/web/client/assets/wire-constants-BhVKOCQa.js +0 -74
- package/dist/web/server/assets/FieldRow-B4eTegH9.js +0 -94
- package/dist/web/server/assets/config-DGzM28F_.js +0 -554
- package/dist/web/server/assets/context-BkDDwbby.js +0 -12
- package/dist/web/server/assets/context-DMc0KyHh.js +0 -12
- package/dist/web/server/assets/context-poimKI7w.js +0 -47
- package/dist/web/server/assets/mcp-DlgXUcAS.js +0 -261
- package/dist/web/server/assets/members-CteHKPSF.js +0 -46
- package/dist/web/server/assets/services-DJRA1A0-.js +0 -79
- package/dist/web/server/assets/triggers-B87fycBl.js +0 -216
|
@@ -1,16 +1,29 @@
|
|
|
1
|
-
import { t as Route } from "./_id-
|
|
2
|
-
import { r as PageShell } from "./Page-
|
|
1
|
+
import { t as Route } from "./_id-BYKpT2Tu.js";
|
|
2
|
+
import { r as PageShell } from "./Page-Bz-ydB8j.js";
|
|
3
|
+
import { t as UnsavedChangesGuard } from "./UnsavedChangesGuard-CiStXyBI.js";
|
|
3
4
|
import { t as DEFAULT_PROFILE_COMMUNICATION } from "./team-policy-vPG01onj.js";
|
|
4
5
|
import { t as ProfileCommunicationEditor } from "./ProfileCommunicationEditor-C2RU-2QB.js";
|
|
5
|
-
import { t as TemplatesTabs } from "./TemplatesTabs-
|
|
6
|
-
import { useState } from "react";
|
|
6
|
+
import { t as TemplatesTabs } from "./TemplatesTabs-B0fA361R.js";
|
|
7
|
+
import { useCallback, useEffect, useState } from "react";
|
|
7
8
|
import { useRouter } from "@tanstack/react-router";
|
|
8
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
10
|
//#region src/routes/templates/agents/$id/index.tsx?tsr-split=component
|
|
10
11
|
function ProfileDetailPage() {
|
|
11
12
|
const { loaded, modelGroups, skills } = Route.useLoaderData();
|
|
12
13
|
const [tab, setTab] = useState("basics");
|
|
14
|
+
const [dirtySections, setDirtySections] = useState({});
|
|
15
|
+
const reportDirty = useCallback((section, dirty) => {
|
|
16
|
+
setDirtySections((current) => current[section] === dirty ? current : {
|
|
17
|
+
...current,
|
|
18
|
+
[section]: dirty
|
|
19
|
+
});
|
|
20
|
+
}, []);
|
|
21
|
+
const dirtyCount = Object.values(dirtySections).filter(Boolean).length;
|
|
13
22
|
return /* @__PURE__ */ jsxs(PageShell, { children: [
|
|
23
|
+
/* @__PURE__ */ jsx(UnsavedChangesGuard, {
|
|
24
|
+
when: dirtyCount > 0,
|
|
25
|
+
subject: "Agent template changes"
|
|
26
|
+
}),
|
|
14
27
|
/* @__PURE__ */ jsx(TemplatesTabs, {}),
|
|
15
28
|
/* @__PURE__ */ jsxs("header", {
|
|
16
29
|
className: "mb-1",
|
|
@@ -58,77 +71,134 @@ function ProfileDetailPage() {
|
|
|
58
71
|
active: tab,
|
|
59
72
|
onChange: (t) => setTab(t)
|
|
60
73
|
}),
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
74
|
+
dirtyCount > 0 && /* @__PURE__ */ jsxs("p", {
|
|
75
|
+
role: "status",
|
|
76
|
+
className: "mb-4 text-sm text-warning",
|
|
77
|
+
children: [
|
|
78
|
+
dirtyCount,
|
|
79
|
+
" unsaved ",
|
|
80
|
+
dirtyCount === 1 ? "section" : "sections",
|
|
81
|
+
" — switching tabs keeps the draft, but leaving this page will ask for confirmation."
|
|
82
|
+
]
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ jsxs("div", {
|
|
85
|
+
hidden: tab !== "basics",
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ jsx(SettingsCard, {
|
|
88
|
+
profileId: loaded.profile.id,
|
|
89
|
+
initialName: loaded.profile.name,
|
|
90
|
+
currentModel: loaded.profile.defaultModel,
|
|
91
|
+
modelGroups,
|
|
92
|
+
onDirtyChange: reportDirty
|
|
93
|
+
}),
|
|
94
|
+
/* @__PURE__ */ jsx(FileCard, {
|
|
95
|
+
profileId: loaded.profile.id,
|
|
96
|
+
file: "SOUL.md",
|
|
97
|
+
initialContent: loaded.files.soul,
|
|
98
|
+
rows: 14,
|
|
99
|
+
onDirtyChange: reportDirty
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ jsx(FileCard, {
|
|
102
|
+
profileId: loaded.profile.id,
|
|
103
|
+
file: "IDENTITY.md",
|
|
104
|
+
initialContent: loaded.files.identity,
|
|
105
|
+
rows: 10,
|
|
106
|
+
onDirtyChange: reportDirty
|
|
107
|
+
}),
|
|
108
|
+
loaded.files.bootstrap === null ? /* @__PURE__ */ jsxs("section", {
|
|
109
|
+
className: "file-card",
|
|
110
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
111
|
+
className: "file-head",
|
|
112
|
+
children: /* @__PURE__ */ jsx("h3", { children: "BOOTSTRAP.md" })
|
|
113
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
114
|
+
className: "muted",
|
|
115
|
+
children: "This profile was created without a bootstrap prompt. Spawned agents won't see a first-run intro message."
|
|
116
|
+
})]
|
|
117
|
+
}) : /* @__PURE__ */ jsx(FileCard, {
|
|
118
|
+
profileId: loaded.profile.id,
|
|
119
|
+
file: "BOOTSTRAP.md",
|
|
120
|
+
initialContent: loaded.files.bootstrap,
|
|
121
|
+
rows: 10,
|
|
122
|
+
onDirtyChange: reportDirty
|
|
123
|
+
}),
|
|
124
|
+
/* @__PURE__ */ jsx(OptionalFileCard, {
|
|
125
|
+
profileId: loaded.profile.id,
|
|
126
|
+
file: "AGENTS.md",
|
|
127
|
+
initialContent: loaded.files.agents,
|
|
128
|
+
hint: "Peers and routing notes — who this agent can hand off to.",
|
|
129
|
+
onDirtyChange: reportDirty
|
|
130
|
+
}),
|
|
131
|
+
/* @__PURE__ */ jsx(OptionalFileCard, {
|
|
132
|
+
profileId: loaded.profile.id,
|
|
133
|
+
file: "TOOLS.md",
|
|
134
|
+
initialContent: loaded.files.tools,
|
|
135
|
+
hint: "Tool playbook. Agent-specific usage notes that go beyond the generic tool descriptions.",
|
|
136
|
+
onDirtyChange: reportDirty
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ jsx("div", {
|
|
141
|
+
hidden: tab !== "skills",
|
|
142
|
+
children: /* @__PURE__ */ jsx(SkillsCard, {
|
|
102
143
|
profileId: loaded.profile.id,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
144
|
+
initialMode: loaded.profile.skillsMode,
|
|
145
|
+
initialPicked: new Set(loaded.defaultSkills),
|
|
146
|
+
skills,
|
|
147
|
+
onDirtyChange: reportDirty
|
|
106
148
|
})
|
|
107
|
-
] }),
|
|
108
|
-
tab === "skills" && /* @__PURE__ */ jsx(SkillsCard, {
|
|
109
|
-
profileId: loaded.profile.id,
|
|
110
|
-
initialMode: loaded.profile.skillsMode,
|
|
111
|
-
initialPicked: new Set(loaded.defaultSkills),
|
|
112
|
-
skills
|
|
113
149
|
}),
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
150
|
+
/* @__PURE__ */ jsx("div", {
|
|
151
|
+
hidden: tab !== "communication",
|
|
152
|
+
children: /* @__PURE__ */ jsx(ProfileCommunicationCard, {
|
|
153
|
+
profileId: loaded.profile.id,
|
|
154
|
+
initial: loaded.profile.communicationDefaults ?? DEFAULT_PROFILE_COMMUNICATION,
|
|
155
|
+
onDirtyChange: reportDirty
|
|
156
|
+
})
|
|
117
157
|
})
|
|
118
158
|
] });
|
|
119
159
|
}
|
|
120
|
-
function
|
|
160
|
+
function useDirtyReporter(section, dirty, onDirtyChange) {
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
onDirtyChange(section, dirty);
|
|
163
|
+
}, [
|
|
164
|
+
dirty,
|
|
165
|
+
onDirtyChange,
|
|
166
|
+
section
|
|
167
|
+
]);
|
|
168
|
+
}
|
|
169
|
+
function ProfileCommunicationCard({ profileId, initial, onDirtyChange }) {
|
|
121
170
|
const [value, setValue] = useState(initial);
|
|
122
|
-
const [
|
|
123
|
-
const
|
|
171
|
+
const [original, setOriginal] = useState(initial);
|
|
172
|
+
const [status, setStatus] = useState({
|
|
173
|
+
kind: "idle",
|
|
174
|
+
message: ""
|
|
175
|
+
});
|
|
176
|
+
const dirty = JSON.stringify(value) !== JSON.stringify(original);
|
|
177
|
+
const display = visibleStatus(dirty, status);
|
|
178
|
+
useDirtyReporter("communication", dirty, onDirtyChange);
|
|
124
179
|
const save = async () => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
body: JSON.stringify({ communicationDefaults: value })
|
|
180
|
+
setStatus({
|
|
181
|
+
kind: "saving",
|
|
182
|
+
message: "saving…"
|
|
129
183
|
});
|
|
130
|
-
|
|
131
|
-
|
|
184
|
+
try {
|
|
185
|
+
const response = await fetch(`/api/profiles/${encodeURIComponent(profileId)}`, {
|
|
186
|
+
method: "PATCH",
|
|
187
|
+
headers: { "content-type": "application/json" },
|
|
188
|
+
body: JSON.stringify({ communicationDefaults: value })
|
|
189
|
+
});
|
|
190
|
+
if (!response.ok) throw new Error((await response.json().catch(() => null))?.error ?? response.statusText);
|
|
191
|
+
setOriginal(value);
|
|
192
|
+
setStatus({
|
|
193
|
+
kind: "saved",
|
|
194
|
+
message: "saved to daemon"
|
|
195
|
+
});
|
|
196
|
+
} catch (err) {
|
|
197
|
+
setStatus({
|
|
198
|
+
kind: "error",
|
|
199
|
+
message: `error: ${err instanceof Error ? err.message : String(err)}`
|
|
200
|
+
});
|
|
201
|
+
}
|
|
132
202
|
};
|
|
133
203
|
return /* @__PURE__ */ jsxs("section", {
|
|
134
204
|
className: "rounded-md border border-frost bg-snow p-5 shadow-baziu-sm",
|
|
@@ -153,12 +223,13 @@ function ProfileCommunicationCard({ profileId, initial }) {
|
|
|
153
223
|
children: [/* @__PURE__ */ jsx("button", {
|
|
154
224
|
type: "button",
|
|
155
225
|
className: "btn-primary",
|
|
156
|
-
disabled: !dirty,
|
|
226
|
+
disabled: !dirty || status.kind === "saving",
|
|
157
227
|
onClick: save,
|
|
158
228
|
children: "save communication defaults"
|
|
159
|
-
}),
|
|
160
|
-
|
|
161
|
-
|
|
229
|
+
}), display.message && /* @__PURE__ */ jsx("span", {
|
|
230
|
+
role: display.kind === "error" ? "alert" : "status",
|
|
231
|
+
className: `text-xs ${statusColor(display.kind)}`,
|
|
232
|
+
children: display.message
|
|
162
233
|
})]
|
|
163
234
|
})
|
|
164
235
|
]
|
|
@@ -184,6 +255,12 @@ function statusColor(kind) {
|
|
|
184
255
|
if (kind === "dirty") return "text-mocha";
|
|
185
256
|
return "text-mocha-light";
|
|
186
257
|
}
|
|
258
|
+
function visibleStatus(dirty, status) {
|
|
259
|
+
return dirty && status.kind !== "saving" && status.kind !== "error" ? {
|
|
260
|
+
kind: "dirty",
|
|
261
|
+
message: "unsaved changes"
|
|
262
|
+
} : status;
|
|
263
|
+
}
|
|
187
264
|
function FileCardShell({ title, status, children }) {
|
|
188
265
|
return /* @__PURE__ */ jsxs("section", {
|
|
189
266
|
className: "file-card mb-5 rounded-[16px] border border-frost bg-snow p-5 shadow-baziu-sm",
|
|
@@ -193,23 +270,23 @@ function FileCardShell({ title, status, children }) {
|
|
|
193
270
|
className: "m-0 font-mono text-[0.95em] font-semibold normal-case tracking-normal text-chocolate",
|
|
194
271
|
children: title
|
|
195
272
|
}), status && /* @__PURE__ */ jsx("span", {
|
|
273
|
+
role: status.kind === "error" ? "alert" : status.message ? "status" : void 0,
|
|
196
274
|
className: `text-[0.82em] ${statusColor(status.kind)}`,
|
|
197
275
|
children: status.message
|
|
198
276
|
})]
|
|
199
277
|
}), children]
|
|
200
278
|
});
|
|
201
279
|
}
|
|
202
|
-
function FileCard({ profileId, file, initialContent, rows = 10 }) {
|
|
280
|
+
function FileCard({ profileId, file, initialContent, rows = 10, onDirtyChange }) {
|
|
203
281
|
const [original, setOriginal] = useState(initialContent);
|
|
204
282
|
const [content, setContent] = useState(initialContent);
|
|
205
283
|
const [status, setStatus] = useState({
|
|
206
284
|
kind: "idle",
|
|
207
285
|
message: ""
|
|
208
286
|
});
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
} : status;
|
|
287
|
+
const dirty = content !== original;
|
|
288
|
+
useDirtyReporter(`file:${file}`, dirty, onDirtyChange);
|
|
289
|
+
const display = visibleStatus(dirty, status);
|
|
213
290
|
async function save() {
|
|
214
291
|
setStatus({
|
|
215
292
|
kind: "saving",
|
|
@@ -248,6 +325,7 @@ function FileCard({ profileId, file, initialContent, rows = 10 }) {
|
|
|
248
325
|
title: file,
|
|
249
326
|
status: display,
|
|
250
327
|
children: [/* @__PURE__ */ jsx("textarea", {
|
|
328
|
+
"aria-label": `${file} contents`,
|
|
251
329
|
rows,
|
|
252
330
|
value: content,
|
|
253
331
|
onChange: (e) => setContent(e.target.value),
|
|
@@ -269,7 +347,7 @@ function FileCard({ profileId, file, initialContent, rows = 10 }) {
|
|
|
269
347
|
})]
|
|
270
348
|
});
|
|
271
349
|
}
|
|
272
|
-
function OptionalFileCard({ profileId, file, initialContent, hint }) {
|
|
350
|
+
function OptionalFileCard({ profileId, file, initialContent, hint, onDirtyChange }) {
|
|
273
351
|
const router = useRouter();
|
|
274
352
|
const [creating, setCreating] = useState(false);
|
|
275
353
|
const [status, setStatus] = useState({
|
|
@@ -325,20 +403,28 @@ function OptionalFileCard({ profileId, file, initialContent, hint }) {
|
|
|
325
403
|
profileId,
|
|
326
404
|
file,
|
|
327
405
|
initialContent,
|
|
328
|
-
rows: 10
|
|
406
|
+
rows: 10,
|
|
407
|
+
onDirtyChange
|
|
329
408
|
})] });
|
|
330
409
|
}
|
|
331
|
-
function SettingsCard({ profileId, initialName, currentModel, modelGroups }) {
|
|
410
|
+
function SettingsCard({ profileId, initialName, currentModel, modelGroups, onDirtyChange }) {
|
|
332
411
|
const router = useRouter();
|
|
333
412
|
const [name, setName] = useState(initialName);
|
|
334
413
|
const [defaultModel, setDefaultModel] = useState(currentModel);
|
|
414
|
+
const [originalName, setOriginalName] = useState(initialName);
|
|
415
|
+
const [originalModel, setOriginalModel] = useState(currentModel);
|
|
335
416
|
const [status, setStatus] = useState({
|
|
336
417
|
kind: "idle",
|
|
337
418
|
message: ""
|
|
338
419
|
});
|
|
420
|
+
const dirty = name !== originalName || defaultModel !== originalModel;
|
|
421
|
+
const display = visibleStatus(dirty, status);
|
|
422
|
+
useDirtyReporter("settings", dirty, onDirtyChange);
|
|
339
423
|
const modelMissing = !modelGroups.flatMap((g) => g.models.map((m) => `${g.provider}:${m}`)).includes(currentModel);
|
|
340
424
|
async function save(e) {
|
|
341
425
|
e.preventDefault();
|
|
426
|
+
const savedName = name.trim();
|
|
427
|
+
const savedModel = defaultModel.trim();
|
|
342
428
|
setStatus({
|
|
343
429
|
kind: "saving",
|
|
344
430
|
message: "saving…"
|
|
@@ -348,8 +434,8 @@ function SettingsCard({ profileId, initialName, currentModel, modelGroups }) {
|
|
|
348
434
|
method: "PATCH",
|
|
349
435
|
headers: { "content-type": "application/json" },
|
|
350
436
|
body: JSON.stringify({
|
|
351
|
-
name:
|
|
352
|
-
defaultModel:
|
|
437
|
+
name: savedName,
|
|
438
|
+
defaultModel: savedModel
|
|
353
439
|
})
|
|
354
440
|
});
|
|
355
441
|
if (!res.ok) {
|
|
@@ -357,6 +443,10 @@ function SettingsCard({ profileId, initialName, currentModel, modelGroups }) {
|
|
|
357
443
|
throw new Error(e2?.error ?? res.statusText);
|
|
358
444
|
}
|
|
359
445
|
await router.invalidate();
|
|
446
|
+
setName(savedName);
|
|
447
|
+
setDefaultModel(savedModel);
|
|
448
|
+
setOriginalName(savedName);
|
|
449
|
+
setOriginalModel(savedModel);
|
|
360
450
|
setStatus({
|
|
361
451
|
kind: "saved",
|
|
362
452
|
message: "saved"
|
|
@@ -370,7 +460,7 @@ function SettingsCard({ profileId, initialName, currentModel, modelGroups }) {
|
|
|
370
460
|
}
|
|
371
461
|
return /* @__PURE__ */ jsx(FileCardShell, {
|
|
372
462
|
title: "settings",
|
|
373
|
-
status,
|
|
463
|
+
status: display,
|
|
374
464
|
children: /* @__PURE__ */ jsxs("form", {
|
|
375
465
|
onSubmit: save,
|
|
376
466
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
@@ -405,21 +495,26 @@ function SettingsCard({ profileId, initialName, currentModel, modelGroups }) {
|
|
|
405
495
|
className: "mt-3 flex gap-2",
|
|
406
496
|
children: /* @__PURE__ */ jsx("button", {
|
|
407
497
|
type: "submit",
|
|
408
|
-
disabled: status.kind === "saving",
|
|
498
|
+
disabled: !dirty || status.kind === "saving",
|
|
409
499
|
children: "save settings"
|
|
410
500
|
})
|
|
411
501
|
})]
|
|
412
502
|
})
|
|
413
503
|
});
|
|
414
504
|
}
|
|
415
|
-
function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
505
|
+
function SkillsCard({ profileId, initialMode, initialPicked, skills, onDirtyChange }) {
|
|
416
506
|
const router = useRouter();
|
|
417
507
|
const [mode, setMode] = useState(initialMode);
|
|
418
508
|
const [picked, setPicked] = useState(initialPicked);
|
|
509
|
+
const [originalMode, setOriginalMode] = useState(initialMode);
|
|
510
|
+
const [originalPicked, setOriginalPicked] = useState(initialPicked);
|
|
419
511
|
const [status, setStatus] = useState({
|
|
420
512
|
kind: "idle",
|
|
421
513
|
message: ""
|
|
422
514
|
});
|
|
515
|
+
const dirty = mode !== originalMode || !sameSet(picked, originalPicked);
|
|
516
|
+
const display = visibleStatus(dirty, status);
|
|
517
|
+
useDirtyReporter("skills", dirty, onDirtyChange);
|
|
423
518
|
function toggle(name) {
|
|
424
519
|
setPicked((prev) => {
|
|
425
520
|
const next = new Set(prev);
|
|
@@ -430,6 +525,7 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
430
525
|
}
|
|
431
526
|
async function save(e) {
|
|
432
527
|
e.preventDefault();
|
|
528
|
+
const savedPicked = mode === "selected" ? new Set(picked) : /* @__PURE__ */ new Set();
|
|
433
529
|
setStatus({
|
|
434
530
|
kind: "saving",
|
|
435
531
|
message: "saving…"
|
|
@@ -440,7 +536,7 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
440
536
|
headers: { "content-type": "application/json" },
|
|
441
537
|
body: JSON.stringify({
|
|
442
538
|
skillsMode: mode,
|
|
443
|
-
defaultSkills:
|
|
539
|
+
defaultSkills: Array.from(savedPicked)
|
|
444
540
|
})
|
|
445
541
|
});
|
|
446
542
|
if (!res.ok) {
|
|
@@ -448,6 +544,9 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
448
544
|
throw new Error(e2?.error ?? res.statusText);
|
|
449
545
|
}
|
|
450
546
|
await router.invalidate();
|
|
547
|
+
setOriginalMode(mode);
|
|
548
|
+
setPicked(savedPicked);
|
|
549
|
+
setOriginalPicked(savedPicked);
|
|
451
550
|
setStatus({
|
|
452
551
|
kind: "saved",
|
|
453
552
|
message: "saved"
|
|
@@ -461,7 +560,7 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
461
560
|
}
|
|
462
561
|
return /* @__PURE__ */ jsxs(FileCardShell, {
|
|
463
562
|
title: "skills",
|
|
464
|
-
status,
|
|
563
|
+
status: display,
|
|
465
564
|
children: [/* @__PURE__ */ jsx("p", {
|
|
466
565
|
className: "muted my-2",
|
|
467
566
|
children: "Choose what agents spawned from this profile inherit. Existing agents aren't affected — they keep whatever skills they were spawned with."
|
|
@@ -512,7 +611,7 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
512
611
|
className: "mt-3 flex gap-2",
|
|
513
612
|
children: /* @__PURE__ */ jsx("button", {
|
|
514
613
|
type: "submit",
|
|
515
|
-
disabled: status.kind === "saving",
|
|
614
|
+
disabled: !dirty || status.kind === "saving",
|
|
516
615
|
children: "save skills"
|
|
517
616
|
})
|
|
518
617
|
})
|
|
@@ -520,5 +619,8 @@ function SkillsCard({ profileId, initialMode, initialPicked, skills }) {
|
|
|
520
619
|
})]
|
|
521
620
|
});
|
|
522
621
|
}
|
|
622
|
+
function sameSet(left, right) {
|
|
623
|
+
return left.size === right.size && Array.from(left).every((item) => right.has(item));
|
|
624
|
+
}
|
|
523
625
|
//#endregion
|
|
524
626
|
export { ProfileDetailPage as component };
|
|
@@ -3,7 +3,7 @@ import { t as createSsrRpc } from "./createSsrRpc-6LHNEsSK.js";
|
|
|
3
3
|
import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
4
4
|
//#region src/routes/templates/teams/$id/index.tsx
|
|
5
5
|
var $$splitErrorComponentImporter = () => import("./_id-A8Xiv6Lc.js");
|
|
6
|
-
var $$splitComponentImporter = () => import("./_id-
|
|
6
|
+
var $$splitComponentImporter = () => import("./_id-BM5m2FLT.js");
|
|
7
7
|
var fetchTeam = createServerFn({ method: "POST" }).validator((data) => data).handler(createSsrRpc("a0bbbee5d0c1240a05e35c04d56a0e95ec78f05265e4e937eec48c8ac2041e58"));
|
|
8
8
|
var Route = createFileRoute("/templates/teams/$id/")({
|
|
9
9
|
loader: ({ params }) => fetchTeam({ data: params }),
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { n as createServerFn } from "../server.js";
|
|
2
2
|
import { t as createServerRpc } from "./createServerRpc-B7Yr1K8i.js";
|
|
3
3
|
import { n as daemonClient, r as ApiClientError } from "./daemon-client-CI5NHwNC.js";
|
|
4
|
-
import "react";
|
|
5
4
|
//#region src/routes/templates/agents/$id/index.tsx?tss-serverfn-split
|
|
6
5
|
var fetchProfile_createServerFn_handler = createServerRpc({
|
|
7
6
|
id: "032d74b7d41c718191dbdde6b06ba44993340ce1154af1fa6723a6d4f7a7236e",
|