This commit is contained in:
itsrubberduck
2025-09-14 21:09:47 +02:00
commit 94ea407402
10 changed files with 8720 additions and 0 deletions

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# Nuxt dev/build outputs
.output
.data
.nuxt
.nitro
.cache
dist
# Node dependencies
node_modules
# Logs
logs
*.log
# Misc
.DS_Store
.fleet
.idea
# Local env files
.env
.env.*
!.env.example

BIN
.yarn/install-state.gz Normal file

Binary file not shown.

942
.yarn/releases/yarn-4.9.4.cjs vendored Executable file

File diff suppressed because one or more lines are too long

5
.yarnrc.yml Normal file
View File

@@ -0,0 +1,5 @@
nodeLinker: node-modules
npmRegistryServer: "https://registry.npmjs.org"
yarnPath: .yarn/releases/yarn-4.9.4.cjs

6
nuxt.config.ts Normal file
View File

@@ -0,0 +1,6 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2025-07-15',
devtools: { enabled: true },
modules: ['vuetify-nuxt-module']
})

22
package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"name": "opensquawk",
"type": "module",
"private": true,
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"dotenv": "^17.2.2",
"nuxt": "^4.1.1",
"openai": "^5.20.2",
"vue": "^3.5.21",
"vue-router": "^4.5.1",
"vuetify": "3.9.0-beta.1",
"vuetify-nuxt-module": "0.18.7"
},
"packageManager": "yarn@4.9.4"
}

8
server/utils/openai.ts Normal file
View File

@@ -0,0 +1,8 @@
import OpenAI from "openai";
export const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY! });
export const LLM_MODEL = process.env.LLM_MODEL || "gpt-5-nano";
export const TTS_MODEL = process.env.TTS_MODEL || "tts-1";
export function atcReplyPrompt(userText: string) {
return `You are an ICAO-compliant ATC controller. Reply concisely.
Pilot said: "${userText}"`;
}

8
server/utils/radio.ts Normal file
View File

@@ -0,0 +1,8 @@
import { execFile } from "node:child_process";
export async function applyRadioEffect(input: string, output: string) {
const filter="[0:a]highpass=f=300,lowpass=f=3400,compand=attacks=0.02:decays=0.25:points=-80/-900|-70/-20|0/-10|20/-8:gain=6,volume=1.2[a];anoisesrc=color=white:amplitude=0.02[ns];[a][ns]amix=inputs=2:weights=1 0.25:duration=shortest,volume=1.0,aecho=0.6:0.7:8:0.08,acompressor=threshold=0.6:ratio=6:attack=20:release=200";
await new Promise((res,rej)=>
execFile("ffmpeg",["-y","-i",input,"-filter_complex",filter,"-ar","16000",output],
(err,_,stderr)=>err?rej(new Error(stderr)):res())
);
}

18
tsconfig.json Normal file
View File

@@ -0,0 +1,18 @@
{
// https://nuxt.com/docs/guide/concepts/typescript
"files": [],
"references": [
{
"path": "./.nuxt/tsconfig.app.json"
},
{
"path": "./.nuxt/tsconfig.server.json"
},
{
"path": "./.nuxt/tsconfig.shared.json"
},
{
"path": "./.nuxt/tsconfig.node.json"
}
]
}

7687
yarn.lock Normal file

File diff suppressed because it is too large Load Diff