@zerwiz/sessrumnir 0.1.8-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/README.md +329 -0
- package/bin/sessrumnir-web.sh +117 -0
- package/bin/sessrumnir.js +169 -0
- package/out/main/index.js +10850 -0
- package/out/preload/index.js +719 -0
- package/out/renderer/assets/cormorant-cyrillic-400-normal-C8QS47vb.woff2 +0 -0
- package/out/renderer/assets/cormorant-cyrillic-400-normal-D3EsxgFc.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-500-normal-B7dJQtg-.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-500-normal-BLlg2W5x.woff2 +0 -0
- package/out/renderer/assets/cormorant-cyrillic-600-normal-BcIsDXzC.woff2 +0 -0
- package/out/renderer/assets/cormorant-cyrillic-600-normal-CBymlcNF.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-400-normal-Bgrpe4p1.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-400-normal-BlcaxZtM.woff2 +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-500-normal-CdQuyvtc.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-500-normal-pZw22qtS.woff2 +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-600-normal-Dr-wLyOm.woff +0 -0
- package/out/renderer/assets/cormorant-cyrillic-ext-600-normal-dLR2-a_v.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-400-normal-BGH8Vunh.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-400-normal-C3_-2Ua-.woff +0 -0
- package/out/renderer/assets/cormorant-latin-500-normal-Dj3SQ6fR.woff +0 -0
- package/out/renderer/assets/cormorant-latin-500-normal-EBdSCOD3.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-600-normal-B254Xisw.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-600-normal-DUW-TI76.woff +0 -0
- package/out/renderer/assets/cormorant-latin-ext-400-normal-DuQ88yz3.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-ext-400-normal-DuXFa1Dr.woff +0 -0
- package/out/renderer/assets/cormorant-latin-ext-500-normal-AH9qog1s.woff2 +0 -0
- package/out/renderer/assets/cormorant-latin-ext-500-normal-DAuUCO41.woff +0 -0
- package/out/renderer/assets/cormorant-latin-ext-600-normal-CD-dlDpD.woff +0 -0
- package/out/renderer/assets/cormorant-latin-ext-600-normal-D3T6BBXG.woff2 +0 -0
- package/out/renderer/assets/cormorant-vietnamese-400-normal-C-RiYxEf.woff2 +0 -0
- package/out/renderer/assets/cormorant-vietnamese-400-normal-DmUuA7Y2.woff +0 -0
- package/out/renderer/assets/cormorant-vietnamese-500-normal-DsPuwQHi.woff2 +0 -0
- package/out/renderer/assets/cormorant-vietnamese-500-normal-tGBW_mI7.woff +0 -0
- package/out/renderer/assets/cormorant-vietnamese-600-normal-Dar_cCT6.woff2 +0 -0
- package/out/renderer/assets/cormorant-vietnamese-600-normal-GIs8CF2x.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-Ba-HN6uq.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-300-normal-ByB2hQUF.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-B8O3uHbr.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-300-normal-BbtBtHoB.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-300-normal-BPU54Tw3.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-300-normal-BRS-C4KA.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-BEtQ2wm2.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-300-normal-CQbCaAQ4.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-B6fSpYYV.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-300-normal-CpdbWO_2.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/out/renderer/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/out/renderer/assets/index-CgJYtdL8.js +97387 -0
- package/out/renderer/assets/index-CyRDW9WV.css +4824 -0
- package/out/renderer/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/out/renderer/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/out/renderer/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/out/renderer/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/out/renderer/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/out/renderer/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/out/renderer/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/out/renderer/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/out/renderer/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/out/renderer/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/out/renderer/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/out/renderer/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/out/renderer/assets/newsreader-latin-ext-wght-italic-DFS986qL.woff2 +0 -0
- package/out/renderer/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/out/renderer/assets/newsreader-latin-wght-italic-Bxi8ein9.woff2 +0 -0
- package/out/renderer/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/out/renderer/assets/newsreader-vietnamese-wght-italic-xAqemagA.woff2 +0 -0
- package/out/renderer/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/out/renderer/assets/openmoji-color-9qo_2DLG.woff2 +0 -0
- package/out/renderer/assets/pi-logo-8LswgQgB.svg +17 -0
- package/out/renderer/index.html +19 -0
- package/out/renderer/theme-boot.js +30 -0
- package/out/shared/src/shared/tsconfig.tsbuildinfo +1 -0
- package/package.json +183 -0
- package/resources/icons/generate_icons.py +38 -0
- package/resources/icons/icon-128.png +0 -0
- package/resources/icons/icon-16.png +0 -0
- package/resources/icons/icon-256.png +0 -0
- package/resources/icons/icon-32.png +0 -0
- package/resources/icons/icon-48.png +0 -0
- package/resources/icons/icon-512.png +0 -0
- package/resources/icons/icon-64.png +0 -0
- package/resources/icons/icon.icns +0 -0
- package/resources/icons/icon.ico +0 -0
- package/resources/icons/icon.png +0 -0
- package/resources/icons/icon.svg +55 -0
- package/resources/linux/after-install.sh +23 -0
- package/resources/linux/after-remove.sh +18 -0
- package/resources/locales/en/translation.json +1735 -0
- package/resources/permission-prompt-text.test.ts +111 -0
- package/resources/permission-prompt-text.ts +84 -0
- package/resources/permission-rules.test.ts +351 -0
- package/resources/permission-rules.ts +293 -0
- package/resources/pi-desktop-permissions.ts +62 -0
- package/resources/ymir-sessrumnir.desktop.in +12 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
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 the 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 the 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 any 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. Please also get an
|
|
185
|
+
"Applicability of Apache License" file from the Apache Software
|
|
186
|
+
Foundation at http://www.apache.org/foundation/license-faq.html.
|
|
187
|
+
|
|
188
|
+
Copyright 2026 HighlandJewls, PikkonMG, FaqFirebase
|
|
189
|
+
|
|
190
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
191
|
+
you may not use this file except in compliance with the License.
|
|
192
|
+
You may obtain a copy of the License at
|
|
193
|
+
|
|
194
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
195
|
+
|
|
196
|
+
Unless required by applicable law or agreed to in writing, software
|
|
197
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
198
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
199
|
+
See the License for the specific language governing permissions and
|
|
200
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
# Sessrúmnir
|
|
2
|
+
|
|
3
|
+
A desktop GUI for the [Pi](https://pi.dev) and [oh-my-pi](https://github.com/can1357/oh-my-pi) coding agents. Chat, manage projects, browse files, run commands, and install packages in one window.
|
|
4
|
+
|
|
5
|
+
> **Ymir adoption:** this is a vendored fork of the Apache-2.0 **pi-desktop**
|
|
6
|
+
> project (`github.com/FaqFirebase/pi-desktop`, v0.1.7-alpha), rebranded
|
|
7
|
+
> **Sessrúmnir** and wearing the carved cloth of the halls (stone, bone, bronze
|
|
8
|
+
> and blood — the landing page's own palette and type). See `AGENTS.md` for the
|
|
9
|
+
> adoption notes; upstream provenance and license are preserved.
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
Still in alpha, so expect rough edges.
|
|
14
|
+
|
|
15
|
+
## What it does
|
|
16
|
+
|
|
17
|
+
- Streaming chat with thinking blocks, tool use, and rich rendering: bundled fonts and color emoji, inline SVG preview, and clickable file links that open a preview pane. Consecutive tool calls fold into collapsible groups. File reads show as line-numbered, syntax-highlighted code and edits as diffs
|
|
18
|
+
- Find within a conversation (`Ctrl/Cmd+F`); streaming follows new output only while you're at the bottom, with a jump-to-bottom control
|
|
19
|
+
- Composer file mentions (type `@` to insert a path reference for Pi to read) and `Up`/`Down` to recall prompts sent in the current session
|
|
20
|
+
- Home dashboard with usage stats: messages, tokens, active-day streaks, peak hour, and a per-model breakdown
|
|
21
|
+
- [Multi-Agent Council Planning](#multi-agent-council-planning), where Pi, Claude, and Codex plan together and reach consensus before Pi builds (opt-in)
|
|
22
|
+
- Quick switcher (`Ctrl/Cmd+K`) for skills, prompt templates, built-in commands, workspaces, sessions, and files; `/` in the composer for commands
|
|
23
|
+
- Skills browser, session fork/branch tree, and one-click context compaction
|
|
24
|
+
- Session naming (read from Pi) with inline rename, and a themed in-app confirmation for delete
|
|
25
|
+
- Custom models & providers editor in Settings, which edits your engine's models file (`~/.pi/agent/models.json` for Pi, `~/.omp/agent/models.yml` for OMP)
|
|
26
|
+
- Multiple workspaces, with an independent agent process per live session, so a turn keeps running when you switch away from it; Mission Control and sidebar activity dots surface background work across projects, with optional desktop notifications when a session finishes, fails, or waits for approval
|
|
27
|
+
- New Task launcher starts a real fresh Pi session in a selected project, optionally in an isolated Git worktree, and sends the issue immediately while work continues in the background; matching task metadata, explicit branches, and GitHub PR URLs reuse an existing local worktree when found
|
|
28
|
+
- Diff Review conveyor with explicit Commit → Push → PR actions, upstream-aware GitHub CLI PR creation, and exact notification clicks back to the finished session
|
|
29
|
+
- Diagnostics view: Pi/OMP install and PATH resolution, provider configuration, permissions, and recent errors
|
|
30
|
+
- Review rail (toggleable) with permissions, approvals, changed files, and session status
|
|
31
|
+
- Custom permission rules: allow/deny glob rules per Pi tool that refine the permission modes, with per-workspace rule files, import/export, and live edits that apply without restarting Pi
|
|
32
|
+
- File tree, code/image/PDF/HTML preview panes, code editor (CodeMirror 6 with syntax highlighting), diff viewer, file search
|
|
33
|
+
- Terminal with ANSI colors
|
|
34
|
+
- Package browser connected to pi.dev/packages, with instant local search and update checks for installed packages
|
|
35
|
+
- Session tags, model switching, live-preview settings, themes (8 built-ins — Sessrúmnir is the default — plus System, and custom themes you can create in-app, import, export, or install from a URL)
|
|
36
|
+
- [Translatable interface](#languages): pick the language in Settings (English ships today)
|
|
37
|
+
|
|
38
|
+
## Review rail
|
|
39
|
+
|
|
40
|
+
The right-side Review rail keeps safety and working-tree state visible while you chat with Pi. Toggle it from the chat toolbar (hidden by default, so it doesn't compete for space with file/image previews).
|
|
41
|
+
|
|
42
|
+
Changed files use readable status badges:
|
|
43
|
+
|
|
44
|
+
| Badge | Meaning |
|
|
45
|
+
|-------|---------|
|
|
46
|
+
| `NEW` | Untracked new file |
|
|
47
|
+
| `MOD` | Existing tracked file was modified |
|
|
48
|
+
| `DEL` | Tracked file was deleted |
|
|
49
|
+
| `ADD` | New file staged in git |
|
|
50
|
+
| `STG` | Modified file staged in git |
|
|
51
|
+
| `REN` | File was renamed |
|
|
52
|
+
|
|
53
|
+
## Pi and OMP engines
|
|
54
|
+
|
|
55
|
+
Pi Desktop speaks Pi's RPC protocol directly, so it can run either the standard `pi` CLI or the compatible `omp` binary from [oh-my-pi](https://github.com/can1357/oh-my-pi). **Settings → Agent Configuration → Agent Installation** scans for installed engines, lets you select one, and also supports a custom executable or install directory.
|
|
56
|
+
|
|
57
|
+
Each engine keeps its own sessions: Pi writes to `~/.pi/agent/sessions`, OMP to `~/.omp/agent/sessions`. The app reads both, so switching engines never hides your history. When sessions from both appear in one list, each row is tagged `Pi` or `OMP`, and opening one starts the engine that wrote it.
|
|
58
|
+
|
|
59
|
+
OMP's protocol-v2 large-frame transport is negotiated automatically, and model-specific thinking efforts, including `max`, are shown when advertised. Its native `read`, `grep`, and `glob` tools are used for Plan / Read-only mode, and its plugin install/update/remove verbs are mapped behind the existing package actions.
|
|
60
|
+
|
|
61
|
+
## Permissions
|
|
62
|
+
|
|
63
|
+
Four base modes control what Pi may do, selectable from the Review rail or **Settings → Behavior**:
|
|
64
|
+
|
|
65
|
+
| Mode | Behavior |
|
|
66
|
+
|------|----------|
|
|
67
|
+
| Plan / Read-only | Only read/search/list tools are enabled; edits and shell commands are blocked |
|
|
68
|
+
| Ask before edits | Pi asks before file edits and shell commands |
|
|
69
|
+
| Ask before commands | Pi asks before shell commands |
|
|
70
|
+
| Trusted | All tools enabled |
|
|
71
|
+
|
|
72
|
+
Custom permission rules refine the modes with allow/deny rules per Pi tool, edited in **Settings → Behavior → Permission rules**:
|
|
73
|
+
|
|
74
|
+
- A rule is an action (`allow`/`deny`), a tool name (`bash`, `edit`, `write`, `read`, … or `*` for any), and an optional glob pattern matched against the tool's input: the shell command for `bash`, the file path for file tools. `*` is the only wildcard.
|
|
75
|
+
- Precedence: deny beats allow, and allow beats the mode default. Deny rules are enforced in every mode; a `deny * *.env*` rule holds even in Trusted. Allow rules skip the confirmation prompt in the ask modes.
|
|
76
|
+
- Rule edits apply to the next tool call without restarting Pi.
|
|
77
|
+
- Rules come in two scopes. The **Global | This workspace** tabs edit either your global rules or the active workspace's `.pi-desktop/permission-rules.json`. A workspace file is gated by workspace trust: once you trust the workspace it fully replaces the global list while you work there. Until then (the default for a repo you just opened) only its *deny* rules apply, layered on top of your global rules, and its *allow* rules are ignored, so a cloned repo can tighten your permissions but never loosen them. Opening a workspace whose file contains allow rules prompts you to trust it; you can also Trust/Revoke from the **This workspace** tab. Import/Export moves rule lists as JSON files, and the workspace file can be hand-edited or committed with a repo. The app picks up changes live.
|
|
78
|
+
- One honest caveat: rules match raw strings, with no path canonicalization or command parsing. Treat them as a guardrail against accidents rather than a security sandbox, and keep even a trusted workspace's allow rules narrow.
|
|
79
|
+
|
|
80
|
+
Example rules:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{ "action": "allow", "tool": "bash", "match": "npm test*" }
|
|
84
|
+
{ "action": "deny", "tool": "bash", "match": "rm -rf *" }
|
|
85
|
+
{ "action": "deny", "tool": "*", "match": "*.env*" }
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Custom themes
|
|
89
|
+
|
|
90
|
+
Pi Desktop ships 7 built-in themes (Dark, Light, Nord, Gruvbox, Breeze Dark, Breeze Light, Breeze Claudius) plus System, and you can create your own from **Settings → Appearance**. With **System** selected, **Light Theme** and **Dark Theme** choose which installed theme each OS mode uses.
|
|
91
|
+
|
|
92
|
+
To build one in the app, click **Create theme** to fork the currently active theme, or **Edit theme** to keep editing one you already created. Pick 7 seed colors (app background, surface, text, accent, success, warning, error) and a dark or light kind; every other color in the app is derived from those seeds. Changes preview live across the whole window as you edit. Two disclosures cover finer control:
|
|
93
|
+
|
|
94
|
+
- **Advanced** lets you override any of the ~30 derived tokens individually (borders, hovers, scrollbars, and so on) instead of accepting the automatic derivation.
|
|
95
|
+
- **Syntax colors** overrides the code-highlighting colors (keywords, strings, comments, etc.) used by the code editor and diff viewer.
|
|
96
|
+
|
|
97
|
+
Themes you create are listed alongside the built-ins in the **Theme** dropdown. Rename one by editing its name in the editor, duplicate one by selecting it and clicking **Create theme** (which forks whatever is active), and delete one with the **Delete** button that appears next to the dropdown whenever a custom theme is selected.
|
|
98
|
+
|
|
99
|
+
To share a theme, use **Import** and **Export** to move it as a `.json` file, or paste an `https://` URL into **Install from URL** to fetch and install one directly (HTTP is rejected, and downloads are size-capped).
|
|
100
|
+
|
|
101
|
+
A theme file uses the `pi-theme/v1` format: JSON with a `$schema`, a `name`, a `kind` (`"dark"` or `"light"`), and 7 `seeds`. That's enough for a complete, valid theme; everything else is derived automatically via CSS `color-mix()`:
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"$schema": "pi-theme/v1",
|
|
106
|
+
"name": "My Theme",
|
|
107
|
+
"kind": "dark",
|
|
108
|
+
"seeds": {
|
|
109
|
+
"app": "#0a0a0a",
|
|
110
|
+
"surface": "#171717",
|
|
111
|
+
"text": "#f5f5f5",
|
|
112
|
+
"accent": "#2563eb",
|
|
113
|
+
"success": "#34d399",
|
|
114
|
+
"warning": "#facc15",
|
|
115
|
+
"error": "#f87171"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Two optional top-level objects let you pin exact values instead of relying on derivation: `overrides` (any derived token, e.g. `border`, `scrollbar`, `accent-hover`) and `syntax` (code-highlighting colors, e.g. `keyword`, `string`, `comment`). Omit both and the theme still renders correctly from the 7 seeds alone.
|
|
121
|
+
|
|
122
|
+
User theme files live in the app's user-data directory under `themes/` (on Linux, `~/.config/pi-desktop/themes/`).
|
|
123
|
+
|
|
124
|
+
There's also a community gallery at [pi-desktop-themes](https://github.com/FaqFirebase/pi-desktop-themes): copy any theme's raw URL into **Install from URL**, or submit your own with a pull request.
|
|
125
|
+
|
|
126
|
+
## Languages
|
|
127
|
+
|
|
128
|
+
Pick the interface language in **Settings → Appearance → Language**. **System default** follows your operating system's language list and falls back to English. The change applies when you click **Save Settings**, with no restart.
|
|
129
|
+
|
|
130
|
+
English is the only bundled language today. Each language is one JSON file in `resources/locales/<code>/translation.json`; see [Translations](CONTRIBUTING.md#translations) to add one.
|
|
131
|
+
|
|
132
|
+
Only the app's own text is translated. Chat replies, file contents, and names of models, packages, and sessions stay as they are. Logs and the copied Diagnostics report stay in English, so bug reports stay readable.
|
|
133
|
+
|
|
134
|
+
## Multi-Agent Council Planning
|
|
135
|
+
|
|
136
|
+
Pi, Claude, and Codex each produce an initial plan, share and converge, and Pi presents the agreed consensus plan *before* anything is built. All members plan read-only; Pi is the only agent that edits files.
|
|
137
|
+
|
|
138
|
+
The feature is off by default. Enable it in **Settings → "Multi-Agent Council Planning"**; a confirmation dialog warns that it increases token and credit usage, since each request runs multiple agents.
|
|
139
|
+
|
|
140
|
+
The app auto-detects each member's CLI cross-platform, and only detected agents can be enabled (per-agent checkboxes). At least two members must be available or a run is refused. Pi always merges the plans into the final consensus, even when it isn't checked as a planner.
|
|
141
|
+
|
|
142
|
+
Every member plans read-only: Claude runs with `--permission-mode plan`, Codex with `--sandbox read-only`, and Pi with write tools excluded. They produce plans but never modify files. Only Pi implements the approved result.
|
|
143
|
+
|
|
144
|
+
During the consulting phase, each member streams its plan live in its own card with an elapsed timer.
|
|
145
|
+
|
|
146
|
+
There are two consensus modes:
|
|
147
|
+
|
|
148
|
+
- **One debate round** (default): each member sees the others' plans and revises once, then Pi merges. You watch them converge.
|
|
149
|
+
- **Arbiter merge**: faster and cheaper. Pi synthesizes the initial plans directly with no debate round.
|
|
150
|
+
|
|
151
|
+
A per-member timeout (10 to 600 seconds, default 240) bounds each member. A member that times out or errors is dropped, and the run proceeds as long as at least one plan was produced.
|
|
152
|
+
|
|
153
|
+
To use it, type your request with the feature enabled and click **Plan with Council** in the composer. Review each member's plan and Pi's merged consensus plan. If you want changes, type feedback in **Request changes to the plan…** and Pi revises the consensus; repeat as needed. When you're happy, click **Implement this** and Pi builds it. The panel collapses once a plan is ready so the output stays readable.
|
|
154
|
+
|
|
155
|
+
## Getting started
|
|
156
|
+
|
|
157
|
+
You need Pi installed first:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
npm install -g @earendil-works/pi-coding-agent
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
On Linux, grab the AppImage from [Releases](https://github.com/FaqFirebase/pi-desktop/releases):
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
chmod +x Pi-Desktop-*.AppImage
|
|
167
|
+
./Pi-Desktop-*.AppImage
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### macOS
|
|
171
|
+
|
|
172
|
+
Download the `.dmg` (Apple Silicon / arm64) from [Releases](https://github.com/FaqFirebase/pi-desktop/releases), open it, and drag **Pi Desktop** to Applications.
|
|
173
|
+
|
|
174
|
+
Builds are **not yet signed or notarized**. Because the download is unsigned, macOS quarantines it, and on first launch Gatekeeper shows this dialog (this is macOS's message, not our advice):
|
|
175
|
+
|
|
176
|
+
> Pi Desktop is damaged and can't be opened. You should move it to the Trash.
|
|
177
|
+
|
|
178
|
+
**Do not move it to the Trash.** The app is not damaged; this is just how Gatekeeper phrases its block on any unsigned app. macOS offers no "Open Anyway" button for this particular dialog, so clear the quarantine flag in Terminal instead:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
xattr -dr com.apple.quarantine "/Applications/Pi Desktop.app"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Then open the app normally. You only need to do this once.
|
|
185
|
+
|
|
186
|
+
> If macOS instead says the app **"cannot be opened because Apple cannot check it for malicious software,"** you can allow it without Terminal: open **System Settings → Privacy & Security**, scroll to the **Security** section, and click **Open Anyway** next to the Pi Desktop notice, then confirm with Touch ID / your password.
|
|
187
|
+
|
|
188
|
+
> If you'd rather skip the unsigned-app warnings entirely, build from source. A build you compile yourself runs locally without Gatekeeper blocking it, so there is no signing prompt and no quarantine flag to clear. See [Build it yourself → Linux / macOS](#linux--macos) below.
|
|
189
|
+
|
|
190
|
+
### Windows
|
|
191
|
+
|
|
192
|
+
Download from [Releases](https://github.com/FaqFirebase/pi-desktop/releases): the **installer** (`…-win-x64-setup.exe`, recommended) or the **portable** `…-win-x64.exe`. Builds are unsigned, so SmartScreen may warn; choose **More info → Run anyway**. If file edits or saves fail, see the [Controlled Folder Access](#controlled-folder-access-ransomware-protection) note below. Windows is community-tested; please [open a bug report](https://github.com/FaqFirebase/pi-desktop/issues) if you hit an issue.
|
|
193
|
+
|
|
194
|
+
## Keyboard shortcuts
|
|
195
|
+
|
|
196
|
+
| Shortcut | What it does |
|
|
197
|
+
|----------|-------------|
|
|
198
|
+
| `Enter` | Send message |
|
|
199
|
+
| `Shift+Enter` | New line |
|
|
200
|
+
| `Up/Down` | Recall previous prompts |
|
|
201
|
+
| `@` | Mention a workspace file |
|
|
202
|
+
| `Escape` | Stop streaming |
|
|
203
|
+
| `Ctrl/Cmd+K` | Open command palette |
|
|
204
|
+
| `/` (start of message) | Open command palette |
|
|
205
|
+
| `Ctrl+P` (composer focused) | Cycle model |
|
|
206
|
+
| `Ctrl/Cmd+F` | Find in conversation |
|
|
207
|
+
| `Ctrl/Cmd+Shift+F` | File search |
|
|
208
|
+
| `Ctrl+Shift+P` | Insert saved note |
|
|
209
|
+
| `Ctrl/Cmd+N` | New session |
|
|
210
|
+
| `Ctrl/Cmd+Shift+N` | New workspace |
|
|
211
|
+
| `Ctrl/Cmd+O` | Open project |
|
|
212
|
+
|
|
213
|
+
## Build it yourself
|
|
214
|
+
|
|
215
|
+
### Linux / macOS
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
git clone https://github.com/FaqFirebase/pi-desktop.git
|
|
219
|
+
cd pi-desktop
|
|
220
|
+
npm install
|
|
221
|
+
npm run dev
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Windows
|
|
225
|
+
|
|
226
|
+
Windows requires extra steps because **node-pty** (the terminal backend) compiles a native module against Electron's ABI.
|
|
227
|
+
|
|
228
|
+
#### 1. Install prerequisites
|
|
229
|
+
|
|
230
|
+
Install all of the following **before** cloning:
|
|
231
|
+
|
|
232
|
+
- [Git for Windows](https://git-scm.com/download/win)
|
|
233
|
+
- [Node.js LTS](https://nodejs.org), via the official Windows installer (adds `node` and `npm` to PATH)
|
|
234
|
+
- **Visual Studio Build Tools 2022**, downloaded from [Visual Studio downloads](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022)
|
|
235
|
+
- Select the **Desktop development with C++** workload
|
|
236
|
+
- Open **Individual components**, search `Spectre`, and install **Spectre-mitigated libs for v143 toolset**
|
|
237
|
+
|
|
238
|
+
> **Use VS Build Tools 2022, not 2026.** node-pty requires Spectre-mitigated runtime libraries. VS 2022 stable (v143 toolset) ships them; VS 2026 preview (v180 toolset) does not, and `npm install` will fail with `MSB8040: Spectre-mitigated libraries are required for this project`.
|
|
239
|
+
|
|
240
|
+
#### 2. Add a Windows Defender exclusion (recommended)
|
|
241
|
+
|
|
242
|
+
Defender can block or slow `npm install` on projects with many small files. Before cloning, add an exclusion:
|
|
243
|
+
|
|
244
|
+
Settings → Privacy & Security → Windows Security → Virus & threat protection → Manage settings → Exclusions → Add a folder → (pick where you'll clone the repo)
|
|
245
|
+
|
|
246
|
+
#### 3. Clone and install
|
|
247
|
+
|
|
248
|
+
```powershell
|
|
249
|
+
git clone https://github.com/FaqFirebase/pi-desktop.git
|
|
250
|
+
cd pi-desktop
|
|
251
|
+
npm install
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
The postinstall script rebuilds `node-pty` against Electron's ABI and downloads the Electron binary. First install may take a few minutes.
|
|
255
|
+
|
|
256
|
+
If the Electron binary is missing after install, use the [manual Electron binary download](#manual-electron-binary-download) steps below. This is the confirmed fallback on Windows when Electron's postinstall extraction leaves a partial `dist` folder.
|
|
257
|
+
|
|
258
|
+
#### 4. Install Pi
|
|
259
|
+
|
|
260
|
+
```powershell
|
|
261
|
+
powershell -c "irm https://pi.dev/install.ps1 | iex"
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Open a **new terminal** after this so the updated PATH takes effect.
|
|
265
|
+
|
|
266
|
+
#### 5. Run
|
|
267
|
+
|
|
268
|
+
```powershell
|
|
269
|
+
npm run dev
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### Common Windows errors
|
|
273
|
+
|
|
274
|
+
| Error | Cause | Fix |
|
|
275
|
+
|-------|-------|-----|
|
|
276
|
+
| `MSB8040`: Spectre libs missing | VS Build Tools 2026 (v180 toolset) installed instead of 2022 (v143) | Uninstall 2026, install VS Build Tools 2022 with Spectre libs for v143 |
|
|
277
|
+
| `electron-vite is not recognized` | `npm install` didn't complete | Run `npm install` again |
|
|
278
|
+
| Electron binary missing after install | Electron's postinstall extraction left a partial or missing `dist` folder | Add the repo folder to Defender exclusions, then `npm install` again. If it still fails, use the manual download steps below |
|
|
279
|
+
| `EPERM` / `EACCES` writing a project file | Controlled Folder Access (Ransomware protection) is blocking writes under Documents/Desktop | Keep the repo and your projects out of protected folders, or allow Pi Desktop through Controlled folder access (see below) |
|
|
280
|
+
| Pi shows "error" in status popover | Pi not installed or PATH not updated | Run the install script above in a **new** terminal window |
|
|
281
|
+
|
|
282
|
+
#### Controlled Folder Access (Ransomware protection)
|
|
283
|
+
|
|
284
|
+
Windows **Controlled Folder Access** protects `Documents`, `Desktop`, `Pictures`, and similar folders by silently blocking apps it doesn't trust from writing to them. Because Pi Desktop is a coding agent that edits files, this shows up as intermittent `EPERM`/`EACCES` failures (during `npm install`, when the agent edits code, or when you save a file) if your repo or projects live inside a protected folder.
|
|
285
|
+
|
|
286
|
+
The reliable fix is to keep code out of protected folders. Clone the repo and put your projects somewhere unprotected, for example:
|
|
287
|
+
|
|
288
|
+
```powershell
|
|
289
|
+
# Not C:\Users\<you>\Documents\... — use an unprotected path:
|
|
290
|
+
git clone https://github.com/FaqFirebase/pi-desktop.git C:\dev\pi-desktop
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
If you must keep code under Documents/Desktop, allow the app instead:
|
|
294
|
+
|
|
295
|
+
**Windows Security → Virus & threat protection → Ransomware protection → Manage ransomware protection → Allow an app through Controlled folder access → Add an allowed app**, then add the installed `Pi Desktop.exe` (and, for development, `node.exe`, `git.exe`, and `electron.exe`).
|
|
296
|
+
|
|
297
|
+
> The portable `.exe` re-extracts to a temporary folder on each launch, so allow-listing it doesn't stick. Prefer the **installer** (`Pi-Desktop-<version>-win-x64-setup.exe`) if you rely on the allow-list approach.
|
|
298
|
+
|
|
299
|
+
#### Manual Electron binary download
|
|
300
|
+
|
|
301
|
+
If `npm install` completes but the app won't launch because Electron is missing or corrupted, download it directly from GitHub and unpack it into place. This is the known-good fallback when `node_modules\electron\dist` contains only partial contents, such as `locales`, and no `electron.exe`.
|
|
302
|
+
|
|
303
|
+
Replace `43.0.0` with the version in `node_modules/electron/package.json` if it differs.
|
|
304
|
+
|
|
305
|
+
```powershell
|
|
306
|
+
$ver = "43.0.0"
|
|
307
|
+
$url = "https://github.com/electron/electron/releases/download/v$ver/electron-v$ver-win32-x64.zip"
|
|
308
|
+
$zip = "$env:TEMP\electron-v$ver-win32-x64.zip"
|
|
309
|
+
Invoke-WebRequest -Uri $url -OutFile $zip
|
|
310
|
+
if (Test-Path node_modules\electron\dist) { Remove-Item -Recurse -Force node_modules\electron\dist }
|
|
311
|
+
Expand-Archive -Path $zip -DestinationPath node_modules\electron\dist -Force
|
|
312
|
+
"electron.exe" | Out-File -Encoding ASCII -NoNewline node_modules\electron\path.txt
|
|
313
|
+
"v$ver" | Out-File -Encoding ASCII -NoNewline node_modules\electron\dist\version
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
After this, `npm run dev` should work normally.
|
|
317
|
+
|
|
318
|
+
> **Note:** Windows builds are community-tested. If you hit an issue not listed above, please [open a bug report](https://github.com/FaqFirebase/pi-desktop/issues).
|
|
319
|
+
|
|
320
|
+
## License
|
|
321
|
+
|
|
322
|
+
Apache 2.0
|
|
323
|
+
|
|
324
|
+
## Links
|
|
325
|
+
|
|
326
|
+
- [pi-desktop.com](https://pi-desktop.com)
|
|
327
|
+
- [pi.dev](https://pi.dev)
|
|
328
|
+
- [Packages](https://pi.dev/packages)
|
|
329
|
+
- [Issues](https://github.com/FaqFirebase/pi-desktop/issues)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# sessrumnir-web.sh — Headless web shell for Sessrúmnir
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# sessrumnir-web.sh start # Start the web server
|
|
6
|
+
# sessrumnir-web.sh stop # Stop the web server
|
|
7
|
+
# sessrumnir-web.sh status # Check if running
|
|
8
|
+
# sessrumnir-web.sh restart # Restart
|
|
9
|
+
#
|
|
10
|
+
# The server runs on a fixed port (3890) and serves:
|
|
11
|
+
# - Built renderer files (out/renderer/)
|
|
12
|
+
# - Bridge API (POST /api/<channel>)
|
|
13
|
+
# - WebSocket events (WS /ws/<channel>)
|
|
14
|
+
#
|
|
15
|
+
# Port: 3890 (configurable via SESSRUNIR_WEB_PORT)
|
|
16
|
+
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
20
|
+
APP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
21
|
+
PID_FILE="${APP_DIR}/.sessrumnir-web.pid"
|
|
22
|
+
PORT="${SESSRUNIR_WEB_PORT:-3890}"
|
|
23
|
+
LOG_FILE="${APP_DIR}/.sessrumnir-web.log"
|
|
24
|
+
|
|
25
|
+
# ─── Functions ───────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
start() {
|
|
28
|
+
# Check if already running
|
|
29
|
+
if [ -f "$PID_FILE" ]; then
|
|
30
|
+
local pid
|
|
31
|
+
pid=$(cat "$PID_FILE")
|
|
32
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
33
|
+
echo "[Sessrúmnir Web] Already running (PID $pid on port $PORT)"
|
|
34
|
+
return 0
|
|
35
|
+
fi
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Start the server
|
|
39
|
+
echo "[Sessrúmnir Web] Starting on port $PORT..."
|
|
40
|
+
cd "$APP_DIR"
|
|
41
|
+
|
|
42
|
+
# Use Bun to run the server
|
|
43
|
+
if command -v bun &>/dev/null; then
|
|
44
|
+
bun run src/web-server.ts &
|
|
45
|
+
elif command -v node &>/dev/null; then
|
|
46
|
+
# Fallback: use tsx or node with esbuild
|
|
47
|
+
node -r esbuild-register src/web-server.ts &
|
|
48
|
+
else
|
|
49
|
+
echo "[Sessrúmnir Web] Error: Neither bun nor node with esbuild-register found" >&2
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Wait for server to start
|
|
54
|
+
sleep 2
|
|
55
|
+
|
|
56
|
+
# Capture the PID
|
|
57
|
+
if [ -f "$PID_FILE" ]; then
|
|
58
|
+
echo "[Sessrúmnir Web] Started (PID $(cat "$PID_FILE") on port $PORT)"
|
|
59
|
+
else
|
|
60
|
+
echo "[Sessrúmnir Web] Started on port $PORT"
|
|
61
|
+
fi
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
stop() {
|
|
65
|
+
if [ ! -f "$PID_FILE" ]; then
|
|
66
|
+
echo "[Sessrúmnir Web] Not running"
|
|
67
|
+
return 0
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
local pid
|
|
71
|
+
pid=$(cat "$PID_FILE")
|
|
72
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
73
|
+
echo "[Sessrúmnir Web] Stopping (PID $pid)..."
|
|
74
|
+
kill "$pid"
|
|
75
|
+
rm -f "$PID_FILE"
|
|
76
|
+
echo "[Sessrúmnir Web] Stopped"
|
|
77
|
+
else
|
|
78
|
+
echo "[Sessrúmnir Web] Not running (stale PID file)"
|
|
79
|
+
rm -f "$PID_FILE"
|
|
80
|
+
fi
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
status() {
|
|
84
|
+
if [ -f "$PID_FILE" ]; then
|
|
85
|
+
local pid
|
|
86
|
+
pid=$(cat "$PID_FILE")
|
|
87
|
+
if kill -0 "$pid" 2>/dev/null; then
|
|
88
|
+
echo "[Sessrúmnir Web] Running (PID $pid on port $PORT)"
|
|
89
|
+
return 0
|
|
90
|
+
fi
|
|
91
|
+
fi
|
|
92
|
+
echo "[Sessrúmnir Web] Not running"
|
|
93
|
+
return 1
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
# ─── Main ────────────────────────────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
case "${1:-}" in
|
|
99
|
+
start)
|
|
100
|
+
start
|
|
101
|
+
;;
|
|
102
|
+
stop)
|
|
103
|
+
stop
|
|
104
|
+
;;
|
|
105
|
+
status)
|
|
106
|
+
status
|
|
107
|
+
;;
|
|
108
|
+
restart)
|
|
109
|
+
stop
|
|
110
|
+
sleep 1
|
|
111
|
+
start
|
|
112
|
+
;;
|
|
113
|
+
*)
|
|
114
|
+
echo "Usage: $0 {start|stop|status|restart}"
|
|
115
|
+
exit 1
|
|
116
|
+
;;
|
|
117
|
+
esac
|