Skip to content
Draft
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
96 commits
Select commit Hold shift + click to select a range
e8e42eb
feat(activation): license a demo song and name first-run next actions
seonghobae Aug 23, 2026
eded10b
test(activation): bind demo bundle destination to runtime lookup
seonghobae Aug 23, 2026
2d1de84
fix(activation): align bundled demo destination with runtime lookup
seonghobae Aug 23, 2026
9ced398
fix(activation): satisfy licensed-demo public documentation gate
seonghobae Aug 23, 2026
22ba7ae
test(analysis): require browser analysis to fail closed
seonghobae Aug 23, 2026
cfb2cff
fix(analysis): fail browser analysis closed
seonghobae Aug 23, 2026
127db19
docs(analysis): state browser analysis fail-closed contract
seonghobae Aug 23, 2026
1ece98e
fix(licensing): remove demo CC0 usage ambiguity
seonghobae Aug 24, 2026
5bddc15
docs(activation): correct demo provenance refresh order
seonghobae Aug 24, 2026
e11c528
test(security): reject demo provenance dot segments
seonghobae Aug 24, 2026
cffdd22
fix(security): reject demo provenance dot segments
seonghobae Aug 24, 2026
90c13ae
fix(demo): refresh license provenance metadata
seonghobae Aug 24, 2026
7ffd39b
test(analysis): align failed status contract
seonghobae Aug 24, 2026
c8015b8
test(workspace): isolate state transitions
seonghobae Aug 24, 2026
0200dca
test(workspace): align licensed demo state assertions
seonghobae Aug 24, 2026
b2082e5
fix: close licensed demo review findings
seonghobae Aug 24, 2026
7c5256f
test: remove unused demo selection mock
seonghobae Aug 24, 2026
8600478
fix: guard all audio source selection paths
seonghobae Aug 24, 2026
8ae7232
Merge branch 'develop' into feat/licensed-demo-first-run
seonghobae Aug 25, 2026
5c5a42a
Merge remote-tracking branch 'origin/develop' into HEAD
seonghobae Aug 26, 2026
2adaf85
fix(app): disable source-bar intake buttons while a selection is pending
seonghobae Aug 26, 2026
336995a
fix(app): clear stale selection state when a project loads
seonghobae Aug 26, 2026
6c4fe95
style(core): apply rustfmt to demo validation
seonghobae Aug 28, 2026
45f7e2e
test(activation): preserve local source-selection concurrency
seonghobae Sep 1, 2026
bff1702
ci: repair source-selection race at canonical owner
seonghobae Sep 1, 2026
8a7f237
chore(ci): retire source selection repair workflow
seonghobae Sep 1, 2026
a8e86c6
chore(ci): run bounded source selection repair
seonghobae Sep 1, 2026
4bc5bba
chore(ci): trigger bounded source selection repair
seonghobae Sep 1, 2026
dbeb181
fix(activation): serialize source selection authority
seonghobae Sep 1, 2026
c9a3c8e
chore(ci): remove completed source selection repair workflow
seonghobae Sep 1, 2026
74cf412
chore(ci): remove source selection repair trigger
seonghobae Sep 1, 2026
8e72fcd
test(supply-chain): require demo package inventory
seonghobae Sep 1, 2026
6e776c6
test(supply-chain): name demo asset checksum explicitly
seonghobae Sep 1, 2026
cbe02fe
fix(supply-chain): inventory bundled demo assets
seonghobae Sep 1, 2026
c15c87b
docs(changelog): record first-run authority and inventory repairs
seonghobae Sep 1, 2026
e335d90
docs: align disabled tooltip accessibility guidance
seonghobae Sep 1, 2026
5eb44d1
docs: document empty-state source kinds
seonghobae Sep 1, 2026
220a62a
docs: complete demo asset refresh order
seonghobae Sep 1, 2026
9bbbb87
test: bind demo inventory to packaged files
seonghobae Sep 1, 2026
9dae5ec
chore(ci): add bounded PR1009 repair runner
seonghobae Sep 1, 2026
012bc9b
chore(ci): trigger bounded PR1009 repair
seonghobae Sep 1, 2026
88ed260
fix(ci): make bounded PR1009 repair runner executable
seonghobae Sep 1, 2026
ec57d34
ci: add bounded PR1009 repair script
seonghobae Sep 1, 2026
929d04d
ci: execute bounded PR1009 source repair
seonghobae Sep 1, 2026
c3fbc02
chore(ci): remove completed PR1009 repair trigger
seonghobae Sep 1, 2026
f27486c
chore(ci): remove completed PR1009 repair script
seonghobae Sep 1, 2026
9857597
chore(ci): remove completed PR1009 repair workflow
seonghobae Sep 1, 2026
653e970
chore(ci): stage direct PR1009 source repair
seonghobae Sep 1, 2026
02a88c2
chore(ci): trigger direct PR1009 source repair
seonghobae Sep 1, 2026
feb9bf7
fix(ci): honor BandScope npm devEngine in PR1009 repair
seonghobae Sep 1, 2026
37d532a
chore(ci): retry direct PR1009 repair after npm toolchain fix
seonghobae Sep 1, 2026
2c5e20c
fix(ci): scope demo path rewrite to validator
seonghobae Sep 1, 2026
a90746b
chore(ci): retry direct PR1009 repair after scoped Rust fix
seonghobae Sep 1, 2026
9c0b018
fix(workspace): serialize intake and validate demo WAV contract
github-actions[bot] Sep 1, 2026
571342c
test(demo): reject symlinked package assets
seonghobae Sep 1, 2026
f74772a
refactor(demo): centralize canonical song title
seonghobae Sep 1, 2026
317cb6e
fix(demo): preserve canonical title in analysis request
seonghobae Sep 1, 2026
f90fe24
fix(demo): keep canonical title through job updates
seonghobae Sep 1, 2026
68b065c
test(demo): preserve canonical title across job updates
seonghobae Sep 1, 2026
17ce4e4
chore(demo): run one-shot structural contract repair
seonghobae Sep 1, 2026
3d4e4e8
fix(ci): harden one-shot demo repair script
seonghobae Sep 1, 2026
8154b47
test(demo): require structurally analyzable licensed audio
seonghobae Sep 1, 2026
c0eb3bc
fix(ci): remove self-modifying demo repair workflow
seonghobae Sep 1, 2026
c4d2dc2
fix(demo): extend licensed audio structural window
seonghobae Sep 1, 2026
5081ee1
fix(demo): align annotations with structural windows
seonghobae Sep 1, 2026
a0d1044
fix(demo): validate the extended licensed wav size
seonghobae Sep 1, 2026
d806a5e
chore(demo): materialize deterministic binary asset once
seonghobae Sep 1, 2026
317aa9f
test(demo): prove duration follows decoded frames
seonghobae Sep 1, 2026
11161b7
fix(demo): derive duration from decoded frames
seonghobae Sep 1, 2026
d58878c
fix(ci): constrain demo materialization authority
seonghobae Sep 1, 2026
d54dd2e
chore(demo): serialize artifact materialization
seonghobae Sep 1, 2026
5fbcb09
test(demo): reject oversized UTF-8 provenance
seonghobae Sep 1, 2026
8a9c72e
fix(demo): enforce provenance UTF-8 byte ceiling
seonghobae Sep 1, 2026
5dd45a8
test(demo): bind runtime size to packaged audio
seonghobae Sep 1, 2026
7ad8403
chore(demo): run one final artifact materialization
seonghobae Sep 1, 2026
f5f0f87
test(demo): require semantic internal provenance names
seonghobae Sep 1, 2026
a6e092a
fix(demo): translate provenance wire names at boundary
seonghobae Sep 1, 2026
e27afbd
test(demo): keep wire compatibility at adapter boundary
seonghobae Sep 1, 2026
b15515e
docs(demo): record provenance naming boundary
seonghobae Sep 1, 2026
8e90a88
docs(changelog): record provenance naming adapter
seonghobae Sep 1, 2026
2c8b584
docs(architecture): define demo provenance adapter boundary
seonghobae Sep 1, 2026
80ca113
ci(repair): unblock licensed demo materializer queue
seonghobae Sep 1, 2026
c5b44d4
fix(demo): materialize structurally analyzable licensed asset
github-actions[bot] Sep 1, 2026
681b95a
test(demo): reproduce title loss after renderer reload
seonghobae Sep 1, 2026
6fc41a3
fix(demo): preserve title marker across renderer reload
seonghobae Sep 1, 2026
afd0d0e
test(demo): cover unavailable session storage
seonghobae Sep 1, 2026
1a89944
fix(demo): retain title without session storage
seonghobae Sep 1, 2026
b6078b2
docs(product): establish licensed-demo technical gap baseline
seonghobae Sep 1, 2026
5fd89d1
docs(activation): defer canonical gap baseline to #1116
seonghobae Sep 1, 2026
813c230
test(demo): format supply-chain regression
seonghobae Sep 2, 2026
c5bc6c8
test(desktop): require legacy runner to fail closed
seonghobae Sep 2, 2026
11d4540
fix(desktop): fail legacy browser analysis closed
seonghobae Sep 2, 2026
f1013db
docs(changelog): record fail-closed legacy analysis bridge
seonghobae Sep 2, 2026
d9d2614
test(activation): preserve demo progress label
seonghobae Sep 2, 2026
61dd36a
fix(activation): preserve licensed demo ready label
seonghobae Sep 2, 2026
d25512e
docs(changelog): record demo ready-label repair
seonghobae Sep 2, 2026
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
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,4 @@ This section applies to any agent (Claude, Codex, Cursor, opencode, ...) working
- Do not justify risky debug defaults as temporary shortcuts.
- Do not defer dependency review, SBOM generation, or supply-chain checks to a later phase.
- Do not defer Windows or macOS build enforcement to a later phase.
- The licensed demo is original CC0 audio that must pass the same local-audio intake as a user-selected file. Never present mocked browser success as production analysis.
1 change: 1 addition & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ Last updated: 2026-03-11
- The current shared-types baseline includes a rehearsal-domain fixture that exercises section, role, cue, confidence, provenance, and export-summary fields in the desktop shell before the full analysis pipeline lands.
- Local analysis orchestration uses typed Tauri IPC commands and a Python subprocess over stdin/stdout rather than a loopback HTTP listener.
- Local audio intake bootstraps a project by validating a user-selected file in Rust, creating app-owned temp/cache/project roots, and referencing the original source file rather than copying it in this phase.
- First-run empty workspace names **Try the demo** and **Use my own song**. The licensed demo is the CC0 `Late Night Set` package under `apps/desktop/src-tauri/resources/demo/` and enters through `select_demo_audio_source`, which reuses the same bootstrap as a user-selected local file.
- Those bootstrap roots should resolve from app-owned Tauri data/cache paths instead of the shared system temp namespace.
- Product and UX decisions should prefer rehearsal-first simplicity while still maintaining high analytical accuracy.
- Security decisions should prefer allowlisted narrow capabilities over generic convenience APIs.
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Added

