Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

# production
/build
/dist

# misc
.DS_Store
Expand All @@ -29,6 +30,7 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
bun-debug.log*

# env files (can opt-in for committing if needed)
.env*
Expand All @@ -39,3 +41,103 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# Python virtual environments
.venv/
venv/
ENV/
env/
.env/

# PyInstaller
*.manifest
*.spec

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
Pipfile.lock

# poetry
poetry.lock

# PEP 582
__pypackages__/

# Celery
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# UV package manager
uv.lock
1,619 changes: 1,619 additions & 0 deletions bun.lock

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions generate-token.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Quick script to generate a LiveKit JWT token
// Run with: node generate-token.js

const { AccessToken } = require('livekit-server-sdk');

const apiKey = 'APIRrwVkRxp62tg';
const apiSecret = process.env.LIVEKIT_API_SECRET || 'YOUR_SECRET_HERE';
const roomName = 'default-room';
const participantName = 'user-' + Math.random().toString(36).substring(7);

if (apiSecret === 'YOUR_SECRET_HERE') {
console.error('⚠️ Please set LIVEKIT_API_SECRET environment variable or edit this file with your secret');
console.error(' Example: LIVEKIT_API_SECRET=your-secret node generate-token.js');
process.exit(1);
}

async function generateToken() {
const token = new AccessToken(apiKey, apiSecret, {
identity: participantName,
ttl: '24h',
});

token.addGrant({
room: roomName,
roomJoin: true,
canSubscribe: true,
canPublish: false,
canPublishData: true,
});

const jwt = await token.toJwt();

console.log('✅ Generated LiveKit JWT Token:');
console.log('');
console.log(jwt);
console.log('');
console.log('Add this to your .env.local file:');
console.log(`NEXT_PUBLIC_DEMO_LIVEKIT_TOKEN=${jwt}`);
console.log('');
console.log('Token details:');
console.log(`- Room: ${roomName}`);
console.log(`- Identity: ${participantName}`);
console.log('- Valid for: 24 hours');
console.log('- Permissions: Subscribe only (no publish)');
}

generateToken().catch(console.error);
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
"test:coverage": "jest --coverage"
},
"dependencies": {
"@ai-sdk/openai": "^2.0.23",
"@bey-dev/sdk": "^0.0.1",
"@kontext.dev/kontext-sdk": "^0.2.1",
"ai": "^5.0.28",
"livekit-client": "^2.15.6",
"livekit-server-sdk": "^2.13.3",
"next": "15.5.2",
"react": "19.1.0",
"react-dom": "19.1.0"
Expand Down
48 changes: 48 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading