@agimon-ai/po-edit 0.0.0-alpha.29 → 0.0.0-alpha.30
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineNativePlugin, defineToolRenderer } from "@agimon-ai/po-core/native";
|
|
2
2
|
import { View } from "react-native-unistyles/components/native/View";
|
|
3
3
|
import { Text } from "react-native-unistyles/components/native/Text";
|
|
4
|
-
import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SyntaxLine, ToolPathLink,
|
|
4
|
+
import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SyntaxLine, ToolPathLink, fontOf, toolTone, useSyntaxLines } from "@agimon-ai/po-native-components";
|
|
5
5
|
import { StyleSheet } from "react-native-unistyles";
|
|
6
6
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
//#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts
|
|
@@ -59,8 +59,6 @@ function resultTextLines(result, output) {
|
|
|
59
59
|
}
|
|
60
60
|
//#endregion
|
|
61
61
|
//#region src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.native.tsx
|
|
62
|
-
/** Diff rows shown until the item expands, as the web card. */
|
|
63
|
-
const COLLAPSED_ROWS = 24;
|
|
64
62
|
/**
|
|
65
63
|
* The banded rows and the grammar over them, as the web's DiffRows: parsed as
|
|
66
64
|
* one document, so a replaced line is seen twice and may colour oddly, and the
|
|
@@ -106,7 +104,7 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
106
104
|
running,
|
|
107
105
|
isError
|
|
108
106
|
}),
|
|
109
|
-
expandable:
|
|
107
|
+
expandable: true,
|
|
110
108
|
children: ({ expanded }) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MessageItemHeader, {
|
|
111
109
|
title: "edit",
|
|
112
110
|
children: /* @__PURE__ */ jsxs(View, {
|
|
@@ -121,7 +119,7 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
121
119
|
children: ["· ", call.ranges]
|
|
122
120
|
})]
|
|
123
121
|
})
|
|
124
|
-
}), isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
|
|
122
|
+
}), !expanded ? null : isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
|
|
125
123
|
testID: "tool-result-edit",
|
|
126
124
|
children: [/* @__PURE__ */ jsx(MessageItemStatus, {
|
|
127
125
|
tone: "error",
|
|
@@ -137,20 +135,14 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
137
135
|
tone: "running",
|
|
138
136
|
children: "running"
|
|
139
137
|
})
|
|
140
|
-
}) : null : (
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}), hidden > 0 ? /* @__PURE__ */ jsxs(MessageItemStatus, {
|
|
149
|
-
expands: true,
|
|
150
|
-
children: [hidden, " more rows"]
|
|
151
|
-
}) : null]
|
|
152
|
-
});
|
|
153
|
-
})()] })
|
|
138
|
+
}) : null : /* @__PURE__ */ jsx(MessageItemBody, {
|
|
139
|
+
testID: "tool-result-edit",
|
|
140
|
+
children: /* @__PURE__ */ jsx(DiffRows, {
|
|
141
|
+
rows: view.rows,
|
|
142
|
+
gutter: view.gutter,
|
|
143
|
+
path: call.path
|
|
144
|
+
})
|
|
145
|
+
})] })
|
|
154
146
|
});
|
|
155
147
|
}
|
|
156
148
|
const styles = StyleSheet.create((theme) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["ToolMessageRenderProps","collapseLines","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","SyntaxLine","ToolPathLink","toolTone","useSyntaxLines","PoNativeTheme","StyleSheet","DiffMarker","DiffRow","editCallView","editResultView","resultTextLines","COLLAPSED_ROWS","DiffRows","rows","gutter","path","spans","map","row","content","join","index","String","lineNumber","styles","marker","mono","padStart","ink","EditToolMessage","args","result","output","running","isError","fileTabFor","openTransientTab","call","view","undefined","tab","length","expanded","summary","onOpen","detail","ranges","line","error","shown","hidden","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","flexShrink","color","colors","faint","fontFamily","sans","fontSize","base","lineHeight","red","backgroundColor","sm","lineHeightRelaxed","green","dim","toolEdit"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/edit.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/po-core/web';\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst CONTEXT_MARKER = ' ';\n\nexport type DiffMarker = '+' | '-' | typeof CONTEXT_MARKER;\n\nexport interface DiffRow {\n readonly marker: DiffMarker;\n readonly lineNumber: string;\n readonly content: string;\n}\n\nexport interface EditCallView {\n readonly path: string;\n /** `N range` or `N ranges`, the count the TUI's call heading shows. */\n readonly ranges: string;\n}\n\nexport interface EditResultView {\n readonly rows: readonly DiffRow[];\n /** Widest line number among the rows, in characters, sizing the gutter. */\n readonly gutter: number;\n}\n\n/** What the edit call heading shows: the path and how many ranges the call touches. */\nexport function editCallView(args: Readonly<Record<string, unknown>>): EditCallView {\n const count = Array.isArray(args.edits) ? args.edits.length : 0;\n return {\n path: typeof args.path === 'string' ? args.path : '',\n ranges: `${count} ${count === 1 ? 'range' : 'ranges'}`,\n };\n}\n\nfunction toDiffMarker(value: string | undefined): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\n/** Pi's display diff as rows; a line that is not a diff row reads as unnumbered context. */\nexport function parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', ' ');\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]), lineNumber: (match[2] ?? '').trim(), content: match[3] ?? '' };\n });\n}\n\n/** The diff a successful edit carries in its details; undefined when the details never arrived. */\nexport function editResultView(result: ToolResultView | null): EditResultView | undefined {\n const details = result?.details;\n if (typeof details !== 'object' || details === null) return undefined;\n const diff = (details as { diff?: unknown }).diff;\n if (typeof diff !== 'string' || diff.length === 0) return undefined;\n const rows = parseDiffRows(diff);\n return { rows, gutter: rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1) };\n}\n\n/** The result's text lines, for the error case where the diff never happened. */\nexport function resultTextLines(result: ToolResultView | null, output: string): string[] {\n const text =\n result === null\n ? output\n : result.content\n .flatMap((block) => {\n const record =\n typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n collapseLines,\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { type DiffMarker, type DiffRow, editCallView, editResultView, resultTextLines } from '../_lib/editToolView';\n\n/** Diff rows shown until the item expands, as the web card. */\nconst COLLAPSED_ROWS = 24;\n\n/**\n * The banded rows and the grammar over them, as the web's DiffRows: parsed as\n * one document, so a replaced line is seen twice and may colour oddly, and the\n * `+`/`-` wash stays underneath so what changed is still legible.\n */\nfunction DiffRows({ rows, gutter, path }: { rows: readonly DiffRow[]; gutter: number; path: string }) {\n const spans = useSyntaxLines(rows.map((row) => row.content).join('\\n'), { path });\n return (\n <View>\n {rows.map((row, index) => (\n <View key={`${String(index)}-${row.lineNumber}`} style={styles.row(row.marker)}>\n <Text style={[styles.mono, styles.gutter]}>{row.lineNumber.padStart(gutter)}</Text>\n <Text style={[styles.mono, styles.ink(row.marker)]}>{row.marker}</Text>\n <SyntaxLine\n selectable\n spans={spans?.[index]}\n text={row.content}\n style={[styles.mono, styles.content, styles.ink(row.marker)]}\n />\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * The edit tool's timeline item on native, as the web's EditToolMessage:\n * `path · N ranges` in the header, the display diff banded by row in the body,\n * and the tool's message in red when the edit failed.\n */\nexport function EditToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const call = editCallView(args);\n const view = result === null || isError ? undefined : editResultView(result);\n const tab = fileTabFor(call.path);\n return (\n <MessageItem\n tone={toolTone({ running, isError })}\n expandable={view !== undefined && view.rows.length > COLLAPSED_ROWS}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"edit\">\n <View testID=\"tool-call-edit\" style={styles.summary}>\n <ToolPathLink path={call.path} {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })} />\n <Text numberOfLines={1} style={styles.detail}>\n · {call.ranges}\n </Text>\n </View>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody testID=\"tool-result-edit\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n {resultTextLines(result, output).map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={styles.error}>\n {line}\n </Text>\n ))}\n </MessageItemBody>\n ) : view === undefined ? (\n running ? (\n <MessageItemBody testID=\"tool-result-edit\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n (() => {\n const { shown, hidden } = collapseLines(view.rows, COLLAPSED_ROWS, expanded);\n return (\n <MessageItemBody testID=\"tool-result-edit\">\n <DiffRows rows={shown} gutter={view.gutter} path={call.path} />\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more rows</MessageItemStatus> : null}\n </MessageItemBody>\n );\n })()\n )}\n </>\n )}\n </MessageItem>\n );\n}\n\n// Po carries a diff on the background the way Magit does: a green wash on\n// added rows, a red wash on removed ones, and the foreground left to the text.\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n detail: {\n flexShrink: 0,\n color: theme.colors.faint,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n error: {\n color: theme.colors.red,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n row: (marker: DiffMarker) => ({\n flexDirection: 'row',\n gap: theme.spacing(2),\n backgroundColor:\n marker === '+' ? theme.colors['tint-green'] : marker === '-' ? theme.colors['tint-red'] : undefined,\n }),\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n gutter: { color: theme.colors.faint },\n ink: (marker: DiffMarker) => ({\n color: marker === '+' ? theme.colors.green : marker === '-' ? theme.colors.red : theme.colors.dim,\n }),\n content: { flex: 1, minWidth: 0 },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { EditToolMessage } from './_components/EditToolMessage.native';\n\nexport default defineToolRenderer({ message: EditToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport toolEdit from '../src/extensions/workspaces/sessions/(frontend)/tool/edit.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: 'edit',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['edit'] }, toolEdit)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["ToolMessageRenderProps","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","SyntaxLine","ToolPathLink","toolTone","useSyntaxLines","PoNativeTheme","StyleSheet","DiffMarker","DiffRow","editCallView","editResultView","resultTextLines","DiffRows","rows","gutter","path","spans","map","row","content","join","index","String","lineNumber","styles","marker","mono","padStart","ink","EditToolMessage","args","result","output","running","isError","fileTabFor","openTransientTab","call","view","undefined","tab","expanded","summary","onOpen","detail","ranges","line","error","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","flexShrink","color","colors","faint","fontFamily","sans","fontSize","base","lineHeight","red","backgroundColor","sm","lineHeightRelaxed","green","dim","toolEdit"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/edit.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/po-core/web';\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst CONTEXT_MARKER = ' ';\n\nexport type DiffMarker = '+' | '-' | typeof CONTEXT_MARKER;\n\nexport interface DiffRow {\n readonly marker: DiffMarker;\n readonly lineNumber: string;\n readonly content: string;\n}\n\nexport interface EditCallView {\n readonly path: string;\n /** `N range` or `N ranges`, the count the TUI's call heading shows. */\n readonly ranges: string;\n}\n\nexport interface EditResultView {\n readonly rows: readonly DiffRow[];\n /** Widest line number among the rows, in characters, sizing the gutter. */\n readonly gutter: number;\n}\n\n/** What the edit call heading shows: the path and how many ranges the call touches. */\nexport function editCallView(args: Readonly<Record<string, unknown>>): EditCallView {\n const count = Array.isArray(args.edits) ? args.edits.length : 0;\n return {\n path: typeof args.path === 'string' ? args.path : '',\n ranges: `${count} ${count === 1 ? 'range' : 'ranges'}`,\n };\n}\n\nfunction toDiffMarker(value: string | undefined): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\n/** Pi's display diff as rows; a line that is not a diff row reads as unnumbered context. */\nexport function parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', ' ');\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]), lineNumber: (match[2] ?? '').trim(), content: match[3] ?? '' };\n });\n}\n\n/** The diff a successful edit carries in its details; undefined when the details never arrived. */\nexport function editResultView(result: ToolResultView | null): EditResultView | undefined {\n const details = result?.details;\n if (typeof details !== 'object' || details === null) return undefined;\n const diff = (details as { diff?: unknown }).diff;\n if (typeof diff !== 'string' || diff.length === 0) return undefined;\n const rows = parseDiffRows(diff);\n return { rows, gutter: rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1) };\n}\n\n/** The result's text lines, for the error case where the diff never happened. */\nexport function resultTextLines(result: ToolResultView | null, output: string): string[] {\n const text =\n result === null\n ? output\n : result.content\n .flatMap((block) => {\n const record =\n typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { type DiffMarker, type DiffRow, editCallView, editResultView, resultTextLines } from '../_lib/editToolView';\n\n/**\n * The banded rows and the grammar over them, as the web's DiffRows: parsed as\n * one document, so a replaced line is seen twice and may colour oddly, and the\n * `+`/`-` wash stays underneath so what changed is still legible.\n */\nfunction DiffRows({ rows, gutter, path }: { rows: readonly DiffRow[]; gutter: number; path: string }) {\n const spans = useSyntaxLines(rows.map((row) => row.content).join('\\n'), { path });\n return (\n <View>\n {rows.map((row, index) => (\n <View key={`${String(index)}-${row.lineNumber}`} style={styles.row(row.marker)}>\n <Text style={[styles.mono, styles.gutter]}>{row.lineNumber.padStart(gutter)}</Text>\n <Text style={[styles.mono, styles.ink(row.marker)]}>{row.marker}</Text>\n <SyntaxLine\n selectable\n spans={spans?.[index]}\n text={row.content}\n style={[styles.mono, styles.content, styles.ink(row.marker)]}\n />\n </View>\n ))}\n </View>\n );\n}\n\n/**\n * The edit tool's timeline item on native, as the web's EditToolMessage:\n * `path · N ranges` in the header, the display diff banded by row in the body,\n * and the tool's message in red when the edit failed.\n */\nexport function EditToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const call = editCallView(args);\n const view = result === null || isError ? undefined : editResultView(result);\n const tab = fileTabFor(call.path);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable>\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"edit\">\n <View testID=\"tool-call-edit\" style={styles.summary}>\n <ToolPathLink path={call.path} {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })} />\n <Text numberOfLines={1} style={styles.detail}>\n · {call.ranges}\n </Text>\n </View>\n </MessageItemHeader>\n {!expanded ? null : isError ? (\n <MessageItemBody testID=\"tool-result-edit\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n {resultTextLines(result, output).map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={styles.error}>\n {line}\n </Text>\n ))}\n </MessageItemBody>\n ) : view === undefined ? (\n running ? (\n <MessageItemBody testID=\"tool-result-edit\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n <MessageItemBody testID=\"tool-result-edit\">\n <DiffRows rows={view.rows} gutter={view.gutter} path={call.path} />\n </MessageItemBody>\n )}\n </>\n )}\n </MessageItem>\n );\n}\n\n// Po carries a diff on the background the way Magit does: a green wash on\n// added rows, a red wash on removed ones, and the foreground left to the text.\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n detail: {\n flexShrink: 0,\n color: theme.colors.faint,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n error: {\n color: theme.colors.red,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n row: (marker: DiffMarker) => ({\n flexDirection: 'row',\n gap: theme.spacing(2),\n backgroundColor:\n marker === '+' ? theme.colors['tint-green'] : marker === '-' ? theme.colors['tint-red'] : undefined,\n }),\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n },\n gutter: { color: theme.colors.faint },\n ink: (marker: DiffMarker) => ({\n color: marker === '+' ? theme.colors.green : marker === '-' ? theme.colors.red : theme.colors.dim,\n }),\n content: { flex: 1, minWidth: 0 },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { EditToolMessage } from './_components/EditToolMessage.native';\n\nexport default defineToolRenderer({ message: EditToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport toolEdit from '../src/extensions/workspaces/sessions/(frontend)/tool/edit.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: 'edit',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['edit'] }, toolEdit)]; },\n },\n});\n"],"mappings":"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"}
|
package/dist/extensions/web.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineToolRenderer, defineWebPlugin } from "@agimon-ai/po-core/web";
|
|
2
|
-
import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SyntaxLine, ToolPathLink,
|
|
2
|
+
import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SyntaxLine, ToolPathLink, toolTone, useSyntaxLines } from "@agimon-ai/po-web-components";
|
|
3
3
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
//#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts
|
|
5
5
|
/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */
|
|
@@ -56,8 +56,6 @@ function resultTextLines(result, output) {
|
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.tsx
|
|
59
|
-
/** Diff rows shown until the item expands; about what the old scroll box held. */
|
|
60
|
-
const COLLAPSED_ROWS = 24;
|
|
61
59
|
const ROW_TONE = {
|
|
62
60
|
"+": "bg-po-tint-green text-po-green",
|
|
63
61
|
"-": "bg-po-tint-red text-po-red",
|
|
@@ -110,7 +108,7 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
110
108
|
running,
|
|
111
109
|
isError
|
|
112
110
|
}),
|
|
113
|
-
expandable:
|
|
111
|
+
expandable: true,
|
|
114
112
|
children: ({ expanded }) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MessageItemHeader, {
|
|
115
113
|
title: "edit",
|
|
116
114
|
children: /* @__PURE__ */ jsxs("span", {
|
|
@@ -124,7 +122,7 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
124
122
|
children: ["· ", call.ranges]
|
|
125
123
|
})]
|
|
126
124
|
})
|
|
127
|
-
}), isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
|
|
125
|
+
}), !expanded ? null : isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
|
|
128
126
|
"data-testid": "tool-result-edit",
|
|
129
127
|
className: "flex flex-col",
|
|
130
128
|
children: [/* @__PURE__ */ jsx(MessageItemStatus, {
|
|
@@ -140,22 +138,15 @@ function EditToolMessage({ args, result, output, running, isError, fileTabFor, o
|
|
|
140
138
|
tone: "running",
|
|
141
139
|
children: "running"
|
|
142
140
|
})
|
|
143
|
-
}) : null : (
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}), hidden > 0 ? /* @__PURE__ */ jsxs(MessageItemStatus, {
|
|
153
|
-
expands: true,
|
|
154
|
-
className: "pt-1",
|
|
155
|
-
children: [hidden, " more rows"]
|
|
156
|
-
}) : null]
|
|
157
|
-
});
|
|
158
|
-
})()] })
|
|
141
|
+
}) : null : /* @__PURE__ */ jsx(MessageItemBody, {
|
|
142
|
+
"data-testid": "tool-result-edit",
|
|
143
|
+
className: "flex flex-col font-mono",
|
|
144
|
+
children: /* @__PURE__ */ jsx(DiffRows, {
|
|
145
|
+
rows: view.rows,
|
|
146
|
+
gutter: view.gutter,
|
|
147
|
+
path: call.path
|
|
148
|
+
})
|
|
149
|
+
})] })
|
|
159
150
|
});
|
|
160
151
|
}
|
|
161
152
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.mjs","names":["toolEdit"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/edit.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/po-core/web';\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst CONTEXT_MARKER = ' ';\n\nexport type DiffMarker = '+' | '-' | typeof CONTEXT_MARKER;\n\nexport interface DiffRow {\n readonly marker: DiffMarker;\n readonly lineNumber: string;\n readonly content: string;\n}\n\nexport interface EditCallView {\n readonly path: string;\n /** `N range` or `N ranges`, the count the TUI's call heading shows. */\n readonly ranges: string;\n}\n\nexport interface EditResultView {\n readonly rows: readonly DiffRow[];\n /** Widest line number among the rows, in characters, sizing the gutter. */\n readonly gutter: number;\n}\n\n/** What the edit call heading shows: the path and how many ranges the call touches. */\nexport function editCallView(args: Readonly<Record<string, unknown>>): EditCallView {\n const count = Array.isArray(args.edits) ? args.edits.length : 0;\n return {\n path: typeof args.path === 'string' ? args.path : '',\n ranges: `${count} ${count === 1 ? 'range' : 'ranges'}`,\n };\n}\n\nfunction toDiffMarker(value: string | undefined): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\n/** Pi's display diff as rows; a line that is not a diff row reads as unnumbered context. */\nexport function parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', ' ');\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]), lineNumber: (match[2] ?? '').trim(), content: match[3] ?? '' };\n });\n}\n\n/** The diff a successful edit carries in its details; undefined when the details never arrived. */\nexport function editResultView(result: ToolResultView | null): EditResultView | undefined {\n const details = result?.details;\n if (typeof details !== 'object' || details === null) return undefined;\n const diff = (details as { diff?: unknown }).diff;\n if (typeof diff !== 'string' || diff.length === 0) return undefined;\n const rows = parseDiffRows(diff);\n return { rows, gutter: rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1) };\n}\n\n/** The result's text lines, for the error case where the diff never happened. */\nexport function resultTextLines(result: ToolResultView | null, output: string): string[] {\n const text =\n result === null\n ? output\n : result.content\n .flatMap((block) => {\n const record =\n typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/po-web-components';\n\nimport { type DiffRow, editCallView, editResultView, resultTextLines } from '../_lib/editToolView';\n\n/** Diff rows shown until the item expands; about what the old scroll box held. */\nconst COLLAPSED_ROWS = 24;\n\n// Po carries a diff on the background the way Magit does: a green wash on\n// added rows, a red wash on removed ones, and the foreground left to the text.\nconst ROW_TONE: Readonly<Record<DiffRow['marker'], string>> = {\n '+': 'bg-po-tint-green text-po-green',\n '-': 'bg-po-tint-red text-po-red',\n ' ': 'text-po-dim',\n};\n\n/**\n * The banded rows, and the grammar over them.\n *\n * Its own component because the colours come from a hook, and the body that\n * renders these rows is chosen inside a render prop. The rows are parsed as\n * one document: a diff is not a file, so a replaced line is seen twice and a\n * split string can colour oddly, which costs a token here and there and never\n * costs the reader the text. The `+` and `-` wash stays underneath, so what\n * changed is still legible when the grammar has coloured the foreground.\n */\nfunction DiffRows({ rows, gutter, path }: { rows: readonly DiffRow[]; gutter: number; path: string }) {\n const spans = useSyntaxLines(rows.map((row) => row.content).join('\\n'), { path });\n return (\n <>\n {rows.map((row, index) => (\n <span key={`${String(index)}-${row.lineNumber}`} className={`flex gap-2 ${ROW_TONE[row.marker]}`}>\n <span className=\"shrink-0 text-right text-po-faint\" style={{ width: `${String(gutter)}ch` }}>\n {row.lineNumber}\n </span>\n <span className=\"w-2 shrink-0\">{row.marker === ' ' ? '' : row.marker}</span>\n <SyntaxLine spans={spans?.[index]} text={row.content} className=\"min-w-0 whitespace-pre-wrap break-words\" />\n </span>\n ))}\n </>\n );\n}\n\n/**\n * The edit tool's timeline item: `path · N ranges` in the header; the display\n * diff from the result's details, banded by row, in the body. A successful\n * edit whose details never arrived shows nothing, and a failed one shows the\n * tool's message in red.\n */\nexport function EditToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const call = editCallView(args);\n const view = result === null || isError ? undefined : editResultView(result);\n // The file this edit lands in, opened from the header rather than found\n // again in a file list; plain text when nothing installed can show it.\n const tab = fileTabFor(call.path);\n return (\n <MessageItem\n tone={toolTone({ running, isError })}\n expandable={view !== undefined && view.rows.length > COLLAPSED_ROWS}\n >\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"edit\">\n <span data-testid=\"tool-call-edit\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ToolPathLink path={call.path} {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })} />\n <span className=\"shrink-0 text-po-faint\">· {call.ranges}</span>\n </span>\n </MessageItemHeader>\n {isError ? (\n <MessageItemBody data-testid=\"tool-result-edit\" className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n {resultTextLines(result, output).map((line, index) => (\n <span key={`${String(index)}-${line}`} className=\"whitespace-pre-wrap break-words text-po-red\">\n {line}\n </span>\n ))}\n </MessageItemBody>\n ) : view === undefined ? (\n running ? (\n <MessageItemBody data-testid=\"tool-result-edit\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n (() => {\n const { shown, hidden } = collapseLines(view.rows, COLLAPSED_ROWS, expanded);\n return (\n <MessageItemBody data-testid=\"tool-result-edit\" className=\"flex flex-col font-mono\">\n <DiffRows rows={shown} gutter={view.gutter} path={call.path} />\n {hidden > 0 ? (\n <MessageItemStatus expands className=\"pt-1\">\n {hidden} more rows\n </MessageItemStatus>\n ) : null}\n </MessageItemBody>\n );\n })()\n )}\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport { EditToolMessage } from './_components/EditToolMessage';\n\nexport default defineToolRenderer({ message: EditToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport toolEdit from '../src/extensions/workspaces/sessions/(frontend)/tool/edit.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'edit',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['edit'] }, toolEdit)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web.mjs","names":["toolEdit"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/editToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/EditToolMessage.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/edit.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { ToolResultView } from '@agimon-ai/po-core/web';\n\n/** Pi emits `+12 text`, `-12 text`, ` 12 text`, and a blank-numbered ` ... ` elision between hunks. */\nconst DIFF_ROW_PATTERN = /^([+\\- ])( *\\d*) (.*)$/u;\nconst CONTEXT_MARKER = ' ';\n\nexport type DiffMarker = '+' | '-' | typeof CONTEXT_MARKER;\n\nexport interface DiffRow {\n readonly marker: DiffMarker;\n readonly lineNumber: string;\n readonly content: string;\n}\n\nexport interface EditCallView {\n readonly path: string;\n /** `N range` or `N ranges`, the count the TUI's call heading shows. */\n readonly ranges: string;\n}\n\nexport interface EditResultView {\n readonly rows: readonly DiffRow[];\n /** Widest line number among the rows, in characters, sizing the gutter. */\n readonly gutter: number;\n}\n\n/** What the edit call heading shows: the path and how many ranges the call touches. */\nexport function editCallView(args: Readonly<Record<string, unknown>>): EditCallView {\n const count = Array.isArray(args.edits) ? args.edits.length : 0;\n return {\n path: typeof args.path === 'string' ? args.path : '',\n ranges: `${count} ${count === 1 ? 'range' : 'ranges'}`,\n };\n}\n\nfunction toDiffMarker(value: string | undefined): DiffMarker {\n return value === '+' || value === '-' ? value : CONTEXT_MARKER;\n}\n\n/** Pi's display diff as rows; a line that is not a diff row reads as unnumbered context. */\nexport function parseDiffRows(diff: string): DiffRow[] {\n return diff.split('\\n').map((line) => {\n const expanded = line.replaceAll('\\t', ' ');\n const match = DIFF_ROW_PATTERN.exec(expanded);\n if (!match) return { marker: CONTEXT_MARKER, lineNumber: '', content: expanded };\n return { marker: toDiffMarker(match[1]), lineNumber: (match[2] ?? '').trim(), content: match[3] ?? '' };\n });\n}\n\n/** The diff a successful edit carries in its details; undefined when the details never arrived. */\nexport function editResultView(result: ToolResultView | null): EditResultView | undefined {\n const details = result?.details;\n if (typeof details !== 'object' || details === null) return undefined;\n const diff = (details as { diff?: unknown }).diff;\n if (typeof diff !== 'string' || diff.length === 0) return undefined;\n const rows = parseDiffRows(diff);\n return { rows, gutter: rows.reduce((widest, row) => Math.max(widest, row.lineNumber.length), 1) };\n}\n\n/** The result's text lines, for the error case where the diff never happened. */\nexport function resultTextLines(result: ToolResultView | null, output: string): string[] {\n const text =\n result === null\n ? output\n : result.content\n .flatMap((block) => {\n const record =\n typeof block === 'object' && block !== null ? (block as { type?: unknown; text?: unknown }) : {};\n return record.type === 'text' && typeof record.text === 'string' ? [record.text] : [];\n })\n .join('\\n');\n const lines = text.replaceAll('\\t', ' ').replaceAll('\\r\\n', '\\n').split('\\n');\n while (lines.at(-1) === '') lines.pop();\n return lines;\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SyntaxLine,\n ToolPathLink,\n toolTone,\n useSyntaxLines,\n} from '@agimon-ai/po-web-components';\n\nimport { type DiffRow, editCallView, editResultView, resultTextLines } from '../_lib/editToolView';\n\n// Po carries a diff on the background the way Magit does: a green wash on\n// added rows, a red wash on removed ones, and the foreground left to the text.\nconst ROW_TONE: Readonly<Record<DiffRow['marker'], string>> = {\n '+': 'bg-po-tint-green text-po-green',\n '-': 'bg-po-tint-red text-po-red',\n ' ': 'text-po-dim',\n};\n\n/**\n * The banded rows, and the grammar over them.\n *\n * Its own component because the colours come from a hook, and the body that\n * renders these rows is chosen inside a render prop. The rows are parsed as\n * one document: a diff is not a file, so a replaced line is seen twice and a\n * split string can colour oddly, which costs a token here and there and never\n * costs the reader the text. The `+` and `-` wash stays underneath, so what\n * changed is still legible when the grammar has coloured the foreground.\n */\nfunction DiffRows({ rows, gutter, path }: { rows: readonly DiffRow[]; gutter: number; path: string }) {\n const spans = useSyntaxLines(rows.map((row) => row.content).join('\\n'), { path });\n return (\n <>\n {rows.map((row, index) => (\n <span key={`${String(index)}-${row.lineNumber}`} className={`flex gap-2 ${ROW_TONE[row.marker]}`}>\n <span className=\"shrink-0 text-right text-po-faint\" style={{ width: `${String(gutter)}ch` }}>\n {row.lineNumber}\n </span>\n <span className=\"w-2 shrink-0\">{row.marker === ' ' ? '' : row.marker}</span>\n <SyntaxLine spans={spans?.[index]} text={row.content} className=\"min-w-0 whitespace-pre-wrap break-words\" />\n </span>\n ))}\n </>\n );\n}\n\n/**\n * The edit tool's timeline item: `path · N ranges` in the header; the display\n * diff from the result's details, banded by row, in the body. A successful\n * edit whose details never arrived shows nothing, and a failed one shows the\n * tool's message in red.\n */\nexport function EditToolMessage({\n args,\n result,\n output,\n running,\n isError,\n fileTabFor,\n openTransientTab,\n}: ToolMessageRenderProps) {\n const call = editCallView(args);\n const view = result === null || isError ? undefined : editResultView(result);\n // The file this edit lands in, opened from the header rather than found\n // again in a file list; plain text when nothing installed can show it.\n const tab = fileTabFor(call.path);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable>\n {({ expanded }) => (\n <>\n <MessageItemHeader title=\"edit\">\n <span data-testid=\"tool-call-edit\" className=\"flex min-w-0 flex-1 items-center gap-2\">\n <ToolPathLink path={call.path} {...(tab === undefined ? {} : { onOpen: () => openTransientTab(tab) })} />\n <span className=\"shrink-0 text-po-faint\">· {call.ranges}</span>\n </span>\n </MessageItemHeader>\n {!expanded ? null : isError ? (\n <MessageItemBody data-testid=\"tool-result-edit\" className=\"flex flex-col\">\n <MessageItemStatus tone=\"error\">failed</MessageItemStatus>\n {resultTextLines(result, output).map((line, index) => (\n <span key={`${String(index)}-${line}`} className=\"whitespace-pre-wrap break-words text-po-red\">\n {line}\n </span>\n ))}\n </MessageItemBody>\n ) : view === undefined ? (\n running ? (\n <MessageItemBody data-testid=\"tool-result-edit\">\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null\n ) : (\n <MessageItemBody data-testid=\"tool-result-edit\" className=\"flex flex-col font-mono\">\n <DiffRows rows={view.rows} gutter={view.gutter} path={call.path} />\n </MessageItemBody>\n )}\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport { EditToolMessage } from './_components/EditToolMessage';\n\nexport default defineToolRenderer({ message: EditToolMessage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport toolEdit from '../src/extensions/workspaces/sessions/(frontend)/tool/edit.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'edit',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['edit'] }, toolEdit)]; },\n },\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-edit",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.30",
|
|
4
4
|
"description": "Snapshot-bound hashline edit tool for Pi and Po.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -59,16 +59,16 @@
|
|
|
59
59
|
"access": "public"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
63
|
-
"@agimon-ai/po-hashline": "0.0.0-alpha.
|
|
64
|
-
"@agimon-ai/po-ui": "0.0.0-alpha.
|
|
65
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
62
|
+
"@agimon-ai/po-core": "0.0.0-alpha.30",
|
|
63
|
+
"@agimon-ai/po-hashline": "0.0.0-alpha.30",
|
|
64
|
+
"@agimon-ai/po-ui": "0.0.0-alpha.30",
|
|
65
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.30",
|
|
66
66
|
"@deepseek-ai/cordis": "4.0.5",
|
|
67
67
|
"typebox": "1.3.37"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
71
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
70
|
+
"@agimon-ai/po-build": "0.0.0-alpha.30",
|
|
71
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.30",
|
|
72
72
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
73
73
|
"@tanstack/react-store": "0.11.2",
|
|
74
74
|
"@tanstack/store": "0.11.2",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"vitest": "5.0.4"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
87
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.30",
|
|
88
88
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
89
89
|
"react-native": "0.86.3",
|
|
90
90
|
"react-native-unistyles": "^3.5.3"
|