- First-run empty workspace offers **Try the demo** and **Use my own song**, with a CC0 licensed `Late Night Set` package that uses the same local-audio intake as a user-selected file (#964).
- Display the analyzed song tempo (BPM) as a badge in the rehearsal workspace.
- 각 합주 역할(Role)별 개인 연습 진행도를 0~100% 범위로 기록 및 시각화할 수 있는 연습 진척도(`practiceProgress`) 트래커 기능 추가. UI 컨트롤(슬라이더 및 +/- 버튼)과 한/영 다국어 지원 포함.

Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ BandScope is a local-first desktop app for rehearsal prep: it turns a song into

Three layers, decoupled through shared contracts:

- `apps/desktop` — Tauri 2 + Vite + React 19 shell (Tailwind 4, Base UI, Storybook). Feature screens live in `src/features/` (home, workspace, chords, ranges, player, settings). `src/lib/analysis.ts` and `src/lib/job_runner.ts` call typed Tauri IPC commands, with a browser fallback that serves demo data when not running inside Tauri.
- `apps/desktop/src-tauri/src/main.rs` — the Rust orchestration boundary. Tauri commands (`start_analysis_job`, `get_analysis_job_status`, `select_local_audio_source`, `import_youtube_url`) validate untrusted input (project IDs, file paths, URLs) and spawn the Python engine as a subprocess. There is no loopback HTTP listener and no network path for local analysis.
- `apps/desktop` — Tauri 2 + Vite + React 19 shell (Tailwind 4, Base UI, Storybook). Feature screens live in `src/features/` (home, workspace, chords, ranges, player, settings). `src/lib/analysis.ts` and `src/lib/job_runner.ts` call typed Tauri IPC commands. Without the desktop IPC bridge, analysis fails closed instead of synthesizing a production success; bundled licensed-demo intake is desktop-only and also fails closed in the browser.
- `apps/desktop/src-tauri/src/main.rs` — the Rust orchestration boundary. Tauri commands (`start_analysis_job`, `get_analysis_job_status`, `select_local_audio_source`, `select_demo_audio_source`, `import_youtube_url`) validate untrusted input (project IDs, file paths, URLs) and spawn the Python engine as a subprocess. There is no loopback HTTP listener and no network path for local analysis.
- `services/analysis-engine` — Python package `bandscope_analysis` (librosa/numpy). Entry point `cli.py` reads a JSON job request on stdin and prints a structured job-status JSON envelope on stdout (`--progress-jsonl` streams progress lines). `api.py` orchestrates the pipeline across the `separation`, `sections`, `roles`, `chords`, `ranges`, `temporal`, `transcription`, and `youtube` modules.

Data flow: React UI → Tauri IPC command → Rust validation + Python subprocess over stdin/stdout → job status and progress events emitted back to the UI.
Expand Down
206 changes: 206 additions & 0 deletions apps/desktop/core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ pub const ANALYSIS_WAIT_POLL: Duration = Duration::from_millis(50);

pub const AUDIO_EXTENSIONS: [&str; 4] = ["wav", "mp3", "flac", "m4a"];

pub const DEMO_AUDIO_FILE_NAME: &str = "late-night-set.wav";

pub const DEMO_AUDIO_BYTES: u64 = 88244;
Comment thread
seonghobae marked this conversation as resolved.
Outdated

pub const DEMO_UNAVAILABLE_MESSAGE: &str =
"The licensed demo song could not be loaded. Use your own song to start tonight.";

const WAV_RIFF_MAGIC: &[u8] = b"RIFF";

const WAV_WAVE_MAGIC: &[u8] = b"WAVE";

pub const MISSING_ANALYSIS_PYTHON: &str = "__bandscope_missing_analysis_python__";

pub const YOUTUBE_IMPORT_TIMEOUT: Duration = Duration::from_secs(120);
Expand Down Expand Up @@ -655,6 +666,124 @@ pub fn validate_score_pdf_source(path: &Path) -> Result<(PathBuf, String, u64),
Ok((canonical, file_name, file_size_bytes))
}

