Phase 5: :memory-vector (JVector + SQLite + LLM-эмбеддинги), memory-abstraction, compaction, MessageContext
- :memory-api — общий контракт MemoryStore/Prefetcher/Reviewer/Tools/MemorySystem
- :memory-md (KMP, kotlinx-io) — Hermes-style §-файлы, keyword overlap
- :memory-vector (JVM-only) — JVector ANN + SQLite + HttpEmbeddingClient
- :standalone — AGENTIK_MEMORY_BACKEND={md,vector,off}, выбор в Main.kt
- :standalone — compaction рабочего контекста (LiteLlmContextCompactor + reviewPreCompaction)
- :proto — MessageContext (origin: user/system/event) на send и в Message
- :server — backward-compat dual-format для POST /messages
- README — env-vars, vector-бэкенд docs
This commit is contained in:
@@ -3,10 +3,14 @@
|
||||
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
||||
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
|
||||
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.gradle.api.artifacts.ConfigurationContainer
|
||||
|
||||
plugins {
|
||||
alias(libs.plugins.kotlin.multiplatform)
|
||||
alias(libs.plugins.kotlin.serialization)
|
||||
alias(libs.plugins.sqldelight)
|
||||
alias(libs.plugins.shadow)
|
||||
}
|
||||
|
||||
kotlin {
|
||||
@@ -41,6 +45,11 @@ kotlin {
|
||||
// Парсер и загрузчик скилов (YAML frontmatter + markdown body).
|
||||
implementation(project(":skills"))
|
||||
|
||||
// Долговременная память (Hermes-style MD-бэкенд).
|
||||
implementation(project(":memory-api"))
|
||||
implementation(project(":memory-md"))
|
||||
implementation(project(":memory-vector"))
|
||||
|
||||
// litert-openai: JVM-реализация
|
||||
implementation(libs.litert.openai)
|
||||
// litert-google: встроенный LiteRT-LM движок, нужен только на runtime
|
||||
@@ -93,3 +102,55 @@ sqldelight {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- Fatjar (uberjar) ---
|
||||
//
|
||||
// :standalone — KMP jvm-only бэкенд. Стандартный KMP `jvmJar` содержит только
|
||||
// наши классы и требует подтянуть все зависимости на runtime через classpath.
|
||||
// Для дистрибутива нужен self-contained `*-all.jar`, который содержит и наш
|
||||
// код, и runtime classpath. Делается это Shadow-плагином:
|
||||
//
|
||||
// 1. shadowJar расширяет `jvmJar` (через from(tasks.named("jvmJar")))
|
||||
// 2. Добавляет все артефакты из jvmRuntimeClasspath как `zipTree`
|
||||
// 3. Корректно сливает META-INF/services (через ServiceFileTransformer)
|
||||
// 4. Прописывает Main-Class в манифесте
|
||||
//
|
||||
// Результат: `build/libs/standalone-*-all.jar` запускается как
|
||||
// java -jar standalone-0.1.0-all.jar
|
||||
//
|
||||
// KMP-сборка под ios/lin/macos не затрагивается — задача живёт только в jvm.
|
||||
// Shadow 8.x не авторегистрирует shadowJar в KMP-проектах (нет стандартного `jar`),
|
||||
// поэтому регистрируем явно через tasks.register.
|
||||
//
|
||||
// В Gradle 9 KGP подменяет `configurations` на сгенерированный dependency-accessor
|
||||
// (он возвращает List), поэтому используем прямой доступ к Project API.
|
||||
val shadowJarTask = tasks.register<ShadowJar>("shadowJar") {
|
||||
archiveBaseName.set("standalone")
|
||||
archiveClassifier.set("all")
|
||||
description = "Self-contained fatjar with all runtime dependencies bundled."
|
||||
group = "build"
|
||||
|
||||
from(tasks.named("jvmJar"))
|
||||
// javaClass-каст через Any? чтобы вытащить реальный ConfigurationContainer
|
||||
// из любого типа, который сейчас прикидывается `configurations`.
|
||||
val cc = try {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
configurations as org.gradle.api.artifacts.ConfigurationContainer
|
||||
} catch (_: ClassCastException) {
|
||||
// KGP-generated dependency accessor; обходим через raw project.
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
(project as org.gradle.api.Project).configurations as org.gradle.api.artifacts.ConfigurationContainer
|
||||
}
|
||||
from(cc.getByName("jvmRuntimeClasspath"))
|
||||
|
||||
mergeServiceFiles()
|
||||
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||
|
||||
manifest {
|
||||
attributes["Main-Class"] = "pw.binom.agentik.standalone.MainKt"
|
||||
attributes["Implementation-Title"] = "agentik-standalone"
|
||||
attributes["Implementation-Version"] = project.version.toString()
|
||||
}
|
||||
|
||||
includeEmptyDirs = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user