@rexvane/piweb 0.3.16 → 0.3.17

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 (288) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +8 -11
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +6 -6
  5. package/.next/react-loadable-manifest.json +4 -16
  6. package/.next/required-server-files.js +1 -3
  7. package/.next/required-server-files.json +1 -3
  8. package/.next/routes-manifest.json +0 -20
  9. package/.next/server/app/_global-error/page.js +2 -2
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +4 -7
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -5
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  23. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  24. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agent/[id]/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  28. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  29. package/.next/server/app/api/agent/new/route.js +1 -1
  30. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  31. package/.next/server/app/api/config/route.js +1 -1
  32. package/.next/server/app/api/config/route.js.nft.json +1 -1
  33. package/.next/server/app/api/files/route.js +1 -1
  34. package/.next/server/app/api/files/route.js.nft.json +1 -1
  35. package/.next/server/app/api/git/route.js +2 -2
  36. package/.next/server/app/api/git/route.js.nft.json +1 -1
  37. package/.next/server/app/api/growth/route.js +1 -1
  38. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  39. package/.next/server/app/api/health/route.js +1 -1
  40. package/.next/server/app/api/models/route.js +1 -1
  41. package/.next/server/app/api/models/route.js.nft.json +1 -1
  42. package/.next/server/app/api/pi-settings/route.js +1 -1
  43. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  44. package/.next/server/app/api/plugins/route.js +1 -1
  45. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  46. package/.next/server/app/api/prompts/route.js +1 -1
  47. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  48. package/.next/server/app/api/security/route.js +1 -1
  49. package/.next/server/app/api/security/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  52. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  53. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/sessions/import/route.js +3 -3
  55. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
  56. package/.next/server/app/api/sessions/route.js +1 -1
  57. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  58. package/.next/server/app/api/skills/route.js +2 -2
  59. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  60. package/.next/server/app/api/update/route.js +2 -2
  61. package/.next/server/app/api/update/route.js.nft.json +1 -1
  62. package/.next/server/app/api/version/route.js +1 -1
  63. package/.next/server/app/api/version/route.js.nft.json +1 -1
  64. package/.next/server/app/api/web-auth/route.js +1 -1
  65. package/.next/server/app/api/workspaces/route.js +1 -1
  66. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  67. package/.next/server/app/icon.svg/route.js +1 -1
  68. package/.next/server/app/index.html +1 -1
  69. package/.next/server/app/index.rsc +6 -9
  70. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -7
  71. package/.next/server/app/index.segments/_full.segment.rsc +6 -9
  72. package/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  73. package/.next/server/app/login/page.js +1 -1
  74. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  75. package/.next/server/app/login.html +1 -1
  76. package/.next/server/app/login.rsc +5 -8
  77. package/.next/server/app/login.segments/_full.segment.rsc +5 -8
  78. package/.next/server/app/login.segments/_tree.segment.rsc +2 -5
  79. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -6
  80. package/.next/server/app/page.js +1 -1
  81. package/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app-paths-manifest.json +8 -11
  83. package/.next/server/chunks/496.js +1 -1
  84. package/.next/server/chunks/532.js +1 -1
  85. package/.next/server/chunks/686.js +4 -8
  86. package/.next/server/middleware-build-manifest.js +1 -1
  87. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  88. package/.next/server/pages/404.html +1 -1
  89. package/.next/server/pages/500.html +1 -1
  90. package/.next/server/server-reference-manifest.json +1 -1
  91. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +1 -0
  92. package/.next/static/chunks/2716.93be8ad5c970c516.js +1 -0
  93. package/.next/static/chunks/4632.112d2e893d48d188.js +1 -0
  94. package/.next/static/chunks/4673.c1fb1580efc6ace7.js +1 -0
  95. package/.next/static/chunks/4686-f4a037d609cea3f2.js +1 -0
  96. package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.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/page-b51087831582ee37.js +1 -0
  121. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +1 -0
  122. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +1 -0
  123. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +1 -0
  124. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +1 -0
  125. package/.next/static/chunks/webpack-c31263fd83d75ce6.js +1 -0
  126. package/.next/static/css/850c2fd130ffa2fc.css +1 -0
  127. package/.next/static/zsynuO_9Kx6nrXgkTUJ04/_buildManifest.js +1 -0
  128. package/.next/types/routes.d.ts +1 -4
  129. package/.next/types/validator.ts +0 -27
  130. package/README.md +17 -29
  131. package/assets/archive.jpg +0 -0
  132. package/assets/growth-1.jpg +0 -0
  133. package/assets/growth-2.jpg +0 -0
  134. package/assets/import.jpg +0 -0
  135. package/assets/main.jpg +0 -0
  136. package/assets/outline.jpg +0 -0
  137. package/assets/prompts-1.jpg +0 -0
  138. package/assets/prompts-2.jpg +0 -0
  139. package/assets/providers-1.jpg +0 -0
  140. package/assets/providers-2.jpg +0 -0
  141. package/assets/providers-3.jpg +0 -0
  142. package/assets/trace-1.jpg +0 -0
  143. package/assets/trace-2.png +0 -0
  144. package/assets/trace-3.png +0 -0
  145. package/assets/trace-4.png +0 -0
  146. package/assets/viewer-1.jpg +0 -0
  147. package/assets/viewer-2.jpg +0 -0
  148. package/bin/pi.js +50 -0
  149. package/next.config.ts +32 -7
  150. package/package.json +4 -9
  151. package/scripts/launcher.mjs +1 -1
  152. package/scripts/pick-folder.ps1 +2 -11
  153. package/scripts/release.mjs +31 -11
  154. package/scripts/verify-package.mjs +0 -53
  155. package/src/app/api/config/route.ts +1 -4
  156. package/src/app/api/growth/route.ts +14 -14
  157. package/src/app/api/models/route.ts +2 -1
  158. package/src/app/api/security/route.ts +3 -8
  159. package/src/app/api/update/route.ts +2 -8
  160. package/src/app/globals.css +90 -777
  161. package/src/app/layout.tsx +6 -13
  162. package/src/components/AppShell.tsx +229 -521
  163. package/src/components/ChatInput.tsx +26 -153
  164. package/src/components/ChatWindow.tsx +231 -51
  165. package/src/components/ContextMeter.tsx +17 -11
  166. package/src/components/FileViewer.tsx +11 -10
  167. package/src/components/GitPanel.tsx +11 -13
  168. package/src/components/ModelSelector.tsx +6 -19
  169. package/src/components/PiMark.tsx +38 -5
  170. package/src/components/ProjectPanel.tsx +111 -95
  171. package/src/components/PromptPanel.tsx +51 -132
  172. package/src/components/SessionImportSection.tsx +37 -53
  173. package/src/components/SessionSidebar.tsx +57 -159
  174. package/src/components/SettingsPanel.tsx +193 -330
  175. package/src/components/icons.tsx +0 -23
  176. package/src/hooks/useGrowth.ts +123 -156
  177. package/src/hooks/usePiWeb.ts +15 -122
  178. package/src/i18n.tsx +42 -98
  179. package/src/lib/agent-manager.ts +21 -187
  180. package/src/lib/command-validation.ts +1 -9
  181. package/src/lib/growth-service.ts +390 -166
  182. package/src/lib/growth-tracker.ts +64 -264
  183. package/src/lib/growth-turns.ts +31 -1
  184. package/src/lib/models/model-scope.ts +15 -0
  185. package/src/lib/models-service.ts +16 -0
  186. package/src/lib/pi-settings.ts +7 -0
  187. package/src/lib/pi.ts +2 -3
  188. package/src/lib/session-import/claude.ts +2 -13
  189. package/src/lib/session-import/codex.ts +8 -44
  190. package/src/lib/session-import/files.ts +0 -14
  191. package/src/lib/session-import/grok.ts +24 -54
  192. package/src/lib/session-import/index.ts +0 -5
  193. package/src/lib/session-import/types.ts +0 -12
  194. package/src/lib/session-import/writer.ts +3 -8
  195. package/src/lib/skills-service.ts +9 -16
  196. package/src/lib/theme.ts +1 -68
  197. package/src/lib/trajectory.ts +0 -1
  198. package/src/lib/types.ts +27 -36
  199. package/tsconfig.json +2 -1
  200. package/.next/server/app/api/swarm/[id]/route.js +0 -1
  201. package/.next/server/app/api/swarm/[id]/route.js.nft.json +0 -1
  202. package/.next/server/app/api/swarm/[id]/route_client-reference-manifest.js +0 -1
  203. package/.next/server/app/api/swarm/route.js +0 -1
  204. package/.next/server/app/api/swarm/route.js.nft.json +0 -1
  205. package/.next/server/app/api/swarm/route_client-reference-manifest.js +0 -1
  206. package/.next/server/app/api/tests/route.js +0 -2
  207. package/.next/server/app/api/tests/route.js.nft.json +0 -1
  208. package/.next/server/app/api/tests/route_client-reference-manifest.js +0 -1
  209. package/.next/server/chunks/757.js +0 -1
  210. package/.next/server/chunks/775.js +0 -3
  211. package/.next/static/0t1jBUAuVaTFTXxRyIo3q/_buildManifest.js +0 -1
  212. package/.next/static/chunks/2608.43c58236c9cce8e6.js +0 -1
  213. package/.next/static/chunks/2716.4ec42df1d51354c9.js +0 -1
  214. package/.next/static/chunks/4632.62139b565b657aac.js +0 -1
  215. package/.next/static/chunks/4673.7796104395deb8d7.js +0 -1
  216. package/.next/static/chunks/4686-17f21a006739a596.js +0 -1
  217. package/.next/static/chunks/7577.10af9bb661652da8.js +0 -1
  218. package/.next/static/chunks/8866.38ec4ac4ee5a1b74.js +0 -1
  219. package/.next/static/chunks/app/_global-error/page-5148173b3f55e415.js +0 -1
  220. package/.next/static/chunks/app/api/agent/[id]/events/route-5148173b3f55e415.js +0 -1
  221. package/.next/static/chunks/app/api/agent/[id]/route-5148173b3f55e415.js +0 -1
  222. package/.next/static/chunks/app/api/agent/[id]/tree/route-5148173b3f55e415.js +0 -1
  223. package/.next/static/chunks/app/api/agent/new/route-5148173b3f55e415.js +0 -1
  224. package/.next/static/chunks/app/api/config/route-5148173b3f55e415.js +0 -1
  225. package/.next/static/chunks/app/api/files/route-5148173b3f55e415.js +0 -1
  226. package/.next/static/chunks/app/api/git/route-5148173b3f55e415.js +0 -1
  227. package/.next/static/chunks/app/api/growth/route-5148173b3f55e415.js +0 -1
  228. package/.next/static/chunks/app/api/health/route-5148173b3f55e415.js +0 -1
  229. package/.next/static/chunks/app/api/models/route-5148173b3f55e415.js +0 -1
  230. package/.next/static/chunks/app/api/pi-settings/route-5148173b3f55e415.js +0 -1
  231. package/.next/static/chunks/app/api/plugins/route-5148173b3f55e415.js +0 -1
  232. package/.next/static/chunks/app/api/prompts/route-5148173b3f55e415.js +0 -1
  233. package/.next/static/chunks/app/api/security/route-5148173b3f55e415.js +0 -1
  234. package/.next/static/chunks/app/api/sessions/[id]/export/route-5148173b3f55e415.js +0 -1
  235. package/.next/static/chunks/app/api/sessions/[id]/route-5148173b3f55e415.js +0 -1
  236. package/.next/static/chunks/app/api/sessions/import/route-5148173b3f55e415.js +0 -1
  237. package/.next/static/chunks/app/api/sessions/route-5148173b3f55e415.js +0 -1
  238. package/.next/static/chunks/app/api/skills/route-5148173b3f55e415.js +0 -1
  239. package/.next/static/chunks/app/api/swarm/[id]/route-5148173b3f55e415.js +0 -1
  240. package/.next/static/chunks/app/api/swarm/route-5148173b3f55e415.js +0 -1
  241. package/.next/static/chunks/app/api/tests/route-5148173b3f55e415.js +0 -1
  242. package/.next/static/chunks/app/api/update/route-5148173b3f55e415.js +0 -1
  243. package/.next/static/chunks/app/api/version/route-5148173b3f55e415.js +0 -1
  244. package/.next/static/chunks/app/api/web-auth/route-5148173b3f55e415.js +0 -1
  245. package/.next/static/chunks/app/api/workspaces/route-5148173b3f55e415.js +0 -1
  246. package/.next/static/chunks/app/page-14379b8060d5cf07.js +0 -1
  247. package/.next/static/chunks/next/dist/client/components/builtin/app-error-5148173b3f55e415.js +0 -1
  248. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-5148173b3f55e415.js +0 -1
  249. package/.next/static/chunks/next/dist/client/components/builtin/not-found-5148173b3f55e415.js +0 -1
  250. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5148173b3f55e415.js +0 -1
  251. package/.next/static/chunks/webpack-d1a69ad9edb38b11.js +0 -1
  252. package/.next/static/css/d0a0162cb481abe8.css +0 -1
  253. package/.next/types/app/api/swarm/[id]/route.ts +0 -353
  254. package/.next/types/app/api/swarm/route.ts +0 -353
  255. package/.next/types/app/api/tests/route.ts +0 -353
  256. package/assets/archive.png +0 -0
  257. package/assets/growth-1.png +0 -0
  258. package/assets/growth-2.png +0 -0
  259. package/assets/import.png +0 -0
  260. package/assets/main.png +0 -0
  261. package/assets/outline.png +0 -0
  262. package/assets/prompts-1.png +0 -0
  263. package/assets/prompts-2.png +0 -0
  264. package/assets/providers-1.png +0 -0
  265. package/assets/providers-2.png +0 -0
  266. package/assets/providers-3.png +0 -0
  267. package/assets/trace-1.png +0 -0
  268. package/assets/viewer-1.png +0 -0
  269. package/assets/viewer-2.png +0 -0
  270. package/scripts/managed-niubash-assets.mjs +0 -146
  271. package/scripts/prepare-niubash-packages.mjs +0 -182
  272. package/scripts/run-test-file.mjs +0 -34
  273. package/scripts/smoke-managed-niubash.mjs +0 -62
  274. package/scripts/verify-release-config.mjs +0 -24
  275. package/src/app/api/swarm/[id]/route.ts +0 -28
  276. package/src/app/api/swarm/route.ts +0 -24
  277. package/src/app/api/tests/route.ts +0 -27
  278. package/src/components/SwarmCoordinatorPod.tsx +0 -1021
  279. package/src/components/TestInspectorPod.tsx +0 -549
  280. package/src/lib/delegation.ts +0 -93
  281. package/src/lib/growth-rounds.ts +0 -84
  282. package/src/lib/managed-niubash.ts +0 -231
  283. package/src/lib/runtime-activity.ts +0 -27
  284. package/src/lib/session-import/lock.ts +0 -25
  285. package/src/lib/swarm-service.ts +0 -371
  286. package/src/lib/test-run-service.ts +0 -122
  287. package/src/lib/workflow.ts +0 -55
  288. /package/.next/static/{0t1jBUAuVaTFTXxRyIo3q → zsynuO_9Kx6nrXgkTUJ04}/_ssgManifest.js +0 -0