/// Validate the bundled licensed demo WAV before it reuses local-audio bootstrap.
pub fn validate_demo_audio_source(path: &Path) -> Result<LocalAudioSourcePayload, String> {
let link_metadata = std::fs::symlink_metadata(path)
.map_err(|_| DEMO_UNAVAILABLE_MESSAGE.to_string())?;
#[cfg(not(all(coverage, windows)))]
if link_metadata.file_type().is_symlink() {
return Err(DEMO_UNAVAILABLE_MESSAGE.to_string());
}

#[cfg(coverage)]
let canonical = path
.canonicalize()
.expect("demo audio path should canonicalize after metadata lookup");
#[cfg(not(coverage))]
let canonical = path
.canonicalize()
.map_err(|_| DEMO_UNAVAILABLE_MESSAGE.to_string())?;

let file_name = canonical
.file_name()
.and_then(|value| value.to_str())
.ok_or_else(|| DEMO_UNAVAILABLE_MESSAGE.to_string())?;
if file_name != DEMO_AUDIO_FILE_NAME {
return Err(DEMO_UNAVAILABLE_MESSAGE.to_string());
}
let extension = canonical
.extension()
.and_then(|value| value.to_str())
.map(|value| value.to_ascii_lowercase())
.ok_or_else(|| DEMO_UNAVAILABLE_MESSAGE.to_string())?;
if extension != "wav" {
return Err(DEMO_UNAVAILABLE_MESSAGE.to_string());
}
if !link_metadata.is_file() || link_metadata.len() != DEMO_AUDIO_BYTES {
return Err(DEMO_UNAVAILABLE_MESSAGE.to_string());
}

let data = std::fs::read(&canonical).map_err(|_| DEMO_UNAVAILABLE_MESSAGE.to_string())?;
if !is_valid_demo_wav(&data) {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
return Err(DEMO_UNAVAILABLE_MESSAGE.to_string());
}
Comment thread
seonghobae marked this conversation as resolved.

Ok(LocalAudioSourcePayload {
source_path: canonical.to_string_lossy().into_owned(),
file_name: file_name.to_string(),
extension,
file_size_bytes: link_metadata.len(),
})
}

