Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 6 additions & 6 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
kotlin = "2.3.21"
coroutines = "1.11.0"
serialization = "1.11.0"
datetime = "0.6.2"
datetime = "0.8.0"
ktor = "3.5.0"
sqlite = "3.53.1.0"
jose-jwt = "10.9"
kotlin-logging = "8.0.03"
sqlite = "3.53.2.0"
jose-jwt = "10.9.1"
kotlin-logging = "8.0.4"
slf4j = "2.0.18"
logback = "1.5.32"
json-schema-validator = "3.0.2"
logback = "1.5.34"
json-schema-validator = "3.0.3"
clikt = "5.1.0"
kotest = "6.1.11"
ktlint = "14.2.0"
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/credentials/Credential.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package dev.arcp.credentials

import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.time.Instant

/** Provisioned credential scheme. */
@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package dev.arcp.credentials
import dev.arcp.ids.JobId
import dev.arcp.lease.CostBudget
import dev.arcp.lease.ModelUseLease
import kotlinx.datetime.Instant
import kotlin.time.Instant

/** Issues and revokes lease-bound credentials for accepted jobs. */
public interface CredentialProvisioner {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/main/kotlin/dev/arcp/envelope/Envelope.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import dev.arcp.ids.SubscriptionId
import dev.arcp.ids.TraceId
import dev.arcp.json.arcpJson
import dev.arcp.messages.MessageType
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
Expand All @@ -28,6 +26,8 @@ import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.put
import kotlin.time.Clock
import kotlin.time.Instant

/**
* Canonical ARCP message envelope (RFC §6.1).
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/error/ARCPException.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dev.arcp.error

import dev.arcp.ids.LeaseId
import dev.arcp.ids.PermissionName
import kotlinx.datetime.Instant
import kotlin.time.Instant

/**
* Base type for every error that originates inside the ARCP runtime or client.
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Artifacts.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package dev.arcp.messages

import dev.arcp.ids.ArtifactId
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.time.Instant

/**
* Canonical artifact pointer (RFC §16.1). Embedded inside payloads where a
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Control.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import dev.arcp.ids.JobId
import dev.arcp.ids.MessageId
import dev.arcp.ids.SessionId
import dev.arcp.ids.StreamId
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import kotlin.time.Instant

/**
* `ping` — liveness probe (RFC §6.2 Control). Receivers reply with [Pong].
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Execution.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import dev.arcp.error.ErrorCode
import dev.arcp.ids.JobId
import dev.arcp.ids.MessageId
import dev.arcp.ids.ToolName
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlin.time.Instant

/** `tool.invoke` — direct tool call (RFC §6.2 Execution). */
@Serializable
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Permissions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package dev.arcp.messages

import dev.arcp.ids.LeaseId
import dev.arcp.ids.PermissionName
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.time.Instant

/** `permission.request` — runtime asks for a capability grant (RFC §15.4). */
@Serializable
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Session.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import dev.arcp.ids.JobId
import dev.arcp.ids.MessageId
import dev.arcp.ids.SessionId
import dev.arcp.ids.TraceId
import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.time.Instant

/**
* Heartbeat-recovery policy advertised in [Capabilities] (RFC §10.3).
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/messages/Telemetry.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package dev.arcp.messages

import kotlinx.datetime.Instant
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlin.time.Instant

/** Standard log levels (RFC §17.2). */
@Serializable
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/runtime/ArtifactPutRequest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dev.arcp.runtime

import dev.arcp.ids.ArtifactId
import dev.arcp.ids.SessionId
import kotlinx.datetime.Instant
import kotlin.time.Instant

/**
* Parameter object for [ArtifactStore.put].
Expand Down
4 changes: 2 additions & 2 deletions lib/src/main/kotlin/dev/arcp/runtime/ArtifactStore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import java.security.MessageDigest
import java.sql.Connection
import java.util.Base64
import kotlin.time.Clock
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Instant

private val log = KotlinLogging.logger {}

Expand Down
4 changes: 2 additions & 2 deletions lib/src/main/kotlin/dev/arcp/runtime/JobCommandHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import dev.arcp.messages.JobListEntry
import dev.arcp.messages.JobSubmit
import dev.arcp.messages.SessionListJobs
import dev.arcp.transport.Transport
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.time.Clock
import kotlin.time.Instant

/**
* Handles the client-driven job commands `session.list_jobs` and `job.submit`,
Expand Down
Binary file modified lib/src/main/kotlin/dev/arcp/runtime/JobInventory.kt
Binary file not shown.
4 changes: 2 additions & 2 deletions lib/src/main/kotlin/dev/arcp/runtime/LeaseParsing.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import dev.arcp.lease.BudgetAmount
import dev.arcp.lease.CostBudget
import dev.arcp.lease.ModelUseLease
import dev.arcp.messages.JobListLease
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.jsonPrimitive
import java.math.BigDecimal
import kotlin.time.Clock
import kotlin.time.Instant

/** Parses the `cost.budget` lease patterns, or `null` when absent. */
internal fun parseCostBudget(leaseRequest: JsonObject): CostBudget? {
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/runtime/RuntimeModels.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import dev.arcp.ids.SessionId
import dev.arcp.lease.CostBudget
import dev.arcp.lease.ModelUseLease
import dev.arcp.messages.JobAccepted
import kotlinx.datetime.Instant
import java.util.concurrent.ConcurrentHashMap
import kotlin.time.Instant

/** Active (non-terminal) job state retained by the runtime. */
internal data class RuntimeJob(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import dev.arcp.messages.SessionLease
import dev.arcp.messages.SessionOpen
import dev.arcp.messages.SessionRejected
import dev.arcp.messages.SessionUnauthenticated
import kotlinx.datetime.Clock
import kotlin.time.Clock
import kotlin.time.Duration

/** Result of the session handshake: the resulting state and the reply to send. */
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/kotlin/dev/arcp/runtime/SessionState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package dev.arcp.runtime
import dev.arcp.error.ErrorCode
import dev.arcp.ids.SessionId
import dev.arcp.messages.Capabilities
import kotlinx.datetime.Instant
import kotlin.time.Instant

/**
* Authoritative session state machine (RFC §8 / §9).
Expand Down
8 changes: 4 additions & 4 deletions lib/src/main/kotlin/dev/arcp/store/EventLog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,9 @@ public class EventLog private constructor(
ps.setString(2, idempotencyKey)
ps.executeQuery().use { rs ->
if (!rs.next()) return@use null
val expires = kotlinx.datetime.Instant.parse(rs.getString(2))
val expires = kotlin.time.Instant.parse(rs.getString(2))
if (expires <
kotlinx.datetime.Clock.System
kotlin.time.Clock.System
.now()
) {
return@use null
Expand All @@ -191,7 +191,7 @@ public class EventLog private constructor(
principal: String,
idempotencyKey: String,
outcome: JsonElement,
expiresAt: kotlinx.datetime.Instant,
expiresAt: kotlin.time.Instant,
) {
withIo {
val sql =
Expand All @@ -206,7 +206,7 @@ public class EventLog private constructor(
ps.setString(3, outcome.toString())
ps.setString(
4,
kotlinx.datetime.Clock.System
kotlin.time.Clock.System
.now()
.toString(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import dev.arcp.messages.Pong
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import kotlinx.datetime.Instant
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlin.time.Instant

class EnvelopeRoundTripTest :
StringSpec({
Expand Down
2 changes: 1 addition & 1 deletion lib/src/test/kotlin/dev/arcp/error/ARCPExceptionTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.types.shouldBeInstanceOf
import kotlinx.datetime.Instant
import kotlin.time.Instant

class ARCPExceptionTest :
StringSpec({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ import dev.arcp.ids.ToolName
import dev.arcp.json.arcpJson
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import kotlinx.datetime.Instant
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.buildJsonObject
import kotlin.time.Instant

class MessageCatalogTest :
StringSpec({
Expand Down
4 changes: 2 additions & 2 deletions lib/src/test/kotlin/dev/arcp/runtime/ArtifactStoreTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldStartWith
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.time.Clock
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Instant

private fun req(
id: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import kotlinx.coroutines.test.runTest
import kotlinx.datetime.Instant
import kotlin.time.Instant

class ListJobsHandlerTest :
StringSpec({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.yield
import kotlinx.datetime.Instant
import kotlin.time.Instant

@OptIn(ExperimentalCoroutinesApi::class)
class SubscriptionManagerTest :
Expand Down
4 changes: 2 additions & 2 deletions lib/src/test/kotlin/dev/arcp/store/EventLogTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.withTimeout
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlinx.serialization.json.JsonPrimitive
import kotlin.time.Clock
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Instant

class EventLogTest :
StringSpec({
Expand Down
2 changes: 1 addition & 1 deletion recipes/stream-resume/Server.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import dev.arcp.messages.SessionOpen
import dev.arcp.messages.JobSubmit
import dev.arcp.transport.Transport
import kotlinx.coroutines.flow.collect
import kotlinx.datetime.Clock
import kotlin.time.Clock
import kotlin.time.Duration.Companion.hours

// ---------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions samples/src/main/kotlin/com/arcp/samples/heartbeats/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.time.Clock
import kotlin.time.Instant

/** Supervisor + worker pool. Heartbeat loss reroutes via idempotency_key. */

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.time.Clock
import kotlin.time.Instant

/**
* Demonstrates lease TTL tracking and proactive refresh before expiry (RFC §9.4).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import kotlin.time.Clock
import kotlin.time.Instant

/** Warehouse DB admin agent. Reads pre-granted; writes prompt operator. */

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import dev.arcp.ids.LeaseId
import dev.arcp.ids.PermissionName
import dev.arcp.lease.ModelUseLease
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlin.time.Clock

/**
* Demonstrates three categories of lease violation (RFC §9.5):
Expand Down
2 changes: 1 addition & 1 deletion samples/src/main/kotlin/com/arcp/samples/listjobs/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import dev.arcp.messages.JobListEntry
import dev.arcp.messages.JobListFilter
import dev.arcp.runtime.InMemoryJobInventory
import kotlinx.coroutines.runBlocking
import kotlinx.datetime.Clock
import kotlin.time.Clock

public fun main(): Unit = runBlocking {
val inventory = InMemoryJobInventory()
Expand Down
2 changes: 1 addition & 1 deletion samples/src/main/kotlin/com/arcp/samples/tracing/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import dev.arcp.trace.currentTrace
import dev.arcp.trace.withSpan
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.datetime.Clock
import kotlin.time.Clock
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put

Expand Down
Loading