nixorb 0.1.0__tar.gz

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 (71) hide show
  1. nixorb-0.1.0/.github/workflows/ci.yml +61 -0
  2. nixorb-0.1.0/.github/workflows/release.yml +367 -0
  3. nixorb-0.1.0/LICENSE +21 -0
  4. nixorb-0.1.0/PKG-INFO +278 -0
  5. nixorb-0.1.0/README.md +231 -0
  6. nixorb-0.1.0/assets/generate_icon.py +28 -0
  7. nixorb-0.1.0/assets/nixorb_256.png +0 -0
  8. nixorb-0.1.0/assets/orb.qml +109 -0
  9. nixorb-0.1.0/assets/shaders/orb_glow.frag +108 -0
  10. nixorb-0.1.0/assets/shaders/orb_glow.vert +20 -0
  11. nixorb-0.1.0/assets/tray_icon.png +0 -0
  12. nixorb-0.1.0/config/default.toml +66 -0
  13. nixorb-0.1.0/install.fish +192 -0
  14. nixorb-0.1.0/install.sh +92 -0
  15. nixorb-0.1.0/nixorb/__init__.py +6 -0
  16. nixorb-0.1.0/nixorb/action/__init__.py +0 -0
  17. nixorb-0.1.0/nixorb/action/clipboard.py +51 -0
  18. nixorb-0.1.0/nixorb/action/executor.py +209 -0
  19. nixorb-0.1.0/nixorb/asr/__init__.py +0 -0
  20. nixorb-0.1.0/nixorb/asr/wake_word.py +93 -0
  21. nixorb-0.1.0/nixorb/asr/whisper_engine.py +191 -0
  22. nixorb-0.1.0/nixorb/cli.py +416 -0
  23. nixorb-0.1.0/nixorb/core/__init__.py +0 -0
  24. nixorb-0.1.0/nixorb/core/aur_checker.py +44 -0
  25. nixorb-0.1.0/nixorb/core/event_bus.py +178 -0
  26. nixorb-0.1.0/nixorb/core/vram_manager.py +185 -0
  27. nixorb-0.1.0/nixorb/llm/__init__.py +0 -0
  28. nixorb-0.1.0/nixorb/llm/backends.py +338 -0
  29. nixorb-0.1.0/nixorb/main.py +299 -0
  30. nixorb-0.1.0/nixorb/memory/__init__.py +0 -0
  31. nixorb-0.1.0/nixorb/memory/vector_store.py +59 -0
  32. nixorb-0.1.0/nixorb/plugins/__init__.py +0 -0
  33. nixorb-0.1.0/nixorb/plugins/builtin/__init__.py +0 -0
  34. nixorb-0.1.0/nixorb/plugins/builtin/kdeconnect_plugin.py +95 -0
  35. nixorb-0.1.0/nixorb/plugins/builtin/systemd_plugin.py +45 -0
  36. nixorb-0.1.0/nixorb/plugins/loader.py +63 -0
  37. nixorb-0.1.0/nixorb/settings.py +95 -0
  38. nixorb-0.1.0/nixorb/tts/__init__.py +0 -0
  39. nixorb-0.1.0/nixorb/tts/hf_tts.py +69 -0
  40. nixorb-0.1.0/nixorb/tts/openai_tts.py +56 -0
  41. nixorb-0.1.0/nixorb/tts/piper_tts.py +84 -0
  42. nixorb-0.1.0/nixorb/tts/tts_factory.py +22 -0
  43. nixorb-0.1.0/nixorb/ui/__init__.py +0 -0
  44. nixorb-0.1.0/nixorb/ui/hotkey.py +54 -0
  45. nixorb-0.1.0/nixorb/ui/orb_window.py +183 -0
  46. nixorb-0.1.0/nixorb/ui/settings_window.py +350 -0
  47. nixorb-0.1.0/nixorb/ui/tray_icon.py +65 -0
  48. nixorb-0.1.0/nixorb/utils/__init__.py +0 -0
  49. nixorb-0.1.0/nixorb/utils/audio.py +18 -0
  50. nixorb-0.1.0/nixorb/utils/crypto.py +82 -0
  51. nixorb-0.1.0/nixorb/utils/hypernix_client.py +54 -0
  52. nixorb-0.1.0/nixorb/utils/web_search.py +80 -0
  53. nixorb-0.1.0/nixorb/vision/__init__.py +0 -0
  54. nixorb-0.1.0/nixorb/vision/screen_capture.py +101 -0
  55. nixorb-0.1.0/packaging/PKGBUILD +117 -0
  56. nixorb-0.1.0/packaging/appimage/AppImageBuilder.yml +69 -0
  57. nixorb-0.1.0/packaging/appimage/build_appimage.sh +79 -0
  58. nixorb-0.1.0/packaging/io.nixorb.NixOrb.yml +73 -0
  59. nixorb-0.1.0/packaging/nixorb.desktop +12 -0
  60. nixorb-0.1.0/plugins/example_plugin.py +102 -0
  61. nixorb-0.1.0/plugins/kdeconnect_plugin.py +61 -0
  62. nixorb-0.1.0/plugins/systemd_status.py +102 -0
  63. nixorb-0.1.0/pyproject.toml +87 -0
  64. nixorb-0.1.0/tests/__init__.py +0 -0
  65. nixorb-0.1.0/tests/conftest.py +23 -0
  66. nixorb-0.1.0/tests/test_crypto.py +37 -0
  67. nixorb-0.1.0/tests/test_event_bus.py +67 -0
  68. nixorb-0.1.0/tests/test_executor.py +64 -0
  69. nixorb-0.1.0/tests/test_plugins.py +80 -0
  70. nixorb-0.1.0/tests/test_settings.py +43 -0
  71. nixorb-0.1.0/tests/test_vram_manager.py +92 -0
