Compare commits

..

8 Commits

Author SHA1 Message Date
Sylvia Crowe a2a5e5afdb fix: typecast fix for new ai library version 2024-09-17 14:12:24 -07:00
Sylvia Crowe 9014660dc3 fix: update ai library to support new keys 2024-09-17 14:05:44 -07:00
Sylvia Crowe 0d10632c62 merge branch 'main' into sylvie/ssh-agent 2024-09-17 13:37:28 -07:00
Evan Simkowitz 8f7f259132 use cgo 2024-09-17 13:32:34 -07:00
Sylvia Crowe 33f2532ae8 fix: update with fixes from new version 2024-09-17 13:18:34 -07:00
Sylvia Crowe c46c2a926c fix: add keys to agent if requested
This will add the keys to the ssh agent if requested by the ssh config
file. It also adds the IdentityAgent keyword to override the environment
variable.
2024-06-10 13:52:19 -07:00
Sylvia Crowe a3de9768f2 fix: allow ssh-agent to work in prod
This runs a separate shell script to get the correct environment
variable instead of relying on one that comes from the environment
waveterm was launched from. It also corrects the number of retries to
adjust for the number of signers provided by the ssh-agent.
2024-06-07 02:43:59 -07:00
Sylvia Crowe cd871a0c6c feat: add ssh-agent support to ssh client 2024-06-06 19:59:22 -07:00
11 changed files with 48 additions and 711 deletions
-83
View File
@@ -1,83 +0,0 @@
# Workflow to manage bumping the package version and pushing it to the target branch with a new tag.
# This workflow uses a GitHub App to bypass branch protection and uses the GitHub API directly to ensure commits and tags are signed.
# For more information, see this doc: https://github.com/Nautilus-Cyberneering/pygithub/blob/main/docs/how_to_sign_automatic_commits_in_github_actions.md
name: Bump Version
run-name: "branch: ${{ github.ref_name }}; semver-bump: ${{ inputs.bump }}; prerelease: ${{ inputs.is-prerelease }}"
on:
workflow_dispatch:
inputs:
bump:
description: SemVer Bump
required: true
type: choice
default: none
options:
- none
- patch
- minor
- major
is-prerelease:
description: Is Prerelease
required: true
type: boolean
default: true
env:
NODE_VERSION: "22.5.1"
jobs:
bump-version:
runs-on: ubuntu-latest
steps:
- name: Get App Token
uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ vars.WAVE_BUILDER_APPID }}
private-key: ${{ secrets.WAVE_BUILDER_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
# General build dependencies
- uses: actions/setup-node@v4
with:
node-version: ${{env.NODE_VERSION}}
- name: Install Yarn
run: |
corepack enable
yarn install
- name: Install Task
uses: arduino/setup-task@v2
with:
version: 3.x
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: "Bump Version: ${{ inputs.bump }}"
id: bump-version
run: echo "WAVETERM_VERSION=$( task version -- ${{ inputs.bump }} ${{inputs.is-prerelease}} )" >> "$GITHUB_OUTPUT"
shell: bash
- name: "Push version bump: ${{ steps.bump-version.outputs.WAVETERM_VERSION }}"
run: |
# Create a new commit for the package version bump in package.json
export VERSION=${{ steps.bump-version.outputs.WAVETERM_VERSION }}
export MESSAGE="chore: bump package version to $VERSION"
export FILE=package.json
export BRANCH=${{github.ref_name}}
export SHA=$( git rev-parse $BRANCH:$FILE )
export CONTENT=$( base64 -i $FILE )
gh api --method PUT /repos/:owner/:repo/contents/$FILE \
--field branch="$BRANCH" \
--field message="$MESSAGE" \
--field content="$CONTENT" \
--field sha="$SHA"
# Fetch the new commit and create a tag referencing it
git fetch
export TAG_SHA=$( git rev-parse origin/$BRANCH )
gh api --method POST /repos/:owner/:repo/git/refs \
--field ref="refs/tags/v$VERSION" \
--field sha="$TAG_SHA"
shell: bash
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
-1
View File
@@ -9,7 +9,6 @@ export const LINE_SETTINGS = "lineSettings";
export const CLIENT_SETTINGS = "clientSettings";
export const TAB_SWITCHER = "tabSwitcher";
export const USER_INPUT = "userInput";
export const NEW_WAVE = "newWave";
export const LineContainer_Main = "main";
export const LineContainer_History = "history";
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 13 MiB

-1
View File
@@ -10,4 +10,3 @@ export { SessionSettingsModal } from "./sessionsettings";
export { ScreenSettingsModal } from "./screensettings";
export { LineSettingsModal } from "./linesettings";
export { UserInputModal } from "./userinput";
export { NewWaveModal } from "./newwave";
-95
View File
@@ -1,95 +0,0 @@
.newwave-modal {
width: 640px;
border-radius: 8px;
border: 0.5px solid rgba(255, 255, 255, 0.12);
background: #232323;
box-shadow: 0px 8px 32px 0px rgba(0, 0, 0, 0.25);
.wave-modal-content .wave-modal-body {
padding: 0;
gap: 8px;
.wave-modal-body-inner {
gap: 24px;
display: flex;
flex-direction: column;
header.newwave-header {
padding: 24px 32px 0;
position: relative;
flex-direction: column;
gap: 12px;
border-bottom: none;
.modal-title {
text-align: left;
font-size: 20px;
font-weight: normal;
}
.close {
position: absolute;
right: 32px;
top: 24px;
}
}
.content.newwave-content {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
margin-bottom: 0;
gap: 10px;
.item {
width: 100%;
line-height: 19px;
font-weight: 400;
padding-left: 32px;
padding-right: 32px;
&.image-item {
padding: 0 0;
height: 360px;
}
img {
width: 100%;
margin-bottom: -45px;
}
span {
font-weight: 600;
}
}
}
footer {
padding: 0 32px 24px;
display: flex;
justify-content: flex-end;
.button-wrapper {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
button {
font-size: 15px;
margin-top: 16px;
&:last-child {
margin-left: 10px;
}
}
button.disabled-button {
cursor: default;
}
}
}
}
}
}
-78
View File
@@ -1,78 +0,0 @@
// Copyright 2023, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0
import * as React from "react";
import * as mobxReact from "mobx-react";
import { boundMethod } from "autobind-decorator";
import { Modal, Button } from "@/elements";
import { getApi } from "@/models";
import newwave from "@/assets/new-wave-screenshot.svg";
import "./newwave.less";
@mobxReact.observer
class NewWaveModal extends React.Component<{ onClose: () => void }, {}> {
@boundMethod
handleDownloadOldWave(): void {
getApi().openExternalLink("https://www.waveterm.dev/download-legacy");
}
@boundMethod
handleDownloadNewWave(): void {
getApi().openExternalLink("https://www.waveterm.dev/download");
}
@boundMethod
handleClose(): void {
this.props.onClose();
}
render() {
return (
<Modal className="newwave-modal">
<div className="wave-modal-body">
<div className="wave-modal-body-inner">
<header className="newwave-header unselectable">
<div className="modal-title">A New Wave is Coming!</div>
<i className="fa-regular fa-xmark-large close" onClick={this.handleClose}></i>
</header>
<div className="content newwave-content unselectable">
<div className="item">
We are excited to share that after 3-months of work, and almost 1000 new commits, Wave
v0.8 is now available. It features a new layout engine for screen splitting, improved
remote file browsing and previewing, improved performance, and a new design. We've also
removed some of the more controversial features that took over the shell experience and
overrode things like completions, history, and prompts.
</div>
<div className="item">
The new build is a fresh start, and a clean break from the current version. As such,
your history, settings, and configuration will <i>not</i> be carried over. If you'd like
to continue to run the legacy version, you will need to download it separately.
</div>
<div className="item image-item">
<img src={newwave} height="400px" />
</div>
<div className="item">
You can download Wave v0.8 now or wait for an auto-update next week. The legacy version
will be available via separate download page.
</div>
</div>
<footer className="unselectable">
<div className="button-wrapper">
<Button className="secondary" onClick={this.handleDownloadOldWave}>
Legacy Download
</Button>
</div>
<div className="button-wrapper">
<Button onClick={this.handleDownloadNewWave}>Upgrade to Wave v0.8</Button>
</div>
</footer>
</div>
</div>
</Modal>
);
}
}
export { NewWaveModal };
+1 -21
View File
@@ -5,34 +5,14 @@ import * as React from "react";
import * as mobxReact from "mobx-react";
import { GlobalModel } from "@/models";
import { TosModal } from "./tos";
import { NewWaveModal } from "./newwave";
const SessionStorageKey = "newWaveRendered";
@mobxReact.observer
class ModalsProvider extends React.Component<{}, {}> {
constructor(props) {
super(props);
this.handleNewWaveOnClose = this.handleNewWaveOnClose.bind(this);
}
handleNewWaveOnClose() {
sessionStorage.setItem(SessionStorageKey, "1");
this.forceUpdate();
}
class ModalsProvider extends React.Component {
render() {
let store = GlobalModel.modalsModel.store.slice();
if (GlobalModel.needsTos()) {
return <TosModal />;
}
const newWaveRendered = sessionStorage.getItem(SessionStorageKey);
if (!newWaveRendered) {
return <NewWaveModal onClose={this.handleNewWaveOnClose} />;
}
let rtn: JSX.Element[] = [];
for (let i = 0; i < store.length; i++) {
let entry = store[i];
-2
View File
@@ -13,7 +13,6 @@ import {
ScreenSettingsModal,
LineSettingsModal,
UserInputModal,
NewWaveModal,
} from "@/modals";
import * as constants from "@/app/appconst";
@@ -28,7 +27,6 @@ const modalsRegistry: { [key: string]: React.ComponentType } = {
[constants.LINE_SETTINGS]: LineSettingsModal,
[constants.TAB_SWITCHER]: TabSwitcherModal,
[constants.USER_INPUT]: UserInputModal,
[constants.NEW_WAVE]: NewWaveModal,
};
export { modalsRegistry };
+1 -8
View File
@@ -167,14 +167,7 @@ func SendTelemetry(ctx context.Context, force bool) error {
log.Printf("[pcloud] sending telemetry data\n")
dayStr := telemetry.GetCurDayStr()
defaultShellType := shellapi.DetectLocalShellType()
input := TelemetryInputType{
UserId: clientData.UserId,
ClientId: clientData.ClientId,
AppType: "wave",
CurDay: dayStr,
DefaultShell: defaultShellType,
Activity: activity,
}
input := TelemetryInputType{UserId: clientData.UserId, ClientId: clientData.ClientId, CurDay: dayStr, DefaultShell: defaultShellType, Activity: activity}
req, err := makeAnonPostReq(ctx, TelemetryUrl, input)
if err != nil {
return err
-1
View File
@@ -22,7 +22,6 @@ type NoTelemetryInputType struct {
type TelemetryInputType struct {
UserId string `json:"userid"`
ClientId string `json:"clientid"`
AppType string `json:"apptype"`
CurDay string `json:"curday"`
DefaultShell string `json:"defaultshell"`
Activity []*telemetry.ActivityType `json:"activity"`
+46 -99
View File
@@ -5168,9 +5168,9 @@ __metadata:
languageName: node
linkType: hard
"body-parser@npm:1.20.3":
version: 1.20.3
resolution: "body-parser@npm:1.20.3"
"body-parser@npm:1.20.2":
version: 1.20.2
resolution: "body-parser@npm:1.20.2"
dependencies:
bytes: "npm:3.1.2"
content-type: "npm:~1.0.5"
@@ -5180,11 +5180,11 @@ __metadata:
http-errors: "npm:2.0.0"
iconv-lite: "npm:0.4.24"
on-finished: "npm:2.4.1"
qs: "npm:6.13.0"
qs: "npm:6.11.0"
raw-body: "npm:2.5.2"
type-is: "npm:~1.6.18"
unpipe: "npm:1.0.0"
checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310
checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9
languageName: node
linkType: hard
@@ -5479,19 +5479,6 @@ __metadata:
languageName: node
linkType: hard
"call-bind@npm:^1.0.7":
version: 1.0.7
resolution: "call-bind@npm:1.0.7"
dependencies:
es-define-property: "npm:^1.0.0"
es-errors: "npm:^1.3.0"
function-bind: "npm:^1.1.2"
get-intrinsic: "npm:^1.2.4"
set-function-length: "npm:^1.2.1"
checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d
languageName: node
linkType: hard
"callsites@npm:^3.0.0":
version: 3.1.0
resolution: "callsites@npm:3.1.0"
@@ -6294,7 +6281,7 @@ __metadata:
languageName: node
linkType: hard
"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
"define-data-property@npm:^1.0.1":
version: 1.1.4
resolution: "define-data-property@npm:1.1.4"
dependencies:
@@ -6745,13 +6732,6 @@ __metadata:
languageName: node
linkType: hard
"encodeurl@npm:~2.0.0":
version: 2.0.0
resolution: "encodeurl@npm:2.0.0"
checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb
languageName: node
linkType: hard
"encoding@npm:^0.1.13":
version: 0.1.13
resolution: "encoding@npm:0.1.13"
@@ -6988,41 +6968,41 @@ __metadata:
linkType: hard
"express@npm:^4.17.3":
version: 4.21.0
resolution: "express@npm:4.21.0"
version: 4.19.2
resolution: "express@npm:4.19.2"
dependencies:
accepts: "npm:~1.3.8"
array-flatten: "npm:1.1.1"
body-parser: "npm:1.20.3"
body-parser: "npm:1.20.2"
content-disposition: "npm:0.5.4"
content-type: "npm:~1.0.4"
cookie: "npm:0.6.0"
cookie-signature: "npm:1.0.6"
debug: "npm:2.6.9"
depd: "npm:2.0.0"
encodeurl: "npm:~2.0.0"
encodeurl: "npm:~1.0.2"
escape-html: "npm:~1.0.3"
etag: "npm:~1.8.1"
finalhandler: "npm:1.3.1"
finalhandler: "npm:1.2.0"
fresh: "npm:0.5.2"
http-errors: "npm:2.0.0"
merge-descriptors: "npm:1.0.3"
merge-descriptors: "npm:1.0.1"
methods: "npm:~1.1.2"
on-finished: "npm:2.4.1"
parseurl: "npm:~1.3.3"
path-to-regexp: "npm:0.1.10"
path-to-regexp: "npm:0.1.7"
proxy-addr: "npm:~2.0.7"
qs: "npm:6.13.0"
qs: "npm:6.11.0"
range-parser: "npm:~1.2.1"
safe-buffer: "npm:5.2.1"
send: "npm:0.19.0"
serve-static: "npm:1.16.2"
send: "npm:0.18.0"
serve-static: "npm:1.15.0"
setprototypeof: "npm:1.2.0"
statuses: "npm:2.0.1"
type-is: "npm:~1.6.18"
utils-merge: "npm:1.0.1"
vary: "npm:~1.1.2"
checksum: 10c0/4cf7ca328f3fdeb720f30ccb2ea7708bfa7d345f9cc460b64a82bf1b2c91e5b5852ba15a9a11b2a165d6089acf83457fc477dc904d59cd71ed34c7a91762c6cc
checksum: 10c0/e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb
languageName: node
linkType: hard
@@ -7165,18 +7145,18 @@ __metadata:
languageName: node
linkType: hard
"finalhandler@npm:1.3.1":
version: 1.3.1
resolution: "finalhandler@npm:1.3.1"
"finalhandler@npm:1.2.0":
version: 1.2.0
resolution: "finalhandler@npm:1.2.0"
dependencies:
debug: "npm:2.6.9"
encodeurl: "npm:~2.0.0"
encodeurl: "npm:~1.0.2"
escape-html: "npm:~1.0.3"
on-finished: "npm:2.4.1"
parseurl: "npm:~1.3.3"
statuses: "npm:2.0.1"
unpipe: "npm:~1.0.0"
checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f
checksum: 10c0/64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7
languageName: node
linkType: hard
@@ -7689,7 +7669,7 @@ __metadata:
languageName: node
linkType: hard
"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2":
"has-property-descriptors@npm:^1.0.0":
version: 1.0.2
resolution: "has-property-descriptors@npm:1.0.2"
dependencies:
@@ -9204,10 +9184,10 @@ __metadata:
languageName: node
linkType: hard
"merge-descriptors@npm:1.0.3":
version: 1.0.3
resolution: "merge-descriptors@npm:1.0.3"
checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93
"merge-descriptors@npm:1.0.1":
version: 1.0.1
resolution: "merge-descriptors@npm:1.0.1"
checksum: 10c0/b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec
languageName: node
linkType: hard
@@ -10144,13 +10124,6 @@ __metadata:
languageName: node
linkType: hard
"object-inspect@npm:^1.13.1":
version: 1.13.2
resolution: "object-inspect@npm:1.13.2"
checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4
languageName: node
linkType: hard
"object-inspect@npm:^1.9.0":
version: 1.13.1
resolution: "object-inspect@npm:1.13.1"
@@ -10479,10 +10452,10 @@ __metadata:
languageName: node
linkType: hard
"path-to-regexp@npm:0.1.10":
version: 0.1.10
resolution: "path-to-regexp@npm:0.1.10"
checksum: 10c0/34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4
"path-to-regexp@npm:0.1.7":
version: 0.1.7
resolution: "path-to-regexp@npm:0.1.7"
checksum: 10c0/50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905
languageName: node
linkType: hard
@@ -10767,12 +10740,12 @@ __metadata:
languageName: node
linkType: hard
"qs@npm:6.13.0":
version: 6.13.0
resolution: "qs@npm:6.13.0"
"qs@npm:6.11.0":
version: 6.11.0
resolution: "qs@npm:6.11.0"
dependencies:
side-channel: "npm:^1.0.6"
checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860
side-channel: "npm:^1.0.4"
checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f
languageName: node
linkType: hard
@@ -11477,9 +11450,9 @@ __metadata:
languageName: node
linkType: hard
"send@npm:0.19.0":
version: 0.19.0
resolution: "send@npm:0.19.0"
"send@npm:0.18.0":
version: 0.18.0
resolution: "send@npm:0.18.0"
dependencies:
debug: "npm:2.6.9"
depd: "npm:2.0.0"
@@ -11494,7 +11467,7 @@ __metadata:
on-finished: "npm:2.4.1"
range-parser: "npm:~1.2.1"
statuses: "npm:2.0.1"
checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3
checksum: 10c0/0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a
languageName: node
linkType: hard
@@ -11531,15 +11504,15 @@ __metadata:
languageName: node
linkType: hard
"serve-static@npm:1.16.2":
version: 1.16.2
resolution: "serve-static@npm:1.16.2"
"serve-static@npm:1.15.0":
version: 1.15.0
resolution: "serve-static@npm:1.15.0"
dependencies:
encodeurl: "npm:~2.0.0"
encodeurl: "npm:~1.0.2"
escape-html: "npm:~1.0.3"
parseurl: "npm:~1.3.3"
send: "npm:0.19.0"
checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f
send: "npm:0.18.0"
checksum: 10c0/fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba
languageName: node
linkType: hard
@@ -11562,20 +11535,6 @@ __metadata:
languageName: node
linkType: hard
"set-function-length@npm:^1.2.1":
version: 1.2.2
resolution: "set-function-length@npm:1.2.2"
dependencies:
define-data-property: "npm:^1.1.4"
es-errors: "npm:^1.3.0"
function-bind: "npm:^1.1.2"
get-intrinsic: "npm:^1.2.4"
gopd: "npm:^1.0.1"
has-property-descriptors: "npm:^1.0.2"
checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c
languageName: node
linkType: hard
"setprototypeof@npm:1.1.0":
version: 1.1.0
resolution: "setprototypeof@npm:1.1.0"
@@ -11633,18 +11592,6 @@ __metadata:
languageName: node
linkType: hard
"side-channel@npm:^1.0.6":
version: 1.0.6
resolution: "side-channel@npm:1.0.6"
dependencies:
call-bind: "npm:^1.0.7"
es-errors: "npm:^1.3.0"
get-intrinsic: "npm:^1.2.4"
object-inspect: "npm:^1.13.1"
checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f
languageName: node
linkType: hard
"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7":
version: 3.0.7
resolution: "signal-exit@npm:3.0.7"