baxian 0.10.0 → 0.11.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/api/projects.d.ts.map +1 -1
- package/dist/api/projects.js +38 -0
- package/dist/api/projects.js.map +1 -1
- package/dist/web/assets/index-CGGTyFj7.js +4 -0
- package/dist/web/assets/index-CTa85R7R.css +1 -0
- package/dist/web/baxian-logo.png +0 -0
- package/dist/web/index.html +3 -2
- package/package.json +1 -1
- package/dist/web/assets/index-Bu2FlscJ.css +0 -1
- package/dist/web/assets/index-DqqVC4qi.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/api/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8C/C,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/api/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA8C/C,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAolBvE"}
|
package/dist/api/projects.js
CHANGED
|
@@ -75,6 +75,44 @@ export async function projectRoutes(app) {
|
|
|
75
75
|
const agents = await Promise.all(checks);
|
|
76
76
|
return reply.status(201).send({ projectId: project.id, agents });
|
|
77
77
|
});
|
|
78
|
+
app.delete('/projects/:id', async (request, reply) => {
|
|
79
|
+
if (!app.ctx.configPath) {
|
|
80
|
+
return reply.status(500).send({ error: 'No config path configured' });
|
|
81
|
+
}
|
|
82
|
+
return withConfigLock(async () => {
|
|
83
|
+
const { id } = request.params;
|
|
84
|
+
const project = app.ctx.config.project.find(p => p.id === id);
|
|
85
|
+
if (!project) {
|
|
86
|
+
return reply.status(404).send({ error: `Project "${id}" not found` });
|
|
87
|
+
}
|
|
88
|
+
const remaining = project.agent.flat();
|
|
89
|
+
if (remaining.length > 0) {
|
|
90
|
+
return reply.status(409).send({
|
|
91
|
+
error: `Project "${id}" still has ${remaining.length} agent(s); ` +
|
|
92
|
+
`delete every agent (which reclaims its tmux session / worktree) before deleting the project.`,
|
|
93
|
+
agents: remaining.map(a => a.id),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const next = {
|
|
97
|
+
...app.ctx.config,
|
|
98
|
+
project: app.ctx.config.project.filter(p => p.id !== id),
|
|
99
|
+
};
|
|
100
|
+
let validated;
|
|
101
|
+
try {
|
|
102
|
+
validated = prepareConfig(next);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (err instanceof ConfigValidationError) {
|
|
106
|
+
return reply.status(400).send({ error: 'Invalid config', details: err.errors });
|
|
107
|
+
}
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
await saveConfig(app.ctx.configPath, validated);
|
|
111
|
+
app.ctx.config = validated;
|
|
112
|
+
applyConfigHotReload(app.ctx, validated);
|
|
113
|
+
return reply.status(200).send({ removed: id, restartRequired: false });
|
|
114
|
+
});
|
|
115
|
+
});
|
|
78
116
|
app.post('/projects', async (request, reply) => {
|
|
79
117
|
if (!app.ctx.configPath) {
|
|
80
118
|
return reply.status(500).send({ error: 'No config path configured' });
|
package/dist/api/projects.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/api/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASrD,OAAO,EAAE,YAAY,EAAwB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAQ/D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEtF,SAAS,UAAU,CAAC,MAAoB;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAoB,EAAE,SAAiB,EAAE,OAAiB;IACvF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC9B,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;gBAAE,OAAO,CAAC,CAAC;YACjC,OAAO;gBACL,GAAG,CAAC;gBACJ,KAAK,EAAE,CAAC,CAAC,KAAK;qBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;qBACpD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACnC,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAoB;IACtD,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QAC9B,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAA6B,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAA6B,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,8FAA8F;QAC9F,8FAA8F;QAC9F,sFAAsF;QACtF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,0GAA0G;aAC/I,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YACrB,0FAA0F;YAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAA6B,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpD,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACzD,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO;iBACR,CAAC,CAAC,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CACN,WAAW,EACX,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,cAAc,CAAC,KAAK,IAAI,EAAE;YAC/B,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,UAAU,GAAkB;gBAChC,EAAE;gBACF,IAAI;gBACJ,KAAK,EAAE,KAAK,IAAI,IAAI;gBACpB,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,MAAM,MAAM,GAAiB;gBAC3B,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM;gBACjB,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;aACjD,CAAC;YAEF,IAAI,SAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;oBACzC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAW,EAAE,SAAS,CAAC,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YAC3B,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAE,CAAC;YACzD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,yFAAyF;IACzF,GAAG,CAAC,IAAI,CAGL,6BAA6B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACzD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAK,EAA0C,CAAC;QACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;QAEzC,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,SAAS,aAAa,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACrD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAC7D,CAAC;YACF,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAC/E,CAAC;gBACF,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5B,KAAK,EAAE,aAAa,QAAQ,iEAAiE;qBAC9F,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAI,QAAQ,EAAE,aAAa,EAAE,CAAC;oBAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5B,KAAK,EAAE,cAAc,QAAQ,wCAAwC;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC1C,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;YAC9E,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnD,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;gBACjC,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC9B,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,UAAyB,CAAC,CAAC,EAAE,CAAC;gBACpE,CAAC;gBACD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;wBACjD,OAAO,CAAC,GAAG,IAAI,EAAE,UAAyB,CAAC,CAAC;oBAC9C,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAiB,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YAEzE,IAAI,SAAuB,CAAC;YAC5B,IAAI,CAAC;gBACH,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;oBACzC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClF,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAW,EAAE,SAAS,CAAC,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC9C,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;YAElD,aAAa,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC3B,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,SAAS;gBACT,aAAa;gBACb,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,YAAY;YAAE,OAAO,YAAY,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAE7B,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY;aACtB,mBAAmB,CAAC,UAAU,CAAC,EAAE,EAAE,aAAa,CAAC;aACjD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,GAAG,CAAC,GAAG,CAAC,KAAK,CACX,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,EAC/B,iFAAiF,CAClF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAE,CAAC;QAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAE,CAAC;QAClF,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YAC5B,KAAK,EAAE,WAAW;YAClB,aAAa,EAAE,SAAS;YACxB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CACR,sCAAsC,EACtC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9C,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,MAAM,cAAc,GAA0C,IAAI,GAAG,EAAE,CAAC;QACxE,IAAI,kBAAkB,GAAG,EAAE,CAAC;QAC5B,IAAI,oBAAoB,GAAwB,IAAI,CAAC;QACrD,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,cAAc,GAAa,EAAE,CAAC;QAElC,IAAI,CAAC;YACL,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;gBACnD,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;gBACrE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,SAAS,aAAa,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;gBAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,2BAA2B,SAAS,GAAG,EAAE,CAAC,CAAC;gBACrG,CAAC;gBACD,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;gBAEpF,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC9E,sEAAsE;oBACtE,uDAAuD;oBACvD,IAAI,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBAClD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC5B,KAAK,EACH,UAAU,EAAE,6BAA6B,IAAI,CAAC,EAAE,oCAAoC;gCACpF,0DAA0D;yBAC7D,CAAC,CAAC;oBACL,CAAC;oBACD,sCAAsC;oBACtC,IAAI,KAAK,EAAE,MAAM,KAAK,gBAAgB;wBAAE,SAAS;oBACjD,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;wBACzB,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC5B,KAAK,EACH,UAAU,EAAE,iFAAiF;yBAChG,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,0EAA0E;gBAC1E,gFAAgF;gBAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAChE,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5B,KAAK,EAAE,UAAU,QAAQ,uDAAuD;qBACjF,CAAC,CAAC;gBACL,CAAC;gBACD,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEjC,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;oBACzB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACjD,IAAI,CAAC,EAAE,EAAE,CAAC;wBACR,sEAAsE;wBACtE,0EAA0E;wBAC1E,2DAA2D;wBAC3D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC/C,IAAI,KAAK,EAAE,MAAM,KAAK,gBAAgB;4BAAE,SAAS;wBACjD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;4BAChC,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;wBACzC,CAAC;wBACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BAC5B,KAAK,EAAE,UAAU,EAAE,yDAAyD;yBAC7E,CAAC,CAAC;oBACL,CAAC;oBACD,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC;gBAED,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClD,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBACnC,CAAC;gBAED,kBAAkB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAChD,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChF,IAAI,CAAC;oBACH,oBAAoB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;gBACtD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,KAAK,MAAM,GAAG,IAAI,aAAa;wBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACxE,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;wBACzC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAClF,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,YAAY;gBAAE,OAAO,YAAY,CAAC;YACtC,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE7B,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,EAC/C,gFAAgF,CAAC,CAAC;oBACpF,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;wBAC9B,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;wBAC3D,KAAK,MAAM,GAAG,IAAI,aAAa;4BAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC;oBACH,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5B,KAAK,EACH,8BAA8B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,4BAA4B;4BAC3E,mFAAmF;wBACrF,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;4BACjE,KAAK,EAAE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;qBAC1E,CAAC,CAAC;gBACL,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAC3B,qGAAqG,CAAC,CAAC;YAC3G,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,KAAK,IAAI,EAAE;gBACnD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,YAAY,GAAG,WAAW,KAAK,kBAAkB;oBACrD,CAAC,CAAC,oBAAqB;oBACvB,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,SAAuB,CAAC;gBAC5B,IAAI,CAAC;oBACH,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;oBAC3D,KAAK,MAAM,GAAG,IAAI,aAAa;wBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACxE,IAAI,GAAG,YAAY,qBAAqB,EAAE,CAAC;wBACzC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAClF,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,UAAW,EAAE,SAAS,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAC5B,oFAAoF,CAAC,CAAC;oBACxF,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;oBAC3D,KAAK,MAAM,GAAG,IAAI,aAAa;wBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACxE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC5B,KAAK,EAAE,sFAAsF;qBAC9F,CAAC,CAAC;gBACL,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC3B,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC9C,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;gBAClD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACtC,CAAC;oBAAC,OAAO,MAAM,EAAE,CAAC;wBAChB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EACvC,iDAAiD,CAAC,CAAC;oBACvD,CAAC;oBACD,qFAAqF;oBACrF,6EAA6E;oBAC7E,6DAA6D;oBAC7D,IAAI,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;wBAC7B,IAAI,CAAC;4BACH,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;wBAChD,CAAC;wBAAC,OAAO,QAAQ,EAAE,CAAC;4BAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EACzC,mDAAmD,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;oBACD,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,6CAA6C,EAC7C,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,2BAA2B,SAAS,GAAG,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,iEAAiE;QACjE,+DAA+D;QAC/D,6DAA6D;QAC7D,OAAO,cAAc,CAAC,KAAK,IAAI,EAAE;YAC/B,+EAA+E;YAC/E,iFAAiF;YACjF,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,KAAK,EAAE,UAAU,OAAO,yCAAyC;iBAClE,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,KAAK,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBACvC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,KAAK,EAAE,UAAU,OAAO,6CAA6C;iBACtE,CAAC,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAG,SAAS,EAAE,aAAa;oBACrC,CAAC,CAAC,kFAAkF;oBACpF,CAAC,CAAC,4DAA4D,CAAC;gBACjE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,mDAAmD,EACnD,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,2BAA2B,SAAS,GAAG,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1F,IAAI,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,KAAK,EACH,UAAU,OAAO,6BAA6B,IAAI,CAAC,EAAE,IAAI;wBACzD,qEAAqE;wBACrE,8CAA8C;iBACjD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,+CAA+C,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,4CAA4C,EAC5C,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,2BAA2B,SAAS,GAAG,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,WAAW,EAAE,aAAa,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,4CAA4C;aACpD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAChF,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8DAA8D,EAAE,CAAC,CAAC;QAC3G,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,OAAO,+CAA+C,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC5E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC3B,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;gBAC7D,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qFAAqF;YACrF,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,8BAA8B,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC5E,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAChE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,EAAE,EAAE,IAAI;oBACR,OAAO;oBACP,aAAa,EAAE,SAAS;oBACxB,OAAO,EACL,8DAA8D;wBAC9D,gEAAgE;iBACnE,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,YAAY,kBAAkB,IAAI,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAChD,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,EACvC,uDAAuD,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,4BAA4B,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CACF,CAAC;AACJ,CAAC;AAMD,4EAA4E;AAC5E,KAAK,UAAU,oBAAoB,CACjC,GAAoB,EACpB,OAAe;IAEf,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,mDAAmD;AACnD,KAAK,UAAU,oBAAoB,CACjC,GAAoB,EACpB,OAAe;IAEf,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,OAAO,wCAAwC,EAAE,CAAC;IAC3F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,4BAA4B,CACzC,GAAoB,EACpB,OAAe,EACf,QAAiB;IAEjB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ;YAAE,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1E,yFAAyF;IACzF,uFAAuF;IACvF,6DAA6D;IAC7D,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;aAClG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,mCAAmC,CAAC,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IACD,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE;QAC3D,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,GAAoB,EACpB,OAAiB,EACjB,cAAqD;IAErD,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC;gBAAC,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACrD,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC3B,GAAG,QAAQ;gBACX,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,+CAA+C,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/api/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
var yt=Object.defineProperty;var Nt=(t,s,r)=>s in t?yt(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r;var B=(t,s,r)=>Nt(t,typeof s!="symbol"?s+"":s,r);import{r as a,j as e,c as kt}from"./react-BG4Iuztk.js";import{x as St,a as Et}from"./xterm-D5X2JljJ.js";import{L as he,u as Te,a as We,B as Ct,b as Rt,N as Je,R as At,c as pe}from"./router-CApkciQz.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))i(n);new MutationObserver(n=>{for(const o of n)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function r(n){const o={};return n.integrity&&(o.integrity=n.integrity),n.referrerPolicy&&(o.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?o.credentials="include":n.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(n){if(n.ep)return;n.ep=!0;const o=r(n);fetch(n.href,o)}})();const Ie="/api",qe="baxian.token",Se="baxian:unauthorized";function Ge(){try{return typeof localStorage<"u"?localStorage.getItem(qe):null}catch{return null}}function Tt(t){try{localStorage.setItem(qe,t)}catch(s){console.error("Failed to save auth token to localStorage",s)}}function It(){try{localStorage.removeItem(qe)}catch(t){console.error("Failed to clear auth token from localStorage",t)}}function ge(t){const s=Ge();return{...t??{},...s?{Authorization:`Bearer ${s}`}:{}}}class Ee extends Error{constructor(s,r,i){super(r),this.status=s,this.details=i,this.name="ApiError"}}async function je(t){const s=await t.text();let r=s||`HTTP ${t.status}`,i;try{const n=JSON.parse(s);typeof n.error=="string"&&(r=n.error),Array.isArray(n.details)&&(i=n.details)}catch{}throw t.status===401&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(Se)),new Ee(t.status,r,i)}async function le(t){const s=await fetch(`${Ie}${t}`,{headers:ge()});return s.ok||await je(s),s.json()}async function Pt(){const t=await fetch("/health");return t.ok||await je(t),t.json()}async function ie(t,s,r){const i=s!==void 0,n=await fetch(`${Ie}${t}`,{method:"POST",headers:i?ge({"Content-Type":"application/json"}):ge(),body:i?JSON.stringify(s):void 0,signal:r==null?void 0:r.signal});return n.ok||await je(n),n.json()}async function $t(t,s,r){const i=await fetch(`${Ie}${t}`,{method:"PATCH",headers:ge({"Content-Type":"application/json"}),body:s?JSON.stringify(s):void 0,signal:r==null?void 0:r.signal});if(i.ok||await je(i),i.status===204)return;const n=await i.text();if(n)return JSON.parse(n)}async function De(t){const s=await fetch(`${Ie}${t}`,{method:"DELETE",headers:ge()});if(s.ok||await je(s),s.status===204)return;const r=await s.text();if(r)return JSON.parse(r)}const J=encodeURIComponent,O={agents:{list:()=>le("/agents"),get:t=>le(`/agents/${J(t)}`),stop:t=>De(`/agents/${J(t)}/session`),probe:(t,s,r)=>ie("/agents/probe",{mode:t,host:s},r)},tasks:{list:t=>le(`/tasks${t?`?projectId=${J(t)}`:""}`),get:t=>le(`/tasks/${J(t)}`),create:t=>ie("/tasks",t),update:(t,s)=>$t(`/tasks/${J(t)}`,s),retry:t=>ie(`/tasks/${J(t)}/retry`),review:t=>ie(`/tasks/${J(t)}/review`)},projects:{list:()=>le("/projects"),get:t=>le(`/projects/${J(t)}`),create:t=>ie("/projects",t),delete:t=>De(`/projects/${J(t)}`),addAgent:(t,s)=>ie(`/projects/${J(t)}/agents`,s),deleteAgent:(t,s)=>De(`/projects/${J(t)}/agents/${J(s)}`),resumeAgent:(t,s)=>ie(`/projects/${J(t)}/agents/${J(s)}/resume`),bootstrap:t=>ie(`/projects/${J(t)}/bootstrap`)},config:{get:()=>le("/config")},health:{get:Pt},server:{restart:()=>ie("/restart")}},dt=a.createContext(null),Dt={success:"border-[#bbf7d0] bg-[#f0fdf4] text-success",warn:"border-[#fde68a] bg-[#fef3c7] text-warn",error:"border-[#fecaca] bg-[#fef2f2] text-danger"},Ot={success:"✅",warn:"⚠️",error:"❌"};let Lt=1;function Mt({children:t}){const[s,r]=a.useState([]),i=a.useCallback(o=>{r(l=>l.filter(f=>f.id!==o))},[]),n=a.useCallback(o=>{const l=Lt++,f=o.durationMs??3e3;r(j=>[...j,{...o,id:l}]),setTimeout(()=>i(l),f)},[i]);return e.jsxs(dt.Provider,{value:{show:n},children:[t,e.jsx("div",{className:"pointer-events-none fixed right-4 top-4 z-[60] flex flex-col gap-2",children:s.map(o=>e.jsx("div",{className:`pointer-events-auto w-80 rounded-lg border px-4 py-3 shadow-toast ${Dt[o.kind]}`,role:"status",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{"aria-hidden":!0,className:"text-[14px]",children:Ot[o.kind]}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold",children:o.title}),o.body&&e.jsx("div",{className:"mt-1 whitespace-pre-line text-[12px] text-og-700",children:o.body})]}),e.jsx("button",{type:"button",onClick:()=>i(o.id),className:"text-current opacity-50 transition-opacity hover:opacity-100","aria-label":"Dismiss",children:"✕"})]})},o.id))})]})}function fe(){const t=a.useContext(dt);if(!t)throw new Error("useToast must be inside <ToastProvider>");return t}const Ce="baxian.pendingRestart",_t=500,Ft=3e4,ut=a.createContext(null);function zt(){try{const t=localStorage.getItem(Ce);if(!t)return{count:0,baselineStartedAt:null};const s=JSON.parse(t);return{count:typeof s.count=="number"?s.count:0,baselineStartedAt:typeof s.baselineStartedAt=="string"?s.baselineStartedAt:null}}catch{return{count:0,baselineStartedAt:null}}}function Bt(t){try{t.count<=0?localStorage.removeItem(Ce):localStorage.setItem(Ce,JSON.stringify(t))}catch{}}function Qt({children:t}){const s=zt(),[r,i]=a.useState(s.count),[n,o]=a.useState(s.baselineStartedAt),[l,f]=a.useState(s.count>0?"pending":"idle"),[j,p]=a.useState(),d=a.useRef(s.count),x=a.useRef(s.count>0?"pending":"idle"),m=a.useRef(0),h=a.useCallback(S=>{d.current=S,i(S)},[]),u=a.useCallback(S=>{i(A=>{const y=S(A);return d.current=y,y})},[]),v=a.useCallback(S=>{x.current=S,f(S)},[]);a.useEffect(()=>{Bt({count:r,baselineStartedAt:n})},[r,n]),a.useEffect(()=>{let S=!1;(async()=>{try{const y=await O.health.get();if(S)return;o(g=>g!==null&&y.startedAt!==g?(h(0),v("idle"),null):g)}catch{}})();const A=y=>{if(y.key===Ce){if(y.newValue===null){if(x.current==="restarting"&&m.current>0){h(m.current),o(null);return}h(0),o(null),x.current!=="restarting"&&v("idle");return}try{const g=JSON.parse(y.newValue);typeof g.count=="number"&&(x.current==="restarting"&&g.count>d.current&&(m.current+=g.count-d.current),h(g.count),x.current!=="restarting"&&v(g.count>0?"pending":"idle")),typeof g.baselineStartedAt=="string"?o(g.baselineStartedAt):g.baselineStartedAt===null&&o(null)}catch{}}};return window.addEventListener("storage",A),()=>{S=!0,window.removeEventListener("storage",A)}},[h,v]);const c=a.useRef(!1),T=a.useCallback(()=>{u(S=>S+1),x.current==="restarting"?m.current+=1:v("pending"),o(S=>(S!==null||c.current||(c.current=!0,(async()=>{try{const A=await O.health.get();o(y=>y??A.startedAt)}catch{}finally{c.current=!1}})()),S))},[v,u]),R=a.useCallback(async()=>{m.current=0,p(void 0),v("restarting");let S;try{S=(await O.health.get()).startedAt}catch(y){v("failed"),p(`获取重启前 startedAt 失败: ${y instanceof Error?y.message:String(y)}`);return}try{await O.server.restart()}catch(y){if(!(y instanceof Ee&&y.status===409)){v("failed"),p(`触发重启失败: ${y instanceof Error?y.message:String(y)}`);return}}const A=Date.now();for(;Date.now()-A<Ft;){await new Promise(y=>setTimeout(y,_t));try{const y=await O.health.get();if(y.startedAt!==S){const g=m.current;m.current=0,o(g>0?y.startedAt:null),h(g),v(g>0?"pending":"idle");return}}catch{}}v("failed"),p("重启超时(30s 未恢复)。请检查日志或手动 baxian start -c <path>")},[h,v]);return e.jsx(ut.Provider,{value:{phase:l,count:r,error:j,flagDirty:T,triggerRestart:R},children:t})}function Pe(){const t=a.useContext(ut);if(!t)throw new Error("usePendingRestart must be used inside PendingRestartProvider");return t}const Ut=[500,1e3,2e3,4e3,8e3,15e3,3e4];class ht{constructor(s){B(this,"attempts",0);B(this,"timer",null);B(this,"delaysMs");this.opts=s,this.delaysMs=s.delaysMs??Ut}schedule(){if(this.timer||!this.shouldReconnect())return;const s=this.delaysMs[Math.min(this.attempts,this.delaysMs.length-1)];this.attempts+=1,this.timer=setTimeout(()=>{this.timer=null,this.shouldReconnect()&&this.opts.reconnect()},s)}cancel(){this.timer&&(clearTimeout(this.timer),this.timer=null)}reset(){this.attempts=0}shouldReconnect(){return this.opts.shouldReconnect?this.opts.shouldReconnect():!0}}let Ve=0;function Wt(){Ve++;const t=Math.random().toString(36).slice(2,8);return`sub-${Date.now().toString(36)}-${Ve}-${t}`}function qt(t){return Array.from(new TextEncoder().encode(t)).map(s=>s.toString(16).padStart(2,"0")).join("")}function Gt(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/stream`}const Ht=(t,s)=>s&&s.length>0?new WebSocket(t,s):new WebSocket(t);class Kt{constructor(s={}){B(this,"wsUrl");B(this,"wsFactory");B(this,"tokenProvider");B(this,"ws",null);B(this,"subs",new Map);B(this,"snapshotPending",new Set);B(this,"preSubscribeQueue",new Map);B(this,"outbox",[]);B(this,"reconnectScheduler");B(this,"explicitlyClosed",!1);this.wsUrl=s.wsUrl??Gt(),this.wsFactory=s.wsFactory??Ht,this.tokenProvider=s.tokenProvider??Ge,this.reconnectScheduler=new ht({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.subs.size>0})}subscribe(s){const r=Wt(),i={subscriberId:r,agentId:s.agentId,mode:s.mode,onSnapshot:s.onSnapshot,onData:s.onData,onError:s.onError,onSessionGone:s.onSessionGone};return this.subs.set(r,i),this.snapshotPending.add(r),this.preSubscribeQueue.set(r,[]),this.ensureSocket(),this.wsSendOrQueue({op:"subscribe",subscriberId:r,agentId:s.agentId,mode:s.mode}),{subscriberId:r,unsubscribe:()=>this.unsubscribe(r)}}send(s,r){if(this.subs.has(s)){if(this.snapshotPending.has(s)){this.outbox.push({op:"input",subscriberId:s,data:r});return}this.wsSendOrQueue({op:"input",subscriberId:s,data:r})}}resize(s,r,i){const n=this.subs.get(s);n&&(n.lastSize={cols:r,rows:i},!this.snapshotPending.has(s)&&this.wsSendOrQueue({op:"resize",subscriberId:s,cols:r,rows:i}))}ping(){this.wsSendOrQueue({op:"ping"})}close(){if(this.explicitlyClosed=!0,this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.ws){try{this.ws.close()}catch{}this.ws=null}this.subs.clear(),this.snapshotPending.clear(),this.preSubscribeQueue.clear(),this.outbox=[]}unsubscribe(s){this.subs.has(s)&&(this.subs.delete(s),this.snapshotPending.delete(s),this.preSubscribeQueue.delete(s),this.wsSendOrQueue({op:"unsubscribe",subscriberId:s}),this.subs.size===0&&this.teardownSocket())}teardownSocket(){if(this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.outbox=[],this.ws){try{this.ws.close()}catch{}this.ws=null}}ensureSocket(){this.explicitlyClosed||this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)||this.openSocket()}openSocket(){if(this.explicitlyClosed)return;this.reconnectScheduler.cancel();const s=this.tokenProvider(),r=s?[`baxian.token.${qt(s)}`]:void 0;let i;try{i=this.wsFactory(this.wsUrl,r)}catch(n){console.warn("[pane-stream] WebSocket constructor threw:",n),this.scheduleReconnect();return}this.ws=i,i.onopen=()=>{if(i!==this.ws)return;this.reconnectScheduler.reset();for(const o of this.subs.values()){this.snapshotPending.add(o.subscriberId),this.preSubscribeQueue.set(o.subscriberId,[]),o.snapshotSeq=void 0;try{i.send(JSON.stringify({op:"subscribe",subscriberId:o.subscriberId,agentId:o.agentId,mode:o.mode}))}catch(l){console.warn("[pane-stream] resubscribe send failed:",l)}}const n=this.outbox;this.outbox=[];for(const o of n)if(o.op!=="subscribe"){if("subscriberId"in o&&o.subscriberId){if(!this.subs.has(o.subscriberId))continue;if(this.snapshotPending.has(o.subscriberId)&&o.op!=="unsubscribe"){this.outbox.push(o);continue}}try{i.send(JSON.stringify(o))}catch(l){console.warn("[pane-stream] outbox flush failed:",l)}}},i.onmessage=n=>{if(i!==this.ws)return;let o;try{const l=typeof n.data=="string"?n.data:String(n.data);o=JSON.parse(l)}catch{return}this.handleMessage(o)},i.onclose=()=>{i===this.ws&&(this.ws=null,!this.explicitlyClosed&&this.subs.size!==0&&this.scheduleReconnect())},i.onerror=()=>{}}scheduleReconnect(){this.reconnectScheduler.schedule()}wsSendOrQueue(s){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(s));return}catch(r){console.warn("[pane-stream] send failed, will queue:",r)}this.outbox.push(s)}handleMessage(s){var r,i;switch(s.type){case"snapshot":this.handleSnapshot(s);break;case"subscribed":this.handleSubscribed(s);break;case"data":this.dispatch(s);break;case"session_gone":for(const n of[...this.subs.values()])n.agentId===s.agentId&&((r=n.onSessionGone)==null||r.call(n));break;case"error":{if(s.subscriberId){const n=this.subs.get(s.subscriberId);(i=n==null?void 0:n.onError)==null||i.call(n,{code:s.code,message:s.message})}else console.warn("[pane-stream] connection-level error:",s.code,s.message);break}}}handleSnapshot(s){const r=this.subs.get(s.subscriberId);r&&r.onSnapshot({cols:s.cols,rows:s.rows,data:s.data})}handleSubscribed(s){const r=this.subs.get(s.subscriberId);if(!r)return;r.snapshotSeq=s.snapshotSeq,r.lastSize||(r.lastSize={cols:s.cols,rows:s.rows}),this.snapshotPending.delete(s.subscriberId);const i=this.preSubscribeQueue.get(s.subscriberId);if(this.preSubscribeQueue.delete(s.subscriberId),i)for(const n of i)n.seq>s.snapshotSeq&&r.onData(n.data);r.mode==="full"&&r.lastSize&&this.wsSendOrQueue({op:"resize",subscriberId:r.subscriberId,cols:r.lastSize.cols,rows:r.lastSize.rows}),this.flushOutboxForSub(s.subscriberId)}flushOutboxForSub(s){if(this.outbox.length===0||!this.ws||this.ws.readyState!==WebSocket.OPEN)return;const r=[];for(const i of this.outbox)if("subscriberId"in i&&i.subscriberId===s&&i.op!=="subscribe")try{this.ws.send(JSON.stringify(i))}catch(n){console.warn("[pane-stream] flushOutboxForSub send failed:",n)}else r.push(i);this.outbox=r}dispatch(s){for(const r of this.subs.values())if(r.agentId===s.agentId)if(this.snapshotPending.has(r.subscriberId)){const i=this.preSubscribeQueue.get(r.subscriberId);i&&i.push({seq:s.seq,data:s.data})}else r.onData(s.data)}}let Oe=null;function Le(){return Oe||(Oe=new Kt),Oe}function Jt(t){const{agentId:s,mode:r}=t,i=a.useRef(null),n=a.useRef({onSnapshot:t.onSnapshot,onData:t.onData,onError:t.onError,onSessionGone:t.onSessionGone});n.current={onSnapshot:t.onSnapshot,onData:t.onData,onError:t.onError,onSessionGone:t.onSessionGone},a.useEffect(()=>{const j=Le().subscribe({agentId:s,mode:r,onSnapshot:p=>n.current.onSnapshot(p),onData:p=>n.current.onData(p),onError:p=>{var d,x;return(x=(d=n.current).onError)==null?void 0:x.call(d,p)},onSessionGone:()=>{var p,d;return(d=(p=n.current).onSessionGone)==null?void 0:d.call(p)}});return i.current=j.subscriberId,()=>{i.current=null,j.unsubscribe()}},[s,r]);const o=a.useCallback(f=>{const j=i.current;j&&Le().send(j,f)},[]),l=a.useCallback((f,j)=>{const p=i.current;p&&Le().resize(p,f,j)},[]);return{send:o,resize:l}}const Vt=[{key:"up",label:"上",path:"M12 5l-6 6m6-6l6 6m-6-6v14"},{key:"down",label:"下",path:"M12 19l6-6m-6 6l-6-6m6 6V5"},{key:"left",label:"左",path:"M5 12l6-6m-6 6l6 6m-6-6h14"},{key:"right",label:"右",path:"M19 12l-6-6m6 6l-6 6m6-6H5"}],ve=Object.fromEntries(Vt.map(t=>[t.key,t]));function ye({arrow:t,onPress:s}){return e.jsx("button",{type:"button","aria-label":`方向键 ${t.label}`,"data-arrow":t.key,onMouseDown:r=>r.preventDefault(),onClick:()=>s(t.key),className:"flex h-8 w-8 items-center justify-center rounded border border-hairline bg-surface text-og-700 transition-colors hover:bg-og-100 hover:text-og-1000 active:bg-og-200",children:e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:t.path})})})}function Yt({onKey:t,className:s}){return e.jsxs("div",{role:"group","aria-label":"终端方向键",className:s??"flex flex-none flex-col items-center gap-1 border-t border-hairline bg-page px-3 py-2",children:[e.jsx(ye,{arrow:ve.up,onPress:t}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(ye,{arrow:ve.left,onPress:t}),e.jsx(ye,{arrow:ve.down,onPress:t}),e.jsx(ye,{arrow:ve.right,onPress:t})]})]})}const Zt={up:"A",down:"B",right:"C",left:"D"};function Xt(t,s){return(s?"\x1BO":"\x1B[")+Zt[t]}const Ye=18,es=250,ts=256*1024,Ze="#fdfdfd",ss='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',ns={background:Ze,foreground:"#474c55",cursor:"#1348dc",cursorAccent:Ze,selectionBackground:"#eaf0ff",black:"#0d0d0f",red:"#b91c1c",green:"#15803d",yellow:"#b45309",blue:"#1348dc",magenta:"#9333ea",cyan:"#0e7490",white:"#474c55",brightBlack:"#878e9b",brightRed:"#dc2626",brightGreen:"#16a34a",brightYellow:"#d97706",brightBlue:"#3080ff",brightMagenta:"#a855f7",brightCyan:"#0891b2",brightWhite:"#0d0d0f"},rs=/\x1b\[(?:\?[\d;]*c|>[\d;]*c|\??\d+;\d+R|\d+n)/g;function as(t){return t.replace(rs,"")}function ze({agentId:t,mode:s,interactive:r=!1,maxLines:i,className:n,autoFocus:o=!0,deferFullUntilFocus:l=!1,arrowKeys:f=!1}){const j=a.useRef(null),p=a.useRef(null),d=a.useRef(null),x=a.useRef(!1),m=a.useRef(""),h=a.useRef([]),u=a.useRef(0),v=a.useRef(null),c=a.useRef(null),T=a.useRef(Promise.resolve()),R=a.useRef(0),[S,A]=a.useState(null),[y,g]=a.useState(!1),C=`${t}\0${s}\0${l?"1":"0"}`,[P,L]=a.useState({key:C,active:!1}),M=P.key===C&&P.active,W=s==="full"&&l,I=W&&!M?"preview":s,_=r&&I==="full",z=(b,D)=>D.length===0?Promise.resolve():new Promise(E=>{try{b.write(D,()=>E())}catch(G){console.warn("[pane-terminal] write failed:",G),E()}}),q=!!(i&&i>0),H=()=>{if(!q)return;const b=j.current,D=p.current;if(!b||!D)return;const G=(D.buffer.active.cursorY+1)*Ye;b.scrollTop=Math.max(0,G-b.clientHeight)},Y=(b,D)=>{T.current=T.current.then(async()=>{const E=p.current;if(!(!E||D!==R.current))try{await b(E),H()}catch(G){console.warn("[pane-terminal] terminal task failed:",G)}}).catch(E=>{console.warn("[pane-terminal] write chain failed:",E)})},ee=(b,D)=>{Y(E=>z(E,b),D)},Z=()=>{v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),c.current!==null&&(clearTimeout(c.current),c.current=null)},te=()=>{Z(),h.current=[],u.current=0},V=()=>{Z();const b=h.current;b.length!==0&&(h.current=[],u.current=0,ee(b.join(""),R.current))},X=b=>{if(b.length!==0){if(h.current.push(b),u.current+=b.length,u.current>=ts){V();return}v.current===null&&(v.current=requestAnimationFrame(V)),c.current===null&&(c.current=setTimeout(V,es))}},{send:N,resize:Q}=Jt({agentId:t,mode:I,onSnapshot:({cols:b,rows:D,data:E})=>{if(p.current)try{const re=R.current+1;R.current=re,te(),Y(async ae=>{ae.reset(),b>0&&D>0&&ae.resize(b,D),await z(ae,E)},re)}catch(re){console.warn("[pane-terminal] snapshot write failed:",re)}},onData:b=>{X(b)},onError:b=>A(`${b.code}: ${b.message}`),onSessionGone:()=>g(!0)});a.useEffect(()=>{A(null),g(!1)},[t,I]),a.useEffect(()=>{m.current=""},[C]),a.useEffect(()=>{if(I!=="full")return;const b=m.current;b.length!==0&&(m.current="",N(b))},[N,I]);const F=a.useCallback(()=>{!r||!W||M||(x.current=!0,L({key:C,active:!0}))},[C,M,r,W]),$=a.useCallback(b=>{const D=as(b);if(D.length!==0){if(W&&(!M||m.current.length>0)){m.current+=D,F();return}N(D)}},[F,M,N,W]);a.useEffect(()=>{const b=j.current;if(!b)return;let D=!1;const E=new St.Terminal({cursorBlink:r,disableStdin:!r,theme:ns,fontFamily:ss,fontSize:13,lineHeight:1.4,scrollback:I==="full"?5e3:1e3}),G=new Et.FitAddon;if(E.loadAddon(G),E.open(b),p.current=E,d.current=G,r&&(o||x.current)){x.current=!1;try{E.focus()}catch{}}r&&E.onData($);const re=()=>b.clientWidth>0&&b.clientHeight>0,ae=($e=!1)=>{if(!re())return!1;const wt=E.cols,vt=E.rows;try{G.fit()}catch{return!1}return E.cols>0&&E.rows>0&&($e||E.cols!==wt||E.rows!==vt)&&Q(E.cols,E.rows),!0};let k=null,K=null,se=null,ne=0;const xe=()=>{k||(k=new ResizeObserver(()=>{K&&clearTimeout(K),K=setTimeout(()=>{K=null,ae()},100)}),k.observe(b))},me=()=>{se=requestAnimationFrame(()=>{if(se=null,!(D||!_)){if(ae(!0)){xe();return}if(ne++<5){me();return}xe()}})};return me(),()=>{D=!0,se!==null&&cancelAnimationFrame(se),v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),c.current!==null&&(clearTimeout(c.current),c.current=null),R.current++,h.current=[],u.current=0,T.current=Promise.resolve(),K&&clearTimeout(K),k==null||k.disconnect(),p.current=null,d.current=null;try{E.dispose()}catch($e){console.warn("[pane-terminal] dispose failed:",$e)}}},[t,o,_,$,r,I,Q]);const U=()=>{var b;if(r){F();try{(b=p.current)==null||b.focus()}catch{}}},w=i&&i>0?{maxHeight:`${i*Ye}px`}:void 0;return e.jsxs("div",{className:n??"flex flex-col h-full w-full min-h-0 bg-[#fdfdfd]",children:[(S||y)&&e.jsx("div",{className:"border-b border-[#fecaca] bg-[#fef2f2] px-3 py-1 font-mono text-[11px] text-danger",children:y?"session ended":S}),e.jsx("div",{className:"flex flex-1 min-h-0 px-2 py-1.5",style:w,children:e.jsx("div",{ref:j,className:"flex-1 min-h-0 overflow-hidden",onMouseDown:U})}),r&&f&&e.jsx(Yt,{onKey:b=>{var E,G;const D=!!((G=(E=p.current)==null?void 0:E.modes)!=null&&G.applicationCursorKeysMode);$(Xt(b,D))}})]})}const is={unknown:{label:"Unknown",cls:"pill pill-idle"},idle:{label:"Idle",cls:"pill pill-idle"},pending:{label:"Pending user",cls:"pill pill-warn"},working:{label:"Working",cls:"pill pill-live"},waiting:{label:"Waiting",cls:"pill pill-review"},error:{label:"Error",cls:"pill pill-warn"}},os={present:{label:"Session present",modifier:"status-dot--healthy"},absent:{label:"No session",modifier:"status-dot--warn"},unreachable:{label:"Host unreachable",modifier:"status-dot--danger"},unknown:{label:"Session unknown",modifier:"status-dot--warn"},starting:{label:"Starting session",modifier:"status-dot--info"}};function cs({state:t}){const{label:s,modifier:r}=os[t];return e.jsx("span",{role:"img","aria-label":s,title:s,className:`status-dot ml-2 ${r}`})}function ls({agent:t,projectId:s,role:r,onDeleted:i,pendingRestart:n=!1,terminalLoading:o=!1,showTaskBinding:l=!0,terminalMode:f="activity-preview"}){var w,b,D,E,G,re,ae;const[j,p]=a.useState(!1),[d,x]=a.useState(null),{show:m}=fe(),{flagDirty:h}=Pe(),[u,v]=a.useState(!1),[c,T]=a.useState(null),[R,S]=a.useState(!1),[A,y]=a.useState(!1),[g,C]=a.useState(!1),[P,L]=a.useState(!1),M=a.useRef(null),W=a.useRef(null),I=a.useId(),_=a.useId();a.useEffect(()=>{if(!P)return;const k=se=>{var xe,me;const ne=se.target;ne&&((xe=W.current)!=null&&xe.contains(ne)||(me=M.current)!=null&&me.contains(ne)||L(!1))},K=se=>{var ne;se.key==="Escape"&&(L(!1),(ne=M.current)==null||ne.focus())};return document.addEventListener("mousedown",k),document.addEventListener("keydown",K),()=>{document.removeEventListener("mousedown",k),document.removeEventListener("keydown",K)}},[P]),a.useEffect(()=>{var K;if(!P)return;const k=(K=W.current)==null?void 0:K.querySelector('[role="menuitem"]:not([disabled])');k==null||k.focus()},[P]);const z=(w=t.binding)==null?void 0:w.taskId,q=((b=t.binding)==null?void 0:b.status)==="awaiting_human",H=!!((D=t.binding)!=null&&D.creationToken)&&!((E=t.binding)!=null&&E.paneId)&&!q&&t.reason!=="PENDING_HUMAN",Y=H?{label:"Starting",cls:"pill pill-review"}:is[t.runtimeStatus],ee=H?"starting":t.tmuxSessionStatus,Z=f==="activity-preview"&&!H&&(t.runtimeStatus==="working"||t.runtimeStatus==="pending"),te=f==="embedded-full",V=o||n||H,X=o?"Agent 状态加载中":n?"重启 baxian server 后可用":"Agent 正在启动",N=async()=>{p(!0),x(null);try{await O.agents.stop(t.id)}catch(k){x(k instanceof Error?k.message:String(k))}finally{p(!1)}},Q=async()=>{if(z&&window.confirm(`请 QA 对 task ${z} 重审?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`)){S(!0);try{const k=await O.tasks.review(z);m({kind:"success",title:`已派 QA 重审 (round ${k.reviewRound})`})}catch(k){m({kind:"error",title:"Review 派发失败",body:k instanceof Error?k.message:String(k)})}finally{S(!1)}}},F=async()=>{C(!0);try{(await O.projects.bootstrap(s)).ok?m({kind:"success",title:"Bootstrap retry 完成",body:"agent 状态将在下一次刷新生效。"}):m({kind:"warn",title:"Bootstrap retry 仍失败",body:"看一下红色错误卡的最新原因,按提示修复后再试。"})}catch(k){m({kind:"error",title:"Bootstrap retry 失败",body:k instanceof Error?k.message:String(k)})}finally{C(!1)}},$=async()=>{if(window.confirm(`确认 Resume Agent ${t.id}?baxian 会清除 awaiting_human 状态,agent 重新可派遣。`)){y(!0);try{const k=await O.projects.resumeAgent(s,t.id);m({kind:"success",title:`Agent ${t.id} 已 Resume`,body:k.releasedBinding?"原任务已释放,agent 可接新任务。":"保留绑定(原任务仍 active)。"})}catch(k){m({kind:"error",title:"Resume 失败",body:k instanceof Error?k.message:String(k)})}finally{y(!1)}}},U=async()=>{if(window.confirm(`确认删除 Agent ${t.id}?此操作不可撤销`)){v(!0),T(null);try{const k=await O.projects.deleteAgent(s,t.id);k!=null&&k.restartRequired&&h();const K=(k==null?void 0:k.removed)??[t.id];if(K.length>1){const se=K.filter(ne=>ne!==t.id).join(", ");m({kind:"warn",title:`已删除 Agent ${t.id}`,body:`配对的 QA Agent ${se} 也被一并移除。`})}else m({kind:"success",title:`Agent ${t.id} 已删除`});i==null||i()}catch(k){T(k instanceof Error?k.message:String(k))}finally{v(!1)}}};return e.jsxs("div",{className:"card flex h-full min-w-0 flex-col p-4",children:[e.jsxs("div",{className:"mb-3 flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] font-medium uppercase tracking-[0.05em] text-og-500",children:r}),e.jsx("span",{className:"min-w-0 truncate whitespace-nowrap font-display text-[14px] font-semibold text-og-1000",title:t.id,children:t.id})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-1",children:[q&&e.jsx("span",{className:"pill pill-warn",title:((G=t.binding)==null?void 0:G.awaitingReason)??"需人工处理",children:"Held"}),e.jsx("span",{className:Y.cls,children:Y.label}),t.stale&&e.jsx("span",{className:"pill pill-warn",title:t.observedAt?`Last observed at ${t.observedAt}`:void 0,children:"Stale"}),e.jsx(cs,{state:ee})]})]}),H&&e.jsx("div",{className:"mb-2 rounded-md border border-accent-soft bg-accent-soft/40 px-2.5 py-2 text-[12px] text-accent",children:"Agent 正在启动,终端可用后会自动刷新。"}),q&&e.jsxs("div",{className:"mb-2 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-2 text-[12px] text-warn",children:[e.jsx("span",{className:"font-mono",children:(re=t.binding)==null?void 0:re.awaitingPhase}),((ae=t.binding)==null?void 0:ae.awaitingReason)&&e.jsxs("span",{children:[" · ",t.binding.awaitingReason]})]}),!H&&t.runtimeStatus==="pending"&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-2 text-[12px] text-warn",children:[e.jsx("div",{className:"font-medium",children:"等待人工介入"}),e.jsxs("div",{children:["Agent 正在等待人工输入。请打开 ",e.jsx(he,{to:`/terminal/${t.id}`,className:"text-accent hover:text-accent-hover underline",children:"Terminal"})," 处理; 处理完后状态会随下一次观测刷新。"]})]}),t.latestError&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fecaca] bg-[#fef2f2] px-2.5 py-2 text-[12px] text-danger",children:[e.jsx("div",{className:"break-words font-medium",children:t.latestError.message}),e.jsxs("div",{className:"font-mono text-[11px] opacity-80",children:[t.latestError.reason," · ",t.latestError.occurredAt]})]}),t.latestBootstrapError&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fecaca] bg-[#fef2f2] px-2.5 py-2 text-[12px] text-danger",children:[e.jsx("div",{className:"break-words font-medium",children:t.latestBootstrapError.message}),t.latestBootstrapError.recommendation&&e.jsx("div",{className:"break-words",children:t.latestBootstrapError.recommendation}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"truncate font-mono text-[11px] opacity-80",children:[t.latestBootstrapError.reason," · ",t.latestBootstrapError.occurredAt]}),e.jsx("button",{type:"button",onClick:F,disabled:g,className:"btn-secondary shrink-0 !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger hover:!text-danger",children:g?"Retrying…":"Retry bootstrap"})]})]}),l&&z&&e.jsxs("div",{className:"mb-2 text-[12px] text-og-500",children:["Task: ",e.jsx("span",{className:"font-mono text-og-700",children:z})]}),Z&&e.jsx("div",{className:"mb-2 overflow-hidden rounded-md border border-hairline bg-surface",children:e.jsx(ze,{agentId:t.id,mode:"preview",maxLines:6,interactive:!1})}),te&&e.jsx("div",{className:"mb-2 mt-3 h-80 min-h-0 overflow-hidden rounded-md border border-hairline bg-surface",children:V?e.jsx("div",{className:"flex h-full items-center justify-center px-3 text-[13px] text-og-500",children:X}):e.jsx(ze,{agentId:t.id,mode:"full",interactive:!0,autoFocus:!1,deferFullUntilFocus:!0})}),n&&e.jsx("div",{className:"mb-2 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-1.5 text-[12px] text-warn",children:"⚠️ 重启 baxian server 后生效"}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[V?e.jsx("span",{className:"cursor-not-allowed text-[13px] text-og-400",title:X,children:"Terminal"}):e.jsx(he,{to:`/terminal/${t.id}`,className:"btn-secondary",children:"Terminal"}),!n&&t.runtimeStatus==="working"&&e.jsx("button",{onClick:N,disabled:j,className:"btn-ghost !text-danger hover:!bg-[#fef2f2]",children:j?"Stopping…":"Stop"}),d&&e.jsx("span",{className:"text-[12px] text-danger",children:d}),q&&e.jsx("button",{type:"button",onClick:$,disabled:A,title:"清除 awaiting_human 状态,让 agent 重新可派遣",className:"btn-ghost !text-warn hover:!bg-[#fef3c7]/60",children:A?"Resuming…":"Resume"}),!n&&z&&r==="dev"&&e.jsx("button",{type:"button",onClick:Q,disabled:R,title:`让 QA 立即对 task ${z} 跑一轮 review(需要该 task 已有 PR)`,className:"btn-ghost !text-accent hover:!bg-accent-soft",children:R?"Dispatching…":"Request QA review"}),e.jsxs("div",{className:"relative ml-auto",children:[e.jsx("button",{ref:M,id:_,type:"button",onClick:()=>L(k=>!k),disabled:u,"aria-haspopup":"menu","aria-expanded":P,"aria-controls":I,"aria-label":`Agent ${t.id} 操作菜单`,className:"flex h-8 w-8 items-center justify-center rounded text-og-500 transition-colors hover:bg-og-100 hover:text-og-1000 disabled:cursor-not-allowed disabled:opacity-50",children:e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("circle",{cx:"12",cy:"12",r:"1"}),e.jsx("circle",{cx:"12",cy:"5",r:"1"}),e.jsx("circle",{cx:"12",cy:"19",r:"1"})]})}),P&&e.jsx("div",{ref:W,id:I,role:"menu","aria-labelledby":_,className:"absolute right-0 bottom-full z-10 mb-1 min-w-[140px] rounded-md border border-hairline bg-surface py-1 shadow-md",children:e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{L(!1),U()},disabled:u,className:"block w-full px-3 py-1.5 text-left text-[13px] text-danger hover:bg-[#fef2f2] disabled:opacity-50",children:u?"删除中…":"删除"})})]}),c&&e.jsx("span",{className:"text-[12px] text-danger",children:c})]})]})}const ds=new Set(["in_progress","review","fixing","approved"]);function ft({group:t,projectId:s,agentsById:r,agentsLoaded:i,agentsError:n=!1,tasks:o,onDeleted:l,terminalMode:f="activity-preview"}){const j=t.find(h=>h.role==="dev")??t[0],p=t.find(h=>h.role==="qa"),d=o.filter(h=>us(h,j==null?void 0:j.id,p==null?void 0:p.id)),x=`Agent group ${t.map(h=>h.id).join(" / ")}`,m=f==="embedded-full"?t.length<=1?"lg:grid-cols-1":t.length===2?"lg:grid-cols-2":t.length===3?"lg:grid-cols-3":"lg:grid-cols-4":"sm:grid-cols-2";return e.jsxs("div",{role:"group","aria-label":x,className:"min-w-0",children:[d.length>0?e.jsx("div",{className:"card mb-2 max-h-28 overflow-y-auto divide-y divide-hairline",children:d.map(h=>{const u=h.phase==="spec"?h.specReviewRound??0:h.reviewRound;return e.jsxs(he,{to:`/task/${h.id}`,className:"flex items-center gap-3 px-3 py-2 text-[13px] transition-colors hover:bg-og-50/60",children:[e.jsxs("div",{className:"min-w-0 flex-1 flex items-center gap-2",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] text-og-500",children:h.id}),e.jsx("span",{className:"truncate text-og-1000",children:h.title})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[e.jsx("span",{className:"pill",children:h.status}),e.jsxs("span",{"aria-label":`Round ${u}`,className:"pill pill-review",children:["Round ",u]})]})]},h.id)})}):e.jsx("div",{className:"mb-2 rounded-lg border border-hairline bg-surface px-3 py-2 text-[13px] text-og-400","aria-label":`${x} no active task`,children:"暂无任务"}),e.jsx("div",{className:`grid grid-cols-1 ${m} gap-4`,children:t.map(h=>{const u=r.get(h.id),v=u??{id:h.id,projectId:s,runtimeStatus:"unknown",tmuxSessionStatus:"unknown",stale:!0};return e.jsx(ls,{agent:v,projectId:s,role:h.role,pendingRestart:i&&!u,terminalLoading:!i&&!u&&!n,onDeleted:l,showTaskBinding:!1,terminalMode:f},h.id)})})]})}function us(t,s,r){return!(!s||!ds.has(t.status)||!(t.agentId===s||t.preferredAgentId===s)||r&&t.qaAgentId&&t.qaAgentId!==r)}const hs={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl"},Xe='input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex]:not([tabindex="-1"])';function we({open:t,onClose:s,title:r,children:i,size:n="md"}){const o=a.useRef(null),l=a.useRef(null),f=a.useRef(s);return a.useEffect(()=>{f.current=s},[s]),a.useEffect(()=>{if(!t)return;l.current=document.activeElement;const j=x=>{if(x.key==="Escape"){f.current();return}if(x.key!=="Tab")return;const m=o.current;if(!m)return;const h=Array.from(m.querySelectorAll(Xe)).filter(T=>T.offsetParent!==null||T===document.activeElement);if(h.length===0){x.preventDefault();return}const u=h[0],v=h[h.length-1],c=document.activeElement;x.shiftKey&&(c===u||!m.contains(c))?(x.preventDefault(),v.focus()):!x.shiftKey&&(c===v||!m.contains(c))&&(x.preventDefault(),u.focus())};document.addEventListener("keydown",j);const p=document.body.style.overflow;document.body.style.overflow="hidden";const d=o.current;if(d){const x=d.querySelector(Xe);x==null||x.focus()}return()=>{var x,m;document.removeEventListener("keydown",j),document.body.style.overflow=p,(m=(x=l.current)==null?void 0:x.focus)==null||m.call(x)}},[t]),t?e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-og-1000/45 px-3 sm:px-4",onClick:()=>f.current(),role:"presentation",children:e.jsxs("div",{ref:o,className:`w-full ${hs[n]} max-h-[90vh] overflow-auto rounded-lg border border-og-100 bg-surface shadow-modal`,onClick:j=>j.stopPropagation(),role:"dialog","aria-modal":"true","aria-label":r,children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-hairline px-6 py-4",children:[e.jsx("h2",{className:"font-display text-[16px] font-semibold tracking-tight text-og-1000",children:r}),e.jsx("button",{type:"button",onClick:()=>f.current(),className:"text-og-400 transition-colors hover:text-og-800","aria-label":"Close",children:"✕"})]}),e.jsx("div",{className:"px-6 py-5",children:i})]})}):null}const fs=/^[a-z][a-z0-9-]{1,31}$/,xs=/^[A-Za-z0-9_-][A-Za-z0-9._-]*\/[A-Za-z0-9_-][A-Za-z0-9._-]*$/,et="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",Me="mb-1.5 block text-[12px] font-medium text-og-700",tt="mt-1 text-[12px] text-danger";function ms({open:t,onClose:s,onCreated:r}){const[i,n]=a.useState(""),[o,l]=a.useState(""),[f,j]=a.useState(null),[p,d]=a.useState(!1),[x,m]=a.useState(null),[h,u]=a.useState({}),[v,c]=a.useState(new Set),T=a.useRef(0),{show:R}=fe(),{flagDirty:S}=Pe();a.useEffect(()=>{if(!t)return;T.current+=1;const C=T.current;n(""),l(""),j(null),m(null),u({}),c(new Set),O.config.get().then(P=>{C===T.current&&c(new Set(P.project.map(L=>L.id)))}).catch(()=>{})},[t]);const A=()=>{p||s()},y=()=>{const C={};return i?fs.test(i)?v.has(i)&&(C.id="该 id 已被占用"):C.id="小写字母开头,只含 a-z 0-9 -,长度 2-32":C.id="必填",o?xs.test(o)||(C.repo="需为 owner/repo 形式"):C.repo="必填",u(C),Object.keys(C).length===0},g=async C=>{if(C.preventDefault(),!!y()){d(!0),m(null);try{const P=await O.projects.create({id:i,repo:o,merge:f});P.restartRequired&&S(),R({kind:"success",title:`项目 ${P.project.id} 已创建`}),r(P.project.id)}catch(P){m(P instanceof Error?P.message:String(P))}finally{d(!1)}}};return e.jsx(we,{open:t,onClose:A,title:"新建项目",size:"md",children:e.jsxs("form",{onSubmit:g,className:"space-y-4",children:[x&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:x}),e.jsxs("div",{children:[e.jsx("label",{className:Me,htmlFor:"proj-id",children:"项目 ID"}),e.jsx("input",{id:"proj-id",type:"text",value:i,onChange:C=>n(C.target.value),className:et,placeholder:"kongkong",disabled:p}),h.id&&e.jsx("div",{className:tt,children:h.id})]}),e.jsxs("div",{children:[e.jsx("label",{className:Me,htmlFor:"proj-repo",children:"GitHub 仓库"}),e.jsx("input",{id:"proj-repo",type:"text",value:o,onChange:C=>l(C.target.value),className:et,placeholder:"rockdai/baxian",disabled:p}),h.repo&&e.jsx("div",{className:tt,children:h.repo})]}),e.jsxs("div",{children:[e.jsx("span",{className:Me,children:"合并策略"}),e.jsxs("label",{className:"mb-1 flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"merge",checked:f===null,onChange:()=>j(null),disabled:p,className:"h-3.5 w-3.5 accent-[#1348dc]"}),e.jsx("span",{className:"text-[13px] text-og-800",children:"人类合并(默认)"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"merge",checked:f==="auto",onChange:()=>j("auto"),disabled:p,className:"h-3.5 w-3.5 accent-[#1348dc]"}),e.jsx("span",{className:"text-[13px] text-og-800",children:"QA Approve 后自动合并"})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:A,disabled:p,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:p,className:"btn-primary",children:p?"创建中…":"创建"})]})]})})}const st=/^[a-z][a-z0-9-]{1,31}$/,ps=500,de="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",oe="mb-1.5 block text-[12px] font-medium text-og-700",nt="mt-1 text-[12px] text-danger",_e="mt-1 text-[12px] text-og-500",ue="h-3.5 w-3.5 accent-[#1348dc]",rt={id:"",role:"dev",pairWith:"",mode:"local",hostname:"",user:"",runtime:"",workdir:"",yolo:!0,model:"",addDirs:""};function xt({open:t,onClose:s,projectId:r,onCreated:i}){var X;const[n,o]=a.useState(rt),[l,f]=a.useState(null),[j,p]=a.useState(new Set),[d,x]=a.useState(null),[m,h]=a.useState(!1),[u,v]=a.useState(!1),[c,T]=a.useState(null),R=a.useRef(null),S=a.useRef(null),A=a.useRef(0),{show:y}=fe(),{flagDirty:g}=Pe();a.useEffect(()=>{if(!t)return;A.current+=1;const N=A.current;o(rt),f(null),p(new Set),x(null),h(!1),T(null),O.config.get().then(Q=>{if(N!==A.current)return;const F=Q.project.find(U=>U.id===r)??null;f(F);const $=new Set;Q.project.forEach(U=>U.agent.forEach(w=>w.forEach(b=>$.add(b.id)))),p($)}).catch(()=>{})},[t,r]);const C=()=>{u||s()},P=a.useCallback(()=>{R.current&&R.current.abort();const N=new AbortController;R.current=N,h(!0),T(null);const Q=n.mode==="remote"?{hostname:n.hostname,user:n.user||void 0}:void 0;O.agents.probe(n.mode,Q,{signal:N.signal}).then(F=>{N.signal.aborted||(x(F),T(null))}).catch(F=>{N.signal.aborted||(x(null),T(F instanceof Error?F.message:String(F)))}).finally(()=>{R.current===N&&h(!1)})},[n.mode,n.hostname,n.user]);a.useEffect(()=>{if(t&&(x(null),R.current&&R.current.abort(),!(n.mode==="remote"&&!n.hostname)))return S.current&&clearTimeout(S.current),S.current=setTimeout(P,ps),()=>{S.current&&clearTimeout(S.current)}},[t,n.mode,n.hostname,n.user,P]),a.useEffect(()=>{t||R.current&&R.current.abort()},[t]),a.useEffect(()=>()=>{R.current&&R.current.abort(),S.current&&clearTimeout(S.current)},[]);const L=(l==null?void 0:l.agent.filter(N=>N.length===1&&N[0].role==="dev").map(N=>N[0]))??[],M=L.length>0,W=st.test(n.id)&&!j.has(n.id),I=n.mode==="local"||n.mode==="remote"&&n.hostname.length>0,_=n.runtime!==""&&(n.runtime==="claude-code"?!!(d!=null&&d.runtimes["claude-code"].ok):!!(d!=null&&d.runtimes.codex.ok)),z=!!(d!=null&&d.tmux.ok),q=n.mode==="local"||!!((X=d==null?void 0:d.ssh)!=null&&X.ok),H=n.role==="dev"||n.role==="qa"&&n.pairWith!=="",Y=!u&&W&&I&&H&&_&&z&&q,ee=async N=>{if(N.preventDefault(),!!Y){v(!0),T(null);try{const Q=n.addDirs.split(`
|
|
2
|
+
`).map(U=>U.trim()).filter(U=>U.length>0),F={id:n.id,role:n.role,runtime:n.runtime,mode:n.mode,...n.mode==="remote"?{host:{hostname:n.hostname,...n.user?{user:n.user}:{}}}:{},...n.workdir?{workdir:n.workdir}:{},yolo:n.yolo,...n.model.trim()?{model:n.model.trim()}:{},...Q.length>0?{addDirs:Q}:{},...n.role==="qa"?{pairWith:n.pairWith}:{}},$=await O.projects.addAgent(r,F);$.restartRequired&&g(),y({kind:"success",title:`Agent ${$.agent.id} 已添加到 ${r}`}),i(),s()}catch(Q){T(Q instanceof Error?Q.message:String(Q))}finally{v(!1)}}},Z=({rt:N})=>{if(n.mode==="remote"&&!n.hostname)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"(请先填写 hostname)"});if(m)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"…探测中"});if(!d)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"?"});const F=d.runtimes[N];return F.ok?e.jsxs("span",{className:"ml-2 text-[12px] text-success",children:["✓ ",F.path??""]}):e.jsxs("span",{className:"ml-2 text-[12px] text-danger",title:F.message,children:["⨯ ",F.message]})},te=()=>n.mode==="remote"&&!n.hostname?null:m?e.jsx("div",{className:"text-[12px] text-og-400",children:"tmux: …探测中"}):d?d.tmux.ok?e.jsxs("div",{className:"text-[12px] text-success",children:["tmux: ✓ ",d.tmux.path??""]}):e.jsxs("div",{className:"text-[12px] text-danger",children:["tmux: ⨯ ",d.tmux.message]}):null,V=()=>n.mode!=="remote"||!n.hostname||!(d!=null&&d.ssh)?null:d.ssh.ok?e.jsxs("div",{className:"text-[12px] text-success",children:["SSH: ✓ ",d.ssh.message]}):e.jsxs("div",{className:"text-[12px] text-danger",children:["SSH: ⨯ ",d.ssh.message]});return e.jsx(we,{open:t,onClose:C,title:`添加 Agent 到 ${r}`,size:"lg",children:e.jsxs("form",{onSubmit:ee,className:"space-y-4",children:[c&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:c}),e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"agent-id",children:"Agent ID"}),e.jsx("input",{id:"agent-id",type:"text",value:n.id,onChange:N=>o({...n,id:N.target.value}),className:de,placeholder:"kk-cc",disabled:u}),n.id&&!st.test(n.id)&&e.jsx("div",{className:nt,children:"小写字母开头,只含 a-z 0-9 -,长度 2-32"}),n.id&&j.has(n.id)&&e.jsx("div",{className:nt,children:"该 id 已被占用(全局唯一)"})]}),e.jsxs("div",{children:[e.jsx("span",{className:oe,children:"角色"}),e.jsxs("label",{className:"mr-4 inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"role",checked:n.role==="dev",className:ue,onChange:()=>o({...n,role:"dev",pairWith:""}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Dev"})]}),e.jsxs("label",{className:"inline-flex items-center gap-2",title:M?"":"请先创建一个 Dev Agent",children:[e.jsx("input",{type:"radio",name:"role",checked:n.role==="qa",className:ue,onChange:()=>o({...n,role:"qa"}),disabled:u||!M}),e.jsx("span",{className:`text-[13px] ${M?"text-og-800":"text-og-400"}`,children:"QA"})]})]}),n.role==="qa"&&e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"pair-with",children:"配对 Dev Agent"}),e.jsxs("select",{id:"pair-with",value:n.pairWith,onChange:N=>o({...n,pairWith:N.target.value}),className:de,disabled:u,children:[e.jsx("option",{value:"",children:"请选择"}),L.map(N=>e.jsxs("option",{value:N.id,children:[N.id," (dev, ",N.mode,")"]},N.id))]})]}),e.jsxs("div",{children:[e.jsx("span",{className:oe,children:"运行模式"}),e.jsxs("label",{className:"mr-4 inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"mode",checked:n.mode==="local",className:ue,onChange:()=>o({...n,mode:"local",hostname:"",user:""}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"本机"})]}),e.jsxs("label",{className:"inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"mode",checked:n.mode==="remote",className:ue,onChange:()=>o({...n,mode:"remote"}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"远程 (SSH)"})]})]}),n.mode==="remote"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"hostname",children:"Hostname"}),e.jsx("input",{id:"hostname",type:"text",value:n.hostname,onChange:N=>o({...n,hostname:N.target.value}),className:de,placeholder:"macmini-2026",disabled:u}),e.jsx("div",{className:_e,children:"端口/私钥/跳板机请配 ~/.ssh/config"})]}),e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"user",children:"User(可选)"}),e.jsx("input",{id:"user",type:"text",value:n.user,onChange:N=>o({...n,user:N.target.value}),className:de,placeholder:"留空则读 ~/.ssh/config 的 User",disabled:u})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between",children:[e.jsx("span",{className:"text-[12px] font-medium text-og-700",children:"运行时"}),e.jsx("button",{type:"button",onClick:P,className:"text-[12px] text-accent transition-colors hover:text-accent-hover disabled:cursor-not-allowed disabled:opacity-50",disabled:u||m||n.mode==="remote"&&!n.hostname,children:"↻ 重新探测"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"runtime",checked:n.runtime==="claude-code",className:ue,onChange:()=>o({...n,runtime:"claude-code"}),disabled:u||(d?!d.runtimes["claude-code"].ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Claude Code"}),e.jsx(Z,{rt:"claude-code"})]}),e.jsxs("label",{className:"mt-1 flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"runtime",checked:n.runtime==="codex",className:ue,onChange:()=>o({...n,runtime:"codex"}),disabled:u||(d?!d.runtimes.codex.ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Codex"}),e.jsx(Z,{rt:"codex"})]}),e.jsx("div",{className:"mt-2",children:e.jsx(te,{})}),e.jsx("div",{children:e.jsx(V,{})})]}),e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"workdir",children:"Workdir(可选)"}),e.jsx("input",{id:"workdir",type:"text",value:n.workdir,onChange:N=>o({...n,workdir:N.target.value}),className:de,placeholder:"留空时自动 clone 到 ~/.baxian/repos/<owner>/<repo>",disabled:u})]}),e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"model",children:"Model(可选)"}),e.jsx("input",{id:"model",type:"text",value:n.model,onChange:N=>o({...n,model:N.target.value}),className:de,placeholder:n.runtime==="codex"?"例: o3 / gpt-4o(留空走 default)":"例: sonnet / opus / claude-sonnet-4-6(留空走 default)",disabled:u}),e.jsx("div",{className:_e,children:"透传到 launch 命令的 --model 参数;留空跟随 CLI 默认。"})]}),e.jsxs("div",{children:[e.jsx("label",{className:oe,htmlFor:"addDirs",children:"Additional Dirs(可选)"}),e.jsx("textarea",{id:"addDirs",value:n.addDirs,onChange:N=>o({...n,addDirs:N.target.value}),className:`${de} font-mono text-[12px]`,rows:3,placeholder:`每行一个绝对路径,例:
|
|
3
|
+
/Users/me/shared-libs
|
|
4
|
+
/Users/me/extra-repo`,disabled:u}),e.jsx("div",{className:_e,children:"透传到 --add-dir。当前 YOLO 模式下不影响权限拦截,主要用于让 CLI 把额外目录纳入工作根。"})]}),e.jsx("div",{className:"rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-3 py-2.5",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-2",children:[e.jsx("input",{type:"checkbox",className:"mt-1 h-3.5 w-3.5 accent-[#1348dc]",checked:n.yolo,onChange:N=>o({...n,yolo:N.target.checked}),disabled:u}),e.jsxs("div",{className:"text-[13px] text-og-800",children:[e.jsx("div",{className:"font-medium",children:"YOLO 模式(推荐开启)"}),e.jsxs("div",{className:"mt-1 text-[12px] text-warn",children:["Agent 自主执行所有命令、文件改动,无需逐条确认。开启后体验更顺滑, 但",e.jsx("strong",{className:"font-semibold",children:"请确认在受控环境(容器、隔离 worktree)中运行"}),"。"]})]})]})}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:C,disabled:u,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:!Y,className:"btn-primary",children:u?"添加中…":"添加 Agent"})]})]})})}const at=200,it=16e3,Ne="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",ke="mb-1.5 block text-[12px] font-medium text-og-700",ot="mt-1 text-right text-[12px] text-og-400";function He(t){const s=t.mode==="edit",r=Te(),{show:i}=fe(),n=s?t.task.projectId:t.projectId,o=s?t.task.title:"",l=s?t.task.description:"",f=s?t.task.preferredAgentId:"",[j,p]=a.useState([]),[d,x]=a.useState([]),[m,h]=a.useState(n??""),[u,v]=a.useState(f),[c,T]=a.useState(o),[R,S]=a.useState(l),[A,y]=a.useState(!1),[g,C]=a.useState(null),P=a.useRef(0);a.useEffect(()=>{if(!t.open)return;P.current+=1;const w=P.current;p([]),x([]),h(n??""),v(f),T(o),S(l),C(null),y(!1),Promise.all([O.projects.list(),O.agents.list()]).then(([b,D])=>{w===P.current&&(p(b),x(D))}).catch(b=>{w===P.current&&C(b instanceof Error?b.message:String(b))})},[t.open,n,o,l,f]);const L=a.useMemo(()=>j.find(w=>w.id===m)??null,[j,m]),M=a.useMemo(()=>L?L.agent.flat().filter(w=>w.role==="dev"):[],[L]),W=a.useMemo(()=>new Set(d.map(w=>w.id)),[d]),I=a.useMemo(()=>M.filter(w=>W.has(w.id)),[M,W]),_=a.useMemo(()=>M.filter(w=>!W.has(w.id)),[M,W]);a.useEffect(()=>{if(!s){if(I.length===0){u!==""&&v("");return}I.find(w=>w.id===u)||v(I[0].id)}},[I,u,s]);const z=!s||I.find(w=>w.id===u),q=s&&!z&&!!u,H=q&&_.some(w=>w.id===u),Y=H?`当前 dev "${u}" 在 baxian.json 中存在但 runtime 未加载,可能是手动编辑过配置文件;重启 server 可拉起`:q?`当前 dev "${u}" 不在 runtime(可能已从 project 配置移除);保存可能失败,请确认或选择新 dev`:!m||I.length>0?null:_.length>0?"baxian.json 里有 dev agent 但 runtime 未加载(可能是手动编辑过配置);重启 server 后生效":"请先为项目添加 dev agent",ee=c.trim(),Z=R.trim(),te=I.length>0||q,X=!!m&&te&&!!u&&ee.length>0&&Z.length>0&&!A,N=()=>{A||t.onClose()},Q=async w=>{var b,D;if(w.preventDefault(),!!X){y(!0),C(null);try{if(t.mode==="edit"){const E=await O.tasks.update(t.task.id,{title:ee,description:Z,preferredAgentId:u});i({kind:"success",title:"任务已更新"}),(b=t.onUpdated)==null||b.call(t,E),t.onClose()}else{const E=await O.tasks.create({projectId:m,title:ee,description:Z,preferredAgentId:u});i({kind:"success",title:"任务已创建"}),(D=t.onCreated)==null||D.call(t,E),t.onClose(),r(`/task/${E.id}`)}}catch(E){C(E instanceof Error?E.message:String(E))}finally{y(!1)}}},F=s?"编辑 Task":"新建 Task",$=s?A?"保存中…":"保存":A?"创建中…":"创建",U=!s&&!n;return e.jsx(we,{open:t.open,onClose:N,title:F,size:"md",children:e.jsxs("form",{onSubmit:Q,className:"space-y-4",children:[g&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:g}),U&&e.jsxs("div",{children:[e.jsx("label",{className:ke,htmlFor:"task-project",children:"Project"}),e.jsxs("select",{id:"task-project",value:m,onChange:w=>h(w.target.value),className:Ne,disabled:A,required:!0,children:[e.jsx("option",{value:"",disabled:!0,children:"选择项目"}),j.map(w=>e.jsx("option",{value:w.id,children:w.id},w.id))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:ke,htmlFor:"task-dev",children:"Dev Agent"}),e.jsxs("select",{id:"task-dev",value:u,onChange:w=>v(w.target.value),className:Ne,disabled:A||I.length===0&&!q||I.length===1&&I[0].id===u&&!q,required:!0,children:[I.length===0&&!q&&e.jsx("option",{value:"",disabled:!0,children:"无可用 dev"}),q&&e.jsxs("option",{value:u,children:[u," ",H?"(待重启)":"(不在 runtime)"]}),I.map(w=>e.jsx("option",{value:w.id,children:w.id},w.id))]}),Y&&e.jsx("div",{className:"mt-1 text-[12px] text-warn",children:Y})]}),e.jsxs("div",{children:[e.jsx("label",{className:ke,htmlFor:"task-title",children:"Title"}),e.jsx("input",{id:"task-title",type:"text",value:c,onChange:w=>T(w.target.value),maxLength:at,className:Ne,placeholder:"一句话描述要做什么",disabled:A,required:!0}),e.jsxs("div",{className:ot,children:[c.length," / ",at]})]}),e.jsxs("div",{children:[e.jsx("label",{className:ke,htmlFor:"task-description",children:"Description"}),e.jsx("textarea",{id:"task-description",value:R,onChange:w=>S(w.target.value),maxLength:it,rows:8,className:`${Ne} font-mono text-[12px]`,placeholder:"详细描述任务,支持 markdown",disabled:A,required:!0}),e.jsxs("div",{className:ot,children:[R.length," / ",it]})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:N,disabled:A,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:!X,className:"btn-primary",children:$})]})]})})}function bs(t){return Array.from(new TextEncoder().encode(t)).map(s=>s.toString(16).padStart(2,"0")).join("")}function gs(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/realtime`}const js=(t,s)=>s&&s.length>0?new WebSocket(t,s):new WebSocket(t);class ws{constructor(s={}){B(this,"wsUrl");B(this,"wsFactory");B(this,"tokenProvider");B(this,"ws",null);B(this,"topics",new Map);B(this,"cache",new Map);B(this,"outbox",[]);B(this,"reconnectScheduler");B(this,"explicitlyClosed",!1);this.wsUrl=s.wsUrl??gs(),this.wsFactory=s.wsFactory??js,this.tokenProvider=s.tokenProvider??Ge,this.reconnectScheduler=new ht({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.topics.size>0})}subscribe(s,r,i){let n=this.topics.get(s);const o=!n;return n||(n={data:new Set,error:new Set},this.topics.set(s,n)),n.data.add(r),i&&n.error.add(i),o?(this.ensureSocket(),this.wsSendOrQueue({op:"subscribe",topic:s})):this.cache.has(s)&&queueMicrotask(()=>{var l;(l=this.topics.get(s))!=null&&l.data.has(r)&&this.cache.has(s)&&r(this.cache.get(s))}),()=>this.unsubscribe(s,r,i)}close(){if(this.explicitlyClosed=!0,this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.ws){try{this.ws.close()}catch{}this.ws=null}this.topics.clear(),this.cache.clear(),this.outbox=[]}unsubscribe(s,r,i){const n=this.topics.get(s);n&&(n.data.delete(r),i&&n.error.delete(i),n.data.size===0&&n.error.size===0&&(this.topics.delete(s),this.cache.delete(s),this.wsSendOrQueue({op:"unsubscribe",topic:s}),this.topics.size===0&&this.teardownSocket()))}teardownSocket(){if(this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.outbox=[],this.ws){try{this.ws.close()}catch{}this.ws=null}}ensureSocket(){this.explicitlyClosed||this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)||this.openSocket()}openSocket(){if(this.explicitlyClosed)return;this.reconnectScheduler.cancel();const s=this.tokenProvider(),r=s?[`baxian.token.${bs(s)}`]:void 0;let i;try{i=this.wsFactory(this.wsUrl,r)}catch(o){console.warn("[events-client] WebSocket constructor threw:",o),this.broadcastConnectionError({code:"connection_failed",message:o instanceof Error?o.message:"WebSocket constructor threw"}),this.scheduleReconnect();return}this.ws=i;let n=!1;i.onopen=()=>{if(i!==this.ws)return;n=!0,this.reconnectScheduler.reset();for(const l of this.topics.keys())try{i.send(JSON.stringify({op:"subscribe",topic:l}))}catch(f){console.warn("[events-client] resubscribe send failed:",f)}const o=this.outbox;this.outbox=[];for(const l of o)if(!(l.op==="subscribe"||l.op==="unsubscribe"))try{i.send(JSON.stringify(l))}catch(f){console.warn("[events-client] outbox flush failed:",f)}},i.onmessage=o=>{if(i!==this.ws)return;let l;try{const f=typeof o.data=="string"?o.data:String(o.data);l=JSON.parse(f)}catch{return}this.handleMessage(l)},i.onclose=()=>{i===this.ws&&(this.ws=null,!this.explicitlyClosed&&(n||this.broadcastConnectionError({code:"connection_failed",message:"WebSocket failed to connect (auth, network, or proxy issue)"}),this.topics.size!==0&&this.scheduleReconnect()))},i.onerror=()=>{}}scheduleReconnect(){this.reconnectScheduler.schedule()}broadcastConnectionError(s){for(const r of this.topics.values())for(const i of[...r.error])try{i(s)}catch(n){console.error("[events-client] error handler threw on connection error:",n)}}wsSendOrQueue(s){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(s));return}catch(r){console.warn("[events-client] send failed, will queue:",r)}this.outbox.push(s)}handleMessage(s){switch(s.type){case"data":{const r=this.topics.get(s.topic);if(this.cache.set(s.topic,s.data),!r)return;for(const i of[...r.data])try{i(s.data)}catch(n){console.error(`[events-client] handler threw on ${s.topic}:`,n)}break}case"error":{const r={code:s.code,message:s.message};if(s.topic){const i=this.topics.get(s.topic);if(i)for(const n of[...i.error])try{n(r)}catch(o){console.error(`[events-client] error handler threw on ${s.topic}:`,o)}}else console.warn("[events-client] connection-level error:",s.code,s.message);break}}}}let Fe=null;function Ke(){return Fe||(Fe=new ws),Fe}function mt(){const[t,s]=a.useState(null),[r,i]=a.useState(!1),[n,o]=a.useState(null);return a.useEffect(()=>Ke().subscribe("agents",f=>{o(null),s(f),i(!0)},f=>o(f)),[]),{data:t,loaded:r,error:n}}function vs(t){const[s,r]=a.useState(null),[i,n]=a.useState(!1),[o,l]=a.useState(null);return a.useEffect(()=>(r(null),n(!1),l(null),Ke().subscribe(`task:${t}`,j=>{l(null),r(j),n(!0)},j=>l(j))),[t]),{data:s,loaded:i,error:o}}function ys(t){const[s,r]=a.useState(null),[i,n]=a.useState(!1),[o,l]=a.useState(null);return a.useEffect(()=>{if(!t){r(null),n(!1),l(null);return}r(null),n(!1),l(null);let f=!1,j=!1,p=!1;const d=Ke().subscribe(`project-tasks:${t}`,x=>{f||(j=!0,l(null),r(x),n(!0))},x=>{f||(l(x),!(j||p)&&(p=!0,O.tasks.list(t).then(m=>{f||j||(r(m),n(!0))},m=>{console.warn(`[useProjectTasks] REST fallback failed for ${t}:`,m)})))});return()=>{f=!0,d()}},[t]),{data:s,loaded:i,error:o}}let Re=null,ce=null,Ae=null,be=0;const Be=new Set;function pt(){Be.forEach(t=>t())}async function Ns(){const t=be;try{const s=await O.projects.list();if(t!==be)return;Re=s,Ae=null}catch(s){if(t!==be)return;Ae=s instanceof Error?s.message:String(s)}finally{t===be&&(ce=null,pt())}}function Qe(){return ce||(ce=Ns(),ce)}function ks(){be+=1,Re=null,ce=null,Ae=null,pt()}typeof window<"u"&&window.addEventListener(Se,ks);async function Ss(){const t=ce!==null;await Qe(),t&&await Qe()}function bt(){const[,t]=a.useState(0);return a.useEffect(()=>{const s=()=>t(r=>r+1);return Be.add(s),Re===null&&!ce&&Qe(),()=>{Be.delete(s)}},[]),{projects:Re,error:Ae,refresh:Ss}}function Es(){const{projects:t,error:s,refresh:r}=bt(),i=t??[],n=t!==null,[o,l]=a.useState([]),[f,j]=a.useState(null),[p,d]=a.useState(!1),[x,m]=a.useState(!1),[h,u]=a.useState({kind:"closed"}),{data:v,loaded:c,error:T}=mt(),R=(T==null?void 0:T.message)??null,S=new Map((v??[]).map(g=>[g.id,g])),A=s??R??f,y=async()=>{try{const g=await O.tasks.list();l(g),j(null)}catch(g){j(g instanceof Error?g.message:String(g))}};return a.useEffect(()=>{y()},[]),e.jsxs("div",{children:[e.jsx("h1",{className:"sr-only",children:"Dashboard"}),e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-end gap-2",children:[e.jsx("button",{onClick:()=>d(!0),className:"btn-primary",children:"+ 新建项目"}),e.jsx("button",{onClick:()=>m(!0),disabled:i.length===0,"aria-describedby":i.length===0?"create-task-hint":void 0,className:"btn-secondary",children:"+ 新建 Task"}),i.length===0&&e.jsx("span",{id:"create-task-hint",className:"self-center text-[12px] text-og-500",children:"请先创建项目"})]}),A&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",A]}),n&&i.length===0&&!s&&e.jsx("div",{className:"rounded-lg border border-hairline bg-surface py-12 text-center text-[13px] text-og-500",children:'还没有项目。点击右上角"+ 新建项目"开始。'}),i.map(g=>e.jsxs("div",{className:"mb-10",children:[e.jsxs(he,{to:`/project/${g.id}`,className:"group mb-3 -mx-2 flex items-baseline gap-x-3 gap-y-1 rounded-md px-2 py-1 transition-colors hover:bg-og-25",children:[e.jsx("h2",{className:"min-w-0 truncate font-display text-[17px] font-semibold tracking-tight text-og-1000",title:g.id,children:g.id}),e.jsx("span",{className:"hidden min-w-0 truncate font-mono text-[12px] text-og-500 sm:inline",title:g.repo,children:g.repo}),e.jsx("span",{className:"ml-auto text-[13px] text-accent group-hover:text-accent-hover",children:"Details →"})]}),g.agent.flat().length===0?e.jsx("div",{className:"rounded-lg border border-hairline bg-surface py-6 text-center text-[13px] text-og-500",children:"还没有 Agent。进入 Details 添加。"}):e.jsx("div",{className:g.agent.length===1?"space-y-3":"grid grid-cols-1 gap-3 xl:grid-cols-2",children:g.agent.map((C,P)=>e.jsx(ft,{group:C,projectId:g.id,agentsById:S,agentsLoaded:c,agentsError:!!T,tasks:o.filter(L=>L.projectId===g.id),onDeleted:()=>{r(),y()},terminalMode:"embedded-full"},C.map(L=>L.id).join(":")||P))})]},g.id)),e.jsx(ms,{open:p,onClose:()=>d(!1),onCreated:g=>{d(!1),r(),u({kind:"asking",projectId:g})}}),e.jsx(we,{open:h.kind==="asking",onClose:()=>u({kind:"closed"}),title:"项目已创建",size:"sm",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-[13px] text-og-700",children:"现在添加第一个 Agent,还是稍后再加?"}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>u({kind:"closed"}),className:"btn-secondary",children:"稍后再加"}),e.jsx("button",{type:"button",onClick:()=>{h.kind==="asking"&&u({kind:"addingAgent",projectId:h.projectId})},className:"btn-primary",children:"继续添加 Agent"})]})]})}),h.kind==="addingAgent"&&e.jsx(xt,{open:!0,projectId:h.projectId,onClose:()=>u({kind:"closed"}),onCreated:()=>{r()}}),e.jsx(He,{open:x,onClose:()=>m(!1),onCreated:()=>{y()}})]})}function gt({tasks:t}){const s=Te();return t.length===0?e.jsx("div",{className:"rounded-lg border border-hairline bg-surface px-4 py-8 text-center text-[13px] text-og-400",children:"No tasks"}):e.jsx("div",{className:"overflow-hidden rounded-lg border border-hairline bg-surface",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-[13px]",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-hairline bg-og-50/40 text-left font-mono text-[11px] uppercase tracking-[0.05em] text-og-500",children:[e.jsx("th",{className:"px-4 py-2 font-medium",children:"ID"}),e.jsx("th",{className:"px-4 py-2 font-medium",children:"Title"}),e.jsx("th",{className:"hidden px-4 py-2 font-medium sm:table-cell",children:"Agent"}),e.jsx("th",{className:"px-4 py-2 font-medium",children:"Status"}),e.jsx("th",{className:"hidden px-4 py-2 font-medium sm:table-cell",children:"Round"})]})}),e.jsx("tbody",{children:t.map(r=>e.jsxs("tr",{className:"cursor-pointer border-t border-hairline transition-colors hover:bg-og-50/40",onClick:()=>s(`/task/${r.id}`),children:[e.jsx("td",{className:"whitespace-nowrap px-4 py-2.5 font-mono text-[12px]",children:e.jsx(he,{to:`/task/${r.id}`,className:"text-accent hover:text-accent-hover",onClick:i=>i.stopPropagation(),children:r.id})}),e.jsx("td",{className:"px-4 py-2.5 break-words text-og-1000",children:r.title}),e.jsx("td",{className:"hidden whitespace-nowrap px-4 py-2.5 font-mono text-[12px] sm:table-cell",children:r.agentId?e.jsx("span",{className:"text-og-700",children:r.agentId}):r.preferredAgentId?e.jsx("span",{className:"italic text-og-500",children:r.preferredAgentId}):e.jsx("span",{className:"text-og-400",children:"—"})}),e.jsxs("td",{className:"whitespace-nowrap px-4 py-2.5",children:[e.jsx("span",{className:"pill",children:r.status}),r.phase==="spec"&&e.jsx("span",{className:"ml-1 pill pill-review",children:"spec"})]}),e.jsx("td",{className:"hidden whitespace-nowrap px-4 py-2.5 text-[12px] text-og-500 sm:table-cell",children:r.phase==="spec"?r.specReviewRound??0:r.reviewRound})]},r.id))})]})})})}function Cs(){const{id:t}=We(),s=Te(),{show:r}=fe(),{refresh:i}=bt(),[n,o]=a.useState(null),[l,f]=a.useState(null),[j,p]=a.useState(!1),[d,x]=a.useState(!1),[m,h]=a.useState(!1),[u,v]=a.useState(!1),[c,T]=a.useState(""),[R,S]=a.useState(!1),[A,y]=a.useState(null),g=a.useRef(null),C=a.useRef(null),P=a.useId(),L=a.useId(),M=a.useRef(0),{data:W,loaded:I,error:_}=mt(),{data:z,error:q}=ys(t),H=(_==null?void 0:_.message)??null,Y=(q==null?void 0:q.message)??null,ee=z??[],Z=new Map((W??[]).map($=>[$.id,$])),te=l??H??Y,V=a.useCallback(async $=>{const U=++M.current;try{const w=await O.projects.get($);if(U!==M.current)return;o(w),f(null)}catch(w){if(U!==M.current)return;f(w instanceof Error?w.message:String(w))}},[]);a.useEffect(()=>{t&&(o(null),f(null),V(t))},[t,V]),a.useEffect(()=>{if(!m)return;const $=w=>{var D,E;const b=w.target;b&&((D=C.current)!=null&&D.contains(b)||(E=g.current)!=null&&E.contains(b)||h(!1))},U=w=>{var b;w.key==="Escape"&&(h(!1),(b=g.current)==null||b.focus())};return document.addEventListener("mousedown",$),document.addEventListener("keydown",U),()=>{document.removeEventListener("mousedown",$),document.removeEventListener("keydown",U)}},[m]),a.useEffect(()=>{u||(T(""),y(null))},[u]);const X=(n==null?void 0:n.agent.flat().length)??0,N=X===0,Q=!!n&&c.trim()===n.id,F=async()=>{if(!(!n||!Q||R)){S(!0),y(null);try{await O.projects.delete(n.id),await i(),r({kind:"success",title:`项目 ${n.id} 已删除`}),v(!1),s("/")}catch($){y($ instanceof Error?$.message:String($))}finally{S(!1)}}};return n?e.jsxs("div",{children:[te&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",te]}),e.jsxs("div",{className:"mb-6 flex items-baseline gap-x-3",children:[e.jsx("h1",{className:"min-w-0 truncate font-display text-[17px] font-semibold tracking-tight text-og-1000",title:n.id,children:n.id}),e.jsx("span",{className:"min-w-0 truncate font-mono text-[12px] text-og-500",title:n.repo,children:n.repo}),e.jsxs("div",{className:"relative ml-auto self-center",children:[e.jsx("button",{ref:g,id:L,type:"button",onClick:()=>h($=>!$),"aria-haspopup":"menu","aria-expanded":m,"aria-controls":P,"aria-label":`项目 ${n.id} 操作菜单`,className:"flex h-8 w-8 items-center justify-center rounded text-og-500 transition-colors hover:bg-og-100 hover:text-og-1000",children:e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("circle",{cx:"12",cy:"12",r:"1"}),e.jsx("circle",{cx:"12",cy:"5",r:"1"}),e.jsx("circle",{cx:"12",cy:"19",r:"1"})]})}),m&&e.jsx("div",{ref:C,id:P,role:"menu","aria-labelledby":L,className:"absolute right-0 top-full z-10 mt-1 min-w-[180px] rounded-md border border-hairline bg-surface py-1 shadow-md",children:e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{h(!1),v(!0)},disabled:!N,title:N?void 0:`请先删除项目下的 ${X} 个 Agent`,className:"block w-full px-3 py-1.5 text-left text-[13px] text-danger hover:bg-[#fef2f2] disabled:cursor-not-allowed disabled:text-og-400 disabled:hover:bg-transparent",children:"删除项目…"})})]})]}),e.jsxs("div",{className:"mb-3 flex flex-wrap items-baseline justify-between gap-2",children:[e.jsx("h2",{className:"font-display text-[12px] font-semibold uppercase tracking-[0.06em] text-og-500",children:"Agents"}),e.jsx("button",{onClick:()=>p(!0),className:"btn-ghost",children:"+ 添加 Agent"})]}),n.agent.flat().length===0?e.jsx("div",{className:"mb-8 rounded-lg border border-hairline bg-surface py-6 text-center text-[13px] text-og-500",children:"还没有 Agent,点击右上角添加。"}):e.jsx("div",{className:"mb-8 space-y-5",children:n.agent.map(($,U)=>e.jsx(ft,{group:$,projectId:n.id,agentsById:Z,agentsLoaded:I,agentsError:!!_,tasks:ee,onDeleted:()=>{V(n.id)},terminalMode:"embedded-full"},$.map(w=>w.id).join(":")||U))}),e.jsxs("div",{className:"mb-3 flex flex-wrap items-baseline justify-between gap-2 border-t border-hairline pt-6",children:[e.jsx("h2",{className:"font-display text-[12px] font-semibold uppercase tracking-[0.06em] text-og-500",children:"Tasks"}),e.jsx("button",{onClick:()=>x(!0),className:"btn-ghost",children:"+ 新建 Task"})]}),e.jsx(gt,{tasks:ee}),e.jsx(xt,{open:j,projectId:n.id,onClose:()=>p(!1),onCreated:()=>{V(n.id)}}),e.jsx(He,{open:d,projectId:n.id,onClose:()=>x(!1)}),e.jsx(we,{open:u,onClose:()=>{R||v(!1)},title:"删除项目",size:"sm",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-[13px] text-og-700",children:["将从 ",e.jsx("code",{className:"font-mono text-og-1000",children:"baxian.json"})," 中移除项目"," ",e.jsx("span",{className:"font-mono text-og-1000",children:n.id}),"。此操作不可撤销,且不会删除 Git 仓库本身。"]}),e.jsxs("p",{className:"text-[13px] text-og-700",children:["如需确认,请在下方输入项目 ID ",e.jsx("span",{className:"font-mono text-og-1000",children:n.id}),":"]}),e.jsx("input",{type:"text",value:c,onChange:$=>T($.target.value),placeholder:n.id,autoComplete:"off",autoCorrect:"off",spellCheck:!1,disabled:R,"aria-label":"输入项目 ID 以确认删除",className:"w-full rounded border border-hairline bg-surface px-3 py-2 font-mono text-[13px] text-og-1000 focus:border-accent focus:outline-none"}),A&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[12px] text-danger",children:A}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>v(!1),disabled:R,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"button",onClick:()=>void F(),disabled:!Q||R,className:"btn-secondary !text-danger hover:!bg-[#fef2f2] hover:!text-danger disabled:!text-og-300",children:R?"删除中…":"确认删除"})]})]})})]}):l?e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",l]}):e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"})}function Rs(){const{agentId:t}=We();return t?e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden rounded-lg border border-hairline bg-surface",children:[e.jsxs("div",{className:"flex h-8 flex-none select-none items-center gap-3 border-b border-hairline bg-page px-3 font-mono text-[11px] text-og-500",children:[e.jsx("span",{"aria-hidden":!0,className:"block h-1.5 w-1.5 rounded-full bg-success"}),e.jsx("span",{className:"text-og-700",children:t})]}),e.jsx("div",{className:"min-h-0 flex-1",children:e.jsx(ze,{agentId:t,mode:"full",interactive:!0,arrowKeys:!0})})]}):e.jsx("div",{className:"text-[13px] text-danger",children:"No agent specified"})}function As(){const[t,s]=a.useState([]),[r,i]=a.useState(null);return a.useEffect(()=>{let n=!1;return(async()=>{try{const o=await O.tasks.list();n||s(o)}catch(o){n||i(o instanceof Error?o.message:String(o))}})(),()=>{n=!0}},[]),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold tracking-tight text-og-1000",children:"Tasks"}),e.jsx("p",{className:"mt-0.5 text-[13px] text-og-500",children:"Every task across all projects."})]}),r&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",r]}),e.jsx(gt,{tasks:t})]})}const jt=new Set(["merged","failed","max_rounds","cancelled"]),ct=jt,Ts={pending:"pill",in_progress:"pill pill-live",review:"pill pill-review",fixing:"pill pill-warn",approved:"pill pill-live",merged:"pill pill-live",failed:"pill pill-warn",max_rounds:"pill pill-warn",cancelled:"pill"};function Is(){const{id:t}=We(),s=Te(),{show:r}=fe(),[i,n]=a.useState(!1),[o,l]=a.useState(!1),[f,j]=a.useState(!1),[p,d]=a.useState(!1),[x,m]=a.useState(null),{data:h,loaded:u,error:v}=vs(t??""),c=x??h,T=(v==null?void 0:v.message)??null;a.useEffect(()=>{m(null)},[t]),a.useEffect(()=>{x&&h&&h.updatedAt>=x.updatedAt&&m(null)},[x,h]);const R=I=>{m(I)};if(!t)return e.jsx("div",{className:"text-[13px] text-danger",children:"Task ID required"});if(T&&!c)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",T]});if(u&&!c)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Task not found: ",t]});if(!c)return e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"});const S=c.status==="pending",A=c.status==="pending"||c.status==="in_progress",y=ct.has(c.status)&&!!c.preferredAgentId,g=!!c.prNumber,C=c.preferredAgentId==="",P=c.status==="approved"&&c.prNumber!==void 0,L=async()=>{if(confirm(`确定取消 task ${c.id}?`)){l(!0);try{const I=await O.tasks.update(c.id,{status:"cancelled"});R(I),r({kind:"success",title:"任务已取消"})}catch(I){r({kind:"error",title:"取消失败",body:I instanceof Error?I.message:String(I)})}finally{l(!1)}}},M=async()=>{const _=jt.has(c.status)?`task ${c.id} 已是 ${c.status} 状态。手动请 QA 重审会再跑一轮 review,但状态机不会把 QA 结果带回主流程。继续?`:`请 QA 重审 task ${c.id}?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`;if(confirm(_)){d(!0);try{const z=await O.tasks.review(c.id);R(z),r({kind:"success",title:`已派 QA 重审 (round ${z.reviewRound})`})}catch(z){r({kind:"error",title:"Review 派发失败",body:z instanceof Error?z.message:String(z)})}finally{d(!1)}}},W=async()=>{const I=c.status==="merged"?`task ${c.id} 已 merged。Retry 会用同样的标题/描述新建一个 task 从头跑,确定继续?`:`Retry task ${c.id}?这会新建一个 task 从头开始,旧 task 保留为历史。`;if(confirm(I)){j(!0);try{const _=await O.tasks.retry(c.id);r({kind:"success",title:`已新建 task ${_.id}`}),s(`/task/${_.id}`)}catch(_){r({kind:"error",title:"Retry 失败",body:_ instanceof Error?_.message:String(_)})}finally{j(!1)}}};return e.jsxs("div",{className:"mx-auto max-w-4xl",children:[T&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",T]}),C&&e.jsx("div",{className:"mb-4 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-3 py-2.5 text-[12px] text-warn",children:c.status==="pending"?e.jsxs(e.Fragment,{children:["This task has no preferred dev (legacy). Click ",e.jsx("b",{className:"font-semibold",children:"Edit"})," to assign one."]}):e.jsxs(e.Fragment,{children:["This is a legacy task with no preferred dev (read-only in status ",e.jsx("b",{className:"font-semibold",children:c.status}),")."]})}),e.jsxs("div",{className:"mb-2 flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"font-mono text-[13px] text-og-500",children:c.id}),e.jsx("span",{className:Ts[c.status],children:c.status}),c.phase==="spec"&&e.jsx("span",{className:"pill pill-review",children:"spec phase"}),e.jsxs("span",{className:"text-[12px] text-og-500",children:["created ",c.createdAt]}),e.jsxs("span",{className:"text-[12px] text-og-500",children:["updated ",c.updatedAt]})]}),e.jsx("h1",{className:"mb-5 break-words font-display text-2xl font-semibold tracking-tight text-og-1000",children:c.title}),P&&e.jsxs("div",{className:"mb-5 rounded-lg border border-[#bbf7d0] bg-[#f0fdf4] p-4 text-[13px] text-success",children:[e.jsx("div",{className:"font-semibold",children:"QA approved · awaiting PR merge"}),e.jsx("div",{className:"mt-1 text-og-700",children:"Dev keeps the task reserved while it checks whether all human or agent feedback has been handled."}),c.prUrl&&e.jsxs("a",{href:c.prUrl,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary mt-3 !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:["Open PR #",c.prNumber]})]}),e.jsx("pre",{className:"card mb-6 whitespace-pre-wrap p-4 text-[13px] text-og-800",children:c.description}),e.jsxs("div",{className:"card mb-6 grid grid-cols-1 gap-x-6 gap-y-2 p-4 text-[13px] md:grid-cols-2",children:[e.jsxs("div",{className:"text-og-500",children:["Project: ",e.jsx("span",{className:"font-mono text-og-800",children:c.projectId})]}),e.jsxs("div",{className:"text-og-500",children:["Dev: ",e.jsx("span",{className:"font-mono text-og-800",children:c.agentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Preferred: ",e.jsx("span",{className:"font-mono text-og-800",children:c.preferredAgentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["QA: ",e.jsx("span",{className:"font-mono text-og-800",children:c.qaAgentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["PR:"," ",c.prNumber?c.prUrl?e.jsxs("a",{href:c.prUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover",children:["#",c.prNumber]}):e.jsxs("span",{className:"font-mono text-og-800",children:["#",c.prNumber]}):e.jsx("span",{className:"text-og-400",children:"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Branch: ",e.jsx("span",{className:"font-mono text-og-800",children:c.branch||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Round: ",e.jsx("span",{className:"font-mono text-og-800",children:c.reviewRound}),c.specReviewRound!==void 0&&c.specReviewRound>0&&e.jsxs("span",{className:"ml-2 text-[12px] text-accent",children:["spec: ",c.specReviewRound]})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"button",disabled:!S,onClick:()=>n(!0),className:"btn-secondary",children:"Edit"}),e.jsx("button",{type:"button",disabled:!A||o,onClick:L,className:"btn-secondary !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger",children:o?"Cancelling…":"Cancel"}),e.jsx("button",{type:"button",disabled:!y||f,onClick:W,title:ct.has(c.status)?C?"Legacy task has no preferred dev to retry against":"新建一个 task 从头跑,丢弃当前 worktree/branch":`Cannot retry in status ${c.status}`,className:"btn-secondary",children:f?"Retrying…":"Retry"}),e.jsx("button",{type:"button",disabled:!g||p,onClick:M,title:c.prNumber?"让 QA agent 立即开始新一轮 review(reviewRound +1)":"该 task 还没有 PR,无法派 review",className:"btn-secondary !border-accent-soft !text-accent hover:!bg-accent-soft hover:!border-accent",children:p?"Dispatching…":"Request QA review"})]}),e.jsx(He,{mode:"edit",open:i,onClose:()=>n(!1),task:c,onUpdated:R})]})}function Ps(){const[t,s]=a.useState(!1);return e.jsx("button",{type:"button",onClick:()=>s(r=>!r),"aria-label":t?"切换为 Logo 图标":"切换为 Logo 文字",className:"flex h-7 min-w-[60px] shrink-0 items-center justify-center font-display text-[15px] font-semibold tracking-tight text-og-1000",children:t?e.jsx("span",{className:"inline-flex h-6 items-center leading-none",children:"baxian"}):e.jsx("img",{src:"/baxian-logo.png",alt:"baxian",width:20,height:24,className:"block h-6 w-auto"})})}function $s(){const{phase:t,count:s,error:r,triggerRestart:i}=Pe();return t==="idle"?null:t==="failed"?e.jsxs("div",{className:"flex items-center justify-between border-b border-[#fecaca] bg-[#fef2f2] px-4 py-2",children:[e.jsxs("div",{className:"text-[13px] text-danger",children:["❌ 重启失败:",r]}),e.jsx("button",{onClick:()=>{i()},className:"btn-ghost !text-danger hover:!bg-[#fef2f2]",children:"重试"})]}):t==="restarting"?e.jsx("div",{className:"border-b border-accent-soft bg-accent-soft/40 px-4 py-2 text-[13px] text-accent",children:"🔄 重启中…"}):e.jsxs("div",{className:"flex items-center justify-between border-b border-[#fde68a] bg-[#fef3c7]/60 px-4 py-2",children:[e.jsxs("div",{className:"text-[13px] text-warn",children:["⚠️ 有 ",s," 项配置变更待重启 baxian server 才生效"]}),e.jsx("button",{onClick:()=>{i()},className:"btn-secondary !border-warn !text-warn hover:!bg-[#fef3c7] hover:!border-warn hover:!text-warn",children:"现在重启"})]})}const lt=({isActive:t})=>["rounded-md px-2 py-1 text-[13px] transition-colors sm:px-2.5",t?"bg-og-50 text-og-1000":"text-og-500 hover:bg-og-25 hover:text-og-800"].join(" ");function Ds(){const s=!Rt().pathname.startsWith("/terminal/");return e.jsxs("div",{className:"flex h-screen flex-col bg-page",children:[e.jsxs("nav",{className:"flex h-12 flex-none items-center gap-2 border-b border-hairline bg-surface px-3 sm:gap-4 sm:px-6",children:[e.jsxs(he,{to:"/",className:"flex shrink-0 items-center gap-2 font-display text-[15px] font-semibold tracking-tight text-og-1000",children:[e.jsx("span",{"aria-hidden":!0,className:"block h-2.5 w-2.5 rounded-sm bg-accent"}),"baxian"]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-0.5 sm:gap-1",children:[e.jsx(Je,{to:"/",end:!0,className:lt,children:"Dashboard"}),e.jsx(Je,{to:"/tasks",className:lt,children:"Tasks"})]})]}),e.jsx($s,{}),e.jsxs("main",{className:"flex min-h-0 flex-1 flex-col overflow-y-auto p-6",children:[e.jsxs(At,{children:[e.jsx(pe,{path:"/",element:e.jsx(Es,{})}),e.jsx(pe,{path:"/project/:id",element:e.jsx(Cs,{})}),e.jsx(pe,{path:"/terminal/:agentId",element:e.jsx(Rs,{})}),e.jsx(pe,{path:"/tasks",element:e.jsx(As,{})}),e.jsx(pe,{path:"/task/:id",element:e.jsx(Is,{})})]}),s&&e.jsx("footer",{className:"mt-auto flex justify-center pt-24",children:e.jsx(Ps,{})})]})]})}function Os(){return e.jsx(Ct,{children:e.jsx(Ds,{})})}function Ls({children:t}){const[s,r]=a.useState({kind:"probing"}),i=a.useRef(s);a.useEffect(()=>{i.current=s},[s]);const n=a.useCallback(async()=>{r({kind:"probing"});try{await O.config.get(),r({kind:"authorized"})}catch(o){if(o instanceof Ee&&o.status===401){r({kind:"unauthorized"});return}const l=o instanceof Error?o.message:"无法连接服务器";r({kind:"error",message:l})}},[]);return a.useEffect(()=>{n()},[n]),a.useEffect(()=>{const o=()=>{i.current.kind!=="probing"&&r({kind:"unauthorized",message:"登录已失效,请重新输入令牌"})};return window.addEventListener(Se,o),()=>window.removeEventListener(Se,o)},[]),s.kind==="authorized"?e.jsx(e.Fragment,{children:t}):s.kind==="error"?e.jsxs(Ue,{title:"无法连接服务器",children:[e.jsx("p",{className:"text-[13px] text-og-600",children:s.message}),e.jsx("button",{type:"button",onClick:()=>{n()},className:"btn-primary mt-4 w-full",children:"重试"})]}):s.kind==="probing"?e.jsx(Ue,{title:"加载中",children:e.jsx("p",{className:"text-[13px] text-og-500",children:"正在检查登录状态…"})}):e.jsx(Ms,{message:s.message,onSubmit:async o=>{Tt(o);try{await O.config.get(),r({kind:"authorized"})}catch(l){if(It(),l instanceof Ee&&l.status===401){r({kind:"unauthorized",message:"令牌无效,请重试"});return}const f=l instanceof Error?l.message:"登录失败";r({kind:"error",message:f})}}})}function Ue({title:t,children:s}){return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-page px-4",children:e.jsxs("div",{className:"w-full max-w-sm rounded-lg border border-hairline bg-surface px-6 py-6",children:[e.jsx("h1",{className:"mb-3 font-display text-[16px] font-semibold tracking-tight text-og-1000",children:t}),s]})})}function Ms({message:t,onSubmit:s}){const[r,i]=a.useState(""),[n,o]=a.useState(!1),[l,f]=a.useState(void 0),j=async d=>{d.preventDefault();const x=r.trim();if(!x){f("请输入访问令牌");return}f(void 0),o(!0);try{await s(x)}finally{o(!1)}},p=l??t;return e.jsxs(Ue,{title:"登录 baxian",children:[e.jsx("p",{className:"mb-4 text-[13px] text-og-600",children:"服务器开启了访问鉴权,请输入访问令牌继续。"}),e.jsxs("form",{onSubmit:d=>{j(d)},children:[e.jsx("label",{className:"mb-1.5 block text-[12px] font-medium text-og-700",htmlFor:"baxian-token",children:"访问令牌"}),e.jsx("input",{id:"baxian-token",type:"password",autoComplete:"current-password",autoFocus:!0,value:r,onChange:d=>i(d.target.value),className:"w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 font-mono text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",placeholder:"请输入服务器配置的 token",disabled:n}),p&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:p}),e.jsx("button",{type:"submit",disabled:n,className:"btn-primary mt-4 w-full",children:n?"登录中…":"登录"})]})]})}kt.createRoot(document.getElementById("root")).render(e.jsx(a.StrictMode,{children:e.jsx(Qt,{children:e.jsx(Mt,{children:e.jsx(Ls,{children:e.jsx(Os,{})})})})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-regular.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-italic.woff2) format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-bold.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-bolditalic.woff2) format("woff2");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Lilex;src:url(/fonts/lilex-variable.woff2) format("woff2-variations");font-weight:200 700;font-style:normal;font-display:swap}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1));font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:geometricprecision}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(15 59 184 / var(--tw-bg-opacity, 1))}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-border-opacity: 1;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;background-color:transparent;padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(109 116 132 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.btn-ghost:disabled{cursor:not-allowed;opacity:.5}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1));padding:.125rem .5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:11px;line-height:1.4;--tw-text-opacity: 1;color:rgb(83 89 100 / var(--tw-text-opacity, 1))}.pill:before{content:"";display:inline-block;height:.375rem;width:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(171 175 184 / var(--tw-bg-opacity, 1))}.pill-live{--tw-bg-opacity: 1;background-color:rgb(230 244 236 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.pill-live:before{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.pill-warn{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.pill-warn:before{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.pill-review{--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.pill-review:before{--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1))}.card{border-radius:8px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(232 233 236 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.card:hover{--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1))}.status-dot{display:inline-block;height:.725rem;width:.725rem;flex-shrink:0;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1))}.status-dot--healthy{--tw-bg-opacity: 1;background-color:rgb(230 244 236 / var(--tw-bg-opacity, 1))}.status-dot--warn{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.status-dot--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.status-dot--info{--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-full{bottom:100%}.right-0{right:0}.right-4{right:1rem}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-28{max-height:7rem}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-8{width:2rem}.w-80{width:20rem}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[180px\]{min-width:180px}.min-w-\[60px\]{min-width:60px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-hairline>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(232 233 236 / var(--tw-divide-opacity, 1))}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:6px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:6px}.rounded-sm{border-radius:4px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.\!border-\[\#bbf7d0\]{--tw-border-opacity: 1 !important;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))!important}.\!border-\[\#fecaca\]{--tw-border-opacity: 1 !important;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))!important}.\!border-accent-soft{--tw-border-opacity: 1 !important;border-color:rgb(234 240 255 / var(--tw-border-opacity, 1))!important}.\!border-warn{--tw-border-opacity: 1 !important;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))!important}.border-\[\#bbf7d0\]{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-\[\#fde68a\]{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-\[\#fecaca\]{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-accent-soft{--tw-border-opacity: 1;border-color:rgb(234 240 255 / var(--tw-border-opacity, 1))}.border-hairline{--tw-border-opacity: 1;border-color:rgb(232 233 236 / var(--tw-border-opacity, 1))}.border-og-100{--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1))}.bg-\[\#f0fdf4\]{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-\[\#fdfdfd\]{--tw-bg-opacity: 1;background-color:rgb(253 253 253 / var(--tw-bg-opacity, 1))}.bg-\[\#fef2f2\]{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-\[\#fef3c7\]{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-\[\#fef3c7\]\/60{background-color:#fef3c799}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1))}.bg-accent-soft\/40{background-color:#eaf0ff66}.bg-og-1000\/45{background-color:#0d0d0f73}.bg-og-50{--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1))}.bg-og-50\/40{background-color:#e3e4e766}.bg-page{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pt-24{padding-top:6rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-display{font-family:Lilex,iA Writer Quattro S,ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.tracking-\[0\.05em\]{letter-spacing:.05em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-tight{letter-spacing:-.025em}.\!text-accent{--tw-text-opacity: 1 !important;color:rgb(19 72 220 / var(--tw-text-opacity, 1))!important}.\!text-danger{--tw-text-opacity: 1 !important;color:rgb(185 28 28 / var(--tw-text-opacity, 1))!important}.\!text-success{--tw-text-opacity: 1 !important;color:rgb(21 128 61 / var(--tw-text-opacity, 1))!important}.\!text-warn{--tw-text-opacity: 1 !important;color:rgb(180 83 9 / var(--tw-text-opacity, 1))!important}.text-accent{--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-danger{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-og-1000{--tw-text-opacity: 1;color:rgb(13 13 15 / var(--tw-text-opacity, 1))}.text-og-400{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.text-og-500{--tw-text-opacity: 1;color:rgb(109 116 132 / var(--tw-text-opacity, 1))}.text-og-600{--tw-text-opacity: 1;color:rgb(98 105 118 / var(--tw-text-opacity, 1))}.text-og-700{--tw-text-opacity: 1;color:rgb(83 89 100 / var(--tw-text-opacity, 1))}.text-og-800{--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-warn{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.accent-\[\#1348dc\]{accent-color:#1348dc}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-modal{--tw-shadow: 0 12px 32px rgba(15, 23, 42, .12);--tw-shadow-colored: 0 12px 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-toast{--tw-shadow: 0 4px 12px rgba(15, 23, 42, .08);--tw-shadow-colored: 0 4px 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes breathe{0%,to{opacity:1}50%{opacity:.35}}.placeholder\:text-og-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.placeholder\:text-og-400::placeholder{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.hover\:\!border-accent:hover{--tw-border-opacity: 1 !important;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1))!important}.hover\:\!border-danger:hover{--tw-border-opacity: 1 !important;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))!important}.hover\:\!border-success:hover{--tw-border-opacity: 1 !important;border-color:rgb(21 128 61 / var(--tw-border-opacity, 1))!important}.hover\:\!border-warn:hover{--tw-border-opacity: 1 !important;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))!important}.hover\:\!bg-\[\#dcfce7\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef2f2\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef3c7\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef3c7\]\/60:hover{background-color:#fef3c799!important}.hover\:\!bg-accent-soft:hover{--tw-bg-opacity: 1 !important;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1))!important}.hover\:bg-\[\#fef2f2\]:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-og-100:hover{--tw-bg-opacity: 1;background-color:rgb(206 209 214 / var(--tw-bg-opacity, 1))}.hover\:bg-og-25:hover{--tw-bg-opacity: 1;background-color:rgb(241 242 244 / var(--tw-bg-opacity, 1))}.hover\:bg-og-50\/40:hover{background-color:#e3e4e766}.hover\:bg-og-50\/60:hover{background-color:#e3e4e799}.hover\:\!text-danger:hover{--tw-text-opacity: 1 !important;color:rgb(185 28 28 / var(--tw-text-opacity, 1))!important}.hover\:\!text-warn:hover{--tw-text-opacity: 1 !important;color:rgb(180 83 9 / var(--tw-text-opacity, 1))!important}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(15 59 184 / var(--tw-text-opacity, 1))}.hover\:text-og-1000:hover{--tw-text-opacity: 1;color:rgb(13 13 15 / var(--tw-text-opacity, 1))}.hover\:text-og-800:hover{--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.hover\:opacity-100:hover{opacity:1}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-\[3px\]:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent-soft:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(234 240 255 / var(--tw-ring-opacity, 1))}.active\:bg-og-200:active{--tw-bg-opacity: 1;background-color:rgb(192 195 202 / var(--tw-bg-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:\!text-og-300:disabled{--tw-text-opacity: 1 !important;color:rgb(171 175 184 / var(--tw-text-opacity, 1))!important}.disabled\:text-og-400:disabled{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(15 59 184 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:inline{display:inline}.sm\:table-cell{display:table-cell}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-1{gap:.25rem}.sm\:gap-4{gap:1rem}.sm\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
package/dist/web/baxian-logo.png
CHANGED
|
Binary file
|
package/dist/web/index.html
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<link rel="icon" type="image/png" href="/baxian-logo.png" />
|
|
6
7
|
<title>baxian</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CGGTyFj7.js"></script>
|
|
8
9
|
<link rel="modulepreload" crossorigin href="/assets/react-BG4Iuztk.js">
|
|
9
10
|
<link rel="modulepreload" crossorigin href="/assets/xterm-D5X2JljJ.js">
|
|
10
11
|
<link rel="modulepreload" crossorigin href="/assets/router-CApkciQz.js">
|
|
11
12
|
<link rel="stylesheet" crossorigin href="/assets/xterm-CFbL2ovg.css">
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
13
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CTa85R7R.css">
|
|
13
14
|
</head>
|
|
14
15
|
<body>
|
|
15
16
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-regular.woff2) format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-italic.woff2) format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-bold.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:iA Writer Quattro S;src:url(/fonts/ia-writer-quattro-s-bolditalic.woff2) format("woff2");font-weight:700;font-style:italic;font-display:swap}@font-face{font-family:Lilex;src:url(/fonts/lilex-variable.woff2) format("woff2-variations");font-weight:200 700;font-style:normal;font-display:swap}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1));font-family:iA Writer Quattro S,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1));font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:geometricprecision}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.btn-primary{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(15 59 184 / var(--tw-bg-opacity, 1))}.btn-primary:disabled{cursor:not-allowed;opacity:.5}.btn-secondary{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-border-opacity: 1;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.btn-secondary:disabled{cursor:not-allowed;opacity:.5}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.375rem;border-radius:6px;background-color:transparent;padding:.375rem .75rem;font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(109 116 132 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.btn-ghost:disabled{cursor:not-allowed;opacity:.5}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1));padding:.125rem .5rem;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:11px;line-height:1.4;--tw-text-opacity: 1;color:rgb(83 89 100 / var(--tw-text-opacity, 1))}.pill:before{content:"";display:inline-block;height:.375rem;width:.375rem;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(171 175 184 / var(--tw-bg-opacity, 1))}.pill-live{--tw-bg-opacity: 1;background-color:rgb(230 244 236 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.pill-live:before{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.pill-warn{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.pill-warn:before{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.pill-review{--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.pill-review:before{--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1))}.card{border-radius:8px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(232 233 236 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.card:hover{--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1))}.status-dot{display:inline-block;height:.725rem;width:.725rem;flex-shrink:0;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1))}.status-dot--healthy{--tw-bg-opacity: 1;background-color:rgb(230 244 236 / var(--tw-bg-opacity, 1))}.status-dot--warn{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.status-dot--danger{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.status-dot--info{--tw-bg-opacity: 1;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1));animation:breathe 1.8s ease-in-out infinite}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-full{bottom:100%}.right-0{right:0}.right-4{right:1rem}.top-4{top:1rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[60\]{z-index:60}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-4{margin-right:1rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-2\.5{height:.625rem}.h-3\.5{height:.875rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-28{max-height:7rem}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-3\.5{width:.875rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[60px\]{min-width:60px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-hairline>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(232 233 236 / var(--tw-divide-opacity, 1))}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:6px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:6px}.rounded-sm{border-radius:4px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.\!border-\[\#bbf7d0\]{--tw-border-opacity: 1 !important;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))!important}.\!border-\[\#fecaca\]{--tw-border-opacity: 1 !important;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))!important}.\!border-accent-soft{--tw-border-opacity: 1 !important;border-color:rgb(234 240 255 / var(--tw-border-opacity, 1))!important}.\!border-warn{--tw-border-opacity: 1 !important;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))!important}.border-\[\#bbf7d0\]{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-\[\#fde68a\]{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-\[\#fecaca\]{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-accent-soft{--tw-border-opacity: 1;border-color:rgb(234 240 255 / var(--tw-border-opacity, 1))}.border-hairline{--tw-border-opacity: 1;border-color:rgb(232 233 236 / var(--tw-border-opacity, 1))}.border-og-100{--tw-border-opacity: 1;border-color:rgb(206 209 214 / var(--tw-border-opacity, 1))}.bg-\[\#f0fdf4\]{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-\[\#fdfdfd\]{--tw-bg-opacity: 1;background-color:rgb(253 253 253 / var(--tw-bg-opacity, 1))}.bg-\[\#fef2f2\]{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-\[\#fef3c7\]{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-\[\#fef3c7\]\/60{background-color:#fef3c799}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(19 72 220 / var(--tw-bg-opacity, 1))}.bg-accent-soft\/40{background-color:#eaf0ff66}.bg-og-1000\/45{background-color:#0d0d0f73}.bg-og-50{--tw-bg-opacity: 1;background-color:rgb(227 228 231 / var(--tw-bg-opacity, 1))}.bg-og-50\/40{background-color:#e3e4e766}.bg-page{--tw-bg-opacity: 1;background-color:rgb(250 250 250 / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pt-24{padding-top:6rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-display{font-family:Lilex,iA Writer Quattro S,ui-sans-serif,system-ui,sans-serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.tracking-\[0\.05em\]{letter-spacing:.05em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-tight{letter-spacing:-.025em}.\!text-accent{--tw-text-opacity: 1 !important;color:rgb(19 72 220 / var(--tw-text-opacity, 1))!important}.\!text-danger{--tw-text-opacity: 1 !important;color:rgb(185 28 28 / var(--tw-text-opacity, 1))!important}.\!text-success{--tw-text-opacity: 1 !important;color:rgb(21 128 61 / var(--tw-text-opacity, 1))!important}.\!text-warn{--tw-text-opacity: 1 !important;color:rgb(180 83 9 / var(--tw-text-opacity, 1))!important}.text-accent{--tw-text-opacity: 1;color:rgb(19 72 220 / var(--tw-text-opacity, 1))}.text-current{color:currentColor}.text-danger{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-og-1000{--tw-text-opacity: 1;color:rgb(13 13 15 / var(--tw-text-opacity, 1))}.text-og-400{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.text-og-500{--tw-text-opacity: 1;color:rgb(109 116 132 / var(--tw-text-opacity, 1))}.text-og-600{--tw-text-opacity: 1;color:rgb(98 105 118 / var(--tw-text-opacity, 1))}.text-og-700{--tw-text-opacity: 1;color:rgb(83 89 100 / var(--tw-text-opacity, 1))}.text-og-800{--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-warn{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.accent-\[\#1348dc\]{accent-color:#1348dc}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-modal{--tw-shadow: 0 12px 32px rgba(15, 23, 42, .12);--tw-shadow-colored: 0 12px 32px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-toast{--tw-shadow: 0 4px 12px rgba(15, 23, 42, .08);--tw-shadow-colored: 0 4px 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes breathe{0%,to{opacity:1}50%{opacity:.35}}.placeholder\:text-og-400::-moz-placeholder{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.placeholder\:text-og-400::placeholder{--tw-text-opacity: 1;color:rgb(135 142 155 / var(--tw-text-opacity, 1))}.hover\:\!border-accent:hover{--tw-border-opacity: 1 !important;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1))!important}.hover\:\!border-danger:hover{--tw-border-opacity: 1 !important;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))!important}.hover\:\!border-success:hover{--tw-border-opacity: 1 !important;border-color:rgb(21 128 61 / var(--tw-border-opacity, 1))!important}.hover\:\!border-warn:hover{--tw-border-opacity: 1 !important;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))!important}.hover\:\!bg-\[\#dcfce7\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef2f2\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef3c7\]:hover{--tw-bg-opacity: 1 !important;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-\[\#fef3c7\]\/60:hover{background-color:#fef3c799!important}.hover\:\!bg-accent-soft:hover{--tw-bg-opacity: 1 !important;background-color:rgb(234 240 255 / var(--tw-bg-opacity, 1))!important}.hover\:bg-\[\#fef2f2\]:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-og-100:hover{--tw-bg-opacity: 1;background-color:rgb(206 209 214 / var(--tw-bg-opacity, 1))}.hover\:bg-og-25:hover{--tw-bg-opacity: 1;background-color:rgb(241 242 244 / var(--tw-bg-opacity, 1))}.hover\:bg-og-50\/40:hover{background-color:#e3e4e766}.hover\:bg-og-50\/60:hover{background-color:#e3e4e799}.hover\:\!text-danger:hover{--tw-text-opacity: 1 !important;color:rgb(185 28 28 / var(--tw-text-opacity, 1))!important}.hover\:\!text-warn:hover{--tw-text-opacity: 1 !important;color:rgb(180 83 9 / var(--tw-text-opacity, 1))!important}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(15 59 184 / var(--tw-text-opacity, 1))}.hover\:text-og-1000:hover{--tw-text-opacity: 1;color:rgb(13 13 15 / var(--tw-text-opacity, 1))}.hover\:text-og-800:hover{--tw-text-opacity: 1;color:rgb(71 76 85 / var(--tw-text-opacity, 1))}.hover\:opacity-100:hover{opacity:1}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(19 72 220 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-\[3px\]:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-accent-soft:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(234 240 255 / var(--tw-ring-opacity, 1))}.active\:bg-og-200:active{--tw-bg-opacity: 1;background-color:rgb(192 195 202 / var(--tw-bg-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(15 59 184 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:inline{display:inline}.sm\:table-cell{display:table-cell}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-1{gap:.25rem}.sm\:gap-4{gap:1rem}.sm\:px-2\.5{padding-left:.625rem;padding-right:.625rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
var vt=Object.defineProperty;var yt=(s,t,r)=>t in s?vt(s,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[t]=r;var O=(s,t,r)=>yt(s,typeof t!="symbol"?t+"":t,r);import{r as a,j as e,c as Nt}from"./react-BG4Iuztk.js";import{x as St,a as kt}from"./xterm-D5X2JljJ.js";import{L as he,u as Qe,a as Ue,B as Et,b as Rt,N as Je,R as At,c as me}from"./router-CApkciQz.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))i(n);new MutationObserver(n=>{for(const o of n)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function r(n){const o={};return n.integrity&&(o.integrity=n.integrity),n.referrerPolicy&&(o.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?o.credentials="include":n.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(n){if(n.ep)return;n.ep=!0;const o=r(n);fetch(n.href,o)}})();const Ce="/api",We="baxian.token",Se="baxian:unauthorized";function qe(){try{return typeof localStorage<"u"?localStorage.getItem(We):null}catch{return null}}function Ct(s){try{localStorage.setItem(We,s)}catch(t){console.error("Failed to save auth token to localStorage",t)}}function Tt(){try{localStorage.removeItem(We)}catch(s){console.error("Failed to clear auth token from localStorage",s)}}function be(s){const t=qe();return{...s??{},...t?{Authorization:`Bearer ${t}`}:{}}}class ke extends Error{constructor(t,r,i){super(r),this.status=t,this.details=i,this.name="ApiError"}}async function ge(s){const t=await s.text();let r=t||`HTTP ${s.status}`,i;try{const n=JSON.parse(t);typeof n.error=="string"&&(r=n.error),Array.isArray(n.details)&&(i=n.details)}catch{}throw s.status===401&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(Se)),new ke(s.status,r,i)}async function le(s){const t=await fetch(`${Ce}${s}`,{headers:be()});return t.ok||await ge(t),t.json()}async function It(){const s=await fetch("/health");return s.ok||await ge(s),s.json()}async function ae(s,t,r){const i=t!==void 0,n=await fetch(`${Ce}${s}`,{method:"POST",headers:i?be({"Content-Type":"application/json"}):be(),body:i?JSON.stringify(t):void 0,signal:r==null?void 0:r.signal});return n.ok||await ge(n),n.json()}async function Pt(s,t,r){const i=await fetch(`${Ce}${s}`,{method:"PATCH",headers:be({"Content-Type":"application/json"}),body:t?JSON.stringify(t):void 0,signal:r==null?void 0:r.signal});if(i.ok||await ge(i),i.status===204)return;const n=await i.text();if(n)return JSON.parse(n)}async function Ke(s){const t=await fetch(`${Ce}${s}`,{method:"DELETE",headers:be()});if(t.ok||await ge(t),t.status===204)return;const r=await t.text();if(r)return JSON.parse(r)}const H=encodeURIComponent,D={agents:{list:()=>le("/agents"),get:s=>le(`/agents/${H(s)}`),stop:s=>Ke(`/agents/${H(s)}/session`),probe:(s,t,r)=>ae("/agents/probe",{mode:s,host:t},r)},tasks:{list:s=>le(`/tasks${s?`?projectId=${H(s)}`:""}`),get:s=>le(`/tasks/${H(s)}`),create:s=>ae("/tasks",s),update:(s,t)=>Pt(`/tasks/${H(s)}`,t),retry:s=>ae(`/tasks/${H(s)}/retry`),review:s=>ae(`/tasks/${H(s)}/review`)},projects:{list:()=>le("/projects"),get:s=>le(`/projects/${H(s)}`),create:s=>ae("/projects",s),addAgent:(s,t)=>ae(`/projects/${H(s)}/agents`,t),deleteAgent:(s,t)=>Ke(`/projects/${H(s)}/agents/${H(t)}`),resumeAgent:(s,t)=>ae(`/projects/${H(s)}/agents/${H(t)}/resume`),bootstrap:s=>ae(`/projects/${H(s)}/bootstrap`)},config:{get:()=>le("/config")},health:{get:It},server:{restart:()=>ae("/restart")}},dt=a.createContext(null),$t={success:"border-[#bbf7d0] bg-[#f0fdf4] text-success",warn:"border-[#fde68a] bg-[#fef3c7] text-warn",error:"border-[#fecaca] bg-[#fef2f2] text-danger"},Dt={success:"✅",warn:"⚠️",error:"❌"};let Ot=1;function Lt({children:s}){const[t,r]=a.useState([]),i=a.useCallback(o=>{r(l=>l.filter(p=>p.id!==o))},[]),n=a.useCallback(o=>{const l=Ot++,p=o.durationMs??3e3;r(g=>[...g,{...o,id:l}]),setTimeout(()=>i(l),p)},[i]);return e.jsxs(dt.Provider,{value:{show:n},children:[s,e.jsx("div",{className:"pointer-events-none fixed right-4 top-4 z-[60] flex flex-col gap-2",children:t.map(o=>e.jsx("div",{className:`pointer-events-auto w-80 rounded-lg border px-4 py-3 shadow-toast ${$t[o.kind]}`,role:"status",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{"aria-hidden":!0,className:"text-[14px]",children:Dt[o.kind]}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold",children:o.title}),o.body&&e.jsx("div",{className:"mt-1 whitespace-pre-line text-[12px] text-og-700",children:o.body})]}),e.jsx("button",{type:"button",onClick:()=>i(o.id),className:"text-current opacity-50 transition-opacity hover:opacity-100","aria-label":"Dismiss",children:"✕"})]})},o.id))})]})}function je(){const s=a.useContext(dt);if(!s)throw new Error("useToast must be inside <ToastProvider>");return s}const Ee="baxian.pendingRestart",Mt=500,_t=3e4,ut=a.createContext(null);function Ft(){try{const s=localStorage.getItem(Ee);if(!s)return{count:0,baselineStartedAt:null};const t=JSON.parse(s);return{count:typeof t.count=="number"?t.count:0,baselineStartedAt:typeof t.baselineStartedAt=="string"?t.baselineStartedAt:null}}catch{return{count:0,baselineStartedAt:null}}}function zt(s){try{s.count<=0?localStorage.removeItem(Ee):localStorage.setItem(Ee,JSON.stringify(s))}catch{}}function Bt({children:s}){const t=Ft(),[r,i]=a.useState(t.count),[n,o]=a.useState(t.baselineStartedAt),[l,p]=a.useState(t.count>0?"pending":"idle"),[g,x]=a.useState(),d=a.useRef(t.count),m=a.useRef(t.count>0?"pending":"idle"),f=a.useRef(0),h=a.useCallback(k=>{d.current=k,i(k)},[]),u=a.useCallback(k=>{i(A=>{const j=k(A);return d.current=j,j})},[]),v=a.useCallback(k=>{m.current=k,p(k)},[]);a.useEffect(()=>{zt({count:r,baselineStartedAt:n})},[r,n]),a.useEffect(()=>{let k=!1;(async()=>{try{const j=await D.health.get();if(k)return;o(b=>b!==null&&j.startedAt!==b?(h(0),v("idle"),null):b)}catch{}})();const A=j=>{if(j.key===Ee){if(j.newValue===null){if(m.current==="restarting"&&f.current>0){h(f.current),o(null);return}h(0),o(null),m.current!=="restarting"&&v("idle");return}try{const b=JSON.parse(j.newValue);typeof b.count=="number"&&(m.current==="restarting"&&b.count>d.current&&(f.current+=b.count-d.current),h(b.count),m.current!=="restarting"&&v(b.count>0?"pending":"idle")),typeof b.baselineStartedAt=="string"?o(b.baselineStartedAt):b.baselineStartedAt===null&&o(null)}catch{}}};return window.addEventListener("storage",A),()=>{k=!0,window.removeEventListener("storage",A)}},[h,v]);const c=a.useRef(!1),C=a.useCallback(()=>{u(k=>k+1),m.current==="restarting"?f.current+=1:v("pending"),o(k=>(k!==null||c.current||(c.current=!0,(async()=>{try{const A=await D.health.get();o(j=>j??A.startedAt)}catch{}finally{c.current=!1}})()),k))},[v,u]),I=a.useCallback(async()=>{f.current=0,x(void 0),v("restarting");let k;try{k=(await D.health.get()).startedAt}catch(j){v("failed"),x(`获取重启前 startedAt 失败: ${j instanceof Error?j.message:String(j)}`);return}try{await D.server.restart()}catch(j){if(!(j instanceof ke&&j.status===409)){v("failed"),x(`触发重启失败: ${j instanceof Error?j.message:String(j)}`);return}}const A=Date.now();for(;Date.now()-A<_t;){await new Promise(j=>setTimeout(j,Mt));try{const j=await D.health.get();if(j.startedAt!==k){const b=f.current;f.current=0,o(b>0?j.startedAt:null),h(b),v(b>0?"pending":"idle");return}}catch{}}v("failed"),x("重启超时(30s 未恢复)。请检查日志或手动 baxian start -c <path>")},[h,v]);return e.jsx(ut.Provider,{value:{phase:l,count:r,error:g,flagDirty:C,triggerRestart:I},children:s})}function Te(){const s=a.useContext(ut);if(!s)throw new Error("usePendingRestart must be used inside PendingRestartProvider");return s}const Qt=[500,1e3,2e3,4e3,8e3,15e3,3e4];class ht{constructor(t){O(this,"attempts",0);O(this,"timer",null);O(this,"delaysMs");this.opts=t,this.delaysMs=t.delaysMs??Qt}schedule(){if(this.timer||!this.shouldReconnect())return;const t=this.delaysMs[Math.min(this.attempts,this.delaysMs.length-1)];this.attempts+=1,this.timer=setTimeout(()=>{this.timer=null,this.shouldReconnect()&&this.opts.reconnect()},t)}cancel(){this.timer&&(clearTimeout(this.timer),this.timer=null)}reset(){this.attempts=0}shouldReconnect(){return this.opts.shouldReconnect?this.opts.shouldReconnect():!0}}let Ve=0;function Ut(){Ve++;const s=Math.random().toString(36).slice(2,8);return`sub-${Date.now().toString(36)}-${Ve}-${s}`}function Wt(s){return Array.from(new TextEncoder().encode(s)).map(t=>t.toString(16).padStart(2,"0")).join("")}function qt(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/stream`}const Ht=(s,t)=>t&&t.length>0?new WebSocket(s,t):new WebSocket(s);class Gt{constructor(t={}){O(this,"wsUrl");O(this,"wsFactory");O(this,"tokenProvider");O(this,"ws",null);O(this,"subs",new Map);O(this,"snapshotPending",new Set);O(this,"preSubscribeQueue",new Map);O(this,"outbox",[]);O(this,"reconnectScheduler");O(this,"explicitlyClosed",!1);this.wsUrl=t.wsUrl??qt(),this.wsFactory=t.wsFactory??Ht,this.tokenProvider=t.tokenProvider??qe,this.reconnectScheduler=new ht({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.subs.size>0})}subscribe(t){const r=Ut(),i={subscriberId:r,agentId:t.agentId,mode:t.mode,onSnapshot:t.onSnapshot,onData:t.onData,onError:t.onError,onSessionGone:t.onSessionGone};return this.subs.set(r,i),this.snapshotPending.add(r),this.preSubscribeQueue.set(r,[]),this.ensureSocket(),this.wsSendOrQueue({op:"subscribe",subscriberId:r,agentId:t.agentId,mode:t.mode}),{subscriberId:r,unsubscribe:()=>this.unsubscribe(r)}}send(t,r){if(this.subs.has(t)){if(this.snapshotPending.has(t)){this.outbox.push({op:"input",subscriberId:t,data:r});return}this.wsSendOrQueue({op:"input",subscriberId:t,data:r})}}resize(t,r,i){const n=this.subs.get(t);n&&(n.lastSize={cols:r,rows:i},!this.snapshotPending.has(t)&&this.wsSendOrQueue({op:"resize",subscriberId:t,cols:r,rows:i}))}ping(){this.wsSendOrQueue({op:"ping"})}close(){if(this.explicitlyClosed=!0,this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.ws){try{this.ws.close()}catch{}this.ws=null}this.subs.clear(),this.snapshotPending.clear(),this.preSubscribeQueue.clear(),this.outbox=[]}unsubscribe(t){this.subs.has(t)&&(this.subs.delete(t),this.snapshotPending.delete(t),this.preSubscribeQueue.delete(t),this.wsSendOrQueue({op:"unsubscribe",subscriberId:t}),this.subs.size===0&&this.teardownSocket())}teardownSocket(){if(this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.outbox=[],this.ws){try{this.ws.close()}catch{}this.ws=null}}ensureSocket(){this.explicitlyClosed||this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)||this.openSocket()}openSocket(){if(this.explicitlyClosed)return;this.reconnectScheduler.cancel();const t=this.tokenProvider(),r=t?[`baxian.token.${Wt(t)}`]:void 0;let i;try{i=this.wsFactory(this.wsUrl,r)}catch(n){console.warn("[pane-stream] WebSocket constructor threw:",n),this.scheduleReconnect();return}this.ws=i,i.onopen=()=>{if(i!==this.ws)return;this.reconnectScheduler.reset();for(const o of this.subs.values()){this.snapshotPending.add(o.subscriberId),this.preSubscribeQueue.set(o.subscriberId,[]),o.snapshotSeq=void 0;try{i.send(JSON.stringify({op:"subscribe",subscriberId:o.subscriberId,agentId:o.agentId,mode:o.mode}))}catch(l){console.warn("[pane-stream] resubscribe send failed:",l)}}const n=this.outbox;this.outbox=[];for(const o of n)if(o.op!=="subscribe"){if("subscriberId"in o&&o.subscriberId){if(!this.subs.has(o.subscriberId))continue;if(this.snapshotPending.has(o.subscriberId)&&o.op!=="unsubscribe"){this.outbox.push(o);continue}}try{i.send(JSON.stringify(o))}catch(l){console.warn("[pane-stream] outbox flush failed:",l)}}},i.onmessage=n=>{if(i!==this.ws)return;let o;try{const l=typeof n.data=="string"?n.data:String(n.data);o=JSON.parse(l)}catch{return}this.handleMessage(o)},i.onclose=()=>{i===this.ws&&(this.ws=null,!this.explicitlyClosed&&this.subs.size!==0&&this.scheduleReconnect())},i.onerror=()=>{}}scheduleReconnect(){this.reconnectScheduler.schedule()}wsSendOrQueue(t){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(t));return}catch(r){console.warn("[pane-stream] send failed, will queue:",r)}this.outbox.push(t)}handleMessage(t){var r,i;switch(t.type){case"snapshot":this.handleSnapshot(t);break;case"subscribed":this.handleSubscribed(t);break;case"data":this.dispatch(t);break;case"session_gone":for(const n of[...this.subs.values()])n.agentId===t.agentId&&((r=n.onSessionGone)==null||r.call(n));break;case"error":{if(t.subscriberId){const n=this.subs.get(t.subscriberId);(i=n==null?void 0:n.onError)==null||i.call(n,{code:t.code,message:t.message})}else console.warn("[pane-stream] connection-level error:",t.code,t.message);break}}}handleSnapshot(t){const r=this.subs.get(t.subscriberId);r&&r.onSnapshot({cols:t.cols,rows:t.rows,data:t.data})}handleSubscribed(t){const r=this.subs.get(t.subscriberId);if(!r)return;r.snapshotSeq=t.snapshotSeq,r.lastSize||(r.lastSize={cols:t.cols,rows:t.rows}),this.snapshotPending.delete(t.subscriberId);const i=this.preSubscribeQueue.get(t.subscriberId);if(this.preSubscribeQueue.delete(t.subscriberId),i)for(const n of i)n.seq>t.snapshotSeq&&r.onData(n.data);r.mode==="full"&&r.lastSize&&this.wsSendOrQueue({op:"resize",subscriberId:r.subscriberId,cols:r.lastSize.cols,rows:r.lastSize.rows}),this.flushOutboxForSub(t.subscriberId)}flushOutboxForSub(t){if(this.outbox.length===0||!this.ws||this.ws.readyState!==WebSocket.OPEN)return;const r=[];for(const i of this.outbox)if("subscriberId"in i&&i.subscriberId===t&&i.op!=="subscribe")try{this.ws.send(JSON.stringify(i))}catch(n){console.warn("[pane-stream] flushOutboxForSub send failed:",n)}else r.push(i);this.outbox=r}dispatch(t){for(const r of this.subs.values())if(r.agentId===t.agentId)if(this.snapshotPending.has(r.subscriberId)){const i=this.preSubscribeQueue.get(r.subscriberId);i&&i.push({seq:t.seq,data:t.data})}else r.onData(t.data)}}let $e=null;function De(){return $e||($e=new Gt),$e}function Jt(s){const{agentId:t,mode:r}=s,i=a.useRef(null),n=a.useRef({onSnapshot:s.onSnapshot,onData:s.onData,onError:s.onError,onSessionGone:s.onSessionGone});n.current={onSnapshot:s.onSnapshot,onData:s.onData,onError:s.onError,onSessionGone:s.onSessionGone},a.useEffect(()=>{const g=De().subscribe({agentId:t,mode:r,onSnapshot:x=>n.current.onSnapshot(x),onData:x=>n.current.onData(x),onError:x=>{var d,m;return(m=(d=n.current).onError)==null?void 0:m.call(d,x)},onSessionGone:()=>{var x,d;return(d=(x=n.current).onSessionGone)==null?void 0:d.call(x)}});return i.current=g.subscriberId,()=>{i.current=null,g.unsubscribe()}},[t,r]);const o=a.useCallback(p=>{const g=i.current;g&&De().send(g,p)},[]),l=a.useCallback((p,g)=>{const x=i.current;x&&De().resize(x,p,g)},[]);return{send:o,resize:l}}const Kt=[{key:"up",label:"上",path:"M12 5l-6 6m6-6l6 6m-6-6v14"},{key:"down",label:"下",path:"M12 19l6-6m-6 6l-6-6m6 6V5"},{key:"left",label:"左",path:"M5 12l6-6m-6 6l6 6m-6-6h14"},{key:"right",label:"右",path:"M19 12l-6-6m6 6l-6 6m6-6H5"}],we=Object.fromEntries(Kt.map(s=>[s.key,s]));function ve({arrow:s,onPress:t}){return e.jsx("button",{type:"button","aria-label":`方向键 ${s.label}`,"data-arrow":s.key,onMouseDown:r=>r.preventDefault(),onClick:()=>t(s.key),className:"flex h-8 w-8 items-center justify-center rounded border border-hairline bg-surface text-og-700 transition-colors hover:bg-og-100 hover:text-og-1000 active:bg-og-200",children:e.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e.jsx("path",{d:s.path})})})}function Vt({onKey:s,className:t}){return e.jsxs("div",{role:"group","aria-label":"终端方向键",className:t??"flex flex-none flex-col items-center gap-1 border-t border-hairline bg-page px-3 py-2",children:[e.jsx(ve,{arrow:we.up,onPress:s}),e.jsxs("div",{className:"flex gap-1",children:[e.jsx(ve,{arrow:we.left,onPress:s}),e.jsx(ve,{arrow:we.down,onPress:s}),e.jsx(ve,{arrow:we.right,onPress:s})]})]})}const Yt={up:"A",down:"B",right:"C",left:"D"};function Zt(s,t){return(t?"\x1BO":"\x1B[")+Yt[s]}const Ye=18,Xt=250,es=256*1024,Ze="#fdfdfd",ts='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',ss={background:Ze,foreground:"#474c55",cursor:"#1348dc",cursorAccent:Ze,selectionBackground:"#eaf0ff",black:"#0d0d0f",red:"#b91c1c",green:"#15803d",yellow:"#b45309",blue:"#1348dc",magenta:"#9333ea",cyan:"#0e7490",white:"#474c55",brightBlack:"#878e9b",brightRed:"#dc2626",brightGreen:"#16a34a",brightYellow:"#d97706",brightBlue:"#3080ff",brightMagenta:"#a855f7",brightCyan:"#0891b2",brightWhite:"#0d0d0f"},ns=/\x1b\[(?:\?[\d;]*c|>[\d;]*c|\??\d+;\d+R|\d+n)/g;function rs(s){return s.replace(ns,"")}function _e({agentId:s,mode:t,interactive:r=!1,maxLines:i,className:n,autoFocus:o=!0,deferFullUntilFocus:l=!1,arrowKeys:p=!1}){const g=a.useRef(null),x=a.useRef(null),d=a.useRef(null),m=a.useRef(!1),f=a.useRef(""),h=a.useRef([]),u=a.useRef(0),v=a.useRef(null),c=a.useRef(null),C=a.useRef(Promise.resolve()),I=a.useRef(0),[k,A]=a.useState(null),[j,b]=a.useState(!1),S=`${s}\0${t}\0${l?"1":"0"}`,[P,M]=a.useState({key:S,active:!1}),F=P.key===S&&P.active,Q=t==="full"&&l,T=Q&&!F?"preview":t,z=r&&T==="full",_=(w,$)=>$.length===0?Promise.resolve():new Promise(R=>{try{w.write($,()=>R())}catch(W){console.warn("[pane-terminal] write failed:",W),R()}}),U=!!(i&&i>0),G=()=>{if(!U)return;const w=g.current,$=x.current;if(!w||!$)return;const W=($.buffer.active.cursorY+1)*Ye;w.scrollTop=Math.max(0,W-w.clientHeight)},V=(w,$)=>{C.current=C.current.then(async()=>{const R=x.current;if(!(!R||$!==I.current))try{await w(R),G()}catch(W){console.warn("[pane-terminal] terminal task failed:",W)}}).catch(R=>{console.warn("[pane-terminal] write chain failed:",R)})},te=(w,$)=>{V(R=>_(R,w),$)},Y=()=>{v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),c.current!==null&&(clearTimeout(c.current),c.current=null)},ce=()=>{Y(),h.current=[],u.current=0},se=()=>{Y();const w=h.current;w.length!==0&&(h.current=[],u.current=0,te(w.join(""),I.current))},Z=w=>{if(w.length!==0){if(h.current.push(w),u.current+=w.length,u.current>=es){se();return}v.current===null&&(v.current=requestAnimationFrame(se)),c.current===null&&(c.current=setTimeout(se,Xt))}},{send:y,resize:B}=Jt({agentId:s,mode:T,onSnapshot:({cols:w,rows:$,data:R})=>{if(x.current)try{const ne=I.current+1;I.current=ne,ce(),V(async re=>{re.reset(),w>0&&$>0&&re.resize(w,$),await _(re,R)},ne)}catch(ne){console.warn("[pane-terminal] snapshot write failed:",ne)}},onData:w=>{Z(w)},onError:w=>A(`${w.code}: ${w.message}`),onSessionGone:()=>b(!0)});a.useEffect(()=>{A(null),b(!1)},[s,T]),a.useEffect(()=>{f.current=""},[S]),a.useEffect(()=>{if(T!=="full")return;const w=f.current;w.length!==0&&(f.current="",y(w))},[y,T]);const L=a.useCallback(()=>{!r||!Q||F||(m.current=!0,M({key:S,active:!0}))},[S,F,r,Q]),J=a.useCallback(w=>{const $=rs(w);if($.length!==0){if(Q&&(!F||f.current.length>0)){f.current+=$,L();return}y($)}},[L,F,y,Q]);a.useEffect(()=>{const w=g.current;if(!w)return;let $=!1;const R=new St.Terminal({cursorBlink:r,disableStdin:!r,theme:ss,fontFamily:ts,fontSize:13,lineHeight:1.4,scrollback:T==="full"?5e3:1e3}),W=new kt.FitAddon;if(R.loadAddon(W),R.open(w),x.current=R,d.current=W,r&&(o||m.current)){m.current=!1;try{R.focus()}catch{}}r&&R.onData(J);const ne=()=>w.clientWidth>0&&w.clientHeight>0,re=(Pe=!1)=>{if(!ne())return!1;const jt=R.cols,wt=R.rows;try{W.fit()}catch{return!1}return R.cols>0&&R.rows>0&&(Pe||R.cols!==jt||R.rows!==wt)&&B(R.cols,R.rows),!0};let N=null,q=null,X=null,ee=0;const fe=()=>{N||(N=new ResizeObserver(()=>{q&&clearTimeout(q),q=setTimeout(()=>{q=null,re()},100)}),N.observe(w))},xe=()=>{X=requestAnimationFrame(()=>{if(X=null,!($||!z)){if(re(!0)){fe();return}if(ee++<5){xe();return}fe()}})};return xe(),()=>{$=!0,X!==null&&cancelAnimationFrame(X),v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),c.current!==null&&(clearTimeout(c.current),c.current=null),I.current++,h.current=[],u.current=0,C.current=Promise.resolve(),q&&clearTimeout(q),N==null||N.disconnect(),x.current=null,d.current=null;try{R.dispose()}catch(Pe){console.warn("[pane-terminal] dispose failed:",Pe)}}},[s,o,z,J,r,T,B]);const K=()=>{var w;if(r){L();try{(w=x.current)==null||w.focus()}catch{}}},E=i&&i>0?{maxHeight:`${i*Ye}px`}:void 0;return e.jsxs("div",{className:n??"flex flex-col h-full w-full min-h-0 bg-[#fdfdfd]",children:[(k||j)&&e.jsx("div",{className:"border-b border-[#fecaca] bg-[#fef2f2] px-3 py-1 font-mono text-[11px] text-danger",children:j?"session ended":k}),e.jsx("div",{className:"flex flex-1 min-h-0 px-2 py-1.5",style:E,children:e.jsx("div",{ref:g,className:"flex-1 min-h-0 overflow-hidden",onMouseDown:K})}),r&&p&&e.jsx(Vt,{onKey:w=>{var R,W;const $=!!((W=(R=x.current)==null?void 0:R.modes)!=null&&W.applicationCursorKeysMode);J(Zt(w,$))}})]})}const as={unknown:{label:"Unknown",cls:"pill pill-idle"},idle:{label:"Idle",cls:"pill pill-idle"},pending:{label:"Pending user",cls:"pill pill-warn"},working:{label:"Working",cls:"pill pill-live"},waiting:{label:"Waiting",cls:"pill pill-review"},error:{label:"Error",cls:"pill pill-warn"}},is={present:{label:"Session present",modifier:"status-dot--healthy"},absent:{label:"No session",modifier:"status-dot--warn"},unreachable:{label:"Host unreachable",modifier:"status-dot--danger"},unknown:{label:"Session unknown",modifier:"status-dot--warn"},starting:{label:"Starting session",modifier:"status-dot--info"}};function os({state:s}){const{label:t,modifier:r}=is[s];return e.jsx("span",{role:"img","aria-label":t,title:t,className:`status-dot ml-2 ${r}`})}function cs({agent:s,projectId:t,role:r,onDeleted:i,pendingRestart:n=!1,terminalLoading:o=!1,showTaskBinding:l=!0,terminalMode:p="activity-preview"}){var E,w,$,R,W,ne,re;const[g,x]=a.useState(!1),[d,m]=a.useState(null),{show:f}=je(),{flagDirty:h}=Te(),[u,v]=a.useState(!1),[c,C]=a.useState(null),[I,k]=a.useState(!1),[A,j]=a.useState(!1),[b,S]=a.useState(!1),[P,M]=a.useState(!1),F=a.useRef(null),Q=a.useRef(null),T=a.useId(),z=a.useId();a.useEffect(()=>{if(!P)return;const N=X=>{var fe,xe;const ee=X.target;ee&&((fe=Q.current)!=null&&fe.contains(ee)||(xe=F.current)!=null&&xe.contains(ee)||M(!1))},q=X=>{var ee;X.key==="Escape"&&(M(!1),(ee=F.current)==null||ee.focus())};return document.addEventListener("mousedown",N),document.addEventListener("keydown",q),()=>{document.removeEventListener("mousedown",N),document.removeEventListener("keydown",q)}},[P]),a.useEffect(()=>{var q;if(!P)return;const N=(q=Q.current)==null?void 0:q.querySelector('[role="menuitem"]:not([disabled])');N==null||N.focus()},[P]);const _=(E=s.binding)==null?void 0:E.taskId,U=((w=s.binding)==null?void 0:w.status)==="awaiting_human",G=!!(($=s.binding)!=null&&$.creationToken)&&!((R=s.binding)!=null&&R.paneId)&&!U&&s.reason!=="PENDING_HUMAN",V=G?{label:"Starting",cls:"pill pill-review"}:as[s.runtimeStatus],te=G?"starting":s.tmuxSessionStatus,Y=p==="activity-preview"&&!G&&(s.runtimeStatus==="working"||s.runtimeStatus==="pending"),ce=p==="embedded-full",se=o||n||G,Z=o?"Agent 状态加载中":n?"重启 baxian server 后可用":"Agent 正在启动",y=async()=>{x(!0),m(null);try{await D.agents.stop(s.id)}catch(N){m(N instanceof Error?N.message:String(N))}finally{x(!1)}},B=async()=>{if(_&&window.confirm(`请 QA 对 task ${_} 重审?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`)){k(!0);try{const N=await D.tasks.review(_);f({kind:"success",title:`已派 QA 重审 (round ${N.reviewRound})`})}catch(N){f({kind:"error",title:"Review 派发失败",body:N instanceof Error?N.message:String(N)})}finally{k(!1)}}},L=async()=>{S(!0);try{(await D.projects.bootstrap(t)).ok?f({kind:"success",title:"Bootstrap retry 完成",body:"agent 状态将在下一次刷新生效。"}):f({kind:"warn",title:"Bootstrap retry 仍失败",body:"看一下红色错误卡的最新原因,按提示修复后再试。"})}catch(N){f({kind:"error",title:"Bootstrap retry 失败",body:N instanceof Error?N.message:String(N)})}finally{S(!1)}},J=async()=>{if(window.confirm(`确认 Resume Agent ${s.id}?baxian 会清除 awaiting_human 状态,agent 重新可派遣。`)){j(!0);try{const N=await D.projects.resumeAgent(t,s.id);f({kind:"success",title:`Agent ${s.id} 已 Resume`,body:N.releasedBinding?"原任务已释放,agent 可接新任务。":"保留绑定(原任务仍 active)。"})}catch(N){f({kind:"error",title:"Resume 失败",body:N instanceof Error?N.message:String(N)})}finally{j(!1)}}},K=async()=>{if(window.confirm(`确认删除 Agent ${s.id}?此操作不可撤销`)){v(!0),C(null);try{const N=await D.projects.deleteAgent(t,s.id);N!=null&&N.restartRequired&&h();const q=(N==null?void 0:N.removed)??[s.id];if(q.length>1){const X=q.filter(ee=>ee!==s.id).join(", ");f({kind:"warn",title:`已删除 Agent ${s.id}`,body:`配对的 QA Agent ${X} 也被一并移除。`})}else f({kind:"success",title:`Agent ${s.id} 已删除`});i==null||i()}catch(N){C(N instanceof Error?N.message:String(N))}finally{v(!1)}}};return e.jsxs("div",{className:"card flex h-full min-w-0 flex-col p-4",children:[e.jsxs("div",{className:"mb-3 flex items-start justify-between gap-2",children:[e.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] font-medium uppercase tracking-[0.05em] text-og-500",children:r}),e.jsx("span",{className:"min-w-0 truncate whitespace-nowrap font-display text-[14px] font-semibold text-og-1000",title:s.id,children:s.id})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-1",children:[U&&e.jsx("span",{className:"pill pill-warn",title:((W=s.binding)==null?void 0:W.awaitingReason)??"需人工处理",children:"Held"}),e.jsx("span",{className:V.cls,children:V.label}),s.stale&&e.jsx("span",{className:"pill pill-warn",title:s.observedAt?`Last observed at ${s.observedAt}`:void 0,children:"Stale"}),e.jsx(os,{state:te})]})]}),G&&e.jsx("div",{className:"mb-2 rounded-md border border-accent-soft bg-accent-soft/40 px-2.5 py-2 text-[12px] text-accent",children:"Agent 正在启动,终端可用后会自动刷新。"}),U&&e.jsxs("div",{className:"mb-2 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-2 text-[12px] text-warn",children:[e.jsx("span",{className:"font-mono",children:(ne=s.binding)==null?void 0:ne.awaitingPhase}),((re=s.binding)==null?void 0:re.awaitingReason)&&e.jsxs("span",{children:[" · ",s.binding.awaitingReason]})]}),!G&&s.runtimeStatus==="pending"&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-2 text-[12px] text-warn",children:[e.jsx("div",{className:"font-medium",children:"等待人工介入"}),e.jsxs("div",{children:["Agent 正在等待人工输入。请打开 ",e.jsx(he,{to:`/terminal/${s.id}`,className:"text-accent hover:text-accent-hover underline",children:"Terminal"})," 处理; 处理完后状态会随下一次观测刷新。"]})]}),s.latestError&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fecaca] bg-[#fef2f2] px-2.5 py-2 text-[12px] text-danger",children:[e.jsx("div",{className:"break-words font-medium",children:s.latestError.message}),e.jsxs("div",{className:"font-mono text-[11px] opacity-80",children:[s.latestError.reason," · ",s.latestError.occurredAt]})]}),s.latestBootstrapError&&e.jsxs("div",{className:"mb-2 space-y-1 rounded-md border border-[#fecaca] bg-[#fef2f2] px-2.5 py-2 text-[12px] text-danger",children:[e.jsx("div",{className:"break-words font-medium",children:s.latestBootstrapError.message}),s.latestBootstrapError.recommendation&&e.jsx("div",{className:"break-words",children:s.latestBootstrapError.recommendation}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"truncate font-mono text-[11px] opacity-80",children:[s.latestBootstrapError.reason," · ",s.latestBootstrapError.occurredAt]}),e.jsx("button",{type:"button",onClick:L,disabled:b,className:"btn-secondary shrink-0 !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger hover:!text-danger",children:b?"Retrying…":"Retry bootstrap"})]})]}),l&&_&&e.jsxs("div",{className:"mb-2 text-[12px] text-og-500",children:["Task: ",e.jsx("span",{className:"font-mono text-og-700",children:_})]}),Y&&e.jsx("div",{className:"mb-2 overflow-hidden rounded-md border border-hairline bg-surface",children:e.jsx(_e,{agentId:s.id,mode:"preview",maxLines:6,interactive:!1})}),ce&&e.jsx("div",{className:"mb-2 mt-3 h-80 min-h-0 overflow-hidden rounded-md border border-hairline bg-surface",children:se?e.jsx("div",{className:"flex h-full items-center justify-center px-3 text-[13px] text-og-500",children:Z}):e.jsx(_e,{agentId:s.id,mode:"full",interactive:!0,autoFocus:!1,deferFullUntilFocus:!0})}),n&&e.jsx("div",{className:"mb-2 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-2.5 py-1.5 text-[12px] text-warn",children:"⚠️ 重启 baxian server 后生效"}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[se?e.jsx("span",{className:"cursor-not-allowed text-[13px] text-og-400",title:Z,children:"Terminal"}):e.jsx(he,{to:`/terminal/${s.id}`,className:"btn-secondary",children:"Terminal"}),!n&&s.runtimeStatus==="working"&&e.jsx("button",{onClick:y,disabled:g,className:"btn-ghost !text-danger hover:!bg-[#fef2f2]",children:g?"Stopping…":"Stop"}),d&&e.jsx("span",{className:"text-[12px] text-danger",children:d}),U&&e.jsx("button",{type:"button",onClick:J,disabled:A,title:"清除 awaiting_human 状态,让 agent 重新可派遣",className:"btn-ghost !text-warn hover:!bg-[#fef3c7]/60",children:A?"Resuming…":"Resume"}),!n&&_&&r==="dev"&&e.jsx("button",{type:"button",onClick:B,disabled:I,title:`让 QA 立即对 task ${_} 跑一轮 review(需要该 task 已有 PR)`,className:"btn-ghost !text-accent hover:!bg-accent-soft",children:I?"Dispatching…":"Request QA review"}),e.jsxs("div",{className:"relative ml-auto",children:[e.jsx("button",{ref:F,id:z,type:"button",onClick:()=>M(N=>!N),disabled:u,"aria-haspopup":"menu","aria-expanded":P,"aria-controls":T,"aria-label":`Agent ${s.id} 操作菜单`,className:"flex h-8 w-8 items-center justify-center rounded text-og-500 transition-colors hover:bg-og-100 hover:text-og-1000 disabled:cursor-not-allowed disabled:opacity-50",children:e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[e.jsx("circle",{cx:"12",cy:"12",r:"1"}),e.jsx("circle",{cx:"12",cy:"5",r:"1"}),e.jsx("circle",{cx:"12",cy:"19",r:"1"})]})}),P&&e.jsx("div",{ref:Q,id:T,role:"menu","aria-labelledby":z,className:"absolute right-0 bottom-full z-10 mb-1 min-w-[140px] rounded-md border border-hairline bg-surface py-1 shadow-md",children:e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{M(!1),K()},disabled:u,className:"block w-full px-3 py-1.5 text-left text-[13px] text-danger hover:bg-[#fef2f2] disabled:opacity-50",children:u?"删除中…":"删除"})})]}),c&&e.jsx("span",{className:"text-[12px] text-danger",children:c})]})]})}const ls=new Set(["in_progress","review","fixing","approved"]);function ft({group:s,projectId:t,agentsById:r,agentsLoaded:i,agentsError:n=!1,tasks:o,onDeleted:l,terminalMode:p="activity-preview"}){const g=s.find(h=>h.role==="dev")??s[0],x=s.find(h=>h.role==="qa"),d=o.filter(h=>ds(h,g==null?void 0:g.id,x==null?void 0:x.id)),m=`Agent group ${s.map(h=>h.id).join(" / ")}`,f=p==="embedded-full"?s.length<=1?"lg:grid-cols-1":s.length===2?"lg:grid-cols-2":s.length===3?"lg:grid-cols-3":"lg:grid-cols-4":"sm:grid-cols-2";return e.jsxs("div",{role:"group","aria-label":m,className:"min-w-0",children:[d.length>0?e.jsx("div",{className:"card mb-2 max-h-28 overflow-y-auto divide-y divide-hairline",children:d.map(h=>{const u=h.phase==="spec"?h.specReviewRound??0:h.reviewRound;return e.jsxs(he,{to:`/task/${h.id}`,className:"flex items-center gap-3 px-3 py-2 text-[13px] transition-colors hover:bg-og-50/60",children:[e.jsxs("div",{className:"min-w-0 flex-1 flex items-center gap-2",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] text-og-500",children:h.id}),e.jsx("span",{className:"truncate text-og-1000",children:h.title})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[e.jsx("span",{className:"pill",children:h.status}),e.jsxs("span",{"aria-label":`Round ${u}`,className:"pill pill-review",children:["Round ",u]})]})]},h.id)})}):e.jsx("div",{className:"mb-2 rounded-lg border border-hairline bg-surface px-3 py-2 text-[13px] text-og-400","aria-label":`${m} no active task`,children:"暂无任务"}),e.jsx("div",{className:`grid grid-cols-1 ${f} gap-4`,children:s.map(h=>{const u=r.get(h.id),v=u??{id:h.id,projectId:t,runtimeStatus:"unknown",tmuxSessionStatus:"unknown",stale:!0};return e.jsx(cs,{agent:v,projectId:t,role:h.role,pendingRestart:i&&!u,terminalLoading:!i&&!u&&!n,onDeleted:l,showTaskBinding:!1,terminalMode:p},h.id)})})]})}function ds(s,t,r){return!(!t||!ls.has(s.status)||!(s.agentId===t||s.preferredAgentId===t)||r&&s.qaAgentId&&s.qaAgentId!==r)}const us={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl"},Xe='input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex]:not([tabindex="-1"])';function Ie({open:s,onClose:t,title:r,children:i,size:n="md"}){const o=a.useRef(null),l=a.useRef(null),p=a.useRef(t);return a.useEffect(()=>{p.current=t},[t]),a.useEffect(()=>{if(!s)return;l.current=document.activeElement;const g=m=>{if(m.key==="Escape"){p.current();return}if(m.key!=="Tab")return;const f=o.current;if(!f)return;const h=Array.from(f.querySelectorAll(Xe)).filter(C=>C.offsetParent!==null||C===document.activeElement);if(h.length===0){m.preventDefault();return}const u=h[0],v=h[h.length-1],c=document.activeElement;m.shiftKey&&(c===u||!f.contains(c))?(m.preventDefault(),v.focus()):!m.shiftKey&&(c===v||!f.contains(c))&&(m.preventDefault(),u.focus())};document.addEventListener("keydown",g);const x=document.body.style.overflow;document.body.style.overflow="hidden";const d=o.current;if(d){const m=d.querySelector(Xe);m==null||m.focus()}return()=>{var m,f;document.removeEventListener("keydown",g),document.body.style.overflow=x,(f=(m=l.current)==null?void 0:m.focus)==null||f.call(m)}},[s]),s?e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-og-1000/45 px-3 sm:px-4",onClick:()=>p.current(),role:"presentation",children:e.jsxs("div",{ref:o,className:`w-full ${us[n]} max-h-[90vh] overflow-auto rounded-lg border border-og-100 bg-surface shadow-modal`,onClick:g=>g.stopPropagation(),role:"dialog","aria-modal":"true","aria-label":r,children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-hairline px-6 py-4",children:[e.jsx("h2",{className:"font-display text-[16px] font-semibold tracking-tight text-og-1000",children:r}),e.jsx("button",{type:"button",onClick:()=>p.current(),className:"text-og-400 transition-colors hover:text-og-800","aria-label":"Close",children:"✕"})]}),e.jsx("div",{className:"px-6 py-5",children:i})]})}):null}const hs=/^[a-z][a-z0-9-]{1,31}$/,fs=/^[A-Za-z0-9_-][A-Za-z0-9._-]*\/[A-Za-z0-9_-][A-Za-z0-9._-]*$/,et="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",Oe="mb-1.5 block text-[12px] font-medium text-og-700",tt="mt-1 text-[12px] text-danger";function xs({open:s,onClose:t,onCreated:r}){const[i,n]=a.useState(""),[o,l]=a.useState(""),[p,g]=a.useState(null),[x,d]=a.useState(!1),[m,f]=a.useState(null),[h,u]=a.useState({}),[v,c]=a.useState(new Set),C=a.useRef(0),{show:I}=je(),{flagDirty:k}=Te();a.useEffect(()=>{if(!s)return;C.current+=1;const S=C.current;n(""),l(""),g(null),f(null),u({}),c(new Set),D.config.get().then(P=>{S===C.current&&c(new Set(P.project.map(M=>M.id)))}).catch(()=>{})},[s]);const A=()=>{x||t()},j=()=>{const S={};return i?hs.test(i)?v.has(i)&&(S.id="该 id 已被占用"):S.id="小写字母开头,只含 a-z 0-9 -,长度 2-32":S.id="必填",o?fs.test(o)||(S.repo="需为 owner/repo 形式"):S.repo="必填",u(S),Object.keys(S).length===0},b=async S=>{if(S.preventDefault(),!!j()){d(!0),f(null);try{const P=await D.projects.create({id:i,repo:o,merge:p});P.restartRequired&&k(),I({kind:"success",title:`项目 ${P.project.id} 已创建`}),r(P.project.id)}catch(P){f(P instanceof Error?P.message:String(P))}finally{d(!1)}}};return e.jsx(Ie,{open:s,onClose:A,title:"新建项目",size:"md",children:e.jsxs("form",{onSubmit:b,className:"space-y-4",children:[m&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:m}),e.jsxs("div",{children:[e.jsx("label",{className:Oe,htmlFor:"proj-id",children:"项目 ID"}),e.jsx("input",{id:"proj-id",type:"text",value:i,onChange:S=>n(S.target.value),className:et,placeholder:"kongkong",disabled:x}),h.id&&e.jsx("div",{className:tt,children:h.id})]}),e.jsxs("div",{children:[e.jsx("label",{className:Oe,htmlFor:"proj-repo",children:"GitHub 仓库"}),e.jsx("input",{id:"proj-repo",type:"text",value:o,onChange:S=>l(S.target.value),className:et,placeholder:"rockdai/baxian",disabled:x}),h.repo&&e.jsx("div",{className:tt,children:h.repo})]}),e.jsxs("div",{children:[e.jsx("span",{className:Oe,children:"合并策略"}),e.jsxs("label",{className:"mb-1 flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"merge",checked:p===null,onChange:()=>g(null),disabled:x,className:"h-3.5 w-3.5 accent-[#1348dc]"}),e.jsx("span",{className:"text-[13px] text-og-800",children:"人类合并(默认)"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"merge",checked:p==="auto",onChange:()=>g("auto"),disabled:x,className:"h-3.5 w-3.5 accent-[#1348dc]"}),e.jsx("span",{className:"text-[13px] text-og-800",children:"QA Approve 后自动合并"})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:A,disabled:x,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:x,className:"btn-primary",children:x?"创建中…":"创建"})]})]})})}const st=/^[a-z][a-z0-9-]{1,31}$/,ms=500,de="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",ie="mb-1.5 block text-[12px] font-medium text-og-700",nt="mt-1 text-[12px] text-danger",Le="mt-1 text-[12px] text-og-500",ue="h-3.5 w-3.5 accent-[#1348dc]",rt={id:"",role:"dev",pairWith:"",mode:"local",hostname:"",user:"",runtime:"",workdir:"",yolo:!0,model:"",addDirs:""};function xt({open:s,onClose:t,projectId:r,onCreated:i}){var Z;const[n,o]=a.useState(rt),[l,p]=a.useState(null),[g,x]=a.useState(new Set),[d,m]=a.useState(null),[f,h]=a.useState(!1),[u,v]=a.useState(!1),[c,C]=a.useState(null),I=a.useRef(null),k=a.useRef(null),A=a.useRef(0),{show:j}=je(),{flagDirty:b}=Te();a.useEffect(()=>{if(!s)return;A.current+=1;const y=A.current;o(rt),p(null),x(new Set),m(null),h(!1),C(null),D.config.get().then(B=>{if(y!==A.current)return;const L=B.project.find(K=>K.id===r)??null;p(L);const J=new Set;B.project.forEach(K=>K.agent.forEach(E=>E.forEach(w=>J.add(w.id)))),x(J)}).catch(()=>{})},[s,r]);const S=()=>{u||t()},P=a.useCallback(()=>{I.current&&I.current.abort();const y=new AbortController;I.current=y,h(!0),C(null);const B=n.mode==="remote"?{hostname:n.hostname,user:n.user||void 0}:void 0;D.agents.probe(n.mode,B,{signal:y.signal}).then(L=>{y.signal.aborted||(m(L),C(null))}).catch(L=>{y.signal.aborted||(m(null),C(L instanceof Error?L.message:String(L)))}).finally(()=>{I.current===y&&h(!1)})},[n.mode,n.hostname,n.user]);a.useEffect(()=>{if(s&&(m(null),I.current&&I.current.abort(),!(n.mode==="remote"&&!n.hostname)))return k.current&&clearTimeout(k.current),k.current=setTimeout(P,ms),()=>{k.current&&clearTimeout(k.current)}},[s,n.mode,n.hostname,n.user,P]),a.useEffect(()=>{s||I.current&&I.current.abort()},[s]),a.useEffect(()=>()=>{I.current&&I.current.abort(),k.current&&clearTimeout(k.current)},[]);const M=(l==null?void 0:l.agent.filter(y=>y.length===1&&y[0].role==="dev").map(y=>y[0]))??[],F=M.length>0,Q=st.test(n.id)&&!g.has(n.id),T=n.mode==="local"||n.mode==="remote"&&n.hostname.length>0,z=n.runtime!==""&&(n.runtime==="claude-code"?!!(d!=null&&d.runtimes["claude-code"].ok):!!(d!=null&&d.runtimes.codex.ok)),_=!!(d!=null&&d.tmux.ok),U=n.mode==="local"||!!((Z=d==null?void 0:d.ssh)!=null&&Z.ok),G=n.role==="dev"||n.role==="qa"&&n.pairWith!=="",V=!u&&Q&&T&&G&&z&&_&&U,te=async y=>{if(y.preventDefault(),!!V){v(!0),C(null);try{const B=n.addDirs.split(`
|
|
2
|
-
`).map(K=>K.trim()).filter(K=>K.length>0),L={id:n.id,role:n.role,runtime:n.runtime,mode:n.mode,...n.mode==="remote"?{host:{hostname:n.hostname,...n.user?{user:n.user}:{}}}:{},...n.workdir?{workdir:n.workdir}:{},yolo:n.yolo,...n.model.trim()?{model:n.model.trim()}:{},...B.length>0?{addDirs:B}:{},...n.role==="qa"?{pairWith:n.pairWith}:{}},J=await D.projects.addAgent(r,L);J.restartRequired&&b(),j({kind:"success",title:`Agent ${J.agent.id} 已添加到 ${r}`}),i(),t()}catch(B){C(B instanceof Error?B.message:String(B))}finally{v(!1)}}},Y=({rt:y})=>{if(n.mode==="remote"&&!n.hostname)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"(请先填写 hostname)"});if(f)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"…探测中"});if(!d)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"?"});const L=d.runtimes[y];return L.ok?e.jsxs("span",{className:"ml-2 text-[12px] text-success",children:["✓ ",L.path??""]}):e.jsxs("span",{className:"ml-2 text-[12px] text-danger",title:L.message,children:["⨯ ",L.message]})},ce=()=>n.mode==="remote"&&!n.hostname?null:f?e.jsx("div",{className:"text-[12px] text-og-400",children:"tmux: …探测中"}):d?d.tmux.ok?e.jsxs("div",{className:"text-[12px] text-success",children:["tmux: ✓ ",d.tmux.path??""]}):e.jsxs("div",{className:"text-[12px] text-danger",children:["tmux: ⨯ ",d.tmux.message]}):null,se=()=>n.mode!=="remote"||!n.hostname||!(d!=null&&d.ssh)?null:d.ssh.ok?e.jsxs("div",{className:"text-[12px] text-success",children:["SSH: ✓ ",d.ssh.message]}):e.jsxs("div",{className:"text-[12px] text-danger",children:["SSH: ⨯ ",d.ssh.message]});return e.jsx(Ie,{open:s,onClose:S,title:`添加 Agent 到 ${r}`,size:"lg",children:e.jsxs("form",{onSubmit:te,className:"space-y-4",children:[c&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:c}),e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"agent-id",children:"Agent ID"}),e.jsx("input",{id:"agent-id",type:"text",value:n.id,onChange:y=>o({...n,id:y.target.value}),className:de,placeholder:"kk-cc",disabled:u}),n.id&&!st.test(n.id)&&e.jsx("div",{className:nt,children:"小写字母开头,只含 a-z 0-9 -,长度 2-32"}),n.id&&g.has(n.id)&&e.jsx("div",{className:nt,children:"该 id 已被占用(全局唯一)"})]}),e.jsxs("div",{children:[e.jsx("span",{className:ie,children:"角色"}),e.jsxs("label",{className:"mr-4 inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"role",checked:n.role==="dev",className:ue,onChange:()=>o({...n,role:"dev",pairWith:""}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Dev"})]}),e.jsxs("label",{className:"inline-flex items-center gap-2",title:F?"":"请先创建一个 Dev Agent",children:[e.jsx("input",{type:"radio",name:"role",checked:n.role==="qa",className:ue,onChange:()=>o({...n,role:"qa"}),disabled:u||!F}),e.jsx("span",{className:`text-[13px] ${F?"text-og-800":"text-og-400"}`,children:"QA"})]})]}),n.role==="qa"&&e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"pair-with",children:"配对 Dev Agent"}),e.jsxs("select",{id:"pair-with",value:n.pairWith,onChange:y=>o({...n,pairWith:y.target.value}),className:de,disabled:u,children:[e.jsx("option",{value:"",children:"请选择"}),M.map(y=>e.jsxs("option",{value:y.id,children:[y.id," (dev, ",y.mode,")"]},y.id))]})]}),e.jsxs("div",{children:[e.jsx("span",{className:ie,children:"运行模式"}),e.jsxs("label",{className:"mr-4 inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"mode",checked:n.mode==="local",className:ue,onChange:()=>o({...n,mode:"local",hostname:"",user:""}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"本机"})]}),e.jsxs("label",{className:"inline-flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"mode",checked:n.mode==="remote",className:ue,onChange:()=>o({...n,mode:"remote"}),disabled:u}),e.jsx("span",{className:"text-[13px] text-og-800",children:"远程 (SSH)"})]})]}),n.mode==="remote"&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"hostname",children:"Hostname"}),e.jsx("input",{id:"hostname",type:"text",value:n.hostname,onChange:y=>o({...n,hostname:y.target.value}),className:de,placeholder:"macmini-2026",disabled:u}),e.jsx("div",{className:Le,children:"端口/私钥/跳板机请配 ~/.ssh/config"})]}),e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"user",children:"User(可选)"}),e.jsx("input",{id:"user",type:"text",value:n.user,onChange:y=>o({...n,user:y.target.value}),className:de,placeholder:"留空则读 ~/.ssh/config 的 User",disabled:u})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-1.5 flex items-center justify-between",children:[e.jsx("span",{className:"text-[12px] font-medium text-og-700",children:"运行时"}),e.jsx("button",{type:"button",onClick:P,className:"text-[12px] text-accent transition-colors hover:text-accent-hover disabled:cursor-not-allowed disabled:opacity-50",disabled:u||f||n.mode==="remote"&&!n.hostname,children:"↻ 重新探测"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"runtime",checked:n.runtime==="claude-code",className:ue,onChange:()=>o({...n,runtime:"claude-code"}),disabled:u||(d?!d.runtimes["claude-code"].ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Claude Code"}),e.jsx(Y,{rt:"claude-code"})]}),e.jsxs("label",{className:"mt-1 flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"runtime",checked:n.runtime==="codex",className:ue,onChange:()=>o({...n,runtime:"codex"}),disabled:u||(d?!d.runtimes.codex.ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Codex"}),e.jsx(Y,{rt:"codex"})]}),e.jsx("div",{className:"mt-2",children:e.jsx(ce,{})}),e.jsx("div",{children:e.jsx(se,{})})]}),e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"workdir",children:"Workdir(可选)"}),e.jsx("input",{id:"workdir",type:"text",value:n.workdir,onChange:y=>o({...n,workdir:y.target.value}),className:de,placeholder:"留空时自动 clone 到 ~/.baxian/repos/<owner>/<repo>",disabled:u})]}),e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"model",children:"Model(可选)"}),e.jsx("input",{id:"model",type:"text",value:n.model,onChange:y=>o({...n,model:y.target.value}),className:de,placeholder:n.runtime==="codex"?"例: o3 / gpt-4o(留空走 default)":"例: sonnet / opus / claude-sonnet-4-6(留空走 default)",disabled:u}),e.jsx("div",{className:Le,children:"透传到 launch 命令的 --model 参数;留空跟随 CLI 默认。"})]}),e.jsxs("div",{children:[e.jsx("label",{className:ie,htmlFor:"addDirs",children:"Additional Dirs(可选)"}),e.jsx("textarea",{id:"addDirs",value:n.addDirs,onChange:y=>o({...n,addDirs:y.target.value}),className:`${de} font-mono text-[12px]`,rows:3,placeholder:`每行一个绝对路径,例:
|
|
3
|
-
/Users/me/shared-libs
|
|
4
|
-
/Users/me/extra-repo`,disabled:u}),e.jsx("div",{className:Le,children:"透传到 --add-dir。当前 YOLO 模式下不影响权限拦截,主要用于让 CLI 把额外目录纳入工作根。"})]}),e.jsx("div",{className:"rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-3 py-2.5",children:e.jsxs("label",{className:"flex cursor-pointer items-start gap-2",children:[e.jsx("input",{type:"checkbox",className:"mt-1 h-3.5 w-3.5 accent-[#1348dc]",checked:n.yolo,onChange:y=>o({...n,yolo:y.target.checked}),disabled:u}),e.jsxs("div",{className:"text-[13px] text-og-800",children:[e.jsx("div",{className:"font-medium",children:"YOLO 模式(推荐开启)"}),e.jsxs("div",{className:"mt-1 text-[12px] text-warn",children:["Agent 自主执行所有命令、文件改动,无需逐条确认。开启后体验更顺滑, 但",e.jsx("strong",{className:"font-semibold",children:"请确认在受控环境(容器、隔离 worktree)中运行"}),"。"]})]})]})}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:S,disabled:u,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:!V,className:"btn-primary",children:u?"添加中…":"添加 Agent"})]})]})})}const at=200,it=16e3,ye="w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",Ne="mb-1.5 block text-[12px] font-medium text-og-700",ot="mt-1 text-right text-[12px] text-og-400";function He(s){const t=s.mode==="edit",r=Qe(),{show:i}=je(),n=t?s.task.projectId:s.projectId,o=t?s.task.title:"",l=t?s.task.description:"",p=t?s.task.preferredAgentId:"",[g,x]=a.useState([]),[d,m]=a.useState([]),[f,h]=a.useState(n??""),[u,v]=a.useState(p),[c,C]=a.useState(o),[I,k]=a.useState(l),[A,j]=a.useState(!1),[b,S]=a.useState(null),P=a.useRef(0);a.useEffect(()=>{if(!s.open)return;P.current+=1;const E=P.current;x([]),m([]),h(n??""),v(p),C(o),k(l),S(null),j(!1),Promise.all([D.projects.list(),D.agents.list()]).then(([w,$])=>{E===P.current&&(x(w),m($))}).catch(w=>{E===P.current&&S(w instanceof Error?w.message:String(w))})},[s.open,n,o,l,p]);const M=a.useMemo(()=>g.find(E=>E.id===f)??null,[g,f]),F=a.useMemo(()=>M?M.agent.flat().filter(E=>E.role==="dev"):[],[M]),Q=a.useMemo(()=>new Set(d.map(E=>E.id)),[d]),T=a.useMemo(()=>F.filter(E=>Q.has(E.id)),[F,Q]),z=a.useMemo(()=>F.filter(E=>!Q.has(E.id)),[F,Q]);a.useEffect(()=>{if(!t){if(T.length===0){u!==""&&v("");return}T.find(E=>E.id===u)||v(T[0].id)}},[T,u,t]);const _=!t||T.find(E=>E.id===u),U=t&&!_&&!!u,G=U&&z.some(E=>E.id===u),V=G?`当前 dev "${u}" 在 baxian.json 中存在但 runtime 未加载,可能是手动编辑过配置文件;重启 server 可拉起`:U?`当前 dev "${u}" 不在 runtime(可能已从 project 配置移除);保存可能失败,请确认或选择新 dev`:!f||T.length>0?null:z.length>0?"baxian.json 里有 dev agent 但 runtime 未加载(可能是手动编辑过配置);重启 server 后生效":"请先为项目添加 dev agent",te=c.trim(),Y=I.trim(),ce=T.length>0||U,Z=!!f&&ce&&!!u&&te.length>0&&Y.length>0&&!A,y=()=>{A||s.onClose()},B=async E=>{var w,$;if(E.preventDefault(),!!Z){j(!0),S(null);try{if(s.mode==="edit"){const R=await D.tasks.update(s.task.id,{title:te,description:Y,preferredAgentId:u});i({kind:"success",title:"任务已更新"}),(w=s.onUpdated)==null||w.call(s,R),s.onClose()}else{const R=await D.tasks.create({projectId:f,title:te,description:Y,preferredAgentId:u});i({kind:"success",title:"任务已创建"}),($=s.onCreated)==null||$.call(s,R),s.onClose(),r(`/task/${R.id}`)}}catch(R){S(R instanceof Error?R.message:String(R))}finally{j(!1)}}},L=t?"编辑 Task":"新建 Task",J=t?A?"保存中…":"保存":A?"创建中…":"创建",K=!t&&!n;return e.jsx(Ie,{open:s.open,onClose:y,title:L,size:"md",children:e.jsxs("form",{onSubmit:B,className:"space-y-4",children:[b&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:b}),K&&e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-project",children:"Project"}),e.jsxs("select",{id:"task-project",value:f,onChange:E=>h(E.target.value),className:ye,disabled:A,required:!0,children:[e.jsx("option",{value:"",disabled:!0,children:"选择项目"}),g.map(E=>e.jsx("option",{value:E.id,children:E.id},E.id))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-dev",children:"Dev Agent"}),e.jsxs("select",{id:"task-dev",value:u,onChange:E=>v(E.target.value),className:ye,disabled:A||T.length===0&&!U||T.length===1&&T[0].id===u&&!U,required:!0,children:[T.length===0&&!U&&e.jsx("option",{value:"",disabled:!0,children:"无可用 dev"}),U&&e.jsxs("option",{value:u,children:[u," ",G?"(待重启)":"(不在 runtime)"]}),T.map(E=>e.jsx("option",{value:E.id,children:E.id},E.id))]}),V&&e.jsx("div",{className:"mt-1 text-[12px] text-warn",children:V})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-title",children:"Title"}),e.jsx("input",{id:"task-title",type:"text",value:c,onChange:E=>C(E.target.value),maxLength:at,className:ye,placeholder:"一句话描述要做什么",disabled:A,required:!0}),e.jsxs("div",{className:ot,children:[c.length," / ",at]})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-description",children:"Description"}),e.jsx("textarea",{id:"task-description",value:I,onChange:E=>k(E.target.value),maxLength:it,rows:8,className:`${ye} font-mono text-[12px]`,placeholder:"详细描述任务,支持 markdown",disabled:A,required:!0}),e.jsxs("div",{className:ot,children:[I.length," / ",it]})]}),e.jsxs("div",{className:"flex justify-end gap-2 border-t border-hairline pt-4",children:[e.jsx("button",{type:"button",onClick:y,disabled:A,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",disabled:!Z,className:"btn-primary",children:J})]})]})})}function ps(s){return Array.from(new TextEncoder().encode(s)).map(t=>t.toString(16).padStart(2,"0")).join("")}function bs(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/realtime`}const gs=(s,t)=>t&&t.length>0?new WebSocket(s,t):new WebSocket(s);class js{constructor(t={}){O(this,"wsUrl");O(this,"wsFactory");O(this,"tokenProvider");O(this,"ws",null);O(this,"topics",new Map);O(this,"cache",new Map);O(this,"outbox",[]);O(this,"reconnectScheduler");O(this,"explicitlyClosed",!1);this.wsUrl=t.wsUrl??bs(),this.wsFactory=t.wsFactory??gs,this.tokenProvider=t.tokenProvider??qe,this.reconnectScheduler=new ht({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.topics.size>0})}subscribe(t,r,i){let n=this.topics.get(t);const o=!n;return n||(n={data:new Set,error:new Set},this.topics.set(t,n)),n.data.add(r),i&&n.error.add(i),o?(this.ensureSocket(),this.wsSendOrQueue({op:"subscribe",topic:t})):this.cache.has(t)&&queueMicrotask(()=>{var l;(l=this.topics.get(t))!=null&&l.data.has(r)&&this.cache.has(t)&&r(this.cache.get(t))}),()=>this.unsubscribe(t,r,i)}close(){if(this.explicitlyClosed=!0,this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.ws){try{this.ws.close()}catch{}this.ws=null}this.topics.clear(),this.cache.clear(),this.outbox=[]}unsubscribe(t,r,i){const n=this.topics.get(t);n&&(n.data.delete(r),i&&n.error.delete(i),n.data.size===0&&n.error.size===0&&(this.topics.delete(t),this.cache.delete(t),this.wsSendOrQueue({op:"unsubscribe",topic:t}),this.topics.size===0&&this.teardownSocket()))}teardownSocket(){if(this.reconnectScheduler.cancel(),this.reconnectScheduler.reset(),this.outbox=[],this.ws){try{this.ws.close()}catch{}this.ws=null}}ensureSocket(){this.explicitlyClosed||this.ws&&(this.ws.readyState===WebSocket.OPEN||this.ws.readyState===WebSocket.CONNECTING)||this.openSocket()}openSocket(){if(this.explicitlyClosed)return;this.reconnectScheduler.cancel();const t=this.tokenProvider(),r=t?[`baxian.token.${ps(t)}`]:void 0;let i;try{i=this.wsFactory(this.wsUrl,r)}catch(o){console.warn("[events-client] WebSocket constructor threw:",o),this.broadcastConnectionError({code:"connection_failed",message:o instanceof Error?o.message:"WebSocket constructor threw"}),this.scheduleReconnect();return}this.ws=i;let n=!1;i.onopen=()=>{if(i!==this.ws)return;n=!0,this.reconnectScheduler.reset();for(const l of this.topics.keys())try{i.send(JSON.stringify({op:"subscribe",topic:l}))}catch(p){console.warn("[events-client] resubscribe send failed:",p)}const o=this.outbox;this.outbox=[];for(const l of o)if(!(l.op==="subscribe"||l.op==="unsubscribe"))try{i.send(JSON.stringify(l))}catch(p){console.warn("[events-client] outbox flush failed:",p)}},i.onmessage=o=>{if(i!==this.ws)return;let l;try{const p=typeof o.data=="string"?o.data:String(o.data);l=JSON.parse(p)}catch{return}this.handleMessage(l)},i.onclose=()=>{i===this.ws&&(this.ws=null,!this.explicitlyClosed&&(n||this.broadcastConnectionError({code:"connection_failed",message:"WebSocket failed to connect (auth, network, or proxy issue)"}),this.topics.size!==0&&this.scheduleReconnect()))},i.onerror=()=>{}}scheduleReconnect(){this.reconnectScheduler.schedule()}broadcastConnectionError(t){for(const r of this.topics.values())for(const i of[...r.error])try{i(t)}catch(n){console.error("[events-client] error handler threw on connection error:",n)}}wsSendOrQueue(t){if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify(t));return}catch(r){console.warn("[events-client] send failed, will queue:",r)}this.outbox.push(t)}handleMessage(t){switch(t.type){case"data":{const r=this.topics.get(t.topic);if(this.cache.set(t.topic,t.data),!r)return;for(const i of[...r.data])try{i(t.data)}catch(n){console.error(`[events-client] handler threw on ${t.topic}:`,n)}break}case"error":{const r={code:t.code,message:t.message};if(t.topic){const i=this.topics.get(t.topic);if(i)for(const n of[...i.error])try{n(r)}catch(o){console.error(`[events-client] error handler threw on ${t.topic}:`,o)}}else console.warn("[events-client] connection-level error:",t.code,t.message);break}}}}let Me=null;function Ge(){return Me||(Me=new js),Me}function mt(){const[s,t]=a.useState(null),[r,i]=a.useState(!1),[n,o]=a.useState(null);return a.useEffect(()=>Ge().subscribe("agents",p=>{o(null),t(p),i(!0)},p=>o(p)),[]),{data:s,loaded:r,error:n}}function ws(s){const[t,r]=a.useState(null),[i,n]=a.useState(!1),[o,l]=a.useState(null);return a.useEffect(()=>(r(null),n(!1),l(null),Ge().subscribe(`task:${s}`,g=>{l(null),r(g),n(!0)},g=>l(g))),[s]),{data:t,loaded:i,error:o}}function vs(s){const[t,r]=a.useState(null),[i,n]=a.useState(!1),[o,l]=a.useState(null);return a.useEffect(()=>{if(!s){r(null),n(!1),l(null);return}r(null),n(!1),l(null);let p=!1,g=!1,x=!1;const d=Ge().subscribe(`project-tasks:${s}`,m=>{p||(g=!0,l(null),r(m),n(!0))},m=>{p||(l(m),!(g||x)&&(x=!0,D.tasks.list(s).then(f=>{p||g||(r(f),n(!0))},f=>{console.warn(`[useProjectTasks] REST fallback failed for ${s}:`,f)})))});return()=>{p=!0,d()}},[s]),{data:t,loaded:i,error:o}}let Re=null,oe=null,Ae=null,pe=0;const Fe=new Set;function pt(){Fe.forEach(s=>s())}async function ys(){const s=pe;try{const t=await D.projects.list();if(s!==pe)return;Re=t,Ae=null}catch(t){if(s!==pe)return;Ae=t instanceof Error?t.message:String(t)}finally{s===pe&&(oe=null,pt())}}function ze(){return oe||(oe=ys(),oe)}function Ns(){pe+=1,Re=null,oe=null,Ae=null,pt()}typeof window<"u"&&window.addEventListener(Se,Ns);async function Ss(){const s=oe!==null;await ze(),s&&await ze()}function ks(){const[,s]=a.useState(0);return a.useEffect(()=>{const t=()=>s(r=>r+1);return Fe.add(t),Re===null&&!oe&&ze(),()=>{Fe.delete(t)}},[]),{projects:Re,error:Ae,refresh:Ss}}function Es(){const{projects:s,error:t,refresh:r}=ks(),i=s??[],n=s!==null,[o,l]=a.useState([]),[p,g]=a.useState(null),[x,d]=a.useState(!1),[m,f]=a.useState(!1),[h,u]=a.useState({kind:"closed"}),{data:v,loaded:c,error:C}=mt(),I=(C==null?void 0:C.message)??null,k=new Map((v??[]).map(b=>[b.id,b])),A=t??I??p,j=async()=>{try{const b=await D.tasks.list();l(b),g(null)}catch(b){g(b instanceof Error?b.message:String(b))}};return a.useEffect(()=>{j()},[]),e.jsxs("div",{children:[e.jsx("h1",{className:"sr-only",children:"Dashboard"}),e.jsxs("div",{className:"mb-6 flex flex-wrap items-center justify-end gap-2",children:[e.jsx("button",{onClick:()=>d(!0),className:"btn-primary",children:"+ 新建项目"}),e.jsx("button",{onClick:()=>f(!0),disabled:i.length===0,"aria-describedby":i.length===0?"create-task-hint":void 0,className:"btn-secondary",children:"+ 新建 Task"}),i.length===0&&e.jsx("span",{id:"create-task-hint",className:"self-center text-[12px] text-og-500",children:"请先创建项目"})]}),A&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",A]}),n&&i.length===0&&!t&&e.jsx("div",{className:"rounded-lg border border-hairline bg-surface py-12 text-center text-[13px] text-og-500",children:'还没有项目。点击右上角"+ 新建项目"开始。'}),i.map(b=>e.jsxs("div",{className:"mb-10",children:[e.jsxs(he,{to:`/project/${b.id}`,className:"group mb-3 -mx-2 flex items-baseline gap-x-3 gap-y-1 rounded-md px-2 py-1 transition-colors hover:bg-og-25",children:[e.jsx("h2",{className:"min-w-0 truncate font-display text-[17px] font-semibold tracking-tight text-og-1000",title:b.id,children:b.id}),e.jsx("span",{className:"hidden min-w-0 truncate font-mono text-[12px] text-og-500 sm:inline",title:b.repo,children:b.repo}),e.jsx("span",{className:"ml-auto text-[13px] text-accent group-hover:text-accent-hover",children:"Details →"})]}),b.agent.flat().length===0?e.jsx("div",{className:"rounded-lg border border-hairline bg-surface py-6 text-center text-[13px] text-og-500",children:"还没有 Agent。进入 Details 添加。"}):e.jsx("div",{className:b.agent.length===1?"space-y-3":"grid grid-cols-1 gap-3 xl:grid-cols-2",children:b.agent.map((S,P)=>e.jsx(ft,{group:S,projectId:b.id,agentsById:k,agentsLoaded:c,agentsError:!!C,tasks:o.filter(M=>M.projectId===b.id),onDeleted:()=>{r(),j()},terminalMode:"embedded-full"},S.map(M=>M.id).join(":")||P))})]},b.id)),e.jsx(xs,{open:x,onClose:()=>d(!1),onCreated:b=>{d(!1),r(),u({kind:"asking",projectId:b})}}),e.jsx(Ie,{open:h.kind==="asking",onClose:()=>u({kind:"closed"}),title:"项目已创建",size:"sm",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-[13px] text-og-700",children:"现在添加第一个 Agent,还是稍后再加?"}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>u({kind:"closed"}),className:"btn-secondary",children:"稍后再加"}),e.jsx("button",{type:"button",onClick:()=>{h.kind==="asking"&&u({kind:"addingAgent",projectId:h.projectId})},className:"btn-primary",children:"继续添加 Agent"})]})]})}),h.kind==="addingAgent"&&e.jsx(xt,{open:!0,projectId:h.projectId,onClose:()=>u({kind:"closed"}),onCreated:()=>{r()}}),e.jsx(He,{open:m,onClose:()=>f(!1),onCreated:()=>{j()}})]})}function bt({tasks:s}){const t=Qe();return s.length===0?e.jsx("div",{className:"rounded-lg border border-hairline bg-surface px-4 py-8 text-center text-[13px] text-og-400",children:"No tasks"}):e.jsx("div",{className:"overflow-hidden rounded-lg border border-hairline bg-surface",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-[13px]",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-hairline bg-og-50/40 text-left font-mono text-[11px] uppercase tracking-[0.05em] text-og-500",children:[e.jsx("th",{className:"px-4 py-2 font-medium",children:"ID"}),e.jsx("th",{className:"px-4 py-2 font-medium",children:"Title"}),e.jsx("th",{className:"hidden px-4 py-2 font-medium sm:table-cell",children:"Agent"}),e.jsx("th",{className:"px-4 py-2 font-medium",children:"Status"}),e.jsx("th",{className:"hidden px-4 py-2 font-medium sm:table-cell",children:"Round"})]})}),e.jsx("tbody",{children:s.map(r=>e.jsxs("tr",{className:"cursor-pointer border-t border-hairline transition-colors hover:bg-og-50/40",onClick:()=>t(`/task/${r.id}`),children:[e.jsx("td",{className:"whitespace-nowrap px-4 py-2.5 font-mono text-[12px]",children:e.jsx(he,{to:`/task/${r.id}`,className:"text-accent hover:text-accent-hover",onClick:i=>i.stopPropagation(),children:r.id})}),e.jsx("td",{className:"px-4 py-2.5 break-words text-og-1000",children:r.title}),e.jsx("td",{className:"hidden whitespace-nowrap px-4 py-2.5 font-mono text-[12px] sm:table-cell",children:r.agentId?e.jsx("span",{className:"text-og-700",children:r.agentId}):r.preferredAgentId?e.jsx("span",{className:"italic text-og-500",children:r.preferredAgentId}):e.jsx("span",{className:"text-og-400",children:"—"})}),e.jsxs("td",{className:"whitespace-nowrap px-4 py-2.5",children:[e.jsx("span",{className:"pill",children:r.status}),r.phase==="spec"&&e.jsx("span",{className:"ml-1 pill pill-review",children:"spec"})]}),e.jsx("td",{className:"hidden whitespace-nowrap px-4 py-2.5 text-[12px] text-og-500 sm:table-cell",children:r.phase==="spec"?r.specReviewRound??0:r.reviewRound})]},r.id))})]})})})}function Rs(){const{id:s}=Ue(),[t,r]=a.useState(null),[i,n]=a.useState(null),[o,l]=a.useState(!1),[p,g]=a.useState(!1),x=a.useRef(0),{data:d,loaded:m,error:f}=mt(),{data:h,error:u}=vs(s),v=(f==null?void 0:f.message)??null,c=(u==null?void 0:u.message)??null,C=h??[],I=new Map((d??[]).map(j=>[j.id,j])),k=i??v??c,A=a.useCallback(async j=>{const b=++x.current;try{const S=await D.projects.get(j);if(b!==x.current)return;r(S),n(null)}catch(S){if(b!==x.current)return;n(S instanceof Error?S.message:String(S))}},[]);return a.useEffect(()=>{s&&(r(null),n(null),A(s))},[s,A]),t?e.jsxs("div",{children:[k&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",k]}),e.jsxs("div",{className:"mb-6 flex items-baseline gap-x-3",children:[e.jsx("h1",{className:"min-w-0 truncate font-display text-[17px] font-semibold tracking-tight text-og-1000",title:t.id,children:t.id}),e.jsx("span",{className:"min-w-0 truncate font-mono text-[12px] text-og-500",title:t.repo,children:t.repo})]}),e.jsxs("div",{className:"mb-3 flex flex-wrap items-baseline justify-between gap-2",children:[e.jsx("h2",{className:"font-display text-[12px] font-semibold uppercase tracking-[0.06em] text-og-500",children:"Agents"}),e.jsx("button",{onClick:()=>l(!0),className:"btn-ghost",children:"+ 添加 Agent"})]}),t.agent.flat().length===0?e.jsx("div",{className:"mb-8 rounded-lg border border-hairline bg-surface py-6 text-center text-[13px] text-og-500",children:"还没有 Agent,点击右上角添加。"}):e.jsx("div",{className:"mb-8 space-y-5",children:t.agent.map((j,b)=>e.jsx(ft,{group:j,projectId:t.id,agentsById:I,agentsLoaded:m,agentsError:!!f,tasks:C,onDeleted:()=>{A(t.id)},terminalMode:"embedded-full"},j.map(S=>S.id).join(":")||b))}),e.jsxs("div",{className:"mb-3 flex flex-wrap items-baseline justify-between gap-2 border-t border-hairline pt-6",children:[e.jsx("h2",{className:"font-display text-[12px] font-semibold uppercase tracking-[0.06em] text-og-500",children:"Tasks"}),e.jsx("button",{onClick:()=>g(!0),className:"btn-ghost",children:"+ 新建 Task"})]}),e.jsx(bt,{tasks:C}),e.jsx(xt,{open:o,projectId:t.id,onClose:()=>l(!1),onCreated:()=>{A(t.id)}}),e.jsx(He,{open:p,projectId:t.id,onClose:()=>g(!1)})]}):i?e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",i]}):e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"})}function As(){const{agentId:s}=Ue();return s?e.jsxs("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden rounded-lg border border-hairline bg-surface",children:[e.jsxs("div",{className:"flex h-8 flex-none select-none items-center gap-3 border-b border-hairline bg-page px-3 font-mono text-[11px] text-og-500",children:[e.jsx("span",{"aria-hidden":!0,className:"block h-1.5 w-1.5 rounded-full bg-success"}),e.jsx("span",{className:"text-og-700",children:s})]}),e.jsx("div",{className:"min-h-0 flex-1",children:e.jsx(_e,{agentId:s,mode:"full",interactive:!0,arrowKeys:!0})})]}):e.jsx("div",{className:"text-[13px] text-danger",children:"No agent specified"})}function Cs(){const[s,t]=a.useState([]),[r,i]=a.useState(null);return a.useEffect(()=>{let n=!1;return(async()=>{try{const o=await D.tasks.list();n||t(o)}catch(o){n||i(o instanceof Error?o.message:String(o))}})(),()=>{n=!0}},[]),e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"font-display text-2xl font-semibold tracking-tight text-og-1000",children:"Tasks"}),e.jsx("p",{className:"mt-0.5 text-[13px] text-og-500",children:"Every task across all projects."})]}),r&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",r]}),e.jsx(bt,{tasks:s})]})}const gt=new Set(["merged","failed","max_rounds","cancelled"]),ct=gt,Ts={pending:"pill",in_progress:"pill pill-live",review:"pill pill-review",fixing:"pill pill-warn",approved:"pill pill-live",merged:"pill pill-live",failed:"pill pill-warn",max_rounds:"pill pill-warn",cancelled:"pill"};function Is(){const{id:s}=Ue(),t=Qe(),{show:r}=je(),[i,n]=a.useState(!1),[o,l]=a.useState(!1),[p,g]=a.useState(!1),[x,d]=a.useState(!1),[m,f]=a.useState(null),{data:h,loaded:u,error:v}=ws(s??""),c=m??h,C=(v==null?void 0:v.message)??null;a.useEffect(()=>{f(null)},[s]),a.useEffect(()=>{m&&h&&h.updatedAt>=m.updatedAt&&f(null)},[m,h]);const I=T=>{f(T)};if(!s)return e.jsx("div",{className:"text-[13px] text-danger",children:"Task ID required"});if(C&&!c)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",C]});if(u&&!c)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Task not found: ",s]});if(!c)return e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"});const k=c.status==="pending",A=c.status==="pending"||c.status==="in_progress",j=ct.has(c.status)&&!!c.preferredAgentId,b=!!c.prNumber,S=c.preferredAgentId==="",P=c.status==="approved"&&c.prNumber!==void 0,M=async()=>{if(confirm(`确定取消 task ${c.id}?`)){l(!0);try{const T=await D.tasks.update(c.id,{status:"cancelled"});I(T),r({kind:"success",title:"任务已取消"})}catch(T){r({kind:"error",title:"取消失败",body:T instanceof Error?T.message:String(T)})}finally{l(!1)}}},F=async()=>{const z=gt.has(c.status)?`task ${c.id} 已是 ${c.status} 状态。手动请 QA 重审会再跑一轮 review,但状态机不会把 QA 结果带回主流程。继续?`:`请 QA 重审 task ${c.id}?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`;if(confirm(z)){d(!0);try{const _=await D.tasks.review(c.id);I(_),r({kind:"success",title:`已派 QA 重审 (round ${_.reviewRound})`})}catch(_){r({kind:"error",title:"Review 派发失败",body:_ instanceof Error?_.message:String(_)})}finally{d(!1)}}},Q=async()=>{const T=c.status==="merged"?`task ${c.id} 已 merged。Retry 会用同样的标题/描述新建一个 task 从头跑,确定继续?`:`Retry task ${c.id}?这会新建一个 task 从头开始,旧 task 保留为历史。`;if(confirm(T)){g(!0);try{const z=await D.tasks.retry(c.id);r({kind:"success",title:`已新建 task ${z.id}`}),t(`/task/${z.id}`)}catch(z){r({kind:"error",title:"Retry 失败",body:z instanceof Error?z.message:String(z)})}finally{g(!1)}}};return e.jsxs("div",{className:"mx-auto max-w-4xl",children:[C&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",C]}),S&&e.jsx("div",{className:"mb-4 rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-3 py-2.5 text-[12px] text-warn",children:c.status==="pending"?e.jsxs(e.Fragment,{children:["This task has no preferred dev (legacy). Click ",e.jsx("b",{className:"font-semibold",children:"Edit"})," to assign one."]}):e.jsxs(e.Fragment,{children:["This is a legacy task with no preferred dev (read-only in status ",e.jsx("b",{className:"font-semibold",children:c.status}),")."]})}),e.jsxs("div",{className:"mb-2 flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"font-mono text-[13px] text-og-500",children:c.id}),e.jsx("span",{className:Ts[c.status],children:c.status}),c.phase==="spec"&&e.jsx("span",{className:"pill pill-review",children:"spec phase"}),e.jsxs("span",{className:"text-[12px] text-og-500",children:["created ",c.createdAt]}),e.jsxs("span",{className:"text-[12px] text-og-500",children:["updated ",c.updatedAt]})]}),e.jsx("h1",{className:"mb-5 break-words font-display text-2xl font-semibold tracking-tight text-og-1000",children:c.title}),P&&e.jsxs("div",{className:"mb-5 rounded-lg border border-[#bbf7d0] bg-[#f0fdf4] p-4 text-[13px] text-success",children:[e.jsx("div",{className:"font-semibold",children:"QA approved · awaiting PR merge"}),e.jsx("div",{className:"mt-1 text-og-700",children:"Dev keeps the task reserved while it checks whether all human or agent feedback has been handled."}),c.prUrl&&e.jsxs("a",{href:c.prUrl,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary mt-3 !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:["Open PR #",c.prNumber]})]}),e.jsx("pre",{className:"card mb-6 whitespace-pre-wrap p-4 text-[13px] text-og-800",children:c.description}),e.jsxs("div",{className:"card mb-6 grid grid-cols-1 gap-x-6 gap-y-2 p-4 text-[13px] md:grid-cols-2",children:[e.jsxs("div",{className:"text-og-500",children:["Project: ",e.jsx("span",{className:"font-mono text-og-800",children:c.projectId})]}),e.jsxs("div",{className:"text-og-500",children:["Dev: ",e.jsx("span",{className:"font-mono text-og-800",children:c.agentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Preferred: ",e.jsx("span",{className:"font-mono text-og-800",children:c.preferredAgentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["QA: ",e.jsx("span",{className:"font-mono text-og-800",children:c.qaAgentId||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["PR:"," ",c.prNumber?c.prUrl?e.jsxs("a",{href:c.prUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover",children:["#",c.prNumber]}):e.jsxs("span",{className:"font-mono text-og-800",children:["#",c.prNumber]}):e.jsx("span",{className:"text-og-400",children:"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Branch: ",e.jsx("span",{className:"font-mono text-og-800",children:c.branch||"—"})]}),e.jsxs("div",{className:"text-og-500",children:["Round: ",e.jsx("span",{className:"font-mono text-og-800",children:c.reviewRound}),c.specReviewRound!==void 0&&c.specReviewRound>0&&e.jsxs("span",{className:"ml-2 text-[12px] text-accent",children:["spec: ",c.specReviewRound]})]})]}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx("button",{type:"button",disabled:!k,onClick:()=>n(!0),className:"btn-secondary",children:"Edit"}),e.jsx("button",{type:"button",disabled:!A||o,onClick:M,className:"btn-secondary !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger",children:o?"Cancelling…":"Cancel"}),e.jsx("button",{type:"button",disabled:!j||p,onClick:Q,title:ct.has(c.status)?S?"Legacy task has no preferred dev to retry against":"新建一个 task 从头跑,丢弃当前 worktree/branch":`Cannot retry in status ${c.status}`,className:"btn-secondary",children:p?"Retrying…":"Retry"}),e.jsx("button",{type:"button",disabled:!b||x,onClick:F,title:c.prNumber?"让 QA agent 立即开始新一轮 review(reviewRound +1)":"该 task 还没有 PR,无法派 review",className:"btn-secondary !border-accent-soft !text-accent hover:!bg-accent-soft hover:!border-accent",children:x?"Dispatching…":"Request QA review"})]}),e.jsx(He,{mode:"edit",open:i,onClose:()=>n(!1),task:c,onUpdated:I})]})}function Ps(){const[s,t]=a.useState(!1);return e.jsx("button",{type:"button",onClick:()=>t(r=>!r),"aria-label":s?"切换为 Logo 图标":"切换为 Logo 文字",className:"flex h-7 min-w-[60px] shrink-0 items-center justify-center font-display text-[15px] font-semibold tracking-tight text-og-1000",children:s?e.jsx("span",{className:"inline-flex h-6 items-center leading-none",children:"baxian"}):e.jsx("img",{src:"/baxian-logo.png",alt:"baxian",width:24,height:24,className:"block h-6 w-6"})})}function $s(){const{phase:s,count:t,error:r,triggerRestart:i}=Te();return s==="idle"?null:s==="failed"?e.jsxs("div",{className:"flex items-center justify-between border-b border-[#fecaca] bg-[#fef2f2] px-4 py-2",children:[e.jsxs("div",{className:"text-[13px] text-danger",children:["❌ 重启失败:",r]}),e.jsx("button",{onClick:()=>{i()},className:"btn-ghost !text-danger hover:!bg-[#fef2f2]",children:"重试"})]}):s==="restarting"?e.jsx("div",{className:"border-b border-accent-soft bg-accent-soft/40 px-4 py-2 text-[13px] text-accent",children:"🔄 重启中…"}):e.jsxs("div",{className:"flex items-center justify-between border-b border-[#fde68a] bg-[#fef3c7]/60 px-4 py-2",children:[e.jsxs("div",{className:"text-[13px] text-warn",children:["⚠️ 有 ",t," 项配置变更待重启 baxian server 才生效"]}),e.jsx("button",{onClick:()=>{i()},className:"btn-secondary !border-warn !text-warn hover:!bg-[#fef3c7] hover:!border-warn hover:!text-warn",children:"现在重启"})]})}const lt=({isActive:s})=>["rounded-md px-2 py-1 text-[13px] transition-colors sm:px-2.5",s?"bg-og-50 text-og-1000":"text-og-500 hover:bg-og-25 hover:text-og-800"].join(" ");function Ds(){const t=!Rt().pathname.startsWith("/terminal/");return e.jsxs("div",{className:"flex h-screen flex-col bg-page",children:[e.jsxs("nav",{className:"flex h-12 flex-none items-center gap-2 border-b border-hairline bg-surface px-3 sm:gap-4 sm:px-6",children:[e.jsxs(he,{to:"/",className:"flex shrink-0 items-center gap-2 font-display text-[15px] font-semibold tracking-tight text-og-1000",children:[e.jsx("span",{"aria-hidden":!0,className:"block h-2.5 w-2.5 rounded-sm bg-accent"}),"baxian"]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-0.5 sm:gap-1",children:[e.jsx(Je,{to:"/",end:!0,className:lt,children:"Dashboard"}),e.jsx(Je,{to:"/tasks",className:lt,children:"Tasks"})]})]}),e.jsx($s,{}),e.jsxs("main",{className:"flex min-h-0 flex-1 flex-col overflow-y-auto p-6",children:[e.jsxs(At,{children:[e.jsx(me,{path:"/",element:e.jsx(Es,{})}),e.jsx(me,{path:"/project/:id",element:e.jsx(Rs,{})}),e.jsx(me,{path:"/terminal/:agentId",element:e.jsx(As,{})}),e.jsx(me,{path:"/tasks",element:e.jsx(Cs,{})}),e.jsx(me,{path:"/task/:id",element:e.jsx(Is,{})})]}),t&&e.jsx("footer",{className:"mt-auto flex justify-center pt-24",children:e.jsx(Ps,{})})]})]})}function Os(){return e.jsx(Et,{children:e.jsx(Ds,{})})}function Ls({children:s}){const[t,r]=a.useState({kind:"probing"}),i=a.useRef(t);a.useEffect(()=>{i.current=t},[t]);const n=a.useCallback(async()=>{r({kind:"probing"});try{await D.config.get(),r({kind:"authorized"})}catch(o){if(o instanceof ke&&o.status===401){r({kind:"unauthorized"});return}const l=o instanceof Error?o.message:"无法连接服务器";r({kind:"error",message:l})}},[]);return a.useEffect(()=>{n()},[n]),a.useEffect(()=>{const o=()=>{i.current.kind!=="probing"&&r({kind:"unauthorized",message:"登录已失效,请重新输入令牌"})};return window.addEventListener(Se,o),()=>window.removeEventListener(Se,o)},[]),t.kind==="authorized"?e.jsx(e.Fragment,{children:s}):t.kind==="error"?e.jsxs(Be,{title:"无法连接服务器",children:[e.jsx("p",{className:"text-[13px] text-og-600",children:t.message}),e.jsx("button",{type:"button",onClick:()=>{n()},className:"btn-primary mt-4 w-full",children:"重试"})]}):t.kind==="probing"?e.jsx(Be,{title:"加载中",children:e.jsx("p",{className:"text-[13px] text-og-500",children:"正在检查登录状态…"})}):e.jsx(Ms,{message:t.message,onSubmit:async o=>{Ct(o);try{await D.config.get(),r({kind:"authorized"})}catch(l){if(Tt(),l instanceof ke&&l.status===401){r({kind:"unauthorized",message:"令牌无效,请重试"});return}const p=l instanceof Error?l.message:"登录失败";r({kind:"error",message:p})}}})}function Be({title:s,children:t}){return e.jsx("div",{className:"flex min-h-screen items-center justify-center bg-page px-4",children:e.jsxs("div",{className:"w-full max-w-sm rounded-lg border border-hairline bg-surface px-6 py-6",children:[e.jsx("h1",{className:"mb-3 font-display text-[16px] font-semibold tracking-tight text-og-1000",children:s}),t]})})}function Ms({message:s,onSubmit:t}){const[r,i]=a.useState(""),[n,o]=a.useState(!1),[l,p]=a.useState(void 0),g=async d=>{d.preventDefault();const m=r.trim();if(!m){p("请输入访问令牌");return}p(void 0),o(!0);try{await t(m)}finally{o(!1)}},x=l??s;return e.jsxs(Be,{title:"登录 baxian",children:[e.jsx("p",{className:"mb-4 text-[13px] text-og-600",children:"服务器开启了访问鉴权,请输入访问令牌继续。"}),e.jsxs("form",{onSubmit:d=>{g(d)},children:[e.jsx("label",{className:"mb-1.5 block text-[12px] font-medium text-og-700",htmlFor:"baxian-token",children:"访问令牌"}),e.jsx("input",{id:"baxian-token",type:"password",autoComplete:"current-password",autoFocus:!0,value:r,onChange:d=>i(d.target.value),className:"w-full rounded-md border border-og-100 bg-surface px-2.5 py-1.5 font-mono text-[13px] text-og-800 placeholder:text-og-400 focus:border-accent focus:outline-none focus:ring-[3px] focus:ring-accent-soft disabled:cursor-not-allowed disabled:opacity-50",placeholder:"请输入服务器配置的 token",disabled:n}),x&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:x}),e.jsx("button",{type:"submit",disabled:n,className:"btn-primary mt-4 w-full",children:n?"登录中…":"登录"})]})]})}Nt.createRoot(document.getElementById("root")).render(e.jsx(a.StrictMode,{children:e.jsx(Bt,{children:e.jsx(Lt,{children:e.jsx(Ls,{children:e.jsx(Os,{})})})})}));
|