fn is_valid_demo_wav(data: &[u8]) -> bool {
if data.len() < 44
|| &data[0..4] != WAV_RIFF_MAGIC
|| &data[8..12] != WAV_WAVE_MAGIC
|| u32::from_le_bytes([data[4], data[5], data[6], data[7]]) as usize != data.len() - 8
{
return false;
}

let mut offset = 12usize;
let mut has_format = false;
let mut has_data = false;
while offset < data.len() {
let header_end = match offset.checked_add(8) {
Some(value) if value <= data.len() => value,
_ => return false,
};
let chunk_size = u32::from_le_bytes([
data[offset + 4],
data[offset + 5],
data[offset + 6],
data[offset + 7],
]) as usize;
let chunk_end = match header_end.checked_add(chunk_size) {
Some(value) if value <= data.len() => value,
_ => return false,
};
let next_offset = match chunk_end.checked_add(chunk_size % 2) {
Some(value) if value <= data.len() => value,
_ => return false,
};

match &data[offset..offset + 4] {
b"fmt " if chunk_size >= 16 => {
let format = u16::from_le_bytes([data[header_end], data[header_end + 1]]);
let channels = u16::from_le_bytes([data[header_end + 2], data[header_end + 3]]);
let sample_rate = u32::from_le_bytes([
data[header_end + 4],
data[header_end + 5],
data[header_end + 6],
data[header_end + 7],
]);
let byte_rate = u32::from_le_bytes([
data[header_end + 8],
data[header_end + 9],
data[header_end + 10],
data[header_end + 11],
]);
let block_align = u16::from_le_bytes([data[header_end + 12], data[header_end + 13]]);
let bits_per_sample =
u16::from_le_bytes([data[header_end + 14], data[header_end + 15]]);
has_format = format == 1
&& channels > 0
&& sample_rate > 0
&& byte_rate > 0
&& block_align > 0
&& bits_per_sample > 0;
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Outdated
}
b"data" if chunk_size > 0 => has_data = true,
_ => {}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
}

offset = next_offset;
}

offset == data.len() && has_format && has_data
Comment thread
seonghobae marked this conversation as resolved.
Outdated
}
Comment thread
seonghobae marked this conversation as resolved.
Outdated

