@orion-agents/orion-code 0.3.11 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +47 -2
  2. package/README.md +8 -5
  3. package/README.zh-CN.md +5 -4
  4. package/dist/cli.js +14 -1
  5. package/dist/web/context-text.d.ts +17 -0
  6. package/dist/web/context-text.js +40 -0
  7. package/dist/web/file-read-service.d.ts +23 -0
  8. package/dist/web/file-read-service.js +134 -0
  9. package/dist/web/git-read-model-service.d.ts +14 -0
  10. package/dist/web/git-read-model-service.js +64 -0
  11. package/dist/web/host-daemon.d.ts +9 -0
  12. package/dist/web/host-daemon.js +45 -1
  13. package/dist/web/protocol.d.ts +7 -0
  14. package/dist/web/protocol.js +26 -0
  15. package/dist/web/review-service.d.ts +14 -0
  16. package/dist/web/review-service.js +34 -14
  17. package/dist/web/server.js +82 -0
  18. package/dist/web/workbench-controller.d.ts +45 -0
  19. package/dist/web/workbench-controller.js +84 -0
  20. package/dist/web-client/assets/{DiffViewer-BrE5tfZc.js → DiffViewer-Bs1C5uRM.js} +1 -1
  21. package/dist/web-client/assets/FilesPanel-dW61EHHn.js +2 -0
  22. package/dist/web-client/assets/GitPanel-ykbaVNlo.js +1 -0
  23. package/dist/web-client/assets/ResourceSplitLayout-B0Zs9aMC.js +1 -0
  24. package/dist/web-client/assets/ReviewPanel-1oqfaqoh.js +1 -0
  25. package/dist/web-client/assets/{TerminalPanel-CMLU7j08.js → TerminalPanel-Cz0ohyPm.js} +1 -1
  26. package/dist/web-client/assets/index-B11PjVU2.css +1 -0
  27. package/dist/web-client/assets/index-DiNz6Qhw.js +17 -0
  28. package/dist/web-client/index.html +2 -2
  29. package/npm-shrinkwrap.json +2 -2
  30. package/package.json +1 -1
  31. package/dist/web-client/assets/FilesPanel-ZwlVgxJi.js +0 -2
  32. package/dist/web-client/assets/GitPanel-Cnz52VRO.js +0 -1
  33. package/dist/web-client/assets/ReviewPanel-D_xxkVG_.js +0 -1
  34. package/dist/web-client/assets/index-BlFUf8dG.js +0 -17
  35. package/dist/web-client/assets/index-CUG6w669.css +0 -1
@@ -29,20 +29,7 @@ class ReviewServiceV1 {
29
29
  untracked.push(...page.untracked);
30
30
  }
31
31
  const changedFiles = uniqueFiles([...conflicted, ...staged, ...unstaged, ...untracked]);
32
- const verification = receiptRefs.slice(0, 100).map(receipt => Object.freeze({
33
- callId: receipt.callId,
34
- sessionId: receipt.sessionId,
35
- threadId: receipt.threadId,
36
- sequence: receipt.sequence,
37
- toolName: receipt.toolName,
38
- state: reviewState(receipt),
39
- terminal: receipt.terminal,
40
- success: receipt.success,
41
- outputBytes: receipt.outputBytes,
42
- hasArtifact: receipt.hasArtifact,
43
- executionPolicyDigest: receipt.executionPolicyDigest,
44
- receiptDigest: receipt.receiptDigest,
45
- }));
32
+ const verification = this.projectVerification(receiptRefs.slice(0, 100));
46
33
  const revision = (0, crypto_1.createHash)('sha256')
