@rexvane/piweb 0.3.11 → 0.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +8 -6
  3. package/.next/build-manifest.json +6 -6
  4. package/.next/prerender-manifest.json +7 -7
  5. package/.next/react-loadable-manifest.json +7 -7
  6. package/.next/routes-manifest.json +12 -0
  7. package/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  22. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  23. package/.next/server/app/api/agent/[id]/route.js +1 -1
  24. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/new/route.js +1 -1
  28. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  29. package/.next/server/app/api/config/route.js +1 -1
  30. package/.next/server/app/api/files/route.js +1 -1
  31. package/.next/server/app/api/git/route.js +2 -2
  32. package/.next/server/app/api/growth/route.js +1 -1
  33. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  34. package/.next/server/app/api/health/route.js +1 -1
  35. package/.next/server/app/api/models/route.js +1 -1
  36. package/.next/server/app/api/models/route.js.nft.json +1 -1
  37. package/.next/server/app/api/pi-settings/route.js +1 -1
  38. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  39. package/.next/server/app/api/plugins/route.js +1 -1
  40. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  41. package/.next/server/app/api/prompts/route.js +1 -0
  42. package/.next/server/app/api/prompts/route.js.nft.json +1 -0
  43. package/.next/server/app/api/prompts/route_client-reference-manifest.js +1 -0
  44. package/.next/server/app/api/security/route.js +1 -1
  45. package/.next/server/app/api/security/route.js.nft.json +1 -1
  46. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  47. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  48. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  49. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/import/route.js +6 -0
  51. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -0
  52. package/.next/server/app/api/sessions/import/route_client-reference-manifest.js +1 -0
  53. package/.next/server/app/api/sessions/route.js +1 -1
  54. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  55. package/.next/server/app/api/skills/route.js +2 -2
  56. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  57. package/.next/server/app/api/update/route.js +2 -2
  58. package/.next/server/app/api/update/route.js.nft.json +1 -1
  59. package/.next/server/app/api/version/route.js +1 -1
  60. package/.next/server/app/api/web-auth/route.js +1 -1
  61. package/.next/server/app/api/workspaces/route.js +1 -1
  62. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  63. package/.next/server/app/icon.svg/route.js +1 -1
  64. package/.next/server/app/index.html +1 -1
  65. package/.next/server/app/index.rsc +3 -3
  66. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  67. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  68. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  69. package/.next/server/app/login/page.js +1 -1
  70. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/login.html +1 -1
  72. package/.next/server/app/login.rsc +2 -2
  73. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  74. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  75. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  76. package/.next/server/app/page.js +1 -1
  77. package/.next/server/app/page_client-reference-manifest.js +1 -1
  78. package/.next/server/app-paths-manifest.json +8 -6
  79. package/.next/server/chunks/496.js +1 -1
  80. package/.next/server/chunks/532.js +1 -0
  81. package/.next/server/chunks/686.js +2 -2
  82. package/.next/server/middleware-build-manifest.js +1 -1
  83. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  84. package/.next/server/pages/404.html +1 -1
  85. package/.next/server/pages/500.html +1 -1
  86. package/.next/server/server-reference-manifest.json +1 -1
  87. package/.next/static/chunks/2155.2f27fe7098987699.js +1 -0
  88. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +1 -0
  89. package/.next/static/chunks/2716.a9e808190a4e2424.js +1 -0
  90. package/.next/static/chunks/{794-d1a40dcf24d651d9.js → 3794-3679f1c05160977c.js} +1 -1
  91. package/.next/static/chunks/4632.d574c210ad78d065.js +1 -0
  92. package/.next/static/chunks/4673.d3d0a7f2599080fb.js +1 -0
  93. package/.next/static/chunks/4686-0a4155f8488314b8.js +1 -0
  94. package/.next/static/chunks/4bd1b696-93bf506b236d6248.js +1 -0
  95. package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.js +1 -0
  96. package/.next/static/chunks/app/_not-found/page-2d40d1d7d916666a.js +1 -0
  97. package/.next/static/chunks/app/api/agent/[id]/events/route-f77e9ede9808b18e.js +1 -0
  98. package/.next/static/chunks/app/api/agent/[id]/route-f77e9ede9808b18e.js +1 -0
  99. package/.next/static/chunks/app/api/agent/[id]/tree/route-f77e9ede9808b18e.js +1 -0
  100. package/.next/static/chunks/app/api/agent/new/route-f77e9ede9808b18e.js +1 -0
  101. package/.next/static/chunks/app/api/config/route-f77e9ede9808b18e.js +1 -0
  102. package/.next/static/chunks/app/api/files/route-f77e9ede9808b18e.js +1 -0
  103. package/.next/static/chunks/app/api/git/route-f77e9ede9808b18e.js +1 -0
  104. package/.next/static/chunks/app/api/growth/route-f77e9ede9808b18e.js +1 -0
  105. package/.next/static/chunks/app/api/health/route-f77e9ede9808b18e.js +1 -0
  106. package/.next/static/chunks/app/api/models/route-f77e9ede9808b18e.js +1 -0
  107. package/.next/static/chunks/app/api/pi-settings/route-f77e9ede9808b18e.js +1 -0
  108. package/.next/static/chunks/app/api/plugins/route-f77e9ede9808b18e.js +1 -0
  109. package/.next/static/chunks/app/api/prompts/route-f77e9ede9808b18e.js +1 -0
  110. package/.next/static/chunks/app/api/security/route-f77e9ede9808b18e.js +1 -0
  111. package/.next/static/chunks/app/api/sessions/[id]/export/route-f77e9ede9808b18e.js +1 -0
  112. package/.next/static/chunks/app/api/sessions/[id]/route-f77e9ede9808b18e.js +1 -0
  113. package/.next/static/chunks/app/api/sessions/import/route-f77e9ede9808b18e.js +1 -0
  114. package/.next/static/chunks/app/api/sessions/route-f77e9ede9808b18e.js +1 -0
  115. package/.next/static/chunks/app/api/skills/route-f77e9ede9808b18e.js +1 -0
  116. package/.next/static/chunks/app/api/update/route-f77e9ede9808b18e.js +1 -0
  117. package/.next/static/chunks/app/api/version/route-f77e9ede9808b18e.js +1 -0
  118. package/.next/static/chunks/app/api/web-auth/route-f77e9ede9808b18e.js +1 -0
  119. package/.next/static/chunks/app/api/workspaces/route-f77e9ede9808b18e.js +1 -0
  120. package/.next/static/chunks/app/layout-50d06e2078d6ce76.js +1 -0
  121. package/.next/static/chunks/app/login/page-52ef4841cbd199a8.js +1 -0
  122. package/.next/static/chunks/app/page-9a5440047c5a415c.js +1 -0
  123. package/.next/static/chunks/framework-c4e651fe89edfa91.js +1 -0
  124. package/.next/static/chunks/{main-a315d7c58b599962.js → main-6159b22a8cb0b7c5.js} +2 -2
  125. package/.next/static/chunks/main-app-e9b53f0e1c6591b2.js +1 -0
  126. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +1 -0
  127. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +1 -0
  128. package/.next/static/chunks/next/dist/client/components/builtin/global-error-a7e260f8cc2582d7.js +1 -0
  129. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +1 -0
  130. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +1 -0
  131. package/.next/static/chunks/webpack-b1a572e319353f5d.js +1 -0
  132. package/.next/static/olV7jxKRN5VhfEK012WhV/_buildManifest.js +1 -0
  133. package/.next/types/app/api/prompts/route.ts +353 -0
  134. package/.next/types/app/api/sessions/import/route.ts +353 -0
  135. package/.next/types/routes.d.ts +3 -1
  136. package/.next/types/validator.ts +18 -0
  137. package/README.md +4 -0
  138. package/package.json +1 -1
  139. package/src/app/api/prompts/route.ts +51 -0
  140. package/src/app/api/sessions/import/route.ts +74 -0
  141. package/src/components/AppShell.tsx +42 -19
  142. package/src/components/ChatWindow.tsx +20 -35
  143. package/src/components/PromptPanel.tsx +259 -0
  144. package/src/components/SessionImportSection.tsx +333 -0
  145. package/src/components/SettingsPanel.tsx +63 -57
  146. package/src/i18n.tsx +98 -4
  147. package/src/lib/agent-manager.ts +35 -8
  148. package/src/lib/clipboard.ts +27 -0
  149. package/src/lib/command-validation.ts +1 -0
  150. package/src/lib/prompt-sources.ts +229 -0
  151. package/src/lib/session-import/claude.ts +219 -0
  152. package/src/lib/session-import/codex.ts +206 -0
  153. package/src/lib/session-import/dsh-zstd.ts +69 -0
  154. package/src/lib/session-import/dsh.ts +248 -0
  155. package/src/lib/session-import/files.ts +84 -0
  156. package/src/lib/session-import/grok.ts +166 -0
  157. package/src/lib/session-import/index.ts +229 -0
  158. package/src/lib/session-import/oc-family.ts +275 -0
  159. package/src/lib/session-import/opencode.ts +7 -0
  160. package/src/lib/session-import/paths.ts +37 -0
  161. package/src/lib/session-import/sqlite.ts +89 -0
  162. package/src/lib/session-import/types.ts +171 -0
  163. package/src/lib/session-import/writer.ts +259 -0
  164. package/src/lib/session-import/zcode.ts +8 -0
  165. package/src/lib/types.ts +1 -0
  166. package/.next/server/chunks/118.js +0 -1
  167. package/.next/static/222KLUIvefiGf7M0Ov-Qz/_buildManifest.js +0 -1
  168. package/.next/static/chunks/127.c31e688e156605e3.js +0 -1
  169. package/.next/static/chunks/155.a3c40ae481da1358.js +0 -1
  170. package/.next/static/chunks/4bd1b696-92152b0f5947070d.js +0 -1
  171. package/.next/static/chunks/608.5b8aae42a9998ee7.js +0 -1
  172. package/.next/static/chunks/673.93445c8600bc1dd9.js +0 -1
  173. package/.next/static/chunks/686-9f15e4e370d26815.js +0 -1
  174. package/.next/static/chunks/716.5266fe10b5578591.js +0 -1
  175. package/.next/static/chunks/app/_global-error/page-1dac1b3ca8adb975.js +0 -1
  176. package/.next/static/chunks/app/_not-found/page-9de30f6f614fce02.js +0 -1
  177. package/.next/static/chunks/app/api/agent/[id]/events/route-1dac1b3ca8adb975.js +0 -1
  178. package/.next/static/chunks/app/api/agent/[id]/route-1dac1b3ca8adb975.js +0 -1
  179. package/.next/static/chunks/app/api/agent/[id]/tree/route-1dac1b3ca8adb975.js +0 -1
  180. package/.next/static/chunks/app/api/agent/new/route-1dac1b3ca8adb975.js +0 -1
  181. package/.next/static/chunks/app/api/config/route-1dac1b3ca8adb975.js +0 -1
  182. package/.next/static/chunks/app/api/files/route-1dac1b3ca8adb975.js +0 -1
  183. package/.next/static/chunks/app/api/git/route-1dac1b3ca8adb975.js +0 -1
  184. package/.next/static/chunks/app/api/growth/route-1dac1b3ca8adb975.js +0 -1
  185. package/.next/static/chunks/app/api/health/route-1dac1b3ca8adb975.js +0 -1
  186. package/.next/static/chunks/app/api/models/route-1dac1b3ca8adb975.js +0 -1
  187. package/.next/static/chunks/app/api/pi-settings/route-1dac1b3ca8adb975.js +0 -1
  188. package/.next/static/chunks/app/api/plugins/route-1dac1b3ca8adb975.js +0 -1
  189. package/.next/static/chunks/app/api/security/route-1dac1b3ca8adb975.js +0 -1
  190. package/.next/static/chunks/app/api/sessions/[id]/export/route-1dac1b3ca8adb975.js +0 -1
  191. package/.next/static/chunks/app/api/sessions/[id]/route-1dac1b3ca8adb975.js +0 -1
  192. package/.next/static/chunks/app/api/sessions/route-1dac1b3ca8adb975.js +0 -1
  193. package/.next/static/chunks/app/api/skills/route-1dac1b3ca8adb975.js +0 -1
  194. package/.next/static/chunks/app/api/update/route-1dac1b3ca8adb975.js +0 -1
  195. package/.next/static/chunks/app/api/version/route-1dac1b3ca8adb975.js +0 -1
  196. package/.next/static/chunks/app/api/web-auth/route-1dac1b3ca8adb975.js +0 -1
  197. package/.next/static/chunks/app/api/workspaces/route-1dac1b3ca8adb975.js +0 -1
  198. package/.next/static/chunks/app/layout-eb62bcd99abe79f9.js +0 -1
  199. package/.next/static/chunks/app/login/page-d2308b48d013d1a6.js +0 -1
  200. package/.next/static/chunks/app/page-708cd3ee4cfe8af5.js +0 -1
  201. package/.next/static/chunks/framework-0f597d6e68ffafed.js +0 -1
  202. package/.next/static/chunks/main-app-1a92e20ec190a32b.js +0 -1
  203. package/.next/static/chunks/next/dist/client/components/builtin/app-error-1dac1b3ca8adb975.js +0 -1
  204. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-1dac1b3ca8adb975.js +0 -1
  205. package/.next/static/chunks/next/dist/client/components/builtin/global-error-7bb5c4afcbc1772b.js +0 -1
  206. package/.next/static/chunks/next/dist/client/components/builtin/not-found-1dac1b3ca8adb975.js +0 -1
  207. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-1dac1b3ca8adb975.js +0 -1
  208. package/.next/static/chunks/webpack-9d84b382d4dec27a.js +0 -1
  209. /package/.next/static/{222KLUIvefiGf7M0Ov-Qz → olV7jxKRN5VhfEK012WhV}/_ssgManifest.js +0 -0