/// Security Notes: reads and deletes never accept an arbitrary path from the
/// WebView. The path is rebuilt server-side from validated ids, symlinks are
/// refused, and the canonicalized result must still live under the
Expand Down Expand Up @@ -1280,4 +1409,81 @@ mod tests {
let _ = std::fs::remove_dir_all(scores_root);
let _ = std::fs::remove_dir_all(outside_root);
}

fn write_sized_demo_wav(path: &Path, bytes: u64, riff: bool, wave: bool) {
let mut data = vec![0u8; bytes as usize];
if riff && wave && data.len() >= 44 {
let data_len = data.len() as u32;
data[0..4].copy_from_slice(b"RIFF");
data[4..8].copy_from_slice(&(data_len - 8).to_le_bytes());
data[8..12].copy_from_slice(b"WAVE");
data[12..16].copy_from_slice(b"fmt ");
data[16..20].copy_from_slice(&16u32.to_le_bytes());
data[20..22].copy_from_slice(&1u16.to_le_bytes());
data[22..24].copy_from_slice(&1u16.to_le_bytes());
data[24..28].copy_from_slice(&44_100u32.to_le_bytes());
data[28..32].copy_from_slice(&88_200u32.to_le_bytes());
data[32..34].copy_from_slice(&2u16.to_le_bytes());
data[34..36].copy_from_slice(&16u16.to_le_bytes());
data[36..40].copy_from_slice(b"data");
data[40..44].copy_from_slice(&(data_len - 44).to_le_bytes());
}
std::fs::write(path, data).expect("demo fixture should be written");
}

