cdee5f2245
Event log integrity (sole source of truth): - SqliteEventStore: serialize append/appendAll under a Mutex, enable WAL + busy_timeout + synchronous=NORMAL, roll back on any Throwable. Replaces the app-computed `SELECT MAX(seq)+1` read-modify-write that dropped events under concurrent appends (race was invisible to CI: only the in-memory store and single-threaded :memory: tests were ever exercised). - Serialization: encodeDefaults + ignoreUnknownKeys, explicit @SerialName on all 46 EventPayload subclasses and event-referenced enum constants, @Serializable on RiskLevel/RiskAction. Guards the append-only log against silent corruption from future class renames, field removals, or default-value changes. Approval/grant security (Invariant: approvals cannot widen authority): - Tier authorization is now a ceiling (request.tier.level <= max granted) instead of set membership; SESSION grants bind to a specific toolName instead of matching everything; handleCreateGrant rejects empty/over-tier/scopeless grants. Router chat wiring (Phase 0-2): ChatInput round-trip, StartChatSession from IDLE, router-panel layout, workflows behind Ctrl+W. Tests: SqliteEventStore concurrency, serialization round-trip + discriminator stability + unknown-key tolerance, adversarial grant scope/tier; updated existing approval and reducer tests for the new grant semantics and StartChatSession effect.
74 lines
2.5 KiB
Groovy
74 lines
2.5 KiB
Groovy
plugins {
|
|
id 'org.jetbrains.kotlin.jvm'
|
|
id 'org.jetbrains.kotlin.plugin.serialization'
|
|
id 'application'
|
|
}
|
|
|
|
application {
|
|
mainClass = 'com.correx.apps.tui.TuiAppKt'
|
|
}
|
|
|
|
repositories {
|
|
maven {
|
|
url 'https://central.sonatype.com/repository/maven-snapshots/'
|
|
mavenContent { snapshotsOnly() }
|
|
}
|
|
}
|
|
|
|
configurations.all {
|
|
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
|
|
}
|
|
|
|
dependencies {
|
|
implementation project(':apps:server')
|
|
implementation project(':core:events')
|
|
implementation project(':core:approvals')
|
|
implementation project(':core:router')
|
|
|
|
implementation "io.ktor:ktor-client-core:$ktor_version"
|
|
implementation "io.ktor:ktor-client-cio:$ktor_version"
|
|
implementation "io.ktor:ktor-client-websockets:$ktor_version"
|
|
implementation "io.ktor:ktor-client-logging:$ktor_version"
|
|
|
|
implementation platform('dev.tamboui:tamboui-bom:0.3.0')
|
|
implementation 'dev.tamboui:tamboui-tui'
|
|
implementation 'dev.tamboui:tamboui-widgets'
|
|
implementation 'dev.tamboui:tamboui-core'
|
|
runtimeOnly 'dev.tamboui:tamboui-jline3-backend'
|
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinx_coroutines_version"
|
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinx_serialization_version"
|
|
|
|
testImplementation "org.jetbrains.kotlin:kotlin-test"
|
|
testImplementation "org.jetbrains.kotlin:kotlin-test-junit5"
|
|
testImplementation "org.junit.jupiter:junit-jupiter:5.10.2"
|
|
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinx_coroutines_version"
|
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.2"
|
|
}
|
|
|
|
tasks.named('test') { useJUnitPlatform() }
|
|
|
|
tasks.register('tuiStartScripts', CreateStartScripts) {
|
|
mainClass = 'com.correx.apps.tui.TuiAppKt'
|
|
applicationName = 'tui'
|
|
outputDir = file("$buildDir/scripts-tui")
|
|
classpath = tasks.named('startScripts').get().classpath
|
|
}
|
|
|
|
distributions.named('main').configure {
|
|
contents {
|
|
from(tasks.named('tuiStartScripts')) { into 'bin' }
|
|
}
|
|
}
|
|
|
|
tasks.withType(Tar).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
|
tasks.withType(Zip).configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
|
tasks.named("installDist") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
|
|
|
configurations.configureEach {
|
|
resolutionStrategy.force(
|
|
"com.github.ajalt.mordant:mordant:2.6.0",
|
|
"com.github.ajalt.mordant:mordant-jvm:2.6.0"
|
|
)
|
|
}
|
|
tasks.named("koverVerify").configure { enabled = false }
|