@rexvane/piweb 0.3.18 → 0.3.19
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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +8 -6
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +4 -4
- package/.next/react-loadable-manifest.json +23 -9
- package/.next/required-server-files.js +2 -1
- package/.next/required-server-files.json +2 -1
- package/.next/routes-manifest.json +12 -0
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/agent/[id]/events/route.js +3 -3
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/route.js +1 -1
- package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
- package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
- package/.next/server/app/api/agent/new/route.js +1 -1
- package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route.js +1 -1
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/files/route.js +1 -1
- package/.next/server/app/api/files/route.js.nft.json +1 -1
- package/.next/server/app/api/fs/route.js +1 -0
- package/.next/server/app/api/fs/route.js.nft.json +1 -0
- package/.next/server/app/api/fs/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/route.js +2 -2
- package/.next/server/app/api/git/route.js.nft.json +1 -1
- package/.next/server/app/api/growth/route.js +1 -1
- package/.next/server/app/api/growth/route.js.nft.json +1 -1
- package/.next/server/app/api/health/route.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/pi-settings/route.js +1 -1
- package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/prompts/route.js +1 -1
- package/.next/server/app/api/prompts/route.js.nft.json +1 -1
- package/.next/server/app/api/remote/route.js +8 -0
- package/.next/server/app/api/remote/route.js.nft.json +1 -0
- package/.next/server/app/api/remote/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/security/route.js +1 -1
- package/.next/server/app/api/security/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/import/route.js +2 -2
- package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/route.js +1 -1
- package/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/update/route.js +2 -2
- package/.next/server/app/api/update/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route.js +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/web-auth/route.js +3 -1
- package/.next/server/app/api/workspaces/route.js +1 -1
- package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/.next/server/app/icon.svg/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +8 -6
- package/.next/server/chunks/229.js +1 -1
- package/.next/server/chunks/243.js +1 -0
- package/.next/server/chunks/393.js +1 -0
- package/.next/server/chunks/496.js +1 -1
- package/.next/server/chunks/538.js +1 -0
- package/.next/server/chunks/686.js +1 -4
- package/.next/server/chunks/802.js +2 -0
- package/.next/server/chunks/807.js +1 -0
- package/.next/server/chunks/920.js +4 -0
- package/.next/server/chunks/924.js +6 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/middleware.js +4 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/JDGSR-TIbk9qZWcUNYIX3/_buildManifest.js +1 -0
- package/.next/static/chunks/2716.7ad073038e94a802.js +1 -0
- package/.next/static/chunks/316-5ea443ee6b512aa9.js +1 -0
- package/.next/static/chunks/4673.8a5a9e6855350e34.js +1 -0
- package/.next/static/chunks/4686-e3825f3b6a384aa1.js +1 -0
- package/.next/static/chunks/4778.e4c9ed093a413bc4.js +1 -0
- package/.next/static/chunks/5173.91ddb803785009f8.js +1 -0
- package/.next/static/chunks/839.7403c6bdace4c56c.js +1 -0
- package/.next/static/chunks/8552.6bfe3e101250b20f.js +1 -0
- package/.next/static/chunks/app/_global-error/page-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/tree/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/config/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/files/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/fs/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/git/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/growth/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/health/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/models/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/pi-settings/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/prompts/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/remote/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/security/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/sessions/import/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/skills/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/update/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/version/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/web-auth/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/api/workspaces/route-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/app/login/page-5e276a1eeb8867df.js +1 -0
- package/.next/static/chunks/app/page-2e425ef83fba0782.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b179d9f7f6f2daf9.js +1 -0
- package/.next/static/chunks/webpack-bd2b9202ecbcdcaa.js +1 -0
- package/.next/static/css/7391c42e1ae617f9.css +1 -0
- package/.next/types/app/api/fs/route.ts +353 -0
- package/.next/types/app/api/remote/route.ts +353 -0
- package/.next/types/routes.d.ts +3 -1
- package/.next/types/validator.ts +18 -0
- package/README.md +56 -10
- package/next.config.ts +3 -2
- package/package.json +3 -3
- package/scripts/launcher.mjs +194 -13
- package/scripts/release.mjs +0 -2
- package/src/app/api/agent/[id]/events/route.ts +11 -6
- package/src/app/api/fs/route.ts +119 -0
- package/src/app/api/growth/route.ts +11 -6
- package/src/app/api/models/route.ts +21 -9
- package/src/app/api/remote/route.ts +67 -0
- package/src/app/api/sessions/[id]/export/route.ts +11 -1
- package/src/app/api/sessions/route.ts +3 -1
- package/src/app/api/web-auth/route.ts +45 -49
- package/src/app/api/workspaces/route.ts +16 -0
- package/src/app/globals.css +6 -0
- package/src/app/login/page.tsx +8 -60
- package/src/components/AppShell.tsx +202 -155
- package/src/components/ChatInput.tsx +61 -6
- package/src/components/ChatWindow.tsx +274 -132
- package/src/components/DirectoryPicker.tsx +189 -0
- package/src/components/DrawerPanel.tsx +164 -0
- package/src/components/FileViewer.tsx +2 -2
- package/src/components/GrowthTree.tsx +6 -5
- package/src/components/MarkdownBlock.tsx +134 -0
- package/src/components/OutlineRail.tsx +22 -1
- package/src/components/ProjectPanel.tsx +197 -14
- package/src/components/RemoteSection.tsx +232 -0
- package/src/components/SessionImportSection.tsx +60 -38
- package/src/components/SettingsPanel.tsx +104 -57
- package/src/components/icons.tsx +23 -0
- package/src/hooks/useGrowth.ts +47 -25
- package/src/hooks/usePiWeb.ts +100 -14
- package/src/i18n.tsx +115 -28
- package/src/instrumentation-node.ts +35 -0
- package/src/instrumentation.ts +18 -0
- package/src/lib/agent-config.ts +134 -0
- package/src/lib/agent-manager.ts +243 -61
- package/src/lib/auth-throttle.ts +102 -0
- package/src/lib/auth.ts +35 -27
- package/src/lib/files-service.ts +61 -1
- package/src/lib/font.ts +84 -0
- package/src/lib/git-service.ts +5 -3
- package/src/lib/growth-service.ts +78 -30
- package/src/lib/growth-tracker.ts +91 -9
- package/src/lib/models-service.ts +36 -11
- package/src/lib/pi-settings.ts +10 -12
- package/src/lib/pi.ts +145 -18
- package/src/lib/plugins-service.ts +67 -35
- package/src/lib/remote/assets.json +4 -0
- package/src/lib/remote/mobile-proxy.ts +149 -0
- package/src/lib/remote/supervisor.ts +482 -0
- package/src/lib/security-service.ts +6 -11
- package/src/lib/session-import/claude.ts +45 -21
- package/src/lib/session-reader.ts +106 -3
- package/src/lib/skills-service.ts +34 -12
- package/src/lib/text-sanitize.ts +12 -0
- package/src/lib/theme.ts +3 -0
- package/src/lib/types.ts +16 -2
- package/src/lib/update-service.ts +0 -1
- package/src/lib/web-auth-shared.ts +5 -1
- package/src/lib/web-auth.ts +139 -22
- package/src/lib/web-launch-token.ts +55 -0
- package/src/lib/web-secret.ts +182 -0
- package/src/lib/workspace-store.ts +91 -7
- package/src/proxy.ts +46 -12
- package/.next/server/chunks/532.js +0 -1
- package/.next/static/chunks/2155.2f27fe7098987699.js +0 -1
- package/.next/static/chunks/2608.ec8ff1f5767c9056.js +0 -1
- package/.next/static/chunks/2716.93be8ad5c970c516.js +0 -1
- package/.next/static/chunks/4632.112d2e893d48d188.js +0 -1
- package/.next/static/chunks/4673.c1fb1580efc6ace7.js +0 -1
- package/.next/static/chunks/4686-f4a037d609cea3f2.js +0 -1
- package/.next/static/chunks/692-7992db0ae9cc3021.js +0 -1
- package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/events/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/agent/[id]/tree/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/agent/new/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/config/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/files/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/git/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/growth/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/health/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/models/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/pi-settings/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/plugins/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/prompts/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/security/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/export/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/sessions/import/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/skills/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/update/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/version/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/web-auth/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/api/workspaces/route-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/app/login/page-52ef4841cbd199a8.js +0 -1
- package/.next/static/chunks/app/page-b51087831582ee37.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +0 -1
- package/.next/static/chunks/webpack-c31263fd83d75ce6.js +0 -1
- package/.next/static/css/0cd968b9b62035b5.css +0 -1
- package/.next/static/en03hnPiuro0rnf8QkFEe/_buildManifest.js +0 -1
- /package/.next/static/{en03hnPiuro0rnf8QkFEe → JDGSR-TIbk9qZWcUNYIX3}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
// File: /home/runner/work/PiWeb/PiWeb/src/app/api/remote/route.ts
|
|
2
|
+
import * as entry from '../../../../../src/app/api/remote/route.js'
|
|
3
|
+
import type { NextRequest } from 'next/server.js'
|
|
4
|
+
|
|
5
|
+
import type { InstantConfigForTypeCheckInternal, Prefetch } from 'next/dist/build/segment-config/app/app-segment-config.js'
|
|
6
|
+
|
|
7
|
+
type TEntry = typeof import('../../../../../src/app/api/remote/route.js')
|
|
8
|
+
|
|
9
|
+
type SegmentParams<T extends Object = any> = T extends Record<string, any>
|
|
10
|
+
? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never }
|
|
11
|
+
: T
|
|
12
|
+
|
|
13
|
+
// Check that the entry is a valid entry
|
|
14
|
+
checkFields<Diff<{
|
|
15
|
+
GET?: Function
|
|
16
|
+
HEAD?: Function
|
|
17
|
+
OPTIONS?: Function
|
|
18
|
+
POST?: Function
|
|
19
|
+
PUT?: Function
|
|
20
|
+
DELETE?: Function
|
|
21
|
+
PATCH?: Function
|
|
22
|
+
config?: {}
|
|
23
|
+
generateStaticParams?: Function
|
|
24
|
+
instant?: InstantConfigForTypeCheckInternal
|
|
25
|
+
prefetch?: Prefetch
|
|
26
|
+
unstable_dynamicStaleTime?: number
|
|
27
|
+
revalidate?: RevalidateRange<TEntry> | false
|
|
28
|
+
dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
|
|
29
|
+
dynamicParams?: boolean
|
|
30
|
+
fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
|
|
31
|
+
/** @deprecated The `preferredRegion` config is deprecated. Remove this export. */
|
|
32
|
+
preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
|
|
33
|
+
runtime?: 'nodejs' | 'experimental-edge' | 'edge'
|
|
34
|
+
maxDuration?: number
|
|
35
|
+
|
|
36
|
+
}, TEntry, ''>>()
|
|
37
|
+
|
|
38
|
+
type RouteContext = { params: Promise<SegmentParams> }
|
|
39
|
+
// Check the prop type of the entry function
|
|
40
|
+
if ('GET' in entry) {
|
|
41
|
+
checkFields<
|
|
42
|
+
Diff<
|
|
43
|
+
ParamCheck<Request | NextRequest>,
|
|
44
|
+
{
|
|
45
|
+
__tag__: 'GET'
|
|
46
|
+
__param_position__: 'first'
|
|
47
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'GET'>>
|
|
48
|
+
},
|
|
49
|
+
'GET'
|
|
50
|
+
>
|
|
51
|
+
>()
|
|
52
|
+
checkFields<
|
|
53
|
+
Diff<
|
|
54
|
+
ParamCheck<RouteContext>,
|
|
55
|
+
{
|
|
56
|
+
__tag__: 'GET'
|
|
57
|
+
__param_position__: 'second'
|
|
58
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'GET'>>
|
|
59
|
+
},
|
|
60
|
+
'GET'
|
|
61
|
+
>
|
|
62
|
+
>()
|
|
63
|
+
|
|
64
|
+
checkFields<
|
|
65
|
+
Diff<
|
|
66
|
+
{
|
|
67
|
+
__tag__: 'GET',
|
|
68
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
__tag__: 'GET',
|
|
72
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'GET'>>
|
|
73
|
+
},
|
|
74
|
+
'GET'
|
|
75
|
+
>
|
|
76
|
+
>()
|
|
77
|
+
}
|
|
78
|
+
// Check the prop type of the entry function
|
|
79
|
+
if ('HEAD' in entry) {
|
|
80
|
+
checkFields<
|
|
81
|
+
Diff<
|
|
82
|
+
ParamCheck<Request | NextRequest>,
|
|
83
|
+
{
|
|
84
|
+
__tag__: 'HEAD'
|
|
85
|
+
__param_position__: 'first'
|
|
86
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'HEAD'>>
|
|
87
|
+
},
|
|
88
|
+
'HEAD'
|
|
89
|
+
>
|
|
90
|
+
>()
|
|
91
|
+
checkFields<
|
|
92
|
+
Diff<
|
|
93
|
+
ParamCheck<RouteContext>,
|
|
94
|
+
{
|
|
95
|
+
__tag__: 'HEAD'
|
|
96
|
+
__param_position__: 'second'
|
|
97
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'HEAD'>>
|
|
98
|
+
},
|
|
99
|
+
'HEAD'
|
|
100
|
+
>
|
|
101
|
+
>()
|
|
102
|
+
|
|
103
|
+
checkFields<
|
|
104
|
+
Diff<
|
|
105
|
+
{
|
|
106
|
+
__tag__: 'HEAD',
|
|
107
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
__tag__: 'HEAD',
|
|
111
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'HEAD'>>
|
|
112
|
+
},
|
|
113
|
+
'HEAD'
|
|
114
|
+
>
|
|
115
|
+
>()
|
|
116
|
+
}
|
|
117
|
+
// Check the prop type of the entry function
|
|
118
|
+
if ('OPTIONS' in entry) {
|
|
119
|
+
checkFields<
|
|
120
|
+
Diff<
|
|
121
|
+
ParamCheck<Request | NextRequest>,
|
|
122
|
+
{
|
|
123
|
+
__tag__: 'OPTIONS'
|
|
124
|
+
__param_position__: 'first'
|
|
125
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'OPTIONS'>>
|
|
126
|
+
},
|
|
127
|
+
'OPTIONS'
|
|
128
|
+
>
|
|
129
|
+
>()
|
|
130
|
+
checkFields<
|
|
131
|
+
Diff<
|
|
132
|
+
ParamCheck<RouteContext>,
|
|
133
|
+
{
|
|
134
|
+
__tag__: 'OPTIONS'
|
|
135
|
+
__param_position__: 'second'
|
|
136
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'OPTIONS'>>
|
|
137
|
+
},
|
|
138
|
+
'OPTIONS'
|
|
139
|
+
>
|
|
140
|
+
>()
|
|
141
|
+
|
|
142
|
+
checkFields<
|
|
143
|
+
Diff<
|
|
144
|
+
{
|
|
145
|
+
__tag__: 'OPTIONS',
|
|
146
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
__tag__: 'OPTIONS',
|
|
150
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'OPTIONS'>>
|
|
151
|
+
},
|
|
152
|
+
'OPTIONS'
|
|
153
|
+
>
|
|
154
|
+
>()
|
|
155
|
+
}
|
|
156
|
+
// Check the prop type of the entry function
|
|
157
|
+
if ('POST' in entry) {
|
|
158
|
+
checkFields<
|
|
159
|
+
Diff<
|
|
160
|
+
ParamCheck<Request | NextRequest>,
|
|
161
|
+
{
|
|
162
|
+
__tag__: 'POST'
|
|
163
|
+
__param_position__: 'first'
|
|
164
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'POST'>>
|
|
165
|
+
},
|
|
166
|
+
'POST'
|
|
167
|
+
>
|
|
168
|
+
>()
|
|
169
|
+
checkFields<
|
|
170
|
+
Diff<
|
|
171
|
+
ParamCheck<RouteContext>,
|
|
172
|
+
{
|
|
173
|
+
__tag__: 'POST'
|
|
174
|
+
__param_position__: 'second'
|
|
175
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'POST'>>
|
|
176
|
+
},
|
|
177
|
+
'POST'
|
|
178
|
+
>
|
|
179
|
+
>()
|
|
180
|
+
|
|
181
|
+
checkFields<
|
|
182
|
+
Diff<
|
|
183
|
+
{
|
|
184
|
+
__tag__: 'POST',
|
|
185
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
__tag__: 'POST',
|
|
189
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'POST'>>
|
|
190
|
+
},
|
|
191
|
+
'POST'
|
|
192
|
+
>
|
|
193
|
+
>()
|
|
194
|
+
}
|
|
195
|
+
// Check the prop type of the entry function
|
|
196
|
+
if ('PUT' in entry) {
|
|
197
|
+
checkFields<
|
|
198
|
+
Diff<
|
|
199
|
+
ParamCheck<Request | NextRequest>,
|
|
200
|
+
{
|
|
201
|
+
__tag__: 'PUT'
|
|
202
|
+
__param_position__: 'first'
|
|
203
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'PUT'>>
|
|
204
|
+
},
|
|
205
|
+
'PUT'
|
|
206
|
+
>
|
|
207
|
+
>()
|
|
208
|
+
checkFields<
|
|
209
|
+
Diff<
|
|
210
|
+
ParamCheck<RouteContext>,
|
|
211
|
+
{
|
|
212
|
+
__tag__: 'PUT'
|
|
213
|
+
__param_position__: 'second'
|
|
214
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'PUT'>>
|
|
215
|
+
},
|
|
216
|
+
'PUT'
|
|
217
|
+
>
|
|
218
|
+
>()
|
|
219
|
+
|
|
220
|
+
checkFields<
|
|
221
|
+
Diff<
|
|
222
|
+
{
|
|
223
|
+
__tag__: 'PUT',
|
|
224
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
__tag__: 'PUT',
|
|
228
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'PUT'>>
|
|
229
|
+
},
|
|
230
|
+
'PUT'
|
|
231
|
+
>
|
|
232
|
+
>()
|
|
233
|
+
}
|
|
234
|
+
// Check the prop type of the entry function
|
|
235
|
+
if ('DELETE' in entry) {
|
|
236
|
+
checkFields<
|
|
237
|
+
Diff<
|
|
238
|
+
ParamCheck<Request | NextRequest>,
|
|
239
|
+
{
|
|
240
|
+
__tag__: 'DELETE'
|
|
241
|
+
__param_position__: 'first'
|
|
242
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'DELETE'>>
|
|
243
|
+
},
|
|
244
|
+
'DELETE'
|
|
245
|
+
>
|
|
246
|
+
>()
|
|
247
|
+
checkFields<
|
|
248
|
+
Diff<
|
|
249
|
+
ParamCheck<RouteContext>,
|
|
250
|
+
{
|
|
251
|
+
__tag__: 'DELETE'
|
|
252
|
+
__param_position__: 'second'
|
|
253
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'DELETE'>>
|
|
254
|
+
},
|
|
255
|
+
'DELETE'
|
|
256
|
+
>
|
|
257
|
+
>()
|
|
258
|
+
|
|
259
|
+
checkFields<
|
|
260
|
+
Diff<
|
|
261
|
+
{
|
|
262
|
+
__tag__: 'DELETE',
|
|
263
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
__tag__: 'DELETE',
|
|
267
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'DELETE'>>
|
|
268
|
+
},
|
|
269
|
+
'DELETE'
|
|
270
|
+
>
|
|
271
|
+
>()
|
|
272
|
+
}
|
|
273
|
+
// Check the prop type of the entry function
|
|
274
|
+
if ('PATCH' in entry) {
|
|
275
|
+
checkFields<
|
|
276
|
+
Diff<
|
|
277
|
+
ParamCheck<Request | NextRequest>,
|
|
278
|
+
{
|
|
279
|
+
__tag__: 'PATCH'
|
|
280
|
+
__param_position__: 'first'
|
|
281
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'PATCH'>>
|
|
282
|
+
},
|
|
283
|
+
'PATCH'
|
|
284
|
+
>
|
|
285
|
+
>()
|
|
286
|
+
checkFields<
|
|
287
|
+
Diff<
|
|
288
|
+
ParamCheck<RouteContext>,
|
|
289
|
+
{
|
|
290
|
+
__tag__: 'PATCH'
|
|
291
|
+
__param_position__: 'second'
|
|
292
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'PATCH'>>
|
|
293
|
+
},
|
|
294
|
+
'PATCH'
|
|
295
|
+
>
|
|
296
|
+
>()
|
|
297
|
+
|
|
298
|
+
checkFields<
|
|
299
|
+
Diff<
|
|
300
|
+
{
|
|
301
|
+
__tag__: 'PATCH',
|
|
302
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
__tag__: 'PATCH',
|
|
306
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'PATCH'>>
|
|
307
|
+
},
|
|
308
|
+
'PATCH'
|
|
309
|
+
>
|
|
310
|
+
>()
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Check the arguments and return type of the generateStaticParams function
|
|
314
|
+
if ('generateStaticParams' in entry) {
|
|
315
|
+
checkFields<Diff<{ params: SegmentParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
|
|
316
|
+
checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export interface PageProps {
|
|
320
|
+
params?: Promise<SegmentParams>
|
|
321
|
+
searchParams?: Promise<any>
|
|
322
|
+
}
|
|
323
|
+
export interface LayoutProps {
|
|
324
|
+
children?: React.ReactNode
|
|
325
|
+
|
|
326
|
+
params?: Promise<SegmentParams>
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// =============
|
|
330
|
+
// Utility types
|
|
331
|
+
type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
|
|
332
|
+
|
|
333
|
+
// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
|
|
334
|
+
type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
|
|
335
|
+
type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
|
|
336
|
+
|
|
337
|
+
type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
|
|
338
|
+
type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
|
|
339
|
+
type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
|
|
340
|
+
|
|
341
|
+
type ParamCheck<T> = {
|
|
342
|
+
__tag__: string
|
|
343
|
+
__param_position__: string
|
|
344
|
+
__param_type__: T
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function checkFields<_ extends { [k in keyof any]: never }>() {}
|
|
348
|
+
|
|
349
|
+
// https://github.com/sindresorhus/type-fest
|
|
350
|
+
type Numeric = number | bigint
|
|
351
|
+
type Zero = 0 | 0n
|
|
352
|
+
type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
|
|
353
|
+
type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
|
package/.next/types/routes.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Do not edit this file manually
|
|
3
3
|
|
|
4
4
|
type AppRoutes = "/" | "/login"
|
|
5
|
-
type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/events" | "/api/agent/[id]/tree" | "/api/agent/new" | "/api/config" | "/api/files" | "/api/git" | "/api/growth" | "/api/health" | "/api/models" | "/api/pi-settings" | "/api/plugins" | "/api/prompts" | "/api/security" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/export" | "/api/sessions/import" | "/api/skills" | "/api/update" | "/api/version" | "/api/web-auth" | "/api/workspaces"
|
|
5
|
+
type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/events" | "/api/agent/[id]/tree" | "/api/agent/new" | "/api/config" | "/api/files" | "/api/fs" | "/api/git" | "/api/growth" | "/api/health" | "/api/models" | "/api/pi-settings" | "/api/plugins" | "/api/prompts" | "/api/remote" | "/api/security" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/export" | "/api/sessions/import" | "/api/skills" | "/api/update" | "/api/version" | "/api/web-auth" | "/api/workspaces"
|
|
6
6
|
type PageRoutes = never
|
|
7
7
|
type LayoutRoutes = "/"
|
|
8
8
|
type RedirectRoutes = never
|
|
@@ -18,6 +18,7 @@ interface ParamMap {
|
|
|
18
18
|
"/api/agent/new": {}
|
|
19
19
|
"/api/config": {}
|
|
20
20
|
"/api/files": {}
|
|
21
|
+
"/api/fs": {}
|
|
21
22
|
"/api/git": {}
|
|
22
23
|
"/api/growth": {}
|
|
23
24
|
"/api/health": {}
|
|
@@ -25,6 +26,7 @@ interface ParamMap {
|
|
|
25
26
|
"/api/pi-settings": {}
|
|
26
27
|
"/api/plugins": {}
|
|
27
28
|
"/api/prompts": {}
|
|
29
|
+
"/api/remote": {}
|
|
28
30
|
"/api/security": {}
|
|
29
31
|
"/api/sessions": {}
|
|
30
32
|
"/api/sessions/[id]": { "id": string; }
|
package/.next/types/validator.ts
CHANGED
|
@@ -119,6 +119,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
119
119
|
type __Unused = __Check
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
// Validate ../../src/app/api/fs/route.ts
|
|
123
|
+
{
|
|
124
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/fs">> = Specific
|
|
125
|
+
const handler = {} as typeof import("../../src/app/api/fs/route.js")
|
|
126
|
+
type __Check = __IsExpected<typeof handler>
|
|
127
|
+
// @ts-ignore
|
|
128
|
+
type __Unused = __Check
|
|
129
|
+
}
|
|
130
|
+
|
|
122
131
|
// Validate ../../src/app/api/git/route.ts
|
|
123
132
|
{
|
|
124
133
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/git">> = Specific
|
|
@@ -182,6 +191,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
182
191
|
type __Unused = __Check
|
|
183
192
|
}
|
|
184
193
|
|
|
194
|
+
// Validate ../../src/app/api/remote/route.ts
|
|
195
|
+
{
|
|
196
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/remote">> = Specific
|
|
197
|
+
const handler = {} as typeof import("../../src/app/api/remote/route.js")
|
|
198
|
+
type __Check = __IsExpected<typeof handler>
|
|
199
|
+
// @ts-ignore
|
|
200
|
+
type __Unused = __Check
|
|
201
|
+
}
|
|
202
|
+
|
|
185
203
|
// Validate ../../src/app/api/security/route.ts
|
|
186
204
|
{
|
|
187
205
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/security">> = Specific
|
package/README.md
CHANGED
|
@@ -47,15 +47,9 @@ Sessions grouped by project folder, with a native folder picker (Windows / macOS
|
|
|
47
47
|
|
|
48
48
|
<p align="center"><img src="assets/archive.jpg" alt="Archived: archived conversations in one place" width="400" /></p>
|
|
49
49
|
|
|
50
|
-
### Import Local Sessions
|
|
51
|
-
|
|
52
|
-
Bring conversation history from Codex, Claude Code, Grok, ZCode, dsh and opencode on this machine into pi sessions without loss: text, thinking, tool calls and their results, timestamps and usage are all kept, and the source data is **read-only** — nothing in the other tools is modified. Each source lists only its 15 most recent **main** conversations; work the main agent handed to a subagent is ignored, because the conversation you want is your own. If the original project directory still exists locally the session lands in that workspace, otherwise it falls back to one you pick — and anything already imported is marked and never imported twice.
|
|
53
|
-
|
|
54
|
-
<p align="center"><img src="assets/import.jpg" alt="Settings → Import sessions: pick a source, tick, import" width="840" /></p>
|
|
55
|
-
|
|
56
50
|
### Project Growth Tree
|
|
57
51
|
|
|
58
|
-
Every file operation pi makes is snapshotted, grouped one round per message you send. Each round shows what changed **relative to the previous one** — files added, modified and deleted, with line-level diffs one click away — so you can review the work round by round, or drill into single steps inside a round. A round with no file changes says so instead of being skipped,
|
|
52
|
+
Every file operation pi makes is snapshotted, grouped one round per message you send. Each round shows what changed **relative to the previous one** — files added, modified and deleted, with line-level diffs one click away — so you can review the work round by round, or drill into single steps inside a round. A round with no file changes says so instead of being skipped. Each round is stored as a commit in the workspace's own git repository on a private ref (`refs/piweb/rounds/…`), never touching your branches or index; if the folder is not a git repository yet (or is only a subfolder of another one), PiWeb asks before creating one there, remembers the answer per workspace, and records nothing if you decline.
|
|
59
53
|
|
|
60
54
|
<p align="center"><img src="assets/growth-1.jpg" alt="Project growth tree (1 of 2)" width="840" /></p>
|
|
61
55
|
<p align="center"><img src="assets/growth-2.jpg" alt="Project growth tree (2 of 2)" width="840" /></p>
|
|
@@ -92,7 +86,7 @@ Install, update, and uninstall pi packages directly from the UI. Enable/disable
|
|
|
92
86
|
|
|
93
87
|
### Security
|
|
94
88
|
|
|
95
|
-
|
|
89
|
+
Launch-token login for anything reachable beyond this machine, origin validation on write actions, strict path boundary checks, and tool presets (Read Only / Workspace Write / Full Access).
|
|
96
90
|
|
|
97
91
|
## Usage
|
|
98
92
|
|
|
@@ -132,7 +126,7 @@ This removes PiWeb only — your pi data lives in `~/.pi/agent/` and is left unt
|
|
|
132
126
|
```bash
|
|
133
127
|
piweb # http://127.0.0.1:30141 (auto-increments if busy)
|
|
134
128
|
piweb -p 30143 --no-open # custom port, don't open the browser
|
|
135
|
-
piweb -H 0.0.0.0 # LAN access (
|
|
129
|
+
piweb -H 0.0.0.0 # LAN access (launch-token login is enabled automatically)
|
|
136
130
|
```
|
|
137
131
|
|
|
138
132
|
| Option | Description |
|
|
@@ -141,8 +135,60 @@ piweb -H 0.0.0.0 # LAN access (requires PI_WEB_PASSWORD)
|
|
|
141
135
|
| `-H, --hostname <host>` | Bind address (default 127.0.0.1, env `PI_WEB_HOSTNAME`) |
|
|
142
136
|
| `--dev` | Development mode |
|
|
143
137
|
| `--no-open` | Do not auto-open the browser |
|
|
138
|
+
| `--public-url <url>` | Public address, used for the login link and added to the Host allowlist automatically (env `PI_WEB_PUBLIC_URL`) |
|
|
139
|
+
|
|
140
|
+
Authentication is opened by `PI_WEB_AUTH=1` (the launcher sets it by default whenever PiWeb may be reachable from
|
|
141
|
+
outside this machine). Login is **launch-token only**: open the printed `…/?token=…` link, which exchanges the token
|
|
142
|
+
for a signed cookie. `PI_WEB_PASSWORD` has been removed — setting it makes the launcher refuse to start. Do not
|
|
143
|
+
expose PiWeb over plain HTTP.
|
|
144
|
+
|
|
145
|
+
Scripts authenticate the same way: `GET /?token=…` once to receive the session cookie, then send that cookie with
|
|
146
|
+
every API request. There is no Basic Auth fallback.
|
|
147
|
+
|
|
148
|
+
### Use it on your phone: the built-in "Remote access" plugin
|
|
149
|
+
|
|
150
|
+
PiWeb ships a built-in plugin for this. Toggle it in **Settings → Remote access**; nothing is installed on the client.
|
|
151
|
+
|
|
152
|
+
It has two entry points:
|
|
153
|
+
|
|
154
|
+
**Local network (on by default)** — a reverse proxy that only adds the mobile layout, bound to `0.0.0.0:30142`.
|
|
155
|
+
Any device on the same Wi-Fi can open one of the addresses listed in the panel and gets the phone layout;
|
|
156
|
+
connecting to `127.0.0.1:30141` on this machine still serves the untouched desktop page.
|
|
157
|
+
|
|
158
|
+
**Public access (off by default)** — turning it on starts a Cloudflare quick tunnel (`cloudflared`).
|
|
159
|
+
Cloudflare assigns an `https://<random>.trycloudflare.com` address that any browser can open with
|
|
160
|
+
**nothing to install on any device**. Two costs:
|
|
161
|
+
|
|
162
|
+
- the address changes on every start, and takes about fifteen seconds to resolve worldwide
|
|
163
|
+
(the panel shows "taking effect" meanwhile);
|
|
164
|
+
- TLS terminates at Cloudflare, so that hop sees plaintext. Use a trusted VPN if you need end-to-end encryption.
|
|
165
|
+
|
|
166
|
+
`cloudflared` is looked up as: `PIWEB_CLOUDFLARED` → `<agent dir>/web-bin/cloudflared{,.exe}` (managed by PiWeb) → `PATH`.
|
|
167
|
+
The panel says so explicitly when it cannot find it.
|
|
168
|
+
|
|
169
|
+
> Turning public access on makes authentication mandatory. The plugin adds the tunnel hostname to the Host
|
|
170
|
+
> allowlist once the tunnel is live and removes it when the tunnel stops. The launch token is never accepted
|
|
171
|
+
> on API paths or through the `Authorization` header.
|
|
172
|
+
|
|
173
|
+
### Bring your own reverse proxy or tunnel
|
|
174
|
+
|
|
175
|
+
You can front PiWeb yourself instead (Caddy, nginx, a named Cloudflare tunnel, a VPN). In that case:
|
|
176
|
+
|
|
177
|
+
- Point the proxy at **`127.0.0.1:30142`** (the local-network entry) to get the mobile layout, or at
|
|
178
|
+
`127.0.0.1:30141` if you only want the desktop page.
|
|
179
|
+
- Set `PI_WEB_AUTH=1`. A loopback bind cannot tell PiWeb that it is exposed, so authentication must be explicit.
|
|
180
|
+
- A reverse proxy passes the external hostname through unchanged, so allowlist it or requests are rejected
|
|
181
|
+
with 403 `untrusted host`:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
PI_WEB_TRUSTED_HOSTS=<your-domain> piweb
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- Use `--public-url https://your-address/` to tell PiWeb its public address: the hostname joins the allowlist
|
|
188
|
+
automatically, and the login link printed at startup uses it instead of the loopback address.
|
|
144
189
|
|
|
145
|
-
|
|
190
|
+
> Disable the local-network entry with `PIWEB_REMOTE_LAN=0`; disable authentication entirely with `PI_WEB_AUTH=0`
|
|
191
|
+
> (only safe when PiWeb is used strictly on this machine).
|
|
146
192
|
|
|
147
193
|
## License
|
|
148
194
|
|
package/next.config.ts
CHANGED
|
@@ -9,8 +9,9 @@ import { resolveBuildOutput } from "./scripts/build-output.mjs";
|
|
|
9
9
|
* 让构建期的文件追踪看不到用户主目录。
|
|
10
10
|
*
|
|
11
11
|
* next-trace-entrypoints-plugin 会调 @vercel/nft 静态分析服务端代码,把
|
|
12
|
-
* `fs.readdir()` 的实参求值成绝对路径:
|
|
13
|
-
*
|
|
12
|
+
* `fs.readdir()` 的实参求值成绝对路径:prompt-sources / skills-service 里的
|
|
13
|
+
* `path.join(os.homedir(), ".agents")`、以及 `getAgentDir()` 的 `~/.pi/agent` 一类写法
|
|
14
|
+
* 于是变成真实路径,整个 ~/.agents、~/.pi 目录被当成构建资产递归遍历。后果:
|
|
14
15
|
* 1. 目录里任何一个文件读不了(权限/ACL 损坏、被独占)都会让构建以 EPERM 直接失败;
|
|
15
16
|
* 2. 这些绝对路径被写进 .next/**\/*.nft.json,而 .next 随 npm 包一起发布,
|
|
16
17
|
* 等于把构建者的用户名与目录布局发给了所有用户。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rexvane/piweb",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.19",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Modern web UI for the pi coding agent, driven by the official pi SDK without modifying pi",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@automann/maple-mono-cn": "^7.9.2",
|
|
55
|
-
"@earendil-works/pi-ai": "
|
|
56
|
-
"@earendil-works/pi-coding-agent": "
|
|
55
|
+
"@earendil-works/pi-ai": "1.1.0",
|
|
56
|
+
"@earendil-works/pi-coding-agent": "1.1.0",
|
|
57
57
|
"@lobehub/icons-static-svg": "^1.95.0",
|
|
58
58
|
"@tailwindcss/postcss": "^4.2.2",
|
|
59
59
|
"@types/node": "^26",
|