pi-cloud 2.0.0

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 (199) hide show
  1. package/.env.example +115 -0
  2. package/CHANGELOG.md +177 -0
  3. package/LICENSE +201 -0
  4. package/README.md +134 -0
  5. package/README.zh-CN.md +134 -0
  6. package/THIRD_PARTY_NOTICES +13 -0
  7. package/bin/pi-cloud.mjs +248 -0
  8. package/bin/runtime-config.mjs +11 -0
  9. package/client/dist/.vite/manifest.json +1553 -0
  10. package/client/dist/android-chrome-192x192.png +0 -0
  11. package/client/dist/android-chrome-512x512.png +0 -0
  12. package/client/dist/apple-touch-icon.png +0 -0
  13. package/client/dist/assets/EditorPanel-C4j_LnbI.js +968 -0
  14. package/client/dist/assets/EditorPanel-qAJ9i_Hs.css +1 -0
  15. package/client/dist/assets/GitHistoryView-BZF9vYG5.css +1 -0
  16. package/client/dist/assets/GitHistoryView-i__uu43I.js +2 -0
  17. package/client/dist/assets/MemoryCenter-BthPz7a1.css +1 -0
  18. package/client/dist/assets/MemoryCenter-DOvz1FIy.js +1 -0
  19. package/client/dist/assets/MesloLGMNerdFontMono-Regular-COOxA6qy.ttf +0 -0
  20. package/client/dist/assets/PhCaretLeft.vue-C3HxQ-jr.js +1 -0
  21. package/client/dist/assets/SettingsDialog-BTyTnZYM.css +1 -0
  22. package/client/dist/assets/SettingsDialog-VlpollL1.js +2 -0
  23. package/client/dist/assets/TaskQueuePanel-Bnvgy4cm.css +1 -0
  24. package/client/dist/assets/TaskQueuePanel-DPnDhZFb.js +1 -0
  25. package/client/dist/assets/TerminalPanel-BQhGwCE5.js +1 -0
  26. package/client/dist/assets/TerminalPanel-DmemnVxo.css +1 -0
  27. package/client/dist/assets/abap-DLDM7-KI.js +1 -0
  28. package/client/dist/assets/abnfDiagram-VCTEODGH-DyGBNBbN.js +1 -0
  29. package/client/dist/assets/apex-DNDY2TF8.js +1 -0
  30. package/client/dist/assets/arc-B_21hOEg.js +1 -0
  31. package/client/dist/assets/architectureDiagram-5GKGNRK7-CjyAJ-2z.js +36 -0
  32. package/client/dist/assets/azcli-Y6nb8tq_.js +1 -0
  33. package/client/dist/assets/bat-BwHxbl9M.js +1 -0
  34. package/client/dist/assets/bicep-CFznDFnq.js +2 -0
  35. package/client/dist/assets/blockDiagram-NRAW4CY4-CmrEp6Fe.js +129 -0
  36. package/client/dist/assets/c4Diagram-UCG6FXSJ-DfT2xU1s.js +38 -0
  37. package/client/dist/assets/cameligo-Bf6VGUru.js +1 -0
  38. package/client/dist/assets/channel-CROBmx9n.js +1 -0
  39. package/client/dist/assets/chunk-2Q5K7J3B-BVEJoy95.js +1 -0
  40. package/client/dist/assets/chunk-5VM5RSS4-AYOc2H0F.js +15 -0
  41. package/client/dist/assets/chunk-F27PBJKO-CAdIcM4C.js +1 -0
  42. package/client/dist/assets/chunk-G27WJ6UU-Bk4Qjg6Y.js +231 -0
  43. package/client/dist/assets/chunk-JWPE2WC7-u-wi2HbJ.js +1 -0
  44. package/client/dist/assets/chunk-LCL6LL3I-BgicKCMi.js +206 -0
  45. package/client/dist/assets/chunk-POPQ4Y6H-DhJ3_oti.js +1 -0
  46. package/client/dist/assets/chunk-SVP7TREG-B-FKnWYy.js +88 -0
  47. package/client/dist/assets/chunk-XXDRQBXY-Dnsv7iwr.js +1 -0
  48. package/client/dist/assets/classDiagram-DTDB5LWJ-D2KSupgp.js +1 -0
  49. package/client/dist/assets/classDiagram-v2-JRS7N3AN-D2KSupgp.js +1 -0
  50. package/client/dist/assets/clojure-Dnu-v4kV.js +1 -0
  51. package/client/dist/assets/codicon-Brq4_Ui5.ttf +0 -0
  52. package/client/dist/assets/coffee-Bd8akH9Z.js +1 -0
  53. package/client/dist/assets/cose-bilkent-JH36ORCC-DL2lIpOf.js +1 -0
  54. package/client/dist/assets/cpp-BbWJElDN.js +1 -0
  55. package/client/dist/assets/csharp-Co3qMtFm.js +1 -0
  56. package/client/dist/assets/csp-D-4FJmMZ.js +1 -0
  57. package/client/dist/assets/css-DdJfP1eB.js +3 -0
  58. package/client/dist/assets/css.worker-CXZsIV5y.js +97 -0
  59. package/client/dist/assets/cssMode-BcZYukVu.js +1 -0
  60. package/client/dist/assets/cynefin-OW5HDTMX-tZ1QaCp9.js +166 -0
  61. package/client/dist/assets/cynefinDiagram-5FMLGOSQ-GLzVU_pJ.js +62 -0
  62. package/client/dist/assets/cypher-cTPe9QuQ.js +1 -0
  63. package/client/dist/assets/cytoscape.esm-yzknjiTM.js +321 -0
  64. package/client/dist/assets/dagre-3AP2YEHR-B8V1RvVr.js +4 -0
  65. package/client/dist/assets/dart-BOtBlQCF.js +1 -0
  66. package/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  67. package/client/dist/assets/diagram-S7CK7UJ4-MTofUt2F.js +30 -0
  68. package/client/dist/assets/diagram-UQ7AKVKN-Dw6Onbe3.js +41 -0
  69. package/client/dist/assets/diagram-VSXAHHWV-C4WupsI1.js +3 -0
  70. package/client/dist/assets/diagram-VX7I27RA-CF78AvRx.js +24 -0
  71. package/client/dist/assets/diagram-Z3DM3KII-xT7zx4S2.js +24 -0
  72. package/client/dist/assets/dockerfile-BG73LgW2.js +1 -0
  73. package/client/dist/assets/ebnfDiagram-PWID7BFC-zkR-_zOG.js +1 -0
  74. package/client/dist/assets/ecl-BEgZUVRK.js +1 -0
  75. package/client/dist/assets/editor.worker-CRaYpIdo.js +30 -0
  76. package/client/dist/assets/elixir-BkW5O-1t.js +1 -0
  77. package/client/dist/assets/erDiagram-SSCWMZ5O-BzU9E1j8.js +99 -0
  78. package/client/dist/assets/flow9-BeJ5waoc.js +1 -0
  79. package/client/dist/assets/flowDiagram-A5DVABFB-BM-160SB.js +168 -0
  80. package/client/dist/assets/freemarker2-B4PXq-2i.js +3 -0
  81. package/client/dist/assets/fsharp-PahG7c26.js +1 -0
  82. package/client/dist/assets/ganttDiagram-EL5Y4UJY-LVhMiHMo.js +292 -0
  83. package/client/dist/assets/gitGraphDiagram-WWUBYQGX-CYGEpNO-.js +106 -0
  84. package/client/dist/assets/go-acbASCJo.js +1 -0
  85. package/client/dist/assets/graphql-BxJiqAUM.js +1 -0
  86. package/client/dist/assets/handlebars-DleyW4LO.js +1 -0
  87. package/client/dist/assets/hcl-DtV1sZF8.js +1 -0
  88. package/client/dist/assets/html-BJ95-ybC.js +1 -0
  89. package/client/dist/assets/html.worker-Ca87u24v.js +474 -0
  90. package/client/dist/assets/html2canvas.esm-DXEQVQnt.js +5 -0
  91. package/client/dist/assets/htmlMode-Cqq8N0XF.js +1 -0
  92. package/client/dist/assets/index-C1R3qRwd.js +407 -0
  93. package/client/dist/assets/index-D1Z3F2UU.css +1 -0
  94. package/client/dist/assets/index-PSBDlhaw.js +39 -0
  95. package/client/dist/assets/infoDiagram-RXCK75RN-Ctmoz63S.js +2 -0
  96. package/client/dist/assets/ini-Kd9XrMLS.js +1 -0
  97. package/client/dist/assets/init-Gi6I4Gst.js +1 -0
  98. package/client/dist/assets/ishikawaDiagram-5VMMS53U-DiWG9VHU.js +70 -0
  99. package/client/dist/assets/java-CXBNlu9o.js +1 -0
  100. package/client/dist/assets/javascript-BIGigzp1.js +1 -0
  101. package/client/dist/assets/journeyDiagram-EYS64GPL-CImdI3K_.js +139 -0
  102. package/client/dist/assets/json.worker-C5PEkLU0.js +62 -0
  103. package/client/dist/assets/jsonMode-l6_K9bFf.js +7 -0
  104. package/client/dist/assets/julia-cl7-CwDS.js +1 -0
  105. package/client/dist/assets/kanban-definition-3QL26DDD-CSSranPL.js +89 -0
  106. package/client/dist/assets/katex-HP8lGamR.js +257 -0
  107. package/client/dist/assets/kotlin-s7OhZKlX.js +1 -0
  108. package/client/dist/assets/layout-CE5PddK3.js +1 -0
  109. package/client/dist/assets/less-9HpZscsL.js +2 -0
  110. package/client/dist/assets/lexon-OrD6JF1K.js +1 -0
  111. package/client/dist/assets/linear-CkzMiZL-.js +1 -0
  112. package/client/dist/assets/liquid-C8hVjUZv.js +1 -0
  113. package/client/dist/assets/lspLanguageFeatures-ZfiCKJ_J.js +4 -0
  114. package/client/dist/assets/lua-Cyyb5UIc.js +1 -0
  115. package/client/dist/assets/m3-B8OfTtLu.js +1 -0
  116. package/client/dist/assets/markdown-BFxVWTOG.js +1 -0
  117. package/client/dist/assets/mdx-DWmYYep4.js +1 -0
  118. package/client/dist/assets/mermaid.core-BlcsAN4s.js +308 -0
  119. package/client/dist/assets/mindmap-definition-FBJOCRG2-D01B1gH8.js +96 -0
  120. package/client/dist/assets/mips-CiqrrVzr.js +1 -0
  121. package/client/dist/assets/msdax-DmeGPVcC.js +1 -0
  122. package/client/dist/assets/mysql-C_tMU-Nz.js +1 -0
  123. package/client/dist/assets/objective-c-BDtDVThU.js +1 -0
  124. package/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  125. package/client/dist/assets/pascal-vHIfCaH5.js +1 -0
  126. package/client/dist/assets/pascaligo-DtZ0uQbO.js +1 -0
  127. package/client/dist/assets/pdf-DMRcuM1e.js +55 -0
  128. package/client/dist/assets/pdf.worker.min-CHFwMXne.mjs +29 -0
  129. package/client/dist/assets/pegDiagram-XKGWAZYB-DhdSTBt5.js +1 -0
  130. package/client/dist/assets/perl-Ub6l9XKa.js +1 -0
  131. package/client/dist/assets/pgsql-BlNEE0v7.js +1 -0
  132. package/client/dist/assets/php-BBUBE1dy.js +1 -0
  133. package/client/dist/assets/pieDiagram-E7YTZNPT-hVSzmo7b.js +39 -0
  134. package/client/dist/assets/pla-DSh2-awV.js +1 -0
  135. package/client/dist/assets/postiats-CocnycG-.js +1 -0
  136. package/client/dist/assets/powerquery-tScXyioY.js +1 -0
  137. package/client/dist/assets/powershell-COWaemsV.js +1 -0
  138. package/client/dist/assets/protobuf-Brw8urJB.js +2 -0
  139. package/client/dist/assets/pug-8SOpv6rk.js +1 -0
  140. package/client/dist/assets/python-AbIuqkub.js +1 -0
  141. package/client/dist/assets/qsharp-Bw9ernYp.js +1 -0
  142. package/client/dist/assets/quadrantDiagram-AXDQQJYC-CVexQ_Dn.js +7 -0
  143. package/client/dist/assets/r-j7ic8hl3.js +1 -0
  144. package/client/dist/assets/railroadDiagram-O6MQD6OU-BPCMbhAx.js +1 -0
  145. package/client/dist/assets/razor-PLr1HLk0.js +1 -0
  146. package/client/dist/assets/redis-Bu5POkcn.js +1 -0
  147. package/client/dist/assets/redshift-Bs9aos_-.js +1 -0
  148. package/client/dist/assets/requirementDiagram-EFPCY7ZU-EntABUqc.js +84 -0
  149. package/client/dist/assets/restructuredtext-CqXO7rUv.js +1 -0
  150. package/client/dist/assets/ruby-zBfavPgS.js +1 -0
  151. package/client/dist/assets/rust-BzKRNQWT.js +1 -0
  152. package/client/dist/assets/sankeyDiagram-P5KCCOFB-D68oih_M.js +40 -0
  153. package/client/dist/assets/sb-BBc9UKZt.js +1 -0
  154. package/client/dist/assets/scala-D9hQfWCl.js +1 -0
  155. package/client/dist/assets/scheme-BPhDTwHR.js +1 -0
  156. package/client/dist/assets/scss-CBJaRo0y.js +3 -0
  157. package/client/dist/assets/sequenceDiagram-WJ2MYXX4-DWzaT5vI.js +162 -0
  158. package/client/dist/assets/shell-DiJ1NA_G.js +1 -0
  159. package/client/dist/assets/sizeCapture-X5ZJPWSS-HbYBaSbU.js +1 -0
  160. package/client/dist/assets/solidity-Db0IVjzk.js +1 -0
  161. package/client/dist/assets/sophia-CnS9iZB_.js +1 -0
  162. package/client/dist/assets/sparql-CJmd_6j2.js +1 -0
  163. package/client/dist/assets/sql-ClhHkBeG.js +1 -0
  164. package/client/dist/assets/st-CHwy0fLd.js +1 -0
  165. package/client/dist/assets/stateDiagram-HBIQ2CUA-BteRSnYL.js +1 -0
  166. package/client/dist/assets/stateDiagram-v2-4QOOHH4V-CN8Njcij.js +1 -0
  167. package/client/dist/assets/swift-CnmFD0ga.js +1 -0
  168. package/client/dist/assets/swimlanes-XN3QIQJK-BAvVt5mV.js +1 -0
  169. package/client/dist/assets/swimlanesDiagram-VK2B7HYN-p55moRoN.js +8 -0
  170. package/client/dist/assets/systemverilog-Bs9z6M-B.js +1 -0
  171. package/client/dist/assets/tcl-Dm6ycUr_.js +1 -0
  172. package/client/dist/assets/timeline-definition-24CTP7MA-D6yKUiYl.js +120 -0
  173. package/client/dist/assets/ts.worker-Y8i9TNcE.js +67722 -0
  174. package/client/dist/assets/tsMode-DrakxHLR.js +11 -0
  175. package/client/dist/assets/twig-Csy3S7wG.js +1 -0
  176. package/client/dist/assets/typescript-DcMOCMAD.js +1 -0
  177. package/client/dist/assets/typespec-Btyra-wh.js +1 -0
  178. package/client/dist/assets/useTerminal-DDGTF8rc.css +1 -0
  179. package/client/dist/assets/useTerminal-Dhk5K03J.js +20 -0
  180. package/client/dist/assets/vb-Db0cS2oM.js +1 -0
  181. package/client/dist/assets/vennDiagram-4TSXK5OY-CGU61Pyq.js +34 -0
  182. package/client/dist/assets/wardleyDiagram-VM6X3IG4-BrTe4Lxv.js +78 -0
  183. package/client/dist/assets/wgsl-BTesnYfV.js +298 -0
  184. package/client/dist/assets/workers-CqVatS52.js +1 -0
  185. package/client/dist/assets/xml-xUSiNagm.js +1 -0
  186. package/client/dist/assets/xychartDiagram-S5SC5T6Z-CnMmHAmD.js +7 -0
  187. package/client/dist/assets/yaml-CSavWraE.js +1 -0
  188. package/client/dist/favicon-16x16.ico +0 -0
  189. package/client/dist/favicon-16x16.png +0 -0
  190. package/client/dist/favicon-32x32.ico +0 -0
  191. package/client/dist/favicon-32x32.png +0 -0
  192. package/client/dist/favicon.ico +0 -0
  193. package/client/dist/favicon.svg +10 -0
  194. package/client/dist/icon.svg +17 -0
  195. package/client/dist/index.html +43 -0
  196. package/client/dist/site.webmanifest +19 -0
  197. package/client/src/assets/fonts/MesloLGMNerdFontMono-Regular.LICENSE +126 -0
  198. package/package.json +74 -0
  199. package/server/dist/index.js +15143 -0