47
34
  .update(JSON.stringify({
48
35
  repositoryRevision: status.repositoryRevision,
@@ -64,6 +51,39 @@ class ReviewServiceV1 {
64
51
  verification: Object.freeze(verification),
65
52
  });
66
53
  }
54
+ /**
55
+ * v0.3.12 S2 — progressive verification evidence. The Review summary loads
56
+ * first; receipts page in behind it, optionally filtered to one session.
57
+ */
58
+ async verificationPage(input) {
59
+ const refs = await this.listReceiptRefs();
60
+ const filtered = input.sessionId ? refs.filter(ref => ref.sessionId === input.sessionId) : refs;
61
+ const offset = Math.max(0, Math.min(filtered.length, Math.trunc(input.cursor ?? 0)));
62
+ const pageSize = Math.max(1, Math.min(100, Math.trunc(input.pageSize ?? 25)));
63
+ const page = filtered.slice(offset, offset + pageSize);
64
+ const nextCursor = offset + page.length < filtered.length ? offset + page.length : null;
65
+ return Object.freeze({
66
+ items: Object.freeze(this.projectVerification(page)),
67
+ nextCursor,
68
+ totalForSession: filtered.length,
69
+ });
70
+ }
71
+ projectVerification(refs) {
72
+ return refs.map(receipt => Object.freeze({
73
+ callId: receipt.callId,
74
+ sessionId: receipt.sessionId,
75
+ threadId: receipt.threadId,
76
+ sequence: receipt.sequence,
77
+ toolName: receipt.toolName,
78
+ state: reviewState(receipt),
79
+ terminal: receipt.terminal,
80
+ success: receipt.success,
81
+ outputBytes: receipt.outputBytes,
82
+ hasArtifact: receipt.hasArtifact,
83
+ executionPolicyDigest: receipt.executionPolicyDigest,
84
+ receiptDigest: receipt.receiptDigest,
85
+ }));
86
+ }
67
87
  diff(input) {
68
88
  return this.git.diff(input);
69
89
  }
@@ -387,6 +387,15 @@ async function handleRequest(context) {
387
387
  sendJson(response, 200, collectionPage(url, 'mcp', context.workbench.mcp(contextGuard), server => server.id));
388
388
  return;
389
389
  }
390
+ if (method === 'GET' && path === '/files/search') {
391
+ const contextGuard = requireContextGuardQuery(url);
392
+ const query = url.searchParams.get('q') ?? '';
393
+ const scopeValue = url.searchParams.get('scope');
394
+ const scope = scopeValue === 'content' ? 'content' : 'name';
395
+ const limit = boundedInteger(url.searchParams.get('limit'), 50, 1, 200);
396
+ sendJson(response, 200, context.workbench.searchFiles(contextGuard, { query, scope, limit }));
397
+ return;
398
+ }
390
399
  if (method === 'GET' && path === '/files') {
391
400
  const contextGuard = requireContextGuardQuery(url);
392
401
  sendJson(response, 200, context.workbench.listFiles(contextGuard, {
@@ -422,6 +431,47 @@ async function handleRequest(context) {
422
431
  }));
423
432
  return;
424
433
  }
434
+ if (method === 'POST' && (path === '/git/stage' || path === '/git/unstage')) {
435
+ assertMutation(request, context.nonce, context.origin, 'git_mutation_forbidden');
436
+ assertGitUserGesture(request);
437
+ const body = requireRecord(await readJson(request), 'Git stage request');
438
+ assertOnlyKeys(body, [
439
+ 'requestId',
440
+ 'expectedContextRevision',
441
+ 'workspaceId',
442
+ 'fileIds',
443
+ 'expectedRepositoryRevision',
444
+ ]);
445
+ const requestId = requireUuid(body.requestId, 'requestId');
446
+ const contextGuard = requireContextGuardRecord(body);
447
+ const fileIds = requireStringArray(body.fileIds, 'fileIds', 200, 256);
448
+ const expectedRepositoryRevision = requireGitRevision(body.expectedRepositoryRevision);
449
+ const action = path === '/git/stage' ? 'stage' : 'unstage';
450
+ const result = await context.workbench.executeMutation(requestId, 'git.mutation', { action, fileIds, expectedRepositoryRevision, ...contextGuard }, async () => action === 'stage'
451
+ ? context.workbench.gitStage(contextGuard, { fileIds, expectedRepositoryRevision })
452
+ : context.workbench.gitUnstage(contextGuard, { fileIds, expectedRepositoryRevision }));
453
+ sendJson(response, 200, result);
454
+ return;
455
+ }
456
+ if (method === 'POST' && path === '/git/commit') {
457
+ assertMutation(request, context.nonce, context.origin, 'git_mutation_forbidden');
458
+ assertGitUserGesture(request);
459
+ const body = requireRecord(await readJson(request), 'Git commit request');
460
+ assertOnlyKeys(body, [
461
+ 'requestId',
462
+ 'expectedContextRevision',
463
+ 'workspaceId',
464
+ 'message',
465
+ 'expectedRepositoryRevision',
466
+ ]);
467
+ const requestId = requireUuid(body.requestId, 'requestId');
468
+ const contextGuard = requireContextGuardRecord(body);
469
+ const message = requireText(body.message, 'message', 2000);
470
+ const expectedRepositoryRevision = requireGitRevision(body.expectedRepositoryRevision);
471
+ const result = await context.workbench.executeMutation(requestId, 'git.commit', { message, expectedRepositoryRevision, ...contextGuard }, async () => context.workbench.gitCommit(contextGuard, { message, expectedRepositoryRevision }));
472
+ sendJson(response, 200, result);
473
+ return;
474
+ }
425
475
  if (method === 'GET' && path === '/git/log') {
426
476
  const contextGuard = requireContextGuardQuery(url);
427
477
  sendJson(response, 200, await context.workbench.gitLog(contextGuard, {
@@ -445,6 +495,15 @@ async function handleRequest(context) {
445
495
  }));
446
496
  return;
447
497
  }
498
+ if (method === 'GET' && path === '/review/verification') {
499
+ const contextGuard = requireContextGuardQuery(url);
500
+ const sessionId = url.searchParams.get('sessionId') ?? undefined;
501
+ const cursorValue = url.searchParams.get('cursor');
502
+ const cursor = cursorValue === null ? undefined : Number(cursorValue);
503
+ const pageSize = boundedInteger(url.searchParams.get('pageSize'), 25, 1, 100);
504
+ sendJson(response, 200, await context.workbench.reviewVerificationPage(contextGuard, { sessionId, cursor, pageSize }));
505
+ return;
506
+ }
448
507
  if (method === 'GET' && path === '/review') {
449
508
  sendJson(response, 200, await context.workbench.review(requireContextGuardQuery(url)));
450
509
  return;
@@ -569,6 +628,29 @@ function assertMutation(request, nonce, origin, forbiddenCode = 'request_forbidd
569
628
  throw new HttpProblem(415, 'Mutations require application/json.');
570
629
  }
571
630
  }
631
+ function requireStringArray(value, name, maxLength, maxItemBytes) {
632
+ if (!Array.isArray(value) || value.length === 0 || value.length > maxLength) {
633
+ throw new HttpProblem(400, `${name} must list 1 through ${maxLength} items.`);
634
+ }
635
+ return value.map(item => {
636
+ if (typeof item !== 'string' || item.length === 0 || item.length > maxItemBytes) {
637
+ throw new HttpProblem(400, `${name} contains an invalid item.`);
638
+ }
639
+ return item;
640
+ });
641
+ }
642
+ function requireGitRevision(value) {
643
+ const text = requireText(value, 'expectedRepositoryRevision', 64);
644
+ if (!/^[0-9a-f]{40,64}$/u.test(text)) {
645
+ throw new HttpProblem(400, 'expectedRepositoryRevision must be a git revision.');
646
+ }
647
+ return text;
648
+ }
649
+ function assertGitUserGesture(request) {
650
+ if (request.headers[protocol_1.WEB_USER_GESTURE_HEADER] !== 'git-mutation-v1') {
651
+ throw new HttpProblem(403, 'Git mutations require an explicit browser user gesture.', 'git_user_gesture_required');
652
+ }
653
+ }
572
654
  function assertTerminalUserGesture(request) {
573
655
  if (request.headers[protocol_1.WEB_USER_GESTURE_HEADER] !== 'terminal-create-v1') {
574
656
  throw new HttpProblem(403, 'Terminal creation requires an explicit browser user gesture.', 'terminal_user_gesture_required');
@@ -101,6 +101,51 @@ export declare class WebWorkbenchController {
101
101
  listFiles(context: WebContextGuardV1, input: Parameters<FileReadServiceV1['list']>[0]): import("./file-read-service").WebFileTreePageV1;
102
102
  readFileContent(context: WebContextGuardV1, input: Parameters<FileReadServiceV1['readContent']>[0]): import("./file-read-service").WebFileContentPageV1;
103
103
  gitStatus(context: WebContextGuardV1, input: Parameters<GitReadModelServiceV1['status']>[0]): Promise<import("./git-read-model-service").WebGitStatusV1>;
104
+ searchFiles(context: WebContextGuardV1, input: {
105
+ readonly query: string;
106
+ readonly scope: 'name' | 'content';
107
+ readonly limit?: number;
108
+ }): Readonly<{
109
+ revision: string;
110
+ items: readonly Readonly<{
111
+ id: string;
112
+ name: string;
113
+ path: string;
114
+ }>[];
115
+ truncated: boolean;
116
+ }>;
117
+ /** v0.3.12 S3 — guarded stage/unstage/commit with repository revision CAS. */
118
+ gitStage(context: WebContextGuardV1, input: {
119
+ readonly fileIds: readonly string[];
120
+ readonly expectedRepositoryRevision: string;
121
+ }): Promise<{
122
+ readonly repositoryRevision: string;
123
+ }>;
124
+ gitUnstage(context: WebContextGuardV1, input: {
125
+ readonly fileIds: readonly string[];
126
+ readonly expectedRepositoryRevision: string;
127
+ }): Promise<{
128
+ readonly repositoryRevision: string;
129
+ }>;
130
+ gitCommit(context: WebContextGuardV1, input: {
131
+ readonly message: string;
132
+ readonly expectedRepositoryRevision: string;
133
+ }): Promise<{
134
+ readonly repositoryRevision: string;
135
+ readonly commitSha: string;
136
+ }>;
137
+ private resolveSafeGitPaths;
138
+ private assertGitRepositoryRevision;
139
+ private fileContextRevision;
140
+ reviewVerificationPage(context: WebContextGuardV1, input: {
141
+ readonly sessionId?: string;
142
+ readonly cursor?: number;
143
+ readonly pageSize?: number;
144
+ }): Promise<{
145
+ readonly items: readonly import("./review-service").WebReviewVerificationV1[];
146
+ readonly nextCursor: number | null;
147
+ readonly totalForSession: number;
148
+ }>;
104
149
  gitLog(context: WebContextGuardV1, input: Parameters<GitReadModelServiceV1['log']>[0]): Promise<import("./git-read-model-service").WebGitLogPageV1>;
105
150
  gitDiff(context: WebContextGuardV1, input: Parameters<GitReadModelServiceV1['diff']>[0]): Promise<import("./git-read-model-service").WebGitDiffPageV1>;
106
151
  review(context: WebContextGuardV1): Promise<import("./review-service").WebReviewSnapshotV1>;
@@ -24,6 +24,7 @@ const settings_coordinator_1 = require("../services/settings-coordinator");
24
24
  const session_storage_1 = require("../services/session-storage");
25
25
  const workspace_registry_1 = require("../services/workspace-registry");
26
26
  const errors_1 = require("./errors");
27
+ const context_text_1 = require("./context-text");
27
28
  const event_hub_1 = require("./event-hub");
28
29
  const file_read_service_1 = require("./file-read-service");
29
30
  const git_read_model_service_1 = require("./git-read-model-service");
@@ -845,6 +846,65 @@ class WebWorkbenchController {
845
846
  this.assertContextGuard(context);
846
847
  return result;
847
848
  }
849
+ searchFiles(context, input) {
850
+ this.assertContextGuard(context);
851
+ const result = this.fileService.search(input);
852
+ return Object.freeze({
853
+ revision: this.fileContextRevision(),
854
+ items: Object.freeze(result.items.map(item => Object.freeze({
855
+ id: item.id,
856
+ name: item.name,
857
+ path: item.path,
858
+ }))),
859
+ truncated: result.truncated,
860
+ });
861
+ }
862
+ /** v0.3.12 S3 — guarded stage/unstage/commit with repository revision CAS. */
863
+ async gitStage(context, input) {
864
+ this.assertContextGuard(context);
865
+ const paths = this.resolveSafeGitPaths(input.fileIds);
866
+ await this.assertGitRepositoryRevision(input.expectedRepositoryRevision);
867
+ return this.gitService.stagePaths(paths);
868
+ }
869
+ async gitUnstage(context, input) {
870
+ this.assertContextGuard(context);
871
+ const paths = this.resolveSafeGitPaths(input.fileIds);
872
+ await this.assertGitRepositoryRevision(input.expectedRepositoryRevision);
873
+ return this.gitService.unstagePaths(paths);
874
+ }
875
+ async gitCommit(context, input) {
876
+ this.assertContextGuard(context);
877
+ await this.assertGitRepositoryRevision(input.expectedRepositoryRevision);
878
+ return this.gitService.commit(input.message);
879
+ }
880
+ resolveSafeGitPaths(fileIds) {
881
+ if (!Array.isArray(fileIds) || fileIds.length === 0 || fileIds.length > 200) {
882
+ throw new errors_1.WebWorkbenchError(400, 'fileIds must list 1 through 200 files.');
883
+ }
884
+ return fileIds.map(fileId => {
885
+ if (typeof fileId !== 'string' || fileId.length > 256) {
886
+ throw new errors_1.WebWorkbenchError(400, 'A file id is invalid.', 'file_id_invalid');
887
+ }
888
+ return this.fileService.pathForFileId(fileId);
889
+ });
890
+ }
891
+ async assertGitRepositoryRevision(expected) {
892
+ if (typeof expected !== 'string' || !/^[0-9a-f]{40,64}$/u.test(expected)) {
893
+ throw new errors_1.WebWorkbenchError(400, 'expectedRepositoryRevision is invalid.');
894
+ }
895
+ const status = await this.gitService.status({ pageSize: 1 });
896
+ if (status.repositoryRevision !== expected) {
897
+ throw new errors_1.WebWorkbenchError(409, 'The repository changed before the operation could run.', 'git_revision_conflict');
898
+ }
899
+ }
900
+ fileContextRevision() {
901
+ const node = this.fileService;
902
+ return typeof node.rootRevision === 'function' ? node.rootRevision() : '';
903
+ }
904
+ async reviewVerificationPage(context, input) {
905
+ this.assertContextGuard(context);
906
+ return this.reviewService.verificationPage(input);
907
+ }
848
908
  async gitLog(context, input) {
849
909
  this.assertContextGuard(context);
850
910
  const result = await this.gitService.log(input);
@@ -1255,6 +1315,30 @@ class WebWorkbenchController {
1255
1315
  truncated: page.nextCursor !== null,
1256
1316
  };
1257
1317
  }
1318
+ case 'file_range': {
1319
+ const page = this.fileService.readContent({
1320
+ fileId: reference.id,
1321
+ limitBytes: MAX_CONTEXT_REFERENCE_BYTES,
1322
+ });
1323
+ if (page.revision !== reference.revision) {
1324
+ throw new errors_1.WebWorkbenchError(409, 'Referenced file changed.', 'context_reference_stale');
1325
+ }
1326
+ if (page.binary || page.content === undefined) {
1327
+ throw new errors_1.WebWorkbenchError(403, 'Binary files cannot be added to model Context.', 'context_reference_forbidden');
1328
+ }
1329
+ const extracted = (0, context_text_1.extractLineRange)(page.content, reference.startLine, reference.endLine);
1330
+ const budgeted = (0, context_text_1.enforceContextBudget)(extracted.text, MAX_CONTEXT_REFERENCE_BYTES);
1331
+ return {
1332
+ kind: 'file_range',
1333
+ id: reference.id,
1334
+ label: `${this.sanitizeContextText(page.name)}:${reference.startLine}-${reference.endLine}`,
1335
+ revision: page.revision,
1336
+ startLine: reference.startLine,
1337
+ endLine: reference.endLine,
1338
+ content: this.sanitizeContextText(budgeted.text),
1339
+ truncated: budgeted.truncated || page.nextCursor !== null || extracted.clampedAtEnd,
1340
+ };
1341
+ }
1258
1342
  case 'folder': {
1259
1343
  const page = this.fileService.list({ parentId: reference.id, pageSize: 100 });
1260
1344
  if (page.revision !== reference.revision) {
@@ -1,4 +1,4 @@
1
- import{r as u,j as s,I as N}from"./index-BlFUf8dG.js";function v(t){const n=[];let i;for(const r of t)r.startsWith("@@")?(i&&n.push(i),i={title:r,lines:[r]}):i&&i.lines.push(r);return i&&n.push(i),n}function D(t,n){const i={schemaVersion:1,type:"review_context",repositoryRevision:t.repositoryRevision,path:t.path,hunk:n.title},r=n.lines.join(`
1
+ import{r as u,j as s,I as N}from"./index-DiNz6Qhw.js";function v(t){const n=[];let i;for(const r of t)r.startsWith("@@")?(i&&n.push(i),i={title:r,lines:[r]}):i&&i.lines.push(r);return i&&n.push(i),n}function D(t,n){const i={schemaVersion:1,type:"review_context",repositoryRevision:t.repositoryRevision,path:t.path,hunk:n.title},r=n.lines.join(`
2
2
  `).slice(0,12e3);return[`请审阅 ${t.path} 的这个 diff hunk,并指出正确性、安全性和测试风险:`,"","```review_context",JSON.stringify(i,null,2),"```","","```diff",r,"```"].join(`
3
3
  `)}function H({page:t,loading:n=!1,onLoadMore:i,onSendToComposer:r}){const a=u.useMemo(()=>v(t.lines),[t.lines]),[m,h]=u.useState(0),[f,p]=u.useState(!1),[x,k]=u.useState(!1),[b,y]=u.useState(""),d=Math.min(m,Math.max(0,a.length-1)),c=a[d];u.useEffect(()=>{h(0),p(!1),y("")},[t.fileId,t.repositoryRevision]);const j=(e,l)=>{let o=l;if(e.key==="ArrowRight"||e.key==="ArrowDown")o=(l+1)%a.length;else if(e.key==="ArrowLeft"||e.key==="ArrowUp")o=(l-1+a.length)%a.length;else if(e.key==="Home")o=0;else if(e.key==="End")o=a.length-1;else return;e.preventDefault(),h(o);const w=e.currentTarget.parentElement;window.requestAnimationFrame(()=>w?.querySelector(`[data-hunk-index="${o}"]`)?.focus())};return t.binary?s.jsxs("div",{className:"resource-empty compact",children:[s.jsx(N,{name:"code"}),s.jsx("strong",{children:"二进制差异"}),s.jsx("p",{children:"只展示变更事实,不返回 binary patch。"})]}):s.jsxs("div",{className:"diff-viewer",children:[s.jsxs("header",{children:[s.jsx("strong",{title:t.path,children:t.path}),s.jsx("span",{children:t.truncated?"受限预览":`${t.lines.length} 行`})]}),a.length>1?s.jsx("div",{className:"diff-hunk-nav",role:"tablist","aria-label":"Diff hunks",children:a.map((e,l)=>s.jsx("button",{type:"button",role:"tab","data-hunk-index":l,"aria-selected":d===l,tabIndex:d===l?0:-1,onClick:()=>h(l),onKeyDown:o=>j(o,l),children:e.title||`Hunk ${l+1}`},`${e.title}-${l}`))}):null,s.jsxs("div",{className:"diff-actions","aria-label":"Diff 显示选项",children:[c?s.jsx("button",{type:"button",className:"text-button","aria-expanded":!f,onClick:()=>p(e=>!e),children:f?"展开 Hunk":"折叠 Hunk"}):null,s.jsx("button",{type:"button",className:"text-button","aria-pressed":x,onClick:()=>k(e=>!e),children:"显示空白字符"}),c?s.jsx("button",{type:"button",className:"text-button",onClick:()=>{$(c.lines.join(`
4
4
  `),y)},children:"复制 Hunk"}):null]}),f?null:s.jsx("pre",{className:"diff-lines",tabIndex:0,"aria-label":`Diff ${t.path}`,children:(c?.lines??t.lines).map((e,l)=>s.jsxs("span",{className:e.startsWith("+")?"addition":e.startsWith("-")?"deletion":"",children:[S(e,x)||" ",`
@@ -0,0 +1,2 @@
1
+ import{r as a,j as e,I as w,s as te,W as se}from"./index-DiNz6Qhw.js";import{R as re}from"./ResourceSplitLayout-B0Zs9aMC.js";function fe({workspaceId:s,refreshEpoch:l,actions:i,navigatorWidthPx:n,onNavigatorWidthCommit:d}){const[u,h]=a.useState({}),[j,f]=a.useState(new Set(["workspace-root"])),[c,m]=a.useState(null),[g,$]=a.useState(""),[B,L]=a.useState(null),[X,R]=a.useState(!1),[M,E]=a.useState(""),[K,N]=a.useState(""),[F,Y]=a.useState(""),[O,Z]=a.useState(!1),[P,I]=a.useState("1"),[W,D]=a.useState({}),[_,G]=a.useState(""),A=a.useRef(null),x=a.useRef(0),C=a.useRef(0),k=async(t,r=!1,y=x.current)=>{if(y!==x.current)return;const p=u[t],v=r?p?.nextCursor:void 0;if(!(r&&!v)){h(o=>({...o,[t]:{items:p?.items??[],nextCursor:p?.nextCursor??null,revision:p?.revision??"",loading:!0}}));try{const o=await i.listFiles(t,v??void 0);if(y!==x.current)return;h(b=>({...b,[t]:{items:r?ie(b[t]?.items??[],o.items):o.items,nextCursor:o.nextCursor,revision:o.revision,loading:!1}}))}catch(o){if(y!==x.current)return;if(r&&H(o)){N("目录已变化,已重新载入第一页。"),k(t,!1,y);return}h(b=>({...b,[t]:{items:b[t]?.items??[],nextCursor:b[t]?.nextCursor??null,revision:b[t]?.revision??"",loading:!1,error:z(o)}}))}}},Q=async(t=x.current)=>{try{const r=await i.gitStatus();if(t!==x.current)return;D(le(r)),G(r.nextCursor?"Git 装饰仅显示首批 200 个变更;在 Git 面板继续分页查看。":"")}catch(r){if(t!==x.current)return;D({}),G(`Git 状态装饰不可用:${z(r)}`)}};a.useEffect(()=>{const t=x.current+1;x.current=t,C.current+=1,h({}),f(new Set(["workspace-root"])),m(null),$(""),L(null),R(!1),E(""),N(""),D({}),G(""),s&&(k("workspace-root",!1,t),Q(t))},[l,s]);const S=async(t,r=!1,y=!1,p=x.current,v=C.current+1)=>{if(p===x.current&&!(!t.readable||t.sensitive||T(t))){C.current=v,m(t),E(""),r||($(""),L(null),R(!1)),y||N("");try{const o=await i.readFileContent(t.id,r?B??void 0:void 0);if(p!==x.current||v!==C.current)return;R(o.binary),$(b=>r?`${b}${o.content??""}`:o.content??""),L(o.nextCursor),y&&N("文件已变化,已从第一页重新载入。")}catch(o){if(p!==x.current||v!==C.current)return;if(r&&H(o)){await S(t,!1,!0,p,v);return}E(z(o))}}},V=t=>{const r=new Set(j);r.has(t)?r.delete(t):(r.add(t),u[t]||k(t)),f(r)},ee=a.useMemo(()=>Object.values(u).flatMap(t=>t.items),[u]),q=F.trim()?ee.filter(t=>t.name.toLocaleLowerCase().includes(F.toLocaleLowerCase())):null;return e.jsxs("div",{className:"work-resource-panel files-panel",children:[e.jsxs("div",{className:"resource-toolbar",children:[e.jsxs("label",{className:"resource-search",children:[e.jsx("span",{className:"sr-only",children:"搜索已加载文件"}),e.jsx(w,{name:"search",size:14}),e.jsx("input",{type:"search",value:F,onChange:t=>Y(t.target.value),placeholder:"搜索已加载文件"})]}),e.jsx("button",{type:"button",className:"icon-button","aria-label":"刷新文件树",onClick:()=>{k("workspace-root"),Q()},children:e.jsx(w,{name:"refresh",size:15})})]}),e.jsxs(re,{panelId:"files",navigatorWidthPx:n,onNavigatorWidthCommit:d,contentLabel:"文件预览",navigatorLabel:"工作区文件",handleLabel:"调整文件目录宽度",contentClassName:"file-preview",navigatorClassName:"file-tree",children:[e.jsxs(e.Fragment,{children:[_?e.jsx("p",{className:"resource-hint",role:"status",children:_}):null,q?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"resource-hint",children:"搜索仅覆盖已加载的目录和文件。"}),e.jsx("ul",{role:"list",className:"file-node-list search-results",children:q.map(t=>e.jsx(U,{node:t,depth:0,expanded:!1,selected:c?.id===t.id,gitLabels:W[t.displayPath]??[],onToggle:V,onSelect:r=>{S(r)}},t.id))})]}):e.jsx(J,{parentId:"workspace-root",depth:0,directories:u,expanded:j,selectedId:c?.id,gitDecorations:W,onToggle:V,onSelect:t=>{S(t)},onLoadMore:t=>{k(t,!0)}})]}),e.jsxs(e.Fragment,{children:[K?e.jsx("p",{className:"resource-notice",role:"status",children:K}):null,c?e.jsxs(e.Fragment,{children:[e.jsxs("header",{children:[e.jsx("strong",{children:c.name}),e.jsx("span",{children:ae(c.sizeBytes??0)})]}),M?e.jsx("p",{className:"resource-error",role:"alert",children:M}):X?e.jsxs("div",{className:"resource-empty",children:[e.jsx(w,{name:"code"}),e.jsx("strong",{children:"二进制文件"}),e.jsx("p",{children:"出于安全和性能考虑,只显示元数据。"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"file-preview-actions",children:[e.jsxs("label",{children:[e.jsx("span",{className:"sr-only",children:"跳到行"}),e.jsx("input",{type:"number",min:"1",value:P,"aria-label":"跳到行",onChange:t=>I(t.target.value)})]}),e.jsx("button",{type:"button",className:"text-button",onClick:()=>ce(A.current,P),children:"跳转"}),e.jsx("button",{type:"button",className:"text-button",onClick:()=>{oe(g,N)},children:"复制"}),e.jsx("button",{type:"button",className:"text-button","aria-pressed":O,onClick:()=>Z(t=>!t),children:"自动换行"})]}),e.jsx("pre",{ref:A,tabIndex:0,className:`file-code-view ${O?"wrap":""}`,"aria-label":`文件内容 ${c.name}`,children:te(g).split(`
2
+ `).map((t,r)=>e.jsxs("span",{className:"file-code-line","data-line":r+1,children:[e.jsx("span",{className:"file-line-number","aria-hidden":"true",children:r+1}),e.jsx("span",{className:"file-line-content",children:t||" "})]},r))})]}),B?e.jsx("button",{type:"button",className:"secondary-button",onClick:()=>{S(c,!0)},children:"加载更多内容"}):null]}):e.jsxs("div",{className:"resource-empty",children:[e.jsx(w,{name:"workspace"}),e.jsx("strong",{children:"选择文件预览"}),e.jsx("p",{children:"敏感文件、工作区外链接和二进制正文不会返回浏览器。"})]})]})]})]})}function J({parentId:s,depth:l,directories:i,expanded:n,selectedId:d,gitDecorations:u,onToggle:h,onSelect:j,onLoadMore:f}){const c=i[s];return c?c.error?e.jsx("p",{className:"resource-error",role:"alert",children:c.error}):e.jsxs("ul",{role:"list",className:"file-node-list",children:[c.items.map(m=>{const g=n.has(m.id);return e.jsxs("li",{children:[e.jsx(U,{node:m,depth:l,expanded:g,selected:d===m.id,gitLabels:u[m.displayPath]??[],onToggle:h,onSelect:j}),T(m)&&g?e.jsx(J,{parentId:m.id,depth:l+1,directories:i,expanded:n,selectedId:d,gitDecorations:u,onToggle:h,onSelect:j,onLoadMore:f}):null]},m.id)}),c.loading?e.jsx("li",{className:"resource-loading",children:"正在读取…"}):null,c.nextCursor?e.jsx("li",{children:e.jsx("button",{type:"button",className:"text-button",onClick:()=>f(s),children:"加载更多"})}):null]}):e.jsx("p",{className:"resource-loading",children:"正在读取…"})}function U({node:s,depth:l,expanded:i,selected:n,gitLabels:d,onToggle:u,onSelect:h}){const j=s.sensitive||!s.readable,f=T(s);return e.jsxs("button",{type:"button",className:`file-node ${n?"selected":""} ${j?"blocked":""}`,style:{paddingInlineStart:`${8+l*15}px`},"aria-expanded":f?i:void 0,"aria-label":`${ne(s)} ${s.name}${j?",不可读取":""}${d.length?`,Git ${d.join("、")}`:""}`,onClick:()=>f?u(s.id):h(s),disabled:j,children:[e.jsx(w,{name:f?"workspace":"code",size:14}),e.jsx("span",{children:s.name}),s.kind==="symlink"?e.jsx("small",{children:"链接"}):null,s.sensitive?e.jsx("small",{children:"敏感"}):null,d.length?e.jsx("small",{className:"file-git-status",title:`Git ${d.join("、")}`,children:d.join(" · ")}):null]})}function ne(s){return s.kind==="directory"?"目录":s.kind==="symlink"?s.targetKind==="directory"?"符号链接目录":"符号链接":"文件"}function T(s){return s.kind==="directory"||s.kind==="symlink"&&s.targetKind==="directory"}function ie(s,l){const i=new Map(s.map(n=>[n.id,n]));for(const n of l)i.set(n.id,n);return[...i.values()]}function le(s){if(!s.isRepository)return{};const l=new Map,i=(n,d)=>{const u=n.replace(/\\/gu,"/").replace(/^\.\//u,"");if(!u)return;const h=l.get(u)??new Set;h.add(d),l.set(u,h);const j=u.split("/");for(let f=1;f<j.length;f+=1){const c=j.slice(0,f).join("/"),m=l.get(c)??new Set;m.add("含变更"),l.set(c,m)}};return s.conflicted.forEach(n=>i(n.path,"冲突")),s.staged.forEach(n=>i(n.path,"已暂存")),s.unstaged.forEach(n=>i(n.path,"未暂存")),s.untracked.forEach(n=>i(n.path,"未跟踪")),Object.fromEntries([...l].map(([n,d])=>[n,Object.freeze([...d])]))}function ae(s){return s<1024?`${s} B`:s<1048576?`${(s/1024).toFixed(1)} KB`:`${(s/1048576).toFixed(1)} MB`}function H(s){return s instanceof se&&s.code==="file_revision_conflict"}function ce(s,l){const i=Number(l);!s||!Number.isSafeInteger(i)||i<1||(s.querySelector(`[data-line="${i}"]`)?.scrollIntoView({block:"center"}),s.focus())}async function oe(s,l){try{await navigator.clipboard.writeText(s),l("已复制当前加载的文件内容。")}catch{l("浏览器未允许复制,请手动选择文本。")}}function z(s){return s instanceof Error?s.message:"文件请求失败。"}export{fe as FilesPanel};
@@ -0,0 +1 @@
1
+ import{r as d,j as e,I as g,W as F}from"./index-DiNz6Qhw.js";import{R as V}from"./ResourceSplitLayout-B0Zs9aMC.js";import{D as B}from"./DiffViewer-Bs1C5uRM.js";function U({workspaceId:c,refreshEpoch:m,actions:u,onSendToComposer:o,navigatorWidthPx:_,onNavigatorWidthCommit:z}){const[a,I]=d.useState(null),[p,G]=d.useState(null),[k,y]=d.useState(null),[v,N]=d.useState(null),[R,h]=d.useState(!1),[C,f]=d.useState(""),[E,j]=d.useState(""),n=d.useRef(0),x=d.useRef(0),b=async(t=n.current)=>{if(t===n.current){h(!0),f("");try{const[s,l]=await Promise.all([u.gitStatus(),u.gitLog()]);if(t!==n.current)return;I(s),G(l),y(null),N(null)}catch(s){if(t!==n.current)return;f(S(s))}finally{t===n.current&&h(!1)}}},$=()=>{const t=n.current+1;n.current=t,x.current+=1,j(""),b(t)};d.useEffect(()=>{const t=n.current+1;n.current=t,x.current+=1,I(null),G(null),y(null),N(null),f(""),j(""),c&&b(t)},[m,c]);const M=async(t,s,l=n.current,r=x.current+1)=>{if(l===n.current){x.current=r,s||(y(t),N(null)),h(!0),f("");try{const i=await u.gitDiff(t.fileId,s);if(l!==n.current||r!==x.current||i.fileId!==t.fileId)return;y(t),N(L=>s&&L&&L.fileId===i.fileId?{...i,lines:[...L.lines,...i.lines]}:i)}catch(i){if(l!==n.current||r!==x.current)return;if(D(i)){j("仓库已变化,已重新载入 Git 状态。"),await b(l);return}f(S(i))}finally{l===n.current&&r===x.current&&h(!1)}}},P=async()=>{const t=a?.nextCursor;if(!t||!a)return;const s=n.current,l=a.repositoryRevision;h(!0),f("");try{const r=await u.gitStatus(t);if(s!==n.current)return;if(r.repositoryRevision!==l)throw A();I(i=>!i||i.repositoryRevision!==l?i:{...r,conflicted:w(i.conflicted,r.conflicted),staged:w(i.staged,r.staged),unstaged:w(i.unstaged,r.unstaged),untracked:w(i.untracked,r.untracked)})}catch(r){if(s!==n.current)return;if(D(r)){j("仓库已变化,已重新载入 Git 状态。"),await b(s);return}f(S(r))}finally{s===n.current&&h(!1)}},W=async()=>{const t=p?.nextCursor;if(!t||!p)return;const s=n.current,l=p.repositoryRevision;h(!0),f("");try{const r=await u.gitLog(t);if(s!==n.current)return;if(r.repositoryRevision!==l)throw A();G(i=>!i||i.repositoryRevision!==l?i:{...r,items:K(i.items,r.items)})}catch(r){if(s!==n.current)return;if(D(r)){j("提交历史已变化,已重新载入第一页。"),await b(s);return}f(S(r))}finally{s===n.current&&h(!1)}};if(C&&!a)return e.jsx(J,{message:C,onRetry:$});if(!a)return e.jsx("p",{className:"resource-loading",children:"正在读取 Git 状态…"});if(!a.isRepository)return e.jsxs("div",{className:"resource-empty",children:[e.jsx(g,{name:"branch"}),e.jsx("strong",{children:"当前项目不是 Git 仓库"}),e.jsx("p",{children:"文件和 Agent 仍可使用;Git 面板保持只读空状态。"})]});const H=[{label:"冲突",tone:"conflict",items:a.conflicted},{label:"已暂存",tone:"staged",items:a.staged},{label:"未暂存",tone:"unstaged",items:a.unstaged},{label:"未跟踪",tone:"untracked",items:a.untracked}];return e.jsxs("div",{className:"work-resource-panel git-panel",children:[e.jsxs("div",{className:"git-summary",children:[e.jsxs("div",{children:[e.jsx(g,{name:"branch",size:15}),e.jsx("strong",{children:a.detached?`detached ${a.head??""}`:a.branch||"HEAD"})]}),e.jsxs("span",{children:[a.upstream||"无 upstream",a.ahead||a.behind?` · ↑${a.ahead} ↓${a.behind}`:""]}),e.jsx("button",{type:"button",className:"icon-button","aria-label":"刷新 Git 状态",onClick:$,disabled:R,children:e.jsx(g,{name:"refresh",size:15})})]}),E?e.jsx("p",{className:"resource-notice",role:"status",children:E}):null,C?e.jsx("p",{className:"resource-error",role:"alert",children:C}):null,e.jsxs(V,{panelId:"git",navigatorWidthPx:_,onNavigatorWidthCommit:z,contentLabel:"Git Diff",navigatorLabel:"Git 变更",handleLabel:"调整 Git 变更列表宽度",contentClassName:"git-diff",navigatorClassName:"git-changes",children:[e.jsxs(e.Fragment,{children:[a.clean?e.jsxs("div",{className:"resource-empty compact",children:[e.jsx(g,{name:"check"}),e.jsx("strong",{children:"工作区干净"})]}):H.map(t=>t.items.length?e.jsxs("div",{className:"git-group",children:[e.jsxs("h3",{children:[t.label," ",e.jsx("span",{children:t.items.length})]}),t.items.map(s=>e.jsxs("button",{type:"button",className:k?.fileId===s.fileId?"selected":"",onClick:()=>{M(s)},children:[e.jsx("span",{className:`git-status-code ${t.tone}`,children:s.indexStatus.trim()||s.worktreeStatus.trim()||"?"}),e.jsx("span",{title:s.path,children:s.path})]},`${t.label}:${s.fileId}`))]},t.label):null),a.nextCursor?e.jsx("button",{type:"button",className:"text-button resource-load-more",onClick:()=>{P()},disabled:R,children:"加载更多变更"}):null,e.jsxs("div",{className:"git-history",children:[e.jsx("h3",{children:"提交历史"}),p?.items.map(t=>e.jsxs("article",{children:[e.jsx("code",{children:t.shortId}),e.jsx("strong",{children:t.subject}),e.jsxs("span",{children:[t.authorName," · ",new Date(t.authoredAt).toLocaleDateString("zh-CN")]})]},t.id)),p?.nextCursor?e.jsx("button",{type:"button",className:"text-button resource-load-more",onClick:()=>{W()},disabled:R,children:"加载更多提交"}):null]})]}),e.jsx(e.Fragment,{children:v?e.jsx(B,{page:v,loading:R,onLoadMore:v.nextCursor&&k?()=>{M(k,v.nextCursor??void 0)}:void 0,onSendToComposer:o}):e.jsxs("div",{className:"resource-empty",children:[e.jsx(g,{name:"code"}),e.jsx("strong",{children:"选择变更查看 Diff"}),e.jsx("p",{children:"Diff 来自受限 Git read model,不解析对话或工具输出。"})]})})]})]})}function J({message:c,onRetry:m}){return e.jsxs("div",{className:"resource-empty",role:"alert",children:[e.jsx(g,{name:"warning"}),e.jsx("strong",{children:"Git 状态读取失败"}),e.jsx("p",{children:c}),e.jsx("button",{type:"button",className:"secondary-button",onClick:m,children:"重试"})]})}function S(c){return c instanceof Error?c.message:"Git 请求失败。"}function D(c){return c instanceof F&&c.code==="git_revision_conflict"}function A(){return new F("仓库版本已变化。",409,"git_revision_conflict")}function w(c,m){const u=new Map(c.map(o=>[o.fileId,o]));for(const o of m)u.set(o.fileId,o);return[...u.values()]}function K(c,m){const u=new Map(c.map(o=>[o.id,o]));for(const o of m)u.set(o.id,o);return[...u.values()]}export{U as GitPanel};
@@ -0,0 +1 @@
1
+ import{r as t,j as s,P as I,R as M,a as R,c as S,b as _}from"./index-DiNz6Qhw.js";function O({panelId:r,navigatorWidthPx:m,onNavigatorWidthCommit:v,contentLabel:p,navigatorLabel:x,handleLabel:f,contentClassName:n="",navigatorClassName:a="",children:W}){const[N,b]=t.Children.toArray(W),o=t.useRef(null),[g,E]=t.useState(0),[$,c]=t.useState(null);t.useEffect(()=>{const e=o.current;if(!e)return;const u=new ResizeObserver(A=>{const h=A[0]?.contentRect.width;h&&E(h)});return u.observe(e),()=>u.disconnect()},[]);const i=_(g),l=Math.min(S($??m),i),j=e=>{c(null),v(Math.min(e,i))},w=`${r}-split-content`,d=`${r}-split-navigator`;return s.jsxs("div",{ref:o,className:"resource-split-layout",style:{"--resource-navigator-width":`${l}px`},children:[s.jsx("section",{id:w,className:`resource-split-content${n?` ${n}`:""}`,"aria-label":p,children:b}),s.jsx(I,{side:"right",className:"resource-split-handle",minWidth:R,maxWidth:Math.max(R,i),defaultWidth:M,label:f,width:l,controls:d,boundsRef:o,resizingScope:"resource-split",onPreview:c,onCommit:j}),s.jsx("section",{id:d,className:`resource-split-navigator${a?` ${a}`:""}`,"aria-label":x,children:N})]})}export{O as R};
@@ -0,0 +1 @@
1
+ import{r,j as e,I as o,S as $,W as z}from"./index-DiNz6Qhw.js";import{R as A}from"./ResourceSplitLayout-B0Zs9aMC.js";import{D as B}from"./DiffViewer-Bs1C5uRM.js";function P({workspaceId:a,refreshEpoch:D,actions:w,onSendToComposer:E,navigatorWidthPx:F,onNavigatorWidthCommit:L}){const[t,b]=r.useState(null),[v,f]=r.useState(null),[h,x]=r.useState(null),[C,j]=r.useState(!1),[m,u]=r.useState(""),[S,g]=r.useState(""),n=r.useRef(0),i=r.useRef(0),N=async(s=n.current)=>{if(s===n.current){j(!0),u("");try{const l=await w.review();if(s!==n.current)return;b(l),f(null),x(null)}catch(l){if(s!==n.current)return;u(k(l))}finally{s===n.current&&j(!1)}}},I=()=>{const s=n.current+1;n.current=s,i.current+=1,g(""),N(s)};r.useEffect(()=>{const s=n.current+1;n.current=s,i.current+=1,b(null),f(null),x(null),u(""),g(""),a&&N(s)},[D,a]);const R=async(s,l,d=n.current,p=i.current+1)=>{if(d===n.current){i.current=p,l||(f(s),x(null)),j(!0),u("");try{const c=await w.gitDiff(s.fileId,l);if(d!==n.current||p!==i.current||c.fileId!==s.fileId)return;f(s),x(y=>l&&y&&y.fileId===c.fileId?{...c,lines:[...y.lines,...c.lines]}:c)}catch(c){if(d!==n.current||p!==i.current)return;if(W(c)){g("仓库已变化,已重新建立审阅快照。"),await N(d);return}u(k(c))}finally{d===n.current&&p===i.current&&j(!1)}}};return!t&&!m?e.jsx("p",{className:"resource-loading",children:"正在建立审阅快照…"}):t?e.jsxs("div",{className:"work-resource-panel review-panel",children:[e.jsxs("div",{className:"review-summary",children:[e.jsxs("div",{children:[e.jsx("span",{className:`review-score ${t.clean?"clean":"changed"}`,children:t.clean?e.jsx(o,{name:"check"}):e.jsx(o,{name:"edit"})}),e.jsxs("div",{children:[e.jsx("strong",{children:t.clean?"没有待审阅变更":`${t.totalChangedFiles} 个变更文件`}),e.jsxs("span",{children:[t.truncated?"当前显示 · ":"",t.stagedCount," staged · ",t.unstagedCount," unstaged ·"," ",t.untrackedCount," untracked · ",t.conflictCount," conflict"]})]})]}),e.jsx("button",{type:"button",className:"icon-button","aria-label":"刷新审阅快照",disabled:C,onClick:I,children:e.jsx(o,{name:"refresh",size:15})})]}),t.truncated?e.jsxs("p",{className:"resource-notice",role:"status",children:["当前显示 ",t.changedFiles.length," / ",t.totalChangedFiles," ","个变更文件;分类计数仅覆盖当前显示范围。"]}):null,S?e.jsx("p",{className:"resource-notice",role:"status",children:S}):null,m?e.jsx("p",{className:"resource-error",role:"alert",children:m}):null,e.jsxs(A,{panelId:"review",navigatorWidthPx:F,onNavigatorWidthCommit:L,contentLabel:"审阅 Diff",navigatorLabel:"待审阅文件",handleLabel:"调整待审阅文件列表宽度",contentClassName:"review-diff",navigatorClassName:"review-files",children:[e.jsxs(e.Fragment,{children:[t.changedFiles.map(s=>e.jsxs("button",{type:"button",className:v?.fileId===s.fileId?"selected":"",onClick:()=>{R(s)},children:[e.jsx(o,{name:"code",size:14}),e.jsx("span",{title:s.path,children:s.path}),e.jsx("small",{children:`${s.indexStatus}${s.worktreeStatus}`.trim()||"?"})]},s.fileId)),e.jsxs("div",{className:"review-verification",children:[e.jsx("h3",{children:"验证证据"}),t.verification.length?t.verification.map(s=>e.jsxs("article",{children:[e.jsx($,{state:s.state}),e.jsxs("div",{children:[e.jsx("strong",{children:s.toolName}),e.jsxs("small",{children:[s.state," · ",s.outputBytes," B",s.hasArtifact?" · artifact":""]})]})]},`${s.callId}:${s.toolName}`)):e.jsx("p",{className:"muted-copy",children:"当前没有持久化验证结果。"})]})]}),e.jsx(e.Fragment,{children:h?e.jsx(B,{page:h,loading:C,onLoadMore:h.nextCursor&&v?()=>{R(v,h.nextCursor??void 0)}:void 0,onSendToComposer:E}):e.jsxs("div",{className:"resource-empty",children:[e.jsx(o,{name:"edit"}),e.jsx("strong",{children:"选择文件开始审阅"}),e.jsx("p",{children:"你可以把某个 Hunk 作为草稿送回对话,提交前仍由你确认。"})]})})]})]}):e.jsxs("div",{className:"resource-empty",role:"alert",children:[e.jsx(o,{name:"warning"}),e.jsx("strong",{children:"无法读取审阅快照"}),e.jsx("p",{children:m}),e.jsx("button",{type:"button",className:"secondary-button",onClick:I,children:"重试"})]})}function k(a){return a instanceof Error?a.message:"审阅请求失败。"}function W(a){return a instanceof z&&a.code==="git_revision_conflict"}export{P as ReviewPanel};
@@ -1,4 +1,4 @@
1
- var An=Object.defineProperty;var On=(e,t,i)=>t in e?An(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i;var _e=(e,t,i)=>On(e,typeof t!="symbol"?t+"":t,i);import{r as I,j as w,I as xt}from"./index-BlFUf8dG.js";var Nn=2,In=1,Hn=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let t=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,i=window.getComputedStyle(this._terminal.element.parentElement),s=parseInt(i.getPropertyValue("height")),r=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),o={top:parseInt(n.getPropertyValue("padding-top")),bottom:parseInt(n.getPropertyValue("padding-bottom")),right:parseInt(n.getPropertyValue("padding-right")),left:parseInt(n.getPropertyValue("padding-left"))},a=o.top+o.bottom,h=o.right+o.left,l=s-a,c=r-h-t;return{cols:Math.max(Nn,Math.floor(c/e.css.cell.width)),rows:Math.max(In,Math.floor(l/e.css.cell.height))}}};var Or=Object.defineProperty,Fn=Object.getOwnPropertyDescriptor,Wn=(e,t)=>{for(var i in t)Or(e,i,{get:t[i],enumerable:!0})},Q=(e,t,i,s)=>{for(var r=s>1?void 0:s?Fn(t,i):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(r=(s?o(t,i,r):o(r))||r);return s&&r&&Or(t,i,r),r},x=(e,t)=>(i,s)=>t(i,s,e),Ts="Terminal input",Li={get:()=>Ts,set:e=>Ts=e},Ps="Too much output to announce, navigate to rows manually to read",Ti={get:()=>Ps,set:e=>Ps=e};function zn(e){return e.replace(/\r?\n/g,"\r")}function $n(e,t){return t?"\x1B[200~"+e+"\x1B[201~":e}function Kn(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()}function Un(e,t,i,s){if(e.stopPropagation(),e.clipboardData){let r=e.clipboardData.getData("text/plain");Nr(r,t,i,s)}}function Nr(e,t,i,s){e=zn(e),e=$n(e,i.decPrivateModes.bracketedPasteMode&&s.rawOptions.ignoreBracketedPasteMode!==!0),i.triggerDataEvent(e,!0),t.value=""}function Ir(e,t,i){let s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}function As(e,t,i,s,r){Ir(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}function st(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function _i(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let n=e[r];n>65535?(n-=65536,s+=String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):s+=String.fromCharCode(n)}return s}var qn=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){let n=e.charCodeAt(r++);56320<=n&&n<=57343?t[s++]=(this._interim-55296)*1024+n-56320+65536:(t[s++]=this._interim,t[s++]=n),this._interim=0}for(let n=r;n<i;++n){let o=e.charCodeAt(n);if(55296<=o&&o<=56319){if(++n>=i)return this._interim=o,s;let a=e.charCodeAt(n);56320<=a&&a<=57343?t[s++]=(o-55296)*1024+a-56320+65536:(t[s++]=o,t[s++]=a);continue}o!==65279&&(t[s++]=o)}return s}},Vn=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let i=e.length;if(!i)return 0;let s=0,r,n,o,a,h=0,l=0;if(this.interim[0]){let _=!1,f=this.interim[0];f&=(f&224)===192?31:(f&240)===224?15:7;let u=0,g;for(;(g=this.interim[++u]&63)&&u<4;)f<<=6,f|=g;let b=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,D=b-u;for(;l<D;){if(l>=i)return 0;if(g=e[l++],(g&192)!==128){l--,_=!0;break}else this.interim[u++]=g,f<<=6,f|=g&63}_||(b===2?f<128?l--:t[s++]=f:b===3?f<2048||f>=55296&&f<=57343||f===65279||(t[s++]=f):f<65536||f>1114111||(t[s++]=f)),this.interim.fill(0)}let c=i-4,d=l;for(;d<i;){for(;d<c&&!((r=e[d])&128)&&!((n=e[d+1])&128)&&!((o=e[d+2])&128)&&!((a=e[d+3])&128);)t[s++]=r,t[s++]=n,t[s++]=o,t[s++]=a,d+=4;if(r=e[d++],r<128)t[s++]=r;else if((r&224)===192){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(h=(r&31)<<6|n&63,h<128){d--;continue}t[s++]=h}else if((r&240)===224){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,s;if(o=e[d++],(o&192)!==128){d--;continue}if(h=(r&15)<<12|(n&63)<<6|o&63,h<2048||h>=55296&&h<=57343||h===65279)continue;t[s++]=h}else if((r&248)===240){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,s;if(o=e[d++],(o&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,this.interim[2]=o,s;if(a=e[d++],(a&192)!==128){d--;continue}if(h=(r&7)<<18|(n&63)<<12|(o&63)<<6|a&63,h<65536||h>1114111)continue;t[s++]=h}}return s}},Hr="",rt=" ",Kt=class Fr{constructor(){this.fg=0,this.bg=0,this.extended=new ai}static toColorRGB(t){return[t>>>16&255,t>>>8&255,t&255]}static fromColorRGB(t){return(t[0]&255)<<16|(t[1]&255)<<8|t[2]&255}clone(){let t=new Fr;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},ai=class Wr{constructor(t=0,i=0){this._ext=0,this._urlId=0,this._ext=t,this._urlId=i}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(t){this._ext&=-67108864,this._ext|=t&67108863}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){let t=(this._ext&3758096384)>>29;return t<0?t^4294967288:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}clone(){return new Wr(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},Oe=class zr extends Kt{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new ai,this.combinedData=""}static fromCharData(t){let i=new zr;return i.setFromCharData(t),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?st(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let i=!1;if(t[1].length>2)i=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let r=t[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(s-55296)*1024+r-56320+65536|t[2]<<22:i=!0}else i=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;i&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},Os="di$target",Pi="di$dependencies",mi=new Map;function jn(e){return e[Pi]||[]}function ue(e){if(mi.has(e))return mi.get(e);let t=function(i,s,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Yn(t,i,r)};return t._id=e,mi.set(e,t),t}function Yn(e,t,i){t[Os]===t?t[Pi].push({id:e,index:i}):(t[Pi]=[{id:e,index:i}],t[Os]=t)}var we=ue("BufferService"),$r=ue("CoreMouseService"),gt=ue("CoreService"),Xn=ue("CharsetService"),vs=ue("InstantiationService"),Kr=ue("LogService"),ye=ue("OptionsService"),Ur=ue("OscLinkService"),Gn=ue("UnicodeService"),Ut=ue("DecorationService"),Ai=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){let i=this._bufferService.buffer.lines.get(e-1);if(!i){t(void 0);return}let s=[],r=this._optionsService.rawOptions.linkHandler,n=new Oe,o=i.getTrimmedLength(),a=-1,h=-1,l=!1;for(let c=0;c<o;c++)if(!(h===-1&&!i.hasContent(c))){if(i.loadCell(c,n),n.hasExtendedAttrs()&&n.extended.urlId)if(h===-1){h=c,a=n.extended.urlId;continue}else l=n.extended.urlId!==a;else h!==-1&&(l=!0);if(l||h!==-1&&c===o-1){let d=this._oscLinkService.getLinkData(a)?.uri;if(d){let _={start:{x:h+1,y:e},end:{x:c+(!l&&c===o-1?1:0),y:e}},f=!1;if(!r?.allowNonHttpProtocols)try{let u=new URL(d);["http:","https:"].includes(u.protocol)||(f=!0)}catch{f=!0}f||s.push({text:d,range:_,activate:(u,g)=>r?r.activate(u,g,_):Jn(u,g),hover:(u,g)=>r?.hover?.(u,g,_),leave:(u,g)=>r?.leave?.(u,g,_)})}l=!1,n.hasExtendedAttrs()&&n.extended.urlId?(h=c,a=n.extended.urlId):(h=-1,a=-1)}}t(s)}};Ai=Q([x(0,we),x(1,ye),x(2,Ur)],Ai);function Jn(e,t){if(confirm(`Do you want to navigate to ${t}?
1
+ var An=Object.defineProperty;var On=(e,t,i)=>t in e?An(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i;var _e=(e,t,i)=>On(e,typeof t!="symbol"?t+"":t,i);import{r as I,j as w,I as xt}from"./index-DiNz6Qhw.js";var Nn=2,In=1,Hn=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let t=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let t=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,i=window.getComputedStyle(this._terminal.element.parentElement),s=parseInt(i.getPropertyValue("height")),r=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),o={top:parseInt(n.getPropertyValue("padding-top")),bottom:parseInt(n.getPropertyValue("padding-bottom")),right:parseInt(n.getPropertyValue("padding-right")),left:parseInt(n.getPropertyValue("padding-left"))},a=o.top+o.bottom,h=o.right+o.left,l=s-a,c=r-h-t;return{cols:Math.max(Nn,Math.floor(c/e.css.cell.width)),rows:Math.max(In,Math.floor(l/e.css.cell.height))}}};var Or=Object.defineProperty,Fn=Object.getOwnPropertyDescriptor,Wn=(e,t)=>{for(var i in t)Or(e,i,{get:t[i],enumerable:!0})},Q=(e,t,i,s)=>{for(var r=s>1?void 0:s?Fn(t,i):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(r=(s?o(t,i,r):o(r))||r);return s&&r&&Or(t,i,r),r},x=(e,t)=>(i,s)=>t(i,s,e),Ts="Terminal input",Li={get:()=>Ts,set:e=>Ts=e},Ps="Too much output to announce, navigate to rows manually to read",Ti={get:()=>Ps,set:e=>Ps=e};function zn(e){return e.replace(/\r?\n/g,"\r")}function $n(e,t){return t?"\x1B[200~"+e+"\x1B[201~":e}function Kn(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()}function Un(e,t,i,s){if(e.stopPropagation(),e.clipboardData){let r=e.clipboardData.getData("text/plain");Nr(r,t,i,s)}}function Nr(e,t,i,s){e=zn(e),e=$n(e,i.decPrivateModes.bracketedPasteMode&&s.rawOptions.ignoreBracketedPasteMode!==!0),i.triggerDataEvent(e,!0),t.value=""}function Ir(e,t,i){let s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}function As(e,t,i,s,r){Ir(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}function st(e){return e>65535?(e-=65536,String.fromCharCode((e>>10)+55296)+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)}function _i(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let n=e[r];n>65535?(n-=65536,s+=String.fromCharCode((n>>10)+55296)+String.fromCharCode(n%1024+56320)):s+=String.fromCharCode(n)}return s}var qn=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){let i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){let n=e.charCodeAt(r++);56320<=n&&n<=57343?t[s++]=(this._interim-55296)*1024+n-56320+65536:(t[s++]=this._interim,t[s++]=n),this._interim=0}for(let n=r;n<i;++n){let o=e.charCodeAt(n);if(55296<=o&&o<=56319){if(++n>=i)return this._interim=o,s;let a=e.charCodeAt(n);56320<=a&&a<=57343?t[s++]=(o-55296)*1024+a-56320+65536:(t[s++]=o,t[s++]=a);continue}o!==65279&&(t[s++]=o)}return s}},Vn=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){let i=e.length;if(!i)return 0;let s=0,r,n,o,a,h=0,l=0;if(this.interim[0]){let _=!1,f=this.interim[0];f&=(f&224)===192?31:(f&240)===224?15:7;let u=0,g;for(;(g=this.interim[++u]&63)&&u<4;)f<<=6,f|=g;let b=(this.interim[0]&224)===192?2:(this.interim[0]&240)===224?3:4,D=b-u;for(;l<D;){if(l>=i)return 0;if(g=e[l++],(g&192)!==128){l--,_=!0;break}else this.interim[u++]=g,f<<=6,f|=g&63}_||(b===2?f<128?l--:t[s++]=f:b===3?f<2048||f>=55296&&f<=57343||f===65279||(t[s++]=f):f<65536||f>1114111||(t[s++]=f)),this.interim.fill(0)}let c=i-4,d=l;for(;d<i;){for(;d<c&&!((r=e[d])&128)&&!((n=e[d+1])&128)&&!((o=e[d+2])&128)&&!((a=e[d+3])&128);)t[s++]=r,t[s++]=n,t[s++]=o,t[s++]=a,d+=4;if(r=e[d++],r<128)t[s++]=r;else if((r&224)===192){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(h=(r&31)<<6|n&63,h<128){d--;continue}t[s++]=h}else if((r&240)===224){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,s;if(o=e[d++],(o&192)!==128){d--;continue}if(h=(r&15)<<12|(n&63)<<6|o&63,h<2048||h>=55296&&h<=57343||h===65279)continue;t[s++]=h}else if((r&248)===240){if(d>=i)return this.interim[0]=r,s;if(n=e[d++],(n&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,s;if(o=e[d++],(o&192)!==128){d--;continue}if(d>=i)return this.interim[0]=r,this.interim[1]=n,this.interim[2]=o,s;if(a=e[d++],(a&192)!==128){d--;continue}if(h=(r&7)<<18|(n&63)<<12|(o&63)<<6|a&63,h<65536||h>1114111)continue;t[s++]=h}}return s}},Hr="",rt=" ",Kt=class Fr{constructor(){this.fg=0,this.bg=0,this.extended=new ai}static toColorRGB(t){return[t>>>16&255,t>>>8&255,t&255]}static fromColorRGB(t){return(t[0]&255)<<16|(t[1]&255)<<8|t[2]&255}clone(){let t=new Fr;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t}isInverse(){return this.fg&67108864}isBold(){return this.fg&134217728}isUnderline(){return this.hasExtendedAttrs()&&this.extended.underlineStyle!==0?1:this.fg&268435456}isBlink(){return this.fg&536870912}isInvisible(){return this.fg&1073741824}isItalic(){return this.bg&67108864}isDim(){return this.bg&134217728}isStrikethrough(){return this.fg&2147483648}isProtected(){return this.bg&536870912}isOverline(){return this.bg&1073741824}getFgColorMode(){return this.fg&50331648}getBgColorMode(){return this.bg&50331648}isFgRGB(){return(this.fg&50331648)===50331648}isBgRGB(){return(this.bg&50331648)===50331648}isFgPalette(){return(this.fg&50331648)===16777216||(this.fg&50331648)===33554432}isBgPalette(){return(this.bg&50331648)===16777216||(this.bg&50331648)===33554432}isFgDefault(){return(this.fg&50331648)===0}isBgDefault(){return(this.bg&50331648)===0}isAttributeDefault(){return this.fg===0&&this.bg===0}getFgColor(){switch(this.fg&50331648){case 16777216:case 33554432:return this.fg&255;case 50331648:return this.fg&16777215;default:return-1}}getBgColor(){switch(this.bg&50331648){case 16777216:case 33554432:return this.bg&255;case 50331648:return this.bg&16777215;default:return-1}}hasExtendedAttrs(){return this.bg&268435456}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(this.bg&268435456&&~this.extended.underlineColor)switch(this.extended.underlineColor&50331648){case 16777216:case 33554432:return this.extended.underlineColor&255;case 50331648:return this.extended.underlineColor&16777215;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return this.bg&268435456&&~this.extended.underlineColor?this.extended.underlineColor&50331648:this.getFgColorMode()}isUnderlineColorRGB(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===50331648:this.isFgRGB()}isUnderlineColorPalette(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===16777216||(this.extended.underlineColor&50331648)===33554432:this.isFgPalette()}isUnderlineColorDefault(){return this.bg&268435456&&~this.extended.underlineColor?(this.extended.underlineColor&50331648)===0:this.isFgDefault()}getUnderlineStyle(){return this.fg&268435456?this.bg&268435456?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}},ai=class Wr{constructor(t=0,i=0){this._ext=0,this._urlId=0,this._ext=t,this._urlId=i}get ext(){return this._urlId?this._ext&-469762049|this.underlineStyle<<26:this._ext}set ext(t){this._ext=t}get underlineStyle(){return this._urlId?5:(this._ext&469762048)>>26}set underlineStyle(t){this._ext&=-469762049,this._ext|=t<<26&469762048}get underlineColor(){return this._ext&67108863}set underlineColor(t){this._ext&=-67108864,this._ext|=t&67108863}get urlId(){return this._urlId}set urlId(t){this._urlId=t}get underlineVariantOffset(){let t=(this._ext&3758096384)>>29;return t<0?t^4294967288:t}set underlineVariantOffset(t){this._ext&=536870911,this._ext|=t<<29&3758096384}clone(){return new Wr(this._ext,this._urlId)}isEmpty(){return this.underlineStyle===0&&this._urlId===0}},Oe=class zr extends Kt{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new ai,this.combinedData=""}static fromCharData(t){let i=new zr;return i.setFromCharData(t),i}isCombined(){return this.content&2097152}getWidth(){return this.content>>22}getChars(){return this.content&2097152?this.combinedData:this.content&2097151?st(this.content&2097151):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):this.content&2097151}setFromCharData(t){this.fg=t[0],this.bg=0;let i=!1;if(t[1].length>2)i=!0;else if(t[1].length===2){let s=t[1].charCodeAt(0);if(55296<=s&&s<=56319){let r=t[1].charCodeAt(1);56320<=r&&r<=57343?this.content=(s-55296)*1024+r-56320+65536|t[2]<<22:i=!0}else i=!0}else this.content=t[1].charCodeAt(0)|t[2]<<22;i&&(this.combinedData=t[1],this.content=2097152|t[2]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}},Os="di$target",Pi="di$dependencies",mi=new Map;function jn(e){return e[Pi]||[]}function ue(e){if(mi.has(e))return mi.get(e);let t=function(i,s,r){if(arguments.length!==3)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");Yn(t,i,r)};return t._id=e,mi.set(e,t),t}function Yn(e,t,i){t[Os]===t?t[Pi].push({id:e,index:i}):(t[Pi]=[{id:e,index:i}],t[Os]=t)}var we=ue("BufferService"),$r=ue("CoreMouseService"),gt=ue("CoreService"),Xn=ue("CharsetService"),vs=ue("InstantiationService"),Kr=ue("LogService"),ye=ue("OptionsService"),Ur=ue("OscLinkService"),Gn=ue("UnicodeService"),Ut=ue("DecorationService"),Ai=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){let i=this._bufferService.buffer.lines.get(e-1);if(!i){t(void 0);return}let s=[],r=this._optionsService.rawOptions.linkHandler,n=new Oe,o=i.getTrimmedLength(),a=-1,h=-1,l=!1;for(let c=0;c<o;c++)if(!(h===-1&&!i.hasContent(c))){if(i.loadCell(c,n),n.hasExtendedAttrs()&&n.extended.urlId)if(h===-1){h=c,a=n.extended.urlId;continue}else l=n.extended.urlId!==a;else h!==-1&&(l=!0);if(l||h!==-1&&c===o-1){let d=this._oscLinkService.getLinkData(a)?.uri;if(d){let _={start:{x:h+1,y:e},end:{x:c+(!l&&c===o-1?1:0),y:e}},f=!1;if(!r?.allowNonHttpProtocols)try{let u=new URL(d);["http:","https:"].includes(u.protocol)||(f=!0)}catch{f=!0}f||s.push({text:d,range:_,activate:(u,g)=>r?r.activate(u,g,_):Jn(u,g),hover:(u,g)=>r?.hover?.(u,g,_),leave:(u,g)=>r?.leave?.(u,g,_)})}l=!1,n.hasExtendedAttrs()&&n.extended.urlId?(h=c,a=n.extended.urlId):(h=-1,a=-1)}}t(s)}};Ai=Q([x(0,we),x(1,ye),x(2,Ur)],Ai);function Jn(e,t){if(confirm(`Do you want to navigate to ${t}?
2
2
 
3
3
  WARNING: This link could potentially be dangerous`)){let i=window.open();if(i){try{i.opener=null}catch{}i.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}var fi=ue("CharSizeService"),Ge=ue("CoreBrowserService"),Ss=ue("MouseService"),Je=ue("RenderService"),Zn=ue("SelectionService"),qr=ue("CharacterJoinerService"),yt=ue("ThemeService"),Vr=ue("LinkProviderService"),Qn=class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Ns.isErrorNoTelemetry(e)?new Ns(e.message+`
4
4