@baique/pi-web-sky 0.1.40 → 0.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/running/route.js +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/boards/[id]/reconcile/route.js +1 -1
- package/.next/server/app/api/boards/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/task-cards/[id]/route.js +1 -1
- package/.next/server/app/api/task-cards/route.js +1 -1
- package/.next/server/app/api/task-scheduler/status/route.js +1 -1
- package/.next/server/app/api/tasks/[id]/board/route.js +1 -1
- package/.next/server/app/api/tasks/[id]/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/4226.js +2 -2
- package/.next/server/chunks/7128.js +1 -1
- package/.next/server/chunks/861.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{6582.efef0ed269bacae2.js → 6582.fb2c709abc2c5981.js} +1 -1
- package/.next/static/chunks/752.a05a2904b96af4d0.js +1 -0
- package/.next/static/chunks/app/{layout-702d3c97d297c42d.js → layout-2bec2662143a3d1b.js} +1 -1
- package/.next/static/chunks/app/{page-fd18462c3c937a50.js → page-e38c6cf3174fa143.js} +2 -2
- package/.next/static/chunks/{webpack-d17b4dde91b96c63.js → webpack-b4924d2a22ad3650.js} +1 -1
- package/.next/trace +8 -43
- package/.next/trace-build +1 -1
- package/lib/board-reconcile.ts +0 -1
- package/lib/board-types.ts +7 -2
- package/lib/task-card-store.test.mjs +16 -1
- package/lib/task-card-store.ts +11 -0
- package/package.json +1 -1
- package/.next/static/chunks/752.f41a9dcb0e6548eb.js +0 -1
- /package/.next/static/{12RFLqhiUZG8Sj49T1KKQ → 8V884w_cp5HEp_rRpjnCR}/_buildManifest.js +0 -0
- /package/.next/static/{12RFLqhiUZG8Sj49T1KKQ → 8V884w_cp5HEp_rRpjnCR}/_ssgManifest.js +0 -0
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-webpack","duration":
|
|
1
|
+
[{"name":"run-webpack","duration":16840620,"timestamp":113143899830,"id":14,"parentId":1,"tags":{},"startTime":1788427810952,"traceId":"a60bc235dd563a9b"},{"name":"run-typescript","duration":3090553,"timestamp":113160744747,"id":746,"parentId":1,"tags":{},"startTime":1788427827796,"traceId":"a60bc235dd563a9b"},{"name":"static-check","duration":2667784,"timestamp":113163891187,"id":749,"parentId":1,"tags":{},"startTime":1788427830943,"traceId":"a60bc235dd563a9b"},{"name":"static-generation","duration":4662271,"timestamp":113166903731,"id":885,"parentId":1,"tags":{},"startTime":1788427833955,"traceId":"a60bc235dd563a9b"},{"name":"collect-build-traces","duration":46677707,"timestamp":113166561551,"id":882,"parentId":1,"tags":{},"startTime":1788427833613,"traceId":"a60bc235dd563a9b"},{"name":"telemetry-flush","duration":46,"timestamp":113213243452,"id":894,"parentId":1,"tags":{},"startTime":1788427880295,"traceId":"a60bc235dd563a9b"},{"name":"next-build","duration":69487457,"timestamp":113143756051,"id":1,"tags":{"buildMode":"default","version":"16.3.1","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1788427810808,"traceId":"a60bc235dd563a9b"}]
|
package/lib/board-reconcile.ts
CHANGED
|
@@ -230,7 +230,6 @@ export async function reconcileBoard(boardId: string): Promise<void> {
|
|
|
230
230
|
name: card.name,
|
|
231
231
|
description: card.description,
|
|
232
232
|
readyStatus: card.readyStatus,
|
|
233
|
-
execStatus: card.execStatus,
|
|
234
233
|
priority: card.priority,
|
|
235
234
|
due: card.due ?? undefined,
|
|
236
235
|
expanded: false,
|
package/lib/board-types.ts
CHANGED
|
@@ -82,15 +82,20 @@ export interface RunningSnapshot {
|
|
|
82
82
|
runningSessionIds: string[];
|
|
83
83
|
/** 细分状态:只含运行中的会话 id */
|
|
84
84
|
states: Record<string, RunningSessionState>;
|
|
85
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* 任务卡状态(DB 唯一真相的展示镜像)。
|
|
87
|
+
* 无参请求:返回调度器活跃态卡(running/review/waiting_reply,向后兼容左侧栏/旧消费方)。
|
|
88
|
+
* 带 ?boardId=&cardIds=:返回这批可见卡的**全量**状态(含 failed/done/not_started),供画布徽章用。
|
|
89
|
+
*/
|
|
86
90
|
taskCards: TaskCardRunningState[];
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
/**
|
|
93
|
+
/** 任务卡状态(running 快照透传的画布可见卡状态;DB 是唯一真相源,此为展示镜像) */
|
|
90
94
|
export interface TaskCardRunningState {
|
|
91
95
|
cardId: string;
|
|
92
96
|
boardId: string;
|
|
93
97
|
number: number;
|
|
94
98
|
name: string;
|
|
95
99
|
execStatus: string;
|
|
100
|
+
readyStatus: string;
|
|
96
101
|
}
|
|
@@ -5,7 +5,7 @@ import { createJiti } from "jiti";
|
|
|
5
5
|
|
|
6
6
|
const jiti = createJiti(import.meta.url, { interopDefault: true, moduleCache: false });
|
|
7
7
|
const { getDb, setDbForTesting } = await jiti.import("./sqlite-db.ts");
|
|
8
|
-
const { getCard, listCards, createCard, updateCard, deleteCard, addLink, removeLink, replaceLinks, listLinks, listDispatchableCards, countRunningDispatched, acquireDispatchToken, clearDispatchToken, createQuestion, listQuestions, listCardQuestions, answerQuestion, countPendingQuestions, listAnswerableQuestions } = await jiti.import("./task-card-store.ts");
|
|
8
|
+
const { getCard, listCards, listCardsByIds, createCard, updateCard, deleteCard, addLink, removeLink, replaceLinks, listLinks, listDispatchableCards, countRunningDispatched, acquireDispatchToken, clearDispatchToken, createQuestion, listQuestions, listCardQuestions, answerQuestion, countPendingQuestions, listAnswerableQuestions } = await jiti.import("./task-card-store.ts");
|
|
9
9
|
const { createBoard, addNode } = await jiti.import("./board-store.ts");
|
|
10
10
|
|
|
11
11
|
function freshDb() {
|
|
@@ -57,6 +57,21 @@ test("listCards 按编号升序", () => {
|
|
|
57
57
|
assert.deepEqual(cards.map((c) => c.number), [1, 2]);
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
+
test("listCardsByIds 按传入顺序返回、跳过不存在、空数组返回空", () => {
|
|
61
|
+
freshDb();
|
|
62
|
+
const b = createBoard("proj-a", "看板A");
|
|
63
|
+
const c1 = createCard({ boardId: b.id, projectKey: "proj-a", name: "一" });
|
|
64
|
+
createCard({ boardId: b.id, projectKey: "proj-a", name: "二" });
|
|
65
|
+
const c3 = createCard({ boardId: b.id, projectKey: "proj-a", name: "三" });
|
|
66
|
+
updateCard(c1.id, { execStatus: "failed" }); // 任意状态都返回(含非活跃态)
|
|
67
|
+
|
|
68
|
+
// 传入乱序 + 一个不存在 id
|
|
69
|
+
const got = listCardsByIds([c3.id, "no-such-id", c1.id]);
|
|
70
|
+
assert.deepEqual(got.map((c) => c.id), [c3.id, c1.id]);
|
|
71
|
+
assert.equal(got[1].execStatus, "failed", "failed 卡也应按 id 查回(状态分离后可见卡全量拉取)");
|
|
72
|
+
assert.deepEqual(listCardsByIds([]), []);
|
|
73
|
+
});
|
|
74
|
+
|
|
60
75
|
test("updateCard 改字段;getCard 不存在返回 undefined", () => {
|
|
61
76
|
freshDb();
|
|
62
77
|
const b = createBoard("proj-a", "看板A");
|
package/lib/task-card-store.ts
CHANGED
|
@@ -126,6 +126,17 @@ export function getCard(id: string): TaskCard | undefined {
|
|
|
126
126
|
return row ? rowToCard(row) : undefined;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
+
/** 按 id 列表批量取卡(保持传入顺序;不存在 id 跳过)。可见卡状态查询用,单次 IN 查询。 */
|
|
130
|
+
export function listCardsByIds(ids: string[]): TaskCard[] {
|
|
131
|
+
if (ids.length === 0) return [];
|
|
132
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
133
|
+
const rows = getDb()
|
|
134
|
+
.prepare(`SELECT ${CARD_COLUMNS} FROM task_cards WHERE id IN (${placeholders})`)
|
|
135
|
+
.all(...ids) as unknown as TaskCardRow[];
|
|
136
|
+
const byId = new Map(rows.map((r) => [r.id, rowToCard(r)]));
|
|
137
|
+
return ids.map((id) => byId.get(id)).filter((c): c is TaskCard => Boolean(c));
|
|
138
|
+
}
|
|
139
|
+
|
|
129
140
|
/** 某看板的全部任务卡,按编号升序。 */
|
|
130
141
|
export function listCards(boardId: string): TaskCard[] {
|
|
131
142
|
const rows = getDb()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@baique/pi-web-sky",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.41",
|
|
4
4
|
"description": "Web UI for the pi coding agent — Sky skin edition (fork of @agegr/pi-web / earendil-labs pi-web, MIT)",
|
|
5
5
|
"homepage": "https://github.com/baique/pi-web-sky#readme",
|
|
6
6
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[752],{24456:(e,t,r)=>{r.d(t,{l:()=>c});var n=r(95155),i=r(12115),a=r(12669);let s=null,o=null,l=null;function d(e){s?.(e),s=null,l?.unmount(),o?.remove(),l=null,o=null}function c(e){return new Promise(t=>{s&&d(!1),s=t;let r=o;r||(r=document.createElement("div"),document.body.appendChild(r),o=r);let i=l;i||(l=i=(0,a.createRoot)(r)),i.render((0,n.jsx)(u,{opts:e,onClose:d}))})}function u({opts:e,onClose:t}){let[r]=(0,i.useState)(!1);return(0,n.jsx)("div",{role:"alertdialog","aria-modal":"true",onPointerDown:()=>t(!1),style:{position:"fixed",inset:0,zIndex:2e3,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.35)"},children:(0,n.jsxs)("div",{onPointerDown:e=>e.stopPropagation(),style:{width:360,maxWidth:"calc(100vw - 48px)",borderRadius:"var(--bubble-radius, 14px)",background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 10px 40px -12px rgba(0,0,0,0.4)",color:"var(--text)",padding:"16px 18px",display:"flex",flexDirection:"column",gap:10},children:[e.title&&(0,n.jsx)("div",{style:{fontSize:14,fontWeight:600},children:e.title}),(0,n.jsx)("div",{style:{fontSize:12.5,lineHeight:1.6,color:"var(--text-muted)",whiteSpace:"pre-wrap"},children:e.message}),(0,n.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:8,marginTop:6},children:[(0,n.jsx)("button",{type:"button",onClick:()=>t(!1),style:{border:"none",background:"color-mix(in srgb, var(--border) 30%, transparent)",color:"var(--text-muted)",borderRadius:6,padding:"5px 14px",fontSize:12,cursor:"pointer"},children:e.cancelText??"取消"}),(0,n.jsx)("button",{type:"button",disabled:r,onClick:()=>t(!0),style:{border:"none",background:!1===e.danger?"var(--accent)":"color-mix(in srgb, #ef4444 85%, transparent)",color:"#fff",borderRadius:6,padding:"5px 14px",fontSize:12,fontWeight:600,cursor:"pointer"},children:e.confirmText??"删除"})]})]})})}},56314:(e,t,r)=>{r.d(t,{Lv:()=>a,Nc:()=>i,ZY:()=>s});var n=r(12115);let i=(0,n.createContext)(null);function a(){return(0,n.useContext)(i)?.boardId??null}function s(){return(0,n.useContext)(i)?.defaultCwd??null}},60752:(e,t,r)=>{r.r(t),r.d(t,{SessionCanvas:()=>I});var n=r(95155),i=r(12115),a=r(37206),s=r(81750),o=r(96793),l=r(39247),d=r(64536),c=r(71309),u=r(34229),p=r(84876),h=r(56314),x=r(24456);function f({editor:e,inputRef:t,nodes:r}){let{t:a}=(0,l.s)(),{setHighlight:o}=(0,c.kz)(),{setViewport:d,getViewport:u,getNodes:p}=(0,s.VH)(),[h,x]=(0,i.useState)(""),[g,b]=(0,i.useState)(!1),[v,y]=(0,i.useState)(-1),m=(0,i.useRef)(null),k=t??m,w=(0,i.useMemo)(()=>{let e=r??p(),t=[];for(let r of e)if("session-card"===r.type){let e=String(r.data.title??"").trim();e&&t.push({nodeId:r.id,kind:"session-card",text:e})}else if("sticky-note"===r.type||"text"===r.type){let e=String(r.data.text??"").trim();e&&t.push({nodeId:r.id,kind:"sticky-note",text:e})}return t},[r,p]),j=(0,i.useMemo)(()=>{let e=h.trim().toLowerCase().split(/\s+/).filter(Boolean);return 0===e.length?[]:w.filter(t=>{let r=t.text.toLowerCase();return e.every(e=>r.includes(e))}).map(t=>({item:t,snippet:function(e,t,r=44){let n=t.trim().toLowerCase(),i=e.toLowerCase().indexOf(n);if(i<0)return e.length>r?`${e.slice(0,r)}…`:e;let a=Math.max(0,i-Math.floor((r-n.length)/2)),s=Math.min(e.length,a+r),o=a>0?"…":"",l=s<e.length?"…":"";return`${o}${e.slice(a,s)}${l}`}(t.text,e[0])}))},[w,h]),S=(0,i.useCallback)(e=>{let t=j[e];if(!t)return;let r=p().find(e=>e.id===t.item.nodeId);if(!r)return;let n=r.measured?.width??340,i=r.measured?.height??160,a=r.position.x+n/2,s=r.position.y+i/2,l=u();d({x:-a*l.zoom+window.innerWidth/2,y:-s*l.zoom+window.innerHeight/2,zoom:l.zoom},{duration:300}),o(t.item.nodeId),y(e)},[j,p,u,d,o]),C=(0,i.useCallback)(()=>{0!==j.length&&S((v+1)%j.length)},[j,v,S]),I=(0,i.useCallback)(()=>{0!==j.length&&S((v-1+j.length)%j.length)},[j,v,S]),z=(0,i.useCallback)(e=>{"Enter"===e.key||"ArrowDown"===e.key?(e.preventDefault(),C()):"ArrowUp"===e.key?(e.preventDefault(),I()):"Escape"===e.key&&(e.preventDefault(),g?b(!1):(x(""),y(-1),k.current?.blur()))},[g,C,I,k]),R=g&&h.trim().length>0;return(0,n.jsxs)("div",{style:{position:"relative",width:280},"data-testid":"board-search",children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,height:34,padding:"0 8px 0 10px",borderRadius:999,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 2px 12px -6px rgba(0,0,0,0.18)"},children:[(0,n.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{color:"var(--text-dim)",flexShrink:0},children:[(0,n.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,n.jsx)("path",{d:"m21 21-4.35-4.35"})]}),(0,n.jsx)("input",{ref:k,value:h,onChange:e=>{x(e.target.value),y(-1),b(!0)},onKeyDown:z,onFocus:()=>{h.trim()&&b(!0)},onBlur:()=>b(!1),onPointerDown:e=>e.stopPropagation(),placeholder:a("boards.searchPlaceholder"),spellCheck:!1,"aria-label":a("boards.searchPlaceholder"),style:{flex:1,minWidth:0,border:"none",outline:"none",background:"transparent",color:"var(--text)",fontSize:12.5,fontFamily:"inherit"}}),h&&(0,n.jsx)("button",{type:"button",title:a("common.close"),onPointerDown:e=>e.stopPropagation(),onClick:()=>{x(""),y(-1),k.current?.focus()},style:{flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center",width:18,height:18,padding:0,border:"none",borderRadius:"50%",background:"color-mix(in srgb, var(--border) 35%, transparent)",color:"var(--text-muted)",cursor:"pointer",fontSize:11,lineHeight:1},children:"\xd7"})]}),R&&(0,n.jsx)("div",{"data-testid":"board-search-dropdown",onPointerDown:e=>e.stopPropagation(),style:{position:"absolute",top:40,left:0,right:0,zIndex:60,maxHeight:320,overflowY:"auto",borderRadius:12,padding:4,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 4px 18px -6px rgba(0,0,0,0.28)"},children:0===j.length?(0,n.jsx)("div",{style:{padding:"8px 12px",fontSize:12,color:"var(--text-muted)"},children:a("boards.searchNoResults")}):j.map((e,t)=>{let r=t===v;return(0,n.jsxs)("button",{type:"button",onMouseDown:e=>e.preventDefault(),onClick:()=>S(t),style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:"6px 10px",border:"none",borderRadius:8,background:r?"color-mix(in srgb, var(--accent) 14%, transparent)":"transparent",color:"var(--text)",fontSize:12.5,textAlign:"left",cursor:"pointer"},children:[(0,n.jsx)("span",{"aria-hidden":!0,style:{flexShrink:0,display:"inline-flex",color:r?"var(--accent)":"var(--text-dim)"},children:"session-card"===e.item.kind?(0,n.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}):(0,n.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("path",{d:"M15.5 3H5a2 2 0 0 0-2 2v14c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2V8.5L15.5 3z"}),(0,n.jsx)("path",{d:"M15 3v6h6"})]})}),(0,n.jsx)("span",{style:{minWidth:0,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.snippet}),(0,n.jsx)("span",{style:{flexShrink:0,fontSize:10,color:"var(--text-dim)"},children:"session-card"===e.item.kind?a("boards.searchSession"):a("boards.searchNote")})]},e.item.nodeId)})})]})}let g=new Set(["waiting_model","running_tools","running_command"]);function b({boardName:e,isTaskBoard:t,reloading:r,onReload:a,onClear:o,onAddSessionCard:l,wallSettings:d,updateWallSettings:u,nodes:p}){let{setViewport:h,getViewport:x,getNodes:f,screenToFlowPosition:k}=(0,s.VH)(),{setHighlight:w}=(0,c.kz)(),[j,S]=(0,i.useState)(!1),[C,I]=(0,i.useState)(!1),z=(0,i.useMemo)(()=>{let e=[];for(let t of p){let r=t.data;if("session-card"===t.type){if(!(void 0!==r.phase&&g.has(r.phase))||!r.sessionId)continue;let n=(r.title??"").trim();if(!n)continue;e.push({nodeId:t.id,label:n,kind:"session"})}else if("task-card"===t.type){if("running"!==r.execStatus||!r.cardId)continue;let n=(r.name??"").trim();if(!n)continue;let i="number"==typeof r.number&&r.number>0?`#${r.number} `:"";e.push({nodeId:t.id,label:`${i}${n}`,kind:"task"})}}return e},[p]);return(0,n.jsxs)("div",{style:{position:"absolute",top:12,left:12,zIndex:40,display:"flex",flexDirection:"column",alignItems:"flex-start",gap:6,maxWidth:"min(420px, calc(100% - 320px))"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:4,height:36,padding:"0 6px 0 12px",borderRadius:999,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 2px 12px -6px rgba(0,0,0,0.18)",color:"var(--text)"},children:[(0,n.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{flexShrink:0,opacity:.7},children:[(0,n.jsx)("rect",{x:"3",y:"3",width:"7",height:"7",rx:"1.5"}),(0,n.jsx)("rect",{x:"14",y:"3",width:"7",height:"7",rx:"1.5"}),(0,n.jsx)("rect",{x:"3",y:"14",width:"7",height:"7",rx:"1.5"}),(0,n.jsx)("rect",{x:"14",y:"14",width:"7",height:"7",rx:"1.5"})]}),(0,n.jsx)("span",{title:e,style:{fontSize:12.5,fontWeight:600,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",maxWidth:150},children:e||"看板"}),(0,n.jsx)("button",{type:"button",onClick:a,title:"刷新画布","aria-label":"刷新画布",style:{...v,cursor:r?"default":"pointer"},...r?{}:y(),children:(0,n.jsxs)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{animation:r?"spin 0.8s linear infinite":void 0},children:[(0,n.jsx)("path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"}),(0,n.jsx)("path",{d:"M21 3v5h-5"})]})}),(0,n.jsx)("span",{style:{flexShrink:0,width:1,height:18,background:"color-mix(in srgb, var(--border) 70%, transparent)",margin:"0 2px"}}),(0,n.jsx)("button",{type:"button",onClick:()=>{let e=document.querySelector(".react-flow__pane"),t=e?.getBoundingClientRect();t&&l(k({x:t.left+t.width/2,y:t.top+t.height/2}))},title:"新建会话","aria-label":"新建会话",style:v,...y(),children:(0,n.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:(0,n.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}),(0,n.jsx)("button",{type:"button",onClick:()=>S(e=>!e),title:"磨砂调节","aria-label":"磨砂调节","aria-expanded":j,style:{...v,color:j?"var(--accent)":"var(--text-muted)",background:j?"color-mix(in srgb, var(--accent) 12%, transparent)":void 0},...j?{}:y(),children:(0,n.jsxs)("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,n.jsx)("path",{d:"M12 3v2"}),(0,n.jsx)("path",{d:"M12 19v2"}),(0,n.jsx)("path",{d:"M5 7l1.5 1.5"}),(0,n.jsx)("path",{d:"M17.5 15.5L19 17"}),(0,n.jsx)("path",{d:"M3 12h2"}),(0,n.jsx)("path",{d:"M19 12h2"}),(0,n.jsx)("path",{d:"M5 17l1.5-1.5"}),(0,n.jsx)("path",{d:"M17.5 8.5L19 7"}),(0,n.jsx)("circle",{cx:"12",cy:"12",r:"3"})]})}),(0,n.jsx)("button",{type:"button",onClick:o,title:t?"清空画布(任务卡片保留)":"清空画布","aria-label":"清空画布",style:v,...y(),children:(0,n.jsxs)("svg",{width:"15",height:"15",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,n.jsx)("path",{d:"M18 6 6 18"}),(0,n.jsx)("path",{d:"m6 6 12 12"})]})}),(0,n.jsxs)("button",{type:"button",onClick:()=>I(e=>!e),title:C?"收起执行队列":"展开执行队列","aria-label":C?"收起执行队列":"展开执行队列","aria-expanded":C,style:{...v,color:C?"var(--accent)":"var(--text-muted)",background:C?"color-mix(in srgb, var(--accent) 12%, transparent)":void 0},...C?{}:y(),children:[(0,n.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{transform:C?"rotate(180deg)":"none",transition:"transform 0.15s"},children:(0,n.jsx)("polyline",{points:"6 9 12 15 18 9"})}),z.length>0&&(0,n.jsx)("span",{style:{minWidth:14,height:14,padding:"0 4px",boxSizing:"border-box",display:"inline-flex",alignItems:"center",justifyContent:"center",borderRadius:999,fontSize:9.5,fontWeight:700,lineHeight:1,background:"color-mix(in srgb, var(--accent) 18%, transparent)",color:"var(--accent)"},children:z.length})]})]}),j&&(0,n.jsx)("div",{style:m,children:(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:8},children:[(0,n.jsx)("span",{style:{width:14,flexShrink:0,textAlign:"center",fontSize:12},children:"❄"}),(0,n.jsx)("span",{style:{flexShrink:0,fontSize:12.5},children:"磨砂"}),(0,n.jsx)("input",{type:"range",min:0,max:30,value:d.scrimBlur,onChange:e=>u({scrimBlur:Number(e.target.value)}),style:{flex:1,minWidth:120,accentColor:"var(--accent)",cursor:"pointer"},"aria-label":"磨砂强度"}),(0,n.jsxs)("span",{style:{width:30,flexShrink:0,textAlign:"right",fontSize:11,color:"var(--text)"},children:[d.scrimBlur,"px"]})]})}),C&&(0,n.jsxs)("div",{style:{...m,maxHeight:320,overflowY:"auto",padding:6,width:300},children:[(0,n.jsxs)("div",{style:{padding:"6px 10px 4px",fontSize:11,fontWeight:700,color:"var(--text)",letterSpacing:.2},children:["执行队列",(0,n.jsxs)("span",{style:{marginLeft:8,fontSize:10,fontWeight:500,color:"var(--text-meta)"},children:[z.length," 个运行中"]})]}),0===z.length?(0,n.jsx)("div",{style:{padding:"10px 12px",fontSize:12,color:"var(--text-muted)"},children:"画面中没有运行中的卡片"}):z.map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>(e=>{let t=f().find(t=>t.id===e);if(!t)return;let r=t.measured?.width??t.style?.width??340,n=t.measured?.height??t.style?.height??160,i=t.position.x+r/2,a=t.position.y+n/2,s=x();h({x:-i*s.zoom+window.innerWidth/2,y:-a*s.zoom+window.innerHeight/2,zoom:s.zoom},{duration:300}),w(e)})(e.nodeId),title:"点击定位到卡片",style:{display:"flex",alignItems:"center",gap:8,width:"100%",padding:"6px 10px",border:"none",borderRadius:8,background:"transparent",color:"var(--text)",fontSize:12.5,textAlign:"left",cursor:"pointer"},onMouseEnter:e=>{e.currentTarget.style.background="color-mix(in srgb, var(--accent) 10%, transparent)"},onMouseLeave:e=>{e.currentTarget.style.background="transparent"},children:[(0,n.jsx)("span",{"aria-hidden":!0,style:{flexShrink:0,color:"var(--accent)",display:"inline-flex"},children:"session"===e.kind?(0,n.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}):(0,n.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("path",{d:"M9 11l3 3L22 4"}),(0,n.jsx)("path",{d:"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"})]})}),(0,n.jsx)("span",{style:{flexShrink:0,width:6,height:6,borderRadius:"50%",background:"#10b981",boxShadow:"0 0 6px 1px rgba(16,185,129,0.6)",animation:"pulse 1.6s ease-in-out infinite"}}),(0,n.jsx)("span",{style:{minWidth:0,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.label}),(0,n.jsx)("span",{style:{flexShrink:0,fontSize:10,color:"var(--text-dim)"},children:"session"===e.kind?"会话":"任务"})]},e.nodeId))]})]})}let v={display:"flex",alignItems:"center",justifyContent:"center",gap:2,width:30,height:30,padding:0,flexShrink:0,border:"none",background:"transparent",color:"var(--text-muted)",cursor:"pointer",borderRadius:999,transition:"background 0.12s, color 0.12s"};function y(){return{onMouseEnter:e=>{e.currentTarget.style.background="color-mix(in srgb, var(--text) 8%, transparent)"},onMouseLeave:e=>{e.currentTarget.style.background="transparent"}}}let m={display:"flex",flexDirection:"column",gap:6,padding:"8px 10px",borderRadius:12,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 2px 12px -6px rgba(0,0,0,0.18)",color:"var(--text)",whiteSpace:"nowrap"},k={dispatch:"正在派发",resume:"续会话",review:"AI 审核中",blockcheck:"阻塞巡检"};function w({nodes:e}){let{setViewport:t,getViewport:r,getNodes:a}=(0,s.VH)(),{setHighlight:o}=(0,c.kz)(),[l,d]=(0,i.useState)(null),[u,p]=(0,i.useState)(!1),h=(0,i.useRef)(null);(0,i.useEffect)(()=>{let e=!1,t=async()=>{try{let t=await fetch("/api/task-scheduler/status",{cache:"no-store"});if(!t.ok)return;let r=await t.json();e||d(r.status)}catch{}};t();let r=setInterval(t,2500);return()=>{e=!0,clearInterval(r)}},[]),(0,i.useEffect)(()=>{if(!u)return;let e=e=>{h.current&&!h.current.contains(e.target)&&p(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u]);let x=(0,i.useMemo)(()=>{let t=new Map;for(let r of e){let e=r.data;e.cardId&&t.set(e.cardId,r.id)}return t},[e]),f=!!l?.activity,g=l?l.activity?k[l.activity.kind]??"工作中":l.running.length>0?`运行中 ${l.running.length}`:l.queue.review.length>0?`待审核 ${l.queue.review.length}`:null:null;return(0,n.jsxs)("div",{ref:h,style:{position:"absolute",top:12,right:12,zIndex:40,display:"flex",flexDirection:"column",alignItems:"flex-end"},children:[(0,n.jsxs)("button",{type:"button",onClick:()=>p(e=>!e),"aria-expanded":u,"aria-label":"调度器状态",title:"调度器状态",style:{display:"flex",alignItems:"center",gap:7,height:36,padding:"0 6px 0 14px",borderRadius:999,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 2px 12px -6px rgba(0,0,0,0.18)",color:"var(--text)",cursor:"pointer",whiteSpace:"nowrap"},children:[(0,n.jsx)("span",{"aria-hidden":!0,style:{width:8,height:8,borderRadius:"50%",flexShrink:0,background:f?"#f59e0b":(l?.running.length??0)>0?"#10b981":"var(--text-dim)",boxShadow:f?"0 0 6px 1px rgba(245,158,11,0.6)":(l?.running.length??0)>0?"0 0 6px 1px rgba(16,185,129,0.5)":"none",animation:f?"pulse 1.6s ease-in-out infinite":void 0}}),(0,n.jsx)("span",{style:{fontSize:12.5,fontWeight:700,color:"var(--text)"},children:"调度器"}),l?.started===!1&&(0,n.jsx)("span",{style:{fontSize:10.5,color:"var(--text-muted)"},children:"未启动"}),g&&(0,n.jsx)("span",{style:{fontSize:11,fontWeight:600,color:"var(--text-muted)"},children:g}),(0,n.jsx)("svg",{width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",style:{color:"var(--text-muted)",transform:u?"rotate(180deg)":"none",transition:"transform 0.15s",flexShrink:0},children:(0,n.jsx)("polyline",{points:"6 9 12 15 18 9"})})]}),u&&(0,n.jsxs)("div",{style:{display:"flex",flexDirection:"column",marginTop:6,padding:"8px 0",width:340,borderRadius:14,background:"var(--board-card-glass)",backdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",WebkitBackdropFilter:"blur(var(--board-blur)) saturate(var(--glass-saturate))",border:"1px solid color-mix(in srgb, var(--border) 60%, transparent)",boxShadow:"0 8px 30px -8px rgba(0,0,0,0.3)",color:"var(--text)"},children:[(0,n.jsxs)("div",{style:{padding:"2px 14px 8px",borderBottom:"1px solid color-mix(in srgb, var(--border) 50%, transparent)",display:"flex",alignItems:"center",justifyContent:"space-between"},children:[(0,n.jsx)("span",{style:{fontSize:13,fontWeight:700,color:"var(--text)"},children:"调度器"}),(0,n.jsx)("span",{style:{fontSize:10.5,color:"var(--text-muted)"},children:l?.started===!1?"未启动":f?"工作中":"休眠"})]}),(0,n.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:6,padding:"10px 12px 8px"},children:[(0,n.jsx)(j,{label:"派发",active:l?.activity?.kind==="dispatch"||l?.activity?.kind==="resume",activityLabel:l?.activity&&("dispatch"===l.activity.kind||"resume"===l.activity.kind)?k[l.activity.kind]:void 0}),(0,n.jsx)(j,{label:"审查",active:l?.activity?.kind==="review"||l?.activity?.kind==="blockcheck",activityLabel:l?.activity&&("review"===l.activity.kind||"blockcheck"===l.activity.kind)?k[l.activity.kind]:void 0})]}),l&&(0,n.jsx)(S,{title:"任务队列",groups:[{label:"运行中",color:"#10b981",cards:l.running},{label:"待审核",color:"#f59e0b",cards:l.queue.review},{label:"待派发",color:"var(--accent)",cards:l.queue.dispatchable},{label:"等回复",color:"var(--text-muted)",cards:l.queue.waitingReply},{label:"失败",color:"#ef4444",cards:l.queue.failed}],nodeIdByCardId:x,onLocate:e=>{let n=a().find(t=>t.id===e);if(!n)return;let i=n.measured?.width??n.style?.width??380,s=n.measured?.height??n.style?.height??270,l=n.position.x+i/2,d=n.position.y+s/2,c=r();t({x:-l*c.zoom+window.innerWidth/2,y:-d*c.zoom+window.innerHeight/2,zoom:c.zoom},{duration:300}),o(e)}}),!l&&(0,n.jsx)("div",{style:{padding:"10px 14px",fontSize:12,color:"var(--text-muted)"},children:"加载中…"})]})]})}function j({label:e,active:t,activityLabel:r}){return(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:6,padding:"7px 8px",borderRadius:8,border:"1px solid color-mix(in srgb, var(--border) 55%, transparent)",background:t?"color-mix(in srgb, var(--accent) 8%, transparent)":"transparent"},children:[(0,n.jsx)("span",{"aria-hidden":!0,style:{width:7,height:7,borderRadius:"50%",flexShrink:0,background:t?"#f59e0b":"var(--text-dim)",boxShadow:t?"0 0 6px 1px rgba(245,158,11,0.6)":"none",animation:t?"pulse 1.6s ease-in-out infinite":void 0}}),(0,n.jsxs)("div",{style:{display:"flex",flexDirection:"column",minWidth:0},children:[(0,n.jsx)("span",{style:{fontSize:12,fontWeight:700,color:"var(--text)",lineHeight:1.2},children:e}),(0,n.jsx)("span",{style:{fontSize:10,fontWeight:600,color:"var(--text-muted)",whiteSpace:"nowrap"},children:r??"休眠"})]})]})}function S({title:e,groups:t,nodeIdByCardId:r,onLocate:i}){let a=t.filter(e=>e.cards.length>0),s=t.reduce((e,t)=>e+t.cards.length,0);return(0,n.jsxs)("div",{style:{padding:"8px 12px 4px"},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0 2px 4px"},children:[(0,n.jsx)("span",{style:{fontSize:10.5,fontWeight:700,color:"var(--text-muted)",letterSpacing:.3},children:e}),(0,n.jsxs)("span",{style:{fontSize:10.5,fontWeight:600,color:"var(--text-dim)"},children:["共 ",s]})]}),0===a.length?(0,n.jsx)("div",{style:{fontSize:12,color:"var(--text-dim)",padding:"2px 2px 6px"},children:"队列空闲"}):a.map(e=>(0,n.jsxs)("div",{style:{marginBottom:6},children:[(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:5,padding:"0 2px 3px"},children:[(0,n.jsx)("span",{style:{width:6,height:6,borderRadius:"50%",background:e.color,flexShrink:0}}),(0,n.jsx)("span",{style:{fontSize:10.5,fontWeight:700,color:"var(--text-muted)"},children:e.label}),(0,n.jsx)("span",{style:{fontSize:10,color:"var(--text-dim)"},children:e.cards.length})]}),(0,n.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:1},children:[e.cards.slice(0,4).map(e=>{let t=r.get(e.id);return(0,n.jsxs)("button",{type:"button",onClick:()=>{t&&i(t)},disabled:!t,title:t?"点击定位到本看板任务卡":"该任务不在当前看板",style:{display:"flex",alignItems:"center",gap:6,width:"100%",padding:"4px 6px",border:"none",borderRadius:6,background:"transparent",color:"var(--text)",fontSize:12,textAlign:"left",cursor:t?"pointer":"default",opacity:t?1:.55},children:[(0,n.jsxs)("span",{style:{minWidth:0,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[(0,n.jsxs)("span",{style:{color:"var(--text-muted)",fontWeight:600},children:["#",e.number]})," ",e.name]}),!t&&(0,n.jsx)("span",{style:{flexShrink:0,fontSize:9.5,color:"var(--text-dim)"},children:"其它看板"})]},e.id)}),e.cards.length>4&&(0,n.jsxs)("div",{style:{padding:"2px 6px",fontSize:10,color:"var(--text-dim)"},children:["…共 ",e.cards.length," 个"]})]})]},e.label))]})}let C=(0,a.default)(()=>Promise.all([r.e(6126),r.e(5004),r.e(277),r.e(6380),r.e(6582)]).then(r.bind(r,86582)).then(e=>e.CanvasStage),{loadableGenerated:{webpack:()=>[86582]},ssr:!1,loading:()=>(0,n.jsx)(p.N,{label:"正在加载画布…"})});function I({boardId:e,taskId:t,newSessionCwd:r,onRunningSessionIdsChange:a,wallSettings:p,updateWallSettings:g}){let{t:v}=(0,l.s)(),{isDark:y}=(0,o.D)(),m=(0,d.C6)({boardId:e,taskId:t,newSessionCwd:r}),k=!!(m.board?.taskId??t),j=(0,i.useRef)(null);(0,i.useEffect)(()=>{let e=e=>{if(!(e.ctrlKey||e.metaKey)||"f"!==e.key.toLowerCase())return;let t=document.activeElement;if(t&&t!==j.current){let e=t.tagName;if("INPUT"===e||"TEXTAREA"===e||t.isContentEditable)return}e.preventDefault(),j.current?.focus(),j.current?.select()};return window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)},[]);let[S,z]=(0,i.useState)(!1),R=(0,i.useCallback)(async()=>{if(!S){z(!0);try{m.loadSessionSummaries(),await m.reloadCanvas()}finally{setTimeout(()=>z(!1),800)}}},[m,S]);return(0,i.useEffect)(()=>{a?.(new Set(m.running?.runningSessionIds??[]))},[m.running,a]),(0,n.jsx)("div",{"data-glass-scope":"board",style:{height:"100%",display:"flex",flexDirection:"column",overflow:"hidden",position:"relative"},children:(0,n.jsx)(u.I,{value:"board",children:(0,n.jsx)(h.Nc.Provider,{value:{boardId:m.board?.id??null,defaultCwd:r??null},children:(0,n.jsx)(c.eR,{children:(0,n.jsxs)(s.Ln,{children:[!m.loading&&(0,n.jsx)(b,{boardName:m.board?.name??"",isTaskBoard:k,reloading:S,onReload:()=>void R(),onClear:()=>{(0,x.l)({message:k?v("boards.clearTaskConfirm"):v("boards.clearConfirm"),confirmText:v("boards.clear")}).then(e=>{e&&m.clearBoard()})},onAddSessionCard:e=>m.addNewSessionCard(e),wallSettings:p,updateWallSettings:g,nodes:m.nodes}),(0,n.jsx)(w,{nodes:m.nodes}),!m.loading&&(0,n.jsx)("div",{style:{position:"absolute",top:12,left:"50%",transform:"translateX(-50%)",zIndex:40},children:(0,n.jsx)(f,{inputRef:j,nodes:m.nodes})}),(0,n.jsx)(C,{board:m,isDark:y})]})})})})})}},64536:(e,t,r)=>{r.d(t,{C6:()=>p,ZI:()=>d,eo:()=>c});var n=r(12115),i=r(67816),a=r(81750),s=r(15934),o=r(24456),l=r(41463);let d=340,c=160,u=l.env.NEXT_PUBLIC_SYNC_WS??`${"https:"===window.location.protocol?"wss":"ws"}://${window.location.host}`;function p({boardId:e,taskId:t,newSessionCwd:r}){let[l,h]=(0,n.useState)(null),[x,f]=(0,n.useState)(null),[g,b]=(0,n.useState)(!1),[v,y]=(0,n.useState)([]),[m,k]=(0,n.useState)([]),[w,j]=(0,n.useState)(null),S=(0,n.useRef)(null),C=(0,n.useRef)(null),I=(0,n.useRef)(null),z=(0,n.useRef)(!1);z.current=g;let R=(0,n.useRef)(e);R.current=e;let L=(0,n.useRef)(null);L.current=l;let W=(0,n.useRef)(t??null);W.current=t??null;let A=(0,n.useRef)(r);A.current=r;let M=(0,n.useMemo)(()=>`${u}/connect`,[]);(0,n.useEffect)(()=>{let t=new i.m({url:M,name:e,forceSyncInterval:!1});S.current=t,j(t);let r=t.document.getMap("nodes"),n=t.document.getMap("edges");C.current=r,I.current=n;let a=e=>{let t=e?new Set(Array.from(e.keys.keys())):null;y(e=>{let n=new Set(e.filter(e=>e.selected).map(e=>e.id)),i=new Set(e.filter(e=>e.dragging).map(e=>e.id)),a=new Map(e.map(e=>[e.id,e]));return Array.from(r.values()).map(e=>{if(t&&!t.has(e.id)){let t=a.get(e.id);if(t)return t}let r={...e};return delete r.selected,delete r.dragging,n.has(e.id)&&(r.selected=!0),i.has(e.id)&&(r.dragging=!0),r})})},s=()=>k(Array.from(n.values())),o=()=>b(!0);return r.observe(a),n.observe(s),t.on("synced",o),a(),s(),()=>{r.unobserve(a),n.unobserve(s),t.off("synced",o),t.destroy(),S.current=null,C.current=null,I.current=null,b(!1)}},[M,e]);let E=(0,n.useCallback)(async()=>{try{let t=await fetch(`/api/boards/${encodeURIComponent(e)}`,{cache:"no-store"});if(!t.ok)return void f(`HTTP ${t.status}`);let r=await t.json();h(r.board)}catch(e){f(e instanceof Error?e.message:String(e))}},[e]);(0,n.useEffect)(()=>{E()},[E]);let T=(0,n.useCallback)(async()=>{try{await fetch(`/api/boards/${encodeURIComponent(e)}/reconcile`,{method:"POST"})}catch{}await E()},[e,E]),[B,D]=(0,n.useState)(()=>globalThis.__piRunningSnapshot??null),$=(0,n.useCallback)(e=>{globalThis.__piRunningSnapshot=e,D(e)},[]),H=(0,n.useRef)(!1);(0,n.useEffect)(()=>{let e=!1,t=null,r=async()=>{if(!e&&!H.current&&"visible"===document.visibilityState){H.current=!0;try{let t=await fetch("/api/agent/running",{cache:"no-store"});if(!t.ok)return;let r=await t.json();if(e)return;$(r);let n=C.current;if(!n)return;for(let e of Array.from(n.values()))if("session-card"===e.type){let t=e.data;if(!t.sessionId)continue;let i=r.states[t.sessionId],a=r.runningSessionIds.includes(t.sessionId);if(a&&i){let r=i.phase??"waiting_model",a=i.startedAt?Date.now()-i.startedAt:0;(t.phase!==r||t.runningMs!==a||0!==t.endedAt)&&n.set(e.id,{...e,data:{...t,phase:r,runningMs:a,endedAt:0}})}else a||"idle"===t.phase||n.set(e.id,{...e,data:{...t,phase:"idle",runningMs:0,endedAt:0}})}else if("task-card"===e.type){let t=e.data;if(!t.cardId)continue;let i=r.taskCards?.find(e=>e.cardId===t.cardId&&e.boardId===R.current);i&&i.execStatus!==t.execStatus&&n.set(e.id,{...e,data:{...t,execStatus:i.execStatus}})}}catch{}finally{H.current=!1}}},n=()=>{e||(t=setTimeout(async()=>{await r(),n()},2500))};r(),n();let i=()=>{"visible"===document.visibilityState&&r()};return document.addEventListener("visibilitychange",i),()=>{e=!0,t&&clearTimeout(t),document.removeEventListener("visibilitychange",i)}},[$]);let[P,N]=(0,n.useState)({}),_=(0,n.useRef)({});_.current=P;let F=(0,n.useRef)(!1),U=(0,n.useCallback)(async()=>{if(!F.current){F.current=!0;try{let e=await fetch("/api/sessions",{cache:"no-store"});if(!e.ok)return;let t=await e.json(),r={};for(let e of t.sessions)r[e.id]={title:e.name??e.firstMessage??"Untitled",messageCount:e.messageCount??0,projectName:e.projectKey??e.projectRoot??"",lastReply:e.lastReply??"",lastActivityAt:e.modified?Date.parse(e.modified):0};N(r)}catch{}finally{F.current=!1}}},[]);(0,n.useEffect)(()=>{let e,t=!1,r=async()=>{await U(),t||(e=setTimeout(r,1e4))};r();let n=()=>{"visible"===document.visibilityState&&(e&&clearTimeout(e),r())};return document.addEventListener("visibilitychange",n),()=>{t=!0,e&&clearTimeout(e),document.removeEventListener("visibilitychange",n)}},[U]),(0,n.useEffect)(()=>{let e=C.current;if(e&&z.current&&0!==Object.keys(P).length)for(let t of Array.from(e.values())){if("session-card"!==t.type)continue;let r=t.data,n=P[r.sessionId];n&&(r.title!==n.title||r.lastReply!==n.lastReply||r.messageCount!==n.messageCount||r.lastActivityAt!==n.lastActivityAt)&&e.set(t.id,{...t,data:{...r,title:n.title,lastReply:n.lastReply,messageCount:n.messageCount,lastActivityAt:n.lastActivityAt}})}},[P,g]);let O=(0,n.useCallback)(e=>{let t=C.current;if(!t)return;let r=e.filter(e=>"select"===e.type);r.length&&y(e=>(0,a._0)(r,e));let n=e.filter(e=>"select"!==e.type);if(0===n.length)return;let i=Array.from(t.values()),s=(0,a._0)(n,i);for(let e of n)if("add"===e.type||"replace"===e.type)t.set(e.item.id,e.item);else if("remove"===e.type&&t.has(e.id)){t.delete(e.id);let r=I.current;if(r)for(let t of Array.from(r.values()))(t.source===e.id||t.target===e.id)&&r.delete(t.id)}else if("position"===e.type||"dimensions"===e.type){let r=s.find(t=>t.id===e.id);if(r){let{dragging:n,...i}=r;t.set(e.id,i)}}},[]),V=(0,n.useCallback)(e=>{let t=I.current;if(!t)return;let r=Array.from(t.values()),n=(0,a.zW)(e,r);for(let r of e)if("add"===r.type||"replace"===r.type)t.set(r.item.id,r.item);else if("remove"===r.type&&t.has(r.id)){let e=t.get(r.id);if(e&&e.data?.execLink||e&&e.data?.taskLink)continue;t.delete(r.id)}else{let e=n.find(e=>e.id===r.id);e&&t.set(r.id,e)}},[]),q=(0,n.useCallback)(e=>{let t=I.current;if(!t)return;let r=`edge-${e.source}-${e.target}-${Date.now()}`;t.set(r,{id:r,source:e.source,target:e.target,type:"default",markerEnd:{type:"arrowclosed"},style:{strokeWidth:1.5,stroke:"#8b8fa3"}})},[]),K=(0,n.useCallback)(e=>{let t=C.current;if(!t)return;let r=crypto.randomUUID(),n=crypto.randomUUID(),i=e?.x??60,a=e?.y??60,s=i-420+t.size%3*24,o=a-300+t.size%3*24;t.set(n,{id:n,type:"session-card",position:{x:s,y:o},style:{width:840,height:600},data:{sessionId:r,title:"",projectName:"",messageCount:0,lastReply:"",phase:"idle",runningMs:0,endedAt:0,lastActivityAt:0,stale:!1,expanded:!0,cwd:A.current??"",taskId:W.current??"",w:840,h:600,expandedW:0,expandedH:0,collapsedW:0,collapsedH:0}})},[]),Y=(0,n.useCallback)((e,t,r)=>{let n=C.current;if(!n)return;let i=_.current[e],a=`session-${e}`,o=W.current??L.current?.taskId??null;n.set(a,{id:a,type:"session-card",position:{x:t,y:r},style:{width:d,height:c},data:{sessionId:e,title:i?.title??"Untitled",projectName:i?.projectName??"",messageCount:i?.messageCount??0,lastReply:i?.lastReply??"",lastActivityAt:i?.lastActivityAt??0,phase:"idle",runningMs:0,endedAt:0,stale:!1,expanded:!1,taskId:o??"",w:d,h:c,expandedW:0,expandedH:0,collapsedW:0,collapsedH:0}}),o&&(async()=>{try{let t=await fetch(`/api/tasks/${encodeURIComponent(o)}`,{cache:"no-store"}),r=await t.json(),n=r.task?.sessionIds??[];n.includes(e)||(await fetch(`/api/tasks/${encodeURIComponent(o)}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionIds:[...n,e]})}),(0,s.PH)(e))}catch(t){console.warn(`[board] 拖入会话归属任务失败 ${e}:`,t instanceof Error?t.message:t)}finally{let e=C.current;if(e?.has(a)){let t=e.get(a);t&&t.data?.taskId&&e.set(a,{...t,data:{...t.data,taskId:""}})}}})()},[]),X=(0,n.useCallback)(async e=>{let t=C.current,r=I.current;if(t&&r)if("session-card"===e.type){let n=e.data;if(!n.sessionId||n.cwd){for(let n of(t.delete(e.id),Array.from(r.values())))(n.source===e.id||n.target===e.id)&&r.delete(n.id);return}if(!await (0,o.l)({message:"删除该会话?\n将同时删除画布卡片并断开任务卡关联。此操作不可撤销。"}))return;for(let n of(t.delete(e.id),Array.from(r.values())))(n.source===e.id||n.target===e.id)&&r.delete(n.id);fetch(`/api/sessions/${encodeURIComponent(n.sessionId)}`,{method:"DELETE"}).then(()=>(0,s.Qp)(n.sessionId)).catch(e=>console.warn(`[board] 删除会话 ${n.sessionId} 异常`,e))}else if("task-card"===e.type){let n=e.data;if(!n.cardId)return void t.delete(e.id);if(!await (0,o.l)({message:"删除该任务卡?\n将删除任务卡、依赖线与执行会话连线;关联的执行会话保留。此操作不可撤销。"}))return;for(let n of(t.delete(e.id),Array.from(r.values())))(n.source===e.id||n.target===e.id)&&r.delete(n.id);fetch(`/api/task-cards/${encodeURIComponent(n.cardId)}`,{method:"DELETE"}).catch(e=>console.warn(`[board] 删除任务卡 ${n.cardId} 异常`,e))}else t.delete(e.id)},[]),Z=(0,n.useCallback)((e,t)=>{let r=C.current;if(!r)return;let n=r.get(e);n&&r.set(e,{...n,...t})},[]),G=(0,n.useCallback)((e,t)=>{let r=C.current;if(!r||!e||e===t)return;let n=r.get(e);if(!n)return;r.delete(e),r.set(t,{...n,id:t});let i=I.current;if(i)for(let r of Array.from(i.values()))(r.source===e||r.target===e)&&i.set(r.id,{...r,source:r.source===e?t:r.source,target:r.target===e?t:r.target})},[]),J=(0,n.useCallback)(e=>{let t=I.current;t&&t.set(e.id,e)},[]),Q=(0,n.useCallback)(e=>{let t=C.current;t&&t.set(e.id,e)},[]),ee=(0,n.useCallback)(async()=>{let e=C.current,t=I.current;if(!e||!t)return;let r=!!(W.current??L.current?.taskId);for(let n of Array.from(e.values()).filter(e=>!r||"session-card"!==e.type))for(let r of(e.delete(n.id),Array.from(t.values())))(r.source===n.id||r.target===n.id)&&t.delete(r.id)},[]),et=!g;return(0,n.useMemo)(()=>({board:l,loading:et,error:x,running:B,runningCount:B?.runningSessionIds.length??0,nodes:v,edges:m,onNodesChange:O,onEdgesChange:V,onConnect:q,provider:w,ready:g,addSessionNode:Y,addNewSessionCard:K,deleteNodeWithConfirm:X,updateNode:Z,normalizeNodeId:G,addEdge:J,addNode:Q,clearBoard:ee,sessionTitles:P,loadSessionSummaries:U,reloadCanvas:T}),[l,et,x,B,v,m,O,V,q,w,g,Y,K,X,Z,G,J,Q,ee,P,U,T,E])}},71309:(e,t,r)=>{r.d(t,{eR:()=>o,kz:()=>l,u:()=>a});var n=r(95155),i=r(12115);let a="0 0 0 3px var(--accent), 0 0 24px color-mix(in srgb, var(--accent) 45%, transparent)",s=(0,i.createContext)(null);function o({children:e}){let[t,r]=(0,i.useState)(null),a=(0,i.useRef)(null),l=(0,i.useCallback)(e=>{a.current&&clearTimeout(a.current),a.current=null,r(e),e&&(a.current=setTimeout(()=>r(null),1800))},[]);return(0,i.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),(0,n.jsx)(s.Provider,{value:{highlightId:t,setHighlight:l},children:e})}function l(){let e=(0,i.useContext)(s);return e||{highlightId:null,setHighlight:()=>{}}}}}]);
|
|
File without changes
|
|
File without changes
|