vibe-coding-master 0.3.7 → 0.3.9

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.
@@ -2,12 +2,16 @@ import { isOpenFileLimitError, VcmError } from "../errors.js";
2
2
  import { getTaskRuntimeRepoRoot } from "../services/task-service.js";
3
3
  export function registerMessageRoutes(app, deps) {
4
4
  app.get("/api/tasks/:taskSlug/messages", async (request) => {
5
- const context = await getRouteContext(deps, request.params.taskSlug);
6
- return deps.messageService.listMessages(context);
5
+ return withOpenFileLimitFallback(async () => {
6
+ const context = await getRouteContext(deps, request.params.taskSlug);
7
+ return deps.messageService.listMessages(context);
8
+ }, () => []);
7
9
  });
8
10
  app.get("/api/tasks/:taskSlug/messages/pending-routes", async (request) => {
9
- const context = await getRouteContext(deps, request.params.taskSlug);
10
- return deps.messageService.listPendingRouteFiles(context);
11
+ return withOpenFileLimitFallback(async () => {
12
+ const context = await getRouteContext(deps, request.params.taskSlug);
13
+ return deps.messageService.listPendingRouteFiles(context);
14
+ }, () => []);
11
15
  });
12
16
  app.post("/api/tasks/:taskSlug/messages/mark-all-done", async (request) => {
13
17
  const context = await getRouteContext(deps, request.params.taskSlug);
@@ -21,21 +25,15 @@ export function registerMessageRoutes(app, deps) {
21
25
  return deps.messageService.deleteMessageHistory(context);
22
26
  });
23
27
  app.get("/api/tasks/:taskSlug/orchestration", async (request) => {
24
- const context = await getRouteContext(deps, request.params.taskSlug);
25
- try {
26
- return await deps.messageService.getOrchestrationState(context);
27
- }
28
- catch (error) {
29
- if (isOpenFileLimitError(error)) {
30
- return {
31
- taskSlug: request.params.taskSlug,
32
- mode: "auto",
33
- updatedAt: new Date().toISOString(),
34
- warning: `Backend open-files limit reached while reading orchestration state: ${errorMessage(error)}`
35
- };
36
- }
37
- throw error;
38
- }
28
+ return withOpenFileLimitFallback(async () => {
29
+ const context = await getRouteContext(deps, request.params.taskSlug);
30
+ return deps.messageService.getOrchestrationState(context);
31
+ }, (error) => ({
32
+ taskSlug: request.params.taskSlug,
33
+ mode: "auto",
34
+ updatedAt: new Date().toISOString(),
35
+ warning: `Backend open-files limit reached while reading orchestration state: ${errorMessage(error)}`
36
+ }));
39
37
  });
40
38
  app.put("/api/tasks/:taskSlug/orchestration", async (request) => {
41
39
  const context = await getRouteContext(deps, request.params.taskSlug);
@@ -55,6 +53,17 @@ export function registerMessageRoutes(app, deps) {
55
53
  function errorMessage(error) {
56
54
  return error instanceof Error ? error.message : String(error);
57
55
  }
56
+ async function withOpenFileLimitFallback(run, fallback) {
57
+ try {
58
+ return await run();
59
+ }
60
+ catch (error) {
61
+ if (isOpenFileLimitError(error)) {
62
+ return fallback(error);
63
+ }
64
+ throw error;
65
+ }
66
+ }
58
67
  async function getRouteContext(deps, taskSlug) {
59
68
  const project = await requireCurrentProject(deps.projectService);
60
69
  const config = await deps.projectService.loadConfig(project.repoRoot);
@@ -1,17 +1,25 @@
1
- import { VcmError } from "../errors.js";
1
+ import { isOpenFileLimitError, VcmError } from "../errors.js";
2
2
  import { getTaskRuntimeRepoRoot } from "../services/task-service.js";
3
3
  export function registerRoundRoutes(app, deps) {
4
4
  app.get("/api/tasks/:taskSlug/round", async (request) => {
5
- const project = await requireCurrentProject(deps.projectService);
6
- const config = await deps.projectService.loadConfig(project.repoRoot);
7
- const task = await deps.taskService.loadTask(project.repoRoot, request.params.taskSlug);
8
- const taskRepoRoot = getTaskRuntimeRepoRoot(task);
9
- return deps.roundService.getSessionRoundState({
10
- repoRoot: project.repoRoot,
11
- stateRepoRoot: taskRepoRoot,
12
- stateRoot: config.stateRoot,
13
- taskSlug: request.params.taskSlug
14
- });
5
+ try {
6
+ const project = await requireCurrentProject(deps.projectService);
7
+ const config = await deps.projectService.loadConfig(project.repoRoot);
8
+ const task = await deps.taskService.loadTask(project.repoRoot, request.params.taskSlug);
9
+ const taskRepoRoot = getTaskRuntimeRepoRoot(task);
10
+ return await deps.roundService.getSessionRoundState({
11
+ repoRoot: project.repoRoot,
12
+ stateRepoRoot: taskRepoRoot,
13
+ stateRoot: config.stateRoot,
14
+ taskSlug: request.params.taskSlug
15
+ });
16
+ }
17
+ catch (error) {
18
+ if (isOpenFileLimitError(error)) {
19
+ return degradedRoundState(request.params.taskSlug);
20
+ }
21
+ throw error;
22
+ }
15
23
  });
16
24
  }
17
25
  async function requireCurrentProject(projectService) {
@@ -25,3 +33,18 @@ async function requireCurrentProject(projectService) {
25
33
  }
26
34
  return project;
27
35
  }
36
+ function degradedRoundState(taskSlug) {
37
+ return {
38
+ taskSlug,
39
+ status: "stopped",
40
+ turnCount: 0,
41
+ completedTurnCount: 0,
42
+ totalRoundCount: 0,
43
+ totalTurnCount: 0,
44
+ totalCompletedTurnCount: 0,
45
+ totalCcActiveMs: 0,
46
+ currentRoundCcActiveMs: 0,
47
+ roles: [],
48
+ updatedAt: new Date().toISOString()
49
+ };
50
+ }
@@ -1,4 +1,5 @@
1
- import { VcmError } from "../errors.js";
1
+ import { DISPATCHABLE_ROLES, ROLE_NAMES } from "../../shared/constants.js";
2
+ import { isOpenFileLimitError, VcmError } from "../errors.js";
2
3
  import { getTaskRuntimeRepoRoot } from "../services/task-service.js";
3
4
  export function registerTaskRoutes(app, deps) {
4
5
  app.get("/api/tasks", async () => {
@@ -14,8 +15,18 @@ export function registerTaskRoutes(app, deps) {
14
15
  return deps.taskService.loadTask(project.repoRoot, request.params.taskSlug);
15
16
  });
16
17
  app.get("/api/tasks/:taskSlug/status", async (request) => {
17
- const project = await requireCurrentProject(deps.projectService);
18
- return deps.statusService.getTaskStatus(project.repoRoot, request.params.taskSlug);
18
+ let repoRoot = "unknown";
19
+ try {
20
+ const project = await requireCurrentProject(deps.projectService);
21
+ repoRoot = project.repoRoot;
22
+ return await deps.statusService.getTaskStatus(project.repoRoot, request.params.taskSlug);
23
+ }
24
+ catch (error) {
25
+ if (isOpenFileLimitError(error)) {
26
+ return degradedTaskStatus(repoRoot, request.params.taskSlug, error);
27
+ }
28
+ throw error;
29
+ }
19
30
  });
20
31
  app.post("/api/tasks/:taskSlug/cleanup", async (request) => {
21
32
  const project = await requireCurrentProject(deps.projectService);
@@ -45,3 +56,49 @@ async function requireCurrentProject(projectService) {
45
56
  }
46
57
  return project;
47
58
  }
59
+ function degradedTaskStatus(repoRoot, taskSlug, error) {
60
+ const timestamp = new Date().toISOString();
61
+ const handoffDir = ".ai/vcm/handoffs";
62
+ return {
63
+ task: {
64
+ version: 1,
65
+ taskSlug,
66
+ createdAt: timestamp,
67
+ updatedAt: timestamp,
68
+ repoRoot,
69
+ branch: "unknown",
70
+ handoffDir,
71
+ status: "stopped"
72
+ },
73
+ sessions: [],
74
+ artifacts: degradedArtifactSummary(handoffDir),
75
+ warnings: [
76
+ `Task status is temporarily unavailable because the backend hit the open-files limit: ${errorMessage(error)}`
77
+ ]
78
+ };
79
+ }
80
+ function degradedArtifactSummary(handoffDir) {
81
+ const roleCommandsDir = `${handoffDir}/role-commands`;
82
+ const logsDir = `${handoffDir}/logs`;
83
+ const messagesDir = `${handoffDir}/messages`;
84
+ return {
85
+ paths: {
86
+ handoffDir,
87
+ roleCommandsDir,
88
+ logsDir,
89
+ messagesDir,
90
+ roleCommandPaths: Object.fromEntries(DISPATCHABLE_ROLES.map((role) => [role, `${roleCommandsDir}/${role}.md`])),
91
+ roleLogPaths: Object.fromEntries(ROLE_NAMES.map((role) => [role, `${logsDir}/${role}.log`])),
92
+ messageRoutePaths: {},
93
+ architecturePlanPath: `${handoffDir}/architecture-plan.md`,
94
+ knownIssuesPath: `${handoffDir}/known-issues.md`,
95
+ reviewReportPath: `${handoffDir}/review-report.md`,
96
+ docsSyncReportPath: `${handoffDir}/docs-sync-report.md`,
97
+ finalAcceptancePath: `${handoffDir}/final-acceptance.md`
98
+ },
99
+ checks: []
100
+ };
101
+ }
102
+ function errorMessage(error) {
103
+ return error instanceof Error ? error.message : String(error);
104
+ }
@@ -58,13 +58,9 @@ export function createNodePtyTerminalRuntime(deps) {
58
58
  });
59
59
  });
60
60
  child.onExit(({ exitCode }) => {
61
- if (entry.disposed) {
61
+ if (!disposeEntry(entries, entry, exitCode === 0 ? "exited" : "crashed", exitCode)) {
62
62
  return;
63
63
  }
64
- entry.disposed = true;
65
- entry.session.status = exitCode === 0 ? "exited" : "crashed";
66
- entry.session.exitCode = exitCode;
67
- void entry.logWriter.close();
68
64
  emit(entry, {
69
65
  sessionId: session.id,
70
66
  taskSlug: input.taskSlug,
@@ -72,6 +68,7 @@ export function createNodePtyTerminalRuntime(deps) {
72
68
  type: "exit",
73
69
  exitCode
74
70
  });
71
+ entry.listeners.clear();
75
72
  });
76
73
  return { ...session };
77
74
  };
@@ -113,15 +110,24 @@ export function createNodePtyTerminalRuntime(deps) {
113
110
  },
114
111
  async stop(sessionId) {
115
112
  const entry = getEntry(entries, sessionId);
116
- entry.disposed = true;
117
- entry.session.status = "exited";
118
113
  entry.process.kill();
114
+ if (disposeEntry(entries, entry, "exited", entry.session.exitCode ?? null)) {
115
+ emit(entry, {
116
+ sessionId,
117
+ taskSlug: entry.session.taskSlug,
118
+ role: entry.session.role,
119
+ type: "exit",
120
+ exitCode: entry.session.exitCode ?? null
121
+ });
122
+ entry.listeners.clear();
123
+ }
119
124
  await entry.logWriter.close();
120
125
  },
121
126
  async restart(sessionId) {
122
127
  const entry = getEntry(entries, sessionId);
123
- entry.disposed = true;
124
128
  entry.process.kill();
129
+ disposeEntry(entries, entry, "exited", entry.session.exitCode ?? null);
130
+ entry.listeners.clear();
125
131
  await entry.logWriter.close();
126
132
  return create(entry.input, sessionId);
127
133
  },
@@ -154,6 +160,17 @@ export function createNodePtyTerminalRuntime(deps) {
154
160
  }
155
161
  };
156
162
  }
163
+ function disposeEntry(entries, entry, status, exitCode) {
164
+ if (entry.disposed) {
165
+ return false;
166
+ }
167
+ entry.disposed = true;
168
+ entry.session.status = status;
169
+ entry.session.exitCode = exitCode;
170
+ void entry.logWriter.close();
171
+ entries.delete(entry.session.id);
172
+ return true;
173
+ }
157
174
  export function createTerminalLogWriter(fs, logPath, onError) {
158
175
  let closed = false;
159
176
  let pending = Promise.resolve();
@@ -147,28 +147,17 @@ export function createSessionService(deps) {
147
147
  if (!record) {
148
148
  return undefined;
149
149
  }
150
- const runtimeSession = deps.runtime.getSession(record.id);
151
- if (!runtimeSession) {
152
- return {
153
- ...record,
154
- status: getRecoverableStatus(record),
155
- pid: undefined,
156
- exitCode: record.exitCode ?? null
157
- };
158
- }
159
- return {
160
- ...record,
161
- status: runtimeSession.status,
162
- activityStatus: record.activityStatus ?? "idle",
163
- pid: runtimeSession.pid,
164
- lastOutputAt: runtimeSession.lastOutputAt,
165
- exitCode: runtimeSession.exitCode
166
- };
150
+ return toRoleSessionRecordView(record, deps.runtime);
167
151
  },
168
152
  async listRoleSessions(repoRoot, taskSlug) {
169
153
  const sessions = [];
154
+ const config = await deps.projectService.loadConfig(repoRoot);
155
+ const task = await deps.taskService.loadTask(repoRoot, taskSlug);
156
+ const taskRepoRoot = getTaskRuntimeRepoRoot(task);
157
+ const persistedTaskSession = await loadPersistedTaskSessionRecord(deps.fs, taskRepoRoot, config.stateRoot, taskSlug);
170
158
  for (const role of ROLE_NAMES) {
171
- const session = await this.getRoleSession(repoRoot, taskSlug, role);
159
+ const session = toRoleSessionRecordView(deps.registry.getByRole(taskSlug, role)
160
+ ?? normalizePersistedRoleRecord(persistedTaskSession?.roles[role]?.record), deps.runtime);
172
161
  if (session) {
173
162
  sessions.push(session);
174
163
  }
@@ -248,6 +237,28 @@ export function createSessionService(deps) {
248
237
  }
249
238
  };
250
239
  }
240
+ function toRoleSessionRecordView(record, runtime) {
241
+ if (!record) {
242
+ return undefined;
243
+ }
244
+ const runtimeSession = runtime.getSession(record.id);
245
+ if (!runtimeSession) {
246
+ return {
247
+ ...record,
248
+ status: getRecoverableStatus(record),
249
+ pid: undefined,
250
+ exitCode: record.exitCode ?? null
251
+ };
252
+ }
253
+ return {
254
+ ...record,
255
+ status: runtimeSession.status,
256
+ activityStatus: record.activityStatus ?? "idle",
257
+ pid: runtimeSession.pid,
258
+ lastOutputAt: runtimeSession.lastOutputAt,
259
+ exitCode: runtimeSession.exitCode
260
+ };
261
+ }
251
262
  async function buildCodexReviewerStartCommand(fs, taskRepoRoot, launchMode, selectedModel, selectedEffort) {
252
263
  const codexDir = resolveRepoPath(taskRepoRoot, CODEX_DIR);
253
264
  const reviewDir = resolveRepoPath(taskRepoRoot, CODEX_REVIEW_DIR);
@@ -322,12 +333,17 @@ function getHandoffArtifactPath(paths, role) {
322
333
  return undefined;
323
334
  }
324
335
  async function loadPersistedRoleRecord(fs, repoRoot, stateRoot, taskSlug, role) {
336
+ const current = await loadPersistedTaskSessionRecord(fs, repoRoot, stateRoot, taskSlug);
337
+ return normalizePersistedRoleRecord(current?.roles[role]?.record);
338
+ }
339
+ async function loadPersistedTaskSessionRecord(fs, repoRoot, stateRoot, taskSlug) {
325
340
  const sessionPath = getTaskSessionPath(repoRoot, stateRoot, taskSlug);
326
341
  if (!(await fs.pathExists(sessionPath))) {
327
342
  return undefined;
328
343
  }
329
- const current = await fs.readJson(sessionPath);
330
- const record = current.roles[role]?.record;
344
+ return fs.readJson(sessionPath);
345
+ }
346
+ function normalizePersistedRoleRecord(record) {
331
347
  const legacy = record;
332
348
  return record
333
349
  ? {
@@ -1,17 +1,39 @@
1
+ import { DISPATCHABLE_ROLES, ROLE_NAMES } from "../../shared/constants.js";
2
+ import { isOpenFileLimitError } from "../errors.js";
1
3
  import { getTaskRuntimeRepoRoot } from "./task-service.js";
2
4
  export function createStatusService(deps) {
3
5
  return {
4
6
  async getTaskStatus(repoRoot, taskSlug) {
5
7
  const task = await deps.taskService.loadTask(repoRoot, taskSlug);
6
8
  const taskRepoRoot = getTaskRuntimeRepoRoot(task);
7
- const artifacts = await deps.artifactService.listArtifacts({
8
- repoRoot: taskRepoRoot,
9
- handoffDir: task.handoffDir
10
- });
11
- const sessions = await deps.sessionService.listRoleSessions(repoRoot, taskSlug);
12
- const warnings = artifacts.checks
9
+ const warnings = [];
10
+ let artifacts;
11
+ let sessions = [];
12
+ try {
13
+ artifacts = await deps.artifactService.listArtifacts({
14
+ repoRoot: taskRepoRoot,
15
+ handoffDir: task.handoffDir
16
+ });
17
+ }
18
+ catch (error) {
19
+ if (!isOpenFileLimitError(error)) {
20
+ throw error;
21
+ }
22
+ artifacts = degradedArtifactSummary(task.handoffDir);
23
+ warnings.push(`Artifacts are temporarily unavailable because the backend hit the open-files limit: ${errorMessage(error)}`);
24
+ }
25
+ try {
26
+ sessions = await deps.sessionService.listRoleSessions(repoRoot, taskSlug);
27
+ }
28
+ catch (error) {
29
+ if (!isOpenFileLimitError(error)) {
30
+ throw error;
31
+ }
32
+ warnings.push(`Role sessions are temporarily unavailable because the backend hit the open-files limit: ${errorMessage(error)}`);
33
+ }
34
+ warnings.push(...artifacts.checks
13
35
  .filter((check) => check.status !== "ok")
14
- .map((check) => `${check.path}: ${check.status}`);
36
+ .map((check) => `${check.path}: ${check.status}`));
15
37
  return {
16
38
  task,
17
39
  sessions,
@@ -21,3 +43,28 @@ export function createStatusService(deps) {
21
43
  }
22
44
  };
23
45
  }
46
+ function degradedArtifactSummary(handoffDir) {
47
+ const roleCommandsDir = `${handoffDir}/role-commands`;
48
+ const logsDir = `${handoffDir}/logs`;
49
+ const messagesDir = `${handoffDir}/messages`;
50
+ return {
51
+ paths: {
52
+ handoffDir,
53
+ roleCommandsDir,
54
+ logsDir,
55
+ messagesDir,
56
+ roleCommandPaths: Object.fromEntries(DISPATCHABLE_ROLES.map((role) => [role, `${roleCommandsDir}/${role}.md`])),
57
+ roleLogPaths: Object.fromEntries(ROLE_NAMES.map((role) => [role, `${logsDir}/${role}.log`])),
58
+ messageRoutePaths: {},
59
+ architecturePlanPath: `${handoffDir}/architecture-plan.md`,
60
+ knownIssuesPath: `${handoffDir}/known-issues.md`,
61
+ reviewReportPath: `${handoffDir}/review-report.md`,
62
+ docsSyncReportPath: `${handoffDir}/docs-sync-report.md`,
63
+ finalAcceptancePath: `${handoffDir}/final-acceptance.md`
64
+ },
65
+ checks: []
66
+ };
67
+ }
68
+ function errorMessage(error) {
69
+ return error instanceof Error ? error.message : String(error);
70
+ }
@@ -87,6 +87,6 @@ WARNING: This link could potentially be dangerous`)){const _=window.open();if(_)
87
87
  `))+1))}const f="#".repeat(p),a=s.enter("headingAtx"),u=s.enter("phrasing");y.move(f+" ");let h=s.containerPhrasing(n,{before:"# ",after:`
88
88
  `,...y.current()});return/^[\t ]/.test(h)&&(h=nl(h.charCodeAt(0))+h.slice(1)),h=h?f+" "+h:f,s.options.closeAtx&&(h+=" "+f),u(),a(),h}e_.peek=ix;function e_(n){return n.value||""}function ix(){return"<"}t_.peek=rx;function t_(n,r,s,o){const p=Qc(s),y=p==='"'?"Quote":"Apostrophe",f=s.enter("image");let a=s.enter("label");const u=s.createTracker(o);let h=u.move("![");return h+=u.move(s.safe(n.alt,{before:h,after:"]",...u.current()})),h+=u.move("]("),a(),!n.url&&n.title||/[\0- \u007F]/.test(n.url)?(a=s.enter("destinationLiteral"),h+=u.move("<"),h+=u.move(s.safe(n.url,{before:h,after:">",...u.current()})),h+=u.move(">")):(a=s.enter("destinationRaw"),h+=u.move(s.safe(n.url,{before:h,after:n.title?" ":")",...u.current()}))),a(),n.title&&(a=s.enter(`title${y}`),h+=u.move(" "+p),h+=u.move(s.safe(n.title,{before:h,after:p,...u.current()})),h+=u.move(p),a()),h+=u.move(")"),f(),h}function rx(){return"!"}n_.peek=sx;function n_(n,r,s,o){const p=n.referenceType,y=s.enter("imageReference");let f=s.enter("label");const a=s.createTracker(o);let u=a.move("![");const h=s.safe(n.alt,{before:u,after:"]",...a.current()});u+=a.move(h+"]["),f();const d=s.stack;s.stack=[],f=s.enter("reference");const c=s.safe(s.associationId(n),{before:u,after:"]",...a.current()});return f(),s.stack=d,y(),p==="full"||!h||h!==c?u+=a.move(c+"]"):p==="shortcut"?u=u.slice(0,-1):u+=a.move("]"),u}function sx(){return"!"}i_.peek=lx;function i_(n,r,s){let o=n.value||"",p="`",y=-1;for(;new RegExp("(^|[^`])"+p+"([^`]|$)").test(o);)p+="`";for(/[^ \r\n]/.test(o)&&(/^[ \r\n]/.test(o)&&/[ \r\n]$/.test(o)||/^`|`$/.test(o))&&(o=" "+o+" ");++y<s.unsafe.length;){const f=s.unsafe[y],a=s.compilePattern(f);let u;if(f.atBreak)for(;u=a.exec(o);){let h=u.index;o.charCodeAt(h)===10&&o.charCodeAt(h-1)===13&&h--,o=o.slice(0,h)+" "+o.slice(u.index+1)}}return p+o+p}function lx(){return"`"}function r_(n,r){const s=Fc(n);return!!(!r.options.resourceLink&&n.url&&!n.title&&n.children&&n.children.length===1&&n.children[0].type==="text"&&(s===n.url||"mailto:"+s===n.url)&&/^[a-z][a-z+.-]+:/i.test(n.url)&&!/[\0- <>\u007F]/.test(n.url))}s_.peek=ax;function s_(n,r,s,o){const p=Qc(s),y=p==='"'?"Quote":"Apostrophe",f=s.createTracker(o);let a,u;if(r_(n,s)){const d=s.stack;s.stack=[],a=s.enter("autolink");let c=f.move("<");return c+=f.move(s.containerPhrasing(n,{before:c,after:">",...f.current()})),c+=f.move(">"),a(),s.stack=d,c}a=s.enter("link"),u=s.enter("label");let h=f.move("[");return h+=f.move(s.containerPhrasing(n,{before:h,after:"](",...f.current()})),h+=f.move("]("),u(),!n.url&&n.title||/[\0- \u007F]/.test(n.url)?(u=s.enter("destinationLiteral"),h+=f.move("<"),h+=f.move(s.safe(n.url,{before:h,after:">",...f.current()})),h+=f.move(">")):(u=s.enter("destinationRaw"),h+=f.move(s.safe(n.url,{before:h,after:n.title?" ":")",...f.current()}))),u(),n.title&&(u=s.enter(`title${y}`),h+=f.move(" "+p),h+=f.move(s.safe(n.title,{before:h,after:p,...f.current()})),h+=f.move(p),u()),h+=f.move(")"),a(),h}function ax(n,r,s){return r_(n,s)?"<":"["}l_.peek=ox;function l_(n,r,s,o){const p=n.referenceType,y=s.enter("linkReference");let f=s.enter("label");const a=s.createTracker(o);let u=a.move("[");const h=s.containerPhrasing(n,{before:u,after:"]",...a.current()});u+=a.move(h+"]["),f();const d=s.stack;s.stack=[],f=s.enter("reference");const c=s.safe(s.associationId(n),{before:u,after:"]",...a.current()});return f(),s.stack=d,y(),p==="full"||!h||h!==c?u+=a.move(c+"]"):p==="shortcut"?u=u.slice(0,-1):u+=a.move("]"),u}function ox(){return"["}function Zc(n){const r=n.options.bullet||"*";if(r!=="*"&&r!=="+"&&r!=="-")throw new Error("Cannot serialize items with `"+r+"` for `options.bullet`, expected `*`, `+`, or `-`");return r}function ux(n){const r=Zc(n),s=n.options.bulletOther;if(!s)return r==="*"?"-":"*";if(s!=="*"&&s!=="+"&&s!=="-")throw new Error("Cannot serialize items with `"+s+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(s===r)throw new Error("Expected `bullet` (`"+r+"`) and `bulletOther` (`"+s+"`) to be different");return s}function cx(n){const r=n.options.bulletOrdered||".";if(r!=="."&&r!==")")throw new Error("Cannot serialize items with `"+r+"` for `options.bulletOrdered`, expected `.` or `)`");return r}function a_(n){const r=n.options.rule||"*";if(r!=="*"&&r!=="-"&&r!=="_")throw new Error("Cannot serialize rules with `"+r+"` for `options.rule`, expected `*`, `-`, or `_`");return r}function hx(n,r,s,o){const p=s.enter("list"),y=s.bulletCurrent;let f=n.ordered?cx(s):Zc(s);const a=n.ordered?f==="."?")":".":ux(s);let u=r&&s.bulletLastUsed?f===s.bulletLastUsed:!1;if(!n.ordered){const d=n.children?n.children[0]:void 0;if((f==="*"||f==="-")&&d&&(!d.children||!d.children[0])&&s.stack[s.stack.length-1]==="list"&&s.stack[s.stack.length-2]==="listItem"&&s.stack[s.stack.length-3]==="list"&&s.stack[s.stack.length-4]==="listItem"&&s.indexStack[s.indexStack.length-1]===0&&s.indexStack[s.indexStack.length-2]===0&&s.indexStack[s.indexStack.length-3]===0&&(u=!0),a_(s)===f&&d){let c=-1;for(;++c<n.children.length;){const S=n.children[c];if(S&&S.type==="listItem"&&S.children&&S.children[0]&&S.children[0].type==="thematicBreak"){u=!0;break}}}}u&&(f=a),s.bulletCurrent=f;const h=s.containerFlow(n,o);return s.bulletLastUsed=f,s.bulletCurrent=y,p(),h}function fx(n){const r=n.options.listItemIndent||"one";if(r!=="tab"&&r!=="one"&&r!=="mixed")throw new Error("Cannot serialize items with `"+r+"` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`");return r}function dx(n,r,s,o){const p=fx(s);let y=s.bulletCurrent||Zc(s);r&&r.type==="list"&&r.ordered&&(y=(typeof r.start=="number"&&r.start>-1?r.start:1)+(s.options.incrementListMarker===!1?0:r.children.indexOf(n))+y);let f=y.length+1;(p==="tab"||p==="mixed"&&(r&&r.type==="list"&&r.spread||n.spread))&&(f=Math.ceil(f/4)*4);const a=s.createTracker(o);a.move(y+" ".repeat(f-y.length)),a.shift(f);const u=s.enter("listItem"),h=s.indentLines(s.containerFlow(n,a.current()),d);return u(),h;function d(c,S,w){return S?(w?"":" ".repeat(f))+c:(w?y:y+" ".repeat(f-y.length))+c}}function px(n,r,s,o){const p=s.enter("paragraph"),y=s.enter("phrasing"),f=s.containerPhrasing(n,o);return y(),p(),f}const mx=Ba(["break","delete","emphasis","footnote","footnoteReference","image","imageReference","inlineCode","inlineMath","link","linkReference","mdxJsxTextElement","mdxTextExpression","strong","text","textDirective"]);function gx(n,r,s,o){return(n.children.some(function(f){return mx(f)})?s.containerPhrasing:s.containerFlow).call(s,n,o)}function _x(n){const r=n.options.strong||"*";if(r!=="*"&&r!=="_")throw new Error("Cannot serialize strong with `"+r+"` for `options.strong`, expected `*`, or `_`");return r}o_.peek=vx;function o_(n,r,s,o){const p=_x(s),y=s.enter("strong"),f=s.createTracker(o),a=f.move(p+p);let u=f.move(s.containerPhrasing(n,{after:p,before:a,...f.current()}));const h=u.charCodeAt(0),d=Ra(o.before.charCodeAt(o.before.length-1),h,p);d.inside&&(u=nl(h)+u.slice(1));const c=u.charCodeAt(u.length-1),S=Ra(o.after.charCodeAt(0),c,p);S.inside&&(u=u.slice(0,-1)+nl(c));const w=f.move(p+p);return y(),s.attentionEncodeSurroundingInfo={after:S.outside,before:d.outside},a+u+w}function vx(n,r,s){return s.options.strong||"*"}function yx(n,r,s,o){return s.safe(n.value,o)}function Sx(n){const r=n.options.ruleRepetition||3;if(r<3)throw new Error("Cannot serialize rules with repetition `"+r+"` for `options.ruleRepetition`, expected `3` or more");return r}function bx(n,r,s){const o=(a_(s)+(s.options.ruleSpaces?" ":"")).repeat(Sx(s));return s.options.ruleSpaces?o.slice(0,-1):o}const u_={blockquote:Vw,break:Xm,code:Xw,definition:Zw,emphasis:Jg,hardBreak:Xm,heading:nx,html:e_,image:t_,imageReference:n_,inlineCode:i_,link:s_,linkReference:l_,list:hx,listItem:dx,paragraph:px,root:gx,strong:o_,text:yx,thematicBreak:bx};function Cx(){return{enter:{table:wx,tableData:Qm,tableHeader:Qm,tableRow:Ex},exit:{codeText:kx,table:xx,tableData:yc,tableHeader:yc,tableRow:yc}}}function wx(n){const r=n._align;this.enter({type:"table",align:r.map(function(s){return s==="none"?null:s}),children:[]},n),this.data.inTable=!0}function xx(n){this.exit(n),this.data.inTable=void 0}function Ex(n){this.enter({type:"tableRow",children:[]},n)}function yc(n){this.exit(n)}function Qm(n){this.enter({type:"tableCell",children:[]},n)}function kx(n){let r=this.resume();this.data.inTable&&(r=r.replace(/\\([\\|])/g,Ax));const s=this.stack[this.stack.length-1];s.type,s.value=r,this.exit(n)}function Ax(n,r){return r==="|"?r:n}function Tx(n){const r=n||{},s=r.tableCellPadding,o=r.tablePipeAlign,p=r.stringLength,y=s?" ":"|";return{unsafe:[{character:"\r",inConstruct:"tableCell"},{character:`
89
89
  `,inConstruct:"tableCell"},{atBreak:!0,character:"|",after:"[ :-]"},{character:"|",inConstruct:"tableCell"},{atBreak:!0,character:":",after:"-"},{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{inlineCode:S,table:f,tableCell:u,tableRow:a}};function f(w,A,x,b){return h(d(w,x,b),w.align)}function a(w,A,x,b){const _=c(w,x,b),g=h([_]);return g.slice(0,g.indexOf(`
90
- `))}function u(w,A,x,b){const _=x.enter("tableCell"),g=x.enter("phrasing"),v=x.containerPhrasing(w,{...b,before:y,after:y});return g(),_(),v}function h(w,A){return Fw(w,{align:A,alignDelimiters:o,padding:s,stringLength:p})}function d(w,A,x){const b=w.children;let _=-1;const g=[],v=A.enter("table");for(;++_<b.length;)g[_]=c(b[_],A,x);return v(),g}function c(w,A,x){const b=w.children;let _=-1;const g=[],v=A.enter("tableRow");for(;++_<b.length;)g[_]=u(b[_],w,A,x);return v(),g}function S(w,A,x){let b=u_.inlineCode(w,A,x);return x.stack.includes("tableCell")&&(b=b.replace(/\|/g,"\\$&")),b}}function Dx(){return{exit:{taskListCheckValueChecked:Zm,taskListCheckValueUnchecked:Zm,paragraph:Mx}}}function Rx(){return{unsafe:[{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{listItem:Lx}}}function Zm(n){const r=this.stack[this.stack.length-2];r.type,r.checked=n.type==="taskListCheckValueChecked"}function Mx(n){const r=this.stack[this.stack.length-2];if(r&&r.type==="listItem"&&typeof r.checked=="boolean"){const s=this.stack[this.stack.length-1];s.type;const o=s.children[0];if(o&&o.type==="text"){const p=r.children;let y=-1,f;for(;++y<p.length;){const a=p[y];if(a.type==="paragraph"){f=a;break}}f===s&&(o.value=o.value.slice(1),o.value.length===0?s.children.shift():s.position&&o.position&&typeof o.position.start.offset=="number"&&(o.position.start.column++,o.position.start.offset++,s.position.start=Object.assign({},o.position.start)))}}this.exit(n)}function Lx(n,r,s,o){const p=n.children[0],y=typeof n.checked=="boolean"&&p&&p.type==="paragraph",f="["+(n.checked?"x":" ")+"] ",a=s.createTracker(o);y&&a.move(f);let u=u_.listItem(n,r,s,{...o,...a.current()});return y&&(u=u.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/,h)),u;function h(d){return d+f}}function Ox(){return[hw(),Lw(),jw(),Cx(),Dx()]}function Bx(n){return{extensions:[fw(),Ow(n),zw(),Tx(n),Rx()]}}const Nx={tokenize:Px,partial:!0},c_={tokenize:Fx,partial:!0},h_={tokenize:qx,partial:!0},f_={tokenize:Vx,partial:!0},jx={tokenize:Gx,partial:!0},d_={name:"wwwAutolink",tokenize:Ix,previous:m_},p_={name:"protocolAutolink",tokenize:Ux,previous:g_},ii={name:"emailAutolink",tokenize:Hx,previous:__},Nn={};function zx(){return{text:Nn}}let Ji=48;for(;Ji<123;)Nn[Ji]=ii,Ji++,Ji===58?Ji=65:Ji===91&&(Ji=97);Nn[43]=ii;Nn[45]=ii;Nn[46]=ii;Nn[95]=ii;Nn[72]=[ii,p_];Nn[104]=[ii,p_];Nn[87]=[ii,d_];Nn[119]=[ii,d_];function Hx(n,r,s){const o=this;let p,y;return f;function f(c){return!Mc(c)||!__.call(o,o.previous)||Jc(o.events)?s(c):(n.enter("literalAutolink"),n.enter("literalAutolinkEmail"),a(c))}function a(c){return Mc(c)?(n.consume(c),a):c===64?(n.consume(c),u):s(c)}function u(c){return c===46?n.check(jx,d,h)(c):c===45||c===95||Ft(c)?(y=!0,n.consume(c),u):d(c)}function h(c){return n.consume(c),p=!0,u}function d(c){return y&&p&&Gt(o.previous)?(n.exit("literalAutolinkEmail"),n.exit("literalAutolink"),r(c)):s(c)}}function Ix(n,r,s){const o=this;return p;function p(f){return f!==87&&f!==119||!m_.call(o,o.previous)||Jc(o.events)?s(f):(n.enter("literalAutolink"),n.enter("literalAutolinkWww"),n.check(Nx,n.attempt(c_,n.attempt(h_,y),s),s)(f))}function y(f){return n.exit("literalAutolinkWww"),n.exit("literalAutolink"),r(f)}}function Ux(n,r,s){const o=this;let p="",y=!1;return f;function f(c){return(c===72||c===104)&&g_.call(o,o.previous)&&!Jc(o.events)?(n.enter("literalAutolink"),n.enter("literalAutolinkHttp"),p+=String.fromCodePoint(c),n.consume(c),a):s(c)}function a(c){if(Gt(c)&&p.length<5)return p+=String.fromCodePoint(c),n.consume(c),a;if(c===58){const S=p.toLowerCase();if(S==="http"||S==="https")return n.consume(c),u}return s(c)}function u(c){return c===47?(n.consume(c),y?h:(y=!0,u)):s(c)}function h(c){return c===null||Aa(c)||ot(c)||tr(c)||Ma(c)?s(c):n.attempt(c_,n.attempt(h_,d),s)(c)}function d(c){return n.exit("literalAutolinkHttp"),n.exit("literalAutolink"),r(c)}}function Px(n,r,s){let o=0;return p;function p(f){return(f===87||f===119)&&o<3?(o++,n.consume(f),p):f===46&&o===3?(n.consume(f),y):s(f)}function y(f){return f===null?s(f):r(f)}}function Fx(n,r,s){let o,p,y;return f;function f(h){return h===46||h===95?n.check(f_,u,a)(h):h===null||ot(h)||tr(h)||h!==45&&Ma(h)?u(h):(y=!0,n.consume(h),f)}function a(h){return h===95?o=!0:(p=o,o=void 0),n.consume(h),f}function u(h){return p||o||!y?s(h):r(h)}}function qx(n,r){let s=0,o=0;return p;function p(f){return f===40?(s++,n.consume(f),p):f===41&&o<s?y(f):f===33||f===34||f===38||f===39||f===41||f===42||f===44||f===46||f===58||f===59||f===60||f===63||f===93||f===95||f===126?n.check(f_,r,y)(f):f===null||ot(f)||tr(f)?r(f):(n.consume(f),p)}function y(f){return f===41&&o++,n.consume(f),p}}function Vx(n,r,s){return o;function o(a){return a===33||a===34||a===39||a===41||a===42||a===44||a===46||a===58||a===59||a===63||a===95||a===126?(n.consume(a),o):a===38?(n.consume(a),y):a===93?(n.consume(a),p):a===60||a===null||ot(a)||tr(a)?r(a):s(a)}function p(a){return a===null||a===40||a===91||ot(a)||tr(a)?r(a):o(a)}function y(a){return Gt(a)?f(a):s(a)}function f(a){return a===59?(n.consume(a),o):Gt(a)?(n.consume(a),f):s(a)}}function Gx(n,r,s){return o;function o(y){return n.consume(y),p}function p(y){return Ft(y)?s(y):r(y)}}function m_(n){return n===null||n===40||n===42||n===95||n===91||n===93||n===126||ot(n)}function g_(n){return!Gt(n)}function __(n){return!(n===47||Mc(n))}function Mc(n){return n===43||n===45||n===46||n===95||Ft(n)}function Jc(n){let r=n.length,s=!1;for(;r--;){const o=n[r][1];if((o.type==="labelLink"||o.type==="labelImage")&&!o._balanced){s=!0;break}if(o._gfmAutolinkLiteralWalkedInto){s=!1;break}}return n.length>0&&!s&&(n[n.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),s}const $x={tokenize:e2,partial:!0};function Yx(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:Qx,continuation:{tokenize:Zx},exit:Jx}},text:{91:{name:"gfmFootnoteCall",tokenize:Xx},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:Kx,resolveTo:Wx}}}}function Kx(n,r,s){const o=this;let p=o.events.length;const y=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let f;for(;p--;){const u=o.events[p][1];if(u.type==="labelImage"){f=u;break}if(u.type==="gfmFootnoteCall"||u.type==="labelLink"||u.type==="label"||u.type==="image"||u.type==="link")break}return a;function a(u){if(!f||!f._balanced)return s(u);const h=An(o.sliceSerialize({start:f.end,end:o.now()}));return h.codePointAt(0)!==94||!y.includes(h.slice(1))?s(u):(n.enter("gfmFootnoteCallLabelMarker"),n.consume(u),n.exit("gfmFootnoteCallLabelMarker"),r(u))}}function Wx(n,r){let s=n.length;for(;s--;)if(n[s][1].type==="labelImage"&&n[s][0]==="enter"){n[s][1];break}n[s+1][1].type="data",n[s+3][1].type="gfmFootnoteCallLabelMarker";const o={type:"gfmFootnoteCall",start:Object.assign({},n[s+3][1].start),end:Object.assign({},n[n.length-1][1].end)},p={type:"gfmFootnoteCallMarker",start:Object.assign({},n[s+3][1].end),end:Object.assign({},n[s+3][1].end)};p.end.column++,p.end.offset++,p.end._bufferIndex++;const y={type:"gfmFootnoteCallString",start:Object.assign({},p.end),end:Object.assign({},n[n.length-1][1].start)},f={type:"chunkString",contentType:"string",start:Object.assign({},y.start),end:Object.assign({},y.end)},a=[n[s+1],n[s+2],["enter",o,r],n[s+3],n[s+4],["enter",p,r],["exit",p,r],["enter",y,r],["enter",f,r],["exit",f,r],["exit",y,r],n[n.length-2],n[n.length-1],["exit",o,r]];return n.splice(s,n.length-s+1,...a),n}function Xx(n,r,s){const o=this,p=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let y=0,f;return a;function a(c){return n.enter("gfmFootnoteCall"),n.enter("gfmFootnoteCallLabelMarker"),n.consume(c),n.exit("gfmFootnoteCallLabelMarker"),u}function u(c){return c!==94?s(c):(n.enter("gfmFootnoteCallMarker"),n.consume(c),n.exit("gfmFootnoteCallMarker"),n.enter("gfmFootnoteCallString"),n.enter("chunkString").contentType="string",h)}function h(c){if(y>999||c===93&&!f||c===null||c===91||ot(c))return s(c);if(c===93){n.exit("chunkString");const S=n.exit("gfmFootnoteCallString");return p.includes(An(o.sliceSerialize(S)))?(n.enter("gfmFootnoteCallLabelMarker"),n.consume(c),n.exit("gfmFootnoteCallLabelMarker"),n.exit("gfmFootnoteCall"),r):s(c)}return ot(c)||(f=!0),y++,n.consume(c),c===92?d:h}function d(c){return c===91||c===92||c===93?(n.consume(c),y++,h):h(c)}}function Qx(n,r,s){const o=this,p=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let y,f=0,a;return u;function u(A){return n.enter("gfmFootnoteDefinition")._container=!0,n.enter("gfmFootnoteDefinitionLabel"),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionLabelMarker"),h}function h(A){return A===94?(n.enter("gfmFootnoteDefinitionMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionMarker"),n.enter("gfmFootnoteDefinitionLabelString"),n.enter("chunkString").contentType="string",d):s(A)}function d(A){if(f>999||A===93&&!a||A===null||A===91||ot(A))return s(A);if(A===93){n.exit("chunkString");const x=n.exit("gfmFootnoteDefinitionLabelString");return y=An(o.sliceSerialize(x)),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionLabelMarker"),n.exit("gfmFootnoteDefinitionLabel"),S}return ot(A)||(a=!0),f++,n.consume(A),A===92?c:d}function c(A){return A===91||A===92||A===93?(n.consume(A),f++,d):d(A)}function S(A){return A===58?(n.enter("definitionMarker"),n.consume(A),n.exit("definitionMarker"),p.includes(y)||p.push(y),Xe(n,w,"gfmFootnoteDefinitionWhitespace")):s(A)}function w(A){return r(A)}}function Zx(n,r,s){return n.check(rl,r,n.attempt($x,r,s))}function Jx(n){n.exit("gfmFootnoteDefinition")}function e2(n,r,s){const o=this;return Xe(n,p,"gfmFootnoteDefinitionIndent",5);function p(y){const f=o.events[o.events.length-1];return f&&f[1].type==="gfmFootnoteDefinitionIndent"&&f[2].sliceSerialize(f[1],!0).length===4?r(y):s(y)}}function t2(n){let s=(n||{}).singleTilde;const o={name:"strikethrough",tokenize:y,resolveAll:p};return s==null&&(s=!0),{text:{126:o},insideSpan:{null:[o]},attentionMarkers:{null:[126]}};function p(f,a){let u=-1;for(;++u<f.length;)if(f[u][0]==="enter"&&f[u][1].type==="strikethroughSequenceTemporary"&&f[u][1]._close){let h=u;for(;h--;)if(f[h][0]==="exit"&&f[h][1].type==="strikethroughSequenceTemporary"&&f[h][1]._open&&f[u][1].end.offset-f[u][1].start.offset===f[h][1].end.offset-f[h][1].start.offset){f[u][1].type="strikethroughSequence",f[h][1].type="strikethroughSequence";const d={type:"strikethrough",start:Object.assign({},f[h][1].start),end:Object.assign({},f[u][1].end)},c={type:"strikethroughText",start:Object.assign({},f[h][1].end),end:Object.assign({},f[u][1].start)},S=[["enter",d,a],["enter",f[h][1],a],["exit",f[h][1],a],["enter",c,a]],w=a.parser.constructs.insideSpan.null;w&&hn(S,S.length,0,La(w,f.slice(h+1,u),a)),hn(S,S.length,0,[["exit",c,a],["enter",f[u][1],a],["exit",f[u][1],a],["exit",d,a]]),hn(f,h-1,u-h+3,S),u=h+S.length-2;break}}for(u=-1;++u<f.length;)f[u][1].type==="strikethroughSequenceTemporary"&&(f[u][1].type="data");return f}function y(f,a,u){const h=this.previous,d=this.events;let c=0;return S;function S(A){return h===126&&d[d.length-1][1].type!=="characterEscape"?u(A):(f.enter("strikethroughSequenceTemporary"),w(A))}function w(A){const x=Kr(h);if(A===126)return c>1?u(A):(f.consume(A),c++,w);if(c<2&&!s)return u(A);const b=f.exit("strikethroughSequenceTemporary"),_=Kr(A);return b._open=!_||_===2&&!!x,b._close=!x||x===2&&!!_,a(A)}}}class n2{constructor(){this.map=[]}add(r,s,o){i2(this,r,s,o)}consume(r){if(this.map.sort(function(y,f){return y[0]-f[0]}),this.map.length===0)return;let s=this.map.length;const o=[];for(;s>0;)s-=1,o.push(r.slice(this.map[s][0]+this.map[s][1]),this.map[s][2]),r.length=this.map[s][0];o.push(r.slice()),r.length=0;let p=o.pop();for(;p;){for(const y of p)r.push(y);p=o.pop()}this.map.length=0}}function i2(n,r,s,o){let p=0;if(!(s===0&&o.length===0)){for(;p<n.map.length;){if(n.map[p][0]===r){n.map[p][1]+=s,n.map[p][2].push(...o);return}p+=1}n.map.push([r,s,o])}}function r2(n,r){let s=!1;const o=[];for(;r<n.length;){const p=n[r];if(s){if(p[0]==="enter")p[1].type==="tableContent"&&o.push(n[r+1][1].type==="tableDelimiterMarker"?"left":"none");else if(p[1].type==="tableContent"){if(n[r-1][1].type==="tableDelimiterMarker"){const y=o.length-1;o[y]=o[y]==="left"?"center":"right"}}else if(p[1].type==="tableDelimiterRow")break}else p[0]==="enter"&&p[1].type==="tableDelimiterRow"&&(s=!0);r+=1}return o}function s2(){return{flow:{null:{name:"table",tokenize:l2,resolveAll:a2}}}}function l2(n,r,s){const o=this;let p=0,y=0,f;return a;function a(B){let z=o.events.length-1;for(;z>-1;){const Y=o.events[z][1].type;if(Y==="lineEnding"||Y==="linePrefix")z--;else break}const q=z>-1?o.events[z][1].type:null,F=q==="tableHead"||q==="tableRow"?D:u;return F===D&&o.parser.lazy[o.now().line]?s(B):F(B)}function u(B){return n.enter("tableHead"),n.enter("tableRow"),h(B)}function h(B){return B===124||(f=!0,y+=1),d(B)}function d(B){return B===null?s(B):De(B)?y>1?(y=0,o.interrupt=!0,n.exit("tableRow"),n.enter("lineEnding"),n.consume(B),n.exit("lineEnding"),w):s(B):Ve(B)?Xe(n,d,"whitespace")(B):(y+=1,f&&(f=!1,p+=1),B===124?(n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),f=!0,d):(n.enter("data"),c(B)))}function c(B){return B===null||B===124||ot(B)?(n.exit("data"),d(B)):(n.consume(B),B===92?S:c)}function S(B){return B===92||B===124?(n.consume(B),c):c(B)}function w(B){return o.interrupt=!1,o.parser.lazy[o.now().line]?s(B):(n.enter("tableDelimiterRow"),f=!1,Ve(B)?Xe(n,A,"linePrefix",o.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(B):A(B))}function A(B){return B===45||B===58?b(B):B===124?(f=!0,n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),x):M(B)}function x(B){return Ve(B)?Xe(n,b,"whitespace")(B):b(B)}function b(B){return B===58?(y+=1,f=!0,n.enter("tableDelimiterMarker"),n.consume(B),n.exit("tableDelimiterMarker"),_):B===45?(y+=1,_(B)):B===null||De(B)?k(B):M(B)}function _(B){return B===45?(n.enter("tableDelimiterFiller"),g(B)):M(B)}function g(B){return B===45?(n.consume(B),g):B===58?(f=!0,n.exit("tableDelimiterFiller"),n.enter("tableDelimiterMarker"),n.consume(B),n.exit("tableDelimiterMarker"),v):(n.exit("tableDelimiterFiller"),v(B))}function v(B){return Ve(B)?Xe(n,k,"whitespace")(B):k(B)}function k(B){return B===124?A(B):B===null||De(B)?!f||p!==y?M(B):(n.exit("tableDelimiterRow"),n.exit("tableHead"),r(B)):M(B)}function M(B){return s(B)}function D(B){return n.enter("tableRow"),T(B)}function T(B){return B===124?(n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),T):B===null||De(B)?(n.exit("tableRow"),r(B)):Ve(B)?Xe(n,T,"whitespace")(B):(n.enter("data"),E(B))}function E(B){return B===null||B===124||ot(B)?(n.exit("data"),T(B)):(n.consume(B),B===92?R:E)}function R(B){return B===92||B===124?(n.consume(B),E):E(B)}}function a2(n,r){let s=-1,o=!0,p=0,y=[0,0,0,0],f=[0,0,0,0],a=!1,u=0,h,d,c;const S=new n2;for(;++s<n.length;){const w=n[s],A=w[1];w[0]==="enter"?A.type==="tableHead"?(a=!1,u!==0&&(Jm(S,r,u,h,d),d=void 0,u=0),h={type:"table",start:Object.assign({},A.start),end:Object.assign({},A.end)},S.add(s,0,[["enter",h,r]])):A.type==="tableRow"||A.type==="tableDelimiterRow"?(o=!0,c=void 0,y=[0,0,0,0],f=[0,s+1,0,0],a&&(a=!1,d={type:"tableBody",start:Object.assign({},A.start),end:Object.assign({},A.end)},S.add(s,0,[["enter",d,r]])),p=A.type==="tableDelimiterRow"?2:d?3:1):p&&(A.type==="data"||A.type==="tableDelimiterMarker"||A.type==="tableDelimiterFiller")?(o=!1,f[2]===0&&(y[1]!==0&&(f[0]=f[1],c=wa(S,r,y,p,void 0,c),y=[0,0,0,0]),f[2]=s)):A.type==="tableCellDivider"&&(o?o=!1:(y[1]!==0&&(f[0]=f[1],c=wa(S,r,y,p,void 0,c)),y=f,f=[y[1],s,0,0])):A.type==="tableHead"?(a=!0,u=s):A.type==="tableRow"||A.type==="tableDelimiterRow"?(u=s,y[1]!==0?(f[0]=f[1],c=wa(S,r,y,p,s,c)):f[1]!==0&&(c=wa(S,r,f,p,s,c)),p=0):p&&(A.type==="data"||A.type==="tableDelimiterMarker"||A.type==="tableDelimiterFiller")&&(f[3]=s)}for(u!==0&&Jm(S,r,u,h,d),S.consume(r.events),s=-1;++s<r.events.length;){const w=r.events[s];w[0]==="enter"&&w[1].type==="table"&&(w[1]._align=r2(r.events,s))}return n}function wa(n,r,s,o,p,y){const f=o===1?"tableHeader":o===2?"tableDelimiter":"tableData",a="tableContent";s[0]!==0&&(y.end=Object.assign({},Gr(r.events,s[0])),n.add(s[0],0,[["exit",y,r]]));const u=Gr(r.events,s[1]);if(y={type:f,start:Object.assign({},u),end:Object.assign({},u)},n.add(s[1],0,[["enter",y,r]]),s[2]!==0){const h=Gr(r.events,s[2]),d=Gr(r.events,s[3]),c={type:a,start:Object.assign({},h),end:Object.assign({},d)};if(n.add(s[2],0,[["enter",c,r]]),o!==2){const S=r.events[s[2]],w=r.events[s[3]];if(S[1].end=Object.assign({},w[1].end),S[1].type="chunkText",S[1].contentType="text",s[3]>s[2]+1){const A=s[2]+1,x=s[3]-s[2]-1;n.add(A,x,[])}}n.add(s[3]+1,0,[["exit",c,r]])}return p!==void 0&&(y.end=Object.assign({},Gr(r.events,p)),n.add(p,0,[["exit",y,r]]),y=void 0),y}function Jm(n,r,s,o,p){const y=[],f=Gr(r.events,s);p&&(p.end=Object.assign({},f),y.push(["exit",p,r])),o.end=Object.assign({},f),y.push(["exit",o,r]),n.add(s+1,0,y)}function Gr(n,r){const s=n[r],o=s[0]==="enter"?"start":"end";return s[1][o]}const o2={name:"tasklistCheck",tokenize:c2};function u2(){return{text:{91:o2}}}function c2(n,r,s){const o=this;return p;function p(u){return o.previous!==null||!o._gfmTasklistFirstContentOfListItem?s(u):(n.enter("taskListCheck"),n.enter("taskListCheckMarker"),n.consume(u),n.exit("taskListCheckMarker"),y)}function y(u){return ot(u)?(n.enter("taskListCheckValueUnchecked"),n.consume(u),n.exit("taskListCheckValueUnchecked"),f):u===88||u===120?(n.enter("taskListCheckValueChecked"),n.consume(u),n.exit("taskListCheckValueChecked"),f):s(u)}function f(u){return u===93?(n.enter("taskListCheckMarker"),n.consume(u),n.exit("taskListCheckMarker"),n.exit("taskListCheck"),a):s(u)}function a(u){return De(u)?r(u):Ve(u)?n.check({tokenize:h2},r,s)(u):s(u)}}function h2(n,r,s){return Xe(n,o,"whitespace");function o(p){return p===null?s(p):r(p)}}function f2(n){return Tg([zx(),Yx(),t2(n),s2(),u2()])}const d2={};function p2(n){const r=this,s=n||d2,o=r.data(),p=o.micromarkExtensions||(o.micromarkExtensions=[]),y=o.fromMarkdownExtensions||(o.fromMarkdownExtensions=[]),f=o.toMarkdownExtensions||(o.toMarkdownExtensions=[]);p.push(f2(s)),y.push(Ox()),f.push(Bx(s))}const m2=500;function g2({settings:n,busy:r=!1,promptPreviews:s,testResult:o,onSave:p,onTest:y,onClose:f}){const[a,u]=ue.useState(n),[h,d]=ue.useState(n.apiKey??"");return ue.useEffect(()=>{u(n),d(n.apiKey??"")},[n]),N.jsx("div",{className:"modal-backdrop",children:N.jsxs("section",{className:"translation-settings-modal",role:"dialog","aria-modal":"true","aria-label":"Translation Settings",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h2",{children:"Translation Settings"}),N.jsx("p",{children:"Use an OpenAI-compatible endpoint for the embedded translation panel."})]}),N.jsx("button",{type:"button",onClick:f,children:"Close"})]}),N.jsxs("div",{className:"translation-settings-grid",children:[N.jsxs("label",{children:[N.jsx("span",{children:"Base URL"}),N.jsx("input",{value:a.baseUrl,onChange:c=>u({...a,baseUrl:c.target.value}),placeholder:"https://api.openai.com/v1"})]}),N.jsxs("label",{children:[N.jsx("span",{children:"API key"}),N.jsx("input",{value:h,onChange:c=>d(c.target.value),placeholder:"API key",autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,type:"text"})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Model"}),N.jsx("input",{value:a.model,onChange:c=>u({...a,model:c.target.value})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Target language"}),N.jsx("input",{value:a.targetLanguage,onChange:c=>u({...a,targetLanguage:c.target.value})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Use context"}),N.jsx("input",{checked:a.contextEnabled,type:"checkbox",onChange:c=>u({...a,contextEnabled:c.target.checked})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Timeout ms"}),N.jsx("input",{min:3e3,type:"number",value:a.requestTimeoutMs,onChange:c=>u({...a,requestTimeoutMs:Number(c.target.value)})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Temperature"}),N.jsx("input",{min:0,max:1,step:.1,type:"number",value:a.temperature,onChange:c=>u({...a,temperature:Number(c.target.value)})})]})]}),N.jsxs("section",{className:"translation-prompt-settings",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h3",{children:"Translation Prompts"}),N.jsx("p",{children:"Edit the three cc-pm style prompt slots directly."})]}),N.jsx("button",{type:"button",disabled:r,onClick:()=>u({...a,prompts:void 0}),children:"Reset prompts"})]}),N.jsx("div",{className:"translation-prompt-stack",children:s.map(c=>N.jsxs("label",{children:[N.jsx("span",{children:c.label}),N.jsx("textarea",{value:v2(a,c),onChange:S=>u({...a,prompts:_2(a.prompts,c.key,S.target.value,c.defaultPrompt)})})]},c.key))})]}),o?N.jsx("div",{className:o.ok?"translation-test-result is-ok":"translation-test-result is-error",children:o.ok?`Connection ok: ${o.model} in ${o.elapsedMs}ms`:o.error}):null,N.jsxs("footer",{children:[N.jsx("button",{type:"button",disabled:r,onClick:y,children:"Test Connection"}),N.jsx("button",{type:"button",disabled:r,onClick:()=>void p({...a,enabled:!0,translateOutput:!0,translateUserInput:!0,inputMode:"review-before-send"},h.trim()),children:"Save"})]})]})})}function _2(n,r,s,o){const p={...n??{}};return s.trim()&&s!==o?p[r]=s:delete p[r],Object.keys(p).length>0?p:void 0}function v2(n,r){var s;return((s=n.prompts)==null?void 0:s[r.key])??r.defaultPrompt}function y2({active:n=!0,taskSlug:r,role:s,sessionId:o}){const[p,y]=ue.useState(null),[f,a]=ue.useState([]),[u,h]=ue.useState([]),[d,c]=ue.useState(""),[S,w]=ue.useState(!1),[A,x]=ue.useState(!1),[b,_]=ue.useState(!1),[g,v]=ue.useState("ready"),[k,M]=ue.useState(""),[D,T]=ue.useState(Date.now()),[E,R]=ue.useState(!1),[B,z]=ue.useState(""),[q,F]=ue.useState(!1),[Y,K]=ue.useState([]),[G,X]=ue.useState(),[J,I]=ue.useState(0),[O,j]=ue.useState(0),V=ue.useRef(n),U=ue.useRef(1),ne=ue.useRef(null);ue.useEffect(()=>{V.current=n},[n]),ue.useEffect(()=>{Promise.all([xe.getTranslationSettings(),xe.getTranslationPrompts()]).then(([ge,$e])=>{y(ge),K($e)}).catch(ge=>z(ge.message))},[]),ue.useEffect(()=>{a([]),h([]),z(""),v("ready"),M(""),U.current=1;let ge=!1,$e;const Oe=()=>{ge||($e=window.setTimeout(dt,V.current?200:1e3))},dt=async()=>{if(!ge)try{const Le=await xe.pollTranslationSession(o,U.current);if(ge)return;$(Le.events),U.current=Le.nextCursor,v(Le.status),V.current&&M(D2(new Date().toISOString()))}catch(Le){ge||z(Le instanceof Error?Le.message:"Translation poll failed.")}finally{Oe()}};return xe.startTranslationSession(r,s).then(Le=>{ge||(v(Le.status),U.current=Le.nextCursor,dt())}).catch(Le=>{ge||z(Le instanceof Error?Le.message:"Translation start failed.")}),()=>{ge=!0,$e!==void 0&&window.clearTimeout($e),xe.stopTranslationSession(o).catch(()=>{})}},[o,r,s,J]),ue.useEffect(()=>{if(!n)return;const ge=ne.current;if(!ge)return;const $e=window.requestAnimationFrame(()=>{ge.scrollTop=ge.scrollHeight});return()=>window.cancelAnimationFrame($e)},[n,O]);const _e=C2(f);ue.useEffect(()=>{if(!_e)return;T(Date.now());const ge=window.setInterval(()=>T(Date.now()),250);return()=>window.clearInterval(ge)},[_e]);async function me(ge=!1){if(p){R(!0),z(""),w(!1);try{const $e=await xe.translateUserInput(r,s,{text:d,mode:ge?"auto-send":"review-before-send",useContext:p.contextEnabled,send:ge});_($e.contextUsed),$e.sent?(c(""),w(!1)):(c($e.englishPreview),w(!0))}catch($e){z($e instanceof Error?$e.message:"Translation failed.")}finally{R(!1)}}}function $(ge){if(ge.length===0)return;for(const Oe of ge)Oe.type==="status"?v(Oe.status):Oe.type==="error"?z(Oe.message):Oe.type==="failures"&&h(Oe.failures);const $e=ge.filter(Oe=>Oe.type==="entry");$e.length>0&&(a(Oe=>{const dt=$e.reduce((wt,ae)=>A2(wt,ae.entry),Oe),Le=x2(dt);return Le.removedIds.size>0&&h(wt=>wt.filter(ae=>!Le.removedIds.has(ae.translationId))),Le.entries}),j(Oe=>Oe+1))}async function H(){if(d.trim()){R(!0),z("");try{await xe.sendTranslatedInput(r,s,{englishText:d}),c(""),w(!1),_(!1)}catch(ge){z(ge instanceof Error?ge.message:"Failed to send English input.")}finally{R(!1)}}}function te(ge){ge.key!=="Enter"||ge.shiftKey||ge.nativeEvent.isComposing||(ge.preventDefault(),!E&&d.trim()&&(S?H():me(A)))}async function Z(ge,$e){R(!0),z("");try{const Oe=await xe.updateTranslationSettings({...ge,...$e!==void 0?{apiKey:$e}:{}}),dt=await xe.getTranslationPrompts();y(Oe),K(dt),F(!1),I(Le=>Le+1)}catch(Oe){z(Oe instanceof Error?Oe.message:"Failed to save translation settings.")}finally{R(!1)}}async function fe(){R(!0),z("");try{X(await xe.testTranslationProvider())}catch(ge){z(ge instanceof Error?ge.message:"Provider test failed.")}finally{R(!1)}}async function Se(){a([]),h([]),U.current=1,await xe.clearTranslationSession(o).catch(ge=>z(ge.message))}async function Me(){R(!0),z("");try{const ge=await xe.ignoreTranslationFailures(o);h(ge.failures)}catch(ge){z(ge instanceof Error?ge.message:"Failed to ignore translation failures.")}finally{R(!1)}}async function Ie(){R(!0),z("");try{const ge=await xe.retryTranslationFailures(o);h(ge.failures)}catch(ge){z(ge instanceof Error?ge.message:"Failed to retry translation failures.")}finally{R(!1)}}if(!p)return N.jsx("aside",{className:"translation-panel",children:N.jsx("p",{className:"muted",children:"Loading translation settings..."})});const Ge=w2(f,g,D),Ue=u.length;return N.jsxs("aside",{className:"translation-panel",children:[N.jsxs("header",{className:"translation-panel-header",children:[N.jsxs("div",{className:"translation-panel-titlebar",children:[N.jsx("h2",{children:"Translation"}),N.jsxs("div",{className:"translation-panel-actions",children:[N.jsx("button",{"aria-pressed":A,className:`auto-send-toggle${A?" is-active":""}`,type:"button",onClick:()=>x(ge=>!ge),children:A?"✅ Auto-send":"× Auto-send"}),Ue>0?N.jsxs(N.Fragment,{children:[N.jsxs("button",{type:"button",disabled:E,onClick:()=>void Me(),children:["Ignore ",Ue]}),N.jsxs("button",{type:"button",disabled:E,onClick:()=>void Ie(),children:["Retry ",Ue]})]}):null,N.jsx("button",{type:"button",onClick:()=>F(!0),children:"Settings"}),N.jsx("button",{type:"button",onClick:()=>void Se(),children:"Clear"})]})]}),N.jsxs("div",{className:"translation-status-row",children:[N.jsxs("p",{children:[p.model," · ",Ge,b?" · context used":""]}),N.jsx("p",{children:k?`poll ${k}`:"poll -"})]})]}),B?N.jsx("div",{className:"error-banner",children:B}):null,N.jsxs("div",{className:"translation-entry-list",ref:ne,children:[f.length===0?N.jsx("p",{className:"muted",children:"Translated Claude Code output will appear here."}):null,f.map(ge=>N.jsx(S2,{entry:ge},ge.id))]}),N.jsx("div",{className:"translation-composer",children:N.jsxs("div",{className:"translation-composer-row",children:[N.jsx("textarea",{value:d,onChange:ge=>{c(ge.target.value),ge.target.value.trim()||w(!1)},onKeyDown:te,placeholder:"输入中文,先翻译成英文工程指令..."}),N.jsx("div",{className:"translation-composer-actions",children:N.jsx("button",{type:"button",disabled:E||!S||!d.trim(),onClick:()=>void H(),children:"Send English"})})]})}),q?N.jsx(g2,{settings:p,busy:E,promptPreviews:Y,testResult:G,onSave:Z,onTest:fe,onClose:()=>F(!1)}):null]})}function S2({entry:n}){if(n.sourceKind==="conversation-boundary")return N.jsx(b2,{entry:n});const r=k2(n),s=n.sourceKind==="tool-output",o=n.direction==="user-input-to-english",p=["translation-entry",`is-${n.sourceKind}`,o?"is-user-input":""].filter(Boolean).join(" ");return N.jsxs("article",{className:p,children:[s?N.jsx("pre",{children:r}):N.jsx("div",{className:"translation-markdown",children:N.jsx(tw,{remarkPlugins:[p2],children:r})}),n.warning?N.jsx("p",{className:"translation-entry-note",children:n.warning}):null,n.error?N.jsx("p",{className:"translation-entry-note is-error",children:n.error}):null]})}function b2({entry:n}){const r=n.boundaryKind==="end"?"结束":"开始",s=n.conversationTurn??0,o=R2(n.occurredAt??n.createdAt);return N.jsxs("div",{className:"translation-conversation-boundary","aria-label":`${r} 第 ${s} 轮 ${o}`,children:[N.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"}),N.jsx("span",{children:r}),N.jsxs("span",{children:["第 ",s," 轮"]}),N.jsx("time",{children:o}),N.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"})]})}function C2(n){const r=n.find(eh);return(r==null?void 0:r.translationStartedAt)??(r==null?void 0:r.createdAt)}function w2(n,r,s){const o=n.find(eh);if(o)return`translating ${T2(Math.max(0,s-E2(o)))}`;const p=n.at(-1);return(p==null?void 0:p.status)==="failed"||r==="failed"?"error":r}function eh(n){return n.status==="queued"||n.status==="translating"}function x2(n){const r=n.length-m2;if(r<=0)return{entries:n,removedIds:new Set};const s=new Set;for(const o of n){if(s.size>=r)break;eh(o)||s.add(o.id)}return s.size===0?{entries:n,removedIds:s}:{entries:n.filter(o=>!s.has(o.id)),removedIds:s}}function E2(n){const r=Date.parse(n.translationStartedAt??n.createdAt);return Number.isFinite(r)?r:Date.now()}function k2(n){return n.status==="queued"||n.status==="translating"?n.sourceText:n.status==="translated"?n.translatedText:n.translatedText||n.sourceText}function A2(n,r){return n.findIndex(o=>o.id===r.id)===-1?[...n,r]:n.map(o=>o.id===r.id?r:o)}function T2(n){if(n<1e3)return`${Math.max(.1,n/1e3).toFixed(1)}s`;const r=n/1e3;if(r<60)return`${r.toFixed(1)}s`;const s=Math.floor(r/60),o=Math.floor(r%60).toString().padStart(2,"0");return`${s}:${o}`}function D2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}function R2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}function M2({role:n,session:r,permissionMode:s,model:o,effort:p,active:y=!0,busy:f,orchestrationMode:a,translationEnabled:u,onPermissionModeChange:h,onModelChange:d,onEffortChange:c,onOrchestrationModeChange:S,onStart:w,onResume:A,onStop:x,onRestart:b,onTerminalEvent:_}){const g=a==="auto",v=n==="codex-reviewer";return N.jsxs("section",{className:"session-console",children:[N.jsxs("div",{className:"session-console-top",children:[N.jsx(P1,{role:n,session:r,permissionMode:s,model:o,effort:p,busy:f,onPermissionModeChange:h,onModelChange:d,onEffortChange:c,onStart:w,onResume:A,onStop:x,onRestart:b}),v?null:N.jsx("div",{className:"session-console-actions",children:N.jsx("button",{"aria-label":`Auto orchestration is ${g?"on":"off"}`,"aria-pressed":g,className:`translation-toggle${g?" is-active":""}`,disabled:f,type:"button",onClick:()=>S(g?"manual":"auto"),children:g?"✅ Auto orchestration":"× Auto orchestration"})})]}),(r==null?void 0:r.status)==="running"?N.jsx(L2,{active:y,onTerminalEvent:_,role:n,session:r,taskSlug:r.taskSlug,translationEnabled:!v&&u}):N.jsxs("div",{className:"terminal-empty",children:[N.jsx("strong",{children:n}),N.jsx("span",{children:v?r!=null&&r.claudeSessionId?"Resume this role to reconnect the Codex Reviewer terminal.":"Start this role to open an embedded Codex Reviewer terminal.":r!=null&&r.claudeSessionId?"Resume this role to reconnect its Claude Code conversation.":"Start this role to open an embedded Claude Code terminal."})]})]})}function L2({active:n,onTerminalEvent:r,role:s,session:o,taskSlug:p,translationEnabled:y}){return N.jsxs("div",{className:y?"session-console-body has-translation":"session-console-body",children:[N.jsx("div",{className:"terminal-pane",children:N.jsx(ag,{sessionId:o.id,active:n,onEvent:r},o.id)}),y?N.jsx("div",{className:"translation-pane",children:N.jsx(y2,{active:n,taskSlug:p,role:s,sessionId:o.id},o.id)}):null]})}function O2(n,r,s){var y;if(!n||s.mode!=="auto")return null;const o=new Map(n.map(f=>[f.id,f])),p=r.filter(f=>{var a;return f.dispatchingAt?((a=o.get(f.id))==null?void 0:a.dispatchingAt)!==f.dispatchingAt:!1});return p.length===0?null:((y=p.sort(B2)[p.length-1])==null?void 0:y.toRole)??null}function B2(n,r){const s=n.dispatchingAt??n.deliveredAt??n.acceptedAt??"",o=r.dispatchingAt??r.deliveredAt??r.acceptedAt??"";return s!==o?s.localeCompare(o):n.createdAt.localeCompare(r.createdAt)}function N2({task:n,activeRole:r,codexReviewerEnabled:s,translationEnabled:o,refreshNonce:p=0,onTaskChanged:y,onActiveRoleChange:f,onTranslationEnabledChange:a,onMessagesChanged:u,onOrchestrationChanged:h,onRoundStateChanged:d,onEventsChanged:c,onLaunchStateChanged:S}){const[w,A]=ue.useState(null),[x,b]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"default"}),[_,g]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"gpt-5.5"}),[v,k]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"xhigh"}),[M,D]=ue.useState(!1),[T,E]=ue.useState(""),[R,B]=ue.useState([]),[z,q]=ue.useState(null),F=ue.useRef(null),Y=!!(w!=null&&w.sessions.some($=>$.role==="codex-reviewer")),K=s||Y,G=K?[...er,sg]:er,X=ue.useCallback(($,H)=>{var fe;const te=((fe=F.current)==null?void 0:fe.taskSlug)===n.taskSlug?F.current.messages:null,Z=O2(te,$,H);F.current={taskSlug:n.taskSlug,messages:$},q(H),u==null||u($),h==null||h(H),Z&&(f(Z),V(`auto switched to ${Z} before VCM dispatch`))},[f,u,h,n.taskSlug]),J=ue.useCallback(($,H,te,Z)=>{A($),X(H,te),d==null||d(Z)},[X,d]),I=ue.useCallback(async()=>{const[$,H,te,Z]=await Promise.all([xe.getTaskStatus(n.taskSlug),xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug),xe.getSessionRoundState(n.taskSlug)]);J($,H,te,Z)},[J,n.taskSlug]);ue.useEffect(()=>{I().catch($=>E($.message))},[I,p]),ue.useEffect(()=>{B([]),c==null||c([])},[c,n.taskSlug]),ue.useEffect(()=>{w&&!K&&r==="codex-reviewer"&&f("project-manager")},[r,K,f,w]),ue.useEffect(()=>{b($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[])te[Z.role]!==Z.permissionMode&&(te[Z.role]=Z.permissionMode,H=!0);return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{g($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[]){const fe=Z.model??"default";te[Z.role]!==fe&&(te[Z.role]=fe,H=!0)}return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{k($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[]){const fe=Z.effort??"default";te[Z.role]!==fe&&(te[Z.role]=fe,H=!0)}return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{const $=(w==null?void 0:w.sessions)??[],H=$.filter(fe=>fe.role!=="codex-reviewer"),te=new Set(H.map(fe=>fe.role)),Z={};for(const fe of er)Z[fe.name]={permissionMode:x[fe.name],model:_[fe.name],effort:v[fe.name]};S==null||S({taskSlug:n.taskSlug,roles:Z,autoOrchestration:((z==null?void 0:z.mode)??"auto")==="auto",translationEnabled:o,statusLoaded:!!w,sessionCount:$.length,hasAnySession:$.length>0,allRolesHaveSession:er.every(fe=>te.has(fe.name))})},[_,v,S,z==null?void 0:z.mode,x,w,n.taskSlug,o]),ue.useEffect(()=>{const $=window.setInterval(()=>{Promise.all([xe.getTaskStatus(n.taskSlug),xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug),xe.getSessionRoundState(n.taskSlug)]).then(([H,te,Z,fe])=>{J(H,te,Z,fe)}).catch(H=>E(H.message))},3e3);return()=>window.clearInterval($)},[J,n.taskSlug]),ue.useEffect(()=>{let $=!1,H=!1;const te=window.setInterval(()=>{H||(H=!0,Promise.all([xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug)]).then(([Z,fe])=>{$||X(Z,fe)}).catch(Z=>{$||E(Z.message)}).finally(()=>{H=!1}))},200);return()=>{$=!0,window.clearInterval(te)}},[X,n.taskSlug]);async function O($){D(!0),E("");try{await $(),await I(),await y()}catch(H){E(H instanceof Error?H.message:"Action failed.")}finally{D(!1)}}async function j(){const $=n.worktreePath?[`Close task "${n.taskSlug}"?`,"","This is destructive:","- stops VCM-managed running role sessions for this task",`- deletes the task worktree: ${n.worktreePath}`,`- deletes the Git branch: ${n.branch}`,"- deletes VCM task/session/message/orchestration state","","VCM will not check running sessions or uncommitted changes before closing."].join(`
90
+ `))}function u(w,A,x,b){const _=x.enter("tableCell"),g=x.enter("phrasing"),v=x.containerPhrasing(w,{...b,before:y,after:y});return g(),_(),v}function h(w,A){return Fw(w,{align:A,alignDelimiters:o,padding:s,stringLength:p})}function d(w,A,x){const b=w.children;let _=-1;const g=[],v=A.enter("table");for(;++_<b.length;)g[_]=c(b[_],A,x);return v(),g}function c(w,A,x){const b=w.children;let _=-1;const g=[],v=A.enter("tableRow");for(;++_<b.length;)g[_]=u(b[_],w,A,x);return v(),g}function S(w,A,x){let b=u_.inlineCode(w,A,x);return x.stack.includes("tableCell")&&(b=b.replace(/\|/g,"\\$&")),b}}function Dx(){return{exit:{taskListCheckValueChecked:Zm,taskListCheckValueUnchecked:Zm,paragraph:Mx}}}function Rx(){return{unsafe:[{atBreak:!0,character:"-",after:"[:|-]"}],handlers:{listItem:Lx}}}function Zm(n){const r=this.stack[this.stack.length-2];r.type,r.checked=n.type==="taskListCheckValueChecked"}function Mx(n){const r=this.stack[this.stack.length-2];if(r&&r.type==="listItem"&&typeof r.checked=="boolean"){const s=this.stack[this.stack.length-1];s.type;const o=s.children[0];if(o&&o.type==="text"){const p=r.children;let y=-1,f;for(;++y<p.length;){const a=p[y];if(a.type==="paragraph"){f=a;break}}f===s&&(o.value=o.value.slice(1),o.value.length===0?s.children.shift():s.position&&o.position&&typeof o.position.start.offset=="number"&&(o.position.start.column++,o.position.start.offset++,s.position.start=Object.assign({},o.position.start)))}}this.exit(n)}function Lx(n,r,s,o){const p=n.children[0],y=typeof n.checked=="boolean"&&p&&p.type==="paragraph",f="["+(n.checked?"x":" ")+"] ",a=s.createTracker(o);y&&a.move(f);let u=u_.listItem(n,r,s,{...o,...a.current()});return y&&(u=u.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/,h)),u;function h(d){return d+f}}function Ox(){return[hw(),Lw(),jw(),Cx(),Dx()]}function Bx(n){return{extensions:[fw(),Ow(n),zw(),Tx(n),Rx()]}}const Nx={tokenize:Px,partial:!0},c_={tokenize:Fx,partial:!0},h_={tokenize:qx,partial:!0},f_={tokenize:Vx,partial:!0},jx={tokenize:Gx,partial:!0},d_={name:"wwwAutolink",tokenize:Ix,previous:m_},p_={name:"protocolAutolink",tokenize:Ux,previous:g_},ii={name:"emailAutolink",tokenize:Hx,previous:__},Nn={};function zx(){return{text:Nn}}let Ji=48;for(;Ji<123;)Nn[Ji]=ii,Ji++,Ji===58?Ji=65:Ji===91&&(Ji=97);Nn[43]=ii;Nn[45]=ii;Nn[46]=ii;Nn[95]=ii;Nn[72]=[ii,p_];Nn[104]=[ii,p_];Nn[87]=[ii,d_];Nn[119]=[ii,d_];function Hx(n,r,s){const o=this;let p,y;return f;function f(c){return!Mc(c)||!__.call(o,o.previous)||Jc(o.events)?s(c):(n.enter("literalAutolink"),n.enter("literalAutolinkEmail"),a(c))}function a(c){return Mc(c)?(n.consume(c),a):c===64?(n.consume(c),u):s(c)}function u(c){return c===46?n.check(jx,d,h)(c):c===45||c===95||Ft(c)?(y=!0,n.consume(c),u):d(c)}function h(c){return n.consume(c),p=!0,u}function d(c){return y&&p&&Gt(o.previous)?(n.exit("literalAutolinkEmail"),n.exit("literalAutolink"),r(c)):s(c)}}function Ix(n,r,s){const o=this;return p;function p(f){return f!==87&&f!==119||!m_.call(o,o.previous)||Jc(o.events)?s(f):(n.enter("literalAutolink"),n.enter("literalAutolinkWww"),n.check(Nx,n.attempt(c_,n.attempt(h_,y),s),s)(f))}function y(f){return n.exit("literalAutolinkWww"),n.exit("literalAutolink"),r(f)}}function Ux(n,r,s){const o=this;let p="",y=!1;return f;function f(c){return(c===72||c===104)&&g_.call(o,o.previous)&&!Jc(o.events)?(n.enter("literalAutolink"),n.enter("literalAutolinkHttp"),p+=String.fromCodePoint(c),n.consume(c),a):s(c)}function a(c){if(Gt(c)&&p.length<5)return p+=String.fromCodePoint(c),n.consume(c),a;if(c===58){const S=p.toLowerCase();if(S==="http"||S==="https")return n.consume(c),u}return s(c)}function u(c){return c===47?(n.consume(c),y?h:(y=!0,u)):s(c)}function h(c){return c===null||Aa(c)||ot(c)||tr(c)||Ma(c)?s(c):n.attempt(c_,n.attempt(h_,d),s)(c)}function d(c){return n.exit("literalAutolinkHttp"),n.exit("literalAutolink"),r(c)}}function Px(n,r,s){let o=0;return p;function p(f){return(f===87||f===119)&&o<3?(o++,n.consume(f),p):f===46&&o===3?(n.consume(f),y):s(f)}function y(f){return f===null?s(f):r(f)}}function Fx(n,r,s){let o,p,y;return f;function f(h){return h===46||h===95?n.check(f_,u,a)(h):h===null||ot(h)||tr(h)||h!==45&&Ma(h)?u(h):(y=!0,n.consume(h),f)}function a(h){return h===95?o=!0:(p=o,o=void 0),n.consume(h),f}function u(h){return p||o||!y?s(h):r(h)}}function qx(n,r){let s=0,o=0;return p;function p(f){return f===40?(s++,n.consume(f),p):f===41&&o<s?y(f):f===33||f===34||f===38||f===39||f===41||f===42||f===44||f===46||f===58||f===59||f===60||f===63||f===93||f===95||f===126?n.check(f_,r,y)(f):f===null||ot(f)||tr(f)?r(f):(n.consume(f),p)}function y(f){return f===41&&o++,n.consume(f),p}}function Vx(n,r,s){return o;function o(a){return a===33||a===34||a===39||a===41||a===42||a===44||a===46||a===58||a===59||a===63||a===95||a===126?(n.consume(a),o):a===38?(n.consume(a),y):a===93?(n.consume(a),p):a===60||a===null||ot(a)||tr(a)?r(a):s(a)}function p(a){return a===null||a===40||a===91||ot(a)||tr(a)?r(a):o(a)}function y(a){return Gt(a)?f(a):s(a)}function f(a){return a===59?(n.consume(a),o):Gt(a)?(n.consume(a),f):s(a)}}function Gx(n,r,s){return o;function o(y){return n.consume(y),p}function p(y){return Ft(y)?s(y):r(y)}}function m_(n){return n===null||n===40||n===42||n===95||n===91||n===93||n===126||ot(n)}function g_(n){return!Gt(n)}function __(n){return!(n===47||Mc(n))}function Mc(n){return n===43||n===45||n===46||n===95||Ft(n)}function Jc(n){let r=n.length,s=!1;for(;r--;){const o=n[r][1];if((o.type==="labelLink"||o.type==="labelImage")&&!o._balanced){s=!0;break}if(o._gfmAutolinkLiteralWalkedInto){s=!1;break}}return n.length>0&&!s&&(n[n.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),s}const $x={tokenize:e2,partial:!0};function Yx(){return{document:{91:{name:"gfmFootnoteDefinition",tokenize:Qx,continuation:{tokenize:Zx},exit:Jx}},text:{91:{name:"gfmFootnoteCall",tokenize:Xx},93:{name:"gfmPotentialFootnoteCall",add:"after",tokenize:Kx,resolveTo:Wx}}}}function Kx(n,r,s){const o=this;let p=o.events.length;const y=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let f;for(;p--;){const u=o.events[p][1];if(u.type==="labelImage"){f=u;break}if(u.type==="gfmFootnoteCall"||u.type==="labelLink"||u.type==="label"||u.type==="image"||u.type==="link")break}return a;function a(u){if(!f||!f._balanced)return s(u);const h=An(o.sliceSerialize({start:f.end,end:o.now()}));return h.codePointAt(0)!==94||!y.includes(h.slice(1))?s(u):(n.enter("gfmFootnoteCallLabelMarker"),n.consume(u),n.exit("gfmFootnoteCallLabelMarker"),r(u))}}function Wx(n,r){let s=n.length;for(;s--;)if(n[s][1].type==="labelImage"&&n[s][0]==="enter"){n[s][1];break}n[s+1][1].type="data",n[s+3][1].type="gfmFootnoteCallLabelMarker";const o={type:"gfmFootnoteCall",start:Object.assign({},n[s+3][1].start),end:Object.assign({},n[n.length-1][1].end)},p={type:"gfmFootnoteCallMarker",start:Object.assign({},n[s+3][1].end),end:Object.assign({},n[s+3][1].end)};p.end.column++,p.end.offset++,p.end._bufferIndex++;const y={type:"gfmFootnoteCallString",start:Object.assign({},p.end),end:Object.assign({},n[n.length-1][1].start)},f={type:"chunkString",contentType:"string",start:Object.assign({},y.start),end:Object.assign({},y.end)},a=[n[s+1],n[s+2],["enter",o,r],n[s+3],n[s+4],["enter",p,r],["exit",p,r],["enter",y,r],["enter",f,r],["exit",f,r],["exit",y,r],n[n.length-2],n[n.length-1],["exit",o,r]];return n.splice(s,n.length-s+1,...a),n}function Xx(n,r,s){const o=this,p=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let y=0,f;return a;function a(c){return n.enter("gfmFootnoteCall"),n.enter("gfmFootnoteCallLabelMarker"),n.consume(c),n.exit("gfmFootnoteCallLabelMarker"),u}function u(c){return c!==94?s(c):(n.enter("gfmFootnoteCallMarker"),n.consume(c),n.exit("gfmFootnoteCallMarker"),n.enter("gfmFootnoteCallString"),n.enter("chunkString").contentType="string",h)}function h(c){if(y>999||c===93&&!f||c===null||c===91||ot(c))return s(c);if(c===93){n.exit("chunkString");const S=n.exit("gfmFootnoteCallString");return p.includes(An(o.sliceSerialize(S)))?(n.enter("gfmFootnoteCallLabelMarker"),n.consume(c),n.exit("gfmFootnoteCallLabelMarker"),n.exit("gfmFootnoteCall"),r):s(c)}return ot(c)||(f=!0),y++,n.consume(c),c===92?d:h}function d(c){return c===91||c===92||c===93?(n.consume(c),y++,h):h(c)}}function Qx(n,r,s){const o=this,p=o.parser.gfmFootnotes||(o.parser.gfmFootnotes=[]);let y,f=0,a;return u;function u(A){return n.enter("gfmFootnoteDefinition")._container=!0,n.enter("gfmFootnoteDefinitionLabel"),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionLabelMarker"),h}function h(A){return A===94?(n.enter("gfmFootnoteDefinitionMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionMarker"),n.enter("gfmFootnoteDefinitionLabelString"),n.enter("chunkString").contentType="string",d):s(A)}function d(A){if(f>999||A===93&&!a||A===null||A===91||ot(A))return s(A);if(A===93){n.exit("chunkString");const x=n.exit("gfmFootnoteDefinitionLabelString");return y=An(o.sliceSerialize(x)),n.enter("gfmFootnoteDefinitionLabelMarker"),n.consume(A),n.exit("gfmFootnoteDefinitionLabelMarker"),n.exit("gfmFootnoteDefinitionLabel"),S}return ot(A)||(a=!0),f++,n.consume(A),A===92?c:d}function c(A){return A===91||A===92||A===93?(n.consume(A),f++,d):d(A)}function S(A){return A===58?(n.enter("definitionMarker"),n.consume(A),n.exit("definitionMarker"),p.includes(y)||p.push(y),Xe(n,w,"gfmFootnoteDefinitionWhitespace")):s(A)}function w(A){return r(A)}}function Zx(n,r,s){return n.check(rl,r,n.attempt($x,r,s))}function Jx(n){n.exit("gfmFootnoteDefinition")}function e2(n,r,s){const o=this;return Xe(n,p,"gfmFootnoteDefinitionIndent",5);function p(y){const f=o.events[o.events.length-1];return f&&f[1].type==="gfmFootnoteDefinitionIndent"&&f[2].sliceSerialize(f[1],!0).length===4?r(y):s(y)}}function t2(n){let s=(n||{}).singleTilde;const o={name:"strikethrough",tokenize:y,resolveAll:p};return s==null&&(s=!0),{text:{126:o},insideSpan:{null:[o]},attentionMarkers:{null:[126]}};function p(f,a){let u=-1;for(;++u<f.length;)if(f[u][0]==="enter"&&f[u][1].type==="strikethroughSequenceTemporary"&&f[u][1]._close){let h=u;for(;h--;)if(f[h][0]==="exit"&&f[h][1].type==="strikethroughSequenceTemporary"&&f[h][1]._open&&f[u][1].end.offset-f[u][1].start.offset===f[h][1].end.offset-f[h][1].start.offset){f[u][1].type="strikethroughSequence",f[h][1].type="strikethroughSequence";const d={type:"strikethrough",start:Object.assign({},f[h][1].start),end:Object.assign({},f[u][1].end)},c={type:"strikethroughText",start:Object.assign({},f[h][1].end),end:Object.assign({},f[u][1].start)},S=[["enter",d,a],["enter",f[h][1],a],["exit",f[h][1],a],["enter",c,a]],w=a.parser.constructs.insideSpan.null;w&&hn(S,S.length,0,La(w,f.slice(h+1,u),a)),hn(S,S.length,0,[["exit",c,a],["enter",f[u][1],a],["exit",f[u][1],a],["exit",d,a]]),hn(f,h-1,u-h+3,S),u=h+S.length-2;break}}for(u=-1;++u<f.length;)f[u][1].type==="strikethroughSequenceTemporary"&&(f[u][1].type="data");return f}function y(f,a,u){const h=this.previous,d=this.events;let c=0;return S;function S(A){return h===126&&d[d.length-1][1].type!=="characterEscape"?u(A):(f.enter("strikethroughSequenceTemporary"),w(A))}function w(A){const x=Kr(h);if(A===126)return c>1?u(A):(f.consume(A),c++,w);if(c<2&&!s)return u(A);const b=f.exit("strikethroughSequenceTemporary"),_=Kr(A);return b._open=!_||_===2&&!!x,b._close=!x||x===2&&!!_,a(A)}}}class n2{constructor(){this.map=[]}add(r,s,o){i2(this,r,s,o)}consume(r){if(this.map.sort(function(y,f){return y[0]-f[0]}),this.map.length===0)return;let s=this.map.length;const o=[];for(;s>0;)s-=1,o.push(r.slice(this.map[s][0]+this.map[s][1]),this.map[s][2]),r.length=this.map[s][0];o.push(r.slice()),r.length=0;let p=o.pop();for(;p;){for(const y of p)r.push(y);p=o.pop()}this.map.length=0}}function i2(n,r,s,o){let p=0;if(!(s===0&&o.length===0)){for(;p<n.map.length;){if(n.map[p][0]===r){n.map[p][1]+=s,n.map[p][2].push(...o);return}p+=1}n.map.push([r,s,o])}}function r2(n,r){let s=!1;const o=[];for(;r<n.length;){const p=n[r];if(s){if(p[0]==="enter")p[1].type==="tableContent"&&o.push(n[r+1][1].type==="tableDelimiterMarker"?"left":"none");else if(p[1].type==="tableContent"){if(n[r-1][1].type==="tableDelimiterMarker"){const y=o.length-1;o[y]=o[y]==="left"?"center":"right"}}else if(p[1].type==="tableDelimiterRow")break}else p[0]==="enter"&&p[1].type==="tableDelimiterRow"&&(s=!0);r+=1}return o}function s2(){return{flow:{null:{name:"table",tokenize:l2,resolveAll:a2}}}}function l2(n,r,s){const o=this;let p=0,y=0,f;return a;function a(B){let z=o.events.length-1;for(;z>-1;){const Y=o.events[z][1].type;if(Y==="lineEnding"||Y==="linePrefix")z--;else break}const q=z>-1?o.events[z][1].type:null,F=q==="tableHead"||q==="tableRow"?D:u;return F===D&&o.parser.lazy[o.now().line]?s(B):F(B)}function u(B){return n.enter("tableHead"),n.enter("tableRow"),h(B)}function h(B){return B===124||(f=!0,y+=1),d(B)}function d(B){return B===null?s(B):De(B)?y>1?(y=0,o.interrupt=!0,n.exit("tableRow"),n.enter("lineEnding"),n.consume(B),n.exit("lineEnding"),w):s(B):Ve(B)?Xe(n,d,"whitespace")(B):(y+=1,f&&(f=!1,p+=1),B===124?(n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),f=!0,d):(n.enter("data"),c(B)))}function c(B){return B===null||B===124||ot(B)?(n.exit("data"),d(B)):(n.consume(B),B===92?S:c)}function S(B){return B===92||B===124?(n.consume(B),c):c(B)}function w(B){return o.interrupt=!1,o.parser.lazy[o.now().line]?s(B):(n.enter("tableDelimiterRow"),f=!1,Ve(B)?Xe(n,A,"linePrefix",o.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(B):A(B))}function A(B){return B===45||B===58?b(B):B===124?(f=!0,n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),x):M(B)}function x(B){return Ve(B)?Xe(n,b,"whitespace")(B):b(B)}function b(B){return B===58?(y+=1,f=!0,n.enter("tableDelimiterMarker"),n.consume(B),n.exit("tableDelimiterMarker"),_):B===45?(y+=1,_(B)):B===null||De(B)?k(B):M(B)}function _(B){return B===45?(n.enter("tableDelimiterFiller"),g(B)):M(B)}function g(B){return B===45?(n.consume(B),g):B===58?(f=!0,n.exit("tableDelimiterFiller"),n.enter("tableDelimiterMarker"),n.consume(B),n.exit("tableDelimiterMarker"),v):(n.exit("tableDelimiterFiller"),v(B))}function v(B){return Ve(B)?Xe(n,k,"whitespace")(B):k(B)}function k(B){return B===124?A(B):B===null||De(B)?!f||p!==y?M(B):(n.exit("tableDelimiterRow"),n.exit("tableHead"),r(B)):M(B)}function M(B){return s(B)}function D(B){return n.enter("tableRow"),T(B)}function T(B){return B===124?(n.enter("tableCellDivider"),n.consume(B),n.exit("tableCellDivider"),T):B===null||De(B)?(n.exit("tableRow"),r(B)):Ve(B)?Xe(n,T,"whitespace")(B):(n.enter("data"),E(B))}function E(B){return B===null||B===124||ot(B)?(n.exit("data"),T(B)):(n.consume(B),B===92?R:E)}function R(B){return B===92||B===124?(n.consume(B),E):E(B)}}function a2(n,r){let s=-1,o=!0,p=0,y=[0,0,0,0],f=[0,0,0,0],a=!1,u=0,h,d,c;const S=new n2;for(;++s<n.length;){const w=n[s],A=w[1];w[0]==="enter"?A.type==="tableHead"?(a=!1,u!==0&&(Jm(S,r,u,h,d),d=void 0,u=0),h={type:"table",start:Object.assign({},A.start),end:Object.assign({},A.end)},S.add(s,0,[["enter",h,r]])):A.type==="tableRow"||A.type==="tableDelimiterRow"?(o=!0,c=void 0,y=[0,0,0,0],f=[0,s+1,0,0],a&&(a=!1,d={type:"tableBody",start:Object.assign({},A.start),end:Object.assign({},A.end)},S.add(s,0,[["enter",d,r]])),p=A.type==="tableDelimiterRow"?2:d?3:1):p&&(A.type==="data"||A.type==="tableDelimiterMarker"||A.type==="tableDelimiterFiller")?(o=!1,f[2]===0&&(y[1]!==0&&(f[0]=f[1],c=wa(S,r,y,p,void 0,c),y=[0,0,0,0]),f[2]=s)):A.type==="tableCellDivider"&&(o?o=!1:(y[1]!==0&&(f[0]=f[1],c=wa(S,r,y,p,void 0,c)),y=f,f=[y[1],s,0,0])):A.type==="tableHead"?(a=!0,u=s):A.type==="tableRow"||A.type==="tableDelimiterRow"?(u=s,y[1]!==0?(f[0]=f[1],c=wa(S,r,y,p,s,c)):f[1]!==0&&(c=wa(S,r,f,p,s,c)),p=0):p&&(A.type==="data"||A.type==="tableDelimiterMarker"||A.type==="tableDelimiterFiller")&&(f[3]=s)}for(u!==0&&Jm(S,r,u,h,d),S.consume(r.events),s=-1;++s<r.events.length;){const w=r.events[s];w[0]==="enter"&&w[1].type==="table"&&(w[1]._align=r2(r.events,s))}return n}function wa(n,r,s,o,p,y){const f=o===1?"tableHeader":o===2?"tableDelimiter":"tableData",a="tableContent";s[0]!==0&&(y.end=Object.assign({},Gr(r.events,s[0])),n.add(s[0],0,[["exit",y,r]]));const u=Gr(r.events,s[1]);if(y={type:f,start:Object.assign({},u),end:Object.assign({},u)},n.add(s[1],0,[["enter",y,r]]),s[2]!==0){const h=Gr(r.events,s[2]),d=Gr(r.events,s[3]),c={type:a,start:Object.assign({},h),end:Object.assign({},d)};if(n.add(s[2],0,[["enter",c,r]]),o!==2){const S=r.events[s[2]],w=r.events[s[3]];if(S[1].end=Object.assign({},w[1].end),S[1].type="chunkText",S[1].contentType="text",s[3]>s[2]+1){const A=s[2]+1,x=s[3]-s[2]-1;n.add(A,x,[])}}n.add(s[3]+1,0,[["exit",c,r]])}return p!==void 0&&(y.end=Object.assign({},Gr(r.events,p)),n.add(p,0,[["exit",y,r]]),y=void 0),y}function Jm(n,r,s,o,p){const y=[],f=Gr(r.events,s);p&&(p.end=Object.assign({},f),y.push(["exit",p,r])),o.end=Object.assign({},f),y.push(["exit",o,r]),n.add(s+1,0,y)}function Gr(n,r){const s=n[r],o=s[0]==="enter"?"start":"end";return s[1][o]}const o2={name:"tasklistCheck",tokenize:c2};function u2(){return{text:{91:o2}}}function c2(n,r,s){const o=this;return p;function p(u){return o.previous!==null||!o._gfmTasklistFirstContentOfListItem?s(u):(n.enter("taskListCheck"),n.enter("taskListCheckMarker"),n.consume(u),n.exit("taskListCheckMarker"),y)}function y(u){return ot(u)?(n.enter("taskListCheckValueUnchecked"),n.consume(u),n.exit("taskListCheckValueUnchecked"),f):u===88||u===120?(n.enter("taskListCheckValueChecked"),n.consume(u),n.exit("taskListCheckValueChecked"),f):s(u)}function f(u){return u===93?(n.enter("taskListCheckMarker"),n.consume(u),n.exit("taskListCheckMarker"),n.exit("taskListCheck"),a):s(u)}function a(u){return De(u)?r(u):Ve(u)?n.check({tokenize:h2},r,s)(u):s(u)}}function h2(n,r,s){return Xe(n,o,"whitespace");function o(p){return p===null?s(p):r(p)}}function f2(n){return Tg([zx(),Yx(),t2(n),s2(),u2()])}const d2={};function p2(n){const r=this,s=n||d2,o=r.data(),p=o.micromarkExtensions||(o.micromarkExtensions=[]),y=o.fromMarkdownExtensions||(o.fromMarkdownExtensions=[]),f=o.toMarkdownExtensions||(o.toMarkdownExtensions=[]);p.push(f2(s)),y.push(Ox()),f.push(Bx(s))}const m2=500;function g2({settings:n,busy:r=!1,promptPreviews:s,testResult:o,onSave:p,onTest:y,onClose:f}){const[a,u]=ue.useState(n),[h,d]=ue.useState(n.apiKey??"");return ue.useEffect(()=>{u(n),d(n.apiKey??"")},[n]),N.jsx("div",{className:"modal-backdrop",children:N.jsxs("section",{className:"translation-settings-modal",role:"dialog","aria-modal":"true","aria-label":"Translation Settings",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h2",{children:"Translation Settings"}),N.jsx("p",{children:"Use an OpenAI-compatible endpoint for the embedded translation panel."})]}),N.jsx("button",{type:"button",onClick:f,children:"Close"})]}),N.jsxs("div",{className:"translation-settings-grid",children:[N.jsxs("label",{children:[N.jsx("span",{children:"Base URL"}),N.jsx("input",{value:a.baseUrl,onChange:c=>u({...a,baseUrl:c.target.value}),placeholder:"https://api.openai.com/v1"})]}),N.jsxs("label",{children:[N.jsx("span",{children:"API key"}),N.jsx("input",{value:h,onChange:c=>d(c.target.value),placeholder:"API key",autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,type:"text"})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Model"}),N.jsx("input",{value:a.model,onChange:c=>u({...a,model:c.target.value})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Target language"}),N.jsx("input",{value:a.targetLanguage,onChange:c=>u({...a,targetLanguage:c.target.value})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Use context"}),N.jsx("input",{checked:a.contextEnabled,type:"checkbox",onChange:c=>u({...a,contextEnabled:c.target.checked})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Timeout ms"}),N.jsx("input",{min:3e3,type:"number",value:a.requestTimeoutMs,onChange:c=>u({...a,requestTimeoutMs:Number(c.target.value)})})]}),N.jsxs("label",{children:[N.jsx("span",{children:"Temperature"}),N.jsx("input",{min:0,max:1,step:.1,type:"number",value:a.temperature,onChange:c=>u({...a,temperature:Number(c.target.value)})})]})]}),N.jsxs("section",{className:"translation-prompt-settings",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h3",{children:"Translation Prompts"}),N.jsx("p",{children:"Edit the three cc-pm style prompt slots directly."})]}),N.jsx("button",{type:"button",disabled:r,onClick:()=>u({...a,prompts:void 0}),children:"Reset prompts"})]}),N.jsx("div",{className:"translation-prompt-stack",children:s.map(c=>N.jsxs("label",{children:[N.jsx("span",{children:c.label}),N.jsx("textarea",{value:v2(a,c),onChange:S=>u({...a,prompts:_2(a.prompts,c.key,S.target.value,c.defaultPrompt)})})]},c.key))})]}),o?N.jsx("div",{className:o.ok?"translation-test-result is-ok":"translation-test-result is-error",children:o.ok?`Connection ok: ${o.model} in ${o.elapsedMs}ms`:o.error}):null,N.jsxs("footer",{children:[N.jsx("button",{type:"button",disabled:r,onClick:y,children:"Test Connection"}),N.jsx("button",{type:"button",disabled:r,onClick:()=>void p({...a,enabled:!0,translateOutput:!0,translateUserInput:!0,inputMode:"review-before-send"},h.trim()),children:"Save"})]})]})})}function _2(n,r,s,o){const p={...n??{}};return s.trim()&&s!==o?p[r]=s:delete p[r],Object.keys(p).length>0?p:void 0}function v2(n,r){var s;return((s=n.prompts)==null?void 0:s[r.key])??r.defaultPrompt}function y2({active:n=!0,taskSlug:r,role:s,sessionId:o}){const[p,y]=ue.useState(null),[f,a]=ue.useState([]),[u,h]=ue.useState([]),[d,c]=ue.useState(""),[S,w]=ue.useState(!1),[A,x]=ue.useState(!1),[b,_]=ue.useState(!1),[g,v]=ue.useState("ready"),[k,M]=ue.useState(""),[D,T]=ue.useState(Date.now()),[E,R]=ue.useState(!1),[B,z]=ue.useState(""),[q,F]=ue.useState(!1),[Y,K]=ue.useState([]),[G,X]=ue.useState(),[J,I]=ue.useState(0),[O,j]=ue.useState(0),V=ue.useRef(n),U=ue.useRef(1),ne=ue.useRef(null);ue.useEffect(()=>{V.current=n},[n]),ue.useEffect(()=>{Promise.all([xe.getTranslationSettings(),xe.getTranslationPrompts()]).then(([ge,$e])=>{y(ge),K($e)}).catch(ge=>z(ge.message))},[]),ue.useEffect(()=>{a([]),h([]),z(""),v("ready"),M(""),U.current=1;let ge=!1,$e;const Oe=()=>{ge||($e=window.setTimeout(dt,V.current?200:1e3))},dt=async()=>{if(!ge)try{const Le=await xe.pollTranslationSession(o,U.current);if(ge)return;$(Le.events),U.current=Le.nextCursor,v(Le.status),V.current&&M(D2(new Date().toISOString()))}catch(Le){ge||z(Le instanceof Error?Le.message:"Translation poll failed.")}finally{Oe()}};return xe.startTranslationSession(r,s).then(Le=>{ge||(v(Le.status),U.current=Le.nextCursor,dt())}).catch(Le=>{ge||z(Le instanceof Error?Le.message:"Translation start failed.")}),()=>{ge=!0,$e!==void 0&&window.clearTimeout($e),xe.stopTranslationSession(o).catch(()=>{})}},[o,r,s,J]),ue.useEffect(()=>{if(!n)return;const ge=ne.current;if(!ge)return;const $e=window.requestAnimationFrame(()=>{ge.scrollTop=ge.scrollHeight});return()=>window.cancelAnimationFrame($e)},[n,O]);const _e=C2(f);ue.useEffect(()=>{if(!_e)return;T(Date.now());const ge=window.setInterval(()=>T(Date.now()),250);return()=>window.clearInterval(ge)},[_e]);async function me(ge=!1){if(p){R(!0),z(""),w(!1);try{const $e=await xe.translateUserInput(r,s,{text:d,mode:ge?"auto-send":"review-before-send",useContext:p.contextEnabled,send:ge});_($e.contextUsed),$e.sent?(c(""),w(!1)):(c($e.englishPreview),w(!0))}catch($e){z($e instanceof Error?$e.message:"Translation failed.")}finally{R(!1)}}}function $(ge){if(ge.length===0)return;for(const Oe of ge)Oe.type==="status"?v(Oe.status):Oe.type==="error"?z(Oe.message):Oe.type==="failures"&&h(Oe.failures);const $e=ge.filter(Oe=>Oe.type==="entry");$e.length>0&&(a(Oe=>{const dt=$e.reduce((wt,ae)=>A2(wt,ae.entry),Oe),Le=x2(dt);return Le.removedIds.size>0&&h(wt=>wt.filter(ae=>!Le.removedIds.has(ae.translationId))),Le.entries}),j(Oe=>Oe+1))}async function H(){if(d.trim()){R(!0),z("");try{await xe.sendTranslatedInput(r,s,{englishText:d}),c(""),w(!1),_(!1)}catch(ge){z(ge instanceof Error?ge.message:"Failed to send English input.")}finally{R(!1)}}}function te(ge){ge.key!=="Enter"||ge.shiftKey||ge.nativeEvent.isComposing||(ge.preventDefault(),!E&&d.trim()&&(S?H():me(A)))}async function Z(ge,$e){R(!0),z("");try{const Oe=await xe.updateTranslationSettings({...ge,...$e!==void 0?{apiKey:$e}:{}}),dt=await xe.getTranslationPrompts();y(Oe),K(dt),F(!1),I(Le=>Le+1)}catch(Oe){z(Oe instanceof Error?Oe.message:"Failed to save translation settings.")}finally{R(!1)}}async function fe(){R(!0),z("");try{X(await xe.testTranslationProvider())}catch(ge){z(ge instanceof Error?ge.message:"Provider test failed.")}finally{R(!1)}}async function Se(){a([]),h([]),U.current=1,await xe.clearTranslationSession(o).catch(ge=>z(ge.message))}async function Me(){R(!0),z("");try{const ge=await xe.ignoreTranslationFailures(o);h(ge.failures)}catch(ge){z(ge instanceof Error?ge.message:"Failed to ignore translation failures.")}finally{R(!1)}}async function Ie(){R(!0),z("");try{const ge=await xe.retryTranslationFailures(o);h(ge.failures)}catch(ge){z(ge instanceof Error?ge.message:"Failed to retry translation failures.")}finally{R(!1)}}if(!p)return N.jsx("aside",{className:"translation-panel",children:N.jsx("p",{className:"muted",children:"Loading translation settings..."})});const Ge=w2(f,g,D),Ue=u.length;return N.jsxs("aside",{className:"translation-panel",children:[N.jsxs("header",{className:"translation-panel-header",children:[N.jsxs("div",{className:"translation-panel-titlebar",children:[N.jsx("h2",{children:"Translation"}),N.jsxs("div",{className:"translation-panel-actions",children:[N.jsx("button",{"aria-pressed":A,className:`auto-send-toggle${A?" is-active":""}`,type:"button",onClick:()=>x(ge=>!ge),children:A?"✅ Auto-send":"× Auto-send"}),Ue>0?N.jsxs(N.Fragment,{children:[N.jsxs("button",{type:"button",disabled:E,onClick:()=>void Me(),children:["Ignore ",Ue]}),N.jsxs("button",{type:"button",disabled:E,onClick:()=>void Ie(),children:["Retry ",Ue]})]}):null,N.jsx("button",{type:"button",onClick:()=>F(!0),children:"Settings"}),N.jsx("button",{type:"button",onClick:()=>void Se(),children:"Clear"})]})]}),N.jsxs("div",{className:"translation-status-row",children:[N.jsxs("p",{children:[p.model," · ",Ge,b?" · context used":""]}),N.jsx("p",{children:k?`poll ${k}`:"poll -"})]})]}),B?N.jsx("div",{className:"error-banner",children:B}):null,N.jsxs("div",{className:"translation-entry-list",ref:ne,children:[f.length===0?N.jsx("p",{className:"muted",children:"Translated Claude Code output will appear here."}):null,f.map(ge=>N.jsx(S2,{entry:ge},ge.id))]}),N.jsx("div",{className:"translation-composer",children:N.jsxs("div",{className:"translation-composer-row",children:[N.jsx("textarea",{value:d,onChange:ge=>{c(ge.target.value),ge.target.value.trim()||w(!1)},onKeyDown:te,placeholder:"输入中文,先翻译成英文工程指令..."}),N.jsx("div",{className:"translation-composer-actions",children:N.jsx("button",{type:"button",disabled:E||!S||!d.trim(),onClick:()=>void H(),children:"Send English"})})]})}),q?N.jsx(g2,{settings:p,busy:E,promptPreviews:Y,testResult:G,onSave:Z,onTest:fe,onClose:()=>F(!1)}):null]})}function S2({entry:n}){if(n.sourceKind==="conversation-boundary")return N.jsx(b2,{entry:n});const r=k2(n),s=n.sourceKind==="tool-output",o=n.direction==="user-input-to-english",p=["translation-entry",`is-${n.sourceKind}`,o?"is-user-input":""].filter(Boolean).join(" ");return N.jsxs("article",{className:p,children:[s?N.jsx("pre",{children:r}):N.jsx("div",{className:"translation-markdown",children:N.jsx(tw,{remarkPlugins:[p2],children:r})}),n.warning?N.jsx("p",{className:"translation-entry-note",children:n.warning}):null,n.error?N.jsx("p",{className:"translation-entry-note is-error",children:n.error}):null]})}function b2({entry:n}){const r=n.boundaryKind==="end"?"结束":"开始",s=n.conversationTurn??0,o=R2(n.occurredAt??n.createdAt);return N.jsxs("div",{className:"translation-conversation-boundary","aria-label":`${r} 第 ${s} 轮 ${o}`,children:[N.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"}),N.jsx("span",{children:r}),N.jsxs("span",{children:["第 ",s," 轮"]}),N.jsx("time",{children:o}),N.jsx("span",{className:"translation-boundary-dash","aria-hidden":"true"})]})}function C2(n){const r=n.find(eh);return(r==null?void 0:r.translationStartedAt)??(r==null?void 0:r.createdAt)}function w2(n,r,s){const o=n.find(eh);if(o)return`translating ${T2(Math.max(0,s-E2(o)))}`;const p=n.at(-1);return(p==null?void 0:p.status)==="failed"||r==="failed"?"error":r}function eh(n){return n.status==="queued"||n.status==="translating"}function x2(n){const r=n.length-m2;if(r<=0)return{entries:n,removedIds:new Set};const s=new Set;for(const o of n){if(s.size>=r)break;eh(o)||s.add(o.id)}return s.size===0?{entries:n,removedIds:s}:{entries:n.filter(o=>!s.has(o.id)),removedIds:s}}function E2(n){const r=Date.parse(n.translationStartedAt??n.createdAt);return Number.isFinite(r)?r:Date.now()}function k2(n){return n.status==="queued"||n.status==="translating"?n.sourceText:n.status==="translated"?n.translatedText:n.translatedText||n.sourceText}function A2(n,r){return n.findIndex(o=>o.id===r.id)===-1?[...n,r]:n.map(o=>o.id===r.id?r:o)}function T2(n){if(n<1e3)return`${Math.max(.1,n/1e3).toFixed(1)}s`;const r=n/1e3;if(r<60)return`${r.toFixed(1)}s`;const s=Math.floor(r/60),o=Math.floor(r%60).toString().padStart(2,"0");return`${s}:${o}`}function D2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}function R2(n){const r=new Date(n);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString()}function M2({role:n,session:r,permissionMode:s,model:o,effort:p,active:y=!0,busy:f,orchestrationMode:a,translationEnabled:u,onPermissionModeChange:h,onModelChange:d,onEffortChange:c,onOrchestrationModeChange:S,onStart:w,onResume:A,onStop:x,onRestart:b,onTerminalEvent:_}){const g=a==="auto",v=n==="codex-reviewer";return N.jsxs("section",{className:"session-console",children:[N.jsxs("div",{className:"session-console-top",children:[N.jsx(P1,{role:n,session:r,permissionMode:s,model:o,effort:p,busy:f,onPermissionModeChange:h,onModelChange:d,onEffortChange:c,onStart:w,onResume:A,onStop:x,onRestart:b}),v?null:N.jsx("div",{className:"session-console-actions",children:N.jsx("button",{"aria-label":`Auto orchestration is ${g?"on":"off"}`,"aria-pressed":g,className:`translation-toggle${g?" is-active":""}`,disabled:f,type:"button",onClick:()=>S(g?"manual":"auto"),children:g?"✅ Auto orchestration":"× Auto orchestration"})})]}),(r==null?void 0:r.status)==="running"?N.jsx(L2,{active:y,onTerminalEvent:_,role:n,session:r,taskSlug:r.taskSlug,translationEnabled:!v&&u}):N.jsxs("div",{className:"terminal-empty",children:[N.jsx("strong",{children:n}),N.jsx("span",{children:v?r!=null&&r.claudeSessionId?"Resume this role to reconnect the Codex Reviewer terminal.":"Start this role to open an embedded Codex Reviewer terminal.":r!=null&&r.claudeSessionId?"Resume this role to reconnect its Claude Code conversation.":"Start this role to open an embedded Claude Code terminal."})]})]})}function L2({active:n,onTerminalEvent:r,role:s,session:o,taskSlug:p,translationEnabled:y}){return N.jsxs("div",{className:y?"session-console-body has-translation":"session-console-body",children:[N.jsx("div",{className:"terminal-pane",children:N.jsx(ag,{sessionId:o.id,active:n,onEvent:r},o.id)}),y?N.jsx("div",{className:"translation-pane",children:N.jsx(y2,{active:n,taskSlug:p,role:s,sessionId:o.id},o.id)}):null]})}function O2(n,r,s){var y;if(!n||s.mode!=="auto")return null;const o=new Map(n.map(f=>[f.id,f])),p=r.filter(f=>{var a;return f.dispatchingAt?((a=o.get(f.id))==null?void 0:a.dispatchingAt)!==f.dispatchingAt:!1});return p.length===0?null:((y=p.sort(B2)[p.length-1])==null?void 0:y.toRole)??null}function B2(n,r){const s=n.dispatchingAt??n.deliveredAt??n.acceptedAt??"",o=r.dispatchingAt??r.deliveredAt??r.acceptedAt??"";return s!==o?s.localeCompare(o):n.createdAt.localeCompare(r.createdAt)}const N2=2e3;function j2({task:n,activeRole:r,codexReviewerEnabled:s,translationEnabled:o,refreshNonce:p=0,onTaskChanged:y,onActiveRoleChange:f,onTranslationEnabledChange:a,onMessagesChanged:u,onOrchestrationChanged:h,onRoundStateChanged:d,onEventsChanged:c,onLaunchStateChanged:S}){const[w,A]=ue.useState(null),[x,b]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"default"}),[_,g]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"gpt-5.5"}),[v,k]=ue.useState({"project-manager":"default",architect:"default",coder:"default",reviewer:"default","codex-reviewer":"xhigh"}),[M,D]=ue.useState(!1),[T,E]=ue.useState(""),[R,B]=ue.useState([]),[z,q]=ue.useState(null),F=ue.useRef(null),Y=!!(w!=null&&w.sessions.some($=>$.role==="codex-reviewer")),K=s||Y,G=K?[...er,sg]:er,X=ue.useCallback(($,H)=>{var fe;const te=((fe=F.current)==null?void 0:fe.taskSlug)===n.taskSlug?F.current.messages:null,Z=O2(te,$,H);F.current={taskSlug:n.taskSlug,messages:$},q(H),u==null||u($),h==null||h(H),Z&&(f(Z),V(`auto switched to ${Z} before VCM dispatch`))},[f,u,h,n.taskSlug]),J=ue.useCallback(($,H,te,Z)=>{A($),X(H,te),d==null||d(Z)},[X,d]),I=ue.useCallback(async()=>{const[$,H,te,Z]=await Promise.all([xe.getTaskStatus(n.taskSlug),xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug),xe.getSessionRoundState(n.taskSlug)]);J($,H,te,Z)},[J,n.taskSlug]);ue.useEffect(()=>{I().catch($=>E($.message))},[I,p]),ue.useEffect(()=>{B([]),c==null||c([])},[c,n.taskSlug]),ue.useEffect(()=>{w&&!K&&r==="codex-reviewer"&&f("project-manager")},[r,K,f,w]),ue.useEffect(()=>{b($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[])te[Z.role]!==Z.permissionMode&&(te[Z.role]=Z.permissionMode,H=!0);return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{g($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[]){const fe=Z.model??"default";te[Z.role]!==fe&&(te[Z.role]=fe,H=!0)}return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{k($=>{let H=!1;const te={...$};for(const Z of(w==null?void 0:w.sessions)??[]){const fe=Z.effort??"default";te[Z.role]!==fe&&(te[Z.role]=fe,H=!0)}return H?te:$})},[w==null?void 0:w.sessions]),ue.useEffect(()=>{const $=(w==null?void 0:w.sessions)??[],H=$.filter(fe=>fe.role!=="codex-reviewer"),te=new Set(H.map(fe=>fe.role)),Z={};for(const fe of er)Z[fe.name]={permissionMode:x[fe.name],model:_[fe.name],effort:v[fe.name]};S==null||S({taskSlug:n.taskSlug,roles:Z,autoOrchestration:((z==null?void 0:z.mode)??"auto")==="auto",translationEnabled:o,statusLoaded:!!w,sessionCount:$.length,hasAnySession:$.length>0,allRolesHaveSession:er.every(fe=>te.has(fe.name))})},[_,v,S,z==null?void 0:z.mode,x,w,n.taskSlug,o]),ue.useEffect(()=>{const $=window.setInterval(()=>{Promise.all([xe.getTaskStatus(n.taskSlug),xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug),xe.getSessionRoundState(n.taskSlug)]).then(([H,te,Z,fe])=>{J(H,te,Z,fe)}).catch(H=>E(H.message))},3e3);return()=>window.clearInterval($)},[J,n.taskSlug]),ue.useEffect(()=>{let $=!1,H=!1;const te=window.setInterval(()=>{H||(H=!0,Promise.all([xe.listMessages(n.taskSlug),xe.getOrchestrationState(n.taskSlug)]).then(([Z,fe])=>{$||X(Z,fe)}).catch(Z=>{$||E(Z.message)}).finally(()=>{H=!1}))},N2);return()=>{$=!0,window.clearInterval(te)}},[X,n.taskSlug]);async function O($){D(!0),E("");try{await $(),await I(),await y()}catch(H){E(H instanceof Error?H.message:"Action failed.")}finally{D(!1)}}async function j(){const $=n.worktreePath?[`Close task "${n.taskSlug}"?`,"","This is destructive:","- stops VCM-managed running role sessions for this task",`- deletes the task worktree: ${n.worktreePath}`,`- deletes the Git branch: ${n.branch}`,"- deletes VCM task/session/message/orchestration state","","VCM will not check running sessions or uncommitted changes before closing."].join(`
91
91
  `):[`Close task "${n.taskSlug}"?`,"","This task was created without a separate worktree/branch.","VCM will stop VCM-managed running role sessions for this task.","VCM will delete task/session/message/orchestration state only.","","VCM will not check running sessions or uncommitted changes before closing."].join(`
92
- `);if(window.confirm($)){D(!0),E("");try{await xe.cleanupTask(n.taskSlug,{force:!0,deleteBranch:!!n.worktreePath,forceDeleteBranch:!0}),V(`closed ${n.taskSlug}`),await y()}catch(te){E(te instanceof Error?te.message:"Close task failed.")}finally{D(!1)}}}function V($){B(H=>{const te=[...H,`${new Date().toLocaleTimeString()} ${$}`];return c==null||c(te),te})}function U($,H){b(te=>({...te,[$]:H}))}function ne($,H){g(te=>({...te,[$]:H}))}function _e($,H){k(te=>({...te,[$]:H}))}async function me($){D(!0),E("");try{const H=await xe.updateOrchestrationState(n.taskSlug,{mode:$});q(H),h==null||h(H),V(`auto orchestration ${$==="auto"?"enabled":"disabled"}`)}catch(H){E(H instanceof Error?H.message:"Failed to update orchestration mode.")}finally{D(!1)}}return N.jsxs("div",{className:"task-workspace",children:[N.jsxs("header",{className:"workspace-header",children:[N.jsx("div",{className:"workspace-title-line",children:N.jsx("h1",{children:n.title||n.taskSlug})}),N.jsx(I1,{activeRole:r,roles:G,sessions:(w==null?void 0:w.sessions)??[],onSelect:f}),N.jsxs("div",{className:"workspace-header-actions",children:[N.jsx("button",{"aria-pressed":o,className:`translation-toggle${o?" is-active":""}`,type:"button",onClick:()=>a(!o),children:o?"✅ Translate":"× Translate"}),N.jsx("button",{className:"danger-button",type:"button",disabled:M,onClick:()=>void j(),children:"Close Task"})]})]}),T?N.jsx("div",{className:"error-banner",children:T}):null,N.jsx("div",{className:"workspace-grid",children:N.jsx("div",{className:"workspace-main",children:N.jsx("div",{className:"role-console-stack",children:G.map($=>{const H=$.name,te=H===r,Z=ug((w==null?void 0:w.sessions)??[],H);return N.jsx("div",{className:te?"role-console-panel is-active":"role-console-panel","aria-hidden":!te,children:N.jsx(M2,{role:H,session:Z,permissionMode:x[H],model:_[H],effort:v[H],active:te,busy:M,orchestrationMode:(z==null?void 0:z.mode)??"auto",translationEnabled:o,onPermissionModeChange:fe=>U(H,fe),onModelChange:fe=>ne(H,fe),onEffortChange:fe=>_e(H,fe),onOrchestrationModeChange:fe=>void me(fe),onStart:()=>void O(async()=>{await xe.startRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`started ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onResume:()=>void O(async()=>{await xe.resumeRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`resumed ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onStop:()=>void O(async()=>{await xe.stopRoleSession(n.taskSlug,H),V(`stopped ${H}`)}),onRestart:()=>void O(async()=>{await xe.restartRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`restarted ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onTerminalEvent:fe=>V(`${$.label}: ${fe}`)})},H)})})})})]})}const j2=120*1e3,eg=1400,z2=3;function H2(){const[n,r]=ue.useState(null),[s,o]=ue.useState([]),[p,y]=ue.useState(null),[f,a]=ue.useState(null),[u,h]=ue.useState(null),[d,c]=ue.useState(null),[S,w]=ue.useState(null),[A,x]=ue.useState(null),[b,_]=ue.useState(!1),[g,v]=ue.useState([]),[k,M]=ue.useState(null),[D,T]=ue.useState(null),[E,R]=ue.useState(null),[B,z]=ue.useState(null),[q,F]=ue.useState(null),[Y,K]=ue.useState(null),[G,X]=ue.useState("project-manager"),[J,I]=ue.useState("system"),[O,j]=ue.useState(!0),[V,U]=ue.useState("off"),[ne,_e]=ue.useState(()=>J0()),[me,$]=ue.useState(null),[H,te]=ue.useState({}),[Z,fe]=ue.useState(0),[Se,Me]=ue.useState(null),[Ie,Ge]=ue.useState(!1),[Ue,ge]=ue.useState(!1),[$e,Oe]=ue.useState(""),dt=ue.useRef({}),Le=ue.useRef(null),wt=ue.useRef(""),ae=ue.useMemo(()=>t1(g,k),[g,k]),ct=ae?H[ae.taskSlug]??!1:!1,et=(me==null?void 0:me.taskSlug)===(ae==null?void 0:ae.taskSlug)?me:null,ce=!!(et!=null&&et.statusLoaded&&et.allRolesHaveSession),ye=!!(ae&&(et!=null&&et.statusLoaded)&&!et.hasAnySession),Ce=ue.useCallback(le=>{I(le.themeMode),j(le.flowPauseAlerts),U(le.permissionRequestMode),_e(le.launchTemplate)},[]),Ae=ue.useCallback(()=>{Le.current!==null&&(window.clearInterval(Le.current),Le.current=null)},[]),Ne=ue.useCallback((le={})=>{Ae(),le.resetAudio&&V2(),xa(),Le.current=window.setInterval(()=>{xa()},eg)},[Ae]),_t=ue.useCallback(()=>{Ae(),Me(null);let le=1;xa(),Le.current=window.setInterval(()=>{le+=1,xa(),le>=z2&&Le.current!==null&&(window.clearInterval(Le.current),Le.current=null)},eg)},[Ae]),Pe=ue.useCallback((le,be=`manual-${Date.now()}`,St={})=>{Me({id:be,text:le}),Ne(St)},[Ne]),Dt=ue.useCallback(()=>{Ae(),Me(null)},[Ae]),pt=ue.useCallback(()=>{Ae(),Me(null),j(!1)},[Ae]),It=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&T({taskSlug:ae.taskSlug,messages:le})},[ae==null?void 0:ae.taskSlug]),tt=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&R({taskSlug:ae.taskSlug,orchestration:le})},[ae==null?void 0:ae.taskSlug]),Tn=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&z({taskSlug:ae.taskSlug,events:le})},[ae==null?void 0:ae.taskSlug]),tn=ue.useCallback(le=>{if(!(ae!=null&&ae.taskSlug)||le.taskSlug!==ae.taskSlug||(F({taskSlug:le.taskSlug,roundState:le}),le.status!=="stopped"||!le.roundId))return;const be=F2(le);if(dt.current[le.taskSlug]===be||!O)return;const Ot=le.activeRole??"role";P2(le)>=j2?Pe(`No new turn started after ${Ot} stopped.`,be):_t(),dt.current[le.taskSlug]=be},[ae==null?void 0:ae.taskSlug,O,_t,Pe]),ja=ue.useCallback(le=>{$(be=>(be==null?void 0:be.taskSlug)===le.taskSlug&&be.statusLoaded===le.statusLoaded&&be.sessionCount===le.sessionCount&&be.hasAnySession===le.hasAnySession&&be.allRolesHaveSession===le.allRolesHaveSession&&be.autoOrchestration===le.autoOrchestration&&be.translationEnabled===le.translationEnabled&&JSON.stringify(be.roles)===JSON.stringify(le.roles)?be:le)},[]);async function Dn(){const le=await xe.listTasks();return v(le),M(be=>{var St;return be&&le.some(Ot=>Ot.taskSlug===be)?be:((St=le[0])==null?void 0:St.taskSlug)??null}),le}async function jn(){const le=await xe.getHarnessStatus();return y(le),le}async function zn(){const le=await xe.getHarnessBootstrapStatus();return a(le),le}async function wn(){const le=await xe.getGatewayStatus();return c(le),le}async function ir(){const le=await xe.getRecentRepositoryPaths();return o(le),le}async function Hn(le){const[be,St]=await Promise.all([xe.listMessages(le),xe.getOrchestrationState(le)]);T({taskSlug:le,messages:be}),R({taskSlug:le,orchestration:St})}async function Zr(le){const be=await xe.getCodexReviewState(le);return K({taskSlug:le,state:be}),be}ue.useEffect(()=>{Promise.all([xe.getCurrentProject(),xe.getRecentRepositoryPaths(),xe.getAppPreferences(),xe.getGatewayStatus()]).then(async([le,be,St,Ot])=>{r(le),o(be),c(Ot),Ce(St),le&&await Promise.all([Dn(),jn(),zn()])}).catch(le=>Oe(le.message))},[Ce]),ue.useEffect(()=>{const le=window.matchMedia("(prefers-color-scheme: dark)"),be=()=>Ge(le.matches);return be(),le.addEventListener("change",be),()=>le.removeEventListener("change",be)},[]),ue.useEffect(()=>()=>Ae(),[Ae]),ue.useEffect(()=>{const le=J==="system"?Ie?"dark":"light":J;document.documentElement.dataset.theme=le,document.documentElement.dataset.themeMode=J},[Ie,J]),ue.useEffect(()=>{!(d!=null&&d.enabled)||!O||(pt(),xe.updateAppPreferences({flowPauseAlerts:!1}).then(le=>Ce(le)).catch(le=>Oe(le.message)))},[Ce,pt,O,d==null?void 0:d.enabled]),ue.useEffect(()=>{if(!(d!=null&&d.enabled)||!n||!ae)return;const le=`${n.repoRoot}:${ae.taskSlug}`;if(d.currentProjectId===n.repoRoot&&d.currentTaskSlug===ae.taskSlug){wt.current=le;return}wt.current!==le&&(wt.current=le,xe.updateGatewaySettings({currentProjectId:n.repoRoot,currentTaskSlug:ae.taskSlug}).then(be=>c(be)).catch(be=>{wt.current===le&&(wt.current=""),Oe(be.message)}))},[ae==null?void 0:ae.taskSlug,d==null?void 0:d.currentProjectId,d==null?void 0:d.currentTaskSlug,d==null?void 0:d.enabled,n==null?void 0:n.repoRoot]),ue.useEffect(()=>{if(!(ae!=null&&ae.taskSlug)){K(null);return}Zr(ae.taskSlug).catch(le=>Oe(le.message))},[ae==null?void 0:ae.taskSlug]),ue.useEffect(()=>{if(!(ae!=null&&ae.taskSlug))return;const le=ae.taskSlug,be=window.setInterval(()=>{Zr(le).catch(St=>Oe(St.message))},3e3);return()=>window.clearInterval(be)},[ae==null?void 0:ae.taskSlug]);async function mt(le){ge(!0),Oe("");try{await le()}catch(be){Oe(be instanceof Error?be.message:"Action failed.")}finally{ge(!1)}}const Jr=D&&D.taskSlug===(ae==null?void 0:ae.taskSlug)?D.messages:[],Ni=E&&E.taskSlug===(ae==null?void 0:ae.taskSlug)?E.orchestration:null,za=B&&B.taskSlug===(ae==null?void 0:ae.taskSlug)?B.events:[],ll=q&&q.taskSlug===(ae==null?void 0:ae.taskSlug)?q.roundState:null,rr=Y&&Y.taskSlug===(ae==null?void 0:ae.taskSlug)?Y.state:null,es=!!(rr&&Object.values(rr.gates).some(le=>le.required));return N.jsxs(e1,{sidebar:N.jsx(A1,{project:n,recentRepositoryPaths:s,tasks:g,activeTaskSlug:(ae==null?void 0:ae.taskSlug)??null,messages:Jr,orchestration:Ni,events:za,roundState:ll,codexReview:rr,harnessStatus:p,harnessBootstrapStatus:f,harnessApplyResult:u,gatewayStatus:d,gatewayQrLogin:S,gatewayQrCheck:A,busy:Ue,onConnect:le=>mt(async()=>{const be=await xe.connectProject({repoPath:le});r(be),h(null),await Promise.all([Dn(),jn(),zn(),ir()])}),onRefreshConnectedRepository:()=>mt(async()=>{const le=await xe.getCurrentProject();r(le)}),onPullConnectedRepository:()=>mt(async()=>{const le=await xe.pullCurrentProject();r(le)}),onRefreshHarness:()=>mt(async()=>{h(null),await Promise.all([jn(),zn()])}),onApplyHarness:()=>mt(async()=>{const le=await xe.applyHarness();h(le),await Promise.all([jn(),zn()])}),onStartHarnessBootstrap:()=>mt(async()=>{const le=await xe.startHarnessBootstrap();a(le.status)}),onRefreshGateway:()=>mt(async()=>{await wn()}),onGatewayEnabledChange:le=>{mt(async()=>{const[be,St]=await Promise.all([xe.updateGatewaySettings({enabled:le,...le&&n?{currentProjectId:n.repoRoot,currentTaskSlug:(ae==null?void 0:ae.taskSlug)??null}:{}}),le?xe.updateAppPreferences({flowPauseAlerts:!1}):Promise.resolve(null)]);St&&Ce(St),le&&pt(),c(be)})},onGatewayTranslationChange:le=>{mt(async()=>{const be=await xe.updateGatewaySettings({translationEnabled:le});c(be)})},onStartGatewayQrLogin:()=>{mt(async()=>{const le=await xe.startGatewayQrLogin();w(le),x(null),_(!0),await wn()})},onResetGatewayBinding:()=>{mt(async()=>{const le=await xe.resetGatewayBinding();c(le),w(null),x(null),_(!1)})},onCodexGateEnabledChange:(le,be)=>{mt(async()=>{if(!ae)throw new Error("Create or select a task before changing Codex Review Gates.");const St=await xe.updateCodexReviewSettings(ae.taskSlug,{gates:{[le]:be}});K({taskSlug:ae.taskSlug,state:St})})},onCreateTask:le=>mt(async()=>{const be=await xe.createTask(le);await Dn(),M(be.taskSlug),await Zr(be.taskSlug)}),onSelectTask:M,themeMode:J,onThemeModeChange:le=>{I(le),mt(async()=>{const be=await xe.updateAppPreferences({themeMode:le});Ce(be)})},flowPauseAlerts:O,onFlowPauseAlertsChange:le=>{if(d!=null&&d.enabled){pt();return}j(le),le&&q2(),mt(async()=>{const be=await xe.updateAppPreferences({flowPauseAlerts:le});Ce(be)})},permissionRequestMode:V,onPermissionRequestModeChange:le=>{U(le),mt(async()=>{const be=await xe.updateAppPreferences({permissionRequestMode:le});Ce(be)})},launchTemplate:ne,canSaveLaunchTemplate:ce,canOneClickStart:ye,onSaveLaunchTemplate:()=>{mt(async()=>{if(!(et!=null&&et.allRolesHaveSession))throw new Error("Start all four role sessions before saving a launch template.");const le=await xe.updateAppPreferences({launchTemplate:{version:1,roles:et.roles,autoOrchestration:et.autoOrchestration,translationEnabled:et.translationEnabled}});Ce(le)})},onOneClickStart:()=>{mt(async()=>{if(!ae)throw new Error("Create or select a task before one-click start.");if((await xe.getTaskStatus(ae.taskSlug)).sessions.length>0)throw new Error("One-click start is only available before any role session has started.");te(Ot=>({...Ot,[ae.taskSlug]:ne.translationEnabled}));const be=await xe.updateOrchestrationState(ae.taskSlug,{mode:ne.autoOrchestration?"auto":"manual"});R({taskSlug:ae.taskSlug,orchestration:be});const St=i1(ne,{codexReviewerEnabled:es});for(const Ot of St)await xe.startRoleSession(ae.taskSlug,Ot.role,{cols:100,rows:28,permissionMode:Ot.permissionMode,model:Ot.model,effort:Ot.effort});X("project-manager"),await Hn(ae.taskSlug),await Dn(),fe(Ot=>Ot+1)})},onTryFlowPauseAlert:()=>{Pe("This is a test flow pause alert.",void 0,{resetAudio:!0})},onMarkAllMessagesDone:le=>{mt(async()=>{const be=await xe.markAllMessagesDone(le);T({taskSlug:le,messages:be.messages}),await Hn(le)})},onDeleteMessageHistory:le=>{mt(async()=>{const be=await xe.deleteMessageHistory(le);T({taskSlug:le,messages:be.messages}),await Hn(le)})}}),children:[$e?N.jsx("div",{className:"error-banner",children:$e}):null,Se?N.jsx("div",{className:"flow-pause-alert-backdrop",children:N.jsxs("section",{"aria-describedby":"flow-pause-alert-body flow-pause-alert-hint","aria-labelledby":"flow-pause-alert-title","aria-modal":"true",className:"flow-pause-alert",role:"alertdialog",children:[N.jsx("p",{className:"flow-pause-alert-kicker",children:"VCM needs attention"}),N.jsx("h2",{id:"flow-pause-alert-title",children:"Flow needs attention"}),N.jsx("p",{id:"flow-pause-alert-body",children:Se.text}),N.jsx("p",{id:"flow-pause-alert-hint",className:"flow-pause-alert-hint",children:"The task may be complete, waiting for your decision, or blocked by a workflow issue."}),N.jsx("button",{type:"button",autoFocus:!0,onClick:Dt,children:"Confirm"})]})}):null,b&&S?N.jsx(I2,{busy:Ue,qrCheck:A,qrLogin:S,onCheck:()=>{mt(async()=>{const le=await xe.checkGatewayQrLogin();x(le),(le.status==="confirmed"||le.status==="binded_redirect")&&_(!1),await wn()})},onClose:()=>_(!1)}):null,n&&ae?N.jsx(N2,{task:ae,activeRole:G,codexReviewerEnabled:es,translationEnabled:ct,refreshNonce:Z,onTaskChanged:async()=>{await Dn()},onActiveRoleChange:X,onTranslationEnabledChange:le=>{te(be=>({...be,[ae.taskSlug]:le}))},onMessagesChanged:It,onOrchestrationChanged:tt,onRoundStateChanged:tn,onEventsChanged:Tn,onLaunchStateChanged:ja}):N.jsxs("section",{className:"empty-workspace",children:[N.jsx("h1",{children:n?"Create a task to open the workspace":"Connect a repository to begin"}),N.jsx("p",{children:n?"Tasks create local role commands, logs, and handoff artifacts for the selected repository.":"VibeCodingMaster will create a local task workspace, role sessions, logs, and handoff artifacts."})]})]})}function I2({busy:n,onCheck:r,onClose:s,qrCheck:o,qrLogin:p}){const[y,f]=ue.useState(""),[a,u]=ue.useState("");return ue.useEffect(()=>{let h=!1;if(u(""),f(""),p.qrcodeUrl.startsWith("data:image/")){f(p.qrcodeUrl);return}try{const d=Wr(0,"M");d.addData(p.qrcodeUrl),d.make(),h||f(d.createDataURL(8,2))}catch(d){h||u(d instanceof Error?d.message:"Failed to render QR code.")}return()=>{h=!0}},[p.qrcodeUrl]),N.jsx("div",{className:"modal-backdrop",children:N.jsxs("section",{"aria-labelledby":"gateway-qr-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h2",{id:"gateway-qr-title",children:"Weixin Gateway Login"}),N.jsx("p",{className:"muted",children:"Scan with Weixin, confirm on the phone, then click Confirm."})]}),N.jsx("button",{type:"button",onClick:s,children:"Close"})]}),N.jsxs("div",{className:"gateway-qr-modal-body",children:[N.jsx("div",{className:"gateway-qr-code-frame",children:y?N.jsx("img",{alt:"Weixin Gateway QR login",src:y}):N.jsx("div",{className:"gateway-qr-placeholder",children:a||"Rendering QR code..."})}),N.jsxs("dl",{className:"gateway-qr-meta",children:[N.jsxs("div",{children:[N.jsx("dt",{children:"Status"}),N.jsx("dd",{children:(o==null?void 0:o.status)??p.status})]}),N.jsxs("div",{children:[N.jsx("dt",{children:"Expires"}),N.jsx("dd",{children:U2(p.expiresAt)})]}),o!=null&&o.message?N.jsxs("div",{children:[N.jsx("dt",{children:"Message"}),N.jsx("dd",{children:o.message})]}):null]})]}),N.jsx("footer",{children:N.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})})]})})}function U2(n){const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(r)}let Oi=null;function P2(n){const r=Date.parse(n.startedAt??""),s=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!Number.isFinite(r)||!Number.isFinite(s)?0:Math.max(0,s-r)}function F2(n){const r=n.roundId??n.startedAt??n.taskSlug,s=n.stoppedAt??n.lastTurnEndedAt??"stopped";return`${r}:${s}`}async function q2(){const n=v_();return n?y_(n):!1}async function xa(){const n=v_();if(!n||!await y_(n))return!1;try{const s=n.createGain(),o=n.currentTime+.025;return s.gain.setValueAtTime(.85,n.currentTime),s.connect(n.destination),ng(n,s,{frequency:587.33,startAt:o,duration:.18,peakGain:.045}),ng(n,s,{frequency:783.99,startAt:o+.11,duration:.28,peakGain:.055}),window.setTimeout(()=>{s.disconnect()},800),!0}catch{return!1}}function v_(){const n=window.AudioContext??window.webkitAudioContext;if(!n)return null;try{return(!Oi||Oi.state==="closed")&&(Oi=new n),Oi}catch{return null}}function V2(){Lc(Oi)}function Lc(n){Oi=null,n&&n.state!=="closed"&&n.close().catch(()=>{})}async function y_(n){if(tg(n))return!0;try{await n.resume();const r=tg(n);return!r&&n===Oi&&Lc(n),r}catch{return n===Oi&&Lc(n),!1}}function tg(n){return n.state==="running"}function ng(n,r,s){const o=n.createGain(),p=n.createOscillator(),y=n.createOscillator(),f=s.startAt+s.duration;o.gain.setValueAtTime(1e-4,s.startAt),o.gain.exponentialRampToValueAtTime(s.peakGain,s.startAt+.018),o.gain.exponentialRampToValueAtTime(1e-4,f),p.type="sine",p.frequency.setValueAtTime(s.frequency,s.startAt),y.type="triangle",y.frequency.setValueAtTime(s.frequency*2.01,s.startAt),p.connect(o),y.connect(o),o.connect(r),p.start(s.startAt),y.start(s.startAt),p.stop(f+.02),y.stop(f+.02)}const S_=document.getElementById("root");if(!S_)throw new Error("Missing #root element.");q0.createRoot(S_).render(N.jsx(ue.StrictMode,{children:N.jsx(H2,{})}));
92
+ `);if(window.confirm($)){D(!0),E("");try{await xe.cleanupTask(n.taskSlug,{force:!0,deleteBranch:!!n.worktreePath,forceDeleteBranch:!0}),V(`closed ${n.taskSlug}`),await y()}catch(te){E(te instanceof Error?te.message:"Close task failed.")}finally{D(!1)}}}function V($){B(H=>{const te=[...H,`${new Date().toLocaleTimeString()} ${$}`];return c==null||c(te),te})}function U($,H){b(te=>({...te,[$]:H}))}function ne($,H){g(te=>({...te,[$]:H}))}function _e($,H){k(te=>({...te,[$]:H}))}async function me($){D(!0),E("");try{const H=await xe.updateOrchestrationState(n.taskSlug,{mode:$});q(H),h==null||h(H),V(`auto orchestration ${$==="auto"?"enabled":"disabled"}`)}catch(H){E(H instanceof Error?H.message:"Failed to update orchestration mode.")}finally{D(!1)}}return N.jsxs("div",{className:"task-workspace",children:[N.jsxs("header",{className:"workspace-header",children:[N.jsx("div",{className:"workspace-title-line",children:N.jsx("h1",{children:n.title||n.taskSlug})}),N.jsx(I1,{activeRole:r,roles:G,sessions:(w==null?void 0:w.sessions)??[],onSelect:f}),N.jsxs("div",{className:"workspace-header-actions",children:[N.jsx("button",{"aria-pressed":o,className:`translation-toggle${o?" is-active":""}`,type:"button",onClick:()=>a(!o),children:o?"✅ Translate":"× Translate"}),N.jsx("button",{className:"danger-button",type:"button",disabled:M,onClick:()=>void j(),children:"Close Task"})]})]}),T?N.jsx("div",{className:"error-banner",children:T}):null,N.jsx("div",{className:"workspace-grid",children:N.jsx("div",{className:"workspace-main",children:N.jsx("div",{className:"role-console-stack",children:G.map($=>{const H=$.name,te=H===r,Z=ug((w==null?void 0:w.sessions)??[],H);return N.jsx("div",{className:te?"role-console-panel is-active":"role-console-panel","aria-hidden":!te,children:N.jsx(M2,{role:H,session:Z,permissionMode:x[H],model:_[H],effort:v[H],active:te,busy:M,orchestrationMode:(z==null?void 0:z.mode)??"auto",translationEnabled:o,onPermissionModeChange:fe=>U(H,fe),onModelChange:fe=>ne(H,fe),onEffortChange:fe=>_e(H,fe),onOrchestrationModeChange:fe=>void me(fe),onStart:()=>void O(async()=>{await xe.startRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`started ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onResume:()=>void O(async()=>{await xe.resumeRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`resumed ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onStop:()=>void O(async()=>{await xe.stopRoleSession(n.taskSlug,H),V(`stopped ${H}`)}),onRestart:()=>void O(async()=>{await xe.restartRoleSession(n.taskSlug,H,{cols:100,rows:28,permissionMode:x[H],model:_[H],effort:v[H]}),V(`restarted ${H} with ${x[H]} / ${_[H]} / ${v[H]}`)}),onTerminalEvent:fe=>V(`${$.label}: ${fe}`)})},H)})})})})]})}const z2=120*1e3,eg=1400,H2=3;function I2(){const[n,r]=ue.useState(null),[s,o]=ue.useState([]),[p,y]=ue.useState(null),[f,a]=ue.useState(null),[u,h]=ue.useState(null),[d,c]=ue.useState(null),[S,w]=ue.useState(null),[A,x]=ue.useState(null),[b,_]=ue.useState(!1),[g,v]=ue.useState([]),[k,M]=ue.useState(null),[D,T]=ue.useState(null),[E,R]=ue.useState(null),[B,z]=ue.useState(null),[q,F]=ue.useState(null),[Y,K]=ue.useState(null),[G,X]=ue.useState("project-manager"),[J,I]=ue.useState("system"),[O,j]=ue.useState(!0),[V,U]=ue.useState("off"),[ne,_e]=ue.useState(()=>J0()),[me,$]=ue.useState(null),[H,te]=ue.useState({}),[Z,fe]=ue.useState(0),[Se,Me]=ue.useState(null),[Ie,Ge]=ue.useState(!1),[Ue,ge]=ue.useState(!1),[$e,Oe]=ue.useState(""),dt=ue.useRef({}),Le=ue.useRef(null),wt=ue.useRef(""),ae=ue.useMemo(()=>t1(g,k),[g,k]),ct=ae?H[ae.taskSlug]??!1:!1,et=(me==null?void 0:me.taskSlug)===(ae==null?void 0:ae.taskSlug)?me:null,ce=!!(et!=null&&et.statusLoaded&&et.allRolesHaveSession),ye=!!(ae&&(et!=null&&et.statusLoaded)&&!et.hasAnySession),Ce=ue.useCallback(le=>{I(le.themeMode),j(le.flowPauseAlerts),U(le.permissionRequestMode),_e(le.launchTemplate)},[]),Ae=ue.useCallback(()=>{Le.current!==null&&(window.clearInterval(Le.current),Le.current=null)},[]),Ne=ue.useCallback((le={})=>{Ae(),le.resetAudio&&G2(),xa(),Le.current=window.setInterval(()=>{xa()},eg)},[Ae]),_t=ue.useCallback(()=>{Ae(),Me(null);let le=1;xa(),Le.current=window.setInterval(()=>{le+=1,xa(),le>=H2&&Le.current!==null&&(window.clearInterval(Le.current),Le.current=null)},eg)},[Ae]),Pe=ue.useCallback((le,be=`manual-${Date.now()}`,St={})=>{Me({id:be,text:le}),Ne(St)},[Ne]),Dt=ue.useCallback(()=>{Ae(),Me(null)},[Ae]),pt=ue.useCallback(()=>{Ae(),Me(null),j(!1)},[Ae]),It=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&T({taskSlug:ae.taskSlug,messages:le})},[ae==null?void 0:ae.taskSlug]),tt=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&R({taskSlug:ae.taskSlug,orchestration:le})},[ae==null?void 0:ae.taskSlug]),Tn=ue.useCallback(le=>{ae!=null&&ae.taskSlug&&z({taskSlug:ae.taskSlug,events:le})},[ae==null?void 0:ae.taskSlug]),tn=ue.useCallback(le=>{if(!(ae!=null&&ae.taskSlug)||le.taskSlug!==ae.taskSlug||(F({taskSlug:le.taskSlug,roundState:le}),le.status!=="stopped"||!le.roundId))return;const be=q2(le);if(dt.current[le.taskSlug]===be||!O)return;const Ot=le.activeRole??"role";F2(le)>=z2?Pe(`No new turn started after ${Ot} stopped.`,be):_t(),dt.current[le.taskSlug]=be},[ae==null?void 0:ae.taskSlug,O,_t,Pe]),ja=ue.useCallback(le=>{$(be=>(be==null?void 0:be.taskSlug)===le.taskSlug&&be.statusLoaded===le.statusLoaded&&be.sessionCount===le.sessionCount&&be.hasAnySession===le.hasAnySession&&be.allRolesHaveSession===le.allRolesHaveSession&&be.autoOrchestration===le.autoOrchestration&&be.translationEnabled===le.translationEnabled&&JSON.stringify(be.roles)===JSON.stringify(le.roles)?be:le)},[]);async function Dn(){const le=await xe.listTasks();return v(le),M(be=>{var St;return be&&le.some(Ot=>Ot.taskSlug===be)?be:((St=le[0])==null?void 0:St.taskSlug)??null}),le}async function jn(){const le=await xe.getHarnessStatus();return y(le),le}async function zn(){const le=await xe.getHarnessBootstrapStatus();return a(le),le}async function wn(){const le=await xe.getGatewayStatus();return c(le),le}async function ir(){const le=await xe.getRecentRepositoryPaths();return o(le),le}async function Hn(le){const[be,St]=await Promise.all([xe.listMessages(le),xe.getOrchestrationState(le)]);T({taskSlug:le,messages:be}),R({taskSlug:le,orchestration:St})}async function Zr(le){const be=await xe.getCodexReviewState(le);return K({taskSlug:le,state:be}),be}ue.useEffect(()=>{Promise.all([xe.getCurrentProject(),xe.getRecentRepositoryPaths(),xe.getAppPreferences(),xe.getGatewayStatus()]).then(async([le,be,St,Ot])=>{r(le),o(be),c(Ot),Ce(St),le&&await Promise.all([Dn(),jn(),zn()])}).catch(le=>Oe(le.message))},[Ce]),ue.useEffect(()=>{const le=window.matchMedia("(prefers-color-scheme: dark)"),be=()=>Ge(le.matches);return be(),le.addEventListener("change",be),()=>le.removeEventListener("change",be)},[]),ue.useEffect(()=>()=>Ae(),[Ae]),ue.useEffect(()=>{const le=J==="system"?Ie?"dark":"light":J;document.documentElement.dataset.theme=le,document.documentElement.dataset.themeMode=J},[Ie,J]),ue.useEffect(()=>{!(d!=null&&d.enabled)||!O||(pt(),xe.updateAppPreferences({flowPauseAlerts:!1}).then(le=>Ce(le)).catch(le=>Oe(le.message)))},[Ce,pt,O,d==null?void 0:d.enabled]),ue.useEffect(()=>{if(!(d!=null&&d.enabled)||!n||!ae)return;const le=`${n.repoRoot}:${ae.taskSlug}`;if(d.currentProjectId===n.repoRoot&&d.currentTaskSlug===ae.taskSlug){wt.current=le;return}wt.current!==le&&(wt.current=le,xe.updateGatewaySettings({currentProjectId:n.repoRoot,currentTaskSlug:ae.taskSlug}).then(be=>c(be)).catch(be=>{wt.current===le&&(wt.current=""),Oe(be.message)}))},[ae==null?void 0:ae.taskSlug,d==null?void 0:d.currentProjectId,d==null?void 0:d.currentTaskSlug,d==null?void 0:d.enabled,n==null?void 0:n.repoRoot]),ue.useEffect(()=>{if(!(ae!=null&&ae.taskSlug)){K(null);return}Zr(ae.taskSlug).catch(le=>Oe(le.message))},[ae==null?void 0:ae.taskSlug]),ue.useEffect(()=>{if(!(ae!=null&&ae.taskSlug))return;const le=ae.taskSlug,be=window.setInterval(()=>{Zr(le).catch(St=>Oe(St.message))},3e3);return()=>window.clearInterval(be)},[ae==null?void 0:ae.taskSlug]);async function mt(le){ge(!0),Oe("");try{await le()}catch(be){Oe(be instanceof Error?be.message:"Action failed.")}finally{ge(!1)}}const Jr=D&&D.taskSlug===(ae==null?void 0:ae.taskSlug)?D.messages:[],Ni=E&&E.taskSlug===(ae==null?void 0:ae.taskSlug)?E.orchestration:null,za=B&&B.taskSlug===(ae==null?void 0:ae.taskSlug)?B.events:[],ll=q&&q.taskSlug===(ae==null?void 0:ae.taskSlug)?q.roundState:null,rr=Y&&Y.taskSlug===(ae==null?void 0:ae.taskSlug)?Y.state:null,es=!!(rr&&Object.values(rr.gates).some(le=>le.required));return N.jsxs(e1,{sidebar:N.jsx(A1,{project:n,recentRepositoryPaths:s,tasks:g,activeTaskSlug:(ae==null?void 0:ae.taskSlug)??null,messages:Jr,orchestration:Ni,events:za,roundState:ll,codexReview:rr,harnessStatus:p,harnessBootstrapStatus:f,harnessApplyResult:u,gatewayStatus:d,gatewayQrLogin:S,gatewayQrCheck:A,busy:Ue,onConnect:le=>mt(async()=>{const be=await xe.connectProject({repoPath:le});r(be),h(null),await Promise.all([Dn(),jn(),zn(),ir()])}),onRefreshConnectedRepository:()=>mt(async()=>{const le=await xe.getCurrentProject();r(le)}),onPullConnectedRepository:()=>mt(async()=>{const le=await xe.pullCurrentProject();r(le)}),onRefreshHarness:()=>mt(async()=>{h(null),await Promise.all([jn(),zn()])}),onApplyHarness:()=>mt(async()=>{const le=await xe.applyHarness();h(le),await Promise.all([jn(),zn()])}),onStartHarnessBootstrap:()=>mt(async()=>{const le=await xe.startHarnessBootstrap();a(le.status)}),onRefreshGateway:()=>mt(async()=>{await wn()}),onGatewayEnabledChange:le=>{mt(async()=>{const[be,St]=await Promise.all([xe.updateGatewaySettings({enabled:le,...le&&n?{currentProjectId:n.repoRoot,currentTaskSlug:(ae==null?void 0:ae.taskSlug)??null}:{}}),le?xe.updateAppPreferences({flowPauseAlerts:!1}):Promise.resolve(null)]);St&&Ce(St),le&&pt(),c(be)})},onGatewayTranslationChange:le=>{mt(async()=>{const be=await xe.updateGatewaySettings({translationEnabled:le});c(be)})},onStartGatewayQrLogin:()=>{mt(async()=>{const le=await xe.startGatewayQrLogin();w(le),x(null),_(!0),await wn()})},onResetGatewayBinding:()=>{mt(async()=>{const le=await xe.resetGatewayBinding();c(le),w(null),x(null),_(!1)})},onCodexGateEnabledChange:(le,be)=>{mt(async()=>{if(!ae)throw new Error("Create or select a task before changing Codex Review Gates.");const St=await xe.updateCodexReviewSettings(ae.taskSlug,{gates:{[le]:be}});K({taskSlug:ae.taskSlug,state:St})})},onCreateTask:le=>mt(async()=>{const be=await xe.createTask(le);await Dn(),M(be.taskSlug),await Zr(be.taskSlug)}),onSelectTask:M,themeMode:J,onThemeModeChange:le=>{I(le),mt(async()=>{const be=await xe.updateAppPreferences({themeMode:le});Ce(be)})},flowPauseAlerts:O,onFlowPauseAlertsChange:le=>{if(d!=null&&d.enabled){pt();return}j(le),le&&V2(),mt(async()=>{const be=await xe.updateAppPreferences({flowPauseAlerts:le});Ce(be)})},permissionRequestMode:V,onPermissionRequestModeChange:le=>{U(le),mt(async()=>{const be=await xe.updateAppPreferences({permissionRequestMode:le});Ce(be)})},launchTemplate:ne,canSaveLaunchTemplate:ce,canOneClickStart:ye,onSaveLaunchTemplate:()=>{mt(async()=>{if(!(et!=null&&et.allRolesHaveSession))throw new Error("Start all four role sessions before saving a launch template.");const le=await xe.updateAppPreferences({launchTemplate:{version:1,roles:et.roles,autoOrchestration:et.autoOrchestration,translationEnabled:et.translationEnabled}});Ce(le)})},onOneClickStart:()=>{mt(async()=>{if(!ae)throw new Error("Create or select a task before one-click start.");if((await xe.getTaskStatus(ae.taskSlug)).sessions.length>0)throw new Error("One-click start is only available before any role session has started.");te(Ot=>({...Ot,[ae.taskSlug]:ne.translationEnabled}));const be=await xe.updateOrchestrationState(ae.taskSlug,{mode:ne.autoOrchestration?"auto":"manual"});R({taskSlug:ae.taskSlug,orchestration:be});const St=i1(ne,{codexReviewerEnabled:es});for(const Ot of St)await xe.startRoleSession(ae.taskSlug,Ot.role,{cols:100,rows:28,permissionMode:Ot.permissionMode,model:Ot.model,effort:Ot.effort});X("project-manager"),await Hn(ae.taskSlug),await Dn(),fe(Ot=>Ot+1)})},onTryFlowPauseAlert:()=>{Pe("This is a test flow pause alert.",void 0,{resetAudio:!0})},onMarkAllMessagesDone:le=>{mt(async()=>{const be=await xe.markAllMessagesDone(le);T({taskSlug:le,messages:be.messages}),await Hn(le)})},onDeleteMessageHistory:le=>{mt(async()=>{const be=await xe.deleteMessageHistory(le);T({taskSlug:le,messages:be.messages}),await Hn(le)})}}),children:[$e?N.jsx("div",{className:"error-banner",children:$e}):null,Se?N.jsx("div",{className:"flow-pause-alert-backdrop",children:N.jsxs("section",{"aria-describedby":"flow-pause-alert-body flow-pause-alert-hint","aria-labelledby":"flow-pause-alert-title","aria-modal":"true",className:"flow-pause-alert",role:"alertdialog",children:[N.jsx("p",{className:"flow-pause-alert-kicker",children:"VCM needs attention"}),N.jsx("h2",{id:"flow-pause-alert-title",children:"Flow needs attention"}),N.jsx("p",{id:"flow-pause-alert-body",children:Se.text}),N.jsx("p",{id:"flow-pause-alert-hint",className:"flow-pause-alert-hint",children:"The task may be complete, waiting for your decision, or blocked by a workflow issue."}),N.jsx("button",{type:"button",autoFocus:!0,onClick:Dt,children:"Confirm"})]})}):null,b&&S?N.jsx(U2,{busy:Ue,qrCheck:A,qrLogin:S,onCheck:()=>{mt(async()=>{const le=await xe.checkGatewayQrLogin();x(le),(le.status==="confirmed"||le.status==="binded_redirect")&&_(!1),await wn()})},onClose:()=>_(!1)}):null,n&&ae?N.jsx(j2,{task:ae,activeRole:G,codexReviewerEnabled:es,translationEnabled:ct,refreshNonce:Z,onTaskChanged:async()=>{await Dn()},onActiveRoleChange:X,onTranslationEnabledChange:le=>{te(be=>({...be,[ae.taskSlug]:le}))},onMessagesChanged:It,onOrchestrationChanged:tt,onRoundStateChanged:tn,onEventsChanged:Tn,onLaunchStateChanged:ja}):N.jsxs("section",{className:"empty-workspace",children:[N.jsx("h1",{children:n?"Create a task to open the workspace":"Connect a repository to begin"}),N.jsx("p",{children:n?"Tasks create local role commands, logs, and handoff artifacts for the selected repository.":"VibeCodingMaster will create a local task workspace, role sessions, logs, and handoff artifacts."})]})]})}function U2({busy:n,onCheck:r,onClose:s,qrCheck:o,qrLogin:p}){const[y,f]=ue.useState(""),[a,u]=ue.useState("");return ue.useEffect(()=>{let h=!1;if(u(""),f(""),p.qrcodeUrl.startsWith("data:image/")){f(p.qrcodeUrl);return}try{const d=Wr(0,"M");d.addData(p.qrcodeUrl),d.make(),h||f(d.createDataURL(8,2))}catch(d){h||u(d instanceof Error?d.message:"Failed to render QR code.")}return()=>{h=!0}},[p.qrcodeUrl]),N.jsx("div",{className:"modal-backdrop",children:N.jsxs("section",{"aria-labelledby":"gateway-qr-title","aria-modal":"true",className:"gateway-qr-modal",role:"dialog",children:[N.jsxs("header",{children:[N.jsxs("div",{children:[N.jsx("h2",{id:"gateway-qr-title",children:"Weixin Gateway Login"}),N.jsx("p",{className:"muted",children:"Scan with Weixin, confirm on the phone, then click Confirm."})]}),N.jsx("button",{type:"button",onClick:s,children:"Close"})]}),N.jsxs("div",{className:"gateway-qr-modal-body",children:[N.jsx("div",{className:"gateway-qr-code-frame",children:y?N.jsx("img",{alt:"Weixin Gateway QR login",src:y}):N.jsx("div",{className:"gateway-qr-placeholder",children:a||"Rendering QR code..."})}),N.jsxs("dl",{className:"gateway-qr-meta",children:[N.jsxs("div",{children:[N.jsx("dt",{children:"Status"}),N.jsx("dd",{children:(o==null?void 0:o.status)??p.status})]}),N.jsxs("div",{children:[N.jsx("dt",{children:"Expires"}),N.jsx("dd",{children:P2(p.expiresAt)})]}),o!=null&&o.message?N.jsxs("div",{children:[N.jsx("dt",{children:"Message"}),N.jsx("dd",{children:o.message})]}):null]})]}),N.jsx("footer",{children:N.jsx("button",{type:"button",disabled:n,onClick:r,children:"Confirm"})})]})})}function P2(n){const r=new Date(n);return Number.isNaN(r.getTime())?"-":new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(r)}let Oi=null;function F2(n){const r=Date.parse(n.startedAt??""),s=Date.parse(n.stoppedAt??n.lastTurnEndedAt??"");return!Number.isFinite(r)||!Number.isFinite(s)?0:Math.max(0,s-r)}function q2(n){const r=n.roundId??n.startedAt??n.taskSlug,s=n.stoppedAt??n.lastTurnEndedAt??"stopped";return`${r}:${s}`}async function V2(){const n=v_();return n?y_(n):!1}async function xa(){const n=v_();if(!n||!await y_(n))return!1;try{const s=n.createGain(),o=n.currentTime+.025;return s.gain.setValueAtTime(.85,n.currentTime),s.connect(n.destination),ng(n,s,{frequency:587.33,startAt:o,duration:.18,peakGain:.045}),ng(n,s,{frequency:783.99,startAt:o+.11,duration:.28,peakGain:.055}),window.setTimeout(()=>{s.disconnect()},800),!0}catch{return!1}}function v_(){const n=window.AudioContext??window.webkitAudioContext;if(!n)return null;try{return(!Oi||Oi.state==="closed")&&(Oi=new n),Oi}catch{return null}}function G2(){Lc(Oi)}function Lc(n){Oi=null,n&&n.state!=="closed"&&n.close().catch(()=>{})}async function y_(n){if(tg(n))return!0;try{await n.resume();const r=tg(n);return!r&&n===Oi&&Lc(n),r}catch{return n===Oi&&Lc(n),!1}}function tg(n){return n.state==="running"}function ng(n,r,s){const o=n.createGain(),p=n.createOscillator(),y=n.createOscillator(),f=s.startAt+s.duration;o.gain.setValueAtTime(1e-4,s.startAt),o.gain.exponentialRampToValueAtTime(s.peakGain,s.startAt+.018),o.gain.exponentialRampToValueAtTime(1e-4,f),p.type="sine",p.frequency.setValueAtTime(s.frequency,s.startAt),y.type="triangle",y.frequency.setValueAtTime(s.frequency*2.01,s.startAt),p.connect(o),y.connect(o),o.connect(r),p.start(s.startAt),y.start(s.startAt),p.stop(f+.02),y.stop(f+.02)}const S_=document.getElementById("root");if(!S_)throw new Error("Missing #root element.");q0.createRoot(S_).render(N.jsx(ue.StrictMode,{children:N.jsx(I2,{})}));
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>VibeCodingMaster</title>
7
- <script type="module" crossorigin src="/assets/index-CFp1kZpa.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-D-6FVz_K.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-CR1EOe-w.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-coding-master",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "Local GUI session cockpit for Claude Code role sessions.",
5
5
  "type": "module",
6
6
  "files": [