@@ -0,0 +1,353 @@
1
+ // File: /home/runner/work/PiWeb/PiWeb/src/app/api/sessions/import/route.ts
2
+ import * as entry from '../../../../../../src/app/api/sessions/import/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/sessions/import/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__'
@@ -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/security" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/export" | "/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/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"
6
6
  type PageRoutes = never
7
7
  type LayoutRoutes = "/"
8
8
  type RedirectRoutes = never
@@ -24,10 +24,12 @@ interface ParamMap {
24
24
  "/api/models": {}
25
25
  "/api/pi-settings": {}
26
26
  "/api/plugins": {}
27
+ "/api/prompts": {}
27
28
  "/api/security": {}
28
29
  "/api/sessions": {}
29
30
  "/api/sessions/[id]": { "id": string; }
30
31
  "/api/sessions/[id]/export": { "id": string; }
32
+ "/api/sessions/import": {}
31
33
  "/api/skills": {}
32
34
  "/api/update": {}
33
35
  "/api/version": {}
@@ -173,6 +173,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
173
173
  type __Unused = __Check
174
174
  }
175
175
 
176
+ // Validate ../../src/app/api/prompts/route.ts
177
+ {
178
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/prompts">> = Specific
179
+ const handler = {} as typeof import("../../src/app/api/prompts/route.js")
180
+ type __Check = __IsExpected<typeof handler>
181
+ // @ts-ignore
182
+ type __Unused = __Check
183
+ }
184
+
176
185
  // Validate ../../src/app/api/security/route.ts
