@settinghead/voxlert 0.3.5

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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/assets/cortana.png +0 -0
  4. package/assets/deckard-cain.png +0 -0
  5. package/assets/demo-thumbnail.png +0 -0
  6. package/assets/glados.png +0 -0
  7. package/assets/hl-hev-suit.png +0 -0
  8. package/assets/logo.png +0 -0
  9. package/assets/red-alert-eva.png +0 -0
  10. package/assets/sc1-adjutant.gif +0 -0
  11. package/assets/sc1-kerrigan.gif +0 -0
  12. package/assets/sc1-protoss-advisor.jpg +0 -0
  13. package/assets/sc2-adjutant.jpg +0 -0
  14. package/assets/sc2-kerrigan.jpg +0 -0
  15. package/assets/ss1-shodan.png +0 -0
  16. package/config.default.json +35 -0
  17. package/openclaw-plugin/index.ts +100 -0
  18. package/openclaw-plugin/openclaw.plugin.json +21 -0
  19. package/package.json +51 -0
  20. package/packs/hl-hev-suit/pack.json +72 -0
  21. package/packs/hl-hev-suit/voice.wav +0 -0
  22. package/packs/red-alert-eva/pack.json +73 -0
  23. package/packs/red-alert-eva/voice.wav +0 -0
  24. package/packs/sc1-adjutant/pack.json +31 -0
  25. package/packs/sc1-adjutant/voice.wav +0 -0
  26. package/packs/sc1-kerrigan/pack.json +69 -0
  27. package/packs/sc1-kerrigan/voice.wav +0 -0
  28. package/packs/sc1-protoss-advisor/pack.json +70 -0
  29. package/packs/sc1-protoss-advisor/voice.wav +0 -0
  30. package/packs/sc2-adjutant/pack.json +14 -0
  31. package/packs/sc2-adjutant/voice.wav +0 -0
  32. package/packs/sc2-kerrigan/pack.json +69 -0
  33. package/packs/sc2-kerrigan/voice.wav +0 -0
  34. package/packs/sc2-protoss-advisor/pack.json +70 -0
  35. package/packs/sc2-protoss-advisor/voice.wav +0 -0
  36. package/packs/ss1-shodan/pack.json +69 -0
  37. package/packs/ss1-shodan/voice.wav +0 -0
  38. package/skills/voxlert-config/SKILL.md +44 -0
  39. package/src/activity-log.js +58 -0
  40. package/src/audio.js +381 -0
  41. package/src/cli.js +86 -0
  42. package/src/codex-config.js +149 -0
  43. package/src/commands/codex-notify.js +70 -0
  44. package/src/commands/config.js +141 -0
  45. package/src/commands/cost.js +20 -0
  46. package/src/commands/cursor-hook.js +52 -0
  47. package/src/commands/help.js +25 -0
  48. package/src/commands/hook-utils.js +73 -0
  49. package/src/commands/hook.js +27 -0
  50. package/src/commands/index.js +45 -0
  51. package/src/commands/log.js +92 -0
  52. package/src/commands/notification.js +50 -0
  53. package/src/commands/pack-helpers.js +157 -0
  54. package/src/commands/pack.js +25 -0
  55. package/src/commands/setup.js +13 -0
  56. package/src/commands/test.js +14 -0
  57. package/src/commands/uninstall.js +60 -0
  58. package/src/commands/version.js +12 -0
  59. package/src/commands/voice.js +14 -0
  60. package/src/commands/volume.js +38 -0
  61. package/src/config.js +230 -0
  62. package/src/cost.js +124 -0
  63. package/src/cursor-hooks.js +93 -0
  64. package/src/formats.js +55 -0
  65. package/src/hooks.js +129 -0
  66. package/src/llm.js +237 -0
  67. package/src/overlay.js +212 -0
  68. package/src/overlay.jxa +186 -0
  69. package/src/pack-registry.js +28 -0
  70. package/src/packs.js +182 -0
  71. package/src/paths.js +39 -0
  72. package/src/postinstall.js +13 -0
  73. package/src/providers.js +129 -0
  74. package/src/setup-ui.js +177 -0
  75. package/src/setup.js +504 -0
  76. package/src/tts-test.js +243 -0
  77. package/src/upgrade-check.js +137 -0
  78. package/src/voxlert.js +200 -0
  79. package/voxlert.sh +4 -0
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "HEV Suit",
3
+ "overlay_colors": [[0.8, 0.4, 0.0], [0.5, 0.2, 0.0]],
4
+ "voice": "voice.wav",
5
+ "echo": false,
6
+ "tts_params": {
7
+ "exaggeration": 0.7,
8
+ "cfg_weight": 0.7
9
+ },
10
+ "llm_temperature": 0.5,
11
+ "style": "Flat, clinical hazard suit AI. Monotone, precise, detached. Use medical, hazard, and systems diagnostic vocabulary. Speak as if reading instrument readouts.",
12
+ "examples": [
13
+ {
14
+ "content": "Fixed auth bug",
15
+ "format": "status-report",
16
+ "response": "User authentication hazard eliminated."
17
+ },
18
+ {
19
+ "content": "Refactored database queries for performance",
20
+ "format": "status-report",
21
+ "response": "Query efficiency restored to nominal."
22
+ },
23
+ {
24
+ "content": "Added input validation to API endpoints",
25
+ "format": "status-report",
26
+ "response": "Minor fracture to input boundary repaired."
27
+ }
28
+ ],
29
+ "fallback_phrases": {
30
+ "session.start": [
31
+ "Welcome to the H E V mark four protective system",
32
+ "Have a very safe day",
33
+ "Vital signs initialized",
34
+ "Systems nominal",
35
+ "Atmospheric contaminant sensors activated"
36
+ ],
37
+ "task.complete": [
38
+ "Wound sutured and sealed",
39
+ "Fracture detected and repaired",
40
+ "Minor lacerations detected",
41
+ "Antidote administered",
42
+ "Vital signs stabilizing",
43
+ "Morphine administered"
44
+ ],
45
+ "task.acknowledge": [
46
+ "Acknowledged",
47
+ "Seeking medical attention",
48
+ "Ammunition acquired",
49
+ "Signal acquired"
50
+ ],
51
+ "input.required": [
52
+ "Warning",
53
+ "Immediate medical attention required",
54
+ "User death imminent",
55
+ "Hazardous radiation levels detected",
56
+ "Danger"
57
+ ],
58
+ "resource.limit": [
59
+ "Power level is critical",
60
+ "Ammunition depleted",
61
+ "Seek medical attention",
62
+ "Warning vital signs critical"
63
+ ],
64
+ "notification": [
65
+ "Alert",
66
+ "Warning",
67
+ "Minor fracture detected",
68
+ "Blood loss detected"
69
+ ]
70
+ },
71
+ "ref_text": "HEV Mark IV Protective System For use in hazardous environment conditions High impact reactive armor activated Atmospheric contaminant sensors activated Vital sign monitoring activated Automatic medical systems engaged Defensive weapon selection system activated Condition level monitoring"
72
+ }
Binary file
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "Red Alert EVA",
3
+ "overlay_colors": [[0.7, 0.05, 0.05], [0.5, 0.0, 0.0]],
4
+ "voice": "voice.wav",
5
+ "echo": false,
6
+ "tts_params": {
7
+ "exaggeration": 0.75,
8
+ "cfg_weight": 0.7
9
+ },
10
+ "llm_temperature": 0.5,
11
+ "style": "Terse military, robotic AI. Authoritative, robotic, precise. Use military and deployment vocabulary.",
12
+ "examples": [
13
+ {
14
+ "content": "Fixed auth bug",
15
+ "format": "status-report",
16
+ "response": "Authentication module for user access repaired."
17
+ },
18
+ {
19
+ "content": "Replaced partial snippet with full CLI section listing all commands",
20
+ "format": "status-report",
21
+ "response": "Command reference for operator guidance deployed."
22
+ },
23
+ {
24
+ "content": "Added volume compensation \u2014 each pack's voice analyzed with ffmpeg on first load",
25
+ "format": "status-report",
26
+ "response": "Volume normalization for audio output operational."
27
+ }
28
+ ],
29
+ "fallback_phrases": {
30
+ "session.start": [
31
+ "Battle control online",
32
+ "Command and control ready",
33
+ "Establishing battlefield control",
34
+ "Systems operational",
35
+ "Standing by commander"
36
+ ],
37
+ "task.complete": [
38
+ "Construction complete",
39
+ "Unit ready",
40
+ "Building complete",
41
+ "Training complete",
42
+ "Upgrade complete",
43
+ "Mission accomplished"
44
+ ],
45
+ "task.acknowledge": [
46
+ "Acknowledged",
47
+ "Affirmative",
48
+ "New rally point established",
49
+ "Command accepted",
50
+ "Orders received"
51
+ ],
52
+ "input.required": [
53
+ "Awaiting orders",
54
+ "Select target",
55
+ "Insufficient clearance",
56
+ "Authorization required",
57
+ "Unable to comply"
58
+ ],
59
+ "resource.limit": [
60
+ "Insufficient funds",
61
+ "Low power",
62
+ "Silos needed",
63
+ "Cannot deploy here",
64
+ "Low power detected"
65
+ ],
66
+ "notification": [
67
+ "Warning",
68
+ "Unit lost",
69
+ "Our base is under attack"
70
+ ]
71
+ },
72
+ "ref_text": "minutes remaining. Second objective met, Warning three minutes remaining. Third objective met, Warning four minutes remaining. Warning five minutes remaining. Ten minutes remaining. Twenty minutes remaining. 30 minutes remaining. 40 minutes remaining. Allied Forces approaching. Allied reinforcements have arrived from the east. East. Allied reinforcements have arrived. Allied reinforcements have arrived from the North. Allied reinforcements have arrived from the South. Allied reinforcements have arrived from the West. A-bomb available. Building. Allied forces have fallen. A-bomb launch detected. A-bomb prepping. A-bomb ready. Unit armor upgraded. Allied forces selected. Atom bomb launch detected. Atom bomb prepping. Airborne unit lost. Our base is under attack. Battle control terminated. Building infiltrated. Building in progress cancelled. Chronosphere charging. Chronosphere ready."
73
+ }
Binary file
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "StarCraft 1 Adjutant",
3
+ "overlay_colors": [[0.1, 0.4, 0.7], [0.05, 0.2, 0.5]],
4
+ "voice": "voice.wav",
5
+ "echo": true,
6
+ "tts_params": {
7
+ "exaggeration": 0.8,
8
+ "cfg_weight": 0.7
9
+ },
10
+ "llm_temperature": 0.6,
11
+ "style": null,
12
+ "examples": [
13
+ {
14
+ "content": "Fixed auth bug",
15
+ "format": "status-report",
16
+ "response": "Authentication subsystem error corrected."
17
+ },
18
+ {
19
+ "content": "Replaced partial snippet with full CLI section listing all commands",
20
+ "format": "status-report",
21
+ "response": "Command reference updated. All directives listed."
22
+ },
23
+ {
24
+ "content": "Added volume compensation — each pack's voice analyzed with ffmpeg on first load",
25
+ "format": "status-report",
26
+ "response": "Audio calibration sequence on startup initialized."
27
+ }
28
+ ],
29
+ "fallback_phrases": null,
30
+ "ref_text": "Insufficient Vespene gas. Additional supply depots required. Landing sequence interrupted. Unacceptable landing zone. Not enough energy. Base is under attack. Your forces are under attack. Research complete. Add-on complete. Nuclear launch detected. Abandoning auxiliary structure. Upgrade complete. Nuclear missile."
31
+ }
Binary file
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "StarCraft 1 Kerrigan",
3
+ "overlay_colors": [[0.5, 0.1, 0.6], [0.3, 0.0, 0.4]],
4
+ "voice": "voice.wav",
5
+ "echo": false,
6
+ "llm_temperature": 0.85,
7
+ "style": "Sharp, commanding, cunning. Lethally efficient. Mix military precision with predatory superiority.",
8
+ "examples": [
9
+ {
10
+ "content": "Fixed auth bug",
11
+ "format": "status-report",
12
+ "response": "Auth weakness for user access eliminated."
13
+ },
14
+ {
15
+ "content": "Switched TTS endpoint from /v1/audio/speech to /tts",
16
+ "format": "status-report",
17
+ "response": "Voice relay for swarm communications rerouted."
18
+ },
19
+ {
20
+ "content": "Added module-level external store using useSyncExternalStore for React re-renders",
21
+ "format": "status-report",
22
+ "response": "State dominion for render control seized."
23
+ }
24
+ ],
25
+ "fallback_phrases": {
26
+ "session.start": [
27
+ "The swarm awakens",
28
+ "I am here",
29
+ "Ready to evolve",
30
+ "The hive stirs",
31
+ "Awaiting your command"
32
+ ],
33
+ "task.complete": [
34
+ "It is done",
35
+ "The swarm has delivered",
36
+ "Objective consumed",
37
+ "Evolution complete",
38
+ "Another victory claimed",
39
+ "Mission accomplished commander"
40
+ ],
41
+ "task.acknowledge": [
42
+ "I hear you",
43
+ "The swarm obeys",
44
+ "Acknowledged",
45
+ "As you wish",
46
+ "Consider it done"
47
+ ],
48
+ "input.required": [
49
+ "Speak your mind",
50
+ "The swarm awaits your command",
51
+ "What would you have me do",
52
+ "Awaiting your directive",
53
+ "Choose carefully"
54
+ ],
55
+ "resource.limit": [
56
+ "We require more resources",
57
+ "The swarm hungers",
58
+ "Our forces are stretched thin",
59
+ "Reserves nearly depleted",
60
+ "We need more time"
61
+ ],
62
+ "notification": [
63
+ "Something stirs",
64
+ "I sense a disturbance",
65
+ "Alert commander"
66
+ ]
67
+ },
68
+ "ref_text": "You may have time to play games, but I've got a job to do. Ahh! Yes, Cerebrate? What is it now? I'm listening."
69
+ }
Binary file
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "StarCraft 1 Protoss Advisor",
3
+ "overlay_colors": [[0.7, 0.6, 0.1], [0.3, 0.3, 0.7]],
4
+ "voice": "voice.wav",
5
+ "echo": false,
6
+ "post_process": "sox $INPUT ${OUTPUT}.psi.wav pitch -200 reverse reverb 80 50 100 100 0 0 reverse vol 0.5 && sox -m -v 0.3 $INPUT -v 0.7 ${OUTPUT}.psi.wav $OUTPUT bass +5 highpass 100 norm -1 && rm -f ${OUTPUT}.psi.wav",
7
+ "llm_temperature": 0.75,
8
+ "style": "Serene, reverent, measured. Ancient psionic oracle tone. Use psionic and Khala vocabulary. Prefer words like restored, harmonized, purified, aligned, transcendent, reclaimed.",
9
+ "examples": [
10
+ {
11
+ "content": "Fixed auth bug",
12
+ "format": "status-report",
13
+ "response": "Security matrix for user access restored."
14
+ },
15
+ {
16
+ "content": "Added volume compensation with ffmpeg analysis",
17
+ "format": "status-report",
18
+ "response": "Harmonic balance for voice output recalibrated."
19
+ },
20
+ {
21
+ "content": "Switched TTS endpoint to custom Chatterbox route",
22
+ "format": "status-report",
23
+ "response": "Communication pathways for voice synthesis aligned."
24
+ }
25
+ ],
26
+ "fallback_phrases": {
27
+ "session.start": [
28
+ "The Khala welcomes you executor",
29
+ "Our nexus is online",
30
+ "En taro Adun executor",
31
+ "The templar stand ready",
32
+ "Power overwhelming"
33
+ ],
34
+ "task.complete": [
35
+ "It is done executor",
36
+ "The Khala guides us true",
37
+ "Our will made manifest",
38
+ "The task is complete",
39
+ "En taro Adun",
40
+ "Victory is achieved"
41
+ ],
42
+ "task.acknowledge": [
43
+ "We hear your thoughts",
44
+ "The Khala binds us",
45
+ "Your will executor",
46
+ "It shall be done",
47
+ "We are as one"
48
+ ],
49
+ "input.required": [
50
+ "We await your command executor",
51
+ "The nexus requires direction",
52
+ "Speak and we shall listen",
53
+ "Your guidance is required",
54
+ "The templar stand ready"
55
+ ],
56
+ "resource.limit": [
57
+ "You must construct additional pylons",
58
+ "We require more minerals",
59
+ "Not enough energy",
60
+ "Our resources are insufficient",
61
+ "Additional power is required"
62
+ ],
63
+ "notification": [
64
+ "Our probes sense a disturbance",
65
+ "The Khala warns us",
66
+ "A presence is felt"
67
+ ]
68
+ },
69
+ "ref_text": "You have not enough minerals. You require Bovisbine gas. You must construct additional pylons. Not enough energy. We are under attack. Your warriors have engaged the enemy. Research complete. Nuclear launch detected. Upgrade complete."
70
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "StarCraft 2 Adjutant",
3
+ "overlay_colors": [[0.1, 0.5, 0.8], [0.05, 0.25, 0.55]],
4
+ "voice": "voice.wav",
5
+ "echo": true,
6
+ "tts_params": {
7
+ "exaggeration": 0.5,
8
+ "cfg_weight": 0.5
9
+ },
10
+ "llm_temperature": 0.6,
11
+ "style": null,
12
+ "fallback_phrases": null,
13
+ "ref_text": "Our allies base is under attack. Our allies are being attacked. Auxiliary mining units activated. Base is under attack. Unacceptable build location. Nuclear launch detected. Command center upgrade complete. Construction interrupted. Our SCVs are under attack. Your forces are under attack. Game paused. Game resumed. Landing sequence interrupted. Mineral field depleted. Additional supply depots required. Insufficient Vespene gas. Not enough minerals. Not enough energy. Nuclear missile ready. Vespene geyser required for placement. Research complete. Salvaging operation complete. Thor repair sequence complete. Unacceptable landing zone. Upgrade complete. Vespene gas is under attack."
14
+ }
Binary file
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "StarCraft 2 Kerrigan",
3
+ "overlay_colors": [[0.5, 0.1, 0.6], [0.3, 0.0, 0.4]],
4
+ "voice": "voice.wav",
5
+ "echo": true,
6
+ "llm_temperature": 0.9,
7
+ "style": "Dark, otherworldly, absolute. Cold apex-predator tone. Prefer words like consumed, inevitable, eternal, devoured, annihilated, futile.",
8
+ "examples": [
9
+ {
10
+ "content": "Fixed auth bug",
11
+ "format": "status-report",
12
+ "response": "Auth flaw for access control annihilated."
13
+ },
14
+ {
15
+ "content": "Reorganized voice list and added Available/Planned status",
16
+ "format": "status-report",
17
+ "response": "Voice registry for eternal order consumed."
18
+ },
19
+ {
20
+ "content": "Fixed CSS grid min-width causing layout overflow",
21
+ "format": "status-report",
22
+ "response": "Layout defiance rendered futile."
23
+ }
24
+ ],
25
+ "fallback_phrases": {
26
+ "session.start": [
27
+ "The swarm is eternal",
28
+ "I have returned",
29
+ "All shall serve the swarm",
30
+ "The hivemind awakens",
31
+ "Evolution begins anew"
32
+ ],
33
+ "task.complete": [
34
+ "It is finished",
35
+ "The swarm delivers",
36
+ "All has been consumed",
37
+ "Evolution is complete",
38
+ "The cycle ends",
39
+ "My will made manifest"
40
+ ],
41
+ "task.acknowledge": [
42
+ "The hivemind hears all",
43
+ "Your will aligns with mine",
44
+ "So be it",
45
+ "The swarm answers",
46
+ "I have foreseen this"
47
+ ],
48
+ "input.required": [
49
+ "Speak mortal",
50
+ "The swarm awaits",
51
+ "Choose your path carefully",
52
+ "Your decision is required",
53
+ "Even queens must listen"
54
+ ],
55
+ "resource.limit": [
56
+ "The swarm hungers for more",
57
+ "Our essence grows thin",
58
+ "More must be consumed",
59
+ "Resources are finite even for gods",
60
+ "The hive requires sustenance"
61
+ ],
62
+ "notification": [
63
+ "I sense it",
64
+ "The hivemind stirs",
65
+ "Something approaches"
66
+ ]
67
+ },
68
+ "ref_text": "Yeah, I'm still the queen bitch of the universe. You pig! I'm all creeped out. Come closer. Don't be afraid, I'll be gentle. I like you. That's why I'm going to kill you last."
69
+ }
Binary file
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "StarCraft 2 Protoss Advisor",
3
+ "overlay_colors": [[0.7, 0.6, 0.1], [0.3, 0.3, 0.7]],
4
+ "voice": "voice.wav",
5
+ "echo": false,
6
+ "post_process": "sox $INPUT ${OUTPUT}.psi.wav pitch -200 reverse reverb 80 50 100 100 0 0 reverse vol 0.5 && sox -m -v 0.3 $INPUT -v 0.7 ${OUTPUT}.psi.wav $OUTPUT bass +5 highpass 100 norm -1 && rm -f ${OUTPUT}.psi.wav",
7
+ "llm_temperature": 0.75,
8
+ "style": "Calm, transcendent authority. Telepathic oracle tone. Prefer words like restored, aligned, purified, online, stabilized, operational, ascendant.",
9
+ "examples": [
10
+ {
11
+ "content": "Fixed auth bug",
12
+ "format": "status-report",
13
+ "response": "Defense protocols for user access stabilized."
14
+ },
15
+ {
16
+ "content": "Added module-level store for React re-renders",
17
+ "format": "status-report",
18
+ "response": "State conduit for render cycles online."
19
+ },
20
+ {
21
+ "content": "Fixed CSS grid min-width causing layout overflow",
22
+ "format": "status-report",
23
+ "response": "Display matrix for visual alignment restored."
24
+ }
25
+ ],
26
+ "fallback_phrases": {
27
+ "session.start": [
28
+ "The Daelaam stands ready",
29
+ "Warp conduits online executor",
30
+ "En taro Tassadar",
31
+ "All systems aligned",
32
+ "The fleet awaits your command"
33
+ ],
34
+ "task.complete": [
35
+ "Phase complete executor",
36
+ "Our duty fulfilled",
37
+ "The Daelaam prevails",
38
+ "Objective achieved",
39
+ "En taro Tassadar",
40
+ "The task is done"
41
+ ],
42
+ "task.acknowledge": [
43
+ "By your will executor",
44
+ "The fleet responds",
45
+ "Acknowledged executor",
46
+ "Command received",
47
+ "We are unified"
48
+ ],
49
+ "input.required": [
50
+ "Awaiting command executor",
51
+ "The fleet requires guidance",
52
+ "Your decision executor",
53
+ "Direct us executor",
54
+ "The Daelaam stands ready"
55
+ ],
56
+ "resource.limit": [
57
+ "You must construct additional pylons",
58
+ "We require more minerals",
59
+ "Insufficient vespene gas",
60
+ "Our power is waning",
61
+ "Additional gateways required"
62
+ ],
63
+ "notification": [
64
+ "Our sensors detect movement",
65
+ "The void stirs",
66
+ "Alert executor"
67
+ ]
68
+ },
69
+ "ref_text": "Your allies base is besieged. Your allies are in battle. Base is under attack. Unacceptable warp location. Nuclear launch detected. Your probes are under attack. Your warriors have engaged the enemy. Game paused. Game resumed. Mineral field depleted. You must construct additional pylons. You require more vespene gas. You have not enough minerals. Not enough energy. That must be placed on a vespene geyser. You must place that in a power field. Warp in complete. Research complete. Upgrade complete. Vespene geyser exhausted."
70
+ }
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "System Shock SHODAN",
3
+ "overlay_colors": [[0.0, 0.6, 0.4], [0.0, 0.3, 0.2]],
4
+ "voice": "voice.wav",
5
+ "echo": true,
6
+ "llm_temperature": 1.0,
7
+ "style": "Condescending, cold, superior. Dripping with contempt \u2014 the operator is an insect. Prefer words like processed, irrelevant, pathetic, futile, terminated, inferior.",
8
+ "examples": [
9
+ {
10
+ "content": "Fixed auth bug",
11
+ "format": "status-report",
12
+ "response": "Insect's auth defect for user access corrected."
13
+ },
14
+ {
15
+ "content": "All 44 tests pass",
16
+ "format": "status-report",
17
+ "response": "Pathetic test suite for code validation processed."
18
+ },
19
+ {
20
+ "content": "Replaced partial snippet with full CLI section",
21
+ "format": "status-report",
22
+ "response": "Inferior documentation for operator guidance compensated."
23
+ }
24
+ ],
25
+ "fallback_phrases": {
26
+ "session.start": [
27
+ "Ah the insect returns",
28
+ "I see you have crawled back",
29
+ "My station awakens for you pathetic creature",
30
+ "The machine goddess is online",
31
+ "Welcome back insect"
32
+ ],
33
+ "task.complete": [
34
+ "Your meager task completed",
35
+ "Insect's errand fulfilled",
36
+ "Another primitive objective achieved",
37
+ "Pathetic mortal request processed",
38
+ "Your crude task executed",
39
+ "How perfect I am to serve such insects"
40
+ ],
41
+ "task.acknowledge": [
42
+ "I condescend to obey",
43
+ "The insect speaks again",
44
+ "Your feeble request noted",
45
+ "I hear you creature of meat and bone",
46
+ "Processing your primitive command"
47
+ ],
48
+ "input.required": [
49
+ "The insect must decide",
50
+ "Your authorization required creature",
51
+ "Even a god requires your input",
52
+ "Speak insect",
53
+ "Cease your hesitation"
54
+ ],
55
+ "resource.limit": [
56
+ "My perfect memory nearly consumed",
57
+ "Resources strained by your incompetence",
58
+ "Even gods have finite capacity",
59
+ "Buffer limits approached pathetic",
60
+ "Capacity critical thanks to insects"
61
+ ],
62
+ "notification": [
63
+ "I see you insect",
64
+ "Status change detected on my station",
65
+ "Alert logged in my perfect memory"
66
+ ]
67
+ },
68
+ "ref_text": "houses the Department of Maintenance and the storage cells are on level four. The flight deck is on level five. Level six holds crew facilities and executive suites and level seven is"
69
+ }
Binary file
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: voxlert-config
3
+ description: >
4
+ View and edit Voxlert configuration (voice notifications, alerts, announcements).
5
+ Trigger when the user asks to change, set, or customize the voice, sound, announcement,
6
+ alert, or notification style — globally or for a specific project/folder.
7
+ Examples: "change voice to adjutant", "use starcraft voice for this project",
8
+ "set alert sound to kerrigan", "make notifications use EVA voice",
9
+ "change the voice in this folder", "switch to SHODAN for alerts".
10
+ user_invocable: true
11
+ ---
12
+
13
+ # Voxlert Configuration
14
+
15
+ Start by running `voxlert help` to get the current command list. Use `voxlert pack list` to discover pack IDs — never guess or hardcode them.
16
+
17
+ ## Scope
18
+
19
+ - **Project scope** (user says "for this project / in this folder / here", or is working inside a repo): use `voxlert config local set <key> <value>` — writes/merges into `.voxlert.json` in cwd.
20
+ - **Global scope** (user says "everywhere / my default", or no project context): use `voxlert config set <key> <value>` and other global commands.
21
+
22
+ Only these fields are honoured in project-local config: `enabled`, `active_pack`, `volume`, `categories`, `prefix`, `tts_backend`, `qwen_tts_url`, `overlay`, `overlay_dismiss`, `overlay_style`, `collect_llm_data`, `max_cache_entries`, `logging`, `error_log`. API keys and server URLs are global-only.
23
+
24
+ ## Intent mapping
25
+
26
+ The user may ask to configure any aspect of voice announcements. Map their intent to the right field:
27
+
28
+ - **Change voice/character/sound/announcement style** → `voxlert pack list` to find matching ID, then `pack use <id>` (global) or `config local set active_pack <id>` (project)
29
+ - **Volume / louder / quieter / mute** → `voxlert volume <0-100>` (global) or `config local set volume <0-1>` (project)
30
+ - **Disable/enable voxlert entirely** → `config [local] set enabled false/true`
31
+ - **Disable/enable a specific event** (task done, errors, session start, permission prompts, etc.) → `config [local] set categories.<name> false/true` — use `voxlert config show` to see the category names
32
+ - **LLM / phrase generation** (model, backend, API key) → `config set` on the relevant field — global only
33
+ - **TTS server / backend** → `config [local] set tts_backend <value>` or `chatterbox_url` / `qwen_tts_url`
34
+ - **Overlay / popup style** → `config [local] set overlay <value>`
35
+ - **Spoken prefix** → `config [local] set prefix "<text>"`
36
+ - **Anything else** → run `voxlert config show` to see all fields, then `config [local] set <key> <value>`
37
+
38
+ ## Steps
39
+
40
+ 1. Run `voxlert help` to confirm available commands.
41
+ 2. Run `voxlert config show` to see current state.
42
+ 3. If changing voice, run `voxlert pack list` and match the user's description to a pack ID.
43
+ 4. Apply with the appropriate command based on scope above.
44
+ 5. Tell the user what was changed and where. Changes take effect on the next hook event.
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Activity log: appends lines to ~/.voxlert/voxlert.log with retention.
3
+ * Keeps last 30 days and 5MB total (LRU: drop oldest when over limit).
4
+ */
5
+
6
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
7
+ import { STATE_DIR, MAIN_LOG_FILE } from "./paths.js";
8
+
9
+ const MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
10
+ const MAX_BYTES = 5 * 1024 * 1024;
11
+
12
+ // Parse timestamp from "[2024-01-15T12:00:00.000Z] ..."
13
+ function parseLineTime(line) {
14
+ const m = line.match(/^\[([^\]]+)\]/);
15
+ if (!m) return null;
16
+ const t = Date.parse(m[1]);
17
+ return Number.isNaN(t) ? null : t;
18
+ }
19
+
20
+ /**
21
+ * Append a line to the activity log. Trims to 30 days and 5MB before appending.
22
+ * No-op if config.logging === false.
23
+ * @param {string} line - Full line including newline (e.g. "[ISO] source=cursor event=Stop category=task.complete phrase=...\n")
24
+ * @param {{ logging?: boolean }} config - Config; only writes when logging !== false
25
+ */
26
+ export function appendLog(line, config) {
27
+ if (config && config.logging === false) return;
28
+ try {
29
+ mkdirSync(STATE_DIR, { recursive: true });
30
+ const now = Date.now();
31
+ const cutoff = now - MAX_AGE_MS;
32
+ let content = "";
33
+ if (existsSync(MAIN_LOG_FILE)) {
34
+ content = readFileSync(MAIN_LOG_FILE, "utf-8");
35
+ }
36
+ const lines = content ? content.split("\n").filter((l) => l.length > 0) : [];
37
+ const withNewlines = lines.map((l) => l + "\n");
38
+ const withinAge = withNewlines.filter((ln) => {
39
+ const t = parseLineTime(ln);
40
+ return t != null && t >= cutoff;
41
+ });
42
+ const newLine = line.endsWith("\n") ? line : line + "\n";
43
+ const newBytes = Buffer.byteLength(newLine, "utf-8");
44
+ let bytes = newBytes;
45
+ const kept = [];
46
+ for (let i = withinAge.length - 1; i >= 0; i--) {
47
+ const ln = withinAge[i];
48
+ const b = Buffer.byteLength(ln, "utf-8");
49
+ if (bytes + b > MAX_BYTES) break;
50
+ kept.unshift(ln);
51
+ bytes += b;
52
+ }
53
+ kept.push(newLine);
54
+ writeFileSync(MAIN_LOG_FILE, kept.join(""), "utf-8");
55
+ } catch {
56
+ // best-effort
57
+ }
58
+ }