@@ -1,353 +0,0 @@
1
- // File: /home/runner/work/PiWeb/PiWeb/src/app/api/tests/route.ts
2
- import * as entry from '../../../../../src/app/api/tests/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/tests/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__'
Binary file
Binary file
Binary file
package/assets/import.png DELETED
Binary file
package/assets/main.png DELETED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,146 +0,0 @@
1
- import crypto from "node:crypto";
2
- import fs from "node:fs";
3
- import path from "node:path";
4
-
5
- export const NIUBASH_VERSION = "1.1.4";
6
- export const NIUBASH_TAG = `v${NIUBASH_VERSION}`;
7
- export const NIUBASH_DISTRIBUTION_VERSION = `${NIUBASH_VERSION}-piweb.0`;
8
- export const NIUBASH_REPOSITORY = "https://github.com/unixwin/niubash";
9
-
10
- export const MANAGED_NIUBASH_ASSETS = Object.freeze({
11
- x64: Object.freeze({
12
- arch: "x64",
13
- machine: 0x8664,
14
- packageName: "@rexvane/piweb-niubash-win32-x64",
15
- directory: "piweb-niubash-win32-x64",
16
- asset: "niubash-v1.1.4-win-x64.zip",
17
- sha256: "9f543634288a316f7ed8e5a76ff794eca402cb21e74b8f8a551daffafde162f5",
18
- }),
19
- arm64: Object.freeze({
20
- arch: "arm64",
21
- machine: 0xaa64,
22
- packageName: "@rexvane/piweb-niubash-win32-arm64",
23
- directory: "piweb-niubash-win32-arm64",
24
- asset: "niubash-v1.1.4-win-arm64.zip",
25
- sha256: "77e98ba8d7f6be70c35388bcc28bdbc883c06bcaafffbe186a88788ad32ccf00",
26
- }),
27
- });
28
-
29
- export const NIUBASH_LICENSES = Object.freeze([
30
- Object.freeze({
31
- filename: "NIUBASH.txt",
32
- url: "https://raw.githubusercontent.com/unixwin/niubash/v1.1.4/LICENSE",
33
- sha256: "1290aae99e71239ee3154e7847830e49e7a36c758fa6d659d73fa752dc9f81c8",
34
- }),
35
- Object.freeze({
36
- filename: "RUBASH.txt",
37
- url: "https://raw.githubusercontent.com/unixwin/rubash/8b81c7501646/LICENSE",
38
- sha256: "e426a75a20633f3088da22aef61a5a44d06f1f884c600f6011d00702c3989079",
39
- }),
40
- Object.freeze({
41
- filename: "WINUXCMD.txt",
42
- url: "https://raw.githubusercontent.com/unixwin/WinuxCmd/v1.0.8/LICENSE",
43
- sha256: "8ffc4ed56f5e6ab8183a7ece2e3aa6ea4800b0a4e8170d11bd60856f2dd760f3",
44
- }),
45
- ]);
46
-
47
- export function niubashAssetUrl(asset) {
48
- return `${NIUBASH_REPOSITORY}/releases/download/${NIUBASH_TAG}/${asset.asset}`;
49
- }
50
-
51
- export function sha256(data) {
52
- return crypto.createHash("sha256").update(data).digest("hex");
53
- }
54
-
55
- export function sha256File(filename) {
56
- return sha256(fs.readFileSync(filename));
57
- }
58
-
59
- export function listFiles(root) {
60
- const files = [];
61
- const visit = (directory, prefix = "") => {
62
- for (const entry of fs.readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
63
- const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
64
- const absolute = path.join(directory, entry.name);
65
- if (entry.isDirectory()) visit(absolute, relative);
66
- else if (entry.isFile()) files.push(relative);
67
- else throw new Error(`managed niubash runtime contains an unsupported entry: ${relative}`);
68
- }
69
- };
70
- visit(root);
71
- return files;
72
- }
73
-
74
- export function readPeMachine(filename) {
75
- const data = fs.readFileSync(filename);
76
- if (data.length < 64 || data[0] !== 0x4d || data[1] !== 0x5a) throw new Error(`${filename} is not a PE executable`);
77
- const peOffset = data.readUInt32LE(0x3c);
78
- if (peOffset + 6 > data.length || data.toString("ascii", peOffset, peOffset + 4) !== "PE\0\0") {
79
- throw new Error(`${filename} has an invalid PE header`);
80
- }
81
- return data.readUInt16LE(peOffset + 4);
82
- }
83
-
84
- function readJson(filename) {
85
- return JSON.parse(fs.readFileSync(filename, "utf8"));
86
- }
87
-
88
- function assertEqual(actual, expected, label) {
89
- if (actual !== expected) throw new Error(`${label}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
90
- }
91
-
92
- /** Validate a prepared source package or an unpacked npm tarball. */
93
- export function validateManagedNiubashPackage(packageRoot, asset, { allowExtraRuntimeFiles = true } = {}) {
94
- const packageInfo = readJson(path.join(packageRoot, "package.json"));
95
- assertEqual(packageInfo.name, asset.packageName, "managed niubash package name");
96
- assertEqual(packageInfo.version, NIUBASH_DISTRIBUTION_VERSION, "managed niubash package version");
97
- if (!Array.isArray(packageInfo.os) || packageInfo.os.length !== 1 || packageInfo.os[0] !== "win32") {
98
- throw new Error(`${asset.packageName} must be restricted to os=win32`);
99
- }
100
- if (!Array.isArray(packageInfo.cpu) || packageInfo.cpu.length !== 1 || packageInfo.cpu[0] !== asset.arch) {
101
- throw new Error(`${asset.packageName} must be restricted to cpu=${asset.arch}`);
102
- }
103
-
104
- const runtime = path.join(packageRoot, "runtime");
105
- if (!fs.existsSync(path.join(runtime, "niu.exe"))) {
106
- throw new Error(`${asset.packageName} has no prepared runtime; run \`node scripts/prepare-niubash-packages.mjs\` before packing/publishing`);
107
- }
108
- const manifest = readJson(path.join(packageRoot, "runtime-manifest.json"));
109
- assertEqual(manifest.schema, 1, "managed niubash manifest schema");
110
- assertEqual(manifest.source?.repository, NIUBASH_REPOSITORY, "managed niubash source repository");
111
- assertEqual(manifest.source?.tag, NIUBASH_TAG, "managed niubash source tag");
112
- assertEqual(manifest.source?.asset, asset.asset, "managed niubash source asset");
113
- assertEqual(manifest.source?.sha256, asset.sha256, "managed niubash source SHA-256");
114
- if (!manifest.files || typeof manifest.files !== "object" || Array.isArray(manifest.files)) {
115
- throw new Error(`${asset.packageName} runtime manifest has no file map`);
116
- }
117
- const expectedFiles = Object.keys(manifest.files);
118
- if (expectedFiles.length < 300) throw new Error(`${asset.packageName} runtime is incomplete (${expectedFiles.length} files)`);
119
- for (const relative of expectedFiles) {
120
- if (!relative || relative.includes("\\") || path.posix.isAbsolute(relative) || relative.split("/").includes("..")) {
121
- throw new Error(`${asset.packageName} runtime manifest contains an unsafe path: ${relative}`);
122
- }
123
- const filename = path.join(runtime, ...relative.split("/"));
124
- const stat = fs.statSync(filename);
125
- if (!stat.isFile()) throw new Error(`${asset.packageName} runtime entry is not a file: ${relative}`);
126
- assertEqual(sha256File(filename), manifest.files[relative], `${asset.packageName} hash for ${relative}`);
127
- }
128
- const actualFiles = listFiles(runtime);
129
- const extra = actualFiles.filter((file) => !(file in manifest.files));
130
- if (!allowExtraRuntimeFiles && extra.length > 0) {
131
- throw new Error(
132
- `${asset.packageName} runtime has ${extra.length} files not in the signed manifest (niubash self-activates command links on first run). Re-run \`node scripts/prepare-niubash-packages.mjs\` before packing. First extra: ${extra[0]}`,
133
- );
134
- }
135
-
136
- for (const required of ["niu.exe", "winuxcmd/usr/bin/winuxcmd.exe", "bundles/oh-my-niu/bundle.toml"]) {
137
- if (!expectedFiles.includes(required)) throw new Error(`${asset.packageName} is missing ${required}`);
138
- }
139
- for (const executable of ["niu.exe", "winuxcmd/usr/bin/winuxcmd.exe"]) {
140
- assertEqual(readPeMachine(path.join(runtime, ...executable.split("/"))), asset.machine, `${asset.packageName} PE machine for ${executable}`);
141
- }
142
- for (const license of NIUBASH_LICENSES) {
143
- assertEqual(sha256File(path.join(packageRoot, "licenses", license.filename)), license.sha256, `${asset.packageName} license ${license.filename}`);
144
- }
145
- return { files: expectedFiles.length, runtime };
146
- }