package/.env.example ADDED
@@ -0,0 +1,115 @@
1
+ # =============================================================================
2
+ # Server
3
+ # =============================================================================
4
+
5
+ # Backend bind address and port.
6
+ # For public deployments behind nginx, keep HOST bound to localhost.
7
+ HOST=127.0.0.1
8
+ PORT=3000
9
+
10
+ # Frontend development server port.
11
+ FRONTEND_PORT=5173
12
+
13
+ # =============================================================================
14
+ # Authentication and sessions
15
+ # =============================================================================
16
+
17
+ PI_CLOUD_AUTH_USERNAME=yourname
18
+
19
+ # Development or simple setups only. Prefer PI_CLOUD_AUTH_PASSWORD_HASH in production.
20
+ PI_CLOUD_AUTH_PASSWORD=change-me-for-dev-only
21
+ # PI_CLOUD_AUTH_PASSWORD_HASH=$scrypt$ln=15,r=8,p=3$...
22
+
23
+ # Active sessions renew before the idle timeout, up to the absolute maximum lifetime.
24
+ PI_CLOUD_SESSION_TTL_HOURS=8
25
+ PI_CLOUD_SESSION_MAX_HOURS=720
26
+
27
+ # Set true only when the app is served exclusively over HTTPS.
28
+ PI_CLOUD_COOKIE_SECURE=false
29
+
30
+ # Enable only when requests always pass through a trusted reverse proxy.
31
+ PI_CLOUD_TRUST_PROXY=false
32
+
33
+ # Emergency 2FA recovery only. Keep false during normal operation.
34
+ SKIP_2FA_VERIFY=false
35
+
36
+
37
+ # =============================================================================
38
+ # Storage, filesystem, and terminal
39
+ # =============================================================================
40
+
41
+ # Custom SQLite database path. Defaults to the user configuration directory.
42
+ # PI_CLOUD_DB_PATH=/home/youruser/.config/pi-cloud/pi-cloud.sqlite
43
+
44
+ # Comma-separated directories the file browser and terminal may access.
45
+ # Defaults to the current user's home directory.
46
+ # PI_CLOUD_ALLOWED_ROOTS=/home/youruser/git/github,/home/youruser/projects
47
+
48
+ # Disable allowed-root checks. Defaults to true on Windows and false on macOS/Linux.
49
+ # PI_CLOUD_DISABLE_PATH_CHECK=false
50
+
51
+ # Allow "Open with system tool" through non-localhost URLs, such as a local nginx hostname.
52
+ # This launches applications on the machine running Pi Cloud.
53
+ PI_CLOUD_ENABLE_SYSTEM_OPEN=false
54
+
55
+ # Terminal shell executable, such as powershell.exe, pwsh.exe, or /bin/zsh.
56
+ # PI_CLOUD_TERMINAL_SHELL=pwsh.exe
57
+
58
+ # Memory extraction/recall policy. Defaults to adaptive-lexical-v1; use legacy to roll back.
59
+ # PI_CLOUD_MEMORY_POLICY=legacy
60
+
61
+
62
+ # =============================================================================
63
+ # AI providers
64
+ # =============================================================================
65
+
66
+ # Comma-separated exact origins permitted for non-loopback local LLM endpoints.
67
+ # Loopback endpoints are allowed by default.
68
+ # PI_CLOUD_LOCAL_LLM_ALLOWED_ORIGINS=http://192.168.1.20:11434,https://llm.example.test
69
+
70
+ # Provider API keys (uncomment as needed).
71
+ # ANTHROPIC_API_KEY=sk-ant-...
72
+ # OPENAI_API_KEY=sk-...
73
+ # GEMINI_API_KEY=...
74
+ # DEEPSEEK_API_KEY=...
75
+ # GROQ_API_KEY=...
76
+ # XIAOMI_API_KEY=...
77
+
78
+ # Azure OpenAI.
79
+ # AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
80
+ # AZURE_OPENAI_API_VERSION=v1
81
+
82
+ # AWS Bedrock.
83
+ # AWS_REGION=us-east-1
84
+ # AWS_PROFILE=default
85
+
86
+
87
+ # =============================================================================
88
+ # Messaging gateways
89
+ # =============================================================================
90
+
91
+ # Optional shared gateway defaults.
92
+ # Configure profile, skillset, model, and allowed folders in Settings > Gateway.
93
+ # PI_CLOUD_GATEWAY_COMMAND_PREFIX=小助理
94
+
95
+ # Feishu/Lark callback.
96
+ # Event subscription URL: https://your-domain/api/gateways/feishu/events
97
+ # PI_CLOUD_FEISHU_APP_ID=cli_xxx
98
+ # PI_CLOUD_FEISHU_APP_SECRET=xxx
99
+ # Verification token is required; encrypt key is required for encrypted callbacks.
100
+ # PI_CLOUD_FEISHU_VERIFICATION_TOKEN=xxx
101
+ # PI_CLOUD_FEISHU_ENCRYPT_KEY=xxx
102
+ # PI_CLOUD_FEISHU_DOMAIN=feishu
103
+
104
+ # WeChat/Weixin (Tencent iLink long-polling, text DMs).
105
+ # Disabled by default; enabling it requires an account ID and token.
106
+ PI_CLOUD_WECHAT_GATEWAY_ENABLED=false
107
+ # PI_CLOUD_WECHAT_ACCOUNT_ID=your-account-id
108
+ # PI_CLOUD_WECHAT_TOKEN=your-bot-token
109
+ # PI_CLOUD_WECHAT_BASE_URL=https://ilinkai.weixin.qq.com
110
+
111
+ # DM policies: pairing, allowlist, open, or disabled.
112
+ # PI_CLOUD_WECHAT_DM_POLICY=pairing
113
+ # PI_CLOUD_WECHAT_ALLOWED_USERS=user_id_1,user_id_2
114
+ # Required only when PI_CLOUD_WECHAT_DM_POLICY=open.
115
+ # PI_CLOUD_WECHAT_ALLOW_ALL_USERS=false
package/CHANGELOG.md ADDED
@@ -0,0 +1,177 @@
1
+ # Changelog
2
+
3
+ All notable changes to Pi Cloud are documented here.
4
+
5
+ ## [2.0.0] - 2026-08-30
6
+
7
+ ### Added
8
+
9
+ - Added persistent PDF annotations with drawing, highlighting, shapes, text, moving, erasing, undo/redo, automatic sidecar saving, and annotated PDF export.
10
+ - Added Markdown-to-PDF downloads and creation of workspace PDF copies that can be annotated.
11
+ - Added custom OpenAI-compatible API providers and Cloudflare Workers AI support, including model discovery and image-capability selection.
12
+ - Added provider authentication status and disconnect controls for locally detected API keys, OAuth sessions, and subscriptions.
13
+ - Added Markdown preview outlines, HTML rendering in Markdown previews, archive content previews, file-type icons, and full-path copying from editor tabs.
14
+ - Added light/dark theme toggle controls and PDF viewport fit controls.
15
+ - Added split diff views, collapsible files, per-file statistics, and expand/collapse controls to commit previews and Git history.
16
+ - Added WeChat account unbinding and country reporting for successful proxy checks.
17
+ - Added a preference to delete sessions without confirmation and reload recovery for stale frontend assets after updates.
18
+
19
+ ### Changed
20
+
21
+ - Renamed Pi WebUI to Pi Cloud, changing the npm package and executable to `pi-cloud`, environment variables to the `PI_CLOUD_` prefix, and default configuration, database, and service names and paths.
22
+ - Recent project history is now stored per agent profile in the server database instead of browser storage.
23
+ - PDF previews now render only nearby pages for improved performance.
24
+
25
+ ### Fixed
26
+
27
+ - Fixed PDF annotation resize handles so dragging them resizes annotations correctly.
28
+ - Hid built-in API-key providers when a custom provider with the same ID overrides them.
29
+ - Fixed session sidebar message counts and stale-asset reload errors.
30
+
31
+ ## [1.0.6] - 2026-08-27
32
+
33
+ ### Added
34
+
35
+ - Added a paginated Git history viewer with commit metadata, change statistics, and per-file diffs.
36
+ - Added PDF previews in the editor with page navigation and zoom controls.
37
+
38
+ ### Changed
39
+
40
+ - The Git changes panel now identifies non-repository folders and disables unavailable Git actions instead of showing a Git command error.
41
+
42
+ ### Fixed
43
+
44
+ - Fixed published npm package dependency metadata to use resolvable versions instead of pnpm catalog references.
45
+ - Prevented the `Ctrl+E` editor shortcut from also triggering keyboard handlers on selected messages.
46
+
47
+ ## [1.0.5] - 2026-08-27
48
+
49
+ ### Added
50
+
51
+ - Added a Git changes panel, shown by default, with changed-file navigation, per-file diffs, and shortcuts for common Git actions.
52
+ - Added collapsible pin groups for organizing, moving, and unpinning agent-profile and review-source sessions.
53
+ - Added a project history tab with last-accessed details, session counts, and confirmed removal of saved session history without deleting project files.
54
+ - Added an option to generate commit messages from and commit only staged changes.
55
+ - Added `PI_CLOUD_ENABLE_SYSTEM_OPEN` for enabling **Open with system tool** through trusted non-localhost URLs.
56
+
57
+ ### Changed
58
+
59
+ - Reduced the initial session page from 30 sessions to 10 and limited pull request status refreshes to the visible page for faster session loading.
60
+ - Lazy-load heavy interface features such as the editor, terminal, settings, memory center, and task queue.
61
+ - Local LLM endpoints outside the loopback interface must now be explicitly allowed with `PI_CLOUD_LOCAL_LLM_ALLOWED_ORIGINS`; endpoint credentials and redirects are rejected.
62
+ - Database schema updates now use tracked, transactional versioned migrations.
63
+
64
+ ### Fixed
65
+
66
+ - Ensured newly created sessions use the explicitly selected agent profile.
67
+ - Improved virtual diff formatting with clearer file headers and correct multi-file navigation and line tracking.
68
+ - Hardened path validation for session relocation and project moves, and stopped the file tree from traversing symlinked directories.
69
+ - Hardened URL and rendered HTML handling, including host validation, heading sanitization, and attribute escaping.
70
+ - Open files safely on Windows without invoking a shell.
71
+
72
+ ## [1.0.4] - 2026-08-23
73
+
74
+ ### Added
75
+
76
+ - Added local LLM endpoint and model discovery/configuration, plus removal controls for local LLM settings and stored API keys.
77
+ - Added unified and split diff views, multi-file diff tabs and navigation, and GitHub-style diff coloring in the editor.
78
+ - Added clickable commit references in chat that open the corresponding commit diff in the editor.
79
+ - Added a resizable message input for review sessions.
80
+ - Added persistent skill preset references for queued tasks.
81
+
82
+ ### Changed
83
+
84
+ - Pinned memories now default to applying only when matched to the current prompt.
85
+
86
+ ### Fixed
87
+
88
+ - Enabled word wrapping for virtual diffs.
89
+ - Corrected directory sort toggle labels in the folder picker.
90
+
91
+ ## [1.0.3] - 2026-08-19
92
+
93
+ ### Added
94
+
95
+ - Added review-session integrations for Devin, Claude Code, and Codex, with source configuration, session search, and transcript viewing.
96
+ - Added secure HTML file previews with sandboxing and support for local page assets.
97
+ - Added new-folder creation to the folder picker.
98
+ - Added an action to move saved sessions to another folder.
99
+
100
+ ### Changed
101
+
102
+ - Improved review transcript rendering, including tool-call details, patch display, output indentation, and PDF export.
103
+
104
+ ### Fixed
105
+
106
+ - Wait for the chat connection before starting tasks in newly opened tabs.
107
+ - Select the correct review session from the compact session rail.
108
+ - Normalize terminal progress output before rendering tool results.
109
+ - Normalize Windows file paths across file links, the editor, and file-tree navigation.
110
+ - Prefer the `origin` remote when resolving GitHub or Gitea integrations, while falling back to other matching remotes.
111
+
112
+ ## [1.0.2] - 2026-08-16
113
+
114
+ ### Added
115
+
116
+ - Added global and per-project prompt customization for AI-generated Git commit messages.
117
+ - Added a shallow-clone option when cloning repositories.
118
+ - Added Mermaid diagram rendering to the Markdown preview.
119
+ - Added modified-time sorting to the folder picker and file tree.
120
+ - Added `pi-cloud --version` and `pi-cloud -v` commands.
121
+
122
+ ### Changed
123
+
124
+ - Generate the complete sample configuration with random login credentials on the first run of a global installation.
125
+ - Replaced Argon2 password hashing with Node.js's built-in scrypt implementation, removing the native Argon2 dependency.
126
+ - Added a favicon to the project website.
127
+
128
+ ### Fixed
129
+
130
+ - Stop panel resize interactions when the browser window loses focus.
131
+ - Include `CHANGELOG.md` in the npm package so the changelog remains available in global installations.
132
+
133
+ ## [1.0.1] - 2026-08-15
134
+
135
+ ### Added
136
+
137
+ - Added a responsive GitHub Pages website with an illustrated feature guide, updated product screenshots, and automated deployment.
138
+ - Added `pi-cloud service restart` support on Linux, macOS, and Windows.
139
+
140
+ ### Changed
141
+
142
+ - Always use Pi Cloud's bundled session auto-rename extension instead of disabling it when an external auto-rename plugin is detected.
143
+ - Upgraded `better-sqlite3` from version 12 to 13 and removed the deprecated `prebuild-install` dependency.
144
+ - Added a GitHub social preview image and refreshed the main interface screenshots.
145
+
146
+ ### Fixed
147
+
148
+ - Respect `PORT` and `HOST` values from `~/.config/pi-cloud/.env` when the CLI starts Pi Cloud, while preserving explicit CLI option precedence.
149
+ - Open home-relative (`~/`) file links from chat in the editor instead of resolving them against the workspace.
150
+ - Open relative links and heading anchors within the Markdown preview instead of navigating to browser routes.
151
+ - Improved user-message link contrast and hover/focus visibility in the light theme.
152
+ - Allow the GitHub Pages workflow to enable Pages during deployment.
153
+
154
+ ## [1.0.0] - 2026-07-23
155
+
156
+ ### Added
157
+
158
+ - **Packaging and deployment** — install with the `pi-cloud` executable, run from source, deploy behind a reverse proxy, and use Apache-2.0 licensing.
159
+ - **Authentication** — protect the WebUI with password/TOTP authentication, renewable sessions, absolute session lifetime, and production cookie settings.
160
+ - **Settings** — manage model defaults, automation model, shortcuts, gateway profiles, skillsets, Git hosting, and session launch preferences.
161
+ - **Workspace tools** — browse files, search workspace paths with `@`, edit code with Monaco, and use an embedded xterm terminal.
162
+ - **Streaming chat** — receive real-time Pi responses over WebSocket with reconnect support, thinking/details controls, and local command result messages.
163
+ - **Session management** — create, resume, rename, compact, summarize, inspect, branch, and navigate session trees from the WebUI.
164
+ - **Multi-tab support** — run independent sessions per browser tab/client.
165
+ - **Model selection** — inspect and change the active model for a session.
166
+ - **Chat composer enhancements** — attach images to chat messages, polish prompts with AI, and choose model/thinking level directly from the composer.
167
+ - **Slash commands** — use built-in commands for Git, sessions, models, skills, summaries, changelog display, and Pi-discovered skill/prompt commands.
168
+ - **Git workflows** — inspect diff/status, create branches, commit, amend, push, pull, open read-only diffs, remember branch selections per project, and generate AI branch names.
169
+ - **Git hosting workflows** — configure Git hosting, create issues and pull requests, check proxies, preserve configured repository ports, and surface pull request status in the session UI.
170
+ - **Pull request authoring** — preview pull requests, generate PR titles and descriptions, push branches, and create PRs from `/pr`.
171
+ - **Project onboarding** — clone repositories from the project picker and open projects or queued tasks in new tabs.
172
+ - **Worktree development** — create inherited worktree sessions for isolated implementation work while preserving the source session context.
173
+ - **Skill preset management** — configure enabled and disabled skills per session, refresh slash-command suggestions after changes, and use `skill:<name>` commands directly from chat.
174
+ - **Memory system** — manage project and global memories with automatic extraction, adaptive recall, recall details, and reusable remembered context.
175
+ - **Task queue and notifications** — queue project tasks, edit tasks, start pending work, track task state, and configure sound notifications.
176
+ - **Gateway integrations** — add Feishu and WeChat gateway support, including pairing, messaging, command aliases, centralized gateway settings, and WeChat image ingestion/decryption.
177
+ - **Agent proxy configuration** — configure proxy environment variables per Pi profile for model/agent traffic.
package/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 xianzhon
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # Pi Cloud
2
+
3
+ English | [简体中文](README.zh-CN.md)
4
+
5
+ A web-based, mobile-friendly interface for the [Pi coding agent](http://pi.dev). It complements the terminal-first CLI with a persistent workspace for agent sessions and development workflows.
6
+
7
+ | Dark theme | Light theme |
8
+ | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
9
+ | ![Pi Cloud main window in dark theme](docs/images/main-window-dark-theme.png) | ![Pi Cloud main window in light theme](docs/images/main-window-white-theme.png) |
10
+
11
+ **[▶ Watch Pi Cloud handle a Git bugfix workflow](https://xianzhon.github.io/pi-cloud-website/assets/videos/demo-git-bugfix-workflow.mp4)**
12
+
13
+ ## Features
14
+
15
+ - **Mobile-friendly access** — use Pi from a desktop, phone, or tablet without needing a local terminal.
16
+ - **Skill control** — configure presets and enable or disable skills per session.
17
+ - **Session management** — search, resume, rename, branch, and run independent sessions in separate tabs.
18
+ - **Task queue** — save and configure tasks, then start them when ready.
19
+ - **Completion notifications** — receive a sound alert and see a bell indicator in the browser tab when a task finishes.
20
+ - **AI-assisted writing** — generate or polish prompts, commit messages, pull request content, and other workflow text.
21
+ - **Git workflows** — use `/branch`, `/commit`, `/push`, and related commands from the WebUI.
22
+ - **GitHub and Gitea integration** — review changes and create pull requests with `/pr`.
23
+ - **Memory support** — maintain project and global memories with optional automatic extraction and adaptive recall.
24
+ - **Messaging gateways** — connect Feishu and WeChat through a focused setup.
25
+ - **Workspace tools** — browse and search files, edit code, and use an embedded terminal alongside the conversation.
26
+ - **Secure access** — protect the WebUI with password and optional TOTP authentication.
27
+
28
+ ## Quick Start
29
+
30
+ ### Prerequisites
31
+
32
+ - Node.js 22 or newer
33
+ - pnpm 9 or newer (source development only)
34
+
35
+ Pi Cloud includes the [Pi coding agent](http://pi.dev), so a separate `pi` installation is not required when using API-key authentication. API keys can be configured from the agent profile dialog.
36
+
37
+ OAuth subscription sign-in is not currently available in the WebUI; native OAuth support is a planned future improvement. For now, install the standalone Pi CLI and complete `/login` in the terminal as the same OS user that runs Pi Cloud:
38
+
39
+ ```bash
40
+ npm install -g --ignore-scripts @earendil-works/pi-coding-agent
41
+ pi
42
+ # Enter /login and select a provider
43
+ ```
44
+
45
+ Pi Cloud then detects the OAuth credentials stored in the default `~/.pi/agent` profile.
46
+
47
+ ### Run without installing
48
+
49
+ If npm fails while building native dependencies, install system build tools such as `build-essential` and `python3`, then retry.
50
+
51
+ Set login credentials, then run the latest release:
52
+
53
+ ```bash
54
+ PI_CLOUD_AUTH_USERNAME=pi PI_CLOUD_AUTH_PASSWORD='change-this-password' npx pi-cloud@latest
55
+ ```
56
+
57
+ Open http://127.0.0.1:3000. The CLI opens the browser automatically after the server is ready.
58
+
59
+ ### Install globally
60
+
61
+ ```bash
62
+ npm install -g pi-cloud
63
+ pi-cloud
64
+ ```
65
+
66
+ On first run, Pi Cloud creates a protected configuration file with username `admin` and prints a randomly generated password once.
67
+
68
+ See the [Configuration Manual](docs/manuals-en/configuration.md) to customize credentials, ports, and other settings. For remote or public access, see the [Deployment Manual](docs/manuals-en/deployment.md).
69
+
70
+ ### Run as a system service
71
+
72
+ Install Pi Cloud as a startup service on Linux, macOS, or Windows:
73
+
74
+ ```bash
75
+ pi-cloud service install
76
+ pi-cloud service status
77
+ ```
78
+
79
+ On Windows, antivirus software may block `pi-cloud service install` because it creates an automatic-start scheduled task. Review the antivirus detection before allowing it; do not disable antivirus or exclude the entire npm directory.
80
+
81
+ ### Run from source
82
+
83
+ ```bash
84
+ git clone https://github.com/xianzhon/pi-cloud && cd pi-cloud
85
+ pnpm install
86
+ cp .env.example .env # set PI_CLOUD_AUTH_USERNAME and PI_CLOUD_AUTH_PASSWORD
87
+ pnpm dev
88
+ ```
89
+
90
+ Open http://localhost:5173 during development. The production server listens on `PORT` (default `3000`).
91
+
92
+ ## Configuration
93
+
94
+ The essential settings are:
95
+
96
+ | Variable | Description |
97
+ | -------------------------- | ------------------------------------ |
98
+ | `PI_CLOUD_AUTH_USERNAME` | Login username |
99
+ | `PI_CLOUD_AUTH_PASSWORD` | Login password for a simple setup |
100
+ | `PORT` | Backend port (default:`3000`) |
101
+ | `HOST` | Bind address (default:`127.0.0.1`) |
102
+
103
+ For production, use `PI_CLOUD_AUTH_PASSWORD_HASH` instead of a plaintext password. See the [Configuration Manual](docs/manuals-en/configuration.md) for configuration files, security, session, storage, workspace, memory, provider, and gateway settings.
104
+
105
+ ## Deployment
106
+
107
+ See the [Deployment Manual](docs/manuals-en/deployment.md) for source and npm package deployments, plus nginx reverse proxy configuration.
108
+
109
+ ## Documentation
110
+
111
+ Browse the [documentation index](docs/README.md) for all user manuals and developer references.
112
+
113
+ ## Development
114
+
115
+ ```bash
116
+ pnpm dev # start both servers
117
+ pnpm build # typecheck + bundle both
118
+ pnpm test # run all tests
119
+ ```
120
+
121
+ - Frontend: http://localhost:5173 (Vite, proxies `/api` and `/ws` to backend)
122
+ - Backend: http://localhost:3000 (Fastify)
123
+ - Logs: `.logs/`
124
+ - PIDs: `.pids/`
125
+
126
+ For architecture, API, local package testing, and project layout notes, see [Developer Notes](docs/to-developers/developer-notes.md).
127
+
128
+ ## Contributing
129
+
130
+ Contributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, branch and pull request conventions, testing, documentation requirements, and security reporting.
131
+
132
+ ## License
133
+
134
+ Licensed under the Apache License, Version 2.0. See [LICENSE](./LICENSE) for details.