@fungi.computer/computer 0.0.0-stage → 0.0.1

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 (91) hide show
  1. package/Dockerfile +85 -0
  2. package/LICENSE +21 -0
  3. package/README.md +228 -2
  4. package/container/computer-init.mjs +119 -0
  5. package/container/computer-start.sh +24 -0
  6. package/container/package.json +14 -0
  7. package/container/pnpm-lock.yaml +378 -0
  8. package/container/pnpm-workspace.yaml +5 -0
  9. package/container/resource-bounds.mjs +54 -0
  10. package/container/runtime-privileges.cc +37 -0
  11. package/container/runtime-privileges.mjs +11 -0
  12. package/container/terminal-assets/README.md +35 -0
  13. package/container/terminal-assets/bashrc +49 -0
  14. package/container/terminal-assets/git-prompt.sh +586 -0
  15. package/container/terminal-protocol.mjs +58 -0
  16. package/container/terminal-runtime.mjs +10 -0
  17. package/container/terminal-server.mjs +243 -0
  18. package/dist/apply-patch/LICENSE.codex +201 -0
  19. package/dist/apply-patch/build.mjs +98 -0
  20. package/dist/apply-patch/cache.mjs +168 -0
  21. package/dist/apply-patch/compile.mjs +199 -0
  22. package/dist/apply-patch/docker/darwin.Dockerfile +15 -0
  23. package/dist/apply-patch/docker/linux-arm64.Dockerfile +38 -0
  24. package/dist/apply-patch/docker/linux-x64.Dockerfile +23 -0
  25. package/dist/apply-patch/main.rs +320 -0
  26. package/dist/apply-patch/notices.mjs +44 -0
  27. package/dist/apply-patch/pin.mjs +8 -0
  28. package/dist/apply-patch/toolchain.mjs +39 -0
  29. package/dist/computer-backends.d.ts +94 -0
  30. package/dist/computer-backends.js +103 -0
  31. package/dist/computerd.cjs +18010 -0
  32. package/dist/container-policy.d.ts +7 -0
  33. package/dist/container-policy.js +24 -0
  34. package/dist/container-system-trust.d.ts +8 -0
  35. package/dist/container-system-trust.js +66 -0
  36. package/dist/egress-policy.d.ts +89 -0
  37. package/dist/egress-policy.js +240 -0
  38. package/dist/execution-result.d.ts +3 -0
  39. package/dist/execution-result.js +28 -0
  40. package/dist/files-patch.d.ts +20 -0
  41. package/dist/files-patch.js +108 -0
  42. package/dist/files.d.ts +75 -0
  43. package/dist/files.js +136 -0
  44. package/dist/fleet/admission.d.ts +14 -0
  45. package/dist/fleet/admission.js +10 -0
  46. package/dist/fleet/backing.d.ts +52 -0
  47. package/dist/fleet/backing.js +242 -0
  48. package/dist/fleet/computers.d.ts +62 -0
  49. package/dist/fleet/computers.js +35 -0
  50. package/dist/fleet/index.d.ts +11 -0
  51. package/dist/fleet/index.js +11 -0
  52. package/dist/fleet/inventory-wire.d.ts +29 -0
  53. package/dist/fleet/inventory-wire.js +15 -0
  54. package/dist/fleet/inventory.d.ts +24 -0
  55. package/dist/fleet/inventory.js +152 -0
  56. package/dist/fleet/lifecycle.d.ts +99 -0
  57. package/dist/fleet/lifecycle.js +423 -0
  58. package/dist/fleet/runtime-usage.d.ts +50 -0
  59. package/dist/fleet/runtime-usage.js +145 -0
  60. package/dist/fleet/slots.d.ts +30 -0
  61. package/dist/fleet/slots.js +46 -0
  62. package/dist/fleet/wire.d.ts +228 -0
  63. package/dist/fleet/wire.js +127 -0
  64. package/dist/host-config.d.ts +12 -0
  65. package/dist/host-config.js +10 -0
  66. package/dist/index.d.ts +282 -0
  67. package/dist/index.js +1237 -0
  68. package/dist/light-shell.d.ts +44 -0
  69. package/dist/light-shell.js +376 -0
  70. package/dist/local-backend.d.ts +52 -0
  71. package/dist/local-backend.js +143 -0
  72. package/dist/metered-container-host.d.ts +26 -0
  73. package/dist/metered-container-host.js +48 -0
  74. package/dist/on-box-vm.d.ts +119 -0
  75. package/dist/on-box-vm.js +294 -0
  76. package/dist/operation-contract.d.ts +456 -0
  77. package/dist/operation-contract.js +452 -0
  78. package/dist/operation-record.d.ts +50 -0
  79. package/dist/operation-record.js +162 -0
  80. package/dist/preview.d.ts +55 -0
  81. package/dist/preview.js +151 -0
  82. package/dist/process-inventory.d.ts +80 -0
  83. package/dist/process-inventory.js +427 -0
  84. package/dist/pull-pending.d.ts +26 -0
  85. package/dist/pull-pending.js +35 -0
  86. package/dist/team-candidate-builder.mjs +28170 -0
  87. package/dist/transport-backend.d.ts +3 -0
  88. package/dist/transport-backend.js +99 -0
  89. package/dist/workspace-stream.d.ts +2 -0
  90. package/dist/workspace-stream.js +31 -0
  91. package/package.json +126 -3