177
186
  {
178
187
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/security">> = Specific
@@ -200,6 +209,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
200
209
  type __Unused = __Check
201
210
  }
202
211
 
212
+ // Validate ../../src/app/api/sessions/import/route.ts
213
+ {
214
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions/import">> = Specific
215
+ const handler = {} as typeof import("../../src/app/api/sessions/import/route.js")
216
+ type __Check = __IsExpected<typeof handler>
217
+ // @ts-ignore
218
+ type __Unused = __Check
219
+ }
220
+
203
221
  // Validate ../../src/app/api/sessions/route.ts
204
222
  {
205
223
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions">> = Specific
package/README.md CHANGED
@@ -28,6 +28,10 @@ Full SSE snapshots with ordered deltas and automatic replay via `Last-Event-ID`.
28
28
 
29
29
  Sessions grouped by project folder, with a native folder picker (Windows / macOS / Linux), rename and archive. Session tree branches, draft recovery, and JSONL / HTML export.
30
30
 
31
+ ### Import Local Sessions
32
+
33
+ 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. If the original project directory still exists locally the session lands in that workspace; otherwise it falls back to one you pick. Find it under Settings → Import sessions. The 15 most recent conversations per source are listed, and anything already imported is marked and cannot be imported twice.
34
+
31
35
  ### Project Growth Tree
32
36
 
33
37
  Every step the agent takes on your codebase is snapshotted: navigate the timeline round by round, see added/modified/deleted files, and open line-level diffs for any file at any step — even if the workspace has no git history of its own.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexvane/piweb",
3
- "version": "0.3.11",
3
+ "version": "0.3.13",
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",
@@ -0,0 +1,51 @@
1
+ import { NextResponse } from "next/server";
2
+ import { listPromptSources, readPromptSource } from "@/lib/prompt-sources";
3
+ import { getManaged } from "@/lib/agent-manager";
4
+ import { BoundaryError, resolveSessionPath, resolveWorkspacePath } from "@/lib/path-security";
5
+
6
+ export const dynamic = "force-dynamic";
7
+
8
+ /**
9
+ * 提示词来源面板的数据口:
10
+ * - GET ?cwd=<工作区>&session=<会话 id>:列出所有提示词来源;会话已热时附带"组装后的系统提示词"与工具定义
11
+ * - POST { action: "read", filePath }:按需读取单个来源的内容
12
+ * 只读,不改动任何提示词内容。
13
+ */
14
+ async function hotSession(cwd: string, sessionId: string | null) {
15
+ if (!sessionId) return null;
16
+ try {
17
+ // sessionId 是客户端已有的 base64url 编码 id(与 /api/agent/<id> 同一套),不要再编码一次
18
+ const sessionPath = await resolveSessionPath(sessionId, { allowPending: true });
19
+ const managed = getManaged(sessionPath);
20
+ return managed.session ?? null;
21
+ } catch {
22
+ // 会话路径不合法或已消失:退化为"只列文件来源",不因此让整个面板失败
23
+ return null;
24
+ }
25
+ }
26
+
27
+ export async function GET(req: Request) {
28
+ try {
29
+ const url = new URL(req.url);
30
+ const cwd = await resolveWorkspacePath(url.searchParams.get("cwd") || process.cwd());
31
+ const sessionId = url.searchParams.get("session");
32
+ const data = await listPromptSources({ cwd, session: await hotSession(cwd, sessionId) });
33
+ return NextResponse.json({ success: true, data });
34
+ } catch (err) {
35
+ const message = err instanceof Error ? err.message : String(err);
36
+ return NextResponse.json({ success: false, error: message }, { status: err instanceof BoundaryError ? 400 : 500 });
37
+ }
38
+ }
39
+
40
+ export async function POST(req: Request) {
41
+ try {
42
+ const body = (await req.json()) as { action?: string; filePath?: string; cwd?: string };
43
+ if (body.action !== "read") return NextResponse.json({ success: false, error: "unknown action" }, { status: 400 });
44
+ if (!body.filePath) return NextResponse.json({ success: false, error: "missing filePath" }, { status: 400 });
45
+ const cwd = await resolveWorkspacePath(body.cwd || process.cwd());
46
+ return NextResponse.json({ success: true, data: { content: await readPromptSource(body.filePath, cwd) } });
47
+ } catch (err) {
48
+ const message = err instanceof Error ? err.message : "request failed";
49
+ return NextResponse.json({ success: false, error: message }, { status: err instanceof BoundaryError ? 400 : 500 });
50
+ }
51
+ }
@@ -0,0 +1,74 @@
1
+ import { NextResponse } from "next/server";
2
+ import { getAgentDir } from "@/lib/pi";
3
+ import { registerCwds } from "@/lib/workspace-store";
4
+ import { IMPORT_SOURCES, type ExternalSessionSummary, type ImportSource } from "@/lib/session-import/types";
5
+ import { importSessions, scanAllSources, type ImportSelection } from "@/lib/session-import";
6
+
7
+ export const dynamic = "force-dynamic";
8
+
9
+ /** 单次导入上限:一次点太多会把内存和磁盘写爆,也让界面报告失去意义 */
10
+ const MAX_SELECTION = 500;
11
+
12
+ /** 内部定位信息(文件路径 / 库+行)只用于服务端再扫描,不下发到浏览器 */
13
+ function publicSummary(summary: ExternalSessionSummary): Omit<ExternalSessionSummary, "location"> {
14
+ const { location: _location, ...rest } = summary;
15
+ return rest;
16
+ }
17
+
18
+ export async function GET() {
19
+ try {
20
+ const report = await scanAllSources(getAgentDir());
21
+ return NextResponse.json({
22
+ success: true,
23
+ data: {
24
+ sessions: report.summaries.map(publicSummary),
25
+ errors: report.errors,
26
+ imported: report.imported,
27
+ sources: IMPORT_SOURCES,
28
+ },
29
+ });
30
+ } catch (error) {
31
+ return NextResponse.json({ success: false, error: error instanceof Error ? error.message : String(error) }, { status: 500 });
32
+ }
33
+ }
34
+
35
+ export async function POST(req: Request) {
36
+ let body: unknown;
37
+ try {
38
+ body = await req.json();
39
+ } catch {
40
+ return NextResponse.json({ success: false, error: "invalid JSON body" }, { status: 400 });
41
+ }
42
+ if (!body || typeof body !== "object" || Array.isArray(body)) {
43
+ return NextResponse.json({ success: false, error: "expected an object body" }, { status: 400 });
44
+ }
45
+ const { sessions, fallbackCwd } = body as { sessions?: unknown; fallbackCwd?: unknown };
46
+ if (!Array.isArray(sessions)) return NextResponse.json({ success: false, error: "sessions must be an array" }, { status: 400 });
47
+ if (!sessions.length) return NextResponse.json({ success: false, error: "nothing selected" }, { status: 400 });
48
+ if (sessions.length > MAX_SELECTION) return NextResponse.json({ success: false, error: `too many sessions (max ${MAX_SELECTION})` }, { status: 400 });
49
+ if (fallbackCwd !== undefined && (typeof fallbackCwd !== "string" || fallbackCwd.length > 4096)) {
50
+ return NextResponse.json({ success: false, error: "invalid fallbackCwd" }, { status: 400 });
51
+ }
52
+
53
+ // 只接受 {source, externalId}:服务端按来源重新扫描定位,客户端给的路径一律不采信
54
+ const selection: ImportSelection[] = [];
55
+ for (const raw of sessions) {
56
+ if (!raw || typeof raw !== "object") return NextResponse.json({ success: false, error: "invalid selection entry" }, { status: 400 });
57
+ const { source, externalId } = raw as { source?: unknown; externalId?: unknown };
58
+ if (typeof source !== "string" || !IMPORT_SOURCES.includes(source as ImportSource)) {
59
+ return NextResponse.json({ success: false, error: `unknown source: ${String(source)}` }, { status: 400 });
60
+ }
61
+ if (typeof externalId !== "string" || !externalId || externalId.length > 400) {
62
+ return NextResponse.json({ success: false, error: "invalid externalId" }, { status: 400 });
63
+ }
64
+ selection.push({ source: source as ImportSource, externalId });
65
+ }
66
+
67
+ try {
68
+ const report = await importSessions(selection, { agentDir: getAgentDir(), fallbackCwd: typeof fallbackCwd === "string" ? fallbackCwd : undefined });
69
+ if (report.workspaces.length) await registerCwds(report.workspaces);
70
+ return NextResponse.json({ success: true, data: report });
71
+ } catch (error) {
72
+ return NextResponse.json({ success: false, error: error instanceof Error ? error.message : String(error) }, { status: 500 });
73
+ }
74
+ }