@jetcrab/pi-desk 1.1.5 → 1.1.8-dev

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 (95) hide show
  1. package/README.md +4 -4
  2. package/README.zh-CN.md +4 -4
  3. package/docs/README.md +8 -0
  4. package/docs/doc_asset/client-overview.webp +0 -0
  5. package/docs/doc_asset/multi-window.webp +0 -0
  6. package/docs/{pi-desk/plugins.md → plugins.md} +108 -1
  7. package/package.json +2 -2
  8. package/src/client/l2_biz/project-preview/l2-project-preview-dialog.tsx +3 -0
  9. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-view.tsx +8 -0
  10. package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-viewport.ts +81 -7
  11. package/src/client/l2_biz/workbench/l2-workbench-chat-view.tsx +2 -1
  12. package/src/client/l3_modules/project-files/l3-project-document-git.ts +82 -0
  13. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +102 -5
  14. package/src/client/l3_modules/project-files/l3-project-file-browser.tsx +2 -6
  15. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +83 -1
  16. package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +24 -2
  17. package/src/client/l3_modules/project-files/l3-project-git-model.ts +32 -0
  18. package/src/client/l4_foundation/ui/code/l4-code-diff.tsx +25 -5
  19. package/src/client/l4_foundation/ui/code/l4-code-line-changes.ts +49 -0
  20. package/src/client/l4_foundation/ui/code/l4-code-line-changes.worker.ts +10 -0
  21. package/src/client/l4_foundation/ui/code/l4-code-line-markers.module.css +60 -0
  22. package/src/client/l4_foundation/ui/code/l4-code-line-markers.ts +156 -0
  23. package/src/client/l4_foundation/ui/code/l4-code-preview.tsx +61 -5
  24. package/src/client/l4_foundation/ui/code/l4-monaco-lines-diff.d.ts +21 -0
  25. package/src/client/l4_foundation/ui/shadcn/hover-card.tsx +28 -2
  26. package/src/common/l3_modules/project-files/l3-project-files-locale-messages.ts +16 -0
  27. package/src/server/l4_foundation/pidesk/l4-pidesk-runtime.ts +1 -1
  28. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  29. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  30. package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
  31. package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +5 -4
  32. package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
  33. package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
  34. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  35. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  36. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  37. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  38. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  39. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
  41. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  43. package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
  44. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  45. package/temp/build/pi-desk/release/.next/server/app/page.js +6 -6
  46. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  47. package/temp/build/pi-desk/release/.next/server/chunks/20842.js +1 -0
  48. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +1 -1
  49. package/temp/build/pi-desk/release/.next/server/chunks/{9248.js → 354.js} +1 -1
  50. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +6 -6
  51. package/temp/build/pi-desk/release/.next/server/chunks/45671.js +1 -0
  52. package/temp/build/pi-desk/release/.next/server/chunks/47757.js +1 -1
  53. package/temp/build/pi-desk/release/.next/server/chunks/56284.js +62 -0
  54. package/temp/build/pi-desk/release/.next/server/chunks/73691.js +1 -0
  55. package/temp/build/pi-desk/release/.next/server/chunks/82499.js +2 -2
  56. package/temp/build/pi-desk/release/.next/server/chunks/94296.js +2 -2
  57. package/temp/build/pi-desk/release/.next/server/chunks/pi-desk-line-changes.js +1 -0
  58. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  59. package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
  60. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  61. package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
  62. package/temp/build/pi-desk/release/.next/server/webpack-runtime.js +1 -1
  63. package/temp/build/pi-desk/release/.next/static/chunks/28739.540a4f24a8eaa3fd.js +1 -0
  64. package/temp/build/pi-desk/release/.next/static/chunks/31087-333cae396a52f232.js +1 -0
  65. package/temp/build/pi-desk/release/.next/static/chunks/3814-35cfab0ce3aa7c41.js +1 -0
  66. package/temp/build/pi-desk/release/.next/static/chunks/38459.9a9b6f4f3ec3ff50.js +1 -0
  67. package/temp/build/pi-desk/release/.next/static/chunks/45992-a39a014497ec4dd1.js +13 -0
  68. package/temp/build/pi-desk/release/.next/static/chunks/53291.ab6ef49016107124.js +1 -0
  69. package/temp/build/pi-desk/release/.next/static/chunks/{54206.82a63ab971911eda.js → 54206.ffb8c581c6661ae2.js} +2 -2
  70. package/temp/build/pi-desk/release/.next/static/chunks/5598.f34dce2a9de0d0e3.js +1 -0
  71. package/temp/build/pi-desk/release/.next/static/chunks/70669.8b4231a8675499e0.js +1 -0
  72. package/temp/build/pi-desk/release/.next/static/chunks/95287.34b860abf26f64a5.js +1 -0
  73. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-586f6f88483051a7.js +3 -0
  74. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-c6c68b33156be10a.js → page-0f2cf68a4666420b.js} +4 -4
  75. package/temp/build/pi-desk/release/.next/static/chunks/pi-desk-line-changes.49f8d59c256621d6.js +1 -0
  76. package/temp/build/pi-desk/release/.next/static/chunks/webpack-26261285e181235a.js +1 -0
  77. package/temp/build/pi-desk/release/.next/static/css/{f6a76a493aae9ae3.css → adb1d4e48dd43c0a.css} +1 -1
  78. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  79. package/docs/pi-desk/README.md +0 -47
  80. package/temp/build/pi-desk/release/.next/server/chunks/6656.js +0 -1
  81. package/temp/build/pi-desk/release/.next/server/chunks/89236.js +0 -62
  82. package/temp/build/pi-desk/release/.next/static/chunks/19991.02fcb7c8ca3b1fe4.js +0 -1
  83. package/temp/build/pi-desk/release/.next/static/chunks/26285.54b8bcbf7a198c84.js +0 -1
  84. package/temp/build/pi-desk/release/.next/static/chunks/52354-6461358c522130be.js +0 -1
  85. package/temp/build/pi-desk/release/.next/static/chunks/74132-876f256c7a6101af.js +0 -13
  86. package/temp/build/pi-desk/release/.next/static/chunks/79615.7d68b269d93fcb93.js +0 -1
  87. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-4faf3a52d219296d.js +0 -3
  88. package/temp/build/pi-desk/release/.next/static/chunks/webpack-7bfbf627379fb4c1.js +0 -1
  89. /package/docs/{pi-desk/commands.md → commands.md} +0 -0
  90. /package/docs/{pi-desk/examples → examples}/local-application/browser/application.js +0 -0
  91. /package/docs/{pi-desk/examples → examples}/local-application/browser/entry.js +0 -0
  92. /package/docs/{pi-desk/examples → examples}/local-application/package.json +0 -0
  93. /package/docs/{pi-desk/examples → examples}/local-application/pi-desk.ts +0 -0
  94. /package/temp/build/pi-desk/release/.next/static/{1LdtGYUckBhYZy0R-6yG0 → -pemk30NXpiExEU5tjb1t}/_buildManifest.js +0 -0
  95. /package/temp/build/pi-desk/release/.next/static/{1LdtGYUckBhYZy0R-6yG0 → -pemk30NXpiExEU5tjb1t}/_ssgManifest.js +0 -0