#[test]
fn demo_audio_validation_accepts_the_licensed_wav_contract() {
let root = unique_test_dir("demo-valid");
std::fs::create_dir_all(&root).expect("demo root should be created");
let path = root.join(DEMO_AUDIO_FILE_NAME);
write_sized_demo_wav(&path, DEMO_AUDIO_BYTES, true, true);
let source = validate_demo_audio_source(&path).expect("licensed demo wav should validate");
assert_eq!(source.file_name, DEMO_AUDIO_FILE_NAME);
assert_eq!(source.extension, "wav");
assert_eq!(source.file_size_bytes, DEMO_AUDIO_BYTES);
let _ = std::fs::remove_dir_all(root);
}

#[test]
fn demo_audio_validation_rejects_wrong_name_size_magic_and_missing_files() {
let root = unique_test_dir("demo-reject");
std::fs::create_dir_all(&root).expect("demo root should be created");

let wrong_name = root.join("other.wav");
write_sized_demo_wav(&wrong_name, DEMO_AUDIO_BYTES, true, true);
assert!(validate_demo_audio_source(&wrong_name).is_err());

let wrong_size = root.join(DEMO_AUDIO_FILE_NAME);
write_sized_demo_wav(&wrong_size, 12, true, true);
assert!(validate_demo_audio_source(&wrong_size).is_err());

write_sized_demo_wav(&wrong_size, DEMO_AUDIO_BYTES, true, true);
let mut malformed = std::fs::read(&wrong_size).expect("valid demo fixture should be readable");
malformed[4..8].copy_from_slice(&(DEMO_AUDIO_BYTES as u32).to_le_bytes());
std::fs::write(&wrong_size, malformed).expect("malformed fixture should be writable");
assert!(validate_demo_audio_source(&wrong_size).is_err());

write_sized_demo_wav(&wrong_size, DEMO_AUDIO_BYTES, false, true);
assert!(validate_demo_audio_source(&wrong_size).is_err());

write_sized_demo_wav(&wrong_size, DEMO_AUDIO_BYTES, true, false);
assert!(validate_demo_audio_source(&wrong_size).is_err());

let missing = root.join("missing").join(DEMO_AUDIO_FILE_NAME);
assert!(validate_demo_audio_source(&missing).is_err());

#[cfg(unix)]
{
let valid = root.join("target.wav");
write_sized_demo_wav(&valid, DEMO_AUDIO_BYTES, true, true);
let linked = root.join(DEMO_AUDIO_FILE_NAME);
let _ = std::fs::remove_file(&linked);
std::os::unix::fs::symlink(&valid, &linked).expect("symlink should be created");
assert!(validate_demo_audio_source(&linked).is_err());
}

let _ = std::fs::remove_dir_all(root);
}


}
5 changes: 4 additions & 1 deletion apps/desktop/src-tauri/capabilities/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "main-capability",
"description": "Capability for the main BandScope window to use the analysis orchestration commands.",
"windows": ["main"],
"windows": [
"main"
],
"permissions": [
"core:event:allow-listen",
"core:event:allow-unlisten",
"allow-start-analysis-job",
"allow-get-analysis-job-status",
"allow-select-local-audio-source",
"allow-select-demo-audio-source",
"allow-import-youtube-url",
"allow-save-project",
"allow-load-project",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/gen/schemas/acl-manifests.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/desktop/src-tauri/gen/schemas/capabilities.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"main-capability":{"identifier":"main-capability","description":"Capability for the main BandScope window to use the analysis orchestration commands.","local":true,"windows":["main"],"permissions":["core:event:allow-listen","core:event:allow-unlisten","allow-start-analysis-job","allow-get-analysis-job-status","allow-select-local-audio-source","allow-import-youtube-url","allow-save-project","allow-load-project","allow-attach-score-pdf","allow-read-score-pdf","allow-remove-score-pdf"]}}
{"main-capability":{"identifier":"main-capability","description":"Capability for the main BandScope window to use the analysis orchestration commands.","local":true,"windows":["main"],"permissions":["core:event:allow-listen","core:event:allow-unlisten","allow-start-analysis-job","allow-get-analysis-job-status","allow-select-local-audio-source","allow-select-demo-audio-source","allow-import-youtube-url","allow-save-project","allow-load-project","allow-attach-score-pdf","allow-read-score-pdf","allow-remove-score-pdf"]}}
12 changes: 12 additions & 0 deletions apps/desktop/src-tauri/gen/schemas/desktop-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,12 @@
"const": "allow-select-local-audio-source",
"markdownDescription": "Enables the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Enables the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "allow-select-demo-audio-source",
"markdownDescription": "Enables the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Enables the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand Down Expand Up @@ -278,6 +284,12 @@
"const": "deny-select-local-audio-source",
"markdownDescription": "Denies the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Denies the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "deny-select-demo-audio-source",
"markdownDescription": "Denies the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Denies the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand Down
12 changes: 12 additions & 0 deletions apps/desktop/src-tauri/gen/schemas/linux-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,12 @@
"const": "allow-select-local-audio-source",
"markdownDescription": "Enables the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Enables the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "allow-select-demo-audio-source",
"markdownDescription": "Enables the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Enables the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand All @@ -206,6 +212,12 @@
"const": "deny-select-local-audio-source",
"markdownDescription": "Denies the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Denies the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "deny-select-demo-audio-source",
"markdownDescription": "Denies the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Denies the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand Down
12 changes: 12 additions & 0 deletions apps/desktop/src-tauri/gen/schemas/macOS-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,12 @@
"const": "allow-select-local-audio-source",
"markdownDescription": "Enables the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Enables the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "allow-select-demo-audio-source",
"markdownDescription": "Enables the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Enables the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand Down Expand Up @@ -278,6 +284,12 @@
"const": "deny-select-local-audio-source",
"markdownDescription": "Denies the select_local_audio_source command without any pre-configured scope."
},
{
"description": "Denies the select_demo_audio_source command without any pre-configured scope.",
"type": "string",
"const": "deny-select-demo-audio-source",
"markdownDescription": "Denies the select_demo_audio_source command without any pre-configured scope."
},
{
"description": "Denies the start_analysis_job command without any pre-configured scope.",
"type": "string",
Expand Down
Loading
Loading