@@ -0,0 +1,586 @@
1
+ # bash/zsh git prompt support
2
+ #
3
+ # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4
+ # Distributed under the GNU General Public License, version 2.0.
5
+ #
6
+ # This script allows you to see repository status in your prompt.
7
+ #
8
+ # To enable:
9
+ #
10
+ # 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
11
+ # 2) Add the following line to your .bashrc/.zshrc:
12
+ # source ~/.git-prompt.sh
13
+ # 3a) Change your PS1 to call __git_ps1 as
14
+ # command-substitution:
15
+ # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
16
+ # ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
17
+ # the optional argument will be used as format string.
18
+ # 3b) Alternatively, for a slightly faster prompt, __git_ps1 can
19
+ # be used for PROMPT_COMMAND in Bash or for precmd() in Zsh
20
+ # with two parameters, <pre> and <post>, which are strings
21
+ # you would put in $PS1 before and after the status string
22
+ # generated by the git-prompt machinery. e.g.
23
+ # Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
24
+ # will show username, at-sign, host, colon, cwd, then
25
+ # various status string, followed by dollar and SP, as
26
+ # your prompt.
27
+ # ZSH: precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
28
+ # will show username, pipe, then various status string,
29
+ # followed by colon, cwd, dollar and SP, as your prompt.
30
+ # Optionally, you can supply a third argument with a printf
31
+ # format string to finetune the output of the branch status
32
+ #
33
+ # The repository status will be displayed only if you are currently in a
34
+ # git repository. The %s token is the placeholder for the shown status.
35
+ #
36
+ # The prompt status always includes the current branch name.
37
+ #
38
+ # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
39
+ # unstaged (*) and staged (+) changes will be shown next to the branch
40
+ # name. You can configure this per-repository with the
41
+ # bash.showDirtyState variable, which defaults to true once
42
+ # GIT_PS1_SHOWDIRTYSTATE is enabled.
43
+ #
44
+ # You can also see if currently something is stashed, by setting
45
+ # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
46
+ # then a '$' will be shown next to the branch name.
47
+ #
48
+ # If you would like to see if there're untracked files, then you can set
49
+ # GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
50
+ # files, then a '%' will be shown next to the branch name. You can
51
+ # configure this per-repository with the bash.showUntrackedFiles
52
+ # variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
53
+ # enabled.
54
+ #
55
+ # If you would like to see the difference between HEAD and its upstream,
56
+ # set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">"
57
+ # indicates you are ahead, "<>" indicates you have diverged and "="
58
+ # indicates that there is no difference. You can further control
59
+ # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
60
+ # of values:
61
+ #
62
+ # verbose show number of commits ahead/behind (+/-) upstream
63
+ # name if verbose, then also show the upstream abbrev name
64
+ # legacy don't use the '--count' option available in recent
65
+ # versions of git-rev-list
66
+ # git always compare HEAD to @{upstream}
67
+ # svn always compare HEAD to your SVN upstream
68
+ #
69
+ # You can change the separator between the branch name and the above
70
+ # state symbols by setting GIT_PS1_STATESEPARATOR. The default separator
71
+ # is SP.
72
+ #
73
+ # When there is an in-progress operation such as a merge, rebase,
74
+ # revert, cherry-pick, or bisect, the prompt will include information
75
+ # related to the operation, often in the form "|<OPERATION-NAME>".
76
+ #
77
+ # When the repository has a sparse-checkout, a notification of the form
78
+ # "|SPARSE" will be included in the prompt. This can be shortened to a
79
+ # single '?' character by setting GIT_PS1_COMPRESSSPARSESTATE, or omitted
80
+ # by setting GIT_PS1_OMITSPARSESTATE.
81
+ #
82
+ # By default, __git_ps1 will compare HEAD to your SVN upstream if it can
83
+ # find one, or @{upstream} otherwise. Once you have set
84
+ # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
85
+ # setting the bash.showUpstream config variable.
86
+ #
87
+ # If you would like to see more information about the identity of
88
+ # commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
89
+ # to one of these values:
90
+ #
91
+ # contains relative to newer annotated tag (v1.6.3.2~35)
92
+ # branch relative to newer tag or branch (master~4)
93
+ # describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
94
+ # tag relative to any older tag (v1.6.3.1-13-gdd42c2f)
95
+ # default exactly matching tag
96
+ #
97
+ # If you would like a colored hint about the current dirty state, set
98
+ # GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
99
+ # the colored output of "git status -sb" and are available only when
100
+ # using __git_ps1 for PROMPT_COMMAND or precmd in Bash,
101
+ # but always available in Zsh.
102
+ #
103
+ # If you would like __git_ps1 to do nothing in the case when the current
104
+ # directory is set up to be ignored by git, then set
105
+ # GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
106
+ # repository level by setting bash.hideIfPwdIgnored to "false".
107
+
108
+ # check whether printf supports -v
109
+ __git_printf_supports_v=
110
+ printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
111
+
112
+ # stores the divergence from upstream in $p
113
+ # used by GIT_PS1_SHOWUPSTREAM
114
+ __git_ps1_show_upstream ()
115
+ {
116
+ local key value
117
+ local svn_remote svn_url_pattern count n
118
+ local upstream=git legacy="" verbose="" name=""
119
+
120
+ svn_remote=()
121
+ # get some config options from git-config
122
+ local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
123
+ while read -r key value; do
124
+ case "$key" in
125
+ bash.showupstream)
126
+ GIT_PS1_SHOWUPSTREAM="$value"
127
+ if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
128
+ p=""
129
+ return
130
+ fi
131
+ ;;
132
+ svn-remote.*.url)
133
+ svn_remote[$((${#svn_remote[@]} + 1))]="$value"
134
+ svn_url_pattern="$svn_url_pattern\\|$value"
135
+ upstream=svn+git # default upstream is SVN if available, else git
136
+ ;;
137
+ esac
138
+ done <<< "$output"
139
+
140
+ # parse configuration values
141
+ local option
142
+ for option in ${GIT_PS1_SHOWUPSTREAM}; do
143
+ case "$option" in
144
+ git|svn) upstream="$option" ;;
145
+ verbose) verbose=1 ;;
146
+ legacy) legacy=1 ;;
147
+ name) name=1 ;;
148
+ esac
149
+ done
150
+
151
+ # Find our upstream
152
+ case "$upstream" in
153
+ git) upstream="@{upstream}" ;;
154
+ svn*)
155
+ # get the upstream from the "git-svn-id: ..." in a commit message
156
+ # (git-svn uses essentially the same procedure internally)
157
+ local -a svn_upstream
158
+ svn_upstream=($(git log --first-parent -1 \
159
+ --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
160
+ if [[ 0 -ne ${#svn_upstream[@]} ]]; then
161
+ svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
162
+ svn_upstream=${svn_upstream%@*}
163
+ local n_stop="${#svn_remote[@]}"
164
+ for ((n=1; n <= n_stop; n++)); do
165
+ svn_upstream=${svn_upstream#${svn_remote[$n]}}
166
+ done
167
+
168
+ if [[ -z "$svn_upstream" ]]; then
169
+ # default branch name for checkouts with no layout:
170
+ upstream=${GIT_SVN_ID:-git-svn}
171
+ else
172
+ upstream=${svn_upstream#/}
173
+ fi
174
+ elif [[ "svn+git" = "$upstream" ]]; then
175
+ upstream="@{upstream}"
176
+ fi
177
+ ;;
178
+ esac
179
+
180
+ # Find how many commits we are ahead/behind our upstream
181
+ if [[ -z "$legacy" ]]; then
182
+ count="$(git rev-list --count --left-right \
183
+ "$upstream"...HEAD 2>/dev/null)"
184
+ else
185
+ # produce equivalent output to --count for older versions of git
186
+ local commits
187
+ if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
188
+ then
189
+ local commit behind=0 ahead=0
190
+ for commit in $commits
191
+ do
192
+ case "$commit" in
193
+ "<"*) ((behind++)) ;;
194
+ *) ((ahead++)) ;;
195
+ esac
196
+ done
197
+ count="$behind $ahead"
198
+ else
199
+ count=""
200
+ fi
201
+ fi
202
+
203
+ # calculate the result
204
+ if [[ -z "$verbose" ]]; then
205
+ case "$count" in
206
+ "") # no upstream
207
+ p="" ;;
208
+ "0 0") # equal to upstream
209
+ p="=" ;;
210
+ "0 "*) # ahead of upstream
211
+ p=">" ;;
212
+ *" 0") # behind upstream
213
+ p="<" ;;
214
+ *) # diverged from upstream
215
+ p="<>" ;;
216
+ esac
217
+ else
218
+ case "$count" in
219
+ "") # no upstream
220
+ p="" ;;
221
+ "0 0") # equal to upstream
222
+ p=" u=" ;;
223
+ "0 "*) # ahead of upstream
224
+ p=" u+${count#0 }" ;;
225
+ *" 0") # behind upstream
226
+ p=" u-${count% 0}" ;;
227
+ *) # diverged from upstream
228
+ p=" u+${count#* }-${count% *}" ;;
229
+ esac
230
+ if [[ -n "$count" && -n "$name" ]]; then
231
+ __git_ps1_upstream_name=$(git rev-parse \
232
+ --abbrev-ref "$upstream" 2>/dev/null)
233
+ if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
234
+ p="$p \${__git_ps1_upstream_name}"
235
+ else
236
+ p="$p ${__git_ps1_upstream_name}"
237
+ # not needed anymore; keep user's
238
+ # environment clean
239
+ unset __git_ps1_upstream_name
240
+ fi
241
+ fi
242
+ fi
243
+
244
+ }
245
+
246
+ # Helper function that is meant to be called from __git_ps1. It
247
+ # injects color codes into the appropriate gitstring variables used
248
+ # to build a gitstring.
249
+ __git_ps1_colorize_gitstring ()
250
+ {
251
+ if [[ -n ${ZSH_VERSION-} ]]; then
252
+ local c_red='%F{red}'
253
+ local c_green='%F{green}'
254
+ local c_lblue='%F{blue}'
255
+ local c_clear='%f'
256
+ else
257
+ # Using \[ and \] around colors is necessary to prevent
258
+ # issues with command line editing/browsing/completion!
259
+ local c_red='\[\e[31m\]'
260
+ local c_green='\[\e[32m\]'
261
+ local c_lblue='\[\e[1;34m\]'
262
+ local c_clear='\[\e[0m\]'
263
+ fi
264
+ local bad_color=$c_red
265
+ local ok_color=$c_green
266
+ local flags_color="$c_lblue"
267
+
268
+ local branch_color=""
269
+ if [ $detached = no ]; then
270
+ branch_color="$ok_color"
271
+ else
272
+ branch_color="$bad_color"
273
+ fi
274
+ c="$branch_color$c"
275
+
276
+ z="$c_clear$z"
277
+ if [ "$w" = "*" ]; then
278
+ w="$bad_color$w"
279
+ fi
280
+ if [ -n "$i" ]; then
281
+ i="$ok_color$i"
282
+ fi
283
+ if [ -n "$s" ]; then
284
+ s="$flags_color$s"
285
+ fi
286
+ if [ -n "$u" ]; then
287
+ u="$bad_color$u"
288
+ fi
289
+ r="$c_clear$r"
290
+ }
291
+
292
+ # Helper function to read the first line of a file into a variable.
293
+ # __git_eread requires 2 arguments, the file path and the name of the
294
+ # variable, in that order.
295
+ __git_eread ()
296
+ {
297
+ test -r "$1" && IFS=$'\r\n' read "$2" <"$1"
298
+ }
299
+
300
+ # see if a cherry-pick or revert is in progress, if the user has committed a
301
+ # conflict resolution with 'git commit' in the middle of a sequence of picks or
302
+ # reverts then CHERRY_PICK_HEAD/REVERT_HEAD will not exist so we have to read
303
+ # the todo file.
304
+ __git_sequencer_status ()
305
+ {
306
+ local todo
307
+ if test -f "$g/CHERRY_PICK_HEAD"
308
+ then
309
+ r="|CHERRY-PICKING"
310
+ return 0;
311
+ elif test -f "$g/REVERT_HEAD"
312
+ then
313
+ r="|REVERTING"
314
+ return 0;
315
+ elif __git_eread "$g/sequencer/todo" todo
316
+ then
317
+ case "$todo" in
318
+ p[\ \ ]|pick[\ \ ]*)
319
+ r="|CHERRY-PICKING"
320
+ return 0
321
+ ;;
322
+ revert[\ \ ]*)
323
+ r="|REVERTING"
324
+ return 0
325
+ ;;
326
+ esac
327
+ fi
328
+ return 1
329
+ }
330
+
331
+ # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
332
+ # when called from PS1 using command substitution
333
+ # in this mode it prints text to add to bash PS1 prompt (includes branch name)
334
+ #
335
+ # __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
336
+ # in that case it _sets_ PS1. The arguments are parts of a PS1 string.
337
+ # when two arguments are given, the first is prepended and the second appended
338
+ # to the state string when assigned to PS1.
339
+ # The optional third parameter will be used as printf format string to further
340
+ # customize the output of the git-status string.
341
+ # In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
342
+ __git_ps1 ()
343
+ {
344
+ # preserve exit status
345
+ local exit=$?
346
+ local pcmode=no
347
+ local detached=no
348
+ local ps1pc_start='\u@\h:\w '
349
+ local ps1pc_end='\$ '
350
+ local printf_format=' (%s)'
351
+
352
+ case "$#" in
353
+ 2|3) pcmode=yes
354
+ ps1pc_start="$1"
355
+ ps1pc_end="$2"
356
+ printf_format="${3:-$printf_format}"
357
+ # set PS1 to a plain prompt so that we can
358
+ # simply return early if the prompt should not
359
+ # be decorated
360
+ PS1="$ps1pc_start$ps1pc_end"
361
+ ;;
362
+ 0|1) printf_format="${1:-$printf_format}"
363
+ ;;
364
+ *) return $exit
365
+ ;;
366
+ esac
367
+
368
+ # ps1_expanded: This variable is set to 'yes' if the shell
369
+ # subjects the value of PS1 to parameter expansion:
370
+ #
371
+ # * bash does unless the promptvars option is disabled
372
+ # * zsh does not unless the PROMPT_SUBST option is set
373
+ # * POSIX shells always do
374
+ #
375
+ # If the shell would expand the contents of PS1 when drawing
376
+ # the prompt, a raw ref name must not be included in PS1.
377
+ # This protects the user from arbitrary code execution via
378
+ # specially crafted ref names. For example, a ref named
379
+ # 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
380
+ # shell to execute 'sudo rm -rf /' when the prompt is drawn.
381
+ #
382
+ # Instead, the ref name should be placed in a separate global
383
+ # variable (in the __git_ps1_* namespace to avoid colliding
384
+ # with the user's environment) and that variable should be
385
+ # referenced from PS1. For example:
386
+ #
387
+ # __git_ps1_foo=$(do_something_to_get_ref_name)
388
+ # PS1="...stuff...\${__git_ps1_foo}...stuff..."
389
+ #
390
+ # If the shell does not expand the contents of PS1, the raw
391
+ # ref name must be included in PS1.
392
+ #
393
+ # The value of this variable is only relevant when in pcmode.
394
+ #
395
+ # Assume that the shell follows the POSIX specification and
396
+ # expands PS1 unless determined otherwise. (This is more
397
+ # likely to be correct if the user has a non-bash, non-zsh
398
+ # shell and safer than the alternative if the assumption is
399
+ # incorrect.)
400
+ #
401
+ local ps1_expanded=yes
402
+ [ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
403
+ [ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no
404
+
405
+ local repo_info rev_parse_exit_code
406
+ repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
407
+ --is-bare-repository --is-inside-work-tree \
408
+ --short HEAD 2>/dev/null)"
409
+ rev_parse_exit_code="$?"
410
+
411
+ if [ -z "$repo_info" ]; then
412
+ return $exit
413
+ fi
414
+
415
+ local short_sha=""
416
+ if [ "$rev_parse_exit_code" = "0" ]; then
417
+ short_sha="${repo_info##*$'\n'}"
418
+ repo_info="${repo_info%$'\n'*}"
419
+ fi
420
+ local inside_worktree="${repo_info##*$'\n'}"
421
+ repo_info="${repo_info%$'\n'*}"
422
+ local bare_repo="${repo_info##*$'\n'}"
423
+ repo_info="${repo_info%$'\n'*}"
424
+ local inside_gitdir="${repo_info##*$'\n'}"
425
+ local g="${repo_info%$'\n'*}"
426
+
427
+ if [ "true" = "$inside_worktree" ] &&
428
+ [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &&
429
+ [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &&
430
+ git check-ignore -q .
431
+ then
432
+ return $exit
433
+ fi
434
+
435
+ local sparse=""
436
+ if [ -z "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &&
437
+ [ -z "${GIT_PS1_OMITSPARSESTATE-}" ] &&
438
+ [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
439
+ sparse="|SPARSE"
440
+ fi
441
+
442
+ local r=""
443
+ local b=""
444
+ local step=""
445
+ local total=""
446
+ if [ -d "$g/rebase-merge" ]; then
447
+ __git_eread "$g/rebase-merge/head-name" b
448
+ __git_eread "$g/rebase-merge/msgnum" step
449
+ __git_eread "$g/rebase-merge/end" total
450
+ r="|REBASE"
451
+ else
452
+ if [ -d "$g/rebase-apply" ]; then
453
+ __git_eread "$g/rebase-apply/next" step
454
+ __git_eread "$g/rebase-apply/last" total
455
+ if [ -f "$g/rebase-apply/rebasing" ]; then
456
+ __git_eread "$g/rebase-apply/head-name" b
457
+ r="|REBASE"
458
+ elif [ -f "$g/rebase-apply/applying" ]; then
459
+ r="|AM"
460
+ else
461
+ r="|AM/REBASE"
462
+ fi
463
+ elif [ -f "$g/MERGE_HEAD" ]; then
464
+ r="|MERGING"
465
+ elif __git_sequencer_status; then
466
+ :
467
+ elif [ -f "$g/BISECT_LOG" ]; then
468
+ r="|BISECTING"
469
+ fi
470
+
471
+ if [ -n "$b" ]; then
472
+ :
473
+ elif [ -h "$g/HEAD" ]; then
474
+ # symlink symbolic ref
475
+ b="$(git symbolic-ref HEAD 2>/dev/null)"
476
+ else
477
+ local head=""
478
+ if ! __git_eread "$g/HEAD" head; then
479
+ return $exit
480
+ fi
481
+ # is it a symbolic ref?
482
+ b="${head#ref: }"
483
+ if [ "$head" = "$b" ]; then
484
+ detached=yes
485
+ b="$(
486
+ case "${GIT_PS1_DESCRIBE_STYLE-}" in
487
+ (contains)
488
+ git describe --contains HEAD ;;
489
+ (branch)
490
+ git describe --contains --all HEAD ;;
491
+ (tag)
492
+ git describe --tags HEAD ;;
493
+ (describe)
494
+ git describe HEAD ;;
495
+ (* | default)
496
+ git describe --tags --exact-match HEAD ;;
497
+ esac 2>/dev/null)" ||
498
+
499
+ b="$short_sha..."
500
+ b="($b)"
501
+ fi
502
+ fi
503
+ fi
504
+
505
+ if [ -n "$step" ] && [ -n "$total" ]; then
506
+ r="$r $step/$total"
507
+ fi
508
+
509
+ local w=""
510
+ local i=""
511
+ local s=""
512
+ local u=""
513
+ local h=""
514
+ local c=""
515
+ local p=""
516
+
517
+ if [ "true" = "$inside_gitdir" ]; then
518
+ if [ "true" = "$bare_repo" ]; then
519
+ c="BARE:"
520
+ else
521
+ b="GIT_DIR!"
522
+ fi
523
+ elif [ "true" = "$inside_worktree" ]; then
524
+ if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
525
+ [ "$(git config --bool bash.showDirtyState)" != "false" ]
526
+ then
527
+ git diff --no-ext-diff --quiet || w="*"
528
+ git diff --no-ext-diff --cached --quiet || i="+"
529
+ if [ -z "$short_sha" ] && [ -z "$i" ]; then
530
+ i="#"
531
+ fi
532
+ fi
533
+ if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
534
+ git rev-parse --verify --quiet refs/stash >/dev/null
535
+ then
536
+ s="$"
537
+ fi
538
+
539
+ if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
540
+ [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
541
+ git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null
542
+ then
543
+ u="%${ZSH_VERSION+%}"
544
+ fi
545
+
546
+ if [ -n "${GIT_PS1_COMPRESSSPARSESTATE-}" ] &&
547
+ [ "$(git config --bool core.sparseCheckout)" = "true" ]; then
548
+ h="?"
549
+ fi
550
+
551
+ if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
552
+ __git_ps1_show_upstream
553
+ fi
554
+ fi
555
+
556
+ local z="${GIT_PS1_STATESEPARATOR-" "}"
557
+
558
+ # NO color option unless in PROMPT_COMMAND mode or it's Zsh
559
+ if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
560
+ if [ $pcmode = yes ] || [ -n "${ZSH_VERSION-}" ]; then
561
+ __git_ps1_colorize_gitstring
562
+ fi
563
+ fi
564
+
565
+ b=${b##refs/heads/}
566
+ if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
567
+ __git_ps1_branch_name=$b
568
+ b="\${__git_ps1_branch_name}"
569
+ fi
570
+
571
+ local f="$h$w$i$s$u"
572
+ local gitstring="$c$b${f:+$z$f}${sparse}$r$p"
573
+
574
+ if [ $pcmode = yes ]; then
575
+ if [ "${__git_printf_supports_v-}" != yes ]; then
576
+ gitstring=$(printf -- "$printf_format" "$gitstring")
577
+ else
578
+ printf -v gitstring -- "$printf_format" "$gitstring"
579
+ fi
580
+ PS1="$ps1pc_start$gitstring$ps1pc_end"
581
+ else
582
+ printf -- "$printf_format" "$gitstring"
583
+ fi
584
+
585
+ return $exit
586
+ }
@@ -0,0 +1,58 @@
1
+ import { Buffer } from "node:buffer";
2
+
3
+ // Pure terminal wire helpers, kept free of node-pty so they test anywhere.
4
+
5
+ /** Output kept per session for replay on reconnect. */
6
+ export const replayBytes = 256 * 1_024;
7
+
8
+ export function boundedInteger(raw, minimum, maximum, fallback) {
9
+ if (raw === null || !/^\d{1,4}$/.test(raw)) return fallback;
10
+ const value = Number(raw);
11
+ return value < minimum || value > maximum ? fallback : value;
12
+ }
13
+
14
+ /** Decode one client resize frame; any other text frame is ignored. */
15
+ export function parseResize(text) {
16
+ let frame;
17
+ try {
18
+ frame = JSON.parse(text);
19
+ } catch {
20
+ return null;
21
+ }
22
+ if (frame === null || Array.isArray(frame) || frame.type !== "resize")
23
+ return null;
24
+ const cols = boundedInteger(String(frame.cols), 2, 500, null);
25
+ const rows = boundedInteger(String(frame.rows), 2, 300, null);
26
+ return cols === null || rows === null ? null : { cols, rows };
27
+ }
28
+
29
+ /** Keep only the newest `limit` bytes of terminal output for replay. */
30
+ export class ReplayRing {
31
+ #chunks = [];
32
+ #bytes = 0;
33
+ #limit;
34
+
35
+ constructor(limit) {
36
+ this.#limit = limit;
37
+ }
38
+
39
+ push(chunk) {
40
+ this.#chunks.push(chunk);
41
+ this.#bytes += chunk.byteLength;
42
+ while (this.#bytes > this.#limit && this.#chunks.length > 0) {
43
+ const excess = this.#bytes - this.#limit;
44
+ const first = this.#chunks[0];
45
+ if (first.byteLength <= excess) {
46
+ this.#chunks.shift();
47
+ this.#bytes -= first.byteLength;
48
+ } else {
49
+ this.#chunks[0] = first.subarray(excess);
50
+ this.#bytes -= excess;
51
+ }
52
+ }
53
+ }
54
+
55
+ snapshot() {
56
+ return Buffer.concat(this.#chunks, this.#bytes);
57
+ }
58
+ }
@@ -0,0 +1,10 @@
1
+ // This process is exec'd only after init permanently drops its credentials.
2
+ import process from "node:process";
3
+ import { startTerminalServer } from "./terminal-server.mjs";
4
+ const terminal = startTerminalServer(
5
+ Number(process.env.COMPUTER_TERMINAL_PORT ?? "7681"),
6
+ );
7
+ await terminal.listening;
8
+ process.send?.({ type: "terminal-ready" });
9
+ for (const signal of ["SIGTERM", "SIGINT"])
10
+ process.on(signal, () => terminal.close());