@@ -0,0 +1,156 @@
1
+ import type { editor } from 'monaco-editor'
2
+ import type { L4Monaco } from './l4-monaco-runtime'
3
+ import type { L4LineChange } from './l4-code-line-changes'
4
+ import styles from './l4-code-line-markers.module.css'
5
+
6
+ export interface L4CodeLineMarkers {
7
+ previousChange: () => void
8
+ nextChange: () => void
9
+ dispose: () => void
10
+ }
11
+
12
+ export function bindL4CodeLineMarkers(
13
+ codeEditor: editor.IStandaloneCodeEditor,
14
+ monaco: L4Monaco,
15
+ input: {
16
+ path: string
17
+ original: string
18
+ modified: string
19
+ tooltip: (kind: L4LineChange['kind'], count: number) => string
20
+ onChanges: (count: number | null) => void
21
+ onOpenDiff: (lineNumber: number) => void
22
+ }
23
+ ): L4CodeLineMarkers {
24
+ const decorations = codeEditor.createDecorationsCollection()
25
+ const lineCount = codeEditor.getModel()?.getLineCount() ?? 1
26
+ let changes: L4LineChange[] = []
27
+ let active = true
28
+ let worker: Worker | null = null
29
+ let timeout: ReturnType<typeof setTimeout> | null = null
30
+ const markerSelector = [styles.added, styles.modified, styles.deletedBefore, styles.deletedAfter]
31
+ .map((className) => `.${className}`)
32
+ .join(',')
33
+
34
+ const markerLine = (change: L4LineChange): number =>
35
+ Math.min(
36
+ lineCount,
37
+ change.kind === 'deleted'
38
+ ? Math.max(1, change.modifiedStartLineNumber - 1)
39
+ : change.modifiedStartLineNumber
40
+ )
41
+
42
+ const stopWorker = (): void => {
43
+ if (timeout !== null) clearTimeout(timeout)
44
+ timeout = null
45
+ worker?.terminate()
46
+ worker = null
47
+ }
48
+
49
+ const finish = (result: L4LineChange[] | null): void => {
50
+ if (!active) return
51
+ stopWorker()
52
+ changes = result ?? []
53
+ decorations.set(
54
+ changes.map((change): editor.IModelDeltaDecoration => {
55
+ const deleted = change.kind === 'deleted'
56
+ const startLine = markerLine(change)
57
+ const endLine = deleted ? startLine : change.modifiedEndLineNumberExclusive - 1
58
+ const count = deleted
59
+ ? change.originalEndLineNumberExclusive - change.originalStartLineNumber
60
+ : change.modifiedEndLineNumberExclusive - change.modifiedStartLineNumber
61
+ const colors = {
62
+ added: ['#16803c', '#59c77b'],
63
+ modified: ['#216bcc', '#6aabff'],
64
+ deleted: ['#d12c38', '#ff757f']
65
+ }[change.kind]
66
+ const markerClass = deleted
67
+ ? change.modifiedStartLineNumber === 1
68
+ ? styles.deletedBefore
69
+ : styles.deletedAfter
70
+ : styles[change.kind]
71
+ return {
72
+ range: new monaco.Range(startLine, 1, endLine, 1),
73
+ options: {
74
+ isWholeLine: !deleted,
75
+ showIfCollapsed: true,
76
+ linesDecorationsClassName: deleted ? undefined : markerClass,
77
+ firstLineDecorationClassName: deleted ? markerClass : undefined,
78
+ linesDecorationsTooltip: input.tooltip(change.kind, count),
79
+ overviewRuler: {
80
+ color: colors[0],
81
+ darkColor: colors[1],
82
+ position: monaco.editor.OverviewRulerLane.Left
83
+ }
84
+ }
85
+ }
86
+ })
87
+ )
88
+ if (result === null) {
89
+ console.warn('[Pi Desk][CodePreview] 行标记不可用,计算失败或超过限制', {
90
+ path: input.path
91
+ })
92
+ }
93
+ input.onChanges(result?.length ?? null)
94
+ }
95
+
96
+ const mouseListener = codeEditor.onMouseDown((event) => {
97
+ if (
98
+ event.target.type !== monaco.editor.MouseTargetType.GUTTER_LINE_DECORATIONS ||
99
+ !event.target.element?.closest(markerSelector)
100
+ ) {
101
+ return
102
+ }
103
+ const line = event.target.position?.lineNumber
104
+ if (line === undefined) return
105
+ const change = changes.find((item) =>
106
+ item.kind === 'deleted'
107
+ ? markerLine(item) === line
108
+ : item.modifiedStartLineNumber <= line && line < item.modifiedEndLineNumberExclusive
109
+ )
110
+ if (change) input.onOpenDiff(line)
111
+ })
112
+
113
+ try {
114
+ worker = new Worker(new URL('./l4-code-line-changes.worker.ts', import.meta.url), {
115
+ type: 'module',
116
+ name: 'pi-desk-line-changes'
117
+ })
118
+ worker.onmessage = (event: MessageEvent<L4LineChange[] | null>): void => finish(event.data)
119
+ worker.onerror = (): void => finish(null)
120
+ worker.onmessageerror = (): void => finish(null)
121
+ // 含 Worker 启动预算;取消时终止 Worker,旧文件结果没有回流通道。
122
+ timeout = setTimeout(() => finish(null), 3_000)
123
+ worker.postMessage({ original: input.original, modified: input.modified })
124
+ } catch {
125
+ finish(null)
126
+ }
127
+
128
+ const navigate = (direction: 'previous' | 'next'): void => {
129
+ if (changes.length === 0) return
130
+ const currentLine = codeEditor.getPosition()?.lineNumber ?? 1
131
+ const lines = changes.map(markerLine)
132
+ const line =
133
+ direction === 'next'
134
+ ? (lines.find((item) => item > currentLine) ?? lines[0])
135
+ : (lines.findLast((item) => item < currentLine) ?? lines[lines.length - 1])
136
+ codeEditor.setPosition({ lineNumber: line, column: 1 })
137
+ codeEditor.revealLineInCenter(line)
138
+ codeEditor.focus()
139
+ }
140
+
141
+ return {
142
+ previousChange(): void {
143
+ navigate('previous')
144
+ },
145
+ nextChange(): void {
146
+ navigate('next')
147
+ },
148
+ dispose(): void {
149
+ active = false
150
+ stopWorker()
151
+ mouseListener.dispose()
152
+ decorations.clear()
153
+ changes = []
154
+ }
155
+ }
156
+ }
@@ -23,6 +23,8 @@ import {
23
23
 
24
24
  import { bindL4MonacoPreviewEscape } from './l4-monaco-preview-escape'
25
25
  import { useL4CodePreferences } from './l4-code-preferences'
26
+ import { bindL4CodeLineMarkers, type L4CodeLineMarkers } from './l4-code-line-markers'
27
+ import markerStyles from './l4-code-line-markers.module.css'
26
28
 
27
29
  export type L4CodePreviewState = editor.ICodeEditorViewState
28
30
 
@@ -32,6 +34,8 @@ export interface L4CodePreviewHandle {
32
34
  getSelectionText: () => string
33
35
  getViewState: () => L4CodePreviewState | null
34
36
  focus: () => void
37
+ previousChange: () => void
38
+ nextChange: () => void
35
39
  }
36
40
 
37
41
  interface L4CodePreviewProps {
@@ -41,13 +45,27 @@ interface L4CodePreviewProps {
41
45
  savedState: L4CodePreviewState | null
42
46
  onSaveState: (path: string, state: L4CodePreviewState | null) => void
43
47
  onEscape?: () => void
48
+ originalContent?: string
49
+ onChanges?: (count: number | null) => void
50
+ onOpenDiff?: (lineNumber: number) => void
44
51
  }
45
52
 
46
53
  function L4CodePreviewComponent(
47
- { path, content, size, savedState, onSaveState, onEscape }: L4CodePreviewProps,
54
+ {
55
+ path,
56
+ content,
57
+ size,
58
+ savedState,
59
+ onSaveState,
60
+ onEscape,
61
+ originalContent,
62
+ onChanges,
63
+ onOpenDiff
64
+ }: L4CodePreviewProps,
48
65
  ref: ForwardedRef<L4CodePreviewHandle>
49
66
  ): React.JSX.Element {
50
67
  const { t } = useTranslation('common')
68
+ const { t: projectFilesT } = useTranslation('projectFiles')
51
69
  const { wrapLines } = useL4CodePreferences()
52
70
  const hostRef = useRef<HTMLDivElement>(null)
53
71
  const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null)
@@ -55,11 +73,16 @@ function L4CodePreviewComponent(
55
73
  const wrapLinesRef = useRef(wrapLines)
56
74
  const savedStateRef = useRef(savedState)
57
75
  const escapeRef = useRef(onEscape)
76
+ const markersRef = useRef<L4CodeLineMarkers | null>(null)
77
+ const changesRef = useRef(onChanges)
78
+ const openDiffRef = useRef(onOpenDiff)
58
79
 
59
80
  useEffect(() => {
60
81
  savedStateRef.current = savedState
61
82
  escapeRef.current = onEscape
62
- }, [onEscape, savedState])
83
+ changesRef.current = onChanges
84
+ openDiffRef.current = onOpenDiff
85
+ }, [onChanges, onEscape, onOpenDiff, savedState])
63
86
  const [loadState, setLoadState] = useState<'loading' | 'ready' | 'error'>('loading')
64
87
 
65
88
  useEffect(() => {
@@ -90,6 +113,12 @@ function L4CodePreviewComponent(
90
113
  },
91
114
  focus(): void {
92
115
  editorRef.current?.focus()
116
+ },
117
+ previousChange(): void {
118
+ markersRef.current?.previousChange()
119
+ },
120
+ nextChange(): void {
121
+ markersRef.current?.nextChange()
93
122
  }
94
123
  }),
95
124
  []
@@ -101,6 +130,7 @@ function L4CodePreviewComponent(
101
130
  let active = true
102
131
  let codeEditor: editor.IStandaloneCodeEditor | null = null
103
132
  let model: editor.ITextModel | null = null
133
+ let markers: L4CodeLineMarkers | null = null
104
134
  let stopThemeObserver = (): void => undefined
105
135
  let stopTypographyObserver = (): void => undefined
106
136
 
@@ -131,6 +161,7 @@ function L4CodePreviewComponent(
131
161
  wrappingIndent: 'same',
132
162
  ...getL4MonacoTypography(),
133
163
  lineNumbersMinChars: 3,
164
+ lineDecorationsWidth: 26,
134
165
  folding: size <= 1024 * 1024,
135
166
  renderValidationDecorations: 'off',
136
167
  renderWhitespace: 'selection',
@@ -145,6 +176,25 @@ function L4CodePreviewComponent(
145
176
  if (escapeRef.current)
146
177
  bindL4MonacoPreviewEscape(codeEditor, monaco.KeyCode.Escape, () => escapeRef.current?.())
147
178
  editorRef.current = codeEditor
179
+ if (originalContent !== undefined) {
180
+ markers = bindL4CodeLineMarkers(codeEditor, monaco, {
181
+ path,
182
+ original: originalContent,
183
+ modified: content,
184
+ tooltip: (kind, count) =>
185
+ projectFilesT(
186
+ {
187
+ added: 'gitAddedLines',
188
+ modified: 'gitModifiedLines',
189
+ deleted: 'gitDeletedLines'
190
+ }[kind],
191
+ { count }
192
+ ),
193
+ onChanges: (count) => changesRef.current?.(count),
194
+ onOpenDiff: (lineNumber) => openDiffRef.current?.(lineNumber)
195
+ })
196
+ markersRef.current = markers
197
+ }
148
198
  stopThemeObserver = observeL4MonacoTheme((theme) => monaco.editor.setTheme(theme))
149
199
  stopTypographyObserver = observeL4MonacoTypography((typography) =>
150
200
  codeEditor?.updateOptions(typography)
@@ -158,18 +208,24 @@ function L4CodePreviewComponent(
158
208
  errorName: error instanceof Error ? error.name : 'UnknownError'
159
209
  })
160
210
  setLoadState('error')
211
+ if (originalContent !== undefined) changesRef.current?.(null)
161
212
  })
162
213
 
163
214
  return () => {
164
215
  active = false
165
216
  stopThemeObserver()
166
217
  stopTypographyObserver()
167
- if (codeEditor) onSaveStateRef.current(path, codeEditor.saveViewState())
218
+ markers?.dispose()
219
+ markersRef.current = null
220
+ if (codeEditor) {
221
+ savedStateRef.current = codeEditor.saveViewState()
222
+ onSaveStateRef.current(path, savedStateRef.current)
223
+ }
168
224
  editorRef.current = null
169
225
  codeEditor?.dispose()
170
226
  model?.dispose()
171
227
  }
172
- }, [content, path, size, t])
228
+ }, [content, originalContent, path, projectFilesT, size, t])
173
229
 
174
230
  useEffect(() => {
175
231
  editorRef.current?.updateOptions({ wordWrap: wrapLines ? 'on' : 'off' })
@@ -180,7 +236,7 @@ function L4CodePreviewComponent(
180
236
  data-testid="code-preview"
181
237
  className="relative h-full min-h-0 w-full overflow-hidden bg-background"
182
238
  >
183
- <div ref={hostRef} className="size-full" />
239
+ <div ref={hostRef} className={`size-full ${markerStyles.host}`} />
184
240
  {loadState === 'loading' ? (
185
241
  <div className="pointer-events-none absolute inset-0 flex items-center justify-center gap-2 bg-background text-sm text-muted-foreground">
186
242
  <LoaderCircleIcon className="size-4 animate-spin" /> {t('codeLoading')}
@@ -0,0 +1,21 @@
1
+ declare module 'monaco-editor/editor/common/diff/defaultLinesDiffComputer/defaultLinesDiffComputer' {
2
+ interface LineRange {
3
+ startLineNumber: number
4
+ endLineNumberExclusive: number
5
+ }
6
+
7
+ export class DefaultLinesDiffComputer {
8
+ computeDiff(
9
+ originalLines: string[],
10
+ modifiedLines: string[],
11
+ options: {
12
+ ignoreTrimWhitespace: boolean
13
+ maxComputationTimeMs: number
14
+ computeMoves: boolean
15
+ }
16
+ ): {
17
+ changes: { original: LineRange; modified: LineRange }[]
18
+ hitTimeout: boolean
19
+ }
20
+ }
21
+ }
@@ -1,11 +1,37 @@
1
1
  'use client'
2
2
 
3
3
  import { PreviewCard as PreviewCardPrimitive } from '@base-ui/react/preview-card'
4
+ import { useRef } from 'react'
4
5
 
5
6
  import { cn } from '@client/l4_foundation/lib/l4-utils'
6
7
 
7
- function HoverCard({ ...props }: PreviewCardPrimitive.Root.Props) {
8
- return <PreviewCardPrimitive.Root data-slot="hover-card" {...props} />
8
+ function HoverCard({ onOpenChange, ...props }: PreviewCardPrimitive.Root.Props): React.JSX.Element {
9
+ const triggerRef = useRef<Element | null>(null)
10
+
11
+ return (
12
+ <PreviewCardPrimitive.Root
13
+ data-slot="hover-card"
14
+ {...props}
15
+ onOpenChange={(open, eventDetails) => {
16
+ onOpenChange?.(open, eventDetails)
17
+ if (eventDetails.isCanceled) return
18
+ if (open) {
19
+ triggerRef.current = eventDetails.trigger ?? null
20
+ return
21
+ }
22
+ const trigger = triggerRef.current
23
+ triggerRef.current = null
24
+ // PreviewCard 打开时不转移焦点,Esc 关闭需释放仍停留在触发器上的焦点。
25
+ if (
26
+ eventDetails.reason === 'escape-key' &&
27
+ trigger instanceof HTMLElement &&
28
+ trigger.ownerDocument.activeElement === trigger
29
+ ) {
30
+ trigger.blur()
31
+ }
32
+ }}
33
+ />
34
+ )
9
35
  }
10
36
 
11
37
  function HoverCardTrigger({ ...props }: PreviewCardPrimitive.Trigger.Props) {
@@ -45,6 +45,14 @@ export const L3_PROJECT_FILES_LOCALE_MESSAGES = {
45
45
  copyContentFailed: 'Could not copy the file. Please copy it manually.',
46
46
  fileActions: 'File actions',
47
47
  headToWorking: 'HEAD ↔ working tree',
48
+ gitChangesCount: 'Against HEAD · {{count}} changes',
49
+ gitChangesCompact: '{{count}} changes',
50
+ gitMarkersLoading: 'Comparing with HEAD…',
51
+ gitMarkersFailed: 'Could not read changes · Reload to retry',
52
+ gitMarkersUnavailable: 'Line change markers unavailable',
53
+ gitAddedLines: '{{count}} lines added',
54
+ gitModifiedLines: '{{count}} lines modified',
55
+ gitDeletedLines: '{{count}} lines deleted',
48
56
  noDiffChanges: ' · No content differences',
49
57
  previousChange: 'Previous change',
50
58
  nextChange: 'Next change',
@@ -131,6 +139,14 @@ export const L3_PROJECT_FILES_LOCALE_MESSAGES = {
131
139
  copyContentFailed: '复制文件内容失败,请手动复制。',
132
140
  fileActions: '文件操作',
133
141
  headToWorking: 'HEAD ↔ 工作区',
142
+ gitChangesCount: '相对 HEAD · {{count}} 处变更',
143
+ gitChangesCompact: '{{count}} 处变更',
144
+ gitMarkersLoading: '正在与 HEAD 比较…',
145
+ gitMarkersFailed: '变更读取失败 · 刷新重试',
146
+ gitMarkersUnavailable: '此文件无法显示行变更',
147
+ gitAddedLines: '新增 {{count}} 行',
148
+ gitModifiedLines: '修改 {{count}} 行',
149
+ gitDeletedLines: '删除 {{count}} 行',
134
150
  noDiffChanges: ' · 当前比较无内容差异',
135
151
  previousChange: '上一个变更',
136
152
  nextChange: '下一个变更',
@@ -60,7 +60,7 @@ export async function initializeL4PiDeskCommands(
60
60
  const sdkRoot = dirname(
61
61
  dirname(createRequire(join(hostRoot, 'package.json')).resolve('@jetcrab/pi-desk-sdk'))
62
62
  )
63
- const docsDirectory = join(hostRoot, 'docs', 'pi-desk')
63
+ const docsDirectory = join(hostRoot, 'docs')
64
64
  await Promise.all(
65
65
  ['README.md', 'commands.md', 'plugins.md'].map((file) => access(join(docsDirectory, file)))
66
66
  )
@@ -1 +1 @@
1
- 1LdtGYUckBhYZy0R-6yG0
1
+ -pemk30NXpiExEU5tjb1t
@@ -4,11 +4,11 @@
4
4
  ],
5
5
  "devFiles": [],
6
6
  "lowPriorityFiles": [
7
- "static/1LdtGYUckBhYZy0R-6yG0/_buildManifest.js",
8
- "static/1LdtGYUckBhYZy0R-6yG0/_ssgManifest.js"
7
+ "static/-pemk30NXpiExEU5tjb1t/_buildManifest.js",
8
+ "static/-pemk30NXpiExEU5tjb1t/_ssgManifest.js"
9
9
  ],
10
10
  "rootMainFiles": [
11
- "static/chunks/webpack-7bfbf627379fb4c1.js",
11
+ "static/chunks/webpack-26261285e181235a.js",
12
12
  "static/chunks/e388c842-1ca92f1ea0dfe8ee.js",
13
13
  "static/chunks/64444-3e955f910569274d.js",
14
14
  "static/chunks/main-app-6230945a5a062fce.js"
@@ -65,8 +65,8 @@
65
65
  "dynamicRoutes": {},
66
66
  "notFoundRoutes": [],
67
67
  "preview": {
68
- "previewModeId": "bc59cea2c2817852039abf15f26eb725",
69
- "previewModeSigningKey": "96fedd78aa33d3058aaaa8affbd47cc325616865bd48c60f3c93e627052ff586",
70
- "previewModeEncryptionKey": "894a683d73e97492759af320abe227180945bb0903144f8fc6d65b2593ea43e5"
68
+ "previewModeId": "6a3ed0add2f10c8e629c3b4927c3ab47",
69
+ "previewModeSigningKey": "41ebb995a07e123fb88ed9cf02a7c140ce93d47834ee0cb7d9c6c9dcc462cca1",
70
+ "previewModeEncryptionKey": "7ba998796c3a2cb1cef990841e56a970e006ce0833a171001b0266ed108d6aaa"
71
71
  }
72
72
  }
@@ -2610,8 +2610,8 @@
2610
2610
  "client/l2_biz/workbench/file-workspace/l2-work-session-file-layout.tsx -> ./l2-file-workspace-view": {
2611
2611
  "id": 19991,
2612
2612
  "files": [
2613
- "static/chunks/52354-6461358c522130be.js",
2614
- "static/chunks/19991.02fcb7c8ca3b1fe4.js"
2613
+ "static/chunks/31087-333cae396a52f232.js",
2614
+ "static/chunks/70669.8b4231a8675499e0.js"
2615
2615
  ]
2616
2616
  },
2617
2617
  "client/l4_foundation/terminal/l4-terminal-renderer.ts -> @xterm/addon-fit": {
@@ -2639,9 +2639,10 @@
2639
2639
  "static/css/61a4c328346915cf.css",
2640
2640
  "static/css/3637d221a5ab27aa.css",
2641
2641
  "static/chunks/4db6c291.2775b26207a24b95.js",
2642
+ "static/chunks/38459.9a9b6f4f3ec3ff50.js",
2642
2643
  "static/chunks/46270-3e42514685626190.js",
2643
- "static/chunks/26285.54b8bcbf7a198c84.js",
2644
- "static/chunks/54206.82a63ab971911eda.js",
2644
+ "static/chunks/95287.34b860abf26f64a5.js",
2645
+ "static/chunks/54206.ffb8c581c6661ae2.js",
2645
2646
  "static/chunks/87086.16dde653e790cc2c.js"
2646
2647
  ]
2647
2648
  },
@@ -2,12 +2,12 @@ self.__SERVER_FILES_MANIFEST={
2
2
  "version": 1,
3
3
  "config": {
4
4
  "env": {
5
- "PI_DESK_APP_VERSION": "1.1.5",
6
- "PI_DESK_VERSION_UPDATED_AT": "2026-10-10T17:39:33+08:00"
5
+ "PI_DESK_APP_VERSION": "1.1.8-dev",
6
+ "PI_DESK_VERSION_UPDATED_AT": "2026-10-12T09:40:22+08:00"
7
7
  },
8
8
  "webpack": null,
9
9
  "typescript": {
10
- "ignoreBuildErrors": false
10
+ "ignoreBuildErrors": true
11
11
  },
12
12
  "typedRoutes": false,
13
13
  "distDir": "temp/build/pi-desk/release/.next",
@@ -2,12 +2,12 @@
2
2
  "version": 1,
3
3
  "config": {
4
4
  "env": {
5
- "PI_DESK_APP_VERSION": "1.1.5",
6
- "PI_DESK_VERSION_UPDATED_AT": "2026-10-10T17:39:33+08:00"
5
+ "PI_DESK_APP_VERSION": "1.1.8-dev",
6
+ "PI_DESK_VERSION_UPDATED_AT": "2026-10-12T09:40:22+08:00"
7
7
  },
8
8
  "webpack": null,
9
9
  "typescript": {
10
- "ignoreBuildErrors": false
10
+ "ignoreBuildErrors": true
11
11
  },
12
12
  "typedRoutes": false,
13
13
  "distDir": "temp/build/pi-desk/release/.next",
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_global-error/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"14405":{"*":{"id":"27297","name":"*","chunks":[],"async":false}},"21358":{"*":{"id":"41051","name":"*","chunks":[],"async":false}},"22432":{"*":{"id":"1480","name":"*","chunks":[],"async":false}},"23367":{"*":{"id":"49453","name":"*","chunks":[],"async":false}},"32422":{"*":{"id":"48599","name":"*","chunks":[],"async":false}},"33948":{"*":{"id":"79460","name":"*","chunks":[],"async":false}},"44478":{"*":{"id":"97016","name":"*","chunks":[],"async":false}},"64282":{"*":{"id":"12104","name":"*","chunks":[],"async":false}},"66999":{"*":{"id":"4527","name":"*","chunks":[],"async":false}},"69173":{"*":{"id":"7005","name":"*","chunks":[],"async":false}},"71713":{"*":{"id":"21147","name":"*","chunks":[],"async":false}},"84845":{"*":{"id":"43305","name":"*","chunks":[],"async":false}},"90184":{"*":{"id":"88476","name":"*","chunks":[],"async":false}},"97876":{"*":{"id":"58044","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/client-page.js":{"id":69173,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/client-page.js":{"id":69173,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/client-segment.js":{"id":23367,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/client-segment.js":{"id":23367,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":33948,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":33948,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/layout-router.js":{"id":90184,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/layout-router.js":{"id":90184,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/render-from-template-context.js":{"id":44478,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":44478,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/lib/framework/boundary-components.js":{"id":14405,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":14405,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":22432,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":22432,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/pages/l1-error-page.tsx":{"id":66999,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","81881","static/chunks/81881-f11dbe7dc0d04ed9.js","24345","static/chunks/app/not-found-2aab8b33ebbf3257.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/script.js":{"id":97876,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","74220","static/chunks/74220-795a2e7185bd66cb.js","74132","static/chunks/74132-876f256c7a6101af.js","52354","static/chunks/52354-6461358c522130be.js","7177","static/chunks/app/layout-4faf3a52d219296d.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/script.js":{"id":97876,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","74220","static/chunks/74220-795a2e7185bd66cb.js","74132","static/chunks/74132-876f256c7a6101af.js","52354","static/chunks/52354-6461358c522130be.js","7177","static/chunks/app/layout-4faf3a52d219296d.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/providers/l1-app-providers.tsx":{"id":64282,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","74220","static/chunks/74220-795a2e7185bd66cb.js","74132","static/chunks/74132-876f256c7a6101af.js","52354","static/chunks/52354-6461358c522130be.js","7177","static/chunks/app/layout-4faf3a52d219296d.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l4_foundation/styles/l4-globals.css":{"id":84178,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","74220","static/chunks/74220-795a2e7185bd66cb.js","74132","static/chunks/74132-876f256c7a6101af.js","52354","static/chunks/52354-6461358c522130be.js","7177","static/chunks/app/layout-4faf3a52d219296d.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx":{"id":84845,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","81881","static/chunks/81881-f11dbe7dc0d04ed9.js","18039","static/chunks/app/error-0296a3b20cd1bf00.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/app/global-error.tsx":{"id":71713,"name":"*","chunks":["34219","static/chunks/app/global-error-6f5fc4928fd1966c.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/pages/l1-home-page.tsx":{"id":32422,"name":"*","chunks":["85959","static/chunks/287c71e3-32bb21af66f1f035.js","26717","static/chunks/6c0b963a-c492581a5b6359f7.js","94287","static/chunks/cdfede43-b007dd93b1fdb122.js","78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","46270","static/chunks/46270-3e42514685626190.js","57208","static/chunks/57208-d6d38167dabb91e4.js","14197","static/chunks/14197-3d3ddd426ac06c9c.js","34903","static/chunks/34903-e4205c0becabea76.js","74220","static/chunks/74220-795a2e7185bd66cb.js","74132","static/chunks/74132-876f256c7a6101af.js","58974","static/chunks/app/page-c6c68b33156be10a.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l2_biz/auth/l2-login.tsx":{"id":21358,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/pi-desk/pi-desk/src/":[],"/home/runner/work/pi-desk/pi-desk/src/app/not-found":[],"/home/runner/work/pi-desk/pi-desk/src/app/layout":[{"inlined":false,"path":"static/css/3213ee28336bddc2.css"}],"/home/runner/work/pi-desk/pi-desk/src/app/error":[],"/home/runner/work/pi-desk/pi-desk/src/app/global-error":[],"/home/runner/work/pi-desk/pi-desk/src/app/page":[{"inlined":false,"path":"static/css/f6a76a493aae9ae3.css"}],"/home/runner/work/pi-desk/pi-desk/src/app/_global-error/page":[]},"rscModuleMapping":{"14405":{"*":{"id":"52047","name":"*","chunks":[],"async":false}},"21358":{"*":{"id":"69079","name":"*","chunks":[],"async":false}},"22432":{"*":{"id":"7770","name":"*","chunks":[],"async":false}},"23367":{"*":{"id":"39159","name":"*","chunks":[],"async":false}},"32422":{"*":{"id":"11568","name":"*","chunks":[],"async":false}},"33948":{"*":{"id":"52442","name":"*","chunks":[],"async":false}},"44478":{"*":{"id":"47594","name":"*","chunks":[],"async":false}},"64282":{"*":{"id":"64669","name":"*","chunks":[],"async":false}},"66999":{"*":{"id":"88893","name":"*","chunks":[],"async":false}},"69173":{"*":{"id":"17179","name":"*","chunks":[],"async":false}},"71713":{"*":{"id":"70961","name":"*","chunks":[],"async":false}},"84178":{"*":{"id":"12707","name":"*","chunks":[],"async":false}},"84845":{"*":{"id":"56951","name":"*","chunks":[],"async":false}},"90184":{"*":{"id":"270","name":"*","chunks":[],"async":false}},"97876":{"*":{"id":"29190","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_global-error/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"14405":{"*":{"id":"27297","name":"*","chunks":[],"async":false}},"21358":{"*":{"id":"41051","name":"*","chunks":[],"async":false}},"22432":{"*":{"id":"1480","name":"*","chunks":[],"async":false}},"23367":{"*":{"id":"49453","name":"*","chunks":[],"async":false}},"32422":{"*":{"id":"48599","name":"*","chunks":[],"async":false}},"33948":{"*":{"id":"79460","name":"*","chunks":[],"async":false}},"44478":{"*":{"id":"97016","name":"*","chunks":[],"async":false}},"64282":{"*":{"id":"45543","name":"*","chunks":[],"async":false}},"66999":{"*":{"id":"4527","name":"*","chunks":[],"async":false}},"69173":{"*":{"id":"7005","name":"*","chunks":[],"async":false}},"71713":{"*":{"id":"21147","name":"*","chunks":[],"async":false}},"84845":{"*":{"id":"43305","name":"*","chunks":[],"async":false}},"90184":{"*":{"id":"88476","name":"*","chunks":[],"async":false}},"97876":{"*":{"id":"58044","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/client-page.js":{"id":69173,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/client-page.js":{"id":69173,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/client-segment.js":{"id":23367,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/client-segment.js":{"id":23367,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":33948,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":33948,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/layout-router.js":{"id":90184,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/layout-router.js":{"id":90184,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/components/render-from-template-context.js":{"id":44478,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":44478,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/lib/framework/boundary-components.js":{"id":14405,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":14405,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":22432,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":22432,"name":"*","chunks":[],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/pages/l1-error-page.tsx":{"id":66999,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","81881","static/chunks/81881-f11dbe7dc0d04ed9.js","24345","static/chunks/app/not-found-2aab8b33ebbf3257.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/client/script.js":{"id":97876,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","3814","static/chunks/3814-35cfab0ce3aa7c41.js","74220","static/chunks/74220-795a2e7185bd66cb.js","45992","static/chunks/45992-a39a014497ec4dd1.js","31087","static/chunks/31087-333cae396a52f232.js","7177","static/chunks/app/layout-586f6f88483051a7.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/node_modules/.pnpm/next@16.3.1_@babel+core@7.29.7_@opentelemetry+api@1.9.0_@types+node@20.19.43_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/next/dist/esm/client/script.js":{"id":97876,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","3814","static/chunks/3814-35cfab0ce3aa7c41.js","74220","static/chunks/74220-795a2e7185bd66cb.js","45992","static/chunks/45992-a39a014497ec4dd1.js","31087","static/chunks/31087-333cae396a52f232.js","7177","static/chunks/app/layout-586f6f88483051a7.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/providers/l1-app-providers.tsx":{"id":64282,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","3814","static/chunks/3814-35cfab0ce3aa7c41.js","74220","static/chunks/74220-795a2e7185bd66cb.js","45992","static/chunks/45992-a39a014497ec4dd1.js","31087","static/chunks/31087-333cae396a52f232.js","7177","static/chunks/app/layout-586f6f88483051a7.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l4_foundation/styles/l4-globals.css":{"id":84178,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","57208","static/chunks/57208-d6d38167dabb91e4.js","3814","static/chunks/3814-35cfab0ce3aa7c41.js","74220","static/chunks/74220-795a2e7185bd66cb.js","45992","static/chunks/45992-a39a014497ec4dd1.js","31087","static/chunks/31087-333cae396a52f232.js","7177","static/chunks/app/layout-586f6f88483051a7.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/app/error.tsx":{"id":84845,"name":"*","chunks":["78923","static/chunks/78923-17a9c337b29dcecd.js","81881","static/chunks/81881-f11dbe7dc0d04ed9.js","18039","static/chunks/app/error-0296a3b20cd1bf00.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/app/global-error.tsx":{"id":71713,"name":"*","chunks":["34219","static/chunks/app/global-error-6f5fc4928fd1966c.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l1_entry/pages/l1-home-page.tsx":{"id":32422,"name":"*","chunks":["85959","static/chunks/287c71e3-32bb21af66f1f035.js","26717","static/chunks/6c0b963a-c492581a5b6359f7.js","94287","static/chunks/cdfede43-b007dd93b1fdb122.js","78923","static/chunks/78923-17a9c337b29dcecd.js","96995","static/chunks/96995-8f8313ea2ac3abd7.js","46270","static/chunks/46270-3e42514685626190.js","57208","static/chunks/57208-d6d38167dabb91e4.js","14197","static/chunks/14197-3d3ddd426ac06c9c.js","34903","static/chunks/34903-e4205c0becabea76.js","74220","static/chunks/74220-795a2e7185bd66cb.js","45992","static/chunks/45992-a39a014497ec4dd1.js","58974","static/chunks/app/page-0f2cf68a4666420b.js"],"async":false},"/home/runner/work/pi-desk/pi-desk/src/client/l2_biz/auth/l2-login.tsx":{"id":21358,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/home/runner/work/pi-desk/pi-desk/src/":[],"/home/runner/work/pi-desk/pi-desk/src/app/not-found":[],"/home/runner/work/pi-desk/pi-desk/src/app/layout":[{"inlined":false,"path":"static/css/adb1d4e48dd43c0a.css"},{"inlined":false,"path":"static/css/3213ee28336bddc2.css"}],"/home/runner/work/pi-desk/pi-desk/src/app/error":[],"/home/runner/work/pi-desk/pi-desk/src/app/global-error":[],"/home/runner/work/pi-desk/pi-desk/src/app/page":[{"inlined":false,"path":"static/css/adb1d4e48dd43c0a.css"}],"/home/runner/work/pi-desk/pi-desk/src/app/_global-error/page":[]},"rscModuleMapping":{"14405":{"*":{"id":"52047","name":"*","chunks":[],"async":false}},"21358":{"*":{"id":"69079","name":"*","chunks":[],"async":false}},"22432":{"*":{"id":"7770","name":"*","chunks":[],"async":false}},"23367":{"*":{"id":"39159","name":"*","chunks":[],"async":false}},"32422":{"*":{"id":"11568","name":"*","chunks":[],"async":false}},"33948":{"*":{"id":"52442","name":"*","chunks":[],"async":false}},"44478":{"*":{"id":"47594","name":"*","chunks":[],"async":false}},"64282":{"*":{"id":"64669","name":"*","chunks":[],"async":false}},"66999":{"*":{"id":"88893","name":"*","chunks":[],"async":false}},"69173":{"*":{"id":"17179","name":"*","chunks":[],"async":false}},"71713":{"*":{"id":"70961","name":"*","chunks":[],"async":false}},"84178":{"*":{"id":"12707","name":"*","chunks":[],"async":false}},"84845":{"*":{"id":"56951","name":"*","chunks":[],"async":false}},"90184":{"*":{"id":"270","name":"*","chunks":[],"async":false}},"97876":{"*":{"id":"29190","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};