@@ -0,0 +1,61 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, dev]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: Test (Python ${{ matrix.python-version }})
12
+ runs-on: ubuntu-22.04
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.12"]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+ cache: pip
26
+
27
+ - name: Install system dependencies
28
+ run: |
29
+ sudo apt-get update -qq
30
+ sudo apt-get install -y --no-install-recommends \
31
+ libportaudio2 portaudio19-dev ffmpeg \
32
+ libglib2.0-0 libdbus-1-3 \
33
+ qt6-base-dev qt6-declarative-dev \
34
+ python3-dev
35
+
36
+ - name: Install Python dependencies (CPU-only torch for CI)
37
+ run: |
38
+ pip install --upgrade pip
39
+ pip install torch==2.7.1+cpu torchaudio==2.7.1+cpu \
40
+ --index-url https://download.pytorch.org/whl/cpu
41
+ pip install -e ".[dev]"
42
+ # Mock packages that require GPU or native libs in CI
43
+ pip install sounddevice soundfile numpy
44
+
45
+ - name: Lint with ruff
46
+ run: ruff check nixorb/ tests/
47
+
48
+ - name: Type-check with mypy
49
+ run: mypy nixorb/ --ignore-missing-imports
50
+
51
+ - name: Run tests
52
+ run: |
53
+ pytest tests/ \
54
+ --ignore=tests/test_vram_manager.py \
55
+ -v --tb=short
56
+
57
+ - name: Upload coverage
58
+ uses: codecov/codecov-action@v4
59
+ if: always()
60
+ with:
61
+ fail_ci_if_error: false
@@ -0,0 +1,367 @@
1
+ name: Release
2
+
3
+ on:
4
+ # ── Trigger 1: push a version tag (git tag v0.1.0 && git push --tags)
5
+ push:
6
+ tags:
7
+ - 'v*.*.*'
8
+
9
+ # ── Trigger 2: click "Run workflow" on GitHub Actions tab
10
+ workflow_dispatch:
11
+ inputs:
12
+ version:
13
+ description: 'Version to release (e.g. 0.1.0)'
14
+ required: true
15
+ default: '0.1.0'
16
+ prerelease:
17
+ description: 'Mark as pre-release?'
18
+ required: false
19
+ default: 'false'
20
+ type: choice
21
+ options: ['false', 'true']
22
+ create_release:
23
+ description: 'Create GitHub Release?'
24
+ required: false
25
+ default: 'true'
26
+ type: choice
27
+ options: ['true', 'false']
28
+
29
+ permissions:
30
+ contents: write
31
+ id-token: write # for PyPI OIDC
32
+
33
+ env:
34
+ PYTHON_VERSION: "3.12"
35
+
36
+ # ── Resolve version from either tag or manual input ─────────────────── #
37
+ jobs:
38
+ meta:
39
+ name: Resolve version
40
+ runs-on: ubuntu-22.04
41
+ outputs:
42
+ version: ${{ steps.resolve.outputs.version }}
43
+ prerelease: ${{ steps.resolve.outputs.prerelease }}
44
+ tag: ${{ steps.resolve.outputs.tag }}
45
+ steps:
46
+ - id: resolve
47
+ run: |
48
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
49
+ VERSION="${{ github.event.inputs.version }}"
50
+ PRERELEASE="${{ github.event.inputs.prerelease }}"
51
+ else
52
+ # Strip leading 'v' from tag name
53
+ VERSION="${GITHUB_REF_NAME#v}"
54
+ # Tags with a hyphen (v1.0.0-beta) are pre-releases
55
+ if echo "$VERSION" | grep -q '-'; then
56
+ PRERELEASE="true"
57
+ else
58
+ PRERELEASE="false"
59
+ fi
60
+ fi
61
+ TAG="v${VERSION}"
62
+ echo "version=$VERSION" >> "$GITHUB_OUTPUT"
63
+ echo "prerelease=$PRERELEASE" >> "$GITHUB_OUTPUT"
64
+ echo "tag=$TAG" >> "$GITHUB_OUTPUT"
65
+ echo "Resolved: version=$VERSION prerelease=$PRERELEASE tag=$TAG"
66
+
67
+ # ────────────────────────────────────────────────────────────────── #
68
+ # Python wheel + sdist #
69
+ # ────────────────────────────────────────────────────────────────── #
70
+ build-wheel:
71
+ name: Build Python Wheel
72
+ runs-on: ubuntu-22.04
73
+ needs: meta
74
+ steps:
75
+ - uses: actions/checkout@v4
76
+
77
+ - uses: actions/setup-python@v5
78
+ with:
79
+ python-version: ${{ env.PYTHON_VERSION }}
80
+
81
+ - name: Patch version in pyproject.toml
82
+ run: |
83
+ sed -i "s/^version = .*/version = \"${{ needs.meta.outputs.version }}\"/" pyproject.toml
84
+ grep "^version" pyproject.toml
85
+
86
+ - name: Build
87
+ run: |
88
+ pip install -q hatchling build
89
+ python -m build
90
+
91
+ - uses: actions/upload-artifact@v4
92
+ with:
93
+ name: python-dist
94
+ path: dist/
95
+
96
+ # ────────────────────────────────────────────────────────────────── #
97
+ # Publish to PyPI (only on tag push or if manually enabled) #
98
+ # ────────────────────────────────────────────────────────────────── #
99
+ publish-pypi:
100
+ name: Publish to PyPI
101
+ runs-on: ubuntu-22.04
102
+ needs: [meta, build-wheel]
103
+ # Skip PyPI publish on manual runs unless explicitly enabled
104
+ if: >
105
+ github.event_name == 'push' ||
106
+ (github.event_name == 'workflow_dispatch' &&
107
+ github.event.inputs.create_release == 'true')
108
+ environment:
109
+ name: pypi
110
+ url: https://pypi.org/p/nixorb
111
+ permissions:
112
+ id-token: write
113
+ steps:
114
+ - uses: actions/download-artifact@v4
115
+ with:
116
+ name: python-dist
117
+ path: dist/
118
+
119
+ - name: Publish to PyPI
120
+ uses: pypa/gh-action-pypi-publish@release/v1
121
+ continue-on-error: true # don't fail the whole release if PyPI rejects
122
+
123
+ # ────────────────────────────────────────────────────────────────── #
124
+ # Arch Linux pacman package #
125
+ # ────────────────────────────────────────────────────────────────── #
126
+ build-pacman:
127
+ name: Build pacman package
128
+ runs-on: ubuntu-22.04
129
+ needs: meta
130
+ container:
131
+ image: archlinux:latest
132
+ steps:
133
+ - uses: actions/checkout@v4
134
+
135
+ - name: Bootstrap Arch build environment
136
+ run: |
137
+ pacman-key --init
138
+ pacman -Syu --noconfirm
139
+ pacman -S --noconfirm \
140
+ base-devel git python python-pip \
141
+ python-build python-installer python-wheel \
142
+ qt6-base qt6-declarative qt6-tools \
143
+ python-hatchling
144
+
145
+ - name: Patch version
146
+ run: |
147
+ VERSION="${{ needs.meta.outputs.version }}"
148
+ sed -i "s/^pkgver=.*/pkgver=${VERSION}/" packaging/PKGBUILD
149
+ sed -i "s/^version = .*/version = \"${VERSION}\"/" pyproject.toml
150
+
151
+ - name: Build source tarball
152
+ run: |
153
+ VERSION="${{ needs.meta.outputs.version }}"
154
+ python assets/generate_icon.py
155
+ tar --exclude='*.pyc' --exclude='__pycache__' \
156
+ --exclude='.git' --exclude='*.tar.gz' \
157
+ -czf "nixorb-${VERSION}.tar.gz" \
158
+ --transform "s|^|nixorb-${VERSION}/|" \
159
+ nixorb/ assets/ config/ plugins/ packaging/ \
160
+ tests/ pyproject.toml README.md LICENSE \
161
+ install.fish install.sh
162
+ SHA256=$(sha256sum "nixorb-${VERSION}.tar.gz" | cut -d' ' -f1)
163
+ echo "SHA256=$SHA256"
164
+ cp "nixorb-${VERSION}.tar.gz" packaging/
165
+ sed -i "s/sha256sums=.*/sha256sums=('${SHA256}')/" packaging/PKGBUILD
166
+
167
+ - name: Build package as non-root user
168
+ run: |
169
+ useradd -m builder
170
+ cp -r . /home/builder/nixorb
171
+ chown -R builder:builder /home/builder/nixorb
172
+ cd /home/builder/nixorb/packaging
173
+ su builder -c "makepkg --noconfirm --cleanbuild --skipinteg -d"
174
+ cp *.pkg.tar.zst /home/builder/
175
+
176
+ - uses: actions/upload-artifact@v4
177
+ with:
178
+ name: pacman-pkg
179
+ path: /home/builder/nixorb-*.pkg.tar.zst
180
+
181
+ # ────────────────────────────────────────────────────────────────── #
182
+ # AppImage #
183
+ # ────────────────────────────────────────────────────────────────── #
184
+ build-appimage:
185
+ name: Build AppImage
186
+ runs-on: ubuntu-22.04
187
+ needs: meta
188
+ steps:
189
+ - uses: actions/checkout@v4
190
+
191
+ - uses: actions/setup-python@v5
192
+ with:
193
+ python-version: ${{ env.PYTHON_VERSION }}
194
+
195
+ - name: Install system deps
196
+ run: |
197
+ sudo apt-get update -qq
198
+ sudo apt-get install -y --no-install-recommends \
199
+ libportaudio2 portaudio19-dev ffmpeg libfuse2 \
200
+ qt6-base-dev qt6-declarative-dev qt6-tools-dev \
201
+ python3-dev
202
+
203
+ - name: Patch version
204
+ run: |
205
+ sed -i "s/^version = .*/version = \"${{ needs.meta.outputs.version }}\"/" pyproject.toml
206
+
207
+ - name: Install Python tools
208
+ run: |
209
+ pip install -q hatchling build
210
+ pip install -q torch==2.7.1+cpu \
211
+ --index-url https://download.pytorch.org/whl/cpu
212
+ pip install -q appimage-builder
213
+ pip install -q -e .
214
+
215
+ - name: Compile shaders
216
+ run: |
217
+ QSB=$(find /usr -name qsb -type f 2>/dev/null | head -1)
218
+ if [ -n "$QSB" ]; then
219
+ $QSB --glsl "100es,120,150" --hlsl 50 --msl 12 \
220
+ assets/shaders/orb_glow.vert -o assets/shaders/orb_glow.vert.qsb
221
+ $QSB --glsl "100es,120,150" --hlsl 50 --msl 12 \
222
+ assets/shaders/orb_glow.frag -o assets/shaders/orb_glow.frag.qsb
223
+ else
224
+ echo "WARNING: qsb not found, shaders not compiled"
225
+ touch assets/shaders/orb_glow.vert.qsb assets/shaders/orb_glow.frag.qsb
226
+ fi
227
+
228
+ - name: Build AppImage
229
+ env:
230
+ NIXORB_VERSION: ${{ needs.meta.outputs.version }}
231
+ run: |
232
+ cd packaging/appimage
233
+ bash build_appimage.sh "$NIXORB_VERSION"
234
+
235
+ - uses: actions/upload-artifact@v4
236
+ with:
237
+ name: appimage
238
+ path: packaging/appimage/NixOrb-*.AppImage
239
+
240
+ # ────────────────────────────────────────────────────────────────── #
241
+ # Flatpak #
242
+ # ────────────────────────────────────────────────────────────────── #
243
+ build-flatpak:
244
+ name: Build Flatpak
245
+ runs-on: ubuntu-22.04
246
+ needs: meta
247
+ container:
248
+ image: bilelmoussaoui/flatpak-github-actions:kde-6.7
249
+ options: --privileged
250
+ steps:
251
+ - uses: actions/checkout@v4
252
+
253
+ - name: Patch version
254
+ run: |
255
+ sed -i "s/^version = .*/version = \"${{ needs.meta.outputs.version }}\"/" pyproject.toml
256
+
257
+ - name: Pre-download Python wheels
258
+ run: |
259
+ mkdir -p wheels
260
+ pip download -d wheels \
261
+ faster-whisper openai chromadb aiohttp qasync \
262
+ "pydantic>=2.7" pydantic-settings tomli-w "typer[all]" \
263
+ rich pygments openwakeword huggingface-hub cryptography \
264
+ aiofiles sounddevice soundfile numpy pynput hypernix \
265
+ 2>/dev/null || true
266
+
267
+ - name: Build Flatpak
268
+ uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6
269
+ with:
270
+ bundle: NixOrb-${{ needs.meta.outputs.version }}.flatpak
271
+ manifest-path: packaging/io.nixorb.NixOrb.yml
272
+ cache-key: flatpak-builder-${{ github.sha }}
273
+
274
+ - uses: actions/upload-artifact@v4
275
+ with:
276
+ name: flatpak
277
+ path: NixOrb-*.flatpak
278
+
279
+ # ────────────────────────────────────────────────────────────────── #
280
+ # Create GitHub Release #
281
+ # ────────────────────────────────────────────────────────────────── #
282
+ create-release:
283
+ name: Create GitHub Release
284
+ runs-on: ubuntu-22.04
285
+ needs: [meta, build-wheel, build-pacman, build-appimage, build-flatpak]
286
+ if: >
287
+ always() &&
288
+ (github.event_name == 'push' ||
289
+ github.event.inputs.create_release == 'true')
290
+ steps:
291
+ - uses: actions/checkout@v4
292
+ with:
293
+ fetch-depth: 0
294
+
295
+ - name: Download all artifacts
296
+ uses: actions/download-artifact@v4
297
+ with:
298
+ path: release-assets/
299
+
300
+ - name: Create or update git tag (manual runs only)
301
+ if: github.event_name == 'workflow_dispatch'
302
+ run: |
303
+ git config user.name "github-actions[bot]"
304
+ git config user.email "github-actions[bot]@users.noreply.github.com"
305
+ TAG="${{ needs.meta.outputs.tag }}"
306
+ # Delete existing tag if present (allows re-running)
307
+ git tag -d "$TAG" 2>/dev/null || true
308
+ git push origin ":refs/tags/$TAG" 2>/dev/null || true
309
+ git tag "$TAG"
310
+ git push origin "$TAG"
311
+
312
+ - name: Generate changelog
313
+ id: changelog
314
+ run: |
315
+ PREV=$(git tag --sort=-version:refname | grep -v "${{ needs.meta.outputs.tag }}" | head -1 || true)
316
+ if [ -n "$PREV" ]; then
317
+ LOG=$(git log "${PREV}..${{ needs.meta.outputs.tag }}" --oneline --no-merges 2>/dev/null | head -40 || echo "Initial release")
318
+ else
319
+ LOG=$(git log --oneline --no-merges | head -20)
320
+ fi
321
+ {
322
+ echo 'changelog<<CHANGELOG_EOF'
323
+ echo "$LOG"
324
+ echo 'CHANGELOG_EOF'
325
+ } >> "$GITHUB_OUTPUT"
326
+
327
+ - name: Create release
328
+ uses: softprops/action-gh-release@v2
329
+ with:
330
+ tag_name: ${{ needs.meta.outputs.tag }}
331
+ name: NixOrb ${{ needs.meta.outputs.version }}
332
+ draft: false
333
+ prerelease: ${{ needs.meta.outputs.prerelease }}
334
+ body: |
335
+ ## NixOrb ${{ needs.meta.outputs.version }}
336
+
337
+ ### Install
338
+
339
+ **Arch Linux (recommended)**
340
+ ```bash
341
+ sudo pacman -U nixorb-${{ needs.meta.outputs.version }}-1-x86_64.pkg.tar.zst
342
+ ```
343
+
344
+ **PyPI**
345
+ ```bash
346
+ pip install nixorb==${{ needs.meta.outputs.version }}
347
+ ```
348
+
349
+ **AppImage (portable)**
350
+ ```bash
351
+ chmod +x NixOrb-${{ needs.meta.outputs.version }}-x86_64.AppImage
352
+ ./NixOrb-${{ needs.meta.outputs.version }}-x86_64.AppImage start
353
+ ```
354
+
355
+ **Flatpak**
356
+ ```bash
357
+ flatpak install NixOrb-${{ needs.meta.outputs.version }}.flatpak
358
+ flatpak run io.nixorb.NixOrb
359
+ ```
360
+
361
+ ### Changes
362
+ ${{ steps.changelog.outputs.changelog }}
363
+ files: |
364
+ release-assets/python-dist/*
365
+ release-assets/pacman-pkg/*
366
+ release-assets/appimage/*
367
+ release-assets/flatpak/*
nixorb-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 NixOrb Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.