@agimon-ai/po-git 0.0.0-alpha.36 → 0.0.0-alpha.37
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.
|
@@ -78,6 +78,14 @@ function branchOptions(branches, query) {
|
|
|
78
78
|
}));
|
|
79
79
|
return [...local, ...remote].slice(0, MAX_LISTED);
|
|
80
80
|
}
|
|
81
|
+
/** Every base a new branch can start from: the default first, then remote-tracking names, then local branches. */
|
|
82
|
+
function baseOptions(branches) {
|
|
83
|
+
return [.../* @__PURE__ */ new Set([
|
|
84
|
+
...branches.defaultBase === void 0 ? [] : [branches.defaultBase],
|
|
85
|
+
...branches.remote.map((branch) => `${branch.remote}/${branch.name}`),
|
|
86
|
+
...branches.local.map((branch) => branch.name)
|
|
87
|
+
])];
|
|
88
|
+
}
|
|
81
89
|
/** Why the form cannot be submitted yet, or undefined when it can. */
|
|
82
90
|
function formProblem(state) {
|
|
83
91
|
if (state.mode === "existing") {
|
|
@@ -132,6 +140,7 @@ function GitNewSessionSheetView({ workspaceRoot, branches, loadError = "", initi
|
|
|
132
140
|
...initialForm
|
|
133
141
|
});
|
|
134
142
|
const [query, setQuery] = useState("");
|
|
143
|
+
const [basesOpen, setBasesOpen] = useState(false);
|
|
135
144
|
const ready = branches?.repository === true && loadError === "";
|
|
136
145
|
const loading = branches === null && loadError === "";
|
|
137
146
|
const mode = ready || loading ? form.mode : "plain";
|
|
@@ -146,6 +155,7 @@ function GitNewSessionSheetView({ workspaceRoot, branches, loadError = "", initi
|
|
|
146
155
|
...patch
|
|
147
156
|
}));
|
|
148
157
|
const options = branches === null ? [] : branchOptions(branches, query);
|
|
158
|
+
const bases = branches === null ? [] : baseOptions(branches);
|
|
149
159
|
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(SheetHeader, { children: /* @__PURE__ */ jsx(SheetTitle, { children: "New session" }) }), /* @__PURE__ */ jsxs(SheetBody, {
|
|
150
160
|
style: styles$3.body,
|
|
151
161
|
children: [
|
|
@@ -220,16 +230,29 @@ function GitNewSessionSheetView({ workspaceRoot, branches, loadError = "", initi
|
|
|
220
230
|
})]
|
|
221
231
|
}), /* @__PURE__ */ jsxs(View, {
|
|
222
232
|
style: styles$3.field,
|
|
223
|
-
children: [/* @__PURE__ */ jsx(Label, { children: "From" }), /* @__PURE__ */
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
+
children: [/* @__PURE__ */ jsx(Label, { children: "From" }), /* @__PURE__ */ jsxs(View, {
|
|
234
|
+
style: styles$3.list,
|
|
235
|
+
children: [/* @__PURE__ */ jsx(ListRow, {
|
|
236
|
+
accessibilityLabel: "From",
|
|
237
|
+
title: /* @__PURE__ */ jsx(Text, {
|
|
238
|
+
style: styles$3.mono,
|
|
239
|
+
children: state.baseRef || "Current branch"
|
|
240
|
+
}),
|
|
241
|
+
disabled: busy,
|
|
242
|
+
onPress: () => setBasesOpen((open) => !open)
|
|
243
|
+
}), basesOpen ? bases.map((base) => /* @__PURE__ */ jsx(ListRow, {
|
|
244
|
+
title: /* @__PURE__ */ jsx(Text, {
|
|
245
|
+
style: styles$3.mono,
|
|
246
|
+
children: base
|
|
247
|
+
}),
|
|
248
|
+
selected: state.baseRef === base,
|
|
249
|
+
disabled: busy,
|
|
250
|
+
disclosure: false,
|
|
251
|
+
onPress: () => {
|
|
252
|
+
update({ baseRef: base });
|
|
253
|
+
setBasesOpen(false);
|
|
254
|
+
}
|
|
255
|
+
}, base)) : null]
|
|
233
256
|
})]
|
|
234
257
|
})] }) : /* @__PURE__ */ jsx(Text, {
|
|
235
258
|
style: styles$3.dim,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["WebPluginSlotProps","Button","fontOf","Input","Label","ListRow","SegmentedControl","SheetBody","SheetHeader","SheetTitle","useEffect","useState","StyleSheet","api","GitBranchesResponse","GitSessionCreated","branchOptions","createRequest","formProblem","NewSessionFormState","NewSessionMode","MODES","value","label","const","GitNewSessionSheetViewProps","workspaceRoot","branches","loadError","initialForm","Partial","busy","error","onCreate","form","GitNewSessionSheetView","setForm","mode","newBranch","baseRef","name","query","setQuery","ready","repository","loading","state","defaultBase","problem","update","patch","current","options","styles","body","root","dim","field","list","length","pad","map","branch","index","key","remote","undefined","divider","mono","busyAt","selected","errorOf","status","String","GitNewSessionSheet","newSession","setBranches","setLoadError","setError","setBusy","workspaceId","request","requestWithStepUp","stale","workspace","url","then","response","json","catch","ok","submit","Promise","failure","createPlain","createSession","method","headers","JSON","stringify","answer","openCreated","sessionId","create","theme","sans","fontFamily","gap","spacing","uni__dependencies","fontSize","sm","lineHeight","color","colors","textAlign","lineHeightRelaxed","red","base","hi","borderRadius","lg","borderWidth","borderColor","overflow","paddingHorizontal","paddingVertical","borderTopWidth","hairlineWidth","borderTopColor","styles","isRecord","optionalText","optionalErrorTarget","WebPluginSlotProps","Badge","Button","ChevronRightIcon","Dot","fontOf","Input","Sheet","SheetContent","Spinner","useCallback","useState","useSyncExternalStore","StyleSheet","WorktreeView","requestWorktreeClose","requestWorktreeCreate","worktreeActivity","worktreesPresentation","WorktreesSession","useWorktrees","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","worktreesTab","Parameters","id","label","panel","WorktreesPanel","WorktreesHeader","activity","onNew","disabled","styles","header","title","newPill","jade","WorktreeRow","item","error","compact","onClose","onOpen","worktree","line","orphaned","unowned","grow","undefined","branch","length","slice","dim","caution","info","more","path","WorktreeStarting","starting","WorktreeGroup","count","group","heading","WorktreeForm","close","baseRef","onBranch","onBaseRef","onConfirm","onCancel","framed","value","sheet","unframed","handle","sheetTitle","body","monoInput","trim","fullButton","createButton","createLabel","WorktreesView","working","attention","closeErrorId","row","pending","errorTarget","action","screen","worktrees","content","map","requestedBranch","empty","emptyCopy","some","sessionReservationId","openSession","creating","setCreating","setBranch","setBaseRef","closing","setClosing","busy","scroll","open","create","theme","flex","backgroundColor","colors","rail","uni__dependencies","flexGrow","flexDirection","alignItems","justifyContent","padding","spacing","minHeight","fontFamily","sans","fontSize","fontWeight","color","hi","borderRadius","full","paddingHorizontal","gap","paddingTop","paddingBottom","borderBottomWidth","hairlineWidth","borderColor","lg","lineHeight","sm","base","text","marginTop","mono","marginLeft","paddingVertical","minWidth","width","height","green","red","borderTopWidth","bg","border","borderTopLeftRadius","borderTopRightRadius","alignSelf","marginBottom","xl","textAlign","styles","isRecord","Button","SyntaxLine","Textarea","fontOf","BranchIcon","ChevronRightIcon","MessageIcon","AlertIcon","ReviewComment","memo","useMemo","useState","StyleSheet","useUnistyles","GitDiffRow","GitReviewFileEntry","GitChangesPayload","GitReviewSummary","GitReviewFileDiff","GitSyncAction","GitLineRange","suggestedSyncAction","upstreamSummary","Action","children","variant","disabled","onPress","theme","styles","action","primary","primaryLabel","color","scheme","colors","rail","Footer","count","discard","confirmation","onReview","onSend","onDiscard","footer","inline","dim","SyncCard","changes","busy","onSync","suggested","card","branch","grow","green","added","red","removed","mono","base","upstream","const","map","rebase","undefined","FileList","files","comments","onFile","path","list","section","length","file","fileRow","status","blue","yellow","toUpperCase","body","split","at","slice","join","some","comment","filter","ConfirmSheet","onConfirm","onCancel","sheet","handle","sheetTitle","RebaseCard","conflicts","onResolve","onAbort","caution","FileHeader","entry","index","total","onPrevious","onNext","onChanges","content","heading","navigation","DiffRows","rows","selection","onLine","showInlineComments","gutterDigits","row","anchoredComments","Map","key","side","endLine","startLine","entries","get","push","set","digits","reduce","max","Math","String","line","i","marker","anchored","diffRow","gutter","padStart","code","id","inlineComment","lineLabel","CommentSheet","range","snippet","value","onChange","onAdd","quote","trim","CommentCards","onRemove","relPath","remove","create","fontFamily","sans","fontSize","fontWeight","hi","uni__dependencies","xl","lg","lineHeight","lineHeightRelaxed","text","sm","padding","spacing","gap","borderWidth","borderColor","border","borderRadius","flexDirection","alignItems","flex","minWidth","minHeight","backgroundColor","paddingVertical","borderBottomWidth","hairlineWidth","justifyContent","borderTopWidth","failure","borderTopLeftRadius","borderTopRightRadius","height","width","md","alignSelf","empty","paddingHorizontal","borderLeftWidth","borderLeftColor","bg","flexShrink","textAlign","disclosure","margin","panel","GitReviewViewProps","screen","initialVisibleRows","activity","summary","error","forceRequired","onScreen","onForce","onDismiss","onComment","DIFF_ROW_STEP","GitReviewView","props","hunks","flatMap","hunk","fileComments","initialLimit","setDisclosure","limit","current","visibleRows","findIndex","repository","pending","truncated","previous","next","binary","tooLarge","min","styles","WebPluginSlotProps","Button","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","useCallback","useEffect","useRef","useState","useSyncExternalStore","GitDiffRow","GitReviewFileDiff","GitReviewSummary","GitSyncAction","gitChanges","requestGitSync","fetchReviewFile","fetchReviewSummary","selectReviewLine","reviewRangeRows","GitLineRange","addReviewComment","clearReviewComments","gitReview","removeReviewComment","conflictPrompt","deliverToAgent","reviewHeading","GitReviewView","CommentSheet","styles","useGitChanges","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","reviewTab","Parameters","id","label","panel","GitReviewPanel","props","GitReviewPanelSession","sendSessionFrame","activity","comments","summary","setSummary","file","setFile","error","setError","dismissedError","setDismissedError","confirm","setConfirm","screen","setScreen","path","setPath","selection","setSelection","draft","setDraft","range","snippet","request","AbortController","undefined","fingerprint","JSON","stringify","changes","controller","signal","then","result","aborted","ok","catch","cause","Error","message","String","abort","current","loadFile","diff","send","onSent","failure","sync","action","forceRequired","errorTarget","sendReview","length","body","map","item","anchor","startLine","relPath","side","endLine","quoted","split","slice","join","line","trim","branch","base","selectLine","row","next","complete","rows","hunks","flatMap","hunk","content","rebase","conflicts","open","comment","dim","pending","CommentEditor","onAdd","Omit","setBody","styles","WebPluginSlotProps","Button","ChevronRightIcon","FileIcon","fontOf","Spinner","StyleSheet","reviewTab","useGitChanges","useWorktrees","worktreesTab","WorktreeRow","WorktreeGroup","WorktreeStarting","GitChangesSession","worktreesPresentation","WorktreesSession","GitChangesRow","state","branch","added","removed","onReview","styles","changeRow","line","heading","grow","changeDetail","jade","error","dim","WorktreesActivityView","git","disabled","onWorktrees","starting","section","changes","pending","startsWith","files","worktrees","length","map","item","id","requestedBranch","idle","link","WorktreesActivitySection","sessionId","openTransientTab","filter","create","theme","gap","spacing","uni__dependencies","fontFamily","sans","fontSize","lg","lineHeight","fontWeight","color","colors","hi","sm","mono","base","flexDirection","alignItems","minHeight","flex","minWidth","green","red","paddingVertical","borderBottomWidth","hairlineWidth","borderColor","paddingLeft","paddingHorizontal","fillGitNewSession","activityGroupGit","channelGitChanges","channelGitWorktrees","fillWorktrees","lifecycleStart"],"sources":["../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/(frontend)/_lib/newSessionForm.ts","../../src/extensions/workspaces/(frontend)/fill/_components/GitNewSessionSheet.native.tsx","../../src/extensions/workspaces/(frontend)/fill/GitNewSession.new-session.native.tsx","../../src/types/webWorktrees.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/worktreesActivityStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/WorktreesPanel.native.tsx","../../src/types/gitReview.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitChangesStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/git.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/git-changes.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/git-worktrees.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewSelection.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewView.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/GitReviewView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/GitReviewPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/WorktreesActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Worktrees.activity.git.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.native.ts","../../generated/native.ts"],"sourcesContent":["import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { GitAuthView } from './gitAuth';\nimport type { GitReviewFileDiff, GitReviewSummary } from './gitReview';\nimport type { GitBranchesResponse, GitSessionCreated } from './gitSessions';\n\n/**\n * The routes the page calls, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/(backend)/api/git/`, which mounts at global scope and so\n * answers workspace and session requests too. Each route answers only where it\n * belongs (auth on a workspace mount, the review on a session mount), so a\n * client accessor on the wrong scope gets a 404 rather than a second way in.\n *\n * Only what the browser calls is listed. The worktree routes stay HTTP for\n * other callers, but the dock drives worktrees over its channel.\n */\nconst routes = {\n /** Workspace: the new-session dialog's branch list. */\n branches: {\n method: 'GET',\n path: '/branches',\n response: undefined as unknown as ApiResponseOf<GitBranchesResponse>,\n },\n /** Workspace: a top-level worktree session on an existing or new branch. */\n createSession: {\n method: 'POST',\n path: '/sessions',\n response: undefined as unknown as ApiResponseOf<GitSessionCreated>,\n },\n /** Workspace: that workspace's saved remote auth, never the token itself. */\n auth: {\n method: 'GET',\n path: '/auth',\n query: ['repositoryId'],\n response: undefined as unknown as ApiResponseOf<GitAuthView>,\n },\n /** Workspace: replaces that workspace's remote auth. Passkey step-up gated for remote devices. */\n saveAuth: {\n method: 'PUT',\n path: '/auth',\n query: ['repositoryId'],\n response: undefined as unknown as ApiResponseOf<GitAuthView>,\n },\n /** Session: the files this session's checkout changed against its base. */\n review: {\n method: 'GET',\n path: '/review',\n response: undefined as unknown as ApiResponseOf<GitReviewSummary>,\n },\n /** Session: one changed file's hunks. */\n reviewFile: {\n method: 'GET',\n path: '/review/file',\n query: ['path'],\n response: undefined as unknown as ApiResponseOf<GitReviewFileDiff>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'git' at. */\nexport const apiScopes = ['global', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'git',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import type { GitBranches, GitSessionCreateRequest } from '../../../../types/gitSessions';\n\nexport type NewSessionMode = 'existing' | 'new' | 'plain';\n\n/** One row of the branch picker: a local branch, or a remote-only one. */\nexport interface BranchOption {\n key: string;\n name: string;\n remote?: string;\n current: boolean;\n /** Set when the branch is checked out elsewhere and cannot get a second worktree. */\n busyAt?: string;\n}\n\nexport interface NewSessionFormState {\n mode: NewSessionMode;\n /** The picked existing branch. */\n selected?: BranchOption;\n newBranch: string;\n baseRef: string;\n name: string;\n}\n\nconst MAX_LISTED = 200;\n\n/** Local branches first, then remote-only ones, filtered by a case-insensitive substring. */\nexport function branchOptions(branches: GitBranches, query: string): BranchOption[] {\n const needle = query.trim().toLowerCase();\n const matches = (text: string): boolean => needle === '' || text.toLowerCase().includes(needle);\n const local = branches.local\n .filter((branch) => matches(branch.name))\n .map((branch) => ({\n key: `local:${branch.name}`,\n name: branch.name,\n current: branch.name === branches.current,\n ...(branch.checkedOutAt === undefined ? {} : { busyAt: branch.checkedOutAt }),\n }));\n const remote = branches.remote\n .filter((branch) => matches(`${branch.remote}/${branch.name}`))\n .map((branch) => ({\n key: `remote:${branch.remote}/${branch.name}`,\n name: branch.name,\n remote: branch.remote,\n current: false,\n }));\n return [...local, ...remote].slice(0, MAX_LISTED);\n}\n\n/** Every base a new branch can start from: the default first, then remote-tracking names, then local branches. */\nexport function baseOptions(branches: GitBranches): string[] {\n const names = new Set([\n ...(branches.defaultBase === undefined ? [] : [branches.defaultBase]),\n ...branches.remote.map((branch) => `${branch.remote}/${branch.name}`),\n ...branches.local.map((branch) => branch.name),\n ]);\n return [...names];\n}\n\n/** Why the form cannot be submitted yet, or undefined when it can. */\nexport function formProblem(state: NewSessionFormState): string | undefined {\n if (state.mode === 'existing') {\n if (state.selected === undefined) return 'Pick a branch.';\n if (state.selected.busyAt !== undefined) return `That branch is checked out at ${state.selected.busyAt}.`;\n }\n if (state.mode === 'new' && state.newBranch.trim() === '') return 'Name the new branch.';\n return undefined;\n}\n\n/** The worktree create request for the form, or undefined in plain mode. */\nexport function createRequest(state: NewSessionFormState): GitSessionCreateRequest | undefined {\n const name = state.name.trim();\n const named = name === '' ? {} : { name };\n if (state.mode === 'existing' && state.selected !== undefined)\n return {\n mode: 'existing-branch',\n branch: state.selected.name,\n ...(state.selected.remote === undefined ? {} : { remote: state.selected.remote }),\n ...named,\n };\n if (state.mode === 'new') {\n const baseRef = state.baseRef.trim();\n return {\n mode: 'new-branch',\n branch: state.newBranch.trim(),\n ...(baseRef === '' ? {} : { baseRef }),\n ...named,\n };\n }\n return undefined;\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n fontOf,\n Input,\n Label,\n ListRow,\n SegmentedControl,\n SheetBody,\n SheetHeader,\n SheetTitle,\n} from '@agimon-ai/po-native-components';\nimport { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { api } from '../../../../../../generated/client.native';\nimport type { GitBranchesResponse, GitSessionCreated } from '../../../../../types/gitSessions';\nimport {\n branchOptions,\n createRequest,\n formProblem,\n type NewSessionFormState,\n type NewSessionMode,\n} from '../../_lib/newSessionForm';\n\nconst MODES = [\n { value: 'existing', label: 'Existing' },\n { value: 'new', label: 'New branch' },\n { value: 'plain', label: 'No branch' },\n] as const;\n\nexport interface GitNewSessionSheetViewProps {\n workspaceRoot: string;\n branches: GitBranchesResponse | null;\n loadError?: string;\n initialForm?: Partial<NewSessionFormState>;\n busy?: boolean;\n error?: string;\n onCreate: (form: NewSessionFormState) => void;\n}\n\n/** The native twin of GitNewSessionDialogView: the same form state and checks, in sheet parts. */\nexport function GitNewSessionSheetView({\n workspaceRoot,\n branches,\n loadError = '',\n initialForm,\n busy = false,\n error = '',\n onCreate,\n}: GitNewSessionSheetViewProps) {\n const [form, setForm] = useState<NewSessionFormState>({\n mode: 'existing',\n newBranch: '',\n baseRef: '',\n name: '',\n ...initialForm,\n });\n const [query, setQuery] = useState('');\n const ready = branches?.repository === true && loadError === '';\n const loading = branches === null && loadError === '';\n const mode = ready || loading ? form.mode : 'plain';\n const state = { ...form, mode, baseRef: form.baseRef || branches?.defaultBase || '' };\n const problem = formProblem(state);\n const update = (patch: Partial<NewSessionFormState>): void => setForm((current) => ({ ...current, ...patch }));\n const options = branches === null ? [] : branchOptions(branches, query);\n return (\n <>\n <SheetHeader>\n <SheetTitle>New session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.root} numberOfLines={1} ellipsizeMode=\"middle\">\n {workspaceRoot}\n </Text>\n {!ready ? (\n <Text testID=\"git-new-session-plain-note\" style={styles.dim}>\n {loading\n ? 'Reading branches...'\n : loadError || 'This workspace is not a git checkout. Start a plain session in this folder.'}\n </Text>\n ) : (\n <>\n <SegmentedControl\n accessibilityLabel=\"Session kind\"\n options={MODES}\n value={mode}\n disabled={busy}\n onValueChange={(value) => update({ mode: value as NewSessionMode })}\n />\n {mode === 'existing' ? (\n <View style={styles.field}>\n <Label>Branch</Label>\n <Input\n testID=\"git-new-session-branch-search\"\n accessibilityLabel=\"Find a branch\"\n placeholder=\"Find a branch\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n value={query}\n onChangeText={setQuery}\n disabled={busy}\n />\n <View style={styles.list} accessibilityLabel=\"Branches\">\n {options.length === 0 ? <Text style={[styles.dim, styles.pad]}>No matching branches</Text> : null}\n {options.map((branch, index) => (\n <View key={branch.key}>\n {branch.remote !== undefined && (index === 0 || options[index - 1]?.remote === undefined) ? (\n <Text style={[styles.dim, styles.pad, styles.divider]}>Remote branches</Text>\n ) : null}\n <ListRow\n title={\n <Text style={styles.mono}>\n {branch.remote === undefined ? branch.name : `${branch.remote}/${branch.name}`}\n </Text>\n }\n description={\n branch.busyAt !== undefined\n ? `Checked out in ${branch.busyAt}`\n : branch.current\n ? 'Current'\n : undefined\n }\n selected={form.selected?.key === branch.key}\n disabled={branch.busyAt !== undefined || busy}\n disclosure={false}\n onPress={() => update({ selected: branch })}\n />\n </View>\n ))}\n </View>\n </View>\n ) : mode === 'new' ? (\n <>\n <View style={styles.field}>\n <Label>Branch name</Label>\n <Input\n testID=\"git-new-session-new-branch\"\n accessibilityLabel=\"Branch name\"\n placeholder=\"feature/my-change\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={styles.mono}\n value={form.newBranch}\n onChangeText={(newBranch) => update({ newBranch })}\n disabled={busy}\n />\n </View>\n <View style={styles.field}>\n <Label>From</Label>\n {/* ponytail: free-text base ref; a picker sheet when typing names proves painful. */}\n <Input\n testID=\"git-new-session-base\"\n accessibilityLabel=\"From\"\n placeholder={branches?.defaultBase ?? 'Current branch'}\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={styles.mono}\n value={form.baseRef}\n onChangeText={(baseRef) => update({ baseRef })}\n disabled={busy}\n />\n </View>\n </>\n ) : (\n <Text style={styles.dim}>Start in this workspace folder, without creating a worktree.</Text>\n )}\n </>\n )}\n <View style={styles.field}>\n <Label>Name</Label>\n <Input\n testID=\"new-session-name\"\n accessibilityLabel=\"Session name\"\n placeholder={mode === 'plain' ? 'Optional' : 'Optional, defaults to the branch'}\n value={form.name}\n onChangeText={(name) => update({ name })}\n disabled={busy}\n />\n </View>\n {mode !== 'plain' ? (\n <Text style={styles.dim}>Runs in its own worktree, so this checkout stays as it is.</Text>\n ) : null}\n {error ? (\n <Text testID=\"new-session-error\" style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button\n testID=\"new-session-create\"\n variant=\"primary\"\n size=\"lg\"\n loading={busy}\n loadingLabel={mode === 'plain' ? 'Creating session' : 'Creating worktree'}\n disabled={loading || problem !== undefined}\n accessibilityHint={problem}\n onPress={() => onCreate(state)}\n >\n Create session\n </Button>\n </SheetBody>\n </>\n );\n}\n\nfunction errorOf(body: unknown, status: number): string {\n return typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `The cockpit answered ${String(status)}.`;\n}\n\n/** The native new-session sheet when git is installed; mirrors GitNewSessionDialog's calls. */\nexport function GitNewSessionSheet({ newSession }: WebPluginSlotProps) {\n const [branches, setBranches] = useState<GitBranchesResponse | null>(null);\n const [loadError, setLoadError] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const workspaceId = newSession?.workspaceId;\n const request = newSession?.requestWithStepUp;\n\n useEffect(() => {\n if (workspaceId === undefined || request === undefined) return;\n let stale = false;\n void request(api.workspace(workspaceId).branches.url())\n .then(async (response) => {\n const body: unknown = await response.json().catch(() => undefined);\n if (stale) return;\n if (!response.ok) setLoadError(errorOf(body, response.status));\n else setBranches(body as GitBranchesResponse);\n })\n .catch(() => {\n if (!stale) setLoadError('The branches could not be loaded.');\n });\n return () => {\n stale = true;\n };\n }, [workspaceId, request]);\n\n if (newSession === undefined) return null;\n\n const submit = async (state: NewSessionFormState): Promise<void> => {\n if (busy || formProblem(state) !== undefined) return;\n setBusy(true);\n setError('');\n const body = createRequest(state);\n let failure: string | undefined;\n try {\n if (body === undefined) {\n failure = await newSession.createPlain(state.name);\n } else {\n const response = await newSession.requestWithStepUp(api.workspace(newSession.workspaceId).createSession.url(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const answer: unknown = await response.json().catch(() => undefined);\n failure = response.ok\n ? await newSession.openCreated((answer as GitSessionCreated).sessionId)\n : errorOf(answer, response.status);\n }\n } catch {\n failure = 'The cockpit is unreachable.';\n }\n if (failure === undefined) return;\n setError(failure);\n setBusy(false);\n };\n\n return (\n <GitNewSessionSheetView\n workspaceRoot={newSession.workspaceRoot}\n branches={branches}\n loadError={loadError}\n busy={busy}\n error={error}\n onCreate={(state) => void submit(state)}\n />\n );\n}\n\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const mono = fontOf(theme.fontFamily.mono);\n return {\n body: { gap: theme.spacing(4) },\n root: {\n fontFamily: mono,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n textAlign: 'center',\n },\n field: { gap: theme.spacing(1.5) },\n dim: {\n fontFamily: sans,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n error: {\n fontFamily: sans,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.red,\n },\n mono: {\n fontFamily: mono,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.hi,\n },\n list: {\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n overflow: 'hidden',\n },\n pad: { paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(2) },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n };\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { GitNewSessionSheet } from './_components/GitNewSessionSheet.native';\n\nexport default defineFill({ component: GitNewSessionSheet });\n","/**\n * The cockpit's view of this session's worktrees.\n *\n * DESIGN PATTERNS:\n * - Declarations only. The channel frame type is a constant so the hub and the\n * page cannot drift apart on a string.\n * - A view is the subset of a record the dock needs, not the record. The\n * registry may hold paths and provenance the page has no business rendering.\n *\n * AVOID:\n * - Adding behaviour here. This file is imported by browser code, so it must\n * stay free of node builtins.\n */\n\n/** The data channel carrying one session's worktrees to the page. */\nexport const GIT_WORKTREES_TYPE = 'git_worktrees';\n\n/** One worktree, as the activity dock and its panel render it. */\nexport interface WorktreeView {\n id: string;\n branch: string;\n path: string;\n /** The session the hub started for this worktree, when it is still live. */\n sessionId: string | null;\n /** True once the directory the record names has gone missing. */\n orphaned: boolean;\n /**\n * True when the session that asked for this worktree is gone.\n *\n * An owned worktree is only ever shown to its own session. This flag marks\n * the exception: once the parent is dead nobody would see the worktree at\n * all, so every session in the repository does, and may close it.\n */\n unowned: boolean;\n}\n\n/**\n * What the panel asks the hub channel to do.\n *\n * The dock acts through its own channel rather than through the agent: a\n * worktree made from the panel and one made by the tool take the same\n * `worktreeOperations` path, but the panel no longer has to spend a turn of\n * the conversation to get there.\n */\nexport type GitWorktreesCommand =\n | { action: 'create'; branch: string; baseRef?: string; reservationId?: string }\n | { action: 'close'; id: string; force?: boolean };\n\nexport type WorktreeErrorTarget = { action: 'create' } | { action: 'close'; id: string };\n\nexport interface GitWorktreesPayload {\n worktrees: WorktreeView[];\n /** Label of the operation in flight, absent when the session is idle. */\n pending?: string;\n /** The last failure, cleared when the next command starts. */\n error?: string;\n /** The operation that produced the last failure, when known. */\n errorTarget?: WorktreeErrorTarget;\n}\n","/**\n * The dock's view of this session's worktrees, and the commands it sends.\n *\n * DESIGN PATTERNS:\n * - Session-scoped store fed by one hub channel. The hub is authoritative; the\n * page never reads a registry and never guesses.\n * - Actions are channel frames, not prompts. The hub half owns the tool's\n * operations, so the panel names the work and the hub performs it; a\n * worktree made from the dock is the same object the tool makes, without\n * spending a turn of the conversation to ask for it.\n * - The sender lives in a store rather than a module variable, because a web\n * plugin keeps no mutable module state and the page may reconnect.\n *\n * AVOID:\n * - Calling the hub package API from here. A dock slot gets no sealed request\n * transport, and raw fetch breaks the remote cockpit.\n * - `sendSessionFrame` for a command. It envelopes the frame as a session\n * command bound for the agent, which never reaches a channel's `receive`.\n */\nimport { defineGlobalStore, defineSessionStore, type WebPluginRuntime } from '@agimon-ai/po-core/native';\n\nimport {\n GIT_WORKTREES_TYPE,\n type GitWorktreesCommand,\n type WorktreeErrorTarget,\n type WorktreeView,\n} from '../../../../../types/webWorktrees';\n\nexport interface WorktreesSession {\n /** Locally requested branch, until the hub publishes its completed worktree or failure. */\n requestedBranch?: string;\n /** The worktrees the hub last reported for this session's repository. */\n worktrees: WorktreeView[];\n /** Label of the operation the hub is running for this session. */\n pending: string | undefined;\n /** The last failure the hub reported, shown until the next command. */\n error: string | undefined;\n /** The operation that produced the last failure, when known. */\n errorTarget?: WorktreeErrorTarget;\n}\n\n/** Presentation state follows hub operation labels, including session startup progress. */\nexport function worktreesPresentation(state: WorktreesSession) {\n return {\n working: state.worktrees.filter((item) => !item.orphaned && !item.unowned),\n attention: state.worktrees.filter((item) => item.orphaned || item.unowned),\n starting:\n state.requestedBranch !== undefined\n ? !state.error && !state.worktrees.some((item) => item.branch === state.requestedBranch)\n : !!state.pending && /^(creating|starting session)/i.test(state.pending),\n closeErrorId: state.errorTarget?.action === 'close' ? state.errorTarget.id : undefined,\n };\n}\n\nexport const worktreeActivity = defineSessionStore<WorktreesSession>({\n worktrees: [],\n pending: undefined,\n error: undefined,\n errorTarget: undefined,\n});\n\n/** Captures the clicked card, so a focus change cannot retarget an open dialog. */\nexport const worktreeCreateDialog = defineGlobalStore<{ sessionId: string; reservationId?: string } | null>(null);\n/**\n * The page's hub socket sender, held for as long as the plugin runs.\n *\n * Undefined before `startWorktreeRuntime` and after it disposes; a command\n * sent in that window is dropped rather than queued, because a queue would\n * replay a worktree create against a socket that has since changed sessions.\n */\nconst worktreeSender = defineGlobalStore<WebPluginRuntime['sendHubFrame'] | undefined>(undefined);\n\n/** Binds the page's hub socket. The plugin host calls this once per page. */\nexport function startWorktreeRuntime(runtime: WebPluginRuntime): () => void {\n // Wrapped rather than referenced: an unbound method would lose the runtime\n // it belongs to the moment the store hands it back.\n const send = (frame: Record<string, unknown>): void => {\n runtime.sendHubFrame(frame);\n };\n worktreeSender.update(() => send);\n return () => {\n worktreeSender.update((current) => (current === send ? undefined : current));\n worktreeCreateDialog.update(() => null);\n };\n}\n\n/**\n * Whether this session has worktree work in flight.\n *\n * A standing worktree is state, not work: it sits there until someone closes\n * it, so counting it would leave the session reading as busy forever, with a\n * \"background work is still running\" notice under a conversation where\n * nothing is running. Only a create or close actually in progress counts.\n *\n * The group stays visible either way. Declaring an active source at all is\n * what keeps it in the dock; this answers how it is drawn, not whether it is\n * there.\n */\nexport const worktreeActivitySource = {\n subscribe(listener: () => void) {\n const subscription = worktreeActivity.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return worktreeActivity.select(worktreeActivity.store.state, sessionId).pending !== undefined;\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction optionalErrorTarget(value: unknown): WorktreeErrorTarget | undefined {\n if (!isRecord(value)) return undefined;\n if (value.action === 'create') return { action: 'create' };\n if (value.action === 'close' && typeof value.id === 'string' && value.id !== '') {\n return { action: 'close', id: value.id };\n }\n return undefined;\n}\n\n/** The plugin's session data channel: 'git_worktrees' payloads into the store. */\nexport const worktreesChannel = worktreeActivity.channel<WorktreesSession>({\n channel: GIT_WORKTREES_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.worktrees)) return null;\n return {\n worktrees: input.worktrees.filter(isRecord) as unknown as WorktreeView[],\n pending: optionalText(input.pending),\n error: optionalText(input.error),\n errorTarget: optionalErrorTarget(input.errorTarget),\n };\n },\n reduce(current, next) {\n const requestedBranch = current.requestedBranch;\n return {\n ...next,\n ...(requestedBranch && next.pending && !next.error ? { requestedBranch } : {}),\n };\n },\n});\n\n/** Sends one command to the session's worktrees channel. */\nfunction command(sessionId: string, payload: GitWorktreesCommand): void {\n worktreeSender.store.state?.({ type: GIT_WORKTREES_TYPE, sessionId, payload });\n}\n\n/** Asks the hub for a worktree. The hub answers on the same channel. */\nexport function requestWorktreeCreate(\n sessionId: string,\n branch: string,\n baseRef: string,\n reservationId?: string,\n): void {\n const trimmedBase = baseRef.trim();\n if (worktreeSender.store.state) {\n worktreeActivity.update(sessionId, (current) => ({\n ...current,\n requestedBranch: branch.trim(),\n pending: 'creating',\n error: undefined,\n errorTarget: undefined,\n }));\n }\n command(sessionId, {\n action: 'create',\n branch: branch.trim(),\n ...(trimmedBase === '' ? {} : { baseRef: trimmedBase }),\n ...(reservationId === undefined ? {} : { reservationId }),\n });\n}\n\n/** Asks the hub to close one worktree. Refusal on a dirty tree stays the hub's call. */\nexport function requestWorktreeClose(sessionId: string, id: string): void {\n command(sessionId, { action: 'close', id });\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n ChevronRightIcon,\n Dot,\n fontOf,\n Input,\n Sheet,\n SheetContent,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WorktreeView } from '../../../../../types/webWorktrees';\nimport {\n requestWorktreeClose,\n requestWorktreeCreate,\n worktreeActivity,\n worktreesPresentation,\n type WorktreesSession,\n} from '../_lib/worktreesActivityStore.native';\nexport function useWorktrees(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = worktreeActivity.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => worktreeActivity.select(worktreeActivity.store.state, sessionId));\n}\nexport function worktreesTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'git-worktrees', label: 'worktrees', panel: WorktreesPanel };\n}\nexport function WorktreesHeader({\n activity = false,\n onNew,\n disabled = false,\n}: {\n activity?: boolean;\n onNew?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={styles.header}>\n <Text style={styles.title}>{activity ? 'Activity' : 'Worktrees'}</Text>\n {!activity ? (\n <Button testID=\"git-worktree-create\" variant=\"ghost\" style={styles.newPill} disabled={disabled} onPress={onNew}>\n <Text style={styles.jade}>+ New</Text>\n </Button>\n ) : null}\n </View>\n );\n}\n\nexport function WorktreeRow({\n item,\n error,\n compact = false,\n onClose,\n onOpen,\n disabled = false,\n}: {\n item: WorktreeView;\n error?: string;\n compact?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={styles.worktree}>\n <View style={styles.line}>\n <Dot tone={item.orphaned ? 'yellow' : item.unowned ? 'blue' : 'green'} size=\"md\" />\n <Pressable\n style={styles.grow}\n accessibilityRole={onOpen ? 'button' : undefined}\n accessibilityLabel={onOpen ? `Open session for ${item.branch}` : undefined}\n onPress={onOpen}\n disabled={!onOpen}\n >\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.branch}>\n {compact && item.branch.length > 36 ? `${item.branch.slice(0, 19)}…${item.branch.slice(-14)}` : item.branch}\n </Text>\n {!compact ? (\n <Text style={styles.dim}>\n {item.orphaned ? 'Its folder is missing' : item.unowned ? 'Its session has ended' : 'Session running'}\n </Text>\n ) : null}\n </Pressable>\n {item.orphaned ? (\n <Badge tone=\"yellow\" style={styles.caution}>\n Orphaned\n </Badge>\n ) : null}\n {item.unowned ? (\n <Badge tone=\"blue\" style={styles.info}>\n Unowned\n </Badge>\n ) : null}\n {!compact ? (\n <Button\n variant=\"ghost\"\n style={styles.more}\n accessibilityLabel={`Close ${item.branch}`}\n testID={`git-worktree-close-${item.id}`}\n onPress={onClose}\n disabled={disabled}\n >\n ⋮\n </Button>\n ) : (\n <ChevronRightIcon size={16} color=\"dim\" />\n )}\n </View>\n {!compact ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.path}>\n {item.path}\n </Text>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n </View>\n );\n}\n\nexport function WorktreeStarting({ branch }: { branch?: string }) {\n return (\n <View style={styles.starting}>\n <Spinner label=\"Starting session...\" />\n <View style={styles.grow}>\n {branch ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.branch}>\n {branch}\n </Text>\n ) : null}\n <Text style={styles.dim}>Starting session...</Text>\n </View>\n </View>\n );\n}\n\nexport function WorktreeGroup({ title, count }: { title: string; count: string }) {\n return (\n <View style={styles.group}>\n <Text style={styles.heading}>{title}</Text>\n <Text style={styles.dim}>{count}</Text>\n </View>\n );\n}\n\nexport function WorktreeForm({\n close = false,\n branch = '',\n baseRef = '',\n onBranch,\n onBaseRef,\n onConfirm,\n onCancel,\n disabled = false,\n framed = true,\n}: {\n framed?: boolean;\n close?: boolean;\n branch?: string;\n baseRef?: string;\n onBranch?: (value: string) => void;\n onBaseRef?: (value: string) => void;\n onConfirm?: () => void;\n onCancel?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={[styles.sheet, !framed && styles.unframed]}>\n {framed ? <View style={styles.handle} /> : null}\n <Text style={styles.sheetTitle}>{close ? 'Close this worktree?' : 'New worktree'}</Text>\n {close ? (\n <>\n <Text style={styles.branch}>{branch}</Text>\n <Text style={styles.body}>Removes the checkout and stops its session.</Text>\n </>\n ) : (\n <>\n <Text style={styles.body}>\n A separate checkout on its own branch, with its own session. This session stays where it is.\n </Text>\n <Text style={styles.label}>Branch</Text>\n <Input accessibilityLabel=\"Branch\" value={branch} onChangeText={onBranch} style={styles.monoInput} />\n <Text style={styles.label}>Start from</Text>\n <Input\n accessibilityLabel=\"Start from\"\n value={baseRef}\n onChangeText={onBaseRef}\n placeholder=\"Current branch\"\n />\n </>\n )}\n <Button\n onPress={onConfirm}\n disabled={disabled || (!close && branch.trim() === '')}\n variant={close ? 'danger' : 'primary'}\n style={[styles.fullButton, !close && styles.createButton]}\n >\n {close ? 'Close worktree' : <Text style={styles.createLabel}>Create worktree</Text>}\n </Button>\n <Button variant=\"outline\" style={styles.fullButton} onPress={onCancel}>\n Cancel\n </Button>\n </View>\n );\n}\n\nexport function WorktreesView({\n state,\n disabled = false,\n onNew,\n onClose,\n onOpen,\n}: {\n state: WorktreesSession;\n disabled?: boolean;\n onNew?: () => void;\n onClose?: (item: WorktreeView) => void;\n onOpen?: (id: string) => void;\n}) {\n const { working, attention, starting, closeErrorId } = worktreesPresentation(state);\n const row = (item: WorktreeView) => (\n <WorktreeRow\n key={item.id}\n item={item}\n disabled={disabled || !!state.pending}\n onClose={() => onClose?.(item)}\n onOpen={item.sessionId && onOpen ? () => onOpen(item.sessionId!) : undefined}\n error={state.errorTarget?.action === 'close' && state.errorTarget.id === item.id ? state.error : undefined}\n />\n );\n return (\n <View style={styles.screen}>\n <WorktreesHeader disabled={disabled || !!state.pending} onNew={onNew} />\n {state.worktrees.length || starting ? (\n <View style={styles.content}>\n <WorktreeGroup title=\"Working\" count={`${working.length} open${starting ? ' · 1 starting' : ''}`} />\n {working.map(row)}\n {starting ? <WorktreeStarting branch={state.requestedBranch} /> : null}\n {attention.length ? (\n <>\n <WorktreeGroup title=\"Needs a look\" count={`${attention.length} open`} />\n <Text style={styles.dim}>\n {attention.length === 2\n ? 'Two worktrees'\n : attention.length === 1\n ? 'One worktree'\n : `${attention.length} worktrees`}{' '}\n would like your eye, whenever you are ready.\n </Text>\n {attention.map(row)}\n </>\n ) : null}\n </View>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.heading}>No worktrees yet</Text>\n <Text style={styles.emptyCopy}>Create a worktree to run a separate session on its own branch.</Text>\n </View>\n )}\n {state.pending && !starting ? <Text style={styles.dim}>{state.pending}</Text> : null}\n {state.error && (!closeErrorId || !state.worktrees.some((item) => item.id === closeErrorId)) ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {state.error}\n </Text>\n ) : null}\n </View>\n );\n}\nexport function WorktreesPanel({ sessionId, sessionReservationId, openSession }: WebPluginSlotProps) {\n const state = useWorktrees(sessionId);\n const [creating, setCreating] = useState(false);\n const [branch, setBranch] = useState('');\n const [baseRef, setBaseRef] = useState('');\n const [closing, setClosing] = useState<WorktreeView>();\n const busy = sessionId === null || state.pending !== undefined;\n return (\n <>\n <ScrollView contentContainerStyle={styles.scroll}>\n <WorktreesView\n state={state}\n disabled={sessionId === null}\n onNew={() => setCreating(true)}\n onClose={setClosing}\n onOpen={openSession}\n />\n </ScrollView>\n <Sheet open={creating} onOpenChange={setCreating}>\n <SheetContent>\n <WorktreeForm\n framed={false}\n branch={branch}\n baseRef={baseRef}\n onBranch={setBranch}\n onBaseRef={setBaseRef}\n disabled={busy}\n onCancel={() => setCreating(false)}\n onConfirm={() => {\n if (sessionId === null) return;\n requestWorktreeCreate(sessionId, branch, baseRef, sessionReservationId);\n setCreating(false);\n if (sessionReservationId === undefined) {\n setBranch('');\n setBaseRef('');\n }\n }}\n />\n </SheetContent>\n </Sheet>\n <Sheet\n open={!!closing}\n onOpenChange={(open) => {\n if (!open) setClosing(undefined);\n }}\n >\n <SheetContent>\n <WorktreeForm\n framed={false}\n close\n branch={closing?.branch}\n disabled={busy}\n onCancel={() => setClosing(undefined)}\n onConfirm={() => {\n if (sessionId !== null && closing) requestWorktreeClose(sessionId, closing.id);\n setClosing(undefined);\n }}\n />\n </SheetContent>\n </Sheet>\n </>\n );\n}\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.rail },\n scroll: { flexGrow: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(5),\n minHeight: 88,\n },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n newPill: {\n backgroundColor: theme.colors['tint-green'],\n borderRadius: theme.borderRadius.full,\n minHeight: 44,\n paddingHorizontal: theme.spacing(4),\n },\n content: { paddingHorizontal: theme.spacing(5), gap: theme.spacing(2) },\n group: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(3),\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n body: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.dim,\n },\n label: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '500',\n color: theme.colors.text,\n marginTop: theme.spacing(2),\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.hi,\n },\n path: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n marginLeft: theme.spacing(4.5),\n },\n worktree: {\n gap: theme.spacing(1),\n paddingVertical: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n line: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 44 },\n grow: { flex: 1, minWidth: 0, minHeight: 44, justifyContent: 'center', gap: theme.spacing(1) },\n more: { width: 44, height: 44, padding: 0 },\n caution: { backgroundColor: theme.colors['tint-yellow'] },\n info: { backgroundColor: theme.colors['tint-blue'] },\n starting: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 52 },\n jade: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.green,\n fontWeight: '500',\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n unframed: { borderTopWidth: 0 },\n sheet: {\n backgroundColor: theme.colors.bg,\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n borderTopLeftRadius: theme.borderRadius.lg,\n borderTopRightRadius: theme.borderRadius.lg,\n padding: theme.spacing(5),\n gap: theme.spacing(3),\n },\n handle: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: theme.borderRadius.full,\n backgroundColor: theme.colors.border,\n marginBottom: theme.spacing(2),\n },\n sheetTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xl,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n monoInput: { fontFamily: fontOf(theme.fontFamily.mono) },\n fullButton: { height: 44, alignSelf: 'stretch' },\n createButton: { backgroundColor: theme.colors.green },\n createLabel: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.colors.bg,\n },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: theme.spacing(8), gap: theme.spacing(3) },\n emptyCopy: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.dim,\n textAlign: 'center',\n },\n}));\n","/**\n * The cockpit's view of what this session changed against its base: the counts\n * the '# diff' group shows, what the review tab lists and draws, and the manual\n * sync that sits beside them.\n *\n * DESIGN PATTERNS:\n * - Declarations only, shared by the hub and the page.\n * - Its own channel, apart from worktrees. Worktrees are repository\n * management; the diff is this session's code change.\n * - A diff row carries one line number whose file follows from its marker: the\n * new file's for context and additions, the old file's for removals. It is\n * the same shape the shared DiffView draws.\n *\n * AVOID:\n * - Behaviour or node builtins. Browser code imports this file.\n */\n\n/** The session channel carrying this checkout's changes and the sync around them. */\nexport const GIT_CHANGES_TYPE = 'git_changes';\n\n/** The sync actions the review tab offers. */\nexport type GitSyncAction = 'pull' | 'push' | 'rebase' | 'abort-rebase';\n\n/** What the review tab asks the hub to run. `force` only follows a confirmed rejected push. */\nexport type GitChangesCommand =\n | { action: 'pull' }\n | { action: 'push'; force?: true }\n | { action: 'rebase' }\n | { action: 'abort-rebase' };\n\nexport type GitSyncErrorTarget =\n | { action: 'pull' | 'rebase' | 'abort-rebase' }\n /** A push the remote rejected as non-fast-forward; the tab offers a lease force after a confirm. */\n | { action: 'push'; forceRequired?: true };\n\nexport interface GitChangesPayload {\n /** Absent outside a git checkout. */\n changes?: GitChangesView;\n /** Label of the sync command in flight. */\n pending?: string;\n /** The last sync failure, cleared when the next command starts. */\n error?: string;\n errorTarget?: GitSyncErrorTarget;\n}\n\n/** What the session changed since its base, as the '# diff' lane and the review header show it. */\nexport interface GitChangesView {\n /** The checked-out branch; absent on a detached HEAD. */\n branch?: string;\n /** The ref the changes are measured against; absent when none resolved, so only uncommitted work counts. */\n base?: string;\n added: number;\n removed: number;\n files: number;\n /** More files changed than were counted. */\n truncated?: boolean;\n /** The branch's upstream and how far apart the two are. */\n upstream?: { ref: string; ahead: number; behind: number };\n /** Present while a rebase is paused on conflicts. */\n rebase?: { conflicts: string[] };\n}\n\nexport type GitReviewFileStatus = 'added' | 'modified' | 'deleted' | 'untracked' | 'conflicted';\n\n/** One changed file in the review list. */\nexport interface GitReviewFileEntry {\n /** Repository-relative, forward slashes. */\n path: string;\n status: GitReviewFileStatus;\n added: number;\n removed: number;\n binary?: boolean;\n}\n\n/** The review tab's file list. */\nexport interface GitReviewSummary {\n /** False when the session's directory is not a git checkout. */\n repository: boolean;\n branch?: string;\n base?: string;\n /** Short sha of the commit the diff starts from. */\n mergeBase?: string;\n files: GitReviewFileEntry[];\n truncated?: boolean;\n}\n\nexport interface GitDiffRow {\n marker: '+' | '-' | ' ';\n line: number;\n content: string;\n}\n\nexport interface GitDiffHunk {\n start: number;\n rows: GitDiffRow[];\n}\n\n/** One file's hunks, fetched when the reader expands it. */\nexport interface GitReviewFileDiff {\n path: string;\n hunks: GitDiffHunk[];\n binary?: true;\n /** The diff was past the size cap and is not drawn. */\n tooLarge?: true;\n}\n","/**\n * This session's code change against its base, and the manual sync beside it.\n *\n * DESIGN PATTERNS:\n * - Its own session store and hub channel, apart from worktrees. Worktrees are\n * repository management; this is the session's diff.\n * - The hub is authoritative: it computes the counts, runs pull, push and\n * rebase one at a time, and reports pending, errors and a paused rebase here.\n * - The sender lives in a store rather than a module variable, because a web\n * plugin keeps no mutable module state and the page may reconnect.\n *\n * AVOID:\n * - `sendSessionFrame` for a sync command. That frame is bound for the agent\n * and never reaches a channel's `receive`.\n */\nimport { defineGlobalStore, defineSessionStore, type WebPluginRuntime } from '@agimon-ai/po-core/native';\n\nimport {\n GIT_CHANGES_TYPE,\n type GitChangesCommand,\n type GitChangesView,\n type GitSyncAction,\n type GitSyncErrorTarget,\n} from '../../../../../types/gitReview';\n\nexport interface GitChangesSession {\n /** Absent until the hub reports, and outside a git checkout. */\n changes: GitChangesView | undefined;\n pending: string | undefined;\n error: string | undefined;\n errorTarget: GitSyncErrorTarget | undefined;\n}\n\nexport const gitChanges = defineSessionStore<GitChangesSession>({\n changes: undefined,\n pending: undefined,\n error: undefined,\n errorTarget: undefined,\n});\n\n/** The page's hub socket sender; undefined before start and after dispose, when a command is dropped. */\nconst changesSender = defineGlobalStore<WebPluginRuntime['sendHubFrame'] | undefined>(undefined);\n\n/** Binds the page's hub socket for sync commands. The plugin host calls this once per page. */\nexport function startGitChangesRuntime(runtime: WebPluginRuntime): () => void {\n const send = (frame: Record<string, unknown>): void => {\n runtime.sendHubFrame(frame);\n };\n changesSender.update(() => send);\n return () => {\n changesSender.update((current) => (current === send ? undefined : current));\n };\n}\n\n/** Whether a sync command is running for this session. */\nexport const gitChangesActivitySource = {\n subscribe(listener: () => void) {\n const subscription = gitChanges.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return gitChanges.select(gitChanges.store.state, sessionId).pending !== undefined;\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction count(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\n/** The page never trusts a frame's shape: a malformed field drops, the rest still renders. */\nconst MAX_CONFLICTS = 100;\n\nfunction optionalChanges(value: unknown): GitChangesView | undefined {\n if (!isRecord(value)) return undefined;\n const added = count(value.added);\n const removed = count(value.removed);\n const files = count(value.files);\n if (added === undefined || removed === undefined || files === undefined) return undefined;\n const branch = optionalText(value.branch);\n const base = optionalText(value.base);\n const upstream = isRecord(value.upstream) ? value.upstream : undefined;\n const ahead = count(upstream?.ahead);\n const behind = count(upstream?.behind);\n const upstreamRef = optionalText(upstream?.ref);\n const conflicts =\n isRecord(value.rebase) && Array.isArray(value.rebase.conflicts)\n ? value.rebase.conflicts.filter((file): file is string => typeof file === 'string').slice(0, MAX_CONFLICTS)\n : undefined;\n return {\n added,\n removed,\n files,\n ...(branch === undefined ? {} : { branch }),\n ...(base === undefined ? {} : { base }),\n ...(value.truncated === true ? { truncated: true } : {}),\n ...(upstreamRef === undefined || ahead === undefined || behind === undefined\n ? {}\n : { upstream: { ref: upstreamRef, ahead, behind } }),\n ...(conflicts === undefined ? {} : { rebase: { conflicts } }),\n };\n}\n\nfunction optionalErrorTarget(value: unknown): GitSyncErrorTarget | undefined {\n if (!isRecord(value)) return undefined;\n if (value.action === 'pull' || value.action === 'rebase' || value.action === 'abort-rebase')\n return { action: value.action };\n if (value.action === 'push')\n return value.forceRequired === true ? { action: 'push', forceRequired: true } : { action: 'push' };\n return undefined;\n}\n\n/** The session data channel: 'git_changes' payloads into the store. */\nexport const gitChangesChannel = gitChanges.channel<GitChangesSession>({\n channel: GIT_CHANGES_TYPE,\n parse(input) {\n if (!isRecord(input)) return null;\n return {\n changes: optionalChanges(input.changes),\n pending: optionalText(input.pending),\n error: optionalText(input.error),\n errorTarget: optionalErrorTarget(input.errorTarget),\n };\n },\n reduce(_current, next) {\n return next;\n },\n});\n\n/**\n * Asks the hub to pull, push, rebase or abort a paused rebase. `force` is only\n * ever sent after the reader confirmed a lease force for a rejected push.\n */\nexport function requestGitSync(sessionId: string, action: GitSyncAction, force = false): void {\n const payload: GitChangesCommand = action === 'push' && force ? { action: 'push', force: true } : { action };\n changesSender.store.state?.({ type: GIT_CHANGES_TYPE, sessionId, payload });\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { BranchIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { worktreesTab } from '../_components/WorktreesPanel.native';\nimport { gitChangesActivitySource } from '../_lib/gitChangesStore.native';\nimport { worktreeActivitySource } from '../_lib/worktreesActivityStore.native';\n\nexport default defineActivityGroup({\n keys: 'g w',\n icon: () => createElement(BranchIcon),\n activeSource: {\n subscribe(listener) {\n const stopWorktrees = worktreeActivitySource.subscribe(listener);\n const stopChanges = gitChangesActivitySource.subscribe(listener);\n return () => {\n stopWorktrees();\n stopChanges();\n };\n },\n isActive(sessionId) {\n return worktreeActivitySource.isActive(sessionId) || gitChangesActivitySource.isActive(sessionId);\n },\n },\n marksBackgroundWork: false,\n transientTab: worktreesTab,\n order: 30,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { gitChangesChannel } from '../_lib/gitChangesStore.native';\nexport default defineChannelFile(gitChangesChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { worktreesChannel } from '../_lib/worktreesActivityStore.native';\nexport default defineChannelFile(worktreesChannel);\n","import { api } from '../../../../../../generated/client.native';\nimport type { GitReviewFileDiff, GitReviewSummary } from '../../../../../types/gitReview';\n\n/**\n * The review tab's half of the session API: the changed-file list and one\n * file's hunks.\n *\n * The generated client owns the URL and the sealed transport, so nothing here\n * spells a route or reaches for `fetch`. What travels is file contents, which a\n * tunnel's relay must never see in the clear.\n */\n\nconst UNREACHABLE = 'The session is unreachable.';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** The message a reader is shown: the route's own words, or why there were none. */\nfunction messageOf(result: { status: number; error: string }): string {\n if (result.status === 0) return UNREACHABLE;\n return result.error === '' ? `The session answered ${String(result.status)}.` : result.error;\n}\n\nexport type ReviewSummaryResult = { ok: true; summary: GitReviewSummary } | { ok: false; error: string };\n\nexport async function fetchReviewSummary(sessionId: string, signal?: AbortSignal): Promise<ReviewSummaryResult> {\n const result = await api.session(sessionId).review(signal === undefined ? {} : { signal });\n if (!result.ok) return { ok: false, error: messageOf(result) };\n if (!isRecord(result.data) || !Array.isArray(result.data.files)) {\n return { ok: false, error: 'The session answered with no file list.' };\n }\n return { ok: true, summary: result.data };\n}\n\nexport type ReviewFileResult = { ok: true; diff: GitReviewFileDiff } | { ok: false; error: string };\n\nexport async function fetchReviewFile(\n sessionId: string,\n path: string,\n signal?: AbortSignal,\n): Promise<ReviewFileResult> {\n const result = await api\n .session(sessionId)\n .reviewFile({ query: { path }, ...(signal === undefined ? {} : { signal }) });\n if (!result.ok) return { ok: false, error: messageOf(result) };\n if (!isRecord(result.data) || !Array.isArray(result.data.hunks)) {\n return { ok: false, error: 'The session answered with no diff.' };\n }\n return { ok: true, diff: result.data };\n}\n","import type { GitDiffRow } from '../../../../../types/gitReview';\n\nexport interface GitLineRange {\n side: 'old' | 'new';\n startLine: number;\n endLine: number;\n}\n\n/** A different side starts a fresh selection. The second same-side tap completes it. */\nexport function selectReviewLine(\n anchor: GitLineRange | undefined,\n row: GitDiffRow,\n): { range: GitLineRange; complete: boolean } {\n const side = row.marker === '-' ? 'old' : 'new';\n if (!anchor || anchor.side !== side) {\n return { range: { side, startLine: row.line, endLine: row.line }, complete: false };\n }\n return {\n range: { side, startLine: Math.min(anchor.startLine, row.line), endLine: Math.max(anchor.startLine, row.line) },\n complete: true,\n };\n}\n\nexport function reviewRangeRows(rows: readonly GitDiffRow[], range: GitLineRange): GitDiffRow[] {\n return rows.filter(\n (row) =>\n (row.marker === '-' ? 'old' : 'new') === range.side && row.line >= range.startLine && row.line <= range.endLine,\n );\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n/**\n * Review comments queued on this session, waiting to go to the agent as one\n * message.\n *\n * DESIGN PATTERNS:\n * - Session-scoped and in memory: comments survive closing and reopening the\n * review tab, not a page reload. The same trade the files tab makes.\n * - Comments are cleared only after a send the host accepted, never before.\n */\nimport type { ReviewComment } from '@agimon-ai/po-web-components';\n\nexport interface GitReviewSession {\n comments: ReviewComment[];\n}\n\nexport const gitReview = defineSessionStore<GitReviewSession>({ comments: [] });\n\nexport function addReviewComment(sessionId: string, comment: Omit<ReviewComment, 'id'>): void {\n const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n gitReview.update(sessionId, (current) => ({ comments: [...current.comments, { ...comment, id }] }));\n}\n\nexport function removeReviewComment(sessionId: string, id: string): void {\n gitReview.update(sessionId, (current) => ({ comments: current.comments.filter((comment) => comment.id !== id) }));\n}\n\nexport function clearReviewComments(sessionId: string): void {\n gitReview.update(sessionId, () => ({ comments: [] }));\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\nimport type { GitChangesView } from '../../../../../types/gitReview';\n\n/**\n * Pure wording for what the review tab sends the agent, and the one send.\n *\n * Both messages go as `follow_up`: the host starts a turn when idle, or after\n * the current one, without treating a review send as an explicit Queue action.\n * A `prompt` frame instead fails while a turn runs.\n */\n\n/** The opening line of a review, naming what was reviewed. */\nexport function reviewHeading(count: number, branch: string | undefined, base: string | undefined): string {\n const what = branch === undefined ? 'this checkout' : `branch ${branch}`;\n const against = base === undefined ? 'its uncommitted changes' : `its changes against ${base}`;\n const comments = count === 1 ? 'one review comment' : `${String(count)} review comments`;\n const address = count === 1 ? 'Please address it.' : 'Please address them all.';\n return `I reviewed ${what} (${against}) and left ${comments}. ${address}`;\n}\n\n/** What \"ask agent to resolve\" sends: the files, and the steps that finish a paused rebase. */\nexport function conflictPrompt(branch: string | undefined, conflicts: readonly string[]): string {\n const files =\n conflicts.length === 0 ? '- (git reports no unmerged paths yet)' : conflicts.map((file) => `- ${file}`).join('\\n');\n return [\n `A rebase of ${branch ?? 'this checkout'} stopped on conflicts in:`,\n '',\n files,\n '',\n 'Please resolve them:',\n '1. Fix the conflict markers in each file, keeping the intent of both sides.',\n '2. `git add` each resolved file.',\n '3. Run `GIT_EDITOR=true git rebase --continue`, and repeat if it stops again.',\n '',\n 'Do not push. I will push from the cockpit once the rebase is done.',\n ].join('\\n');\n}\n\n/**\n * The one sync the bar fills in: pull while the branch is behind (a push would\n * be rejected), push while it is only ahead or has no upstream yet. Nothing\n * while a rebase is paused, detached, or already level.\n */\nexport function suggestedSyncAction(changes: GitChangesView | undefined): 'pull' | 'push' | undefined {\n if (changes?.branch === undefined || changes.rebase !== undefined) return undefined;\n if (changes.upstream === undefined) return 'push';\n if (changes.upstream.behind > 0) return 'pull';\n return changes.upstream.ahead > 0 ? 'push' : undefined;\n}\n\n/** \"2 to push, 1 new on origin/feat/git\", or \"Up to date with origin/feat/git\". */\nexport function upstreamSummary(upstream: GitChangesView['upstream']): string {\n if (upstream === undefined) return 'No upstream yet';\n const parts = [\n ...(upstream.ahead > 0 ? [`${String(upstream.ahead)} to push`] : []),\n ...(upstream.behind > 0 ? [`${String(upstream.behind)} new on ${upstream.ref}`] : []),\n ];\n return parts.length === 0 ? `Up to date with ${upstream.ref}` : parts.join(', ');\n}\n/**\n * Hands one deferred follow-up to the session. Returns the reason it failed,\n * or undefined once sent. The sender throws when the session is disconnected.\n */\nexport function deliverToAgent(send: SessionFrameSender, sessionId: string, message: string): string | undefined {\n try {\n send(sessionId, { type: 'follow_up', message });\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : 'The session did not take the message.';\n }\n}\n","import {\n Button,\n SyntaxLine,\n Textarea,\n fontOf,\n BranchIcon,\n ChevronRightIcon,\n MessageIcon,\n AlertIcon,\n} from '@agimon-ai/po-native-components';\nimport type { ReviewComment } from '@agimon-ai/po-web-components';\nimport { memo, useMemo, useState } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet, useUnistyles } from 'react-native-unistyles';\n\nimport type {\n GitDiffRow,\n GitReviewFileEntry,\n GitChangesPayload,\n GitReviewSummary,\n GitReviewFileDiff,\n GitSyncAction,\n} from '../../../../../types/gitReview';\nimport type {} from '../../../../../types/unistyles.native';\nimport type { GitLineRange } from '../_lib/gitReviewSelection';\nimport { suggestedSyncAction, upstreamSummary } from '../_lib/gitReviewView';\nexport function Action({\n children,\n variant = 'outline',\n disabled = false,\n onPress,\n}: {\n children: string;\n variant?: 'primary' | 'outline' | 'ghost' | 'danger' | 'danger-outline';\n disabled?: boolean;\n onPress?: () => void;\n}) {\n const { theme } = useUnistyles();\n return (\n <Button\n onPress={onPress}\n variant={variant}\n disabled={disabled}\n style={[styles.action, variant === 'primary' && styles.primary]}\n >\n {variant === 'primary' ? (\n <Text\n style={[\n styles.primaryLabel,\n { color: theme.scheme === 'dark' ? theme.colors.rail : theme.colors['on-selected'] },\n ]}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Button>\n );\n}\n\nexport function Footer({\n count,\n discard = false,\n confirmation = false,\n onReview,\n onSend,\n onDiscard,\n}: {\n count: number;\n discard?: boolean;\n confirmation?: boolean;\n onReview?: () => void;\n onSend?: () => void;\n onDiscard?: () => void;\n}) {\n return (\n <View style={styles.footer}>\n {discard ? (\n <Action variant=\"ghost\" onPress={onDiscard}>\n Discard\n </Action>\n ) : (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Review queued comments\"\n onPress={onReview}\n style={[styles.inline, styles.action]}\n >\n <MessageIcon size={16} color=\"blue\" />\n <Text style={styles.dim}>\n {count} {count === 1 ? 'comment' : 'comments'} queued\n </Text>\n </Pressable>\n )}\n <Action variant={confirmation ? 'outline' : 'primary'} disabled={count === 0} onPress={onSend}>\n Send review\n </Action>\n </View>\n );\n}\n\nexport function SyncCard({\n changes,\n busy = false,\n onSync,\n}: {\n changes: GitChangesPayload['changes'];\n busy?: boolean;\n onSync?: (action: GitSyncAction) => void;\n}) {\n const suggested = suggestedSyncAction(changes);\n return (\n <View style={styles.card}>\n <View style={styles.inline}>\n <BranchIcon size={18} color=\"dim\" />\n <Text style={styles.branch}>{changes?.branch ?? 'Detached HEAD'}</Text>\n <View style={styles.grow} />\n <Text style={styles.green}>+{changes?.added ?? 0}</Text>\n <Text style={styles.red}>-{changes?.removed ?? 0}</Text>\n </View>\n <Text style={[styles.dim, styles.mono]}>{changes?.base ? `vs ${changes.base}` : 'Uncommitted changes'}</Text>\n <Text style={styles.dim}>{upstreamSummary(changes?.upstream)}</Text>\n <View style={styles.inline}>\n {(['pull', 'push', 'rebase'] as const).map((action) => (\n <Button\n key={action}\n variant={suggested === action ? 'outline' : 'ghost'}\n style={suggested === action ? [styles.action, styles.suggested] : styles.action}\n disabled={\n busy ||\n changes?.rebase !== undefined ||\n (action === 'pull'\n ? changes?.upstream === undefined\n : action === 'push'\n ? changes?.branch === undefined\n : changes?.base === undefined)\n }\n onPress={() => onSync?.(action)}\n >\n {action === 'pull' ? 'Pull' : action === 'push' ? 'Push' : 'Rebase'}\n </Button>\n ))}\n </View>\n </View>\n );\n}\n\nexport function FileList({\n files,\n comments = [],\n onFile,\n}: {\n files: GitReviewFileEntry[];\n comments?: ReviewComment[];\n onFile?: (path: string) => void;\n}) {\n return (\n <View style={styles.list}>\n <Text style={styles.section}>{files.length} files</Text>\n {files.map((file) => (\n <Pressable\n key={file.path}\n accessibilityRole=\"button\"\n testID={`git-review-file-${file.path}`}\n onPress={() => onFile?.(file.path)}\n style={styles.fileRow}\n >\n <Text\n style={file.status === 'added' ? styles.green : file.status === 'untracked' ? styles.blue : styles.yellow}\n >\n {file.status[0]?.toUpperCase()}\n </Text>\n <View style={styles.grow}>\n <Text style={styles.body}>{file.path.split('/').at(-1)}</Text>\n <Text numberOfLines={1} style={[styles.dim, styles.mono]}>\n {file.path.split('/').slice(0, -1).join('/') || '.'}\n </Text>\n </View>\n <Text>\n <Text style={styles.green}>+{file.added}</Text> <Text style={styles.red}>-{file.removed}</Text>\n </Text>\n {comments.some((comment) => comment.path === file.path) ? (\n <View style={styles.inline}>\n <MessageIcon size={12} color=\"blue\" />\n <Text style={styles.blue}>{comments.filter((comment) => comment.path === file.path).length}</Text>\n </View>\n ) : null}\n <ChevronRightIcon size={16} color=\"dim\" />\n </Pressable>\n ))}\n </View>\n );\n}\n\nexport function ConfirmSheet({\n discard = false,\n onConfirm,\n onCancel,\n}: {\n discard?: boolean;\n onConfirm?: () => void;\n onCancel?: () => void;\n}) {\n return (\n <View style={styles.sheet}>\n <View style={styles.handle} />\n <Text style={styles.sheetTitle}>{discard ? 'Discard review?' : 'Abort rebase?'}</Text>\n <Text style={styles.dim}>\n {discard ? 'Your queued comments will be removed.' : 'Abort discards any conflict resolution in progress.'}\n </Text>\n <Action variant=\"danger\" onPress={onConfirm}>\n {discard ? 'Discard' : 'Abort rebase'}\n </Action>\n <Action variant=\"ghost\" onPress={onCancel}>\n Cancel\n </Action>\n </View>\n );\n}\n\nexport function RebaseCard({\n confirmation = false,\n conflicts,\n busy = false,\n onResolve,\n onAbort,\n}: {\n confirmation?: boolean;\n conflicts: string[];\n busy?: boolean;\n onResolve?: () => void;\n onAbort?: () => void;\n}) {\n return (\n <View style={[styles.card, styles.caution]}>\n <View style={styles.inline}>\n <AlertIcon size={20} color=\"yellow\" />\n <Text style={styles.section}>Rebase paused</Text>\n </View>\n <Text style={styles.body}>Resolve conflicts or ask Po to do it for you.</Text>\n <Text style={[styles.dim, styles.mono]}>{conflicts.join('\\n')}</Text>\n <Action disabled={busy} onPress={onResolve} variant={confirmation ? 'outline' : 'primary'}>\n Ask Po to resolve\n </Action>\n <Action disabled={busy} onPress={onAbort} variant=\"danger-outline\">\n Abort rebase\n </Action>\n </View>\n );\n}\n\nexport function FileHeader({\n entry,\n index,\n total,\n onPrevious,\n onNext,\n onChanges,\n}: {\n entry: GitReviewFileEntry;\n index: number;\n total: number;\n onPrevious?: () => void;\n onNext?: () => void;\n onChanges?: () => void;\n}) {\n return (\n <View style={styles.content}>\n <Text style={styles.heading}>{entry.path.split('/').at(-1)}</Text>\n <Text style={[styles.dim, styles.mono]}>{entry.path.split('/').slice(0, -1).join('/') || '.'}</Text>\n <View style={styles.inline}>\n <Text style={styles.dim}>\n {entry.status[0]?.toUpperCase()}\n {entry.status.slice(1)}\n </Text>\n <Text style={styles.green}>+{entry.added}</Text>\n <Text style={styles.red}>-{entry.removed}</Text>\n </View>\n <View style={styles.navigation}>\n <Action variant=\"ghost\" disabled={index === 0} onPress={onPrevious}>\n Previous\n </Action>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Return to changes\"\n onPress={onChanges}\n style={[styles.inline, styles.action]}\n >\n <Text style={styles.dim}>\n {onChanges ? 'Changes · ' : ''}\n {index + 1} of {total}\n </Text>\n </Pressable>\n <Action variant=\"ghost\" disabled={index === total - 1} onPress={onNext}>\n Next\n </Action>\n </View>\n </View>\n );\n}\n\nexport const DiffRows = memo(function DiffRows({\n rows,\n comments = [],\n selection,\n onLine,\n showInlineComments = true,\n gutterDigits,\n}: {\n rows: GitDiffRow[];\n comments?: ReviewComment[];\n selection?: GitLineRange;\n onLine?: (row: GitDiffRow) => void;\n showInlineComments?: boolean;\n gutterDigits?: number;\n}) {\n const anchoredComments = useMemo(() => {\n const index = new Map<string, ReviewComment[]>();\n for (const comment of comments) {\n const key = `${comment.side}:${comment.endLine ?? comment.startLine}`;\n const entries = index.get(key);\n if (entries) entries.push(comment);\n else index.set(key, [comment]);\n }\n return index;\n }, [comments]);\n const digits = gutterDigits ?? rows.reduce((max, row) => Math.max(max, String(row.line).length), 1);\n return (\n <View>\n {rows.map((row, i) => {\n const side = row.marker === '-' ? 'old' : 'new';\n const anchored = anchoredComments.get(`${side}:${row.line}`) ?? [];\n return (\n <View key={i}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`Select ${side} line ${row.line}`}\n onPress={() => onLine?.(row)}\n style={[\n styles.diffRow,\n row.marker === '+' && styles.added,\n row.marker === '-' && styles.removed,\n selection?.side === side &&\n row.line >= selection.startLine &&\n row.line <= selection.endLine &&\n styles.selection,\n ]}\n >\n <Text numberOfLines={1} style={[styles.mono, styles.gutter]}>\n {String(row.line).padStart(digits, '\\u00a0')}\n </Text>\n <Text style={[styles.dim, styles.mono]}>{row.marker}</Text>\n <SyntaxLine text={row.content || ' '} style={[styles.mono, styles.code]} />\n {anchored.length ? <MessageIcon size={12} color=\"blue\" /> : null}\n </Pressable>\n {showInlineComments &&\n anchored.map((comment) => (\n <View key={comment.id} style={styles.inlineComment}>\n <Text style={styles.blue}>Queued comment · {lineLabel(comment)}</Text>\n <Text style={styles.body}>{comment.body}</Text>\n </View>\n ))}\n </View>\n );\n })}\n </View>\n );\n});\n\nfunction lineLabel(comment: { startLine?: number; endLine?: number }) {\n return comment.startLine === undefined\n ? 'File comment'\n : comment.endLine === comment.startLine || comment.endLine === undefined\n ? `Line ${comment.startLine}`\n : `Lines ${comment.startLine} to ${comment.endLine}`;\n}\n\nexport function CommentSheet({\n range,\n snippet,\n value,\n onChange,\n onAdd,\n onCancel,\n}: {\n range?: GitLineRange;\n snippet: string;\n value?: string;\n onChange?: (value: string) => void;\n onAdd?: () => void;\n onCancel?: () => void;\n}) {\n return (\n <View style={styles.sheet}>\n <View style={styles.handle} />\n <Text style={styles.sheetTitle}>{range ? lineLabel(range) : 'Comment on file'}</Text>\n {snippet ? (\n <View style={styles.quote}>\n <SyntaxLine text={snippet} style={[styles.body, styles.mono]} />\n </View>\n ) : null}\n <Textarea\n accessibilityLabel=\"What should change here?\"\n placeholder=\"What should change here?\"\n rows={4}\n value={value}\n onChangeText={onChange}\n />\n <Action variant=\"primary\" disabled={value !== undefined && value.trim() === ''} onPress={onAdd}>\n Add comment\n </Action>\n <Action variant=\"ghost\" onPress={onCancel}>\n Cancel\n </Action>\n </View>\n );\n}\n\nexport function CommentCards({ comments, onRemove }: { comments: ReviewComment[]; onRemove?: (id: string) => void }) {\n return (\n <View style={styles.content}>\n <Text style={styles.body}>\n {comments.length === 2 ? 'Two' : comments.length} {comments.length === 1 ? 'comment' : 'comments'} queued for\n Po, whenever you are ready.\n </Text>\n {comments.map((comment) => (\n <View key={comment.id} style={styles.card}>\n <Text style={[styles.body, styles.mono]}>{comment.relPath}</Text>\n <Text style={styles.dim}>{lineLabel(comment)}</Text>\n {comment.snippet ? (\n <View style={styles.quote}>\n <SyntaxLine text={comment.snippet} style={[styles.body, styles.mono]} />\n </View>\n ) : null}\n <Text style={styles.body}>{comment.body}</Text>\n <View style={styles.remove}>\n <Action variant=\"ghost\" onPress={() => onRemove?.(comment.id)}>\n Remove\n </Action>\n </View>\n </View>\n ))}\n </View>\n );\n}\n\nexport const styles = StyleSheet.create((theme) => ({\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n sheetTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xl,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n section: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n body: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.text,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n green: { fontSize: theme.fontSize.sm, color: theme.colors.green },\n red: { fontSize: theme.fontSize.sm, color: theme.colors.red },\n blue: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.blue },\n yellow: { fontSize: theme.fontSize.sm, color: theme.colors.yellow },\n content: { padding: theme.spacing(4), gap: theme.spacing(3) },\n card: {\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.lg,\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n },\n inline: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n grow: { flex: 1, minWidth: 0 },\n action: { minHeight: 44 },\n primary: { backgroundColor: theme.colors.green },\n primaryLabel: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.scheme === 'dark' ? theme.colors.rail : theme.colors['on-selected'],\n },\n suggested: { backgroundColor: theme.colors['tint-green'], borderColor: theme.colors['edge-green'], flex: 1 },\n list: { gap: theme.spacing(2) },\n fileRow: {\n minHeight: 44,\n paddingVertical: theme.spacing(2),\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors.border,\n },\n footer: {\n minHeight: 76,\n padding: theme.spacing(4),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.rail,\n },\n caution: { backgroundColor: theme.colors['tint-yellow'], borderColor: theme.colors['edge-yellow'] },\n failure: { backgroundColor: theme.colors['tint-red'], borderColor: theme.colors['edge-red'] },\n sheet: {\n padding: theme.spacing(4),\n gap: theme.spacing(3),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n borderTopLeftRadius: theme.borderRadius.lg,\n borderTopRightRadius: theme.borderRadius.lg,\n backgroundColor: theme.colors.rail,\n },\n handle: {\n height: 4,\n width: 40,\n borderRadius: theme.borderRadius.md,\n backgroundColor: theme.colors.border,\n alignSelf: 'center',\n },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: theme.spacing(3), padding: theme.spacing(6) },\n navigation: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },\n diffRow: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(2),\n paddingVertical: theme.spacing(1),\n borderLeftWidth: 3,\n borderLeftColor: theme.colors.bg,\n },\n gutter: { color: theme.colors.dim, width: 'auto', minWidth: 24, flexShrink: 0, textAlign: 'right' },\n disclosure: {\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.bg,\n },\n code: { flex: 1, minWidth: 0, color: theme.colors.text },\n added: { backgroundColor: theme.colors['tint-green'] },\n removed: { backgroundColor: theme.colors['tint-red'] },\n selection: { borderLeftColor: theme.colors.green },\n inlineComment: {\n margin: theme.spacing(2),\n padding: theme.spacing(3),\n borderWidth: 1,\n borderColor: theme.colors['edge-blue'],\n borderRadius: theme.borderRadius.md,\n gap: theme.spacing(1),\n },\n quote: { padding: theme.spacing(2), backgroundColor: theme.colors.panel, borderRadius: theme.borderRadius.md },\n remove: { alignSelf: 'flex-end' },\n}));\n\nexport interface GitReviewViewProps {\n screen: 'changes' | 'file' | 'review';\n initialVisibleRows?: number;\n activity: GitChangesPayload;\n summary?: GitReviewSummary;\n file?: GitReviewFileDiff;\n path?: string;\n comments: ReviewComment[];\n error?: string;\n forceRequired?: boolean;\n selection?: GitLineRange;\n onScreen: (screen: 'changes' | 'file' | 'review') => void;\n onFile: (path: string) => void;\n onLine: (row: GitDiffRow) => void;\n onSync: (action: GitSyncAction) => void;\n onForce: () => void;\n onAbort: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n onComment: () => void;\n onRemove: (id: string) => void;\n onSend: () => void;\n onDiscard: () => void;\n}\nconst DIFF_ROW_STEP = 200;\n\nexport function GitReviewView(props: GitReviewViewProps) {\n const { screen, activity, summary, file, path, comments } = props;\n const rows = useMemo(() => file?.hunks.flatMap((hunk) => hunk.rows) ?? [], [file?.hunks]);\n const gutterDigits = useMemo(() => rows.reduce((max, row) => Math.max(max, String(row.line).length), 1), [rows]);\n const fileComments = useMemo(() => comments.filter((comment) => comment.path === path), [comments, path]);\n const initialLimit = props.initialVisibleRows ?? DIFF_ROW_STEP;\n const [disclosure, setDisclosure] = useState({ rows, path, limit: initialLimit });\n const current =\n disclosure.rows === rows && disclosure.path === path ? disclosure : { rows, path, limit: initialLimit };\n if (current !== disclosure) setDisclosure(current);\n const visibleRows = useMemo(() => rows.slice(0, current.limit), [rows, current.limit]);\n const index = summary?.files.findIndex((entry) => entry.path === path) ?? -1;\n const entry = summary?.files[index];\n return (\n <View style={styles.grow}>\n {screen === 'review' ? (\n <View style={styles.inline}>\n <Action variant=\"ghost\" onPress={() => props.onScreen('changes')}>\n Changes\n </Action>\n {screen === 'review' && path ? (\n <Action variant=\"ghost\" onPress={() => props.onScreen('file')}>\n File diff\n </Action>\n ) : null}\n </View>\n ) : null}\n <ScrollView key={`${screen}:${path ?? ''}`} style={styles.grow}>\n {screen === 'changes' ? (\n <View style={styles.content}>\n {summary?.repository !== false ? (\n <SyncCard changes={activity.changes} busy={activity.pending !== undefined} onSync={props.onSync} />\n ) : null}\n {activity.pending ? <Text style={styles.dim}>{activity.pending}</Text> : null}\n {activity.error ? (\n <View style={[styles.card, props.forceRequired ? styles.caution : styles.failure]}>\n <Text style={styles.body}>{activity.error}</Text>\n {props.forceRequired ? (\n <Action variant=\"danger-outline\" onPress={props.onForce}>\n Force push with lease\n </Action>\n ) : null}\n <Action variant=\"ghost\" onPress={props.onDismiss}>\n Dismiss\n </Action>\n </View>\n ) : null}\n {activity.changes?.rebase ? (\n <RebaseCard\n conflicts={activity.changes.rebase.conflicts}\n busy={activity.pending !== undefined}\n onResolve={props.onResolve}\n onAbort={props.onAbort}\n />\n ) : null}\n {!summary ? (\n <Text style={styles.dim}>Loading changes…</Text>\n ) : summary.files.length ? (\n <FileList files={summary.files} comments={comments} onFile={props.onFile} />\n ) : (\n <View style={styles.empty}>\n <Text style={styles.sheetTitle}>{summary.repository ? 'No changes yet' : 'Not a Git checkout'}</Text>\n <Text style={styles.dim}>\n {summary.repository\n ? `Nothing to review on ${summary.branch ?? 'this checkout'}.`\n : 'This folder is not a Git repository, so there is nothing to sync.'}\n </Text>\n </View>\n )}\n {summary?.truncated ? <Text style={styles.dim}>The file list was truncated.</Text> : null}\n </View>\n ) : screen === 'file' ? (\n <>\n {entry ? (\n <FileHeader\n entry={entry}\n index={index}\n total={summary?.files.length ?? 0}\n onChanges={() => props.onScreen('changes')}\n onPrevious={() => {\n const previous = summary?.files[index - 1];\n if (previous) props.onFile(previous.path);\n }}\n onNext={() => {\n const next = summary?.files[index + 1];\n if (next) props.onFile(next.path);\n }}\n />\n ) : (\n <Text style={styles.heading}>{path}</Text>\n )}\n {!file ? (\n <View style={styles.content}>\n <Text style={styles.dim}>\n {props.error ? 'The diff could not be loaded. Please try again.' : 'Loading diff…'}\n </Text>\n {props.error && path ? <Action onPress={() => props.onFile(path)}>Retry</Action> : null}\n </View>\n ) : file.binary || file.tooLarge ? (\n <View style={styles.content}>\n <Text style={styles.section}>{file.binary ? 'Binary file' : 'Diff too large to display'}</Text>\n </View>\n ) : (\n <DiffRows\n rows={visibleRows}\n comments={fileComments}\n selection={props.selection}\n onLine={props.onLine}\n gutterDigits={gutterDigits}\n />\n )}\n {fileComments\n .filter((comment) => comment.startLine === undefined)\n .map((comment) => (\n <View key={comment.id} style={styles.inlineComment}>\n <Text style={styles.blue}>Queued file comment</Text>\n <Text style={styles.body}>{comment.body}</Text>\n </View>\n ))}\n <View style={styles.content}>\n <Action onPress={props.onComment}>Comment on file</Action>\n </View>\n </>\n ) : (\n <CommentCards comments={comments} onRemove={props.onRemove} />\n )}\n {props.error ? <Text style={[styles.red, styles.content]}>{props.error}</Text> : null}\n </ScrollView>\n <Footer\n count={comments.length}\n confirmation={screen === 'changes' && activity.changes?.rebase !== undefined}\n discard={screen === 'review'}\n onReview={() => props.onScreen('review')}\n onSend={props.onSend}\n onDiscard={props.onDiscard}\n />\n {screen === 'file' && file && !file.binary && !file.tooLarge ? (\n <View style={styles.disclosure}>\n <Text style={styles.dim} accessibilityLiveRegion=\"polite\">\n {Math.min(current.limit, rows.length)} of {rows.length} diff rows shown\n {props.selection ? ` · ${props.selection.side} line ${props.selection.startLine} selected` : ''}\n </Text>\n {current.limit < rows.length ? (\n <Button\n variant=\"outline\"\n onPress={() => setDisclosure({ ...current, limit: Math.min(rows.length, current.limit + DIFF_ROW_STEP) })}\n >\n Show {Math.min(DIFF_ROW_STEP, rows.length - current.limit)} more rows\n </Button>\n ) : (\n <Text style={styles.dim}>All diff rows shown</Text>\n )}\n </View>\n ) : null}\n </View>\n );\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button, Sheet, SheetBody, SheetContent, SheetHeader, SheetTitle } from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Text } from 'react-native';\n\nimport type { GitDiffRow, GitReviewFileDiff, GitReviewSummary, GitSyncAction } from '../../../../../types/gitReview';\nimport { gitChanges, requestGitSync } from '../_lib/gitChangesStore.native';\nimport { fetchReviewFile, fetchReviewSummary } from '../_lib/gitReviewApi.native';\nimport { selectReviewLine, reviewRangeRows, type GitLineRange } from '../_lib/gitReviewSelection';\nimport { addReviewComment, clearReviewComments, gitReview, removeReviewComment } from '../_lib/gitReviewStore.native';\nimport { conflictPrompt, deliverToAgent, reviewHeading } from '../_lib/gitReviewView';\nimport { GitReviewView, CommentSheet, styles } from './GitReviewView.native';\n\nexport function useGitChanges(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = gitChanges.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => gitChanges.select(gitChanges.store.state, sessionId));\n}\nexport function reviewTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'git-review', label: 'review', panel: GitReviewPanel };\n}\nexport function GitReviewPanel(props: WebPluginSlotProps) {\n return <GitReviewPanelSession key={props.sessionId} {...props} />;\n}\nfunction GitReviewPanelSession({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const activity = useGitChanges(sessionId);\n const subscribe = useCallback((listener: () => void) => {\n const sub = gitReview.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const comments = useSyncExternalStore(subscribe, () => gitReview.select(gitReview.store.state, sessionId).comments);\n const [summary, setSummary] = useState<GitReviewSummary>();\n const [file, setFile] = useState<GitReviewFileDiff>();\n const [error, setError] = useState<string>();\n const [dismissedError, setDismissedError] = useState<string>();\n const [confirm, setConfirm] = useState<'force' | 'abort' | 'discard'>();\n const [screen, setScreen] = useState<'changes' | 'file' | 'review'>('changes');\n const [path, setPath] = useState<string>();\n const [selection, setSelection] = useState<GitLineRange>();\n const [draft, setDraft] = useState<{ path: string; range?: GitLineRange; snippet: string }>();\n const request = useRef<AbortController | undefined>(undefined);\n const fingerprint = JSON.stringify(activity.changes);\n useEffect(() => {\n if (sessionId === null) return undefined;\n const controller = new AbortController();\n void fetchReviewSummary(sessionId, controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) {\n if (result.ok) setSummary(result.summary);\n else setError(result.error);\n }\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n request.current?.abort();\n };\n }, [sessionId, fingerprint]);\n const loadFile = async (path: string) => {\n if (sessionId === null) return;\n setScreen('file');\n setPath(path);\n setSelection(undefined);\n setDraft(undefined);\n request.current?.abort();\n const controller = new AbortController();\n request.current = controller;\n setFile(undefined);\n setError(undefined);\n try {\n const result = await fetchReviewFile(sessionId, path, controller.signal);\n if (!controller.signal.aborted) {\n if (result.ok) setFile(result.diff);\n else setError(result.error);\n }\n } catch (cause) {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n if (sessionId === null) return null;\n const changes = activity.changes;\n const send = (message: string, onSent?: () => void) => {\n const failure = deliverToAgent(sendSessionFrame, sessionId, message);\n setError(failure);\n if (failure === undefined) onSent?.();\n };\n const sync = (action: GitSyncAction) => requestGitSync(sessionId, action);\n const forceRequired =\n activity.error !== dismissedError &&\n activity.errorTarget?.action === 'push' &&\n activity.errorTarget.forceRequired === true;\n const sendReview = () => {\n if (comments.length === 0) return;\n const body = comments\n .map((item) => {\n const anchor =\n item.startLine === undefined\n ? item.relPath\n : item.side === 'old'\n ? `${item.relPath} (removed lines ${item.startLine}-${item.endLine ?? item.startLine})`\n : `${item.relPath}:${item.startLine}-${item.endLine ?? item.startLine}`;\n const quoted = item.snippet\n .split('\\n')\n .slice(0, 20)\n .join('\\n')\n .slice(0, 2000)\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n return `### ${anchor}\\n\\n${quoted}\\n\\n${item.body.trim()}`;\n })\n .join('\\n\\n');\n send(`${reviewHeading(comments.length, summary?.branch, summary?.base)}\\n\\n${body}`, () =>\n clearReviewComments(sessionId),\n );\n };\n const selectLine = (row: GitDiffRow) => {\n if (!file) return;\n const next = selectReviewLine(selection, row);\n setSelection(next.range);\n if (next.complete) {\n const rows = reviewRangeRows(\n file.hunks.flatMap((hunk) => hunk.rows),\n next.range,\n );\n setDraft({ path: file.path, range: next.range, snippet: rows.map((item) => item.content).join('\\n') });\n }\n };\n return (\n <>\n <GitReviewView\n screen={screen}\n activity={{ ...activity, error: activity.error === dismissedError ? undefined : activity.error }}\n summary={summary}\n file={file}\n path={path}\n comments={comments}\n error={error}\n forceRequired={forceRequired}\n selection={selection}\n onScreen={setScreen}\n onFile={(path) => void loadFile(path)}\n onLine={selectLine}\n onSync={sync}\n onForce={() => setConfirm('force')}\n onAbort={() => setConfirm('abort')}\n onResolve={() => send(conflictPrompt(changes?.branch, changes?.rebase?.conflicts ?? []))}\n onDismiss={() => setDismissedError(activity.error)}\n onComment={() => {\n if (path) {\n setSelection(undefined);\n setDraft({ path, snippet: '' });\n }\n }}\n onRemove={(id) => removeReviewComment(sessionId, id)}\n onSend={sendReview}\n onDiscard={() => setConfirm('discard')}\n />\n <Sheet\n open={draft !== undefined}\n onOpenChange={(open) => {\n if (!open) {\n setDraft(undefined);\n setSelection(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetBody>\n <CommentEditor\n key={draft ? 'open' : 'closed'}\n range={draft?.range}\n snippet={draft?.snippet ?? ''}\n onCancel={() => {\n setDraft(undefined);\n setSelection(undefined);\n }}\n onAdd={(comment) => {\n if (!draft || !comment.trim()) return;\n addReviewComment(sessionId, {\n path: draft.path,\n relPath: draft.path,\n body: comment.trim(),\n snippet: draft.snippet,\n ...draft.range,\n });\n setDraft(undefined);\n setSelection(undefined);\n }}\n />\n </SheetBody>\n </SheetContent>\n </Sheet>\n <Sheet\n open={confirm !== undefined}\n onOpenChange={(open) => {\n if (!open) setConfirm(undefined);\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>\n {confirm === 'force'\n ? 'Force push with lease?'\n : confirm === 'abort'\n ? 'Abort rebase?'\n : 'Discard review?'}\n </SheetTitle>\n </SheetHeader>\n <SheetBody>\n <Text style={styles.dim}>\n {confirm === 'force'\n ? 'Git refuses this if the remote holds commits you never fetched and integrated.'\n : confirm === 'abort'\n ? 'Abort discards any conflict resolution in progress.'\n : 'Your queued comments will be removed.'}\n </Text>\n <Button\n variant=\"danger\"\n disabled={confirm !== 'discard' && activity.pending !== undefined}\n onPress={() => {\n if (confirm === 'force') requestGitSync(sessionId, 'push', true);\n else if (confirm === 'abort') sync('abort-rebase');\n else clearReviewComments(sessionId);\n setConfirm(undefined);\n }}\n >\n {confirm === 'force' ? 'Force push with lease' : confirm === 'abort' ? 'Abort rebase' : 'Discard'}\n </Button>\n <Button variant=\"ghost\" onPress={() => setConfirm(undefined)}>\n Cancel\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n\n// Keep keystrokes local: the diff container only updates when a draft is submitted or closed.\nfunction CommentEditor({\n onAdd,\n ...props\n}: Omit<Parameters<typeof CommentSheet>[0], 'value' | 'onChange' | 'onAdd'> & { onAdd: (body: string) => void }) {\n const [body, setBody] = useState('');\n return <CommentSheet {...props} value={body} onChange={setBody} onAdd={() => onAdd(body)} />;\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button, ChevronRightIcon, FileIcon, fontOf, Spinner } from '@agimon-ai/po-native-components';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { reviewTab, useGitChanges } from '../../_components/GitReviewPanel.native';\nimport {\n useWorktrees,\n worktreesTab,\n WorktreeRow,\n WorktreeGroup,\n WorktreeStarting,\n} from '../../_components/WorktreesPanel.native';\nimport type { GitChangesSession } from '../../_lib/gitChangesStore.native';\nimport { worktreesPresentation, type WorktreesSession } from '../../_lib/worktreesActivityStore.native';\nexport function GitChangesRow({\n state = 'changes',\n branch = 'Detached HEAD',\n added = 0,\n removed = 0,\n onReview,\n}: {\n state?: 'changes' | 'clean' | 'pushing';\n branch?: string;\n added?: number;\n removed?: number;\n onReview?: () => void;\n}) {\n return (\n <Pressable\n testID=\"activity-diff-changes\"\n accessibilityRole=\"button\"\n accessibilityLabel=\"Open changes review\"\n onPress={onReview}\n style={styles.changeRow}\n >\n <View style={styles.line}>\n <FileIcon size={18} color=\"dim\" />\n <Text style={[styles.heading, styles.grow]}>Changes</Text>\n <ChevronRightIcon size={16} color=\"dim\" />\n </View>\n <View style={styles.changeDetail}>\n <Text style={[styles.branch, styles.grow]}>{branch}</Text>\n {state === 'changes' ? (\n <>\n <Text style={styles.jade}>+{added}</Text>\n <Text style={styles.error}>-{removed}</Text>\n </>\n ) : state === 'pushing' ? (\n <>\n <Spinner label=\"Pushing...\" />\n <Text style={styles.dim}>Pushing...</Text>\n </>\n ) : (\n <Text style={styles.dim}>No changes yet</Text>\n )}\n </View>\n </Pressable>\n );\n}\n\nexport function WorktreesActivityView({\n git,\n state,\n disabled = false,\n onReview,\n onWorktrees,\n}: {\n git: GitChangesSession;\n state: WorktreesSession;\n disabled?: boolean;\n onReview?: () => void;\n onWorktrees?: () => void;\n}) {\n const { starting } = worktreesPresentation(state);\n return (\n <View style={styles.section}>\n {git.changes ? (\n <GitChangesRow\n branch={git.changes.branch ?? 'Detached HEAD'}\n added={git.changes.added}\n removed={git.changes.removed}\n state={\n git.pending?.startsWith('pushing')\n ? 'pushing'\n : git.changes.added === 0 && git.changes.removed === 0 && git.changes.files === 0\n ? 'clean'\n : 'changes'\n }\n onReview={onReview}\n />\n ) : null}\n <WorktreeGroup title=\"Worktrees\" count={`${state.worktrees.length} open${starting ? ' · 1 starting' : ''}`} />\n {state.worktrees.map((item) => (\n <WorktreeRow key={item.id} item={item} compact onOpen={onWorktrees} />\n ))}\n {starting ? (\n <WorktreeStarting branch={state.requestedBranch} />\n ) : state.pending ? (\n <Text style={styles.dim}>{state.pending}</Text>\n ) : null}\n {state.worktrees.length === 0 && !state.pending ? (\n <View style={styles.idle}>\n <Text style={styles.dim}>Idle</Text>\n <Button\n testID=\"activity-git-create\"\n variant=\"ghost\"\n style={styles.link}\n disabled={disabled}\n onPress={onWorktrees}\n >\n <Text style={styles.jade}>Create a worktree →</Text>\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\nexport function WorktreesActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const git = useGitChanges(sessionId);\n const state = useWorktrees(sessionId);\n return (\n <WorktreesActivityView\n git={git}\n state={{ ...state, worktrees: state.worktrees.filter((item) => item.sessionId !== sessionId) }}\n disabled={sessionId === null}\n onReview={() => openTransientTab(reviewTab())}\n onWorktrees={() => openTransientTab(worktreesTab())}\n />\n );\n}\nconst styles = StyleSheet.create((theme) => ({\n section: { gap: theme.spacing(2) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.hi,\n },\n line: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 44 },\n grow: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n jade: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.green,\n fontWeight: '500',\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n changeRow: {\n gap: theme.spacing(1),\n paddingVertical: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n changeDetail: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(3),\n paddingLeft: theme.spacing(6),\n minHeight: 28,\n },\n idle: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(4) },\n link: { minHeight: 44, paddingHorizontal: 0 },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorktreesActivitySection } from './_components/WorktreesActivitySection.native';\nexport default defineFill({ component: WorktreesActivitySection });\n","import { defineWebLifecycle } from '@agimon-ai/po-core/native';\n\nimport { startGitChangesRuntime } from '../_lib/gitChangesStore.native';\nimport { startWorktreeRuntime } from '../_lib/worktreesActivityStore.native';\nexport default defineWebLifecycle((runtime) => {\n const stopWorktrees = startWorktreeRuntime(runtime);\n const stopChanges = startGitChangesRuntime(runtime);\n return () => {\n stopChanges();\n stopWorktrees();\n };\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillGitNewSession from '../src/extensions/workspaces/(frontend)/fill/GitNewSession.new-session.native';\nimport activityGroupGit from '../src/extensions/workspaces/sessions/(frontend)/activity-group/git.native';\nimport channelGitChanges from '../src/extensions/workspaces/sessions/(frontend)/channel/git-changes.native';\nimport channelGitWorktrees from '../src/extensions/workspaces/sessions/(frontend)/channel/git-worktrees.native';\nimport fillWorktrees from '../src/extensions/workspaces/sessions/(frontend)/fill/Worktrees.activity.git.native';\nimport lifecycleStart from '../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'git',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'new-session', id: 'git-new-session' }, fillGitNewSession)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'git' }, activityGroupGit)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'git_changes' }, channelGitChanges), via({ channel: 'git_worktrees' }, channelGitWorktrees)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.git', id: 'worktrees' }, fillWorktrees)]; },\n get start(): WebPluginContributions['start'] { return lifecycleStart; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["WebPluginSlotProps","Button","fontOf","Input","Label","ListRow","SegmentedControl","SheetBody","SheetHeader","SheetTitle","useEffect","useState","StyleSheet","api","GitBranchesResponse","GitSessionCreated","baseOptions","branchOptions","createRequest","formProblem","NewSessionFormState","NewSessionMode","MODES","value","label","const","GitNewSessionSheetViewProps","workspaceRoot","branches","loadError","initialForm","Partial","busy","error","onCreate","form","GitNewSessionSheetView","setForm","mode","newBranch","baseRef","name","query","setQuery","basesOpen","setBasesOpen","ready","repository","loading","state","defaultBase","problem","update","patch","current","options","bases","styles","body","root","dim","field","list","length","pad","map","branch","index","key","remote","undefined","divider","mono","busyAt","selected","open","base","errorOf","status","String","GitNewSessionSheet","newSession","setBranches","setLoadError","setError","setBusy","workspaceId","request","requestWithStepUp","stale","workspace","url","then","response","json","catch","ok","submit","Promise","failure","createPlain","createSession","method","headers","JSON","stringify","answer","openCreated","sessionId","create","theme","sans","fontFamily","gap","spacing","uni__dependencies","fontSize","sm","lineHeight","color","colors","textAlign","lineHeightRelaxed","red","hi","borderRadius","lg","borderWidth","borderColor","overflow","paddingHorizontal","paddingVertical","borderTopWidth","hairlineWidth","borderTopColor","styles","isRecord","optionalText","optionalErrorTarget","WebPluginSlotProps","Badge","Button","ChevronRightIcon","Dot","fontOf","Input","Sheet","SheetContent","Spinner","useCallback","useState","useSyncExternalStore","StyleSheet","WorktreeView","requestWorktreeClose","requestWorktreeCreate","worktreeActivity","worktreesPresentation","WorktreesSession","useWorktrees","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","worktreesTab","Parameters","id","label","panel","WorktreesPanel","WorktreesHeader","activity","onNew","disabled","styles","header","title","newPill","jade","WorktreeRow","item","error","compact","onClose","onOpen","worktree","line","orphaned","unowned","grow","undefined","branch","length","slice","dim","caution","info","more","path","WorktreeStarting","starting","WorktreeGroup","count","group","heading","WorktreeForm","close","baseRef","onBranch","onBaseRef","onConfirm","onCancel","framed","value","sheet","unframed","handle","sheetTitle","body","monoInput","trim","fullButton","createButton","createLabel","WorktreesView","working","attention","closeErrorId","row","pending","errorTarget","action","screen","worktrees","content","map","requestedBranch","empty","emptyCopy","some","sessionReservationId","openSession","creating","setCreating","setBranch","setBaseRef","closing","setClosing","busy","scroll","open","create","theme","flex","backgroundColor","colors","rail","uni__dependencies","flexGrow","flexDirection","alignItems","justifyContent","padding","spacing","minHeight","fontFamily","sans","fontSize","fontWeight","color","hi","borderRadius","full","paddingHorizontal","gap","paddingTop","paddingBottom","borderBottomWidth","hairlineWidth","borderColor","lg","lineHeight","sm","base","text","marginTop","mono","marginLeft","paddingVertical","minWidth","width","height","green","red","borderTopWidth","bg","border","borderTopLeftRadius","borderTopRightRadius","alignSelf","marginBottom","xl","textAlign","styles","isRecord","Button","SyntaxLine","Textarea","fontOf","BranchIcon","ChevronRightIcon","MessageIcon","AlertIcon","ReviewComment","memo","useMemo","useState","StyleSheet","useUnistyles","GitDiffRow","GitReviewFileEntry","GitChangesPayload","GitReviewSummary","GitReviewFileDiff","GitSyncAction","GitLineRange","suggestedSyncAction","upstreamSummary","Action","children","variant","disabled","onPress","theme","styles","action","primary","primaryLabel","color","scheme","colors","rail","Footer","count","discard","confirmation","onReview","onSend","onDiscard","footer","inline","dim","SyncCard","changes","busy","onSync","suggested","card","branch","grow","green","added","red","removed","mono","base","upstream","const","map","rebase","undefined","FileList","files","comments","onFile","path","list","section","length","file","fileRow","status","blue","yellow","toUpperCase","body","split","at","slice","join","some","comment","filter","ConfirmSheet","onConfirm","onCancel","sheet","handle","sheetTitle","RebaseCard","conflicts","onResolve","onAbort","caution","FileHeader","entry","index","total","onPrevious","onNext","onChanges","content","heading","navigation","DiffRows","rows","selection","onLine","showInlineComments","gutterDigits","row","anchoredComments","Map","key","side","endLine","startLine","entries","get","push","set","digits","reduce","max","Math","String","line","i","marker","anchored","diffRow","gutter","padStart","code","id","inlineComment","lineLabel","CommentSheet","range","snippet","value","onChange","onAdd","quote","trim","CommentCards","onRemove","relPath","remove","create","fontFamily","sans","fontSize","fontWeight","hi","uni__dependencies","xl","lg","lineHeight","lineHeightRelaxed","text","sm","padding","spacing","gap","borderWidth","borderColor","border","borderRadius","flexDirection","alignItems","flex","minWidth","minHeight","backgroundColor","paddingVertical","borderBottomWidth","hairlineWidth","justifyContent","borderTopWidth","failure","borderTopLeftRadius","borderTopRightRadius","height","width","md","alignSelf","empty","paddingHorizontal","borderLeftWidth","borderLeftColor","bg","flexShrink","textAlign","disclosure","margin","panel","GitReviewViewProps","screen","initialVisibleRows","activity","summary","error","forceRequired","onScreen","onForce","onDismiss","onComment","DIFF_ROW_STEP","GitReviewView","props","hunks","flatMap","hunk","fileComments","initialLimit","setDisclosure","limit","current","visibleRows","findIndex","repository","pending","truncated","previous","next","binary","tooLarge","min","styles","WebPluginSlotProps","Button","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","useCallback","useEffect","useRef","useState","useSyncExternalStore","GitDiffRow","GitReviewFileDiff","GitReviewSummary","GitSyncAction","gitChanges","requestGitSync","fetchReviewFile","fetchReviewSummary","selectReviewLine","reviewRangeRows","GitLineRange","addReviewComment","clearReviewComments","gitReview","removeReviewComment","conflictPrompt","deliverToAgent","reviewHeading","GitReviewView","CommentSheet","styles","useGitChanges","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","reviewTab","Parameters","id","label","panel","GitReviewPanel","props","GitReviewPanelSession","sendSessionFrame","activity","comments","summary","setSummary","file","setFile","error","setError","dismissedError","setDismissedError","confirm","setConfirm","screen","setScreen","path","setPath","selection","setSelection","draft","setDraft","range","snippet","request","AbortController","undefined","fingerprint","JSON","stringify","changes","controller","signal","then","result","aborted","ok","catch","cause","Error","message","String","abort","current","loadFile","diff","send","onSent","failure","sync","action","forceRequired","errorTarget","sendReview","length","body","map","item","anchor","startLine","relPath","side","endLine","quoted","split","slice","join","line","trim","branch","base","selectLine","row","next","complete","rows","hunks","flatMap","hunk","content","rebase","conflicts","open","comment","dim","pending","CommentEditor","onAdd","Omit","setBody","styles","WebPluginSlotProps","Button","ChevronRightIcon","FileIcon","fontOf","Spinner","StyleSheet","reviewTab","useGitChanges","useWorktrees","worktreesTab","WorktreeRow","WorktreeGroup","WorktreeStarting","GitChangesSession","worktreesPresentation","WorktreesSession","GitChangesRow","state","branch","added","removed","onReview","styles","changeRow","line","heading","grow","changeDetail","jade","error","dim","WorktreesActivityView","git","disabled","onWorktrees","starting","section","changes","pending","startsWith","files","worktrees","length","map","item","id","requestedBranch","idle","link","WorktreesActivitySection","sessionId","openTransientTab","filter","create","theme","gap","spacing","uni__dependencies","fontFamily","sans","fontSize","lg","lineHeight","fontWeight","color","colors","hi","sm","mono","base","flexDirection","alignItems","minHeight","flex","minWidth","green","red","paddingVertical","borderBottomWidth","hairlineWidth","borderColor","paddingLeft","paddingHorizontal","fillGitNewSession","activityGroupGit","channelGitChanges","channelGitWorktrees","fillWorktrees","lifecycleStart"],"sources":["../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/(frontend)/_lib/newSessionForm.ts","../../src/extensions/workspaces/(frontend)/fill/_components/GitNewSessionSheet.native.tsx","../../src/extensions/workspaces/(frontend)/fill/GitNewSession.new-session.native.tsx","../../src/types/webWorktrees.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/worktreesActivityStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/WorktreesPanel.native.tsx","../../src/types/gitReview.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitChangesStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/git.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/git-changes.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/git-worktrees.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewApi.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewSelection.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/gitReviewView.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/GitReviewView.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/GitReviewPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/WorktreesActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Worktrees.activity.git.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.native.ts","../../generated/native.ts"],"sourcesContent":["import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { GitAuthView } from './gitAuth';\nimport type { GitReviewFileDiff, GitReviewSummary } from './gitReview';\nimport type { GitBranchesResponse, GitSessionCreated } from './gitSessions';\n\n/**\n * The routes the page calls, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/(backend)/api/git/`, which mounts at global scope and so\n * answers workspace and session requests too. Each route answers only where it\n * belongs (auth on a workspace mount, the review on a session mount), so a\n * client accessor on the wrong scope gets a 404 rather than a second way in.\n *\n * Only what the browser calls is listed. The worktree routes stay HTTP for\n * other callers, but the dock drives worktrees over its channel.\n */\nconst routes = {\n /** Workspace: the new-session dialog's branch list. */\n branches: {\n method: 'GET',\n path: '/branches',\n response: undefined as unknown as ApiResponseOf<GitBranchesResponse>,\n },\n /** Workspace: a top-level worktree session on an existing or new branch. */\n createSession: {\n method: 'POST',\n path: '/sessions',\n response: undefined as unknown as ApiResponseOf<GitSessionCreated>,\n },\n /** Workspace: that workspace's saved remote auth, never the token itself. */\n auth: {\n method: 'GET',\n path: '/auth',\n query: ['repositoryId'],\n response: undefined as unknown as ApiResponseOf<GitAuthView>,\n },\n /** Workspace: replaces that workspace's remote auth. Passkey step-up gated for remote devices. */\n saveAuth: {\n method: 'PUT',\n path: '/auth',\n query: ['repositoryId'],\n response: undefined as unknown as ApiResponseOf<GitAuthView>,\n },\n /** Session: the files this session's checkout changed against its base. */\n review: {\n method: 'GET',\n path: '/review',\n response: undefined as unknown as ApiResponseOf<GitReviewSummary>,\n },\n /** Session: one changed file's hunks. */\n reviewFile: {\n method: 'GET',\n path: '/review/file',\n query: ['path'],\n response: undefined as unknown as ApiResponseOf<GitReviewFileDiff>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'git' at. */\nexport const apiScopes = ['global', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'git',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import type { GitBranches, GitSessionCreateRequest } from '../../../../types/gitSessions';\n\nexport type NewSessionMode = 'existing' | 'new' | 'plain';\n\n/** One row of the branch picker: a local branch, or a remote-only one. */\nexport interface BranchOption {\n key: string;\n name: string;\n remote?: string;\n current: boolean;\n /** Set when the branch is checked out elsewhere and cannot get a second worktree. */\n busyAt?: string;\n}\n\nexport interface NewSessionFormState {\n mode: NewSessionMode;\n /** The picked existing branch. */\n selected?: BranchOption;\n newBranch: string;\n baseRef: string;\n name: string;\n}\n\nconst MAX_LISTED = 200;\n\n/** Local branches first, then remote-only ones, filtered by a case-insensitive substring. */\nexport function branchOptions(branches: GitBranches, query: string): BranchOption[] {\n const needle = query.trim().toLowerCase();\n const matches = (text: string): boolean => needle === '' || text.toLowerCase().includes(needle);\n const local = branches.local\n .filter((branch) => matches(branch.name))\n .map((branch) => ({\n key: `local:${branch.name}`,\n name: branch.name,\n current: branch.name === branches.current,\n ...(branch.checkedOutAt === undefined ? {} : { busyAt: branch.checkedOutAt }),\n }));\n const remote = branches.remote\n .filter((branch) => matches(`${branch.remote}/${branch.name}`))\n .map((branch) => ({\n key: `remote:${branch.remote}/${branch.name}`,\n name: branch.name,\n remote: branch.remote,\n current: false,\n }));\n return [...local, ...remote].slice(0, MAX_LISTED);\n}\n\n/** Every base a new branch can start from: the default first, then remote-tracking names, then local branches. */\nexport function baseOptions(branches: GitBranches): string[] {\n const names = new Set([\n ...(branches.defaultBase === undefined ? [] : [branches.defaultBase]),\n ...branches.remote.map((branch) => `${branch.remote}/${branch.name}`),\n ...branches.local.map((branch) => branch.name),\n ]);\n return [...names];\n}\n\n/** Why the form cannot be submitted yet, or undefined when it can. */\nexport function formProblem(state: NewSessionFormState): string | undefined {\n if (state.mode === 'existing') {\n if (state.selected === undefined) return 'Pick a branch.';\n if (state.selected.busyAt !== undefined) return `That branch is checked out at ${state.selected.busyAt}.`;\n }\n if (state.mode === 'new' && state.newBranch.trim() === '') return 'Name the new branch.';\n return undefined;\n}\n\n/** The worktree create request for the form, or undefined in plain mode. */\nexport function createRequest(state: NewSessionFormState): GitSessionCreateRequest | undefined {\n const name = state.name.trim();\n const named = name === '' ? {} : { name };\n if (state.mode === 'existing' && state.selected !== undefined)\n return {\n mode: 'existing-branch',\n branch: state.selected.name,\n ...(state.selected.remote === undefined ? {} : { remote: state.selected.remote }),\n ...named,\n };\n if (state.mode === 'new') {\n const baseRef = state.baseRef.trim();\n return {\n mode: 'new-branch',\n branch: state.newBranch.trim(),\n ...(baseRef === '' ? {} : { baseRef }),\n ...named,\n };\n }\n return undefined;\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n fontOf,\n Input,\n Label,\n ListRow,\n SegmentedControl,\n SheetBody,\n SheetHeader,\n SheetTitle,\n} from '@agimon-ai/po-native-components';\nimport { useEffect, useState } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { api } from '../../../../../../generated/client.native';\nimport type { GitBranchesResponse, GitSessionCreated } from '../../../../../types/gitSessions';\nimport {\n baseOptions,\n branchOptions,\n createRequest,\n formProblem,\n type NewSessionFormState,\n type NewSessionMode,\n} from '../../_lib/newSessionForm';\n\nconst MODES = [\n { value: 'existing', label: 'Existing' },\n { value: 'new', label: 'New branch' },\n { value: 'plain', label: 'No branch' },\n] as const;\n\nexport interface GitNewSessionSheetViewProps {\n workspaceRoot: string;\n branches: GitBranchesResponse | null;\n loadError?: string;\n initialForm?: Partial<NewSessionFormState>;\n busy?: boolean;\n error?: string;\n onCreate: (form: NewSessionFormState) => void;\n}\n\n/** The native twin of GitNewSessionDialogView: the same form state and checks, in sheet parts. */\nexport function GitNewSessionSheetView({\n workspaceRoot,\n branches,\n loadError = '',\n initialForm,\n busy = false,\n error = '',\n onCreate,\n}: GitNewSessionSheetViewProps) {\n const [form, setForm] = useState<NewSessionFormState>({\n mode: 'existing',\n newBranch: '',\n baseRef: '',\n name: '',\n ...initialForm,\n });\n const [query, setQuery] = useState('');\n const [basesOpen, setBasesOpen] = useState(false);\n const ready = branches?.repository === true && loadError === '';\n const loading = branches === null && loadError === '';\n const mode = ready || loading ? form.mode : 'plain';\n const state = { ...form, mode, baseRef: form.baseRef || branches?.defaultBase || '' };\n const problem = formProblem(state);\n const update = (patch: Partial<NewSessionFormState>): void => setForm((current) => ({ ...current, ...patch }));\n const options = branches === null ? [] : branchOptions(branches, query);\n const bases = branches === null ? [] : baseOptions(branches);\n return (\n <>\n <SheetHeader>\n <SheetTitle>New session</SheetTitle>\n </SheetHeader>\n <SheetBody style={styles.body}>\n <Text style={styles.root} numberOfLines={1} ellipsizeMode=\"middle\">\n {workspaceRoot}\n </Text>\n {!ready ? (\n <Text testID=\"git-new-session-plain-note\" style={styles.dim}>\n {loading\n ? 'Reading branches...'\n : loadError || 'This workspace is not a git checkout. Start a plain session in this folder.'}\n </Text>\n ) : (\n <>\n <SegmentedControl\n accessibilityLabel=\"Session kind\"\n options={MODES}\n value={mode}\n disabled={busy}\n onValueChange={(value) => update({ mode: value as NewSessionMode })}\n />\n {mode === 'existing' ? (\n <View style={styles.field}>\n <Label>Branch</Label>\n <Input\n testID=\"git-new-session-branch-search\"\n accessibilityLabel=\"Find a branch\"\n placeholder=\"Find a branch\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n value={query}\n onChangeText={setQuery}\n disabled={busy}\n />\n <View style={styles.list} accessibilityLabel=\"Branches\">\n {options.length === 0 ? <Text style={[styles.dim, styles.pad]}>No matching branches</Text> : null}\n {options.map((branch, index) => (\n <View key={branch.key}>\n {branch.remote !== undefined && (index === 0 || options[index - 1]?.remote === undefined) ? (\n <Text style={[styles.dim, styles.pad, styles.divider]}>Remote branches</Text>\n ) : null}\n <ListRow\n title={\n <Text style={styles.mono}>\n {branch.remote === undefined ? branch.name : `${branch.remote}/${branch.name}`}\n </Text>\n }\n description={\n branch.busyAt !== undefined\n ? `Checked out in ${branch.busyAt}`\n : branch.current\n ? 'Current'\n : undefined\n }\n selected={form.selected?.key === branch.key}\n disabled={branch.busyAt !== undefined || busy}\n disclosure={false}\n onPress={() => update({ selected: branch })}\n />\n </View>\n ))}\n </View>\n </View>\n ) : mode === 'new' ? (\n <>\n <View style={styles.field}>\n <Label>Branch name</Label>\n <Input\n testID=\"git-new-session-new-branch\"\n accessibilityLabel=\"Branch name\"\n placeholder=\"feature/my-change\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n style={styles.mono}\n value={form.newBranch}\n onChangeText={(newBranch) => update({ newBranch })}\n disabled={busy}\n />\n </View>\n <View style={styles.field}>\n <Label>From</Label>\n <View style={styles.list}>\n <ListRow\n accessibilityLabel=\"From\"\n title={<Text style={styles.mono}>{state.baseRef || 'Current branch'}</Text>}\n disabled={busy}\n onPress={() => setBasesOpen((open) => !open)}\n />\n {basesOpen\n ? bases.map((base) => (\n <ListRow\n key={base}\n title={<Text style={styles.mono}>{base}</Text>}\n selected={state.baseRef === base}\n disabled={busy}\n disclosure={false}\n onPress={() => {\n update({ baseRef: base });\n setBasesOpen(false);\n }}\n />\n ))\n : null}\n </View>\n </View>\n </>\n ) : (\n <Text style={styles.dim}>Start in this workspace folder, without creating a worktree.</Text>\n )}\n </>\n )}\n <View style={styles.field}>\n <Label>Name</Label>\n <Input\n testID=\"new-session-name\"\n accessibilityLabel=\"Session name\"\n placeholder={mode === 'plain' ? 'Optional' : 'Optional, defaults to the branch'}\n value={form.name}\n onChangeText={(name) => update({ name })}\n disabled={busy}\n />\n </View>\n {mode !== 'plain' ? (\n <Text style={styles.dim}>Runs in its own worktree, so this checkout stays as it is.</Text>\n ) : null}\n {error ? (\n <Text testID=\"new-session-error\" style={styles.error} accessibilityRole=\"alert\">\n {error}\n </Text>\n ) : null}\n <Button\n testID=\"new-session-create\"\n variant=\"primary\"\n size=\"lg\"\n loading={busy}\n loadingLabel={mode === 'plain' ? 'Creating session' : 'Creating worktree'}\n disabled={loading || problem !== undefined}\n accessibilityHint={problem}\n onPress={() => onCreate(state)}\n >\n Create session\n </Button>\n </SheetBody>\n </>\n );\n}\n\nfunction errorOf(body: unknown, status: number): string {\n return typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `The cockpit answered ${String(status)}.`;\n}\n\n/** The native new-session sheet when git is installed; mirrors GitNewSessionDialog's calls. */\nexport function GitNewSessionSheet({ newSession }: WebPluginSlotProps) {\n const [branches, setBranches] = useState<GitBranchesResponse | null>(null);\n const [loadError, setLoadError] = useState('');\n const [error, setError] = useState('');\n const [busy, setBusy] = useState(false);\n const workspaceId = newSession?.workspaceId;\n const request = newSession?.requestWithStepUp;\n\n useEffect(() => {\n if (workspaceId === undefined || request === undefined) return;\n let stale = false;\n void request(api.workspace(workspaceId).branches.url())\n .then(async (response) => {\n const body: unknown = await response.json().catch(() => undefined);\n if (stale) return;\n if (!response.ok) setLoadError(errorOf(body, response.status));\n else setBranches(body as GitBranchesResponse);\n })\n .catch(() => {\n if (!stale) setLoadError('The branches could not be loaded.');\n });\n return () => {\n stale = true;\n };\n }, [workspaceId, request]);\n\n if (newSession === undefined) return null;\n\n const submit = async (state: NewSessionFormState): Promise<void> => {\n if (busy || formProblem(state) !== undefined) return;\n setBusy(true);\n setError('');\n const body = createRequest(state);\n let failure: string | undefined;\n try {\n if (body === undefined) {\n failure = await newSession.createPlain(state.name);\n } else {\n const response = await newSession.requestWithStepUp(api.workspace(newSession.workspaceId).createSession.url(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n const answer: unknown = await response.json().catch(() => undefined);\n failure = response.ok\n ? await newSession.openCreated((answer as GitSessionCreated).sessionId)\n : errorOf(answer, response.status);\n }\n } catch {\n failure = 'The cockpit is unreachable.';\n }\n if (failure === undefined) return;\n setError(failure);\n setBusy(false);\n };\n\n return (\n <GitNewSessionSheetView\n workspaceRoot={newSession.workspaceRoot}\n branches={branches}\n loadError={loadError}\n busy={busy}\n error={error}\n onCreate={(state) => void submit(state)}\n />\n );\n}\n\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const mono = fontOf(theme.fontFamily.mono);\n return {\n body: { gap: theme.spacing(4) },\n root: {\n fontFamily: mono,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n textAlign: 'center',\n },\n field: { gap: theme.spacing(1.5) },\n dim: {\n fontFamily: sans,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n error: {\n fontFamily: sans,\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.red,\n },\n mono: {\n fontFamily: mono,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.hi,\n },\n list: {\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n borderColor: theme.colors['border-soft'],\n overflow: 'hidden',\n },\n pad: { paddingHorizontal: theme.spacing(4), paddingVertical: theme.spacing(2) },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n };\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { GitNewSessionSheet } from './_components/GitNewSessionSheet.native';\n\nexport default defineFill({ component: GitNewSessionSheet });\n","/**\n * The cockpit's view of this session's worktrees.\n *\n * DESIGN PATTERNS:\n * - Declarations only. The channel frame type is a constant so the hub and the\n * page cannot drift apart on a string.\n * - A view is the subset of a record the dock needs, not the record. The\n * registry may hold paths and provenance the page has no business rendering.\n *\n * AVOID:\n * - Adding behaviour here. This file is imported by browser code, so it must\n * stay free of node builtins.\n */\n\n/** The data channel carrying one session's worktrees to the page. */\nexport const GIT_WORKTREES_TYPE = 'git_worktrees';\n\n/** One worktree, as the activity dock and its panel render it. */\nexport interface WorktreeView {\n id: string;\n branch: string;\n path: string;\n /** The session the hub started for this worktree, when it is still live. */\n sessionId: string | null;\n /** True once the directory the record names has gone missing. */\n orphaned: boolean;\n /**\n * True when the session that asked for this worktree is gone.\n *\n * An owned worktree is only ever shown to its own session. This flag marks\n * the exception: once the parent is dead nobody would see the worktree at\n * all, so every session in the repository does, and may close it.\n */\n unowned: boolean;\n}\n\n/**\n * What the panel asks the hub channel to do.\n *\n * The dock acts through its own channel rather than through the agent: a\n * worktree made from the panel and one made by the tool take the same\n * `worktreeOperations` path, but the panel no longer has to spend a turn of\n * the conversation to get there.\n */\nexport type GitWorktreesCommand =\n | { action: 'create'; branch: string; baseRef?: string; reservationId?: string }\n | { action: 'close'; id: string; force?: boolean };\n\nexport type WorktreeErrorTarget = { action: 'create' } | { action: 'close'; id: string };\n\nexport interface GitWorktreesPayload {\n worktrees: WorktreeView[];\n /** Label of the operation in flight, absent when the session is idle. */\n pending?: string;\n /** The last failure, cleared when the next command starts. */\n error?: string;\n /** The operation that produced the last failure, when known. */\n errorTarget?: WorktreeErrorTarget;\n}\n","/**\n * The dock's view of this session's worktrees, and the commands it sends.\n *\n * DESIGN PATTERNS:\n * - Session-scoped store fed by one hub channel. The hub is authoritative; the\n * page never reads a registry and never guesses.\n * - Actions are channel frames, not prompts. The hub half owns the tool's\n * operations, so the panel names the work and the hub performs it; a\n * worktree made from the dock is the same object the tool makes, without\n * spending a turn of the conversation to ask for it.\n * - The sender lives in a store rather than a module variable, because a web\n * plugin keeps no mutable module state and the page may reconnect.\n *\n * AVOID:\n * - Calling the hub package API from here. A dock slot gets no sealed request\n * transport, and raw fetch breaks the remote cockpit.\n * - `sendSessionFrame` for a command. It envelopes the frame as a session\n * command bound for the agent, which never reaches a channel's `receive`.\n */\nimport { defineGlobalStore, defineSessionStore, type WebPluginRuntime } from '@agimon-ai/po-core/native';\n\nimport {\n GIT_WORKTREES_TYPE,\n type GitWorktreesCommand,\n type WorktreeErrorTarget,\n type WorktreeView,\n} from '../../../../../types/webWorktrees';\n\nexport interface WorktreesSession {\n /** Locally requested branch, until the hub publishes its completed worktree or failure. */\n requestedBranch?: string;\n /** The worktrees the hub last reported for this session's repository. */\n worktrees: WorktreeView[];\n /** Label of the operation the hub is running for this session. */\n pending: string | undefined;\n /** The last failure the hub reported, shown until the next command. */\n error: string | undefined;\n /** The operation that produced the last failure, when known. */\n errorTarget?: WorktreeErrorTarget;\n}\n\n/** Presentation state follows hub operation labels, including session startup progress. */\nexport function worktreesPresentation(state: WorktreesSession) {\n return {\n working: state.worktrees.filter((item) => !item.orphaned && !item.unowned),\n attention: state.worktrees.filter((item) => item.orphaned || item.unowned),\n starting:\n state.requestedBranch !== undefined\n ? !state.error && !state.worktrees.some((item) => item.branch === state.requestedBranch)\n : !!state.pending && /^(creating|starting session)/i.test(state.pending),\n closeErrorId: state.errorTarget?.action === 'close' ? state.errorTarget.id : undefined,\n };\n}\n\nexport const worktreeActivity = defineSessionStore<WorktreesSession>({\n worktrees: [],\n pending: undefined,\n error: undefined,\n errorTarget: undefined,\n});\n\n/** Captures the clicked card, so a focus change cannot retarget an open dialog. */\nexport const worktreeCreateDialog = defineGlobalStore<{ sessionId: string; reservationId?: string } | null>(null);\n/**\n * The page's hub socket sender, held for as long as the plugin runs.\n *\n * Undefined before `startWorktreeRuntime` and after it disposes; a command\n * sent in that window is dropped rather than queued, because a queue would\n * replay a worktree create against a socket that has since changed sessions.\n */\nconst worktreeSender = defineGlobalStore<WebPluginRuntime['sendHubFrame'] | undefined>(undefined);\n\n/** Binds the page's hub socket. The plugin host calls this once per page. */\nexport function startWorktreeRuntime(runtime: WebPluginRuntime): () => void {\n // Wrapped rather than referenced: an unbound method would lose the runtime\n // it belongs to the moment the store hands it back.\n const send = (frame: Record<string, unknown>): void => {\n runtime.sendHubFrame(frame);\n };\n worktreeSender.update(() => send);\n return () => {\n worktreeSender.update((current) => (current === send ? undefined : current));\n worktreeCreateDialog.update(() => null);\n };\n}\n\n/**\n * Whether this session has worktree work in flight.\n *\n * A standing worktree is state, not work: it sits there until someone closes\n * it, so counting it would leave the session reading as busy forever, with a\n * \"background work is still running\" notice under a conversation where\n * nothing is running. Only a create or close actually in progress counts.\n *\n * The group stays visible either way. Declaring an active source at all is\n * what keeps it in the dock; this answers how it is drawn, not whether it is\n * there.\n */\nexport const worktreeActivitySource = {\n subscribe(listener: () => void) {\n const subscription = worktreeActivity.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return worktreeActivity.select(worktreeActivity.store.state, sessionId).pending !== undefined;\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction optionalErrorTarget(value: unknown): WorktreeErrorTarget | undefined {\n if (!isRecord(value)) return undefined;\n if (value.action === 'create') return { action: 'create' };\n if (value.action === 'close' && typeof value.id === 'string' && value.id !== '') {\n return { action: 'close', id: value.id };\n }\n return undefined;\n}\n\n/** The plugin's session data channel: 'git_worktrees' payloads into the store. */\nexport const worktreesChannel = worktreeActivity.channel<WorktreesSession>({\n channel: GIT_WORKTREES_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.worktrees)) return null;\n return {\n worktrees: input.worktrees.filter(isRecord) as unknown as WorktreeView[],\n pending: optionalText(input.pending),\n error: optionalText(input.error),\n errorTarget: optionalErrorTarget(input.errorTarget),\n };\n },\n reduce(current, next) {\n const requestedBranch = current.requestedBranch;\n return {\n ...next,\n ...(requestedBranch && next.pending && !next.error ? { requestedBranch } : {}),\n };\n },\n});\n\n/** Sends one command to the session's worktrees channel. */\nfunction command(sessionId: string, payload: GitWorktreesCommand): void {\n worktreeSender.store.state?.({ type: GIT_WORKTREES_TYPE, sessionId, payload });\n}\n\n/** Asks the hub for a worktree. The hub answers on the same channel. */\nexport function requestWorktreeCreate(\n sessionId: string,\n branch: string,\n baseRef: string,\n reservationId?: string,\n): void {\n const trimmedBase = baseRef.trim();\n if (worktreeSender.store.state) {\n worktreeActivity.update(sessionId, (current) => ({\n ...current,\n requestedBranch: branch.trim(),\n pending: 'creating',\n error: undefined,\n errorTarget: undefined,\n }));\n }\n command(sessionId, {\n action: 'create',\n branch: branch.trim(),\n ...(trimmedBase === '' ? {} : { baseRef: trimmedBase }),\n ...(reservationId === undefined ? {} : { reservationId }),\n });\n}\n\n/** Asks the hub to close one worktree. Refusal on a dirty tree stays the hub's call. */\nexport function requestWorktreeClose(sessionId: string, id: string): void {\n command(sessionId, { action: 'close', id });\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n ChevronRightIcon,\n Dot,\n fontOf,\n Input,\n Sheet,\n SheetContent,\n Spinner,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useState, useSyncExternalStore } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { WorktreeView } from '../../../../../types/webWorktrees';\nimport {\n requestWorktreeClose,\n requestWorktreeCreate,\n worktreeActivity,\n worktreesPresentation,\n type WorktreesSession,\n} from '../_lib/worktreesActivityStore.native';\nexport function useWorktrees(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = worktreeActivity.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => worktreeActivity.select(worktreeActivity.store.state, sessionId));\n}\nexport function worktreesTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'git-worktrees', label: 'worktrees', panel: WorktreesPanel };\n}\nexport function WorktreesHeader({\n activity = false,\n onNew,\n disabled = false,\n}: {\n activity?: boolean;\n onNew?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={styles.header}>\n <Text style={styles.title}>{activity ? 'Activity' : 'Worktrees'}</Text>\n {!activity ? (\n <Button testID=\"git-worktree-create\" variant=\"ghost\" style={styles.newPill} disabled={disabled} onPress={onNew}>\n <Text style={styles.jade}>+ New</Text>\n </Button>\n ) : null}\n </View>\n );\n}\n\nexport function WorktreeRow({\n item,\n error,\n compact = false,\n onClose,\n onOpen,\n disabled = false,\n}: {\n item: WorktreeView;\n error?: string;\n compact?: boolean;\n onClose?: () => void;\n onOpen?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={styles.worktree}>\n <View style={styles.line}>\n <Dot tone={item.orphaned ? 'yellow' : item.unowned ? 'blue' : 'green'} size=\"md\" />\n <Pressable\n style={styles.grow}\n accessibilityRole={onOpen ? 'button' : undefined}\n accessibilityLabel={onOpen ? `Open session for ${item.branch}` : undefined}\n onPress={onOpen}\n disabled={!onOpen}\n >\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.branch}>\n {compact && item.branch.length > 36 ? `${item.branch.slice(0, 19)}…${item.branch.slice(-14)}` : item.branch}\n </Text>\n {!compact ? (\n <Text style={styles.dim}>\n {item.orphaned ? 'Its folder is missing' : item.unowned ? 'Its session has ended' : 'Session running'}\n </Text>\n ) : null}\n </Pressable>\n {item.orphaned ? (\n <Badge tone=\"yellow\" style={styles.caution}>\n Orphaned\n </Badge>\n ) : null}\n {item.unowned ? (\n <Badge tone=\"blue\" style={styles.info}>\n Unowned\n </Badge>\n ) : null}\n {!compact ? (\n <Button\n variant=\"ghost\"\n style={styles.more}\n accessibilityLabel={`Close ${item.branch}`}\n testID={`git-worktree-close-${item.id}`}\n onPress={onClose}\n disabled={disabled}\n >\n ⋮\n </Button>\n ) : (\n <ChevronRightIcon size={16} color=\"dim\" />\n )}\n </View>\n {!compact ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.path}>\n {item.path}\n </Text>\n ) : null}\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n </View>\n );\n}\n\nexport function WorktreeStarting({ branch }: { branch?: string }) {\n return (\n <View style={styles.starting}>\n <Spinner label=\"Starting session...\" />\n <View style={styles.grow}>\n {branch ? (\n <Text numberOfLines={1} ellipsizeMode=\"middle\" style={styles.branch}>\n {branch}\n </Text>\n ) : null}\n <Text style={styles.dim}>Starting session...</Text>\n </View>\n </View>\n );\n}\n\nexport function WorktreeGroup({ title, count }: { title: string; count: string }) {\n return (\n <View style={styles.group}>\n <Text style={styles.heading}>{title}</Text>\n <Text style={styles.dim}>{count}</Text>\n </View>\n );\n}\n\nexport function WorktreeForm({\n close = false,\n branch = '',\n baseRef = '',\n onBranch,\n onBaseRef,\n onConfirm,\n onCancel,\n disabled = false,\n framed = true,\n}: {\n framed?: boolean;\n close?: boolean;\n branch?: string;\n baseRef?: string;\n onBranch?: (value: string) => void;\n onBaseRef?: (value: string) => void;\n onConfirm?: () => void;\n onCancel?: () => void;\n disabled?: boolean;\n}) {\n return (\n <View style={[styles.sheet, !framed && styles.unframed]}>\n {framed ? <View style={styles.handle} /> : null}\n <Text style={styles.sheetTitle}>{close ? 'Close this worktree?' : 'New worktree'}</Text>\n {close ? (\n <>\n <Text style={styles.branch}>{branch}</Text>\n <Text style={styles.body}>Removes the checkout and stops its session.</Text>\n </>\n ) : (\n <>\n <Text style={styles.body}>\n A separate checkout on its own branch, with its own session. This session stays where it is.\n </Text>\n <Text style={styles.label}>Branch</Text>\n <Input accessibilityLabel=\"Branch\" value={branch} onChangeText={onBranch} style={styles.monoInput} />\n <Text style={styles.label}>Start from</Text>\n <Input\n accessibilityLabel=\"Start from\"\n value={baseRef}\n onChangeText={onBaseRef}\n placeholder=\"Current branch\"\n />\n </>\n )}\n <Button\n onPress={onConfirm}\n disabled={disabled || (!close && branch.trim() === '')}\n variant={close ? 'danger' : 'primary'}\n style={[styles.fullButton, !close && styles.createButton]}\n >\n {close ? 'Close worktree' : <Text style={styles.createLabel}>Create worktree</Text>}\n </Button>\n <Button variant=\"outline\" style={styles.fullButton} onPress={onCancel}>\n Cancel\n </Button>\n </View>\n );\n}\n\nexport function WorktreesView({\n state,\n disabled = false,\n onNew,\n onClose,\n onOpen,\n}: {\n state: WorktreesSession;\n disabled?: boolean;\n onNew?: () => void;\n onClose?: (item: WorktreeView) => void;\n onOpen?: (id: string) => void;\n}) {\n const { working, attention, starting, closeErrorId } = worktreesPresentation(state);\n const row = (item: WorktreeView) => (\n <WorktreeRow\n key={item.id}\n item={item}\n disabled={disabled || !!state.pending}\n onClose={() => onClose?.(item)}\n onOpen={item.sessionId && onOpen ? () => onOpen(item.sessionId!) : undefined}\n error={state.errorTarget?.action === 'close' && state.errorTarget.id === item.id ? state.error : undefined}\n />\n );\n return (\n <View style={styles.screen}>\n <WorktreesHeader disabled={disabled || !!state.pending} onNew={onNew} />\n {state.worktrees.length || starting ? (\n <View style={styles.content}>\n <WorktreeGroup title=\"Working\" count={`${working.length} open${starting ? ' · 1 starting' : ''}`} />\n {working.map(row)}\n {starting ? <WorktreeStarting branch={state.requestedBranch} /> : null}\n {attention.length ? (\n <>\n <WorktreeGroup title=\"Needs a look\" count={`${attention.length} open`} />\n <Text style={styles.dim}>\n {attention.length === 2\n ? 'Two worktrees'\n : attention.length === 1\n ? 'One worktree'\n : `${attention.length} worktrees`}{' '}\n would like your eye, whenever you are ready.\n </Text>\n {attention.map(row)}\n </>\n ) : null}\n </View>\n ) : (\n <View style={styles.empty}>\n <Text style={styles.heading}>No worktrees yet</Text>\n <Text style={styles.emptyCopy}>Create a worktree to run a separate session on its own branch.</Text>\n </View>\n )}\n {state.pending && !starting ? <Text style={styles.dim}>{state.pending}</Text> : null}\n {state.error && (!closeErrorId || !state.worktrees.some((item) => item.id === closeErrorId)) ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {state.error}\n </Text>\n ) : null}\n </View>\n );\n}\nexport function WorktreesPanel({ sessionId, sessionReservationId, openSession }: WebPluginSlotProps) {\n const state = useWorktrees(sessionId);\n const [creating, setCreating] = useState(false);\n const [branch, setBranch] = useState('');\n const [baseRef, setBaseRef] = useState('');\n const [closing, setClosing] = useState<WorktreeView>();\n const busy = sessionId === null || state.pending !== undefined;\n return (\n <>\n <ScrollView contentContainerStyle={styles.scroll}>\n <WorktreesView\n state={state}\n disabled={sessionId === null}\n onNew={() => setCreating(true)}\n onClose={setClosing}\n onOpen={openSession}\n />\n </ScrollView>\n <Sheet open={creating} onOpenChange={setCreating}>\n <SheetContent>\n <WorktreeForm\n framed={false}\n branch={branch}\n baseRef={baseRef}\n onBranch={setBranch}\n onBaseRef={setBaseRef}\n disabled={busy}\n onCancel={() => setCreating(false)}\n onConfirm={() => {\n if (sessionId === null) return;\n requestWorktreeCreate(sessionId, branch, baseRef, sessionReservationId);\n setCreating(false);\n if (sessionReservationId === undefined) {\n setBranch('');\n setBaseRef('');\n }\n }}\n />\n </SheetContent>\n </Sheet>\n <Sheet\n open={!!closing}\n onOpenChange={(open) => {\n if (!open) setClosing(undefined);\n }}\n >\n <SheetContent>\n <WorktreeForm\n framed={false}\n close\n branch={closing?.branch}\n disabled={busy}\n onCancel={() => setClosing(undefined)}\n onConfirm={() => {\n if (sessionId !== null && closing) requestWorktreeClose(sessionId, closing.id);\n setClosing(undefined);\n }}\n />\n </SheetContent>\n </Sheet>\n </>\n );\n}\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.rail },\n scroll: { flexGrow: 1 },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing(5),\n minHeight: 88,\n },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n newPill: {\n backgroundColor: theme.colors['tint-green'],\n borderRadius: theme.borderRadius.full,\n minHeight: 44,\n paddingHorizontal: theme.spacing(4),\n },\n content: { paddingHorizontal: theme.spacing(5), gap: theme.spacing(2) },\n group: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(3),\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n body: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.dim,\n },\n label: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '500',\n color: theme.colors.text,\n marginTop: theme.spacing(2),\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.hi,\n },\n path: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n marginLeft: theme.spacing(4.5),\n },\n worktree: {\n gap: theme.spacing(1),\n paddingVertical: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n line: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 44 },\n grow: { flex: 1, minWidth: 0, minHeight: 44, justifyContent: 'center', gap: theme.spacing(1) },\n more: { width: 44, height: 44, padding: 0 },\n caution: { backgroundColor: theme.colors['tint-yellow'] },\n info: { backgroundColor: theme.colors['tint-blue'] },\n starting: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 52 },\n jade: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.green,\n fontWeight: '500',\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n unframed: { borderTopWidth: 0 },\n sheet: {\n backgroundColor: theme.colors.bg,\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n borderTopLeftRadius: theme.borderRadius.lg,\n borderTopRightRadius: theme.borderRadius.lg,\n padding: theme.spacing(5),\n gap: theme.spacing(3),\n },\n handle: {\n alignSelf: 'center',\n width: 40,\n height: 4,\n borderRadius: theme.borderRadius.full,\n backgroundColor: theme.colors.border,\n marginBottom: theme.spacing(2),\n },\n sheetTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xl,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n monoInput: { fontFamily: fontOf(theme.fontFamily.mono) },\n fullButton: { height: 44, alignSelf: 'stretch' },\n createButton: { backgroundColor: theme.colors.green },\n createLabel: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.colors.bg,\n },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: theme.spacing(8), gap: theme.spacing(3) },\n emptyCopy: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.dim,\n textAlign: 'center',\n },\n}));\n","/**\n * The cockpit's view of what this session changed against its base: the counts\n * the '# diff' group shows, what the review tab lists and draws, and the manual\n * sync that sits beside them.\n *\n * DESIGN PATTERNS:\n * - Declarations only, shared by the hub and the page.\n * - Its own channel, apart from worktrees. Worktrees are repository\n * management; the diff is this session's code change.\n * - A diff row carries one line number whose file follows from its marker: the\n * new file's for context and additions, the old file's for removals. It is\n * the same shape the shared DiffView draws.\n *\n * AVOID:\n * - Behaviour or node builtins. Browser code imports this file.\n */\n\n/** The session channel carrying this checkout's changes and the sync around them. */\nexport const GIT_CHANGES_TYPE = 'git_changes';\n\n/** The sync actions the review tab offers. */\nexport type GitSyncAction = 'pull' | 'push' | 'rebase' | 'abort-rebase';\n\n/** What the review tab asks the hub to run. `force` only follows a confirmed rejected push. */\nexport type GitChangesCommand =\n | { action: 'pull' }\n | { action: 'push'; force?: true }\n | { action: 'rebase' }\n | { action: 'abort-rebase' };\n\nexport type GitSyncErrorTarget =\n | { action: 'pull' | 'rebase' | 'abort-rebase' }\n /** A push the remote rejected as non-fast-forward; the tab offers a lease force after a confirm. */\n | { action: 'push'; forceRequired?: true };\n\nexport interface GitChangesPayload {\n /** Absent outside a git checkout. */\n changes?: GitChangesView;\n /** Label of the sync command in flight. */\n pending?: string;\n /** The last sync failure, cleared when the next command starts. */\n error?: string;\n errorTarget?: GitSyncErrorTarget;\n}\n\n/** What the session changed since its base, as the '# diff' lane and the review header show it. */\nexport interface GitChangesView {\n /** The checked-out branch; absent on a detached HEAD. */\n branch?: string;\n /** The ref the changes are measured against; absent when none resolved, so only uncommitted work counts. */\n base?: string;\n added: number;\n removed: number;\n files: number;\n /** More files changed than were counted. */\n truncated?: boolean;\n /** The branch's upstream and how far apart the two are. */\n upstream?: { ref: string; ahead: number; behind: number };\n /** Present while a rebase is paused on conflicts. */\n rebase?: { conflicts: string[] };\n}\n\nexport type GitReviewFileStatus = 'added' | 'modified' | 'deleted' | 'untracked' | 'conflicted';\n\n/** One changed file in the review list. */\nexport interface GitReviewFileEntry {\n /** Repository-relative, forward slashes. */\n path: string;\n status: GitReviewFileStatus;\n added: number;\n removed: number;\n binary?: boolean;\n}\n\n/** The review tab's file list. */\nexport interface GitReviewSummary {\n /** False when the session's directory is not a git checkout. */\n repository: boolean;\n branch?: string;\n base?: string;\n /** Short sha of the commit the diff starts from. */\n mergeBase?: string;\n files: GitReviewFileEntry[];\n truncated?: boolean;\n}\n\nexport interface GitDiffRow {\n marker: '+' | '-' | ' ';\n line: number;\n content: string;\n}\n\nexport interface GitDiffHunk {\n start: number;\n rows: GitDiffRow[];\n}\n\n/** One file's hunks, fetched when the reader expands it. */\nexport interface GitReviewFileDiff {\n path: string;\n hunks: GitDiffHunk[];\n binary?: true;\n /** The diff was past the size cap and is not drawn. */\n tooLarge?: true;\n}\n","/**\n * This session's code change against its base, and the manual sync beside it.\n *\n * DESIGN PATTERNS:\n * - Its own session store and hub channel, apart from worktrees. Worktrees are\n * repository management; this is the session's diff.\n * - The hub is authoritative: it computes the counts, runs pull, push and\n * rebase one at a time, and reports pending, errors and a paused rebase here.\n * - The sender lives in a store rather than a module variable, because a web\n * plugin keeps no mutable module state and the page may reconnect.\n *\n * AVOID:\n * - `sendSessionFrame` for a sync command. That frame is bound for the agent\n * and never reaches a channel's `receive`.\n */\nimport { defineGlobalStore, defineSessionStore, type WebPluginRuntime } from '@agimon-ai/po-core/native';\n\nimport {\n GIT_CHANGES_TYPE,\n type GitChangesCommand,\n type GitChangesView,\n type GitSyncAction,\n type GitSyncErrorTarget,\n} from '../../../../../types/gitReview';\n\nexport interface GitChangesSession {\n /** Absent until the hub reports, and outside a git checkout. */\n changes: GitChangesView | undefined;\n pending: string | undefined;\n error: string | undefined;\n errorTarget: GitSyncErrorTarget | undefined;\n}\n\nexport const gitChanges = defineSessionStore<GitChangesSession>({\n changes: undefined,\n pending: undefined,\n error: undefined,\n errorTarget: undefined,\n});\n\n/** The page's hub socket sender; undefined before start and after dispose, when a command is dropped. */\nconst changesSender = defineGlobalStore<WebPluginRuntime['sendHubFrame'] | undefined>(undefined);\n\n/** Binds the page's hub socket for sync commands. The plugin host calls this once per page. */\nexport function startGitChangesRuntime(runtime: WebPluginRuntime): () => void {\n const send = (frame: Record<string, unknown>): void => {\n runtime.sendHubFrame(frame);\n };\n changesSender.update(() => send);\n return () => {\n changesSender.update((current) => (current === send ? undefined : current));\n };\n}\n\n/** Whether a sync command is running for this session. */\nexport const gitChangesActivitySource = {\n subscribe(listener: () => void) {\n const subscription = gitChanges.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId: string | null) {\n return gitChanges.select(gitChanges.store.state, sessionId).pending !== undefined;\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction count(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n}\n\n/** The page never trusts a frame's shape: a malformed field drops, the rest still renders. */\nconst MAX_CONFLICTS = 100;\n\nfunction optionalChanges(value: unknown): GitChangesView | undefined {\n if (!isRecord(value)) return undefined;\n const added = count(value.added);\n const removed = count(value.removed);\n const files = count(value.files);\n if (added === undefined || removed === undefined || files === undefined) return undefined;\n const branch = optionalText(value.branch);\n const base = optionalText(value.base);\n const upstream = isRecord(value.upstream) ? value.upstream : undefined;\n const ahead = count(upstream?.ahead);\n const behind = count(upstream?.behind);\n const upstreamRef = optionalText(upstream?.ref);\n const conflicts =\n isRecord(value.rebase) && Array.isArray(value.rebase.conflicts)\n ? value.rebase.conflicts.filter((file): file is string => typeof file === 'string').slice(0, MAX_CONFLICTS)\n : undefined;\n return {\n added,\n removed,\n files,\n ...(branch === undefined ? {} : { branch }),\n ...(base === undefined ? {} : { base }),\n ...(value.truncated === true ? { truncated: true } : {}),\n ...(upstreamRef === undefined || ahead === undefined || behind === undefined\n ? {}\n : { upstream: { ref: upstreamRef, ahead, behind } }),\n ...(conflicts === undefined ? {} : { rebase: { conflicts } }),\n };\n}\n\nfunction optionalErrorTarget(value: unknown): GitSyncErrorTarget | undefined {\n if (!isRecord(value)) return undefined;\n if (value.action === 'pull' || value.action === 'rebase' || value.action === 'abort-rebase')\n return { action: value.action };\n if (value.action === 'push')\n return value.forceRequired === true ? { action: 'push', forceRequired: true } : { action: 'push' };\n return undefined;\n}\n\n/** The session data channel: 'git_changes' payloads into the store. */\nexport const gitChangesChannel = gitChanges.channel<GitChangesSession>({\n channel: GIT_CHANGES_TYPE,\n parse(input) {\n if (!isRecord(input)) return null;\n return {\n changes: optionalChanges(input.changes),\n pending: optionalText(input.pending),\n error: optionalText(input.error),\n errorTarget: optionalErrorTarget(input.errorTarget),\n };\n },\n reduce(_current, next) {\n return next;\n },\n});\n\n/**\n * Asks the hub to pull, push, rebase or abort a paused rebase. `force` is only\n * ever sent after the reader confirmed a lease force for a rejected push.\n */\nexport function requestGitSync(sessionId: string, action: GitSyncAction, force = false): void {\n const payload: GitChangesCommand = action === 'push' && force ? { action: 'push', force: true } : { action };\n changesSender.store.state?.({ type: GIT_CHANGES_TYPE, sessionId, payload });\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { BranchIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { worktreesTab } from '../_components/WorktreesPanel.native';\nimport { gitChangesActivitySource } from '../_lib/gitChangesStore.native';\nimport { worktreeActivitySource } from '../_lib/worktreesActivityStore.native';\n\nexport default defineActivityGroup({\n keys: 'g w',\n icon: () => createElement(BranchIcon),\n activeSource: {\n subscribe(listener) {\n const stopWorktrees = worktreeActivitySource.subscribe(listener);\n const stopChanges = gitChangesActivitySource.subscribe(listener);\n return () => {\n stopWorktrees();\n stopChanges();\n };\n },\n isActive(sessionId) {\n return worktreeActivitySource.isActive(sessionId) || gitChangesActivitySource.isActive(sessionId);\n },\n },\n marksBackgroundWork: false,\n transientTab: worktreesTab,\n order: 30,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { gitChangesChannel } from '../_lib/gitChangesStore.native';\nexport default defineChannelFile(gitChangesChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { worktreesChannel } from '../_lib/worktreesActivityStore.native';\nexport default defineChannelFile(worktreesChannel);\n","import { api } from '../../../../../../generated/client.native';\nimport type { GitReviewFileDiff, GitReviewSummary } from '../../../../../types/gitReview';\n\n/**\n * The review tab's half of the session API: the changed-file list and one\n * file's hunks.\n *\n * The generated client owns the URL and the sealed transport, so nothing here\n * spells a route or reaches for `fetch`. What travels is file contents, which a\n * tunnel's relay must never see in the clear.\n */\n\nconst UNREACHABLE = 'The session is unreachable.';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** The message a reader is shown: the route's own words, or why there were none. */\nfunction messageOf(result: { status: number; error: string }): string {\n if (result.status === 0) return UNREACHABLE;\n return result.error === '' ? `The session answered ${String(result.status)}.` : result.error;\n}\n\nexport type ReviewSummaryResult = { ok: true; summary: GitReviewSummary } | { ok: false; error: string };\n\nexport async function fetchReviewSummary(sessionId: string, signal?: AbortSignal): Promise<ReviewSummaryResult> {\n const result = await api.session(sessionId).review(signal === undefined ? {} : { signal });\n if (!result.ok) return { ok: false, error: messageOf(result) };\n if (!isRecord(result.data) || !Array.isArray(result.data.files)) {\n return { ok: false, error: 'The session answered with no file list.' };\n }\n return { ok: true, summary: result.data };\n}\n\nexport type ReviewFileResult = { ok: true; diff: GitReviewFileDiff } | { ok: false; error: string };\n\nexport async function fetchReviewFile(\n sessionId: string,\n path: string,\n signal?: AbortSignal,\n): Promise<ReviewFileResult> {\n const result = await api\n .session(sessionId)\n .reviewFile({ query: { path }, ...(signal === undefined ? {} : { signal }) });\n if (!result.ok) return { ok: false, error: messageOf(result) };\n if (!isRecord(result.data) || !Array.isArray(result.data.hunks)) {\n return { ok: false, error: 'The session answered with no diff.' };\n }\n return { ok: true, diff: result.data };\n}\n","import type { GitDiffRow } from '../../../../../types/gitReview';\n\nexport interface GitLineRange {\n side: 'old' | 'new';\n startLine: number;\n endLine: number;\n}\n\n/** A different side starts a fresh selection. The second same-side tap completes it. */\nexport function selectReviewLine(\n anchor: GitLineRange | undefined,\n row: GitDiffRow,\n): { range: GitLineRange; complete: boolean } {\n const side = row.marker === '-' ? 'old' : 'new';\n if (!anchor || anchor.side !== side) {\n return { range: { side, startLine: row.line, endLine: row.line }, complete: false };\n }\n return {\n range: { side, startLine: Math.min(anchor.startLine, row.line), endLine: Math.max(anchor.startLine, row.line) },\n complete: true,\n };\n}\n\nexport function reviewRangeRows(rows: readonly GitDiffRow[], range: GitLineRange): GitDiffRow[] {\n return rows.filter(\n (row) =>\n (row.marker === '-' ? 'old' : 'new') === range.side && row.line >= range.startLine && row.line <= range.endLine,\n );\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n/**\n * Review comments queued on this session, waiting to go to the agent as one\n * message.\n *\n * DESIGN PATTERNS:\n * - Session-scoped and in memory: comments survive closing and reopening the\n * review tab, not a page reload. The same trade the files tab makes.\n * - Comments are cleared only after a send the host accepted, never before.\n */\nimport type { ReviewComment } from '@agimon-ai/po-web-components';\n\nexport interface GitReviewSession {\n comments: ReviewComment[];\n}\n\nexport const gitReview = defineSessionStore<GitReviewSession>({ comments: [] });\n\nexport function addReviewComment(sessionId: string, comment: Omit<ReviewComment, 'id'>): void {\n const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n gitReview.update(sessionId, (current) => ({ comments: [...current.comments, { ...comment, id }] }));\n}\n\nexport function removeReviewComment(sessionId: string, id: string): void {\n gitReview.update(sessionId, (current) => ({ comments: current.comments.filter((comment) => comment.id !== id) }));\n}\n\nexport function clearReviewComments(sessionId: string): void {\n gitReview.update(sessionId, () => ({ comments: [] }));\n}\n","import type { SessionFrameSender } from '@agimon-ai/po-core/web';\n\nimport type { GitChangesView } from '../../../../../types/gitReview';\n\n/**\n * Pure wording for what the review tab sends the agent, and the one send.\n *\n * Both messages go as `follow_up`: the host starts a turn when idle, or after\n * the current one, without treating a review send as an explicit Queue action.\n * A `prompt` frame instead fails while a turn runs.\n */\n\n/** The opening line of a review, naming what was reviewed. */\nexport function reviewHeading(count: number, branch: string | undefined, base: string | undefined): string {\n const what = branch === undefined ? 'this checkout' : `branch ${branch}`;\n const against = base === undefined ? 'its uncommitted changes' : `its changes against ${base}`;\n const comments = count === 1 ? 'one review comment' : `${String(count)} review comments`;\n const address = count === 1 ? 'Please address it.' : 'Please address them all.';\n return `I reviewed ${what} (${against}) and left ${comments}. ${address}`;\n}\n\n/** What \"ask agent to resolve\" sends: the files, and the steps that finish a paused rebase. */\nexport function conflictPrompt(branch: string | undefined, conflicts: readonly string[]): string {\n const files =\n conflicts.length === 0 ? '- (git reports no unmerged paths yet)' : conflicts.map((file) => `- ${file}`).join('\\n');\n return [\n `A rebase of ${branch ?? 'this checkout'} stopped on conflicts in:`,\n '',\n files,\n '',\n 'Please resolve them:',\n '1. Fix the conflict markers in each file, keeping the intent of both sides.',\n '2. `git add` each resolved file.',\n '3. Run `GIT_EDITOR=true git rebase --continue`, and repeat if it stops again.',\n '',\n 'Do not push. I will push from the cockpit once the rebase is done.',\n ].join('\\n');\n}\n\n/**\n * The one sync the bar fills in: pull while the branch is behind (a push would\n * be rejected), push while it is only ahead or has no upstream yet. Nothing\n * while a rebase is paused, detached, or already level.\n */\nexport function suggestedSyncAction(changes: GitChangesView | undefined): 'pull' | 'push' | undefined {\n if (changes?.branch === undefined || changes.rebase !== undefined) return undefined;\n if (changes.upstream === undefined) return 'push';\n if (changes.upstream.behind > 0) return 'pull';\n return changes.upstream.ahead > 0 ? 'push' : undefined;\n}\n\n/** \"2 to push, 1 new on origin/feat/git\", or \"Up to date with origin/feat/git\". */\nexport function upstreamSummary(upstream: GitChangesView['upstream']): string {\n if (upstream === undefined) return 'No upstream yet';\n const parts = [\n ...(upstream.ahead > 0 ? [`${String(upstream.ahead)} to push`] : []),\n ...(upstream.behind > 0 ? [`${String(upstream.behind)} new on ${upstream.ref}`] : []),\n ];\n return parts.length === 0 ? `Up to date with ${upstream.ref}` : parts.join(', ');\n}\n/**\n * Hands one deferred follow-up to the session. Returns the reason it failed,\n * or undefined once sent. The sender throws when the session is disconnected.\n */\nexport function deliverToAgent(send: SessionFrameSender, sessionId: string, message: string): string | undefined {\n try {\n send(sessionId, { type: 'follow_up', message });\n return undefined;\n } catch (error) {\n return error instanceof Error ? error.message : 'The session did not take the message.';\n }\n}\n","import {\n Button,\n SyntaxLine,\n Textarea,\n fontOf,\n BranchIcon,\n ChevronRightIcon,\n MessageIcon,\n AlertIcon,\n} from '@agimon-ai/po-native-components';\nimport type { ReviewComment } from '@agimon-ai/po-web-components';\nimport { memo, useMemo, useState } from 'react';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet, useUnistyles } from 'react-native-unistyles';\n\nimport type {\n GitDiffRow,\n GitReviewFileEntry,\n GitChangesPayload,\n GitReviewSummary,\n GitReviewFileDiff,\n GitSyncAction,\n} from '../../../../../types/gitReview';\nimport type {} from '../../../../../types/unistyles.native';\nimport type { GitLineRange } from '../_lib/gitReviewSelection';\nimport { suggestedSyncAction, upstreamSummary } from '../_lib/gitReviewView';\nexport function Action({\n children,\n variant = 'outline',\n disabled = false,\n onPress,\n}: {\n children: string;\n variant?: 'primary' | 'outline' | 'ghost' | 'danger' | 'danger-outline';\n disabled?: boolean;\n onPress?: () => void;\n}) {\n const { theme } = useUnistyles();\n return (\n <Button\n onPress={onPress}\n variant={variant}\n disabled={disabled}\n style={[styles.action, variant === 'primary' && styles.primary]}\n >\n {variant === 'primary' ? (\n <Text\n style={[\n styles.primaryLabel,\n { color: theme.scheme === 'dark' ? theme.colors.rail : theme.colors['on-selected'] },\n ]}\n >\n {children}\n </Text>\n ) : (\n children\n )}\n </Button>\n );\n}\n\nexport function Footer({\n count,\n discard = false,\n confirmation = false,\n onReview,\n onSend,\n onDiscard,\n}: {\n count: number;\n discard?: boolean;\n confirmation?: boolean;\n onReview?: () => void;\n onSend?: () => void;\n onDiscard?: () => void;\n}) {\n return (\n <View style={styles.footer}>\n {discard ? (\n <Action variant=\"ghost\" onPress={onDiscard}>\n Discard\n </Action>\n ) : (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Review queued comments\"\n onPress={onReview}\n style={[styles.inline, styles.action]}\n >\n <MessageIcon size={16} color=\"blue\" />\n <Text style={styles.dim}>\n {count} {count === 1 ? 'comment' : 'comments'} queued\n </Text>\n </Pressable>\n )}\n <Action variant={confirmation ? 'outline' : 'primary'} disabled={count === 0} onPress={onSend}>\n Send review\n </Action>\n </View>\n );\n}\n\nexport function SyncCard({\n changes,\n busy = false,\n onSync,\n}: {\n changes: GitChangesPayload['changes'];\n busy?: boolean;\n onSync?: (action: GitSyncAction) => void;\n}) {\n const suggested = suggestedSyncAction(changes);\n return (\n <View style={styles.card}>\n <View style={styles.inline}>\n <BranchIcon size={18} color=\"dim\" />\n <Text style={styles.branch}>{changes?.branch ?? 'Detached HEAD'}</Text>\n <View style={styles.grow} />\n <Text style={styles.green}>+{changes?.added ?? 0}</Text>\n <Text style={styles.red}>-{changes?.removed ?? 0}</Text>\n </View>\n <Text style={[styles.dim, styles.mono]}>{changes?.base ? `vs ${changes.base}` : 'Uncommitted changes'}</Text>\n <Text style={styles.dim}>{upstreamSummary(changes?.upstream)}</Text>\n <View style={styles.inline}>\n {(['pull', 'push', 'rebase'] as const).map((action) => (\n <Button\n key={action}\n variant={suggested === action ? 'outline' : 'ghost'}\n style={suggested === action ? [styles.action, styles.suggested] : styles.action}\n disabled={\n busy ||\n changes?.rebase !== undefined ||\n (action === 'pull'\n ? changes?.upstream === undefined\n : action === 'push'\n ? changes?.branch === undefined\n : changes?.base === undefined)\n }\n onPress={() => onSync?.(action)}\n >\n {action === 'pull' ? 'Pull' : action === 'push' ? 'Push' : 'Rebase'}\n </Button>\n ))}\n </View>\n </View>\n );\n}\n\nexport function FileList({\n files,\n comments = [],\n onFile,\n}: {\n files: GitReviewFileEntry[];\n comments?: ReviewComment[];\n onFile?: (path: string) => void;\n}) {\n return (\n <View style={styles.list}>\n <Text style={styles.section}>{files.length} files</Text>\n {files.map((file) => (\n <Pressable\n key={file.path}\n accessibilityRole=\"button\"\n testID={`git-review-file-${file.path}`}\n onPress={() => onFile?.(file.path)}\n style={styles.fileRow}\n >\n <Text\n style={file.status === 'added' ? styles.green : file.status === 'untracked' ? styles.blue : styles.yellow}\n >\n {file.status[0]?.toUpperCase()}\n </Text>\n <View style={styles.grow}>\n <Text style={styles.body}>{file.path.split('/').at(-1)}</Text>\n <Text numberOfLines={1} style={[styles.dim, styles.mono]}>\n {file.path.split('/').slice(0, -1).join('/') || '.'}\n </Text>\n </View>\n <Text>\n <Text style={styles.green}>+{file.added}</Text> <Text style={styles.red}>-{file.removed}</Text>\n </Text>\n {comments.some((comment) => comment.path === file.path) ? (\n <View style={styles.inline}>\n <MessageIcon size={12} color=\"blue\" />\n <Text style={styles.blue}>{comments.filter((comment) => comment.path === file.path).length}</Text>\n </View>\n ) : null}\n <ChevronRightIcon size={16} color=\"dim\" />\n </Pressable>\n ))}\n </View>\n );\n}\n\nexport function ConfirmSheet({\n discard = false,\n onConfirm,\n onCancel,\n}: {\n discard?: boolean;\n onConfirm?: () => void;\n onCancel?: () => void;\n}) {\n return (\n <View style={styles.sheet}>\n <View style={styles.handle} />\n <Text style={styles.sheetTitle}>{discard ? 'Discard review?' : 'Abort rebase?'}</Text>\n <Text style={styles.dim}>\n {discard ? 'Your queued comments will be removed.' : 'Abort discards any conflict resolution in progress.'}\n </Text>\n <Action variant=\"danger\" onPress={onConfirm}>\n {discard ? 'Discard' : 'Abort rebase'}\n </Action>\n <Action variant=\"ghost\" onPress={onCancel}>\n Cancel\n </Action>\n </View>\n );\n}\n\nexport function RebaseCard({\n confirmation = false,\n conflicts,\n busy = false,\n onResolve,\n onAbort,\n}: {\n confirmation?: boolean;\n conflicts: string[];\n busy?: boolean;\n onResolve?: () => void;\n onAbort?: () => void;\n}) {\n return (\n <View style={[styles.card, styles.caution]}>\n <View style={styles.inline}>\n <AlertIcon size={20} color=\"yellow\" />\n <Text style={styles.section}>Rebase paused</Text>\n </View>\n <Text style={styles.body}>Resolve conflicts or ask Po to do it for you.</Text>\n <Text style={[styles.dim, styles.mono]}>{conflicts.join('\\n')}</Text>\n <Action disabled={busy} onPress={onResolve} variant={confirmation ? 'outline' : 'primary'}>\n Ask Po to resolve\n </Action>\n <Action disabled={busy} onPress={onAbort} variant=\"danger-outline\">\n Abort rebase\n </Action>\n </View>\n );\n}\n\nexport function FileHeader({\n entry,\n index,\n total,\n onPrevious,\n onNext,\n onChanges,\n}: {\n entry: GitReviewFileEntry;\n index: number;\n total: number;\n onPrevious?: () => void;\n onNext?: () => void;\n onChanges?: () => void;\n}) {\n return (\n <View style={styles.content}>\n <Text style={styles.heading}>{entry.path.split('/').at(-1)}</Text>\n <Text style={[styles.dim, styles.mono]}>{entry.path.split('/').slice(0, -1).join('/') || '.'}</Text>\n <View style={styles.inline}>\n <Text style={styles.dim}>\n {entry.status[0]?.toUpperCase()}\n {entry.status.slice(1)}\n </Text>\n <Text style={styles.green}>+{entry.added}</Text>\n <Text style={styles.red}>-{entry.removed}</Text>\n </View>\n <View style={styles.navigation}>\n <Action variant=\"ghost\" disabled={index === 0} onPress={onPrevious}>\n Previous\n </Action>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Return to changes\"\n onPress={onChanges}\n style={[styles.inline, styles.action]}\n >\n <Text style={styles.dim}>\n {onChanges ? 'Changes · ' : ''}\n {index + 1} of {total}\n </Text>\n </Pressable>\n <Action variant=\"ghost\" disabled={index === total - 1} onPress={onNext}>\n Next\n </Action>\n </View>\n </View>\n );\n}\n\nexport const DiffRows = memo(function DiffRows({\n rows,\n comments = [],\n selection,\n onLine,\n showInlineComments = true,\n gutterDigits,\n}: {\n rows: GitDiffRow[];\n comments?: ReviewComment[];\n selection?: GitLineRange;\n onLine?: (row: GitDiffRow) => void;\n showInlineComments?: boolean;\n gutterDigits?: number;\n}) {\n const anchoredComments = useMemo(() => {\n const index = new Map<string, ReviewComment[]>();\n for (const comment of comments) {\n const key = `${comment.side}:${comment.endLine ?? comment.startLine}`;\n const entries = index.get(key);\n if (entries) entries.push(comment);\n else index.set(key, [comment]);\n }\n return index;\n }, [comments]);\n const digits = gutterDigits ?? rows.reduce((max, row) => Math.max(max, String(row.line).length), 1);\n return (\n <View>\n {rows.map((row, i) => {\n const side = row.marker === '-' ? 'old' : 'new';\n const anchored = anchoredComments.get(`${side}:${row.line}`) ?? [];\n return (\n <View key={i}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`Select ${side} line ${row.line}`}\n onPress={() => onLine?.(row)}\n style={[\n styles.diffRow,\n row.marker === '+' && styles.added,\n row.marker === '-' && styles.removed,\n selection?.side === side &&\n row.line >= selection.startLine &&\n row.line <= selection.endLine &&\n styles.selection,\n ]}\n >\n <Text numberOfLines={1} style={[styles.mono, styles.gutter]}>\n {String(row.line).padStart(digits, '\\u00a0')}\n </Text>\n <Text style={[styles.dim, styles.mono]}>{row.marker}</Text>\n <SyntaxLine text={row.content || ' '} style={[styles.mono, styles.code]} />\n {anchored.length ? <MessageIcon size={12} color=\"blue\" /> : null}\n </Pressable>\n {showInlineComments &&\n anchored.map((comment) => (\n <View key={comment.id} style={styles.inlineComment}>\n <Text style={styles.blue}>Queued comment · {lineLabel(comment)}</Text>\n <Text style={styles.body}>{comment.body}</Text>\n </View>\n ))}\n </View>\n );\n })}\n </View>\n );\n});\n\nfunction lineLabel(comment: { startLine?: number; endLine?: number }) {\n return comment.startLine === undefined\n ? 'File comment'\n : comment.endLine === comment.startLine || comment.endLine === undefined\n ? `Line ${comment.startLine}`\n : `Lines ${comment.startLine} to ${comment.endLine}`;\n}\n\nexport function CommentSheet({\n range,\n snippet,\n value,\n onChange,\n onAdd,\n onCancel,\n}: {\n range?: GitLineRange;\n snippet: string;\n value?: string;\n onChange?: (value: string) => void;\n onAdd?: () => void;\n onCancel?: () => void;\n}) {\n return (\n <View style={styles.sheet}>\n <View style={styles.handle} />\n <Text style={styles.sheetTitle}>{range ? lineLabel(range) : 'Comment on file'}</Text>\n {snippet ? (\n <View style={styles.quote}>\n <SyntaxLine text={snippet} style={[styles.body, styles.mono]} />\n </View>\n ) : null}\n <Textarea\n accessibilityLabel=\"What should change here?\"\n placeholder=\"What should change here?\"\n rows={4}\n value={value}\n onChangeText={onChange}\n />\n <Action variant=\"primary\" disabled={value !== undefined && value.trim() === ''} onPress={onAdd}>\n Add comment\n </Action>\n <Action variant=\"ghost\" onPress={onCancel}>\n Cancel\n </Action>\n </View>\n );\n}\n\nexport function CommentCards({ comments, onRemove }: { comments: ReviewComment[]; onRemove?: (id: string) => void }) {\n return (\n <View style={styles.content}>\n <Text style={styles.body}>\n {comments.length === 2 ? 'Two' : comments.length} {comments.length === 1 ? 'comment' : 'comments'} queued for\n Po, whenever you are ready.\n </Text>\n {comments.map((comment) => (\n <View key={comment.id} style={styles.card}>\n <Text style={[styles.body, styles.mono]}>{comment.relPath}</Text>\n <Text style={styles.dim}>{lineLabel(comment)}</Text>\n {comment.snippet ? (\n <View style={styles.quote}>\n <SyntaxLine text={comment.snippet} style={[styles.body, styles.mono]} />\n </View>\n ) : null}\n <Text style={styles.body}>{comment.body}</Text>\n <View style={styles.remove}>\n <Action variant=\"ghost\" onPress={() => onRemove?.(comment.id)}>\n Remove\n </Action>\n </View>\n </View>\n ))}\n </View>\n );\n}\n\nexport const styles = StyleSheet.create((theme) => ({\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n sheetTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.xl,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n section: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n body: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.text,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n green: { fontSize: theme.fontSize.sm, color: theme.colors.green },\n red: { fontSize: theme.fontSize.sm, color: theme.colors.red },\n blue: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.blue },\n yellow: { fontSize: theme.fontSize.sm, color: theme.colors.yellow },\n content: { padding: theme.spacing(4), gap: theme.spacing(3) },\n card: {\n borderWidth: 1,\n borderColor: theme.colors.border,\n borderRadius: theme.borderRadius.lg,\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n },\n inline: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n grow: { flex: 1, minWidth: 0 },\n action: { minHeight: 44 },\n primary: { backgroundColor: theme.colors.green },\n primaryLabel: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.scheme === 'dark' ? theme.colors.rail : theme.colors['on-selected'],\n },\n suggested: { backgroundColor: theme.colors['tint-green'], borderColor: theme.colors['edge-green'], flex: 1 },\n list: { gap: theme.spacing(2) },\n fileRow: {\n minHeight: 44,\n paddingVertical: theme.spacing(2),\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors.border,\n },\n footer: {\n minHeight: 76,\n padding: theme.spacing(4),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.rail,\n },\n caution: { backgroundColor: theme.colors['tint-yellow'], borderColor: theme.colors['edge-yellow'] },\n failure: { backgroundColor: theme.colors['tint-red'], borderColor: theme.colors['edge-red'] },\n sheet: {\n padding: theme.spacing(4),\n gap: theme.spacing(3),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n borderTopLeftRadius: theme.borderRadius.lg,\n borderTopRightRadius: theme.borderRadius.lg,\n backgroundColor: theme.colors.rail,\n },\n handle: {\n height: 4,\n width: 40,\n borderRadius: theme.borderRadius.md,\n backgroundColor: theme.colors.border,\n alignSelf: 'center',\n },\n empty: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: theme.spacing(3), padding: theme.spacing(6) },\n navigation: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },\n diffRow: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(2),\n paddingVertical: theme.spacing(1),\n borderLeftWidth: 3,\n borderLeftColor: theme.colors.bg,\n },\n gutter: { color: theme.colors.dim, width: 'auto', minWidth: 24, flexShrink: 0, textAlign: 'right' },\n disclosure: {\n padding: theme.spacing(3),\n gap: theme.spacing(2),\n borderTopWidth: 1,\n borderColor: theme.colors.border,\n backgroundColor: theme.colors.bg,\n },\n code: { flex: 1, minWidth: 0, color: theme.colors.text },\n added: { backgroundColor: theme.colors['tint-green'] },\n removed: { backgroundColor: theme.colors['tint-red'] },\n selection: { borderLeftColor: theme.colors.green },\n inlineComment: {\n margin: theme.spacing(2),\n padding: theme.spacing(3),\n borderWidth: 1,\n borderColor: theme.colors['edge-blue'],\n borderRadius: theme.borderRadius.md,\n gap: theme.spacing(1),\n },\n quote: { padding: theme.spacing(2), backgroundColor: theme.colors.panel, borderRadius: theme.borderRadius.md },\n remove: { alignSelf: 'flex-end' },\n}));\n\nexport interface GitReviewViewProps {\n screen: 'changes' | 'file' | 'review';\n initialVisibleRows?: number;\n activity: GitChangesPayload;\n summary?: GitReviewSummary;\n file?: GitReviewFileDiff;\n path?: string;\n comments: ReviewComment[];\n error?: string;\n forceRequired?: boolean;\n selection?: GitLineRange;\n onScreen: (screen: 'changes' | 'file' | 'review') => void;\n onFile: (path: string) => void;\n onLine: (row: GitDiffRow) => void;\n onSync: (action: GitSyncAction) => void;\n onForce: () => void;\n onAbort: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n onComment: () => void;\n onRemove: (id: string) => void;\n onSend: () => void;\n onDiscard: () => void;\n}\nconst DIFF_ROW_STEP = 200;\n\nexport function GitReviewView(props: GitReviewViewProps) {\n const { screen, activity, summary, file, path, comments } = props;\n const rows = useMemo(() => file?.hunks.flatMap((hunk) => hunk.rows) ?? [], [file?.hunks]);\n const gutterDigits = useMemo(() => rows.reduce((max, row) => Math.max(max, String(row.line).length), 1), [rows]);\n const fileComments = useMemo(() => comments.filter((comment) => comment.path === path), [comments, path]);\n const initialLimit = props.initialVisibleRows ?? DIFF_ROW_STEP;\n const [disclosure, setDisclosure] = useState({ rows, path, limit: initialLimit });\n const current =\n disclosure.rows === rows && disclosure.path === path ? disclosure : { rows, path, limit: initialLimit };\n if (current !== disclosure) setDisclosure(current);\n const visibleRows = useMemo(() => rows.slice(0, current.limit), [rows, current.limit]);\n const index = summary?.files.findIndex((entry) => entry.path === path) ?? -1;\n const entry = summary?.files[index];\n return (\n <View style={styles.grow}>\n {screen === 'review' ? (\n <View style={styles.inline}>\n <Action variant=\"ghost\" onPress={() => props.onScreen('changes')}>\n Changes\n </Action>\n {screen === 'review' && path ? (\n <Action variant=\"ghost\" onPress={() => props.onScreen('file')}>\n File diff\n </Action>\n ) : null}\n </View>\n ) : null}\n <ScrollView key={`${screen}:${path ?? ''}`} style={styles.grow}>\n {screen === 'changes' ? (\n <View style={styles.content}>\n {summary?.repository !== false ? (\n <SyncCard changes={activity.changes} busy={activity.pending !== undefined} onSync={props.onSync} />\n ) : null}\n {activity.pending ? <Text style={styles.dim}>{activity.pending}</Text> : null}\n {activity.error ? (\n <View style={[styles.card, props.forceRequired ? styles.caution : styles.failure]}>\n <Text style={styles.body}>{activity.error}</Text>\n {props.forceRequired ? (\n <Action variant=\"danger-outline\" onPress={props.onForce}>\n Force push with lease\n </Action>\n ) : null}\n <Action variant=\"ghost\" onPress={props.onDismiss}>\n Dismiss\n </Action>\n </View>\n ) : null}\n {activity.changes?.rebase ? (\n <RebaseCard\n conflicts={activity.changes.rebase.conflicts}\n busy={activity.pending !== undefined}\n onResolve={props.onResolve}\n onAbort={props.onAbort}\n />\n ) : null}\n {!summary ? (\n <Text style={styles.dim}>Loading changes…</Text>\n ) : summary.files.length ? (\n <FileList files={summary.files} comments={comments} onFile={props.onFile} />\n ) : (\n <View style={styles.empty}>\n <Text style={styles.sheetTitle}>{summary.repository ? 'No changes yet' : 'Not a Git checkout'}</Text>\n <Text style={styles.dim}>\n {summary.repository\n ? `Nothing to review on ${summary.branch ?? 'this checkout'}.`\n : 'This folder is not a Git repository, so there is nothing to sync.'}\n </Text>\n </View>\n )}\n {summary?.truncated ? <Text style={styles.dim}>The file list was truncated.</Text> : null}\n </View>\n ) : screen === 'file' ? (\n <>\n {entry ? (\n <FileHeader\n entry={entry}\n index={index}\n total={summary?.files.length ?? 0}\n onChanges={() => props.onScreen('changes')}\n onPrevious={() => {\n const previous = summary?.files[index - 1];\n if (previous) props.onFile(previous.path);\n }}\n onNext={() => {\n const next = summary?.files[index + 1];\n if (next) props.onFile(next.path);\n }}\n />\n ) : (\n <Text style={styles.heading}>{path}</Text>\n )}\n {!file ? (\n <View style={styles.content}>\n <Text style={styles.dim}>\n {props.error ? 'The diff could not be loaded. Please try again.' : 'Loading diff…'}\n </Text>\n {props.error && path ? <Action onPress={() => props.onFile(path)}>Retry</Action> : null}\n </View>\n ) : file.binary || file.tooLarge ? (\n <View style={styles.content}>\n <Text style={styles.section}>{file.binary ? 'Binary file' : 'Diff too large to display'}</Text>\n </View>\n ) : (\n <DiffRows\n rows={visibleRows}\n comments={fileComments}\n selection={props.selection}\n onLine={props.onLine}\n gutterDigits={gutterDigits}\n />\n )}\n {fileComments\n .filter((comment) => comment.startLine === undefined)\n .map((comment) => (\n <View key={comment.id} style={styles.inlineComment}>\n <Text style={styles.blue}>Queued file comment</Text>\n <Text style={styles.body}>{comment.body}</Text>\n </View>\n ))}\n <View style={styles.content}>\n <Action onPress={props.onComment}>Comment on file</Action>\n </View>\n </>\n ) : (\n <CommentCards comments={comments} onRemove={props.onRemove} />\n )}\n {props.error ? <Text style={[styles.red, styles.content]}>{props.error}</Text> : null}\n </ScrollView>\n <Footer\n count={comments.length}\n confirmation={screen === 'changes' && activity.changes?.rebase !== undefined}\n discard={screen === 'review'}\n onReview={() => props.onScreen('review')}\n onSend={props.onSend}\n onDiscard={props.onDiscard}\n />\n {screen === 'file' && file && !file.binary && !file.tooLarge ? (\n <View style={styles.disclosure}>\n <Text style={styles.dim} accessibilityLiveRegion=\"polite\">\n {Math.min(current.limit, rows.length)} of {rows.length} diff rows shown\n {props.selection ? ` · ${props.selection.side} line ${props.selection.startLine} selected` : ''}\n </Text>\n {current.limit < rows.length ? (\n <Button\n variant=\"outline\"\n onPress={() => setDisclosure({ ...current, limit: Math.min(rows.length, current.limit + DIFF_ROW_STEP) })}\n >\n Show {Math.min(DIFF_ROW_STEP, rows.length - current.limit)} more rows\n </Button>\n ) : (\n <Text style={styles.dim}>All diff rows shown</Text>\n )}\n </View>\n ) : null}\n </View>\n );\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button, Sheet, SheetBody, SheetContent, SheetHeader, SheetTitle } from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Text } from 'react-native';\n\nimport type { GitDiffRow, GitReviewFileDiff, GitReviewSummary, GitSyncAction } from '../../../../../types/gitReview';\nimport { gitChanges, requestGitSync } from '../_lib/gitChangesStore.native';\nimport { fetchReviewFile, fetchReviewSummary } from '../_lib/gitReviewApi.native';\nimport { selectReviewLine, reviewRangeRows, type GitLineRange } from '../_lib/gitReviewSelection';\nimport { addReviewComment, clearReviewComments, gitReview, removeReviewComment } from '../_lib/gitReviewStore.native';\nimport { conflictPrompt, deliverToAgent, reviewHeading } from '../_lib/gitReviewView';\nimport { GitReviewView, CommentSheet, styles } from './GitReviewView.native';\n\nexport function useGitChanges(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = gitChanges.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => gitChanges.select(gitChanges.store.state, sessionId));\n}\nexport function reviewTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'git-review', label: 'review', panel: GitReviewPanel };\n}\nexport function GitReviewPanel(props: WebPluginSlotProps) {\n return <GitReviewPanelSession key={props.sessionId} {...props} />;\n}\nfunction GitReviewPanelSession({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const activity = useGitChanges(sessionId);\n const subscribe = useCallback((listener: () => void) => {\n const sub = gitReview.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const comments = useSyncExternalStore(subscribe, () => gitReview.select(gitReview.store.state, sessionId).comments);\n const [summary, setSummary] = useState<GitReviewSummary>();\n const [file, setFile] = useState<GitReviewFileDiff>();\n const [error, setError] = useState<string>();\n const [dismissedError, setDismissedError] = useState<string>();\n const [confirm, setConfirm] = useState<'force' | 'abort' | 'discard'>();\n const [screen, setScreen] = useState<'changes' | 'file' | 'review'>('changes');\n const [path, setPath] = useState<string>();\n const [selection, setSelection] = useState<GitLineRange>();\n const [draft, setDraft] = useState<{ path: string; range?: GitLineRange; snippet: string }>();\n const request = useRef<AbortController | undefined>(undefined);\n const fingerprint = JSON.stringify(activity.changes);\n useEffect(() => {\n if (sessionId === null) return undefined;\n const controller = new AbortController();\n void fetchReviewSummary(sessionId, controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) {\n if (result.ok) setSummary(result.summary);\n else setError(result.error);\n }\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n request.current?.abort();\n };\n }, [sessionId, fingerprint]);\n const loadFile = async (path: string) => {\n if (sessionId === null) return;\n setScreen('file');\n setPath(path);\n setSelection(undefined);\n setDraft(undefined);\n request.current?.abort();\n const controller = new AbortController();\n request.current = controller;\n setFile(undefined);\n setError(undefined);\n try {\n const result = await fetchReviewFile(sessionId, path, controller.signal);\n if (!controller.signal.aborted) {\n if (result.ok) setFile(result.diff);\n else setError(result.error);\n }\n } catch (cause) {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n if (sessionId === null) return null;\n const changes = activity.changes;\n const send = (message: string, onSent?: () => void) => {\n const failure = deliverToAgent(sendSessionFrame, sessionId, message);\n setError(failure);\n if (failure === undefined) onSent?.();\n };\n const sync = (action: GitSyncAction) => requestGitSync(sessionId, action);\n const forceRequired =\n activity.error !== dismissedError &&\n activity.errorTarget?.action === 'push' &&\n activity.errorTarget.forceRequired === true;\n const sendReview = () => {\n if (comments.length === 0) return;\n const body = comments\n .map((item) => {\n const anchor =\n item.startLine === undefined\n ? item.relPath\n : item.side === 'old'\n ? `${item.relPath} (removed lines ${item.startLine}-${item.endLine ?? item.startLine})`\n : `${item.relPath}:${item.startLine}-${item.endLine ?? item.startLine}`;\n const quoted = item.snippet\n .split('\\n')\n .slice(0, 20)\n .join('\\n')\n .slice(0, 2000)\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n return `### ${anchor}\\n\\n${quoted}\\n\\n${item.body.trim()}`;\n })\n .join('\\n\\n');\n send(`${reviewHeading(comments.length, summary?.branch, summary?.base)}\\n\\n${body}`, () =>\n clearReviewComments(sessionId),\n );\n };\n const selectLine = (row: GitDiffRow) => {\n if (!file) return;\n const next = selectReviewLine(selection, row);\n setSelection(next.range);\n if (next.complete) {\n const rows = reviewRangeRows(\n file.hunks.flatMap((hunk) => hunk.rows),\n next.range,\n );\n setDraft({ path: file.path, range: next.range, snippet: rows.map((item) => item.content).join('\\n') });\n }\n };\n return (\n <>\n <GitReviewView\n screen={screen}\n activity={{ ...activity, error: activity.error === dismissedError ? undefined : activity.error }}\n summary={summary}\n file={file}\n path={path}\n comments={comments}\n error={error}\n forceRequired={forceRequired}\n selection={selection}\n onScreen={setScreen}\n onFile={(path) => void loadFile(path)}\n onLine={selectLine}\n onSync={sync}\n onForce={() => setConfirm('force')}\n onAbort={() => setConfirm('abort')}\n onResolve={() => send(conflictPrompt(changes?.branch, changes?.rebase?.conflicts ?? []))}\n onDismiss={() => setDismissedError(activity.error)}\n onComment={() => {\n if (path) {\n setSelection(undefined);\n setDraft({ path, snippet: '' });\n }\n }}\n onRemove={(id) => removeReviewComment(sessionId, id)}\n onSend={sendReview}\n onDiscard={() => setConfirm('discard')}\n />\n <Sheet\n open={draft !== undefined}\n onOpenChange={(open) => {\n if (!open) {\n setDraft(undefined);\n setSelection(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetBody>\n <CommentEditor\n key={draft ? 'open' : 'closed'}\n range={draft?.range}\n snippet={draft?.snippet ?? ''}\n onCancel={() => {\n setDraft(undefined);\n setSelection(undefined);\n }}\n onAdd={(comment) => {\n if (!draft || !comment.trim()) return;\n addReviewComment(sessionId, {\n path: draft.path,\n relPath: draft.path,\n body: comment.trim(),\n snippet: draft.snippet,\n ...draft.range,\n });\n setDraft(undefined);\n setSelection(undefined);\n }}\n />\n </SheetBody>\n </SheetContent>\n </Sheet>\n <Sheet\n open={confirm !== undefined}\n onOpenChange={(open) => {\n if (!open) setConfirm(undefined);\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>\n {confirm === 'force'\n ? 'Force push with lease?'\n : confirm === 'abort'\n ? 'Abort rebase?'\n : 'Discard review?'}\n </SheetTitle>\n </SheetHeader>\n <SheetBody>\n <Text style={styles.dim}>\n {confirm === 'force'\n ? 'Git refuses this if the remote holds commits you never fetched and integrated.'\n : confirm === 'abort'\n ? 'Abort discards any conflict resolution in progress.'\n : 'Your queued comments will be removed.'}\n </Text>\n <Button\n variant=\"danger\"\n disabled={confirm !== 'discard' && activity.pending !== undefined}\n onPress={() => {\n if (confirm === 'force') requestGitSync(sessionId, 'push', true);\n else if (confirm === 'abort') sync('abort-rebase');\n else clearReviewComments(sessionId);\n setConfirm(undefined);\n }}\n >\n {confirm === 'force' ? 'Force push with lease' : confirm === 'abort' ? 'Abort rebase' : 'Discard'}\n </Button>\n <Button variant=\"ghost\" onPress={() => setConfirm(undefined)}>\n Cancel\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n </>\n );\n}\n\n// Keep keystrokes local: the diff container only updates when a draft is submitted or closed.\nfunction CommentEditor({\n onAdd,\n ...props\n}: Omit<Parameters<typeof CommentSheet>[0], 'value' | 'onChange' | 'onAdd'> & { onAdd: (body: string) => void }) {\n const [body, setBody] = useState('');\n return <CommentSheet {...props} value={body} onChange={setBody} onAdd={() => onAdd(body)} />;\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button, ChevronRightIcon, FileIcon, fontOf, Spinner } from '@agimon-ai/po-native-components';\nimport { Pressable, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { reviewTab, useGitChanges } from '../../_components/GitReviewPanel.native';\nimport {\n useWorktrees,\n worktreesTab,\n WorktreeRow,\n WorktreeGroup,\n WorktreeStarting,\n} from '../../_components/WorktreesPanel.native';\nimport type { GitChangesSession } from '../../_lib/gitChangesStore.native';\nimport { worktreesPresentation, type WorktreesSession } from '../../_lib/worktreesActivityStore.native';\nexport function GitChangesRow({\n state = 'changes',\n branch = 'Detached HEAD',\n added = 0,\n removed = 0,\n onReview,\n}: {\n state?: 'changes' | 'clean' | 'pushing';\n branch?: string;\n added?: number;\n removed?: number;\n onReview?: () => void;\n}) {\n return (\n <Pressable\n testID=\"activity-diff-changes\"\n accessibilityRole=\"button\"\n accessibilityLabel=\"Open changes review\"\n onPress={onReview}\n style={styles.changeRow}\n >\n <View style={styles.line}>\n <FileIcon size={18} color=\"dim\" />\n <Text style={[styles.heading, styles.grow]}>Changes</Text>\n <ChevronRightIcon size={16} color=\"dim\" />\n </View>\n <View style={styles.changeDetail}>\n <Text style={[styles.branch, styles.grow]}>{branch}</Text>\n {state === 'changes' ? (\n <>\n <Text style={styles.jade}>+{added}</Text>\n <Text style={styles.error}>-{removed}</Text>\n </>\n ) : state === 'pushing' ? (\n <>\n <Spinner label=\"Pushing...\" />\n <Text style={styles.dim}>Pushing...</Text>\n </>\n ) : (\n <Text style={styles.dim}>No changes yet</Text>\n )}\n </View>\n </Pressable>\n );\n}\n\nexport function WorktreesActivityView({\n git,\n state,\n disabled = false,\n onReview,\n onWorktrees,\n}: {\n git: GitChangesSession;\n state: WorktreesSession;\n disabled?: boolean;\n onReview?: () => void;\n onWorktrees?: () => void;\n}) {\n const { starting } = worktreesPresentation(state);\n return (\n <View style={styles.section}>\n {git.changes ? (\n <GitChangesRow\n branch={git.changes.branch ?? 'Detached HEAD'}\n added={git.changes.added}\n removed={git.changes.removed}\n state={\n git.pending?.startsWith('pushing')\n ? 'pushing'\n : git.changes.added === 0 && git.changes.removed === 0 && git.changes.files === 0\n ? 'clean'\n : 'changes'\n }\n onReview={onReview}\n />\n ) : null}\n <WorktreeGroup title=\"Worktrees\" count={`${state.worktrees.length} open${starting ? ' · 1 starting' : ''}`} />\n {state.worktrees.map((item) => (\n <WorktreeRow key={item.id} item={item} compact onOpen={onWorktrees} />\n ))}\n {starting ? (\n <WorktreeStarting branch={state.requestedBranch} />\n ) : state.pending ? (\n <Text style={styles.dim}>{state.pending}</Text>\n ) : null}\n {state.worktrees.length === 0 && !state.pending ? (\n <View style={styles.idle}>\n <Text style={styles.dim}>Idle</Text>\n <Button\n testID=\"activity-git-create\"\n variant=\"ghost\"\n style={styles.link}\n disabled={disabled}\n onPress={onWorktrees}\n >\n <Text style={styles.jade}>Create a worktree →</Text>\n </Button>\n </View>\n ) : null}\n </View>\n );\n}\nexport function WorktreesActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const git = useGitChanges(sessionId);\n const state = useWorktrees(sessionId);\n return (\n <WorktreesActivityView\n git={git}\n state={{ ...state, worktrees: state.worktrees.filter((item) => item.sessionId !== sessionId) }}\n disabled={sessionId === null}\n onReview={() => openTransientTab(reviewTab())}\n onWorktrees={() => openTransientTab(worktreesTab())}\n />\n );\n}\nconst styles = StyleSheet.create((theme) => ({\n section: { gap: theme.spacing(2) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n dim: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.dim,\n },\n branch: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.lg,\n color: theme.colors.hi,\n },\n line: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minHeight: 44 },\n grow: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n jade: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n color: theme.colors.green,\n fontWeight: '500',\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.red,\n },\n changeRow: {\n gap: theme.spacing(1),\n paddingVertical: theme.spacing(2),\n borderBottomWidth: StyleSheet.hairlineWidth,\n borderColor: theme.colors['border-soft'],\n },\n changeDetail: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(3),\n paddingLeft: theme.spacing(6),\n minHeight: 28,\n },\n idle: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(4) },\n link: { minHeight: 44, paddingHorizontal: 0 },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { WorktreesActivitySection } from './_components/WorktreesActivitySection.native';\nexport default defineFill({ component: WorktreesActivitySection });\n","import { defineWebLifecycle } from '@agimon-ai/po-core/native';\n\nimport { startGitChangesRuntime } from '../_lib/gitChangesStore.native';\nimport { startWorktreeRuntime } from '../_lib/worktreesActivityStore.native';\nexport default defineWebLifecycle((runtime) => {\n const stopWorktrees = startWorktreeRuntime(runtime);\n const stopChanges = startGitChangesRuntime(runtime);\n return () => {\n stopChanges();\n stopWorktrees();\n };\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillGitNewSession from '../src/extensions/workspaces/(frontend)/fill/GitNewSession.new-session.native';\nimport activityGroupGit from '../src/extensions/workspaces/sessions/(frontend)/activity-group/git.native';\nimport channelGitChanges from '../src/extensions/workspaces/sessions/(frontend)/channel/git-changes.native';\nimport channelGitWorktrees from '../src/extensions/workspaces/sessions/(frontend)/channel/git-worktrees.native';\nimport fillWorktrees from '../src/extensions/workspaces/sessions/(frontend)/fill/Worktrees.activity.git.native';\nimport lifecycleStart from '../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'git',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'new-session', id: 'git-new-session' }, fillGitNewSession)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'git' }, activityGroupGit)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'git_changes' }, channelGitChanges), via({ channel: 'git_worktrees' }, channelGitWorktrees)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.git', id: 'worktrees' }, fillWorktrees)]; },\n get start(): WebPluginContributions['start'] { return lifecycleStart; },\n },\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-git",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.37",
|
|
4
4
|
"description": "Git worktree sessions for Po: spawn an isolated worktree with its own session and manage it from the parent",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -65,10 +65,10 @@
|
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
69
|
-
"@agimon-ai/po-session": "0.0.0-alpha.
|
|
70
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
71
|
-
"@agimon-ai/po-web-security": "0.0.0-alpha.
|
|
68
|
+
"@agimon-ai/po-core": "0.0.0-alpha.37",
|
|
69
|
+
"@agimon-ai/po-session": "0.0.0-alpha.37",
|
|
70
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.37",
|
|
71
|
+
"@agimon-ai/po-web-security": "0.0.0-alpha.37",
|
|
72
72
|
"@deepseek-ai/cordis": "4.0.5",
|
|
73
73
|
"@tanstack/react-store": "0.11.2",
|
|
74
74
|
"@tanstack/store": "0.11.2",
|
|
@@ -76,9 +76,9 @@
|
|
|
76
76
|
"typebox": "1.3.37"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
80
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
81
|
-
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.
|
|
79
|
+
"@agimon-ai/po-build": "0.0.0-alpha.37",
|
|
80
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.37",
|
|
81
|
+
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.37",
|
|
82
82
|
"@babel/core": "7.29.7",
|
|
83
83
|
"@earendil-works/pi-agent-core": "1.3.0",
|
|
84
84
|
"@earendil-works/pi-coding-agent": "1.3.0",
|