baxian 1.0.2 → 1.1.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.
Files changed (78) hide show
  1. package/dist/agent/diff-split.d.ts +10 -0
  2. package/dist/agent/diff-split.d.ts.map +1 -0
  3. package/dist/agent/diff-split.js +83 -0
  4. package/dist/agent/diff-split.js.map +1 -0
  5. package/dist/agent/manager.d.ts +66 -4
  6. package/dist/agent/manager.d.ts.map +1 -1
  7. package/dist/agent/manager.js +1070 -37
  8. package/dist/agent/manager.js.map +1 -1
  9. package/dist/agent/phase-signal-watcher.d.ts +11 -2
  10. package/dist/agent/phase-signal-watcher.d.ts.map +1 -1
  11. package/dist/agent/phase-signal-watcher.js +53 -8
  12. package/dist/agent/phase-signal-watcher.js.map +1 -1
  13. package/dist/agent/phase-signal.d.ts +29 -2
  14. package/dist/agent/phase-signal.d.ts.map +1 -1
  15. package/dist/agent/phase-signal.js +34 -1
  16. package/dist/agent/phase-signal.js.map +1 -1
  17. package/dist/agent/prompt.d.ts +14 -0
  18. package/dist/agent/prompt.d.ts.map +1 -1
  19. package/dist/agent/prompt.js +242 -13
  20. package/dist/agent/prompt.js.map +1 -1
  21. package/dist/agent/review-transport.d.ts +36 -0
  22. package/dist/agent/review-transport.d.ts.map +1 -0
  23. package/dist/agent/review-transport.js +246 -0
  24. package/dist/agent/review-transport.js.map +1 -0
  25. package/dist/agent/runner.js +3 -3
  26. package/dist/agent/runner.js.map +1 -1
  27. package/dist/agent/worktree.d.ts +1 -0
  28. package/dist/agent/worktree.d.ts.map +1 -1
  29. package/dist/agent/worktree.js +12 -0
  30. package/dist/agent/worktree.js.map +1 -1
  31. package/dist/api/hosts.d.ts.map +1 -1
  32. package/dist/api/hosts.js +11 -7
  33. package/dist/api/hosts.js.map +1 -1
  34. package/dist/api/tasks.d.ts.map +1 -1
  35. package/dist/api/tasks.js +8 -0
  36. package/dist/api/tasks.js.map +1 -1
  37. package/dist/config/loader.d.ts.map +1 -1
  38. package/dist/config/loader.js +6 -8
  39. package/dist/config/loader.js.map +1 -1
  40. package/dist/config/validator.js +23 -0
  41. package/dist/config/validator.js.map +1 -1
  42. package/dist/event/handlers.d.ts.map +1 -1
  43. package/dist/event/handlers.js +23 -21
  44. package/dist/event/handlers.js.map +1 -1
  45. package/dist/event/server-handlers.d.ts +4 -0
  46. package/dist/event/server-handlers.d.ts.map +1 -0
  47. package/dist/event/server-handlers.js +828 -0
  48. package/dist/event/server-handlers.js.map +1 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +5 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/shared/constants.d.ts +7 -1
  53. package/dist/shared/constants.d.ts.map +1 -1
  54. package/dist/shared/constants.js +26 -2
  55. package/dist/shared/constants.js.map +1 -1
  56. package/dist/shared/types.d.ts +64 -2
  57. package/dist/shared/types.d.ts.map +1 -1
  58. package/dist/skills/server-feedback/SKILL.md +32 -0
  59. package/dist/skills/server-recheck/SKILL.md +30 -0
  60. package/dist/skills/server-review/SKILL.md +43 -0
  61. package/dist/skills/server-spec-review/SKILL.md +31 -0
  62. package/dist/state/index.d.ts +1 -0
  63. package/dist/state/index.d.ts.map +1 -1
  64. package/dist/state/index.js +1 -0
  65. package/dist/state/index.js.map +1 -1
  66. package/dist/state/review-store.d.ts +13 -0
  67. package/dist/state/review-store.d.ts.map +1 -0
  68. package/dist/state/review-store.js +92 -0
  69. package/dist/state/review-store.js.map +1 -0
  70. package/dist/state/snapshot.js +1 -1
  71. package/dist/state/snapshot.js.map +1 -1
  72. package/dist/state/task-store.d.ts.map +1 -1
  73. package/dist/state/task-store.js +1 -0
  74. package/dist/state/task-store.js.map +1 -1
  75. package/dist/web/assets/index-DE_xpPQe.js +4 -0
  76. package/dist/web/index.html +1 -1
  77. package/package.json +1 -1
  78. package/dist/web/assets/index-BfCCF072.js +0 -4
@@ -0,0 +1,13 @@
1
+ import type { ReviewRound, TaskPhase } from '../shared/index.js';
2
+ export declare class ReviewStore {
3
+ private readonly dir?;
4
+ private readonly memory;
5
+ constructor(dir?: string | undefined);
6
+ getRound(taskId: string, phase: TaskPhase, round: number): Promise<ReviewRound | null>;
7
+ putRound(taskId: string, phase: TaskPhase, data: ReviewRound): Promise<void>;
8
+ listRounds(taskId: string, phase?: TaskPhase): Promise<ReviewRound[]>;
9
+ clear(taskId: string): Promise<void>;
10
+ private key;
11
+ private path;
12
+ }
13
+ //# sourceMappingURL=review-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-store.d.ts","sourceRoot":"","sources":["../../src/state/review-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQjE,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAFjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE5B,GAAG,CAAC,EAAE,MAAM,YAAA;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAYtF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiCrE,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,IAAI;CAGb"}
@@ -0,0 +1,92 @@
1
+ import { mkdir, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ const ROUND_FILE_RE = /^round-(\d+)\.json$/;
4
+ const PHASES = ['spec', 'code'];
5
+ // Server-mode review persistence: state/reviews/{taskId}/{phase}/round-N.json.
6
+ // Phase subdirs prevent spec round-1 colliding with code round-1 (reviewRound
7
+ // resets to 0 on the spec→code transition). Data outlives the task (audit).
8
+ export class ReviewStore {
9
+ dir;
10
+ memory = new Map();
11
+ constructor(dir) {
12
+ this.dir = dir;
13
+ }
14
+ async getRound(taskId, phase, round) {
15
+ if (!this.dir)
16
+ return this.memory.get(this.key(taskId, phase, round)) ?? null;
17
+ let content;
18
+ try {
19
+ content = await readFile(this.path(taskId, phase, round), 'utf-8');
20
+ }
21
+ catch (err) {
22
+ if (err?.code === 'ENOENT')
23
+ return null;
24
+ throw err;
25
+ }
26
+ return JSON.parse(content);
27
+ }
28
+ async putRound(taskId, phase, data) {
29
+ if (!this.dir) {
30
+ this.memory.set(this.key(taskId, phase, data.round), data);
31
+ return;
32
+ }
33
+ const phaseDir = join(this.dir, encodeURIComponent(taskId), phase);
34
+ await mkdir(phaseDir, { recursive: true });
35
+ const final = join(phaseDir, `round-${data.round}.json`);
36
+ const tmp = `${final}.${process.pid}.${Date.now()}.tmp`;
37
+ await writeFile(tmp, JSON.stringify(data, null, 2) + '\n');
38
+ await rename(tmp, final);
39
+ }
40
+ async listRounds(taskId, phase) {
41
+ const phases = phase ? [phase] : PHASES;
42
+ const out = [];
43
+ for (const p of phases) {
44
+ if (!this.dir) {
45
+ const prefix = `${taskId}::${p}::`;
46
+ const rounds = [...this.memory.entries()]
47
+ .filter(([k]) => k.startsWith(prefix))
48
+ .map(([, v]) => v)
49
+ .sort((a, b) => a.round - b.round);
50
+ out.push(...rounds);
51
+ continue;
52
+ }
53
+ let files;
54
+ try {
55
+ files = await readdir(join(this.dir, encodeURIComponent(taskId), p));
56
+ }
57
+ catch (err) {
58
+ if (err?.code === 'ENOENT')
59
+ continue;
60
+ throw err;
61
+ }
62
+ const rounds = files
63
+ .map(f => ROUND_FILE_RE.exec(f)?.[1])
64
+ .filter((n) => n !== undefined)
65
+ .map(n => Number.parseInt(n, 10))
66
+ .sort((a, b) => a - b);
67
+ for (const r of rounds) {
68
+ const data = await this.getRound(taskId, p, r);
69
+ if (data)
70
+ out.push(data);
71
+ }
72
+ }
73
+ return out;
74
+ }
75
+ async clear(taskId) {
76
+ if (!this.dir) {
77
+ for (const k of [...this.memory.keys()]) {
78
+ if (k.startsWith(`${taskId}::`))
79
+ this.memory.delete(k);
80
+ }
81
+ return;
82
+ }
83
+ await rm(join(this.dir, encodeURIComponent(taskId)), { recursive: true, force: true });
84
+ }
85
+ key(taskId, phase, round) {
86
+ return `${taskId}::${phase}::${round}`;
87
+ }
88
+ path(taskId, phase, round) {
89
+ return join(this.dir, encodeURIComponent(taskId), phase, `round-${round}.json`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=review-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-store.js","sourceRoot":"","sources":["../../src/state/review-store.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const WORKING_TASK_STATUSES = new Set(['in_progress', 'fixing']);
2
2
  // max_rounds: dev is reserved awaiting a human decision (continue/complete/cancel) → waiting, not error.
3
- const WAITING_TASK_STATUSES = new Set(['review', 'approved', 'merge-ready', 'max_rounds']);
3
+ const WAITING_TASK_STATUSES = new Set(['review', 'approved', 'merge-ready', 'ready', 'max_rounds']);
4
4
  const ERROR_TASK_STATUSES = new Set(['failed']);
5
5
  const UNREACHABLE_ACTIVE_TASK_GRACE_MS = 30_000;
6
6
  export function agentSnapshot(configured, binding, tmuxObservation, task, latestBootstrapError) {
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/state/snapshot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/state/snapshot.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../src/state/task-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAmDD,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,CAAC;AACnD,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpF,qBAAa,SAAS;IAGR,OAAO,CAAC,GAAG;IAFvB,OAAO,CAAC,SAAS,CAAgC;gBAE7B,GAAG,EAAE,MAAM;IAE/B,QAAQ,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAa1C,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASpC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0B/C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IASzB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC,OAAO,CAAC,IAAI;IAUN,kBAAkB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAmCzE,OAAO,CAAC,IAAI;CAGb"}
1
+ {"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../../src/state/task-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAoDD,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,CAAC;AACnD,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpF,qBAAa,SAAS;IAGR,OAAO,CAAC,GAAG;IAFvB,OAAO,CAAC,SAAS,CAAgC;gBAE7B,GAAG,EAAE,MAAM;IAE/B,QAAQ,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAa1C,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASpC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0B/C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IASzB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC,OAAO,CAAC,IAAI;IAUN,kBAAkB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAmCzE,OAAO,CAAC,IAAI;CAGb"}
@@ -5,6 +5,7 @@ const TASK_FIELDS = [
5
5
  'agentId', 'qaAgentId', 'prNumber', 'prUrl', 'branch', 'latestHeadSha', 'reviewHeadAnchorSha',
6
6
  'reviewDispatchedAt', 'fixDispatchedAt', 'reviewRound', 'specReviewRound', 'phase', 'signalToken',
7
7
  'status', 'createdAt', 'updatedAt', 'images',
8
+ 'reviewMode', 'batchIndex', 'batchTotal', 'maxRoundsContinues', 'afterDone', 'publishDispatchedAt',
8
9
  ];
9
10
  function sanitizeTask(state) {
10
11
  const raw = (state ?? {});
@@ -1 +1 @@
1
- {"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../src/state/task-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../src/state/task-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ var es=Object.defineProperty;var ts=(t,s,r)=>s in t?es(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r;var Y=(t,s,r)=>ts(t,typeof s!="symbol"?s+"":s,r);import{r as o,j as e,c as ss}from"./react-BG4Iuztk.js";import{x as ns,a as rs}from"./xterm-D5X2JljJ.js";import{L as Re,u as _t,a as os,B as as,b as is,R as cs,c as Ke}from"./router-eEZdpwQZ.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"]'))a(n);new MutationObserver(n=>{for(const i of n)if(i.type==="childList")for(const u of i.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&a(u)}).observe(document,{childList:!0,subtree:!0});function r(n){const i={};return n.integrity&&(i.integrity=n.integrity),n.referrerPolicy&&(i.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?i.credentials="include":n.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function a(n){if(n.ep)return;n.ep=!0;const i=r(n);fetch(n.href,i)}})();const ls={"claude-code":"Claude Code",codex:"Codex"};function it(t){return t?ls[t]:null}function ct(t,s){const r=it(s);return r?`${t} (${r})`:t}const Ft=new Set(["merged","done","failed","cancelled"]),Bt=new Set(["in_progress","review","fixing","approved","merge-ready","ready","max_rounds"]),Ve=20,We=5*1024*1024,Pe=4,Qe="/api",lt="baxian.token",Fe="baxian:unauthorized";function dt(){try{return typeof localStorage<"u"?localStorage.getItem(lt):null}catch{return null}}function ds(t){try{localStorage.setItem(lt,t)}catch(s){console.error("Failed to save auth token to localStorage",s)}}function us(){try{localStorage.removeItem(lt)}catch(t){console.error("Failed to clear auth token from localStorage",t)}}function Ae(t){const s=dt();return{...t??{},...s?{Authorization:`Bearer ${s}`}:{}}}class Te extends Error{constructor(s,r,a){super(r),this.status=s,this.details=a,this.name="ApiError"}}async function Ie(t){const s=await t.text();let r=s||`HTTP ${t.status}`,a;try{const n=JSON.parse(s);typeof n.error=="string"&&(r=n.error),Array.isArray(n.details)&&(a=n.details)}catch{}throw t.status===401&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(Fe)),new Te(t.status,r,a)}async function ue(t){const s=await fetch(`${Qe}${t}`,{headers:Ae()});return s.ok||await Ie(s),s.json()}async function fs(){const t=await fetch("/health");return t.ok||await Ie(t),t.json()}async function ie(t,s,r){const a=s!==void 0,n=await fetch(`${Qe}${t}`,{method:"POST",headers:a?Ae({"Content-Type":"application/json"}):Ae(),body:a?JSON.stringify(s):void 0,signal:r==null?void 0:r.signal});return n.ok||await Ie(n),n.json()}async function bt(t,s,r){const a=await fetch(`${Qe}${t}`,{method:"PATCH",headers:Ae({"Content-Type":"application/json"}),body:s?JSON.stringify(s):void 0,signal:r==null?void 0:r.signal});if(a.ok||await Ie(a),a.status===204)return;const n=await a.text();if(n)return JSON.parse(n)}async function Me(t){const s=await fetch(`${Qe}${t}`,{method:"DELETE",headers:Ae()});if(s.ok||await Ie(s),s.status===204)return;const r=await s.text();if(r)return JSON.parse(r)}const te=encodeURIComponent;function zt(t){return new Promise((s,r)=>{const a=new FileReader;a.onerror=()=>r(a.error??new Error("file read failed")),a.onload=()=>{const n=a.result;if(typeof n!="string"){r(new Error("unexpected FileReader result"));return}const i=n.indexOf(",");s(i>=0?n.slice(i+1):n)},a.readAsDataURL(t)})}const L={agents:{list:()=>ue("/agents"),get:t=>ue(`/agents/${te(t)}`),stop:t=>Me(`/agents/${te(t)}/session`),probe:(t,s={},r)=>ie("/agents/probe",{mode:t,host:s.host,hostId:s.hostId},r),uploadImage:async(t,s)=>ie(`/agents/${te(t)}/images`,{dataBase64:await zt(s)})},tasks:{list:async t=>{const s=new Map;for(const r of["active","pending"]){let a=0;for(;;){const n=await L.tasks.page(t,{category:r,offset:a});for(const i of n.tasks)s.set(i.id,i);if(!n.hasMore||n.tasks.length===0)break;a=n.nextOffset}}return[...s.values()]},page:(t,s={})=>{const r=[`projectId=${te(t)}`];return s.category&&r.push(`category=${s.category}`),r.push(`offset=${s.offset??0}`),ue(`/tasks?${r.join("&")}`)},get:t=>ue(`/tasks/${te(t)}`),create:t=>ie("/tasks",t),update:(t,s)=>bt(`/tasks/${te(t)}`,s),retry:t=>ie(`/tasks/${te(t)}/retry`),review:t=>ie(`/tasks/${te(t)}/review`),complete:t=>ie(`/tasks/${te(t)}/complete`),continue:t=>ie(`/tasks/${te(t)}/continue`),reviews:t=>ue(`/tasks/${te(t)}/reviews`),dispatch:(t,s)=>ie(`/tasks/${te(t)}/dispatch`,s)},projects:{list:()=>ue("/projects"),get:t=>ue(`/projects/${te(t)}`),create:t=>ie("/projects",t),delete:t=>Me(`/projects/${te(t)}`),addAgent:(t,s)=>ie(`/projects/${te(t)}/agents`,s),deleteAgent:(t,s)=>Me(`/projects/${te(t)}/agents/${te(s)}`),resumeAgent:(t,s)=>ie(`/projects/${te(t)}/agents/${te(s)}/resume`),bootstrap:t=>ie(`/projects/${te(t)}/bootstrap`)},hosts:{list:()=>ue("/hosts"),create:t=>ie("/hosts",t),update:(t,s)=>bt(`/hosts/${te(t)}`,s),delete:t=>Me(`/hosts/${te(t)}`),check:t=>ie("/hosts/check",t)},config:{get:()=>ue("/config")},health:{get:fs},server:{restart:()=>ie("/restart")}},Ht=o.createContext(null),hs={success:"border-[#bbf7d0] bg-[#f0fdf4] text-success",warn:"border-[#fde68a] bg-[#fef3c7] text-warn",error:"border-[#fecaca] bg-[#fef2f2] text-danger"},ms={success:"✅",warn:"⚠️",error:"❌"};let xs=1;function ps({children:t}){const[s,r]=o.useState([]),a=o.useCallback(i=>{r(u=>u.filter(f=>f.id!==i))},[]),n=o.useCallback(i=>{const u=xs++,f=i.durationMs??3e3;r(m=>[...m,{...i,id:u}]),setTimeout(()=>a(u),f)},[a]);return e.jsxs(Ht.Provider,{value:{show:n},children:[t,e.jsx("div",{className:"pointer-events-none fixed inset-x-4 top-4 z-[60] flex flex-col items-end gap-2",children:s.map(i=>e.jsx("div",{className:`pointer-events-auto w-full max-w-xs rounded-lg border px-4 py-3 shadow-toast ${hs[i.kind]}`,role:"status",children:e.jsxs("div",{className:"flex items-start gap-2",children:[e.jsx("span",{"aria-hidden":!0,className:"text-[14px]",children:ms[i.kind]}),e.jsxs("div",{className:"flex-1",children:[e.jsx("div",{className:"text-[13px] font-semibold",children:i.title}),i.body&&e.jsx("div",{className:"mt-1 whitespace-pre-line text-[12px] text-og-700",children:i.body})]}),e.jsx("button",{type:"button",onClick:()=>a(i.id),className:"text-current opacity-50 transition-opacity hover:opacity-100","aria-label":"Dismiss",children:"✕"})]})},i.id))})]})}function fe(){const t=o.useContext(Ht);if(!t)throw new Error("useToast must be inside <ToastProvider>");return t}const Be="baxian.pendingRestart",bs=500,gs=3e4,Ut=o.createContext(null);function vs(){try{const t=localStorage.getItem(Be);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 ys(t){try{t.count<=0?localStorage.removeItem(Be):localStorage.setItem(Be,JSON.stringify(t))}catch{}}function js({children:t}){const s=vs(),[r,a]=o.useState(s.count),[n,i]=o.useState(s.baselineStartedAt),[u,f]=o.useState(s.count>0?"pending":"idle"),[m,h]=o.useState(),b=o.useRef(s.count),g=o.useRef(s.count>0?"pending":"idle"),d=o.useRef(0),v=o.useCallback(w=>{b.current=w,a(w)},[]),A=o.useCallback(w=>{a(E=>{const y=w(E);return b.current=y,y})},[]),x=o.useCallback(w=>{g.current=w,f(w)},[]);o.useEffect(()=>{ys({count:r,baselineStartedAt:n})},[r,n]),o.useEffect(()=>{let w=!1;(async()=>{try{const y=await L.health.get();if(w)return;i(l=>l!==null&&y.startedAt!==l?(v(0),x("idle"),null):l)}catch{}})();const E=y=>{if(y.key===Be){if(y.newValue===null){if(g.current==="restarting"&&d.current>0){v(d.current),i(null);return}v(0),i(null),g.current!=="restarting"&&x("idle");return}try{const l=JSON.parse(y.newValue);typeof l.count=="number"&&(g.current==="restarting"&&l.count>b.current&&(d.current+=l.count-b.current),v(l.count),g.current!=="restarting"&&x(l.count>0?"pending":"idle")),typeof l.baselineStartedAt=="string"?i(l.baselineStartedAt):l.baselineStartedAt===null&&i(null)}catch{}}};return window.addEventListener("storage",E),()=>{w=!0,window.removeEventListener("storage",E)}},[v,x]);const p=o.useRef(!1),S=o.useCallback(()=>{A(w=>w+1),g.current==="restarting"?d.current+=1:x("pending"),i(w=>(w!==null||p.current||(p.current=!0,(async()=>{try{const E=await L.health.get();i(y=>y??E.startedAt)}catch{}finally{p.current=!1}})()),w))},[x,A]),O=o.useCallback(async()=>{d.current=0,h(void 0),x("restarting");let w;try{w=(await L.health.get()).startedAt}catch(y){x("failed"),h(`获取重启前 startedAt 失败: ${y instanceof Error?y.message:String(y)}`);return}try{await L.server.restart()}catch(y){if(!(y instanceof Te&&y.status===409)){x("failed"),h(`触发重启失败: ${y instanceof Error?y.message:String(y)}`);return}}const E=Date.now();for(;Date.now()-E<gs;){await new Promise(y=>setTimeout(y,bs));try{const y=await L.health.get();if(y.startedAt!==w){const l=d.current;d.current=0,i(l>0?y.startedAt:null),v(l),x(l>0?"pending":"idle");return}}catch{}}x("failed"),h("重启超时(30s 未恢复)。请检查日志或手动 baxian start -c <path>")},[v,x]);return e.jsx(Ut.Provider,{value:{phase:u,count:r,error:m,flagDirty:S,triggerRestart:O},children:t})}function Ge(){const t=o.useContext(Ut);if(!t)throw new Error("usePendingRestart must be used inside PendingRestartProvider");return t}const ws=[500,1e3,2e3,4e3,8e3,15e3,3e4];class Wt{constructor(s){Y(this,"attempts",0);Y(this,"timer",null);Y(this,"delaysMs");this.opts=s,this.delaysMs=s.delaysMs??ws}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 gt=0;function Ns(){gt++;const t=Math.random().toString(36).slice(2,8);return`sub-${Date.now().toString(36)}-${gt}-${t}`}function ks(t){return Array.from(new TextEncoder().encode(t)).map(s=>s.toString(16).padStart(2,"0")).join("")}function Ss(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/stream`}const Es=(t,s)=>s&&s.length>0?new WebSocket(t,s):new WebSocket(t);class Cs{constructor(s={}){Y(this,"wsUrl");Y(this,"wsFactory");Y(this,"tokenProvider");Y(this,"ws",null);Y(this,"subs",new Map);Y(this,"snapshotPending",new Set);Y(this,"preSubscribeQueue",new Map);Y(this,"outbox",[]);Y(this,"reconnectScheduler");Y(this,"explicitlyClosed",!1);this.wsUrl=s.wsUrl??Ss(),this.wsFactory=s.wsFactory??Es,this.tokenProvider=s.tokenProvider??dt,this.reconnectScheduler=new Wt({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.subs.size>0})}subscribe(s){const r=Ns(),a={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,a),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,a){const n=this.subs.get(s);n&&(n.lastSize={cols:r,rows:a},!this.snapshotPending.has(s)&&this.wsSendOrQueue({op:"resize",subscriberId:s,cols:r,rows:a}))}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.${ks(s)}`]:void 0;let a;try{a=this.wsFactory(this.wsUrl,r)}catch(n){console.warn("[pane-stream] WebSocket constructor threw:",n),this.scheduleReconnect();return}this.ws=a,a.onopen=()=>{if(a!==this.ws)return;this.reconnectScheduler.reset();for(const i of this.subs.values()){this.snapshotPending.add(i.subscriberId),this.preSubscribeQueue.set(i.subscriberId,[]),i.snapshotSeq=void 0;try{a.send(JSON.stringify({op:"subscribe",subscriberId:i.subscriberId,agentId:i.agentId,mode:i.mode}))}catch(u){console.warn("[pane-stream] resubscribe send failed:",u)}}const n=this.outbox;this.outbox=[];for(const i of n)if(i.op!=="subscribe"){if("subscriberId"in i&&i.subscriberId){if(!this.subs.has(i.subscriberId))continue;if(this.snapshotPending.has(i.subscriberId)&&i.op!=="unsubscribe"){this.outbox.push(i);continue}}try{a.send(JSON.stringify(i))}catch(u){console.warn("[pane-stream] outbox flush failed:",u)}}},a.onmessage=n=>{if(a!==this.ws)return;let i;try{const u=typeof n.data=="string"?n.data:String(n.data);i=JSON.parse(u)}catch{return}this.handleMessage(i)},a.onclose=()=>{a===this.ws&&(this.ws=null,!this.explicitlyClosed&&this.subs.size!==0&&this.scheduleReconnect())},a.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,a;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);(a=n==null?void 0:n.onError)==null||a.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 a=this.preSubscribeQueue.get(s.subscriberId);if(this.preSubscribeQueue.delete(s.subscriberId),a)for(const n of a)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 a of this.outbox)if("subscriberId"in a&&a.subscriberId===s&&a.op!=="subscribe")try{this.ws.send(JSON.stringify(a))}catch(n){console.warn("[pane-stream] flushOutboxForSub send failed:",n)}else r.push(a);this.outbox=r}dispatch(s){for(const r of this.subs.values())if(r.agentId===s.agentId)if(this.snapshotPending.has(r.subscriberId)){const a=this.preSubscribeQueue.get(r.subscriberId);a&&a.push({seq:s.seq,data:s.data})}else r.onData(s.data)}}let Je=null;function Ye(){return Je||(Je=new Cs),Je}function Rs(t){const{agentId:s,mode:r}=t,a=o.useRef(null),n=o.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},o.useEffect(()=>{const m=Ye().subscribe({agentId:s,mode:r,onSnapshot:h=>n.current.onSnapshot(h),onData:h=>n.current.onData(h),onError:h=>{var b,g;return(g=(b=n.current).onError)==null?void 0:g.call(b,h)},onSessionGone:()=>{var h,b;return(b=(h=n.current).onSessionGone)==null?void 0:b.call(h)}});return a.current=m.subscriberId,()=>{a.current=null,m.unsubscribe()}},[s,r]);const i=o.useCallback(f=>{const m=a.current;m&&Ye().send(m,f)},[]),u=o.useCallback((f,m)=>{const h=a.current;h&&Ye().resize(h,f,m)},[]);return{send:i,resize:u}}const As=[{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"}],Le=Object.fromEntries(As.map(t=>[t.key,t]));function Oe({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 Ts({onKey:t,className:s}){return e.jsxs("div",{role:"group","aria-label":"终端方向键",className:s??"flex flex-none items-center justify-center gap-1 border-t border-hairline bg-page px-3 py-2",children:[e.jsx(Oe,{arrow:Le.left,onPress:t}),e.jsx(Oe,{arrow:Le.up,onPress:t}),e.jsx(Oe,{arrow:Le.down,onPress:t}),e.jsx(Oe,{arrow:Le.right,onPress:t})]})}const Is=Math.floor(We/1024/1024);function $s({agentId:t,className:s}){const r=o.useRef(null),[a,n]=o.useState(!1),{show:i}=fe(),u=async f=>{var h;const m=(h=f.target.files)==null?void 0:h[0];if(f.target.value="",!!m){if(m.size>We){i({kind:"error",title:"图片过大",body:`单张图片不能超过 ${Is} MiB`});return}n(!0);try{await L.agents.uploadImage(t,m),i({kind:"success",title:"图片已插入",body:"路径已粘贴到终端输入,补充说明后回车"})}catch(b){const g=b instanceof Te||b instanceof Error?b.message:String(b);i({kind:"error",title:"图片上传失败",body:g})}finally{n(!1)}}};return e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button","aria-label":"上传图片",disabled:a,onMouseDown:f=>f.preventDefault(),onClick:()=>{var f;return(f=r.current)==null?void 0:f.click()},className:s??"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 disabled:cursor-not-allowed disabled:opacity-50",children:e.jsxs("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("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),e.jsx("circle",{cx:"9",cy:"9",r:"2"}),e.jsx("path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"})]})}),e.jsx("input",{ref:r,type:"file",accept:"image/*",className:"hidden",onChange:u})]})}const Ds={up:"A",down:"B",right:"C",left:"D"};function Ps(t,s){return(s?"\x1BO":"\x1B[")+Ds[t]}const vt=18,Ms=250,Ls=256*1024,yt="#fdfdfd",Os='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',_s={background:yt,foreground:"#474c55",cursor:"#1348dc",cursorAccent:yt,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"},Fs=/\x1b\[(?:\?[\d;]*c|>[\d;]*c|\??\d+;\d+R|\d+n)/g;function Bs(t){return t.replace(Fs,"")}function Ee({agentId:t,mode:s,interactive:r=!1,maxLines:a,className:n,autoFocus:i=!0,deferFullUntilFocus:u=!1,arrowKeys:f=!1}){const m=o.useRef(null),h=o.useRef(null),b=o.useRef(null),g=o.useRef(null),d=o.useRef(!1),v=o.useRef(""),A=o.useRef([]),x=o.useRef(0),p=o.useRef(null),S=o.useRef(null),O=o.useRef(Promise.resolve()),w=o.useRef(0),[E,y]=o.useState(null),[l,T]=o.useState(!1),F=`${t}\0${s}\0${u?"1":"0"}`,[z,B]=o.useState({key:F,active:!1}),j=z.key===F&&z.active,P=s==="full"&&u,M=P&&!j?"preview":s,W=r&&M==="full",H=(N,$)=>$.length===0?Promise.resolve():new Promise(R=>{try{N.write($,()=>R())}catch(ee){console.warn("[pane-terminal] write failed:",ee),R()}}),V=M==="preview",Q=()=>{if(!V)return;const N=m.current,$=h.current;if(!N||!$)return;const ee=($.buffer.active.cursorY+1)*vt;N.scrollTop=Math.max(0,ee-N.clientHeight)},X=(N,$)=>{O.current=O.current.then(async()=>{const R=h.current;if(!(!R||$!==w.current))try{await N(R),W&&R.scrollToBottom(),Q()}catch(ee){console.warn("[pane-terminal] terminal task failed:",ee)}}).catch(R=>{console.warn("[pane-terminal] write chain failed:",R)})},c=(N,$)=>{X(R=>H(R,N),$)},I=()=>{p.current!==null&&(cancelAnimationFrame(p.current),p.current=null),S.current!==null&&(clearTimeout(S.current),S.current=null)},K=()=>{I(),A.current=[],x.current=0},se=()=>{I();const N=A.current;N.length!==0&&(A.current=[],x.current=0,c(N.join(""),w.current))},ne=N=>{if(N.length!==0){if(A.current.push(N),x.current+=N.length,x.current>=Ls){se();return}p.current===null&&(p.current=requestAnimationFrame(se)),S.current===null&&(S.current=setTimeout(se,Ms))}},{send:Z,resize:C}=Rs({agentId:t,mode:M,onSnapshot:({cols:N,rows:$,data:R})=>{if(h.current)try{const re=w.current+1;w.current=re,K(),X(async le=>{var ce;le.reset(),W?((ce=g.current)==null||ce.call(g),await H(le,R)):(N>0&&$>0&&le.resize(N,$),await H(le,R))},re)}catch(re){console.warn("[pane-terminal] snapshot write failed:",re)}},onData:N=>{ne(N)},onError:N=>y(`${N.code}: ${N.message}`),onSessionGone:()=>T(!0)});o.useEffect(()=>{y(null),T(!1)},[t,M]),o.useEffect(()=>{v.current=""},[F]),o.useEffect(()=>{if(M!=="full")return;const N=v.current;N.length!==0&&(v.current="",Z(N))},[Z,M]);const G=o.useCallback(()=>{!r||!P||j||(d.current=!0,B({key:F,active:!0}))},[F,j,r,P]),q=o.useCallback(N=>{const $=Bs(N);if($.length!==0){if(P&&(!j||v.current.length>0)){v.current+=$,G();return}Z($)}},[G,j,Z,P]);o.useEffect(()=>{const N=m.current;if(!N)return;let $=!1;const R=new ns.Terminal({cursorBlink:r,disableStdin:!r,theme:_s,fontFamily:Os,fontSize:13,lineHeight:1.4,scrollback:M==="full"?5e3:1e3}),ee=new rs.FitAddon;if(R.loadAddon(ee),R.open(N),h.current=R,b.current=ee,r&&(i||d.current)){d.current=!1;try{R.focus()}catch{}}r&&R.onData(q);const re=()=>N.clientWidth>0&&N.clientHeight>0,le=(he=!1)=>{if(!re())return!1;const ge=R.cols,De=R.rows;try{ee.fit()}catch{return!1}return W&&R.scrollToBottom(),R.cols>0&&R.rows>0&&(he||R.cols!==ge||R.rows!==De)&&C(R.cols,R.rows),!0};g.current=W?()=>le(!0):null;let ce=null,de=null,k=null,U=0;const oe=()=>{ce||(ce=new ResizeObserver(()=>{de&&clearTimeout(de),de=setTimeout(()=>{de=null,le()},100)}),ce.observe(N))},J=()=>{k=requestAnimationFrame(()=>{if(k=null,!($||!W)){if(le(!0)){oe();return}if(U++<5){J();return}oe()}})};return J(),()=>{$=!0,k!==null&&cancelAnimationFrame(k),p.current!==null&&(cancelAnimationFrame(p.current),p.current=null),S.current!==null&&(clearTimeout(S.current),S.current=null),w.current++,A.current=[],x.current=0,O.current=Promise.resolve(),de&&clearTimeout(de),ce==null||ce.disconnect(),h.current=null,b.current=null,g.current=null;try{R.dispose()}catch(he){console.warn("[pane-terminal] dispose failed:",he)}}},[t,i,W,q,r,M,C]);const ae=()=>{var N;if(r){G();try{(N=h.current)==null||N.focus()}catch{}}};o.useEffect(()=>{if(r)return;const N=m.current;if(!N)return;const $=R=>{R.stopPropagation()};return N.addEventListener("wheel",$,{capture:!0,passive:!0}),()=>N.removeEventListener("wheel",$,{capture:!0})},[r]);const _=a&&a>0?{maxHeight:`${a*vt}px`}:void 0;return e.jsxs("div",{className:n??"flex flex-col h-full w-full min-h-0 bg-[#fdfdfd]",children:[(E||l)&&e.jsx("div",{className:"border-b border-[#fecaca] bg-[#fef2f2] px-3 py-1 font-mono text-[11px] text-danger",children:l?"session ended":E}),e.jsx("div",{className:"flex flex-1 min-h-0 px-2 py-1.5",style:_,children:e.jsx("div",{ref:m,className:"flex-1 min-h-0 overflow-hidden",onMouseDown:ae})}),r&&f&&e.jsxs("div",{className:"grid grid-cols-[1fr_auto_1fr] gap-2 flex-none items-center border-t border-hairline bg-page px-3 py-2",children:[e.jsx("div",{className:"flex items-center",children:e.jsx($s,{agentId:t})}),e.jsx(Ts,{className:"flex items-center justify-center gap-1",onKey:N=>{var R,ee;const $=!!((ee=(R=h.current)==null?void 0:R.modes)!=null&&ee.applicationCursorKeysMode);q(Ps(N,$))}})]})]})}const zs={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"}},Hs={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 Us({state:t}){const{label:s,modifier:r}=Hs[t];return e.jsx("span",{role:"img","aria-label":s,title:s,className:`status-dot ml-2 ${r}`})}function Ws({agent:t,projectId:s,role:r,runtime:a,onDeleted:n,pendingRestart:i=!1,terminalLoading:u=!1,showTaskBinding:f=!0,terminalMode:m="activity-preview",active:h,onActivate:b}){var U,oe,J,he,ge,De,mt;const[g,d]=o.useState(!1),[v,A]=o.useState(null),{show:x}=fe(),{flagDirty:p}=Ge(),[S,O]=o.useState(!1),[w,E]=o.useState(null),[y,l]=o.useState(!1),[T,F]=o.useState(!1),[z,B]=o.useState(!1),[j,P]=o.useState(!1),M=o.useRef(null),W=o.useRef(null),H=o.useId(),V=o.useId();o.useEffect(()=>{if(!j)return;const D=we=>{var xt,pt;const xe=we.target;xe&&((xt=W.current)!=null&&xt.contains(xe)||(pt=M.current)!=null&&pt.contains(xe)||P(!1))},me=we=>{var xe;we.key==="Escape"&&(P(!1),(xe=M.current)==null||xe.focus())};return document.addEventListener("mousedown",D),document.addEventListener("keydown",me),()=>{document.removeEventListener("mousedown",D),document.removeEventListener("keydown",me)}},[j]),o.useEffect(()=>{var me;if(!j)return;const D=(me=W.current)==null?void 0:me.querySelector('[role="menuitem"]:not([disabled])');D==null||D.focus()},[j]);const Q=(U=t.binding)==null?void 0:U.taskId,X=((oe=t.binding)==null?void 0:oe.status)==="awaiting_human",c=!!((J=t.binding)!=null&&J.creationToken)&&!((he=t.binding)!=null&&he.paneId)&&!X&&t.reason!=="PENDING_HUMAN",I=c?{label:"Starting",cls:"pill pill-review"}:zs[t.runtimeStatus],K=c?"starting":t.tmuxSessionStatus,se=m==="activity-preview"&&!c&&(t.runtimeStatus==="working"||t.runtimeStatus==="pending"),ne=m==="embedded-full",Z=ne&&typeof b=="function",C=Z&&h===!0,G=u||i||c,q=u?"Agent 状态加载中":i?"重启 baxian server 后可用":"Agent 正在启动",ae=it(a),_=async()=>{d(!0),A(null);try{await L.agents.stop(t.id)}catch(D){A(D instanceof Error?D.message:String(D))}finally{d(!1)}},N=async()=>{if(Q&&window.confirm(`请 QA 对 task ${Q} 重审?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`)){l(!0);try{const D=await L.tasks.review(Q);x({kind:"success",title:`已派 QA 重审 (round ${D.reviewRound})`})}catch(D){x({kind:"error",title:"Review 派发失败",body:D instanceof Error?D.message:String(D)})}finally{l(!1)}}},$=async()=>{B(!0);try{(await L.projects.bootstrap(s)).ok?x({kind:"success",title:"Bootstrap retry 完成",body:"agent 状态将在下一次刷新生效。"}):x({kind:"warn",title:"Bootstrap retry 仍失败",body:"看一下红色错误卡的最新原因,按提示修复后再试。"})}catch(D){x({kind:"error",title:"Bootstrap retry 失败",body:D instanceof Error?D.message:String(D)})}finally{B(!1)}},R=async()=>{if(window.confirm(`确认 Resume Agent ${t.id}?baxian 会清除 awaiting_human 状态,agent 重新可派遣。`)){F(!0);try{const D=await L.projects.resumeAgent(s,t.id);x({kind:"success",title:`Agent ${t.id} 已 Resume`,body:D.releasedBinding?"原任务已释放,agent 可接新任务。":"保留绑定(原任务仍 active)。"})}catch(D){x({kind:"error",title:"Resume 失败",body:D instanceof Error?D.message:String(D)})}finally{F(!1)}}},ee=async()=>{if(window.confirm(`确认删除 Agent ${t.id}?此操作不可撤销`)){O(!0),E(null);try{const D=await L.projects.deleteAgent(s,t.id);D!=null&&D.restartRequired&&p();const me=(D==null?void 0:D.removed)??[t.id];if(me.length>1){const we=me.filter(xe=>xe!==t.id).join(", ");x({kind:"warn",title:`已删除 Agent ${t.id}`,body:`配对的 QA Agent ${we} 也被一并移除。`})}else x({kind:"success",title:`Agent ${t.id} 已删除`});n==null||n()}catch(D){E(D instanceof Error?D.message:String(D))}finally{O(!1)}}},re=Z&&!G&&!C,le=["card flex h-full min-w-0 flex-col p-4",C?"ring-2 ring-accent":""].filter(Boolean).join(" "),ce=["mb-2 mt-3 h-80 min-h-0 overflow-hidden border border-hairline bg-surface",re?"cursor-pointer":""].filter(Boolean).join(" "),de=re?()=>b==null?void 0:b():void 0,k=re?D=>{(D.key==="Enter"||D.key===" ")&&(D.preventDefault(),b==null||b())}:void 0;return e.jsxs("div",{className:le,"data-agent-card":Z?t.id:void 0,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:ct(t.id,a),children:t.id}),ae&&e.jsxs("span",{className:"hidden shrink-0 whitespace-nowrap text-[12px] text-og-400 sm:inline",title:ae,children:["(",ae,")"]})]}),e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-1",children:[X&&e.jsx("span",{className:"pill pill-warn",title:((ge=t.binding)==null?void 0:ge.awaitingReason)??"需人工处理",children:"Held"}),e.jsx("span",{className:I.cls,children:I.label}),t.stale&&e.jsx("span",{className:"pill pill-warn",title:t.observedAt?`Last observed at ${t.observedAt}`:void 0,children:"Stale"}),e.jsx(Us,{state:K})]})]}),c&&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 正在启动,终端可用后会自动刷新。"}),X&&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:(De=t.binding)==null?void 0:De.awaitingPhase}),((mt=t.binding)==null?void 0:mt.awaitingReason)&&e.jsxs("span",{children:[" · ",t.binding.awaitingReason]})]}),!c&&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(Re,{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:$,disabled:z,className:"btn-secondary shrink-0 !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger hover:!text-danger",children:z?"Retrying…":"Retry bootstrap"})]})]}),f&&Q&&e.jsxs("div",{className:"mb-2 text-[12px] text-og-500",children:["Task: ",e.jsx("span",{className:"font-mono text-og-700",children:Q})]}),se&&e.jsx("div",{className:"mb-2 overflow-hidden border border-hairline bg-surface",children:e.jsx(Ee,{agentId:t.id,mode:"preview",maxLines:6,interactive:!1})}),ne&&e.jsx("div",{className:ce,role:re?"button":void 0,tabIndex:re?0:void 0,"aria-label":re?`激活 ${t.id} 终端`:void 0,onClick:de,onKeyDown:k,children:G?e.jsx("div",{className:"flex h-full items-center justify-center px-3 text-[13px] text-og-500",children:q}):Z?C?e.jsx(Ee,{agentId:t.id,mode:"full",interactive:!0,autoFocus:!0}):e.jsx(Ee,{agentId:t.id,mode:"preview",interactive:!1}):e.jsx(Ee,{agentId:t.id,mode:"full",interactive:!0,autoFocus:!1,deferFullUntilFocus:!0})}),i&&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 items-center gap-2",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-2 overflow-x-auto scrollbar-none",children:[G?e.jsx("span",{className:"shrink-0 cursor-not-allowed text-[13px] text-og-400",title:q,children:"Terminal"}):e.jsx(Re,{to:`/terminal/${t.id}`,className:"btn-secondary shrink-0",children:"Terminal"}),!i&&t.runtimeStatus==="working"&&e.jsx("button",{onClick:_,disabled:g,className:"btn-ghost shrink-0 !text-danger hover:!bg-[#fef2f2]",children:g?"Stopping…":"Stop"}),X&&e.jsx("button",{type:"button",onClick:R,disabled:T,title:"清除 awaiting_human 状态,让 agent 重新可派遣",className:"btn-ghost shrink-0 !text-warn hover:!bg-[#fef3c7]/60",children:T?"Resuming…":"Resume"}),!i&&Q&&r==="dev"&&e.jsx("button",{type:"button",onClick:N,disabled:y,title:`让 QA 立即对 task ${Q} 跑一轮 review(需要该 task 已有 PR)`,className:"btn-ghost shrink-0 !text-accent hover:!bg-accent-soft",children:y?"Dispatching…":"Call review"})]}),e.jsxs("div",{className:"relative shrink-0",children:[e.jsx("button",{ref:M,id:V,type:"button",onClick:()=>P(D=>!D),disabled:S,"aria-haspopup":"menu","aria-expanded":j,"aria-controls":H,"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"})]})}),j&&e.jsx("div",{ref:W,id:H,role:"menu","aria-labelledby":V,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:()=>{P(!1),ee()},disabled:S,className:"block w-full px-3 py-1.5 text-left text-[13px] text-danger hover:bg-[#fef2f2] disabled:opacity-50",children:S?"删除中…":"删除"})})]})]}),v&&e.jsx("div",{className:"mt-1.5 break-words text-[12px] text-danger",children:v}),w&&e.jsx("div",{className:"mt-1.5 break-words text-[12px] text-danger",children:w})]})}const Qs={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl"},jt='input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex]:not([tabindex="-1"])';function ve({open:t,onClose:s,title:r,titleContent:a,children:n,footer:i,size:u="md",dismissOnBackdrop:f=!0}){const m=o.useRef(null),h=o.useRef(null),b=o.useRef(!1),g=o.useRef(s);return o.useEffect(()=>{g.current=s},[s]),o.useEffect(()=>{if(!t)return;h.current=document.activeElement;const d=x=>{if(x.key==="Escape"){g.current();return}if(x.key!=="Tab")return;const p=m.current;if(!p)return;const S=Array.from(p.querySelectorAll(jt)).filter(y=>y.offsetParent!==null||y===document.activeElement);if(S.length===0){x.preventDefault();return}const O=S[0],w=S[S.length-1],E=document.activeElement;x.shiftKey&&(E===O||!p.contains(E))?(x.preventDefault(),w.focus()):!x.shiftKey&&(E===w||!p.contains(E))&&(x.preventDefault(),O.focus())};document.addEventListener("keydown",d);const v=document.body.style.overflow;document.body.style.overflow="hidden";const A=m.current;if(A){const x=A.querySelector(jt);x==null||x.focus()}return()=>{var x,p;document.removeEventListener("keydown",d),document.body.style.overflow=v,(p=(x=h.current)==null?void 0:x.focus)==null||p.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",onMouseDown:f?d=>{b.current=d.target===d.currentTarget}:void 0,onClick:f?d=>{d.target===d.currentTarget&&b.current&&g.current()}:void 0,role:"presentation",children:e.jsxs("div",{ref:m,className:`flex w-full ${Qs[u]} max-h-[90dvh] flex-col overflow-hidden rounded-lg border border-og-100 bg-surface shadow-modal`,onClick:d=>d.stopPropagation(),role:"dialog","aria-modal":"true","aria-label":r,children:[e.jsxs("div",{className:"flex shrink-0 items-center justify-between gap-3 border-b border-hairline px-5 py-3",children:[e.jsx("h2",{title:r,className:"min-w-0 truncate font-display text-[15px] font-semibold tracking-tight text-og-1000",children:a??r}),e.jsx("button",{type:"button",onClick:()=>g.current(),className:"-mr-1 flex h-7 w-7 shrink-0 items-center justify-center rounded-md text-og-400 transition-colors hover:bg-og-50 hover:text-og-800","aria-label":"Close",children:"✕"})]}),e.jsx("div",{className:"min-h-0 flex-1 overflow-auto px-5 py-4",children:n}),i&&e.jsx("div",{className:"flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-hairline px-5 py-3",children:i})]})}):null}const wt=200,Nt=16e3,Gs="baxian.draft.createTask:";function nt(t){return`${Gs}${t??"*"}`}function kt(t){try{const s=localStorage.getItem(t);if(!s)return null;const r=JSON.parse(s);if(!r||typeof r!="object")return null;const a=r,n=typeof a.title=="string"?a.title:"",i=typeof a.description=="string"?a.description:"",u=typeof a.projectId=="string"?a.projectId:"",f=typeof a.preferredAgentId=="string"?a.preferredAgentId:"",m=typeof a.updatedAt=="number"?a.updatedAt:void 0;return!n.trim()&&!i.trim()?null:{title:n,description:i,projectId:u,preferredAgentId:f,updatedAt:m}}catch{return null}}function qs(t,s){const r=!s.title.trim()&&!s.description.trim();try{r?localStorage.removeItem(t):localStorage.setItem(t,JSON.stringify({...s,updatedAt:Date.now()}))}catch{}}function St(t){try{localStorage.removeItem(t)}catch{}}function Ks(t){const s=nt(t),r=kt(s);if(!t)return r;const a=nt(void 0),n=kt(a);if(!n||n.projectId!==t)return r;const i=!r||(n.updatedAt??0)>(r.updatedAt??0);if(i)try{localStorage.setItem(s,JSON.stringify(n))}catch{return n}try{localStorage.removeItem(a)}catch{}return i?n:r}const _e="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",Et="mt-1 text-right text-[12px] text-og-400",Vs=Math.floor(We/1024/1024);function ut(t){const s=t.mode==="edit",{show:r}=fe(),a=s?t.task.projectId:t.projectId,n=s?t.task.title:"",i=s?t.task.description:"",u=s?t.task.preferredAgentId:"",[f,m]=o.useState([]),[h,b]=o.useState([]),[g,d]=o.useState(a??""),[v,A]=o.useState(u),[x,p]=o.useState(n),[S,O]=o.useState(i),[w,E]=o.useState([]),y=o.useRef(null),[l,T]=o.useState(!1),[F,z]=o.useState(null),[B,j]=o.useState(!1),P=o.useRef(0),M=o.useRef(0),W=o.useRef(0),H=o.useRef(new Set),V=s?null:nt(a);o.useEffect(()=>{if(!t.open)return;P.current+=1,M.current+=1;const k=P.current;m([]),b([]),H.current=new Set;const U=V?Ks(a):null;U&&H.current.add(U.projectId),d(a??(U==null?void 0:U.projectId)??""),A((U==null?void 0:U.preferredAgentId)||u),p((U==null?void 0:U.title)||n),O((U==null?void 0:U.description)||i),j(U!==null),z(null),T(!1),E([]),Promise.all([L.projects.list(),L.agents.list()]).then(([oe,J])=>{k===P.current&&(m(oe),b(J))}).catch(oe=>{k===P.current&&z(oe instanceof Error?oe.message:String(oe))})},[t.open,a,n,i,u,V]),o.useEffect(()=>{if(!(!t.open||!V)){if(W.current!==M.current){W.current=M.current;return}qs(V,{title:x,description:S,projectId:g,preferredAgentId:v})}},[t.open,V,x,S,g,v]);const Q=o.useMemo(()=>f.find(k=>k.id===g)??null,[f,g]),X=o.useMemo(()=>Q?Q.agent.flat().filter(k=>k.role==="dev"):[],[Q]),c=o.useMemo(()=>new Set(h.map(k=>k.id)),[h]),I=o.useMemo(()=>X.filter(k=>c.has(k.id)),[X,c]),K=o.useMemo(()=>X.filter(k=>!c.has(k.id)),[X,c]);o.useEffect(()=>{s||Q!==null&&v!==""&&!I.find(k=>k.id===v)&&A("")},[Q,I,v,s]),o.useEffect(()=>{s||Q&&I.length!==0&&(H.current.has(Q.id)||(H.current.add(Q.id),A(k=>k===""?I[0].id:k)))},[s,Q,I]);const se=!s||I.find(k=>k.id===v),ne=s&&!se&&!!v,Z=ne&&K.some(k=>k.id===v),C=Z?`当前 dev "${v}" 在 baxian.json 中存在但 runtime 未加载,可能是手动编辑过配置文件;重启 server 可拉起`:ne?`当前 dev "${v}" 不在 runtime(可能已从 project 配置移除);保存可能失败,请确认或选择新 dev`:!g||I.length>0?null:K.length>0?"baxian.json 里有 dev agent 但 runtime 未加载(可能是手动编辑过配置);重启 server 后生效":null,G=x.trim(),q=S.trim(),_=!!g&&G.length>0&&q.length>0&&!l,N=()=>{l||t.onClose()},$=()=>{V&&(St(V),d(a??""),A(u),p(n),O(i),z(null),j(!1))},R=async k=>{var U,oe;if(k.preventDefault(),!!_){T(!0),z(null);try{if(t.mode==="edit"){const J=await L.tasks.update(t.task.id,{title:G,description:q,preferredAgentId:v});r({kind:"success",title:"任务已更新"}),(U=t.onUpdated)==null||U.call(t,J),t.onClose()}else{const J=w.length?await Promise.all(w.map(async ge=>({dataBase64:await zt(ge),filename:ge.name}))):void 0,he=await L.tasks.create({projectId:g,title:G,description:q,preferredAgentId:v,...J?{images:J}:{}});V&&St(V),r({kind:"success",title:"任务已创建"}),(oe=t.onCreated)==null||oe.call(t,he),t.onClose()}}catch(J){z(J instanceof Error?J.message:String(J))}finally{T(!1)}}},ee=k=>{const U=Array.from(k.target.files??[]);if(k.target.value="",U.length===0)return;const oe=U.filter(J=>J.size>We?(r({kind:"error",title:"图片过大",body:`${J.name} 超过 ${Vs} MiB`}),!1):!0);E(J=>(J.length+oe.length>Pe&&r({kind:"warn",title:`最多 ${Pe} 张图片`}),[...J,...oe].slice(0,Pe)))},re=k=>E(U=>U.filter((oe,J)=>J!==k)),le=s?"编辑 Task":"新建 Task",ce=s?l?"保存中…":"保存":l?"创建中…":"创建",de=!s&&!a;return e.jsx(ve,{open:t.open,onClose:N,title:le,size:"md",dismissOnBackdrop:!1,footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:N,disabled:l,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",form:"create-task-form",disabled:!_,className:"btn-primary",children:ce})]}),children:e.jsxs("form",{id:"create-task-form",onSubmit:R,className:"space-y-3",children:[!s&&B&&e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-md border border-accent-soft bg-accent-soft/30 px-3 py-2 text-[12px] text-accent",children:[e.jsx("span",{children:"已恢复上次未提交的草稿"}),e.jsx("button",{type:"button",onClick:$,className:"shrink-0 underline hover:text-accent-hover",children:"丢弃"})]}),F&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:F}),de&&e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-project",children:"Project"}),e.jsxs("select",{id:"task-project",value:g,onChange:k=>d(k.target.value),className:_e,disabled:l,required:!0,children:[e.jsx("option",{value:"",disabled:!0,children:"选择项目"}),f.map(k=>e.jsx("option",{value:k.id,children:k.id},k.id))]})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-dev",children:"Dev Agent"}),e.jsxs("select",{id:"task-dev",value:v,onChange:k=>A(k.target.value),className:_e,disabled:l,children:[e.jsx("option",{value:"",children:"暂不指定"}),ne&&e.jsxs("option",{value:v,children:[v," ",Z?"(待重启)":"(不在 runtime)"]}),I.map(k=>e.jsx("option",{value:k.id,children:k.id},k.id))]}),C&&e.jsx("div",{className:"mt-1 text-[12px] text-warn",children:C})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-title",children:"Title"}),e.jsx("input",{id:"task-title",type:"text",value:x,onChange:k=>p(k.target.value),maxLength:wt,className:_e,placeholder:"一句话描述要做什么",disabled:l,required:!0}),e.jsxs("div",{className:Et,children:[x.length," / ",wt]})]}),e.jsxs("div",{children:[e.jsx("label",{className:Ne,htmlFor:"task-description",children:"Description"}),e.jsx("textarea",{id:"task-description",value:S,onChange:k=>O(k.target.value),maxLength:Nt,rows:8,className:`${_e} font-mono text-[12px]`,placeholder:"详细描述任务,支持 markdown",disabled:l,required:!0}),e.jsxs("div",{className:Et,children:[S.length," / ",Nt]})]}),!s&&e.jsxs("div",{children:[e.jsx("label",{className:Ne,children:"图片(可选)"}),e.jsx("button",{type:"button",onClick:()=>{var k;return(k=y.current)==null?void 0:k.click()},disabled:l||w.length>=Pe,className:"btn-secondary",children:"添加图片"}),e.jsx("input",{ref:y,type:"file",accept:"image/*",multiple:!0,className:"hidden",onChange:ee}),w.length>0&&e.jsx("ul",{className:"mt-2 space-y-1",children:w.map((k,U)=>e.jsxs("li",{className:"flex items-center justify-between rounded-md border border-og-100 bg-surface px-2.5 py-1.5",children:[e.jsx("span",{title:k.name,className:"truncate text-[12px] text-og-700",children:k.name}),e.jsx("button",{type:"button","aria-label":`移除图片 ${k.name}`,onClick:()=>re(U),disabled:l,className:"ml-2 shrink-0 text-og-400 transition-colors hover:text-danger",children:"✕"})]},`${k.name}-${U}`))})]})]})})}function Js(t){return Array.from(new TextEncoder().encode(t)).map(s=>s.toString(16).padStart(2,"0")).join("")}function Ys(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}/api/realtime`}const Xs=(t,s)=>s&&s.length>0?new WebSocket(t,s):new WebSocket(t);class Zs{constructor(s={}){Y(this,"wsUrl");Y(this,"wsFactory");Y(this,"tokenProvider");Y(this,"ws",null);Y(this,"topics",new Map);Y(this,"cache",new Map);Y(this,"outbox",[]);Y(this,"reconnectScheduler");Y(this,"explicitlyClosed",!1);this.wsUrl=s.wsUrl??Ys(),this.wsFactory=s.wsFactory??Xs,this.tokenProvider=s.tokenProvider??dt,this.reconnectScheduler=new Wt({reconnect:()=>this.openSocket(),shouldReconnect:()=>!this.explicitlyClosed&&this.topics.size>0})}subscribe(s,r,a){let n=this.topics.get(s);const i=!n;return n||(n={data:new Set,error:new Set},this.topics.set(s,n)),n.data.add(r),a&&n.error.add(a),i?(this.ensureSocket(),this.wsSendOrQueue({op:"subscribe",topic:s})):this.cache.has(s)&&queueMicrotask(()=>{var u;(u=this.topics.get(s))!=null&&u.data.has(r)&&this.cache.has(s)&&r(this.cache.get(s))}),()=>this.unsubscribe(s,r,a)}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,a){const n=this.topics.get(s);n&&(n.data.delete(r),a&&n.error.delete(a),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.${Js(s)}`]:void 0;let a;try{a=this.wsFactory(this.wsUrl,r)}catch(i){console.warn("[events-client] WebSocket constructor threw:",i),this.broadcastConnectionError({code:"connection_failed",message:i instanceof Error?i.message:"WebSocket constructor threw"}),this.scheduleReconnect();return}this.ws=a;let n=!1;a.onopen=()=>{if(a!==this.ws)return;n=!0,this.reconnectScheduler.reset();for(const u of this.topics.keys())try{a.send(JSON.stringify({op:"subscribe",topic:u}))}catch(f){console.warn("[events-client] resubscribe send failed:",f)}const i=this.outbox;this.outbox=[];for(const u of i)if(!(u.op==="subscribe"||u.op==="unsubscribe"))try{a.send(JSON.stringify(u))}catch(f){console.warn("[events-client] outbox flush failed:",f)}},a.onmessage=i=>{if(a!==this.ws)return;let u;try{const f=typeof i.data=="string"?i.data:String(i.data);u=JSON.parse(f)}catch{return}this.handleMessage(u)},a.onclose=()=>{a===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()))},a.onerror=()=>{}}scheduleReconnect(){this.reconnectScheduler.schedule()}broadcastConnectionError(s){for(const r of this.topics.values())for(const a of[...r.error])try{a(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 a of[...r.data])try{a(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 a=this.topics.get(s.topic);if(a)for(const n of[...a.error])try{n(r)}catch(i){console.error(`[events-client] error handler threw on ${s.topic}:`,i)}}else console.warn("[events-client] connection-level error:",s.code,s.message);break}}}}let Xe=null;function ft(){return Xe||(Xe=new Zs),Xe}function Qt(){const[t,s]=o.useState(null),[r,a]=o.useState(!1),[n,i]=o.useState(null);return o.useEffect(()=>ft().subscribe("agents",f=>{i(null),s(f),a(!0)},f=>i(f)),[]),{data:t,loaded:r,error:n}}function en(t){const[s,r]=o.useState(null),[a,n]=o.useState(!1),[i,u]=o.useState(null);return o.useEffect(()=>(r(null),n(!1),u(null),ft().subscribe(`task:${t}`,m=>{u(null),r(m),n(!0)},m=>u(m))),[t]),{data:s,loaded:a,error:i}}function Gt(t){const[s,r]=o.useState(null),[a,n]=o.useState(!1),[i,u]=o.useState(null);return o.useEffect(()=>{if(!t){r(null),n(!1),u(null);return}r(null),n(!1),u(null);let f=!1,m=!1,h=!1;const b=ft().subscribe(`project-tasks:${t}`,g=>{f||(m=!0,u(null),r(g),n(!0))},g=>{f||(u(g),!(m||h)&&(h=!0,L.tasks.list(t).then(d=>{f||m||(r(d),n(!0))},d=>{console.warn(`[useProjectTasks] REST fallback failed for ${t}:`,d)})))});return()=>{f=!0,b()}},[t]),{data:s,loaded:a,error:i}}let ze=null,be=null,He=null,Ce=0;const rt=new Set;function qt(){rt.forEach(t=>t())}async function tn(){const t=Ce;try{const s=await L.projects.list();if(t!==Ce)return;ze=s,He=null}catch(s){if(t!==Ce)return;He=s instanceof Error?s.message:String(s)}finally{t===Ce&&(be=null,qt())}}function ot(){return be||(be=tn(),be)}function sn(){Ce+=1,ze=null,be=null,He=null,qt()}typeof window<"u"&&window.addEventListener(Fe,sn);async function nn(){const t=be!==null;await ot(),t&&await ot()}function qe(){const[,t]=o.useState(0);return o.useEffect(()=>{const s=()=>t(r=>r+1);return rt.add(s),ze===null&&!be&&ot(),()=>{rt.delete(s)}},[]),{projects:ze,error:He,refresh:nn}}const Kt=o.createContext(null);function rn({children:t}){const[s,r]=o.useState(null),a=o.useCallback(i=>r(i),[]),n=o.useCallback(()=>r(null),[]);return e.jsxs(Kt.Provider,{value:{openTask:a},children:[t,s!==null&&e.jsx(cn,{taskId:s,onClose:n,onOpenTask:r},s)]})}function $e(){const t=o.useContext(Kt);if(!t)throw new Error("useTaskDetail must be inside <TaskDetailProvider>");return t}const Ct=Ft,Vt={pending:"pill",in_progress:"pill pill-live",review:"pill pill-review",fixing:"pill pill-warn",approved:"pill pill-live","merge-ready":"pill pill-live",ready:"pill pill-live",merged:"pill pill-live",done:"pill pill-live",failed:"pill pill-warn",max_rounds:"pill pill-warn",cancelled:"pill"},on={pending:"bg-og-300",in_progress:"bg-success",review:"bg-accent",fixing:"bg-warn",approved:"bg-success","merge-ready":"bg-success",ready:"bg-success",merged:"bg-success",done:"bg-success",failed:"bg-warn",max_rounds:"bg-warn",cancelled:"bg-og-300"};function an({status:t}){return e.jsx("span",{role:"img","aria-label":t,title:t,className:`inline-block h-2 w-2 shrink-0 rounded-full ${on[t]??"bg-og-300"}`})}function ht(t){if(!t)return"";const s=t.match(/^task-(\d+)$/);return s?s[1]:t}function Rt({id:t,runtime:s}){const r=it(s);return t?e.jsxs("span",{className:"inline-flex min-w-0 max-w-full items-baseline gap-1 align-baseline",title:ct(t,s),children:[e.jsx("span",{className:"min-w-0 truncate font-mono text-og-800",children:t}),r&&e.jsxs("span",{className:"hidden shrink-0 whitespace-nowrap text-[12px] text-og-400 sm:inline",children:["(",r,")"]})]}):e.jsx("span",{className:"font-mono text-og-800",children:"—"})}function At(t){if(t==null)return"";const s=String(t).trim();if(!s)return"";const r=s.match(/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2})(?::(\d{2}))?/);if(r)return`${r[1]} ${r[2]}:${r[3]??"00"}`;const a=new Date(s);return Number.isNaN(a.getTime())?s:a.toISOString().slice(0,19).replace("T"," ")}function cn({taskId:t,onClose:s,onOpenTask:r}){const{show:a}=fe(),[n,i]=o.useState(!1),[u,f]=o.useState(!1),[m,h]=o.useState(!1),[b,g]=o.useState(!1),[d,v]=o.useState(!1),[A,x]=o.useState(!1),[p,S]=o.useState(null),{data:O,loaded:w,error:E}=en(t),{projects:y}=qe(),l=p??O,T=(E==null?void 0:E.message)??null,F=o.useMemo(()=>{const c=new Map;for(const I of y??[])for(const K of I.agent)for(const se of K)c.set(se.id,se.runtime);return c},[y]);o.useEffect(()=>{p&&O&&O.updatedAt>=p.updatedAt&&S(null)},[p,O]);const z=c=>{S(c)},B=async()=>{if(l&&confirm(`确定取消 task ${l.id}?`)){f(!0);try{const c=await L.tasks.update(l.id,{status:"cancelled"});z(c),a({kind:"success",title:"任务已取消"})}catch(c){a({kind:"error",title:"取消失败",body:c instanceof Error?c.message:String(c)})}finally{f(!1)}}},j=async()=>{if(!l)return;const I=Ft.has(l.status)?`task ${l.id} 已是 ${l.status} 状态。手动请 QA 重审会再跑一轮 review,但状态机不会把 QA 结果带回主流程。继续?`:`请 QA 重审 task ${l.id}?这会让 QA agent 立即开始新一轮 review(reviewRound +1)。`;if(confirm(I)){g(!0);try{const K=await L.tasks.review(l.id);z(K),a({kind:"success",title:`已派 QA 重审 (round ${K.reviewRound})`})}catch(K){a({kind:"error",title:"Review 派发失败",body:K instanceof Error?K.message:String(K)})}finally{g(!1)}}},P=async()=>{if(!l)return;const c=l.status==="merged"?`task ${l.id} 已 merged。Retry 会用同样的标题/描述新建一个 task 从头跑,确定继续?`:`Retry task ${l.id}?这会新建一个 task 从头开始,旧 task 保留为历史。`;if(confirm(c)){h(!0);try{const I=await L.tasks.retry(l.id);a({kind:"success",title:`已新建 task ${I.id}`}),r(I.id)}catch(I){a({kind:"error",title:"Retry 失败",body:I instanceof Error?I.message:String(I)})}finally{h(!1)}}},M=async()=>{if(l&&confirm(`将合并 PR #${l.prNumber} 并收尾(删本地分支 + 压缩 agent 上下文),确定?`)){v(!0);try{const c=await L.tasks.complete(l.id);z(c),a({kind:"success",title:"已标记完成,开始收尾"})}catch(c){a({kind:"error",title:"标记完成失败",body:c instanceof Error?c.message:String(c)})}finally{v(!1)}}},W=async()=>{if(l&&confirm(`派 dev 再修一轮(round → ${l.reviewRound+1}),完成后自动转 QA review?`)){x(!0);try{const c=await L.tasks.continue(l.id);z(c),a({kind:"success",title:`已继续一轮 (round ${c.reviewRound})`})}catch(c){a({kind:"error",title:"继续一轮失败",body:c instanceof Error?c.message:String(c)})}finally{x(!1)}}},H=async()=>{if(l&&confirm(`确认完成 task ${l.id}?project.merge 为 auto 时由 baxian 自动执行合并。`)){v(!0);try{const c=await L.tasks.complete(l.id);z(c),a({kind:"success",title:`已确认(${c.status})`})}catch(c){a({kind:"error",title:"确认失败",body:c instanceof Error?c.message:String(c)})}finally{v(!1)}}};if(n&&l)return e.jsx(ut,{mode:"edit",open:!0,onClose:()=>i(!1),task:l,onUpdated:z});const V=l?`${l.id} ${l.title}`:t;return e.jsx(ve,{open:!0,onClose:s,title:V,titleContent:l?e.jsxs("span",{className:"inline-flex min-w-0 max-w-full items-baseline gap-2",children:[e.jsx("span",{className:"shrink-0 font-mono text-og-400",children:l.id}),e.jsx("span",{className:"min-w-0 truncate text-og-1000",children:l.title})]}):void 0,size:"lg",footer:l?X(l):void 0,children:Q()});function Q(){if(T&&!l)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",T]});if(w&&!l)return e.jsxs("div",{className:"text-[13px] text-danger",children:["Task not found: ",t]});if(!l)return e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"});const c=l.preferredAgentId==="",I=l.status==="approved"&&l.prNumber!==void 0,K=l.status==="merge-ready"&&l.prNumber!==void 0,se=l.status==="ready",ne=l.status==="max_rounds"&&l.phase!=="spec";return e.jsxs("div",{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:l.status==="pending"?e.jsxs(e.Fragment,{children:["This task has no dev assigned yet — click ",e.jsx("b",{className:"font-semibold",children:"Edit"})," to choose one, or use the Start button on any idle dev card."]}):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:l.status}),")."]})}),e.jsx("div",{className:"mb-2 flex flex-wrap items-center gap-3",children:e.jsx("span",{className:Vt[l.status],children:l.status})}),e.jsxs("div",{className:"mb-4 text-[12px] text-og-500",children:["Created at ",At(l.createdAt),", Updated at ",At(l.updatedAt)]}),I&&e.jsxs("div",{className:"mb-4 rounded-lg border border-[#bbf7d0] bg-[#f0fdf4] p-4 text-[13px] text-success",children:[e.jsx("div",{className:"font-semibold",children:"QA approved · verifying feedback"}),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."}),l.prUrl&&e.jsxs("a",{href:l.prUrl,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary mt-3 !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:["Open PR #",l.prNumber]})]}),se&&e.jsxs("div",{className:"mb-4 rounded-lg border border-[#bbf7d0] bg-[#f0fdf4] p-4 text-[13px] text-success",children:[e.jsx("div",{className:"font-semibold",children:"✅ 评审通过 · 等待人工确认"}),e.jsxs("div",{className:"mt-1 text-og-700",children:["Server review 完成(",l.reviewRound," 轮)。点击「确认」收尾",l.prNumber?"(merge:auto 时自动合并 PR)":"",",或「Cancel」丢弃。"]}),e.jsx(ln,{taskId:l.id}),l.prUrl&&e.jsxs("a",{href:l.prUrl,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary mt-3 !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:["Open PR #",l.prNumber]})]}),K&&e.jsxs("div",{className:"mb-4 rounded-lg border border-[#bbf7d0] bg-[#f0fdf4] p-4 text-[13px] text-success",children:[e.jsx("div",{className:"font-semibold",children:"✅ PR ready · 等待人工确认"}),e.jsx("div",{className:"mt-1 text-og-700",children:"Dev finished its post-approve checks — 点击「确认」收尾(merge:auto 时由 baxian 执行合并)。"}),l.prUrl&&e.jsxs("a",{href:l.prUrl,target:"_blank",rel:"noopener noreferrer",className:"btn-secondary mt-3 !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:["Open PR #",l.prNumber]})]}),ne&&e.jsxs("div",{className:"mb-4 rounded-lg border border-[#fde68a] bg-[#fef3c7]/60 p-4 text-[13px] text-warn",children:[e.jsxs("div",{className:"font-semibold",children:["已达 review 轮次上限(round ",l.reviewRound,")"]}),e.jsx("div",{className:"mt-1 text-og-700",children:"可「标记完成」合并收尾,或「继续一轮」由 dev 再修一轮(完成后自动转 QA review)。"}),e.jsx("div",{className:"mt-2 text-og-700",children:"轮次越多,Agent 越容易偏离重点。若无严重问题,建议先合并本次成果,剩余问题另开任务跟进。"})]}),e.jsx("pre",{className:"card mb-4 whitespace-pre-wrap p-4 text-[13px] text-og-800",children:l.description}),e.jsxs("div",{className:"card space-y-2 p-4 text-[13px]",children:[e.jsxs("div",{className:"grid grid-cols-1 gap-x-6 gap-y-2 md:grid-cols-2",children:[e.jsxs("div",{className:"text-og-500",children:["Project: ",e.jsx("span",{className:"font-mono text-og-800",children:l.projectId})]}),e.jsxs("div",{className:"text-og-500",children:["Round: ",e.jsx("span",{className:"font-mono text-og-800",children:l.reviewRound})," ",e.jsxs("span",{children:["spec: ",e.jsx("span",{className:"font-mono text-og-800",children:l.specReviewRound??0})]})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-x-6 gap-y-2 md:grid-cols-2",children:[e.jsxs("div",{className:"text-og-500",children:["Dev: ",e.jsx(Rt,{id:l.agentId,runtime:F.get(l.agentId)})]}),e.jsxs("div",{className:"text-og-500",children:["QA: ",e.jsx(Rt,{id:l.qaAgentId??"",runtime:F.get(l.qaAgentId??"")})]})]}),e.jsxs("div",{className:"grid grid-cols-1 gap-x-6 gap-y-2 md:grid-cols-2",children:[e.jsxs("div",{className:"text-og-500",children:["PR:"," ",l.prNumber?l.prUrl?e.jsxs("a",{href:l.prUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:text-accent-hover",children:["#",l.prNumber]}):e.jsxs("span",{className:"font-mono text-og-800",children:["#",l.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:l.branch||"—"})]})]})]})]})}function X(c){const I=c.status==="max_rounds",K=I&&c.phase!=="spec",se=I&&c.phase==="spec",ne=c.status==="ready"||c.status==="merge-ready",Z=c.reviewMode==="server"&&c.status==="approved",C=c.status==="pending",G=c.status==="pending"||c.status==="in_progress"||I||ne||Z,q=(Ct.has(c.status)||se)&&!!c.preferredAgentId,ae=!!c.prNumber&&!se&&c.reviewMode!=="server",_=c.reviewMode==="server",N=K&&(!!c.prNumber||_),$=K&&(!!c.prNumber||_)&&!!c.agentId,R=_&&c.status==="approved",ee=c.preferredAgentId==="";return e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",disabled:!C,onClick:()=>i(!0),className:"btn-secondary",children:"Edit"}),e.jsx("button",{type:"button",disabled:!G||u,onClick:B,className:"btn-secondary !border-[#fecaca] !text-danger hover:!bg-[#fef2f2] hover:!border-danger",children:u?"Cancelling…":"Cancel"}),!K&&e.jsx("button",{type:"button",disabled:!q||m,onClick:P,title:Ct.has(c.status)||se?ee?"Legacy task has no preferred dev to retry against":"新建一个 task 从头跑,丢弃当前 worktree/branch":`Cannot retry in status ${c.status}`,className:"btn-secondary",children:m?"Retrying…":"Retry"}),e.jsx("button",{type:"button",disabled:!ae||b,onClick:j,title:c.prNumber?se?"spec 阶段达上限不支持 Call review":"让 QA agent 立即开始新一轮 review(reviewRound +1)":"该 task 还没有 PR,无法派 review",className:"btn-secondary !border-accent-soft !text-accent hover:!bg-accent-soft hover:!border-accent",children:b?"Dispatching…":"Call review"}),K&&e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",disabled:!$||A,onClick:W,title:"派 dev 再修一轮,完成后自动转 QA review",className:"btn-secondary !border-accent-soft !text-accent hover:!bg-accent-soft hover:!border-accent",children:A?"Continuing…":"继续一轮"}),e.jsx("button",{type:"button",disabled:!N||d,onClick:M,title:"合并 PR 并收尾(删本地分支 + 压缩上下文)",className:"btn-secondary !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:d?"Completing…":"标记完成"})]}),ne&&e.jsx("button",{type:"button",disabled:d,onClick:H,title:"确认完成;merge:auto 时由 baxian 执行合并",className:"btn-secondary !border-[#bbf7d0] !text-success hover:!bg-[#dcfce7] hover:!border-success",children:d?"Confirming…":"确认"}),R&&e.jsx("button",{type:"button",disabled:d,onClick:H,title:"发布派发失败后重试 push/PR 步骤",className:"btn-secondary !border-accent-soft !text-accent hover:!bg-accent-soft hover:!border-accent",children:d?"Retrying…":"重试发布"})]})}}function ln({taskId:t}){var i;const[s,r]=o.useState(null);if(o.useEffect(()=>{let u=!0;return L.tasks.reviews(t).then(f=>{u&&r(f)}).catch(()=>{u&&r([])}),()=>{u=!1}},[t]),!s||s.length===0)return null;const a=s[s.length-1],n=s.reduce((u,f)=>{var m;return u+(((m=f.findings)==null?void 0:m.findings.length)??0)},0);return e.jsxs("div",{className:"mt-2 text-[12px] text-og-700",children:["Review ",s.length," 轮 · 最终 verdict ",e.jsx("span",{className:"font-mono",children:((i=a.findings)==null?void 0:i.verdict)??"—"})," ","· findings 共 ",n," 条"]})}const Ze="baxian:terminal-activated";function Jt({group:t,projectId:s,agentsById:r,agentsLoaded:a,agentsError:n=!1,tasks:i,onDeleted:u,terminalMode:f="activity-preview"}){var F,z,B;const m=t.find(j=>j.role==="dev")??t[0],h=t.find(j=>j.role==="qa"),b=i.filter(j=>un(j,m==null?void 0:m.id,h==null?void 0:h.id)),g=m?i.filter(j=>fn(j,s,m.id)).sort((j,P)=>j.createdAt.localeCompare(P.createdAt)):[],d=m?r.get(m.id):void 0,v=!!d&&d.runtimeStatus==="idle"&&((F=d.binding)==null?void 0:F.status)!=="awaiting_human"&&!((z=d.binding)!=null&&z.creationToken)&&!((B=d.binding)!=null&&B.taskId),A=`Agent group ${t.map(j=>j.id).join(" / ")}`,{openTask:x}=$e(),p=f==="embedded-full",S=o.useId(),[O,w]=o.useState(null);o.useEffect(()=>{if(!p)return;const j=W=>{W.composedPath().some(Q=>Q instanceof Element&&Q.hasAttribute("data-agent-card"))||w(null)},P=W=>{if(W.key!=="Escape")return;const H=document.activeElement;H instanceof Element&&H.closest("[data-agent-card]")||w(null)},M=W=>{const H=W.detail;(H==null?void 0:H.groupId)!==S&&w(null)};return document.addEventListener("click",j),document.addEventListener("keydown",P),document.addEventListener(Ze,M),()=>{document.removeEventListener("click",j),document.removeEventListener("keydown",P),document.removeEventListener(Ze,M)}},[p,S]);const E=j=>{w(j),document.dispatchEvent(new CustomEvent(Ze,{detail:{groupId:S}}))},y=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",l=!!m&&g.length>0,T=b.length===0&&!l;return e.jsxs("div",{role:"group","aria-label":A,className:"min-w-0",children:[l&&m&&e.jsx(dn,{tasks:g,devId:m.id,dispatchReady:v,label:A}),b.length>0&&e.jsx("div",{className:"card mb-2 max-h-28 overflow-y-auto divide-y divide-hairline",children:b.map(j=>{const P=j.phase==="spec"?j.specReviewRound??0:j.reviewRound;return e.jsxs("button",{type:"button",onClick:()=>x(j.id),className:"flex w-full items-center gap-3 px-3 py-2 text-left 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",title:j.id,children:ht(j.id)}),e.jsx("span",{className:"truncate text-og-1000",children:j.title})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-2",children:[e.jsxs("span",{className:"shrink-0 text-[12px] text-og-500",children:["Round ",P]}),e.jsx("span",{className:`${Vt[j.status]} shrink-0`,children:j.status})]})]},j.id)})}),T&&e.jsx("div",{className:"mb-2 rounded-lg border border-hairline bg-surface px-3 py-2 text-[13px] text-og-400","aria-label":`${A} no active task`,children:"暂无任务"}),e.jsx("div",{className:`grid grid-cols-1 ${y} gap-4`,children:t.map(j=>{const P=r.get(j.id),M=P??{id:j.id,projectId:s,runtimeStatus:"unknown",tmuxSessionStatus:"unknown",stale:!0};return e.jsx(Ws,{agent:M,projectId:s,role:j.role,runtime:j.runtime,pendingRestart:a&&!P,terminalLoading:!a&&!P&&!n,onDeleted:u,showTaskBinding:!1,terminalMode:f,...p?{active:O===j.id,onActivate:()=>E(j.id)}:{}},j.id)})})]})}function dn({tasks:t,devId:s,dispatchReady:r,label:a}){const{show:n}=fe(),{openTask:i}=$e(),[u,f]=o.useState(null),m=async h=>{f(h);try{await L.tasks.dispatch(h,{agentId:s}),n({kind:"success",title:`Task ${h} 已派给 ${s}`})}catch(b){n({kind:"error",title:"派遣失败",body:b instanceof Error?b.message:String(b)})}finally{f(null)}};return e.jsx("div",{role:"group",className:"card mb-2 max-h-28 overflow-y-auto divide-y divide-hairline","aria-label":`${a} claimable tasks for ${s}`,children:t.map(h=>{const b=h.preferredAgentId==="",g=u!==null;return e.jsxs("div",{className:"flex items-center gap-3 px-3 py-2 text-[13px]",children:[e.jsxs("button",{type:"button",onClick:()=>i(h.id),className:"min-w-0 flex-1 flex items-center gap-2 text-left transition-colors hover:text-accent-hover",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] text-og-500",title:h.id,children:ht(h.id)}),e.jsx("span",{className:"truncate text-og-1000",title:h.title,children:h.title}),b&&e.jsx("span",{className:"pill shrink-0",children:"未分配"})]}),e.jsx("button",{type:"button",onClick:()=>void m(h.id),disabled:!r||g,title:r?`派给 ${s} 并立即开始`:"Dev 当前不可派遣",className:"shrink-0 text-[13px] font-medium text-accent transition-colors hover:text-accent-hover disabled:opacity-50 disabled:cursor-not-allowed",children:u===h.id?"Starting…":"Start"})]},h.id)})})}function un(t,s,r){return!(!s||!Bt.has(t.status)||!(t.agentId===s||t.preferredAgentId===s)||r&&t.qaAgentId&&t.qaAgentId!==r)}function fn(t,s,r){return t.projectId!==s||t.status!=="pending"?!1:t.preferredAgentId===r||t.preferredAgentId===""}const hn=/^[a-z][a-z0-9-]{1,31}$/,mn=/^[A-Za-z0-9_-][A-Za-z0-9._-]*\/[A-Za-z0-9_-][A-Za-z0-9._-]*$/,Tt="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",et="mb-1.5 block text-[12px] font-medium text-og-700",It="mt-1 text-[12px] text-danger";function xn({open:t,onClose:s,onCreated:r}){const[a,n]=o.useState(""),[i,u]=o.useState(""),[f,m]=o.useState(null),[h,b]=o.useState(!1),[g,d]=o.useState(null),[v,A]=o.useState({}),[x,p]=o.useState(new Set),S=o.useRef(0),{show:O}=fe(),{flagDirty:w}=Ge();o.useEffect(()=>{if(!t)return;S.current+=1;const T=S.current;n(""),u(""),m(null),d(null),A({}),p(new Set),L.config.get().then(F=>{T===S.current&&p(new Set(F.project.map(z=>z.id)))}).catch(()=>{})},[t]);const E=()=>{h||s()},y=()=>{const T={};return a?hn.test(a)?x.has(a)&&(T.id="该 id 已被占用"):T.id="小写字母开头,只含 a-z 0-9 -,长度 2-32":T.id="必填",i?mn.test(i)||(T.repo="需为 owner/repo 形式"):T.repo="必填",A(T),Object.keys(T).length===0},l=async T=>{if(T.preventDefault(),!!y()){b(!0),d(null);try{const F=await L.projects.create({id:a,repo:i,merge:f});F.restartRequired&&w(),O({kind:"success",title:`项目 ${F.project.id} 已创建`}),r(F.project.id)}catch(F){d(F instanceof Error?F.message:String(F))}finally{b(!1)}}};return e.jsx(ve,{open:t,onClose:E,title:"新建项目",size:"md",footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:E,disabled:h,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",form:"create-project-form",disabled:h,className:"btn-primary",children:h?"创建中…":"创建"})]}),children:e.jsxs("form",{id:"create-project-form",onSubmit:l,className:"space-y-3",children:[g&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:g}),e.jsxs("div",{children:[e.jsx("label",{className:et,htmlFor:"proj-id",children:"项目 ID"}),e.jsx("input",{id:"proj-id",type:"text",value:a,onChange:T=>n(T.target.value),className:Tt,placeholder:"kongkong",disabled:h}),v.id&&e.jsx("div",{className:It,children:v.id})]}),e.jsxs("div",{children:[e.jsx("label",{className:et,htmlFor:"proj-repo",children:"GitHub 仓库"}),e.jsx("input",{id:"proj-repo",type:"text",value:i,onChange:T=>u(T.target.value),className:Tt,placeholder:"baxian-ai/baxian",disabled:h}),v.repo&&e.jsx("div",{className:It,children:v.repo})]}),e.jsxs("div",{children:[e.jsx("span",{className:et,children:"合并策略"}),e.jsxs("label",{className:"mb-1 flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"merge",checked:f===null,onChange:()=>m(null),disabled:h,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:()=>m("auto"),disabled:h,className:"h-3.5 w-3.5 accent-[#1348dc]"}),e.jsx("span",{className:"text-[13px] text-og-800",children:"QA Approve 后自动合并"})]})]})]})})}const $t=/^[a-z][a-z0-9-]{1,31}$/,pn=500,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",pe="mb-1.5 block text-[12px] font-medium text-og-700",Dt="mt-1 text-[12px] text-danger",tt="mt-1 text-[12px] text-og-500",je="h-3.5 w-3.5 accent-[#1348dc]",Pt={id:"",role:"dev",pairWith:"",mode:"local",host:"",runtime:"",workdir:"",yolo:!0,model:"",addDirs:""};function bn(t){return t.alias?t.alias:`${t.user?`${t.user}@`:""}${t.hostname}${t.port!=null?`:${t.port}`:""}`}function Yt({open:t,onClose:s,projectId:r,onCreated:a}){var Z;const[n,i]=o.useState(Pt),[u,f]=o.useState(null),[m,h]=o.useState([]),[b,g]=o.useState(new Set),[d,v]=o.useState(null),[A,x]=o.useState(!1),[p,S]=o.useState(!1),[O,w]=o.useState(null),E=o.useRef(null),y=o.useRef(null),l=o.useRef(0),{show:T}=fe(),{flagDirty:F}=Ge();o.useEffect(()=>{if(!t)return;l.current+=1;const C=l.current;i(Pt),f(null),h([]),g(new Set),v(null),x(!1),w(null),L.config.get().then(G=>{if(C!==l.current)return;const q=G.project.find(_=>_.id===r)??null;f(q),h(G.host??[]);const ae=new Set;G.project.forEach(_=>_.agent.forEach(N=>N.forEach($=>ae.add($.id)))),g(ae)}).catch(()=>{})},[t,r]);const z=()=>{p||s()},B=o.useCallback(()=>{E.current&&E.current.abort();const C=new AbortController;E.current=C,x(!0),w(null);const G=n.mode==="remote"?{hostId:n.host}:{};L.agents.probe(n.mode,G,{signal:C.signal}).then(q=>{C.signal.aborted||(v(q),w(null))}).catch(q=>{C.signal.aborted||(v(null),w(q instanceof Error?q.message:String(q)))}).finally(()=>{E.current===C&&x(!1)})},[n.mode,n.host]);o.useEffect(()=>{if(t&&(v(null),E.current&&E.current.abort(),!(n.mode==="remote"&&!n.host)))return y.current&&clearTimeout(y.current),y.current=setTimeout(B,pn),()=>{y.current&&clearTimeout(y.current)}},[t,n.mode,n.host,B]),o.useEffect(()=>{t||E.current&&E.current.abort()},[t]),o.useEffect(()=>()=>{E.current&&E.current.abort(),y.current&&clearTimeout(y.current)},[]);const j=(u==null?void 0:u.agent.filter(C=>C.length===1&&C[0].role==="dev").map(C=>C[0]))??[],P=j.length>0,M=$t.test(n.id)&&!b.has(n.id),W=n.mode==="local"||n.mode==="remote"&&n.host!=="",H=n.runtime!==""&&(n.runtime==="claude-code"?!!(d!=null&&d.runtimes["claude-code"].ok):!!(d!=null&&d.runtimes.codex.ok)),V=!!(d!=null&&d.tmux.ok),Q=n.mode==="local"||!!((Z=d==null?void 0:d.ssh)!=null&&Z.ok),X=n.role==="dev"||n.role==="qa"&&n.pairWith!=="",c=!p&&M&&W&&X&&H&&V&&Q,I=async C=>{if(C.preventDefault(),!!c){S(!0),w(null);try{const G=n.addDirs.split(`
2
+ `).map(_=>_.trim()).filter(_=>_.length>0),q={id:n.id,role:n.role,runtime:n.runtime,mode:n.mode,...n.mode==="remote"?{host:n.host}:{},...n.workdir?{workdir:n.workdir}:{},yolo:n.yolo,...n.model.trim()?{model:n.model.trim()}:{},...G.length>0?{addDirs:G}:{},...n.role==="qa"?{pairWith:n.pairWith}:{}},ae=await L.projects.addAgent(r,q);ae.restartRequired&&F(),T({kind:"success",title:`Agent ${ae.agent.id} 已添加到 ${r}`}),a(),s()}catch(G){w(G instanceof Error?G.message:String(G))}finally{S(!1)}}},K=({rt:C})=>{if(n.mode==="remote"&&!n.host)return e.jsx("span",{className:"ml-2 text-[12px] text-og-400",children:"(请先选择 Host)"});if(A)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 q=d.runtimes[C];return q.ok?e.jsxs("span",{className:"ml-2 text-[12px] text-success",children:["✓ ",q.path??""]}):e.jsxs("span",{className:"ml-2 text-[12px] text-danger",title:q.message,children:["⨯ ",q.message]})},se=()=>n.mode==="remote"&&!n.host?null:A?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,ne=()=>n.mode!=="remote"||!n.host||!(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(ve,{open:t,onClose:z,title:`添加 Agent 到 ${r}`,size:"lg",footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:z,disabled:p,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"submit",form:"create-agent-form",disabled:!c,className:"btn-primary",children:p?"添加中…":"添加 Agent"})]}),children:e.jsxs("form",{id:"create-agent-form",onSubmit:I,className:"space-y-3",children:[O&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:O}),e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"agent-id",children:"Agent ID"}),e.jsx("input",{id:"agent-id",type:"text",value:n.id,onChange:C=>i({...n,id:C.target.value}),className:ye,placeholder:"kk-cc",disabled:p}),n.id&&!$t.test(n.id)&&e.jsx("div",{className:Dt,children:"小写字母开头,只含 a-z 0-9 -,长度 2-32"}),n.id&&b.has(n.id)&&e.jsx("div",{className:Dt,children:"该 id 已被占用(全局唯一)"})]}),e.jsxs("div",{children:[e.jsx("span",{className:pe,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:je,onChange:()=>i({...n,role:"dev",pairWith:""}),disabled:p}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Dev"})]}),e.jsxs("label",{className:"inline-flex items-center gap-2",title:P?"":"请先创建一个 Dev Agent",children:[e.jsx("input",{type:"radio",name:"role",checked:n.role==="qa",className:je,onChange:()=>i({...n,role:"qa"}),disabled:p||!P}),e.jsx("span",{className:`text-[13px] ${P?"text-og-800":"text-og-400"}`,children:"QA"})]})]}),n.role==="qa"&&e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"pair-with",children:"配对 Dev Agent"}),e.jsxs("select",{id:"pair-with",value:n.pairWith,onChange:C=>i({...n,pairWith:C.target.value}),className:ye,disabled:p,children:[e.jsx("option",{value:"",children:"请选择"}),j.map(C=>e.jsxs("option",{value:C.id,children:[C.id," (dev, ",C.mode,")"]},C.id))]})]}),e.jsxs("div",{children:[e.jsx("span",{className:pe,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:je,onChange:()=>i({...n,mode:"local",host:""}),disabled:p}),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:je,onChange:()=>i({...n,mode:"remote"}),disabled:p}),e.jsx("span",{className:"text-[13px] text-og-800",children:"远程 (SSH)"})]})]}),n.mode==="remote"&&e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"host",children:"Host"}),m.length===0?e.jsx("div",{className:"rounded-md border border-og-100 bg-og-50/40 px-3 py-2 text-[12px] text-og-600",children:"还没有配置 Host。请先在右上角菜单的「Host 管理」中添加。"}):e.jsxs("select",{id:"host",value:n.host,onChange:C=>i({...n,host:C.target.value}),className:ye,disabled:p,children:[e.jsx("option",{value:"",children:"请选择 Host"}),m.map(C=>e.jsx("option",{value:C.id,children:bn(C)},C.id))]}),e.jsx("div",{className:tt,children:"私钥/跳板机仍可在 ~/.ssh/config 配置;端口/密码在「Host 管理」里设置。"})]}),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:B,className:"text-[12px] text-accent transition-colors hover:text-accent-hover disabled:cursor-not-allowed disabled:opacity-50",disabled:p||A||n.mode==="remote"&&!n.host,children:"↻ 重新探测"})]}),e.jsxs("label",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",name:"runtime",checked:n.runtime==="claude-code",className:je,onChange:()=>i({...n,runtime:"claude-code"}),disabled:p||(d?!d.runtimes["claude-code"].ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Claude Code"}),e.jsx(K,{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:je,onChange:()=>i({...n,runtime:"codex"}),disabled:p||(d?!d.runtimes.codex.ok:!1)}),e.jsx("span",{className:"text-[13px] text-og-800",children:"Codex"}),e.jsx(K,{rt:"codex"})]}),e.jsx("div",{className:"mt-2",children:e.jsx(se,{})}),e.jsx("div",{children:e.jsx(ne,{})})]}),e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"workdir",children:"Workdir(可选)"}),e.jsx("input",{id:"workdir",type:"text",value:n.workdir,onChange:C=>i({...n,workdir:C.target.value}),className:ye,placeholder:"留空时自动 clone 到 ~/.baxian/repos/<owner>/<repo>",disabled:p})]}),e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"model",children:"Model(可选)"}),e.jsx("input",{id:"model",type:"text",value:n.model,onChange:C=>i({...n,model:C.target.value}),className:ye,placeholder:n.runtime==="codex"?"例: o3 / gpt-4o(留空走 default)":"例: sonnet / opus / claude-sonnet-4-6(留空走 default)",disabled:p}),e.jsx("div",{className:tt,children:"透传到 launch 命令的 --model 参数;留空跟随 CLI 默认。"})]}),e.jsxs("div",{children:[e.jsx("label",{className:pe,htmlFor:"addDirs",children:"Additional Dirs(可选)"}),e.jsx("textarea",{id:"addDirs",value:n.addDirs,onChange:C=>i({...n,addDirs:C.target.value}),className:`${ye} font-mono text-[12px]`,rows:3,placeholder:`每行一个绝对路径,例:
3
+ /Users/me/shared-libs
4
+ /Users/me/extra-repo`,disabled:p}),e.jsx("div",{className:tt,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:C=>i({...n,yolo:C.target.checked}),disabled:p}),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)中运行"}),"。"]})]})]})})]})})}const Mt="***",ke="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",Se="mb-1.5 block text-[12px] font-medium text-og-700",st={hostname:"",port:"",alias:"",user:"",password:""};function gn(t){return t.alias?t.alias:`${t.user?`${t.user}@`:""}${t.hostname}${t.port!=null?`:${t.port}`:""}`}function vn({open:t,onClose:s}){const[r,a]=o.useState([]),[n,i]=o.useState("list"),[u,f]=o.useState(null),[m,h]=o.useState(!1),[b,g]=o.useState(!1),[d,v]=o.useState(st),[A,x]=o.useState(null),[p,S]=o.useState(!1),[O,w]=o.useState(!1),[E,y]=o.useState(null),{show:l}=fe(),T=o.useCallback(()=>{L.hosts.list().then(a).catch(c=>x(c instanceof Error?c.message:String(c)))},[]);o.useEffect(()=>{t&&(i("list"),f(null),v(st),x(null),y(null),T())},[t,T]);const F=()=>{f(null),h(!1),g(!1),v(st),x(null),y(null),i("form")},z=c=>{f(c.id??null),h(c.password===Mt),g(!1),v({hostname:c.hostname,port:c.port!=null?String(c.port):"",alias:c.alias??"",user:c.user??"",password:""}),x(null),y(null),i("form")},B=()=>{const c={hostname:d.hostname.trim()};return u?(c.port=d.port.trim()?Number(d.port):null,c.alias=d.alias.trim(),c.user=d.user.trim()):(d.port.trim()&&(c.port=Number(d.port)),d.alias.trim()&&(c.alias=d.alias.trim()),d.user.trim()&&(c.user=d.user.trim())),u&&b?c.password="":d.password&&(c.password=d.password),c},j=d.port.trim(),P=j===""||/^\d+$/.test(j)&&Number(j)>0&&Number(j)<=65535,M=d.hostname.trim().length>0&&P,W=async()=>{if(M){w(!0),y(null),x(null);try{const c=await L.hosts.check({...B(),...u?{id:u}:{}});y(c)}catch(c){x(c instanceof Error?c.message:String(c))}finally{w(!1)}}},H=async c=>{if(c.preventDefault(),!(!M||p)){S(!0),x(null);try{if(u)await L.hosts.update(u,B()),l({kind:"success",title:`Host ${u} 已更新`});else{const I=await L.hosts.create(B());l({kind:"success",title:`Host ${I.host.id} 已添加`})}T(),i("list")}catch(I){x(I instanceof Error?I.message:String(I))}finally{S(!1)}}},V=async c=>{x(null);try{await L.hosts.delete(c.id),l({kind:"success",title:`Host ${c.id} 已删除`}),T()}catch(I){x(I instanceof Error?I.message:String(I))}},Q=e.jsx("button",{type:"button",onClick:s,className:"btn-secondary",children:"关闭"}),X=e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>i("list"),disabled:p,className:"btn-secondary",children:"返回"}),e.jsx("button",{type:"submit",form:"host-form",disabled:!M||p,className:"btn-primary",children:p?"保存中…":"保存"})]});return e.jsxs(ve,{open:t,onClose:s,title:"Host 管理",size:"md",footer:n==="list"?Q:X,children:[A&&e.jsx("div",{className:"mb-3 rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[13px] text-danger",children:A}),n==="list"?e.jsxs("div",{className:"space-y-3",children:[r.length===0?e.jsx("p",{className:"text-[13px] text-og-500",children:"还没有配置 Host。点击下方「添加 Host」。"}):e.jsx("ul",{className:"space-y-1.5",children:r.map(c=>e.jsxs("li",{className:"flex items-center justify-between gap-3 rounded-md border border-og-100 px-3 py-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-og-800",children:gn(c)}),e.jsxs("div",{className:"truncate text-[12px] text-og-500",children:[(c.user?`${c.user}@`:"")+c.hostname,c.port!=null?`:${c.port}`:"",c.password===Mt?" · 密码已保存":""]})]}),e.jsxs("div",{className:"flex shrink-0 gap-2",children:[e.jsx("button",{type:"button",onClick:()=>z(c),className:"text-[12px] text-accent transition-colors hover:text-accent-hover",children:"编辑"}),e.jsx("button",{type:"button",onClick:()=>V(c),className:"text-[12px] text-danger transition-colors hover:opacity-80",children:"删除"})]})]},c.id))}),e.jsx("button",{type:"button",onClick:F,className:"btn-secondary w-full",children:"+ 添加 Host"})]}):e.jsxs("form",{id:"host-form",onSubmit:H,className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("label",{className:Se,htmlFor:"host-hostname",children:"Host 地址"}),e.jsx("input",{id:"host-hostname",type:"text",value:d.hostname,onChange:c=>v({...d,hostname:c.target.value}),className:ke,placeholder:"remote.example.com",disabled:p})]}),e.jsxs("div",{children:[e.jsx("label",{className:Se,htmlFor:"host-port",children:"端口(可选)"}),e.jsx("input",{id:"host-port",type:"text",inputMode:"numeric",value:d.port,onChange:c=>v({...d,port:c.target.value}),className:ke,placeholder:"22",disabled:p}),d.port.trim()!==""&&!P&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:"端口需为 1–65535 的整数"})]}),e.jsxs("div",{children:[e.jsx("label",{className:Se,htmlFor:"host-alias",children:"别名(可选)"}),e.jsx("input",{id:"host-alias",type:"text",value:d.alias,onChange:c=>v({...d,alias:c.target.value}),className:ke,placeholder:"Prod worker",disabled:p})]}),e.jsxs("div",{children:[e.jsx("label",{className:Se,htmlFor:"host-user",children:"用户名(可选)"}),e.jsx("input",{id:"host-user",type:"text",value:d.user,onChange:c=>v({...d,user:c.target.value}),className:ke,placeholder:"留空则读 ~/.ssh/config 的 User",disabled:p})]}),e.jsxs("div",{children:[e.jsx("label",{className:Se,htmlFor:"host-password",children:"密码(可选)"}),e.jsx("input",{id:"host-password",type:"password",value:b?"":d.password,onChange:c=>v({...d,password:c.target.value}),className:ke,placeholder:m?"已设置,留空保持不变":"留空使用 key 认证",disabled:p||b,autoComplete:"new-password"}),u&&m&&e.jsxs("label",{className:"mt-1.5 flex items-center gap-2 text-[12px] text-og-700",children:[e.jsx("input",{type:"checkbox",className:"h-3.5 w-3.5 accent-[#1348dc]",checked:b,onChange:c=>g(c.target.checked),disabled:p}),"清除已保存的密码(改用 key 登录)"]})]}),e.jsxs("div",{className:"rounded-md border border-[#fde68a] bg-[#fef3c7]/60 px-3 py-2.5 text-[12px] text-warn",children:["建议为该 Host 配置好",e.jsx("strong",{className:"font-semibold",children:"免密码登入(SSH key)"}),"。 否则填写的密码将以",e.jsx("strong",{className:"font-semibold",children:"明文"}),"保存到 baxian.json 中。"]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{type:"button",onClick:W,disabled:!M||O||p,className:"text-[12px] text-accent transition-colors hover:text-accent-hover disabled:cursor-not-allowed disabled:opacity-50",children:O?"测试中…":"测试连接"}),E&&e.jsxs("span",{className:`text-[12px] ${E.ok?"text-success":"text-danger"}`,children:[E.ok?"✓ ":"⨯ ",E.message]})]})]})]})}function yn(){const{openTask:t}=$e(),{projects:s,error:r,refresh:a}=qe(),n=s??[],i=s!==null,[u,f]=o.useState(!1),[m,h]=o.useState(!1),[b,g]=o.useState(!1),[d,v]=o.useState({kind:"closed"}),{data:A,loaded:x,error:p}=Qt(),S=(p==null?void 0:p.message)??null,O=new Map((A??[]).map(B=>[B.id,B])),w=r??S,[E,y]=o.useState(!1),l=o.useRef(null),T=o.useRef(null),F=o.useId(),z=o.useId();return o.useEffect(()=>{if(!E)return;const B=P=>{var W,H;const M=P.target;M&&((W=T.current)!=null&&W.contains(M)||(H=l.current)!=null&&H.contains(M)||y(!1))},j=P=>{var M;P.key==="Escape"&&(y(!1),(M=l.current)==null||M.focus())};return document.addEventListener("mousedown",B),document.addEventListener("keydown",j),()=>{document.removeEventListener("mousedown",B),document.removeEventListener("keydown",j)}},[E]),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:()=>h(!0),disabled:n.length===0,"aria-describedby":n.length===0?"create-task-hint":void 0,className:"btn-primary",children:"+ 新建 Task"}),n.length===0&&e.jsx("span",{id:"create-task-hint",className:"self-center text-[12px] text-og-500",children:"请先创建项目"}),e.jsxs("div",{className:"relative",children:[e.jsx("button",{ref:l,id:z,type:"button",onClick:()=>y(B=>!B),"aria-haspopup":"menu","aria-expanded":E,"aria-controls":F,"aria-label":"更多操作",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"})]})}),E&&e.jsxs("div",{ref:T,id:F,role:"menu","aria-labelledby":z,className:"absolute right-0 top-full z-10 mt-1 min-w-[140px] rounded-md border border-hairline bg-surface py-1 shadow-md",children:[e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{y(!1),f(!0)},className:"block w-full px-3 py-1.5 text-left text-[13px] text-og-800 hover:text-og-1000",children:"新建项目"}),e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{y(!1),g(!0)},className:"block w-full px-3 py-1.5 text-left text-[13px] text-og-800 hover:text-og-1000",children:"Host 管理"})]})]})]}),w&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",w]}),i&&n.length===0&&!r&&e.jsx("div",{className:"rounded-lg border border-hairline bg-surface py-12 text-center text-[13px] text-og-500",children:'还没有项目。点击右上角"更多"菜单 → "新建项目"开始。'}),n.map(B=>e.jsx(jn,{project:B,agentsById:O,agentsLoaded:x,agentsError:!!p,onAgentDeleted:a},B.id)),e.jsx(xn,{open:u,onClose:()=>f(!1),onCreated:B=>{f(!1),a(),v({kind:"asking",projectId:B})}}),e.jsx(vn,{open:b,onClose:()=>g(!1)}),e.jsx(ve,{open:d.kind==="asking",onClose:()=>v({kind:"closed"}),title:"项目已创建",size:"sm",footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>v({kind:"closed"}),className:"btn-secondary",children:"稍后再加"}),e.jsx("button",{type:"button",onClick:()=>{d.kind==="asking"&&v({kind:"addingAgent",projectId:d.projectId})},className:"btn-primary",children:"继续添加 Agent"})]}),children:e.jsx("p",{className:"text-[13px] text-og-700",children:"现在添加第一个 Agent,还是稍后再加?"})}),d.kind==="addingAgent"&&e.jsx(Yt,{open:!0,projectId:d.projectId,onClose:()=>v({kind:"closed"}),onCreated:()=>{a()}}),e.jsx(ut,{open:m,onClose:()=>h(!1),onCreated:B=>t(B.id)})]})}function jn({project:t,agentsById:s,agentsLoaded:r,agentsError:a,onAgentDeleted:n}){const{data:i,error:u}=Gt(t.id),f=i??[],m=(u==null?void 0:u.message)??null;return e.jsxs("div",{className:"mb-10",children:[e.jsxs("div",{className:"mb-3 -mx-2 flex items-baseline gap-x-3 gap-y-1 px-2 py-1",children:[e.jsx("h2",{className:"min-w-0 truncate font-display text-[17px] font-semibold tracking-tight text-og-1000",title:t.id,children:e.jsx(Re,{to:`/project/${t.id}`,className:"hover:text-accent-hover",children:t.id})}),e.jsx("span",{className:"hidden min-w-0 truncate font-mono text-[12px] text-og-500 sm:inline-block",title:t.repo,children:t.repo}),e.jsx(Re,{to:`/project/${t.id}`,className:"ml-auto text-[13px] text-accent hover:text-accent-hover","aria-label":`Details — ${t.id}`,children:"Details →"})]}),m&&e.jsxs("div",{className:"mb-2 text-[12px] text-danger",children:["任务列表加载失败:",m]}),t.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:t.agent.length===1?"space-y-3":"grid grid-cols-1 gap-3 xl:grid-cols-2",children:t.agent.map((h,b)=>e.jsx(Jt,{group:h,projectId:t.id,agentsById:s,agentsLoaded:r,agentsError:a,tasks:f,onDeleted:n,terminalMode:"embedded-full"},h.map(g=>g.id).join(":")||b))})]})}function Ue(t){const s=t.match(/^task-(\d+)$/);return s?parseInt(s[1],10):Number.NaN}function wn(t,s){const r=Ue(t.id),a=Ue(s.id);return Number.isNaN(r)||Number.isNaN(a)?t.id.localeCompare(s.id):r-a}function Nn(t,s){const r=(s.updatedAt??"").localeCompare(t.updatedAt??"");if(r!==0)return r;const a=Ue(t.id),n=Ue(s.id);return Number.isNaN(a)||Number.isNaN(n)?s.id.localeCompare(t.id):n-a}function Lt(t,s){const[r,a]=o.useState(Ve);o.useEffect(()=>a(Ve),[s]);const n=t.slice(0,r),i=t.length>n.length;return{items:n,hasMore:i,loadMore:()=>a(f=>f+Ve),total:t.length}}function kn(t){const[s,r]=o.useState([]),[a,n]=o.useState(!1),[i,u]=o.useState(!1),[f,m]=o.useState(!1),[h,b]=o.useState(null),g=o.useRef(0),d=o.useRef(0),v=o.useCallback(A=>{const x=++g.current,p=A==="first"?0:d.current;u(!0),b(null),L.tasks.page(t,{category:"done",offset:p}).then(S=>{g.current===x&&(r(O=>A==="first"?S.tasks:[...O,...S.tasks]),n(S.hasMore),d.current=S.nextOffset,m(!0),u(!1))},S=>{g.current===x&&(b(S instanceof Error?S.message:String(S)),u(!1))})},[t]);return o.useEffect(()=>{g.current+=1,d.current=0,r([]),n(!1),m(!1),b(null),u(!1)},[t]),{items:s,hasMore:a,loading:i,loaded:f,error:h,load:v}}function Sn({projectId:t,openTasks:s,onClose:r,className:a=""}){const n=o.useMemo(()=>s.filter(d=>Bt.has(d.status)).sort(Nn),[s]),i=o.useMemo(()=>s.filter(d=>d.status==="pending").sort(wn),[s]),u=Lt(n,t),f=Lt(i,t),m=kn(t),[h,b]=o.useState(!1);o.useEffect(()=>{b(!1)},[t]);const g=()=>{if(h){b(!1);return}b(!0),m.load("first")};return e.jsxs("aside",{"aria-label":"Task 面板",className:`flex flex-col rounded-lg border border-hairline bg-surface ${a}`,children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-hairline px-3 py-2",children:[e.jsx("h2",{className:"font-display text-[12px] font-semibold uppercase tracking-[0.06em] text-og-500",children:"Tasks"}),e.jsx("button",{type:"button",onClick:r,"aria-label":"关闭 Task 面板",className:"flex h-7 w-7 items-center justify-center rounded text-og-500 transition-colors hover:bg-og-100 hover:text-og-1000",children:e.jsxs("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("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),e.jsxs("div",{children:[e.jsx(Ot,{title:"IN PROGRESS",section:u,emptyHint:"暂无正在处理的任务"}),e.jsx(Ot,{title:"PENDING",section:f,emptyHint:"暂无待处理的任务"}),e.jsxs("div",{children:[e.jsxs("button",{type:"button",onClick:g,"aria-expanded":h,className:"flex w-full items-center justify-between px-3 py-2 text-left text-[11px] font-semibold uppercase tracking-[0.05em] text-og-500 transition-colors hover:bg-og-50/40",children:[e.jsx("span",{children:"DONE"}),e.jsx("span",{className:"font-normal normal-case text-accent",children:h?"收起":"查看"})]}),h&&e.jsx(En,{state:m})]})]})]})}function Ot({title:t,section:s,emptyHint:r}){return e.jsxs("section",{"aria-label":t,className:"border-b border-hairline",children:[e.jsxs("div",{className:"px-3 py-2 text-[11px] font-semibold uppercase tracking-[0.05em] text-og-500",children:[t," ",e.jsxs("span",{className:"text-og-400",children:["(",s.total,")"]})]}),s.items.length===0?e.jsx("div",{className:"px-3 pb-3 text-[12px] text-og-400",children:r}):e.jsxs("div",{className:"divide-y divide-hairline",children:[s.items.map(a=>e.jsx(Xt,{task:a},a.id)),s.hasMore&&e.jsx("button",{type:"button",onClick:s.loadMore,className:"w-full px-3 py-2 text-center text-[12px] text-accent transition-colors hover:bg-og-50/40",children:"加载更多"})]})]})}function En({state:t}){const s=t.loaded&&!t.error&&t.items.length===0;return e.jsxs("div",{className:"divide-y divide-hairline",children:[t.items.map(r=>e.jsx(Xt,{task:r},r.id)),t.error&&e.jsxs("div",{className:"px-3 py-2 text-[12px] text-danger",children:["加载失败:",t.error]}),s&&e.jsx("div",{className:"px-3 pb-3 pt-1 text-[12px] text-og-400",children:"暂无已处理的任务"}),t.loading&&t.items.length===0&&e.jsx("div",{className:"px-3 py-3 text-center text-[12px] text-og-400",children:"加载中…"}),t.hasMore&&e.jsx("button",{type:"button",onClick:()=>t.load("more"),disabled:t.loading,className:"w-full px-3 py-2 text-center text-[12px] text-accent transition-colors hover:bg-og-50/40 disabled:opacity-50",children:t.loading?"加载中…":"加载更多"})]})}function Xt({task:t}){const{openTask:s}=$e(),r=t.phase==="spec"?t.specReviewRound??0:t.reviewRound;return e.jsxs("button",{type:"button",onClick:()=>s(t.id),className:"flex w-full items-center gap-2 px-3 py-2 text-left text-[13px] transition-colors hover:bg-og-50/60",children:[e.jsx("span",{className:"shrink-0 font-mono text-[11px] text-og-500",title:t.id,children:ht(t.id)}),e.jsx("span",{className:"min-w-0 flex-1 truncate text-og-1000",title:t.title,children:t.title}),t.phase==="spec"&&e.jsx("span",{className:"pill pill-review shrink-0",children:"spec"}),e.jsxs("span",{"aria-label":`Round ${r}`,className:"shrink-0 text-[11px] text-og-400",children:["R",r]}),e.jsx(an,{status:t.status})]})}const Cn=[],Zt="baxian.taskPanel.open";function Rn(){try{return localStorage.getItem(Zt)==="1"}catch{return!1}}function An(){const{id:t}=_t(),s=os(),{show:r}=fe(),{openTask:a}=$e(),{refresh:n}=qe(),[i,u]=o.useState(null),[f,m]=o.useState(null),[h,b]=o.useState(!1),[g,d]=o.useState(!1),[v,A]=o.useState(Rn),[x,p]=o.useState(!1),[S,O]=o.useState(!1),[w,E]=o.useState(""),[y,l]=o.useState(!1),[T,F]=o.useState(null),z=o.useRef(null),B=o.useRef(null),j=o.useId(),P=o.useId(),M=o.useRef(0),{data:W,loaded:H,error:V}=Qt(),{data:Q,error:X}=Gt(t),c=(V==null?void 0:V.message)??null,I=(X==null?void 0:X.message)??null,K=Q??Cn,se=new Map((W??[]).map(_=>[_.id,_])),ne=f??c??I,Z=o.useCallback(async _=>{const N=++M.current;try{const $=await L.projects.get(_);if(N!==M.current)return;u($),m(null)}catch($){if(N!==M.current)return;m($ instanceof Error?$.message:String($))}},[]);o.useEffect(()=>{t&&(u(null),m(null),Z(t))},[t,Z]),o.useEffect(()=>{if(!x)return;const _=$=>{var ee,re;const R=$.target;R&&((ee=B.current)!=null&&ee.contains(R)||(re=z.current)!=null&&re.contains(R)||p(!1))},N=$=>{var R;$.key==="Escape"&&(p(!1),(R=z.current)==null||R.focus())};return document.addEventListener("mousedown",_),document.addEventListener("keydown",N),()=>{document.removeEventListener("mousedown",_),document.removeEventListener("keydown",N)}},[x]),o.useEffect(()=>{S||(E(""),F(null))},[S]),o.useEffect(()=>{try{localStorage.setItem(Zt,v?"1":"0")}catch{}},[v]);const C=(i==null?void 0:i.agent.flat().length)??0,G=C===0,q=!!i&&w.trim()===i.id,ae=async()=>{if(!(!i||!q||y)){l(!0),F(null);try{await L.projects.delete(i.id),await n(),r({kind:"success",title:`项目 ${i.id} 已删除`}),O(!1),s("/")}catch(_){F(_ instanceof Error?_.message:String(_))}finally{l(!1)}}};return i?e.jsxs("div",{children:[ne&&e.jsxs("div",{className:"mb-4 text-[13px] text-danger",children:["Error: ",ne]}),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:i.id,children:i.id}),e.jsx("span",{className:"hidden min-w-0 truncate font-mono text-[12px] text-og-500 sm:inline-block",title:i.repo,children:i.repo}),e.jsxs("div",{className:"ml-auto flex items-center gap-1 self-center",children:[!v&&e.jsx("button",{type:"button",onClick:()=>A(!0),"aria-label":"打开 Task 面板",className:"btn-ghost",children:"Tasks"}),e.jsxs("div",{className:"relative",children:[e.jsx("button",{ref:z,id:P,type:"button",onClick:()=>p(_=>!_),"aria-haspopup":"menu","aria-expanded":x,"aria-controls":j,"aria-label":`项目 ${i.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"})]})}),x&&e.jsxs("div",{ref:B,id:j,role:"menu","aria-labelledby":P,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:()=>{p(!1),b(!0)},className:"block w-full px-3 py-1.5 text-left text-[13px] text-og-800 hover:bg-og-100 hover:text-og-1000",children:"添加 Agent"}),e.jsx("div",{role:"none",className:"my-1 border-t border-hairline"}),e.jsx("button",{type:"button",role:"menuitem",onClick:()=>{p(!1),O(!0)},disabled:!G,title:G?void 0:`请先删除项目下的 ${C} 个 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:"flex flex-col gap-4 lg:flex-row lg:items-start",children:[e.jsxs("div",{className:"min-w-0 flex-1",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:()=>d(!0),className:"btn-ghost",children:"+ 新建 Task"})]}),i.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:i.agent.map((_,N)=>e.jsx(Jt,{group:_,projectId:i.id,agentsById:se,agentsLoaded:H,agentsError:!!V,tasks:K,onDeleted:()=>{Z(i.id)},terminalMode:"embedded-full"},_.map($=>$.id).join(":")||N))})]}),v&&e.jsx(Sn,{projectId:i.id,openTasks:K,onClose:()=>A(!1),className:"w-full lg:w-[340px] lg:shrink-0 xl:w-[380px]"})]}),e.jsx(Yt,{open:h,projectId:i.id,onClose:()=>b(!1),onCreated:()=>{Z(i.id)}}),e.jsx(ut,{open:g,projectId:i.id,onClose:()=>d(!1),onCreated:_=>a(_.id)}),e.jsx(ve,{open:S,onClose:()=>{y||O(!1)},title:"删除项目",size:"sm",footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>O(!1),disabled:y,className:"btn-secondary",children:"取消"}),e.jsx("button",{type:"button",onClick:()=>void ae(),disabled:!q||y,className:"btn-secondary !text-danger hover:!bg-[#fef2f2] hover:!text-danger disabled:!text-og-300",children:y?"删除中…":"确认删除"})]}),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:i.id}),"。此操作不可撤销,且不会删除 Git 仓库本身。"]}),e.jsxs("p",{className:"text-[13px] text-og-700",children:["如需确认,请在下方输入项目 ID ",e.jsx("span",{className:"font-mono text-og-1000",children:i.id}),":"]}),e.jsx("input",{type:"text",value:w,onChange:_=>E(_.target.value),placeholder:i.id,autoComplete:"off",autoCorrect:"off",spellCheck:!1,disabled:y,"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"}),T&&e.jsx("div",{className:"rounded-md border border-[#fecaca] bg-[#fef2f2] px-3 py-2 text-[12px] text-danger",children:T})]})})]}):f?e.jsxs("div",{className:"text-[13px] text-danger",children:["Error: ",f]}):e.jsx("div",{className:"text-[13px] text-og-500",children:"Loading…"})}function Tn(){const{agentId:t}=_t(),{projects:s}=qe(),r=o.useMemo(()=>{if(t)for(const a of s??[])for(const n of a.agent){const i=n.find(u=>u.id===t);if(i)return i.runtime}},[t,s]);return t?e.jsxs("div",{"data-testid":"terminal-page-container",className:"flex min-h-0 flex-1 flex-col overflow-hidden 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",title:ct(t,r),children:t})]}),e.jsx("div",{className:"min-h-0 flex-1",children:e.jsx(Ee,{agentId:t,mode:"full",interactive:!0,arrowKeys:!0})})]}):e.jsx("div",{className:"text-[13px] text-danger",children:"No agent specified"})}function In(){const[t,s]=o.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 $n(){const{phase:t,count:s,error:r,triggerRestart:a}=Ge();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:()=>{a()},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:()=>{a()},className:"btn-secondary !border-warn !text-warn hover:!bg-[#fef3c7] hover:!border-warn hover:!text-warn",children:"现在重启"})]})}function Dn(){const s=!is().pathname.startsWith("/terminal/");return e.jsxs("div",{className:"flex h-dvh flex-col bg-page",children:[e.jsx("nav",{className:"flex h-12 flex-none items-center border-b border-hairline bg-surface px-3 sm:px-6",children:e.jsxs(Re,{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-full bg-accent"}),"baxian"]})}),e.jsx($n,{}),e.jsxs("main",{className:"flex min-h-0 flex-1 flex-col overflow-y-auto px-3 py-6 sm:px-6",children:[e.jsxs(cs,{children:[e.jsx(Ke,{path:"/",element:e.jsx(yn,{})}),e.jsx(Ke,{path:"/project/:id",element:e.jsx(An,{})}),e.jsx(Ke,{path:"/terminal/:agentId",element:e.jsx(Tn,{})})]}),s&&e.jsx("footer",{className:"mt-auto flex justify-center pb-4 pt-24",children:e.jsx(In,{})})]})]})}function Pn(){return e.jsx(as,{children:e.jsx(Dn,{})})}function Mn({children:t}){const[s,r]=o.useState({kind:"probing"}),a=o.useRef(s);o.useEffect(()=>{a.current=s},[s]);const n=o.useCallback(async()=>{r({kind:"probing"});try{await L.config.get(),r({kind:"authorized"})}catch(i){if(i instanceof Te&&i.status===401){r({kind:"unauthorized"});return}const u=i instanceof Error?i.message:"无法连接服务器";r({kind:"error",message:u})}},[]);return o.useEffect(()=>{n()},[n]),o.useEffect(()=>{const i=()=>{a.current.kind!=="probing"&&r({kind:"unauthorized",message:"登录已失效,请重新输入令牌"})};return window.addEventListener(Fe,i),()=>window.removeEventListener(Fe,i)},[]),s.kind==="authorized"?e.jsx(e.Fragment,{children:t}):s.kind==="error"?e.jsxs(at,{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(at,{title:"加载中",children:e.jsx("p",{className:"text-[13px] text-og-500",children:"正在检查登录状态…"})}):e.jsx(Ln,{message:s.message,onSubmit:async i=>{ds(i);try{await L.config.get(),r({kind:"authorized"})}catch(u){if(us(),u instanceof Te&&u.status===401){r({kind:"unauthorized",message:"令牌无效,请重试"});return}const f=u instanceof Error?u.message:"登录失败";r({kind:"error",message:f})}}})}function at({title:t,children:s}){return e.jsx("div",{className:"flex min-h-dvh 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 Ln({message:t,onSubmit:s}){const[r,a]=o.useState(""),[n,i]=o.useState(!1),[u,f]=o.useState(void 0),m=async b=>{b.preventDefault();const g=r.trim();if(!g){f("请输入访问令牌");return}f(void 0),i(!0);try{await s(g)}finally{i(!1)}},h=u??t;return e.jsxs(at,{title:"登录 baxian",children:[e.jsx("p",{className:"mb-4 text-[13px] text-og-600",children:"服务器开启了访问鉴权,请输入访问令牌继续。"}),e.jsxs("form",{onSubmit:b=>{m(b)},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:b=>a(b.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}),h&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:h}),e.jsx("button",{type:"submit",disabled:n,className:"btn-primary mt-4 w-full",children:n?"登录中…":"登录"})]})]})}ss.createRoot(document.getElementById("root")).render(e.jsx(o.StrictMode,{children:e.jsx(js,{children:e.jsx(ps,{children:e.jsx(Mn,{children:e.jsx(rn,{children:e.jsx(Pn,{})})})})})}));
@@ -6,7 +6,7 @@
6
6
  <link rel="icon" type="image/png" href="/baxian-logo.png" />
7
7
  <link rel="apple-touch-icon" href="/baxian-logo.png" />
8
8
  <title>baxian</title>
9
- <script type="module" crossorigin src="/assets/index-BfCCF072.js"></script>
9
+ <script type="module" crossorigin src="/assets/index-DE_xpPQe.js"></script>
10
10
  <link rel="modulepreload" crossorigin href="/assets/react-BG4Iuztk.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/xterm-D5X2JljJ.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/router-eEZdpwQZ.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "baxian",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "AI agent orchestration",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {