effect-agent 0.1.0-beta.131 → 0.1.0-beta.133

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 (55) hide show
  1. package/dist/{Admin-C34cVKlT.d.mts → Admin-CUja0lmO.d.mts} +21 -3
  2. package/dist/{DurableAgentRuntime-BydyN_n-.mjs → DurableAgentRuntime-DH2baLGe.mjs} +13 -21
  3. package/dist/DurableAgentRuntime-DH2baLGe.mjs.map +1 -0
  4. package/dist/{EventSource-Bac0SxKL.d.mts → EventSource-DoiZF3xv.d.mts} +2 -2
  5. package/dist/{PreparedInputAdmission-DcQGQ0Yp.d.mts → PreparedInputAdmission-B1bzyIuV.d.mts} +3 -3
  6. package/dist/{Subscription-Bk2Smmqc.d.mts → Subscription-m_yNfNeN.d.mts} +2 -2
  7. package/dist/{SubscriptionInput-ekbJz3pF.d.mts → SubscriptionInput-ON3-b8Sl.d.mts} +2 -2
  8. package/dist/durable/Admin.d.mts +1 -1
  9. package/dist/durable/AgentRegistration.d.mts +1 -1
  10. package/dist/durable/Certification.d.mts +1 -1
  11. package/dist/durable/CommittedActivity.d.mts +1 -1
  12. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  13. package/dist/durable/DurableAgentRuntime.mjs +1 -1
  14. package/dist/durable/EventSource.d.mts +1 -1
  15. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  16. package/dist/durable/MessageDelivery.d.mts +41 -41
  17. package/dist/durable/MessageDeliveryStoreConformance.d.mts +1 -1
  18. package/dist/durable/PersistentHistory.d.mts +1 -1
  19. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  20. package/dist/durable/Recovery.d.mts +1 -1
  21. package/dist/durable/RunJournal.d.mts +1 -1
  22. package/dist/durable/Scheduling.d.mts +1 -1
  23. package/dist/durable/SqlStorageV2Upgrade.d.mts +1 -1
  24. package/dist/durable/SqlSubscriptionStore.d.mts +1 -1
  25. package/dist/durable/SqlThreadNativeReads.d.mts +2 -1
  26. package/dist/durable/SqlThreadNativeReads.mjs +75 -38
  27. package/dist/durable/SqlThreadNativeReads.mjs.map +1 -1
  28. package/dist/durable/SubmissionLedger.d.mts +1 -1
  29. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  30. package/dist/durable/SubmissionStatus.d.mts +1 -1
  31. package/dist/durable/Subscription.d.mts +1 -1
  32. package/dist/durable/SubscriptionInput.d.mts +1 -1
  33. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  34. package/dist/durable/SubscriptionTools.d.mts +2 -2
  35. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  36. package/dist/durable/Subscriptions.d.mts +5 -5
  37. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  38. package/dist/durable/ThreadInvariants.d.mts +1 -1
  39. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  40. package/dist/durable/ThreadStore.d.mts +2 -2
  41. package/dist/durable/ThreadStore.mjs +30 -2
  42. package/dist/durable/ThreadStore.mjs.map +1 -1
  43. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  44. package/dist/durable/ThreadStoreConformance.mjs +34 -3
  45. package/dist/durable/ThreadStoreConformance.mjs.map +1 -1
  46. package/dist/durable/WorkerHost.d.mts +1 -1
  47. package/dist/index.d.mts +5 -5
  48. package/dist/index.mjs +2 -2
  49. package/package.json +1 -1
  50. package/src/durable/SqlThreadNativeReads.ts +75 -2
  51. package/src/durable/ThreadStore.ts +63 -1
  52. package/src/durable/ThreadStoreConformance.ts +113 -1
  53. package/src/durable/internal/agent-updates.ts +4 -0
  54. package/src/durable/internal/worker-host.ts +17 -18
  55. package/dist/DurableAgentRuntime-BydyN_n-.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { O as PersistedJson } from "./Records-B5GFWCpn.mjs";
2
- import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, t as AcceptedEvent } from "./Subscription-Bk2Smmqc.mjs";
2
+ import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, t as AcceptedEvent } from "./Subscription-m_yNfNeN.mjs";
3
3
  import { Context, Effect, Schema, Scope } from "effect";
4
4
  declare namespace EventSource_d_exports {
5
5
  export { EventSource, EventSources, NormalizedEvent, makeEventSource };
@@ -48,4 +48,4 @@ declare const makeEventSource: <Event extends Schema.Top, Parameters extends Sch
48
48
  }) => Effect.Effect<EventSource, never, Exclude<R, Scope.Scope> | Exclude<Event["DecodingServices"], Scope.Scope> | Exclude<Event["EncodingServices"], Scope.Scope> | Exclude<Parameters["DecodingServices"], Scope.Scope> | Exclude<Parameters["EncodingServices"], Scope.Scope>>;
49
49
  //#endregion
50
50
  export { makeEventSource as a, NormalizedEvent as i, EventSource_d_exports as n, EventSources as r, EventSource as t };
51
- //# sourceMappingURL=EventSource-Bac0SxKL.d.mts.map
51
+ //# sourceMappingURL=EventSource-DoiZF3xv.d.mts.map
@@ -1,8 +1,8 @@
1
1
  import { a as Receipt } from "./Receipt-BAHyigAF.mjs";
2
2
  import { a as FailureDiagnostic_d_exports, r as Diagnostic } from "./FailureDiagnostic-CaAkzGHL.mjs";
3
- import { fi as SubmissionStatus } from "./Admin-C34cVKlT.mjs";
3
+ import { mi as SubmissionStatus } from "./Admin-CUja0lmO.mjs";
4
4
  import { H as ScheduledInputRefused, V as ScheduledInputFailure, j as ScheduleStorageError } from "./Schedule-CtYREFnz.mjs";
5
- import { a as PreparedInput } from "./Subscription-Bk2Smmqc.mjs";
5
+ import { a as PreparedInput } from "./Subscription-m_yNfNeN.mjs";
6
6
  import { Context, Effect } from "effect";
7
7
  declare namespace PreparedInputAdmission_d_exports {
8
8
  export { PreparedInputAdmission, admitPreparedInput };
@@ -39,4 +39,4 @@ declare const admitPreparedInput: <R>(submit: Effect.Effect<Receipt, ScheduledIn
39
39
  }, ScheduleStorageError, R>;
40
40
  //#endregion
41
41
  export { PreparedInputAdmission_d_exports as n, admitPreparedInput as r, PreparedInputAdmission as t };
42
- //# sourceMappingURL=PreparedInputAdmission-DcQGQ0Yp.d.mts.map
42
+ //# sourceMappingURL=PreparedInputAdmission-B1bzyIuV.d.mts.map
@@ -3,7 +3,7 @@ import { a as Receipt, r as Principal } from "./Receipt-BAHyigAF.mjs";
3
3
  import { r as Update } from "./AgentUpdates-DMJ-_xow.mjs";
4
4
  import { t as AgentPolicy } from "./AgentPolicy-BqDoSXO6.mjs";
5
5
  import { _ as Digest, h as DefinitionDigests } from "./Records-B5GFWCpn.mjs";
6
- import "./Admin-C34cVKlT.mjs";
6
+ import "./Admin-CUja0lmO.mjs";
7
7
  import { t as ScheduleAuthorizationDecision } from "./Schedule-CtYREFnz.mjs";
8
8
  import { Context, Effect, Schema } from "effect";
9
9
  declare namespace Subscription_d_exports {
@@ -976,4 +976,4 @@ declare const subscriptionKeyString: (key: SubscriptionKey) => string;
976
976
  declare const subscriptionDeliveryKeyString: (key: SubscriptionDeliveryKey) => string;
977
977
  //#endregion
978
978
  export { defaultSubscriptionLimits as A, SubscriptionScanCursors as C, SubscriptionStore as D, SubscriptionSourceError as E, subscriptionKeyString as M, SubscriptionStoreFailure as O, SubscriptionRetentionPolicy as S, SubscriptionSnapshot as T, SubscriptionKey as _, PreparedInput as a, SubscriptionRecord as b, SubscriptionAuthorizer as c, SubscriptionDelivery as d, SubscriptionDeliveryKey as f, SubscriptionFailpointError as g, SubscriptionFailpoint as h, EventSourceVersion as i, subscriptionDeliveryKeyString as j, Subscription_d_exports as k, SubscriptionChange as l, SubscriptionError as m, DeliveryChange as n, SourcePartition as o, SubscriptionDeliverySnapshot as p, EventAcknowledgement as r, SourceRecovery as s, AcceptedEvent as t, SubscriptionConfiguration as u, SubscriptionLimits as v, SubscriptionScope as w, SubscriptionRefusal as x, SubscriptionName as y };
979
- //# sourceMappingURL=Subscription-Bk2Smmqc.d.mts.map
979
+ //# sourceMappingURL=Subscription-m_yNfNeN.d.mts.map
@@ -1,6 +1,6 @@
1
1
  import { t as AgentId } from "./Identifiers-CN2s30fF.mjs";
2
2
  import { O as PersistedJson, h as DefinitionDigests } from "./Records-B5GFWCpn.mjs";
3
- import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, m as SubscriptionError, t as AcceptedEvent, u as SubscriptionConfiguration } from "./Subscription-Bk2Smmqc.mjs";
3
+ import { E as SubscriptionSourceError, b as SubscriptionRecord, i as EventSourceVersion, m as SubscriptionError, t as AcceptedEvent, u as SubscriptionConfiguration } from "./Subscription-m_yNfNeN.mjs";
4
4
  import { Context, Effect, Schema, Scope } from "effect";
5
5
  declare namespace SubscriptionInput_d_exports {
6
6
  export { SubscriptionInputBinding, SubscriptionInputBindings, makeSubscriptionInputBinding, resolveSubscriptionInput };
@@ -38,4 +38,4 @@ declare const makeSubscriptionInputBinding: <Event extends Schema.Top, Parameter
38
38
  }) => Effect.Effect<SubscriptionInputBinding, never, Exclude<R, Scope.Scope> | Exclude<Continuation["DecodingServices"], Scope.Scope> | Exclude<Continuation["EncodingServices"], Scope.Scope> | Exclude<Event["DecodingServices"], Scope.Scope> | Exclude<Input["EncodingServices"], Scope.Scope> | Exclude<Parameters["DecodingServices"], Scope.Scope>>;
39
39
  //#endregion
40
40
  export { resolveSubscriptionInput as a, makeSubscriptionInputBinding as i, SubscriptionInputBindings as n, SubscriptionInput_d_exports as r, SubscriptionInputBinding as t };
41
- //# sourceMappingURL=SubscriptionInput-ekbJz3pF.d.mts.map
41
+ //# sourceMappingURL=SubscriptionInput-ON3-b8Sl.d.mts.map
@@ -1,2 +1,2 @@
1
- import { C as renderRecoveryExplanation, S as recoveryDecisionMeaning, _ as RetryCommand, a as IntegrityCheck, b as obligationSeverityOf, c as IntegrityReport, d as ObligationReport, f as ObligationSeverity, g as RecoveryExplanation, h as RecoveryDisposition, i as ExplainedUnknownCall, l as ObligationBlockedOn, m as RECOVERY_DECISION_MEANINGS, n as ExplainedEvidence, o as IntegrityCheckName, p as ObligationThresholds, r as ExplainedSubmission, s as IntegrityCheckStatus, u as ObligationEntry, v as RetryRefusalReason, x as predictRecoveryDisposition, y as RetryRefused } from "../Admin-C34cVKlT.mjs";
1
+ import { C as renderRecoveryExplanation, S as recoveryDecisionMeaning, _ as RetryCommand, a as IntegrityCheck, b as obligationSeverityOf, c as IntegrityReport, d as ObligationReport, f as ObligationSeverity, g as RecoveryExplanation, h as RecoveryDisposition, i as ExplainedUnknownCall, l as ObligationBlockedOn, m as RECOVERY_DECISION_MEANINGS, n as ExplainedEvidence, o as IntegrityCheckName, p as ObligationThresholds, r as ExplainedSubmission, s as IntegrityCheckStatus, u as ObligationEntry, v as RetryRefusalReason, x as predictRecoveryDisposition, y as RetryRefused } from "../Admin-CUja0lmO.mjs";
2
2
  export { ExplainedEvidence, ExplainedSubmission, ExplainedUnknownCall, IntegrityCheck, IntegrityCheckName, IntegrityCheckStatus, IntegrityReport, ObligationBlockedOn, ObligationEntry, ObligationReport, ObligationSeverity, ObligationThresholds, RECOVERY_DECISION_MEANINGS, RecoveryDisposition, RecoveryExplanation, RetryCommand, RetryRefusalReason, RetryRefused, obligationSeverityOf, predictRecoveryDisposition, recoveryDecisionMeaning, renderRecoveryExplanation };
@@ -1,2 +1,2 @@
1
- import { Ca as DurableWorkerBinding, Da as compileBindingContracts, Ea as ResolvedBinding, Oa as compileRegistrations, Sa as DurableBindingFailure, Ta as ReplayVersions, ba as AgentRegistration, ka as definitionDigestsEqual, wa as ExecutableAgentBinding, xa as BindingUnavailable, ya as AgentAttemptContext } from "../Admin-C34cVKlT.mjs";
1
+ import { Aa as compileRegistrations, Ca as BindingUnavailable, Da as ReplayVersions, Ea as ExecutableAgentBinding, Oa as ResolvedBinding, Sa as AgentRegistration, Ta as DurableWorkerBinding, ja as definitionDigestsEqual, ka as compileBindingContracts, wa as DurableBindingFailure, xa as AgentAttemptContext } from "../Admin-CUja0lmO.mjs";
2
2
  export { type AgentAttemptContext, type AgentRegistration, BindingUnavailable, type DurableBindingFailure, DurableWorkerBinding, type ExecutableAgentBinding, type ReplayVersions, type ResolvedBinding, compileBindingContracts, compileRegistrations, definitionDigestsEqual };
@@ -1,4 +1,4 @@
1
- import { Qr as ThreadStore, _n as SubmissionLedger } from "../Admin-C34cVKlT.mjs";
1
+ import { _n as SubmissionLedger, ei as ThreadStore } from "../Admin-CUja0lmO.mjs";
2
2
  import { Crypto, Effect, Schema } from "effect";
3
3
  //#region src/durable/Certification.d.ts
4
4
  declare const CertifiedAdapterIdentity_base: Schema.Class<CertifiedAdapterIdentity, Schema.Struct<{
@@ -1,7 +1,7 @@
1
1
  import { O as PersistedJson, l as CanonicalRecordEnvelope } from "../Records-B5GFWCpn.mjs";
2
2
  import { ActivityProcessorKey, ActivityProcessorStore, ActivityStoreFailure, PreparedActivity } from "./ActivityStore.mjs";
3
3
  import { t as DigestError } from "../Digest-U69rDHuO.mjs";
4
- import { Qr as ThreadStore, Vr as ThreadNotMaterialized, ei as ThreadStoreError } from "../Admin-C34cVKlT.mjs";
4
+ import { Ur as ThreadNotMaterialized, ei as ThreadStore, ni as ThreadStoreError } from "../Admin-CUja0lmO.mjs";
5
5
  import { Crypto, Effect, Schema, Scope } from "effect";
6
6
  declare namespace CommittedActivity_d_exports {
7
7
  export { ActivityPassLimits, ActivityPassResult, ActivityProcessingError, CommittedActivityProcessor, activityWorkId, processCommittedActivity };
@@ -1,3 +1,3 @@
1
1
  import { a as Receipt } from "../Receipt-BAHyigAF.mjs";
2
- import { $n as DurableApprovalSuspension, Cr as recoveryRepairRecordId, Jn as DurableAbortFailure, Qn as DurableApprovalResolver, Sr as recoveryRepairBatchId, Tr as threadCreatedRecordId, Yn as DurableAgentRuntime, Zn as DurableApprovalFailure, _r as RecoveryReport, ar as DurableResolveFailure, br as childReservationIdFor, cr as DurableRuntimeConfigOptions, dr as DurableSubmitOptions, er as DurableAwaitFailure, fr as DurableVerifyFailure, gr as RecoveryFailure, hr as RecoveryBlocked, ir as DurableProgressFailure, lr as DurableSubmitAgent, mr as DurableWorkerRequirements, nr as DurableObligationFailure, or as DurableRetryFailure, pr as DurableWorkerFailure, qn as ApprovalSuspensionError, rr as DurableObserveOptions, sr as DurableRuntimeConfig, tr as DurableExplainFailure, ur as DurableSubmitFailure, vr as RecoverySweepOptions, wr as threadCreatedBatchId, xr as isolateRecovery, yr as RecoverySweepResult } from "../Admin-C34cVKlT.mjs";
2
+ import { $n as DurableApprovalSuspension, Cr as recoveryRepairRecordId, Jn as DurableAbortFailure, Qn as DurableApprovalResolver, Sr as recoveryRepairBatchId, Tr as threadCreatedRecordId, Yn as DurableAgentRuntime, Zn as DurableApprovalFailure, _r as RecoveryReport, ar as DurableResolveFailure, br as childReservationIdFor, cr as DurableRuntimeConfigOptions, dr as DurableSubmitOptions, er as DurableAwaitFailure, fr as DurableVerifyFailure, gr as RecoveryFailure, hr as RecoveryBlocked, ir as DurableProgressFailure, lr as DurableSubmitAgent, mr as DurableWorkerRequirements, nr as DurableObligationFailure, or as DurableRetryFailure, pr as DurableWorkerFailure, qn as ApprovalSuspensionError, rr as DurableObserveOptions, sr as DurableRuntimeConfig, tr as DurableExplainFailure, ur as DurableSubmitFailure, vr as RecoverySweepOptions, wr as threadCreatedBatchId, xr as isolateRecovery, yr as RecoverySweepResult } from "../Admin-CUja0lmO.mjs";
3
3
  export { ApprovalSuspensionError, DurableAbortFailure, DurableAgentRuntime, DurableApprovalFailure, DurableApprovalResolver, DurableApprovalSuspension, DurableAwaitFailure, DurableExplainFailure, DurableObligationFailure, DurableObserveOptions, DurableProgressFailure, DurableResolveFailure, DurableRetryFailure, DurableRuntimeConfig, DurableRuntimeConfigOptions, DurableSubmitAgent, DurableSubmitFailure, DurableSubmitOptions, DurableVerifyFailure, DurableWorkerFailure, DurableWorkerRequirements, Receipt, RecoveryBlocked, RecoveryFailure, RecoveryReport, RecoverySweepOptions, RecoverySweepResult, childReservationIdFor, isolateRecovery, recoveryRepairBatchId, recoveryRepairRecordId, threadCreatedBatchId, threadCreatedRecordId };
@@ -1,3 +1,3 @@
1
1
  import { Receipt } from "../core/Receipt.mjs";
2
- import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, g as threadCreatedRecordId, h as threadCreatedBatchId, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-BydyN_n-.mjs";
2
+ import { a as DurableApprovalSuspension, c as RecoveryFailure, d as childReservationIdFor, f as isolateRecovery, g as threadCreatedRecordId, h as threadCreatedBatchId, i as DurableApprovalResolver, l as RecoveryReport, m as recoveryRepairRecordId, n as DurableAgentRuntime, o as DurableRuntimeConfig, p as recoveryRepairBatchId, s as RecoveryBlocked, t as ApprovalSuspensionError, u as RecoverySweepResult } from "../DurableAgentRuntime-DH2baLGe.mjs";
3
3
  export { ApprovalSuspensionError, DurableAgentRuntime, DurableApprovalResolver, DurableApprovalSuspension, DurableRuntimeConfig, Receipt, RecoveryBlocked, RecoveryFailure, RecoveryReport, RecoverySweepResult, childReservationIdFor, isolateRecovery, recoveryRepairBatchId, recoveryRepairRecordId, threadCreatedBatchId, threadCreatedRecordId };
@@ -1,2 +1,2 @@
1
- import { a as makeEventSource, i as NormalizedEvent, r as EventSources, t as EventSource } from "../EventSource-Bac0SxKL.mjs";
1
+ import { a as makeEventSource, i as NormalizedEvent, r as EventSources, t as EventSource } from "../EventSource-DoiZF3xv.mjs";
2
2
  export { EventSource, EventSources, NormalizedEvent, makeEventSource };
@@ -1,7 +1,7 @@
1
1
  import { r as Principal } from "../Receipt-BAHyigAF.mjs";
2
- import "../Admin-C34cVKlT.mjs";
3
- import { E as SubscriptionSourceError } from "../Subscription-Bk2Smmqc.mjs";
4
- import { t as EventSource } from "../EventSource-Bac0SxKL.mjs";
2
+ import "../Admin-CUja0lmO.mjs";
3
+ import { E as SubscriptionSourceError } from "../Subscription-m_yNfNeN.mjs";
4
+ import { t as EventSource } from "../EventSource-DoiZF3xv.mjs";
5
5
  import { SubscriptionFailure, SubscriptionIntake } from "./Subscriptions.mjs";
6
6
  import { Context, Effect, Layer, Redacted, Schema } from "effect";
7
7
  import { HttpClient } from "effect/unstable/http";
@@ -5,9 +5,9 @@ import { r as Update } from "../AgentUpdates-DMJ-_xow.mjs";
5
5
  import { a as FailureDiagnostic_d_exports, r as Diagnostic } from "../FailureDiagnostic-CaAkzGHL.mjs";
6
6
  import { t as AgentPolicy } from "../AgentPolicy-BqDoSXO6.mjs";
7
7
  import { h as DefinitionDigests } from "../Records-B5GFWCpn.mjs";
8
- import { dn as Settlement } from "../Admin-C34cVKlT.mjs";
9
- import { a as PreparedInput } from "../Subscription-Bk2Smmqc.mjs";
10
- import { t as PreparedInputAdmission } from "../PreparedInputAdmission-DcQGQ0Yp.mjs";
8
+ import { dn as Settlement } from "../Admin-CUja0lmO.mjs";
9
+ import { a as PreparedInput } from "../Subscription-m_yNfNeN.mjs";
10
+ import { t as PreparedInputAdmission } from "../PreparedInputAdmission-B1bzyIuV.mjs";
11
11
  import { Context, Crypto, Effect, Layer, Result, Schema } from "effect";
12
12
  declare namespace MessageDelivery_d_exports {
13
13
  export { MessageDeliveryChange, MessageDeliveryDriver, MessageDeliveryDriverLimits, MessageDeliveryError, MessageDeliveryFailpoint, MessageDeliveryFailpointError, MessageDeliveryFailure, MessageDeliveryKey, MessageDeliveryPage, MessageDeliveryPageRequest, MessageDeliveryPolicy, MessageDeliveryRecord, MessageDeliveryStore, MessageDeliveryStoreLimits, applyMessageDeliveryChange, defaultMessageDeliveryPolicy, defaultMessageDeliveryStoreLimits, isWorkerUpdateDelivery, messageDeliveryCapacity, messageDeliveryDeadline, messageDeliveryKeyString, messageDeliveryUsesCapacity, prepareMessageDelivery, readPending, sameMessageDeliveryIdentity, validateMessageDelivery };
@@ -616,6 +616,25 @@ export declare const readPending: (request: Pick<{
616
616
  readonly reportKind?: "update" | undefined;
617
617
  } | undefined;
618
618
  readonly messageAdmission?: {
619
+ readonly schemaVersion: 1;
620
+ readonly message: {
621
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
622
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
623
+ };
624
+ readonly peerName: string;
625
+ readonly sender: {
626
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
627
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
628
+ };
629
+ readonly returnAddress: {
630
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
631
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
632
+ };
633
+ readonly inReplyTo?: {
634
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
635
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
636
+ } | undefined;
637
+ } | {
619
638
  readonly _tag: "WorkerCompletion";
620
639
  readonly budgetExhausted: boolean;
621
640
  readonly schemaVersion: 1;
@@ -656,25 +675,6 @@ export declare const readPending: (request: Pick<{
656
675
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
657
676
  };
658
677
  readonly update: Update;
659
- } | {
660
- readonly schemaVersion: 1;
661
- readonly message: {
662
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
663
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
664
- };
665
- readonly peerName: string;
666
- readonly sender: {
667
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
668
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
669
- };
670
- readonly returnAddress: {
671
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
672
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
673
- };
674
- readonly inReplyTo?: {
675
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
676
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
677
- } | undefined;
678
678
  } | undefined;
679
679
  };
680
680
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
@@ -817,6 +817,25 @@ export declare const prepareMessageDelivery: (options: {
817
817
  readonly reportKind?: "update" | undefined;
818
818
  } | undefined;
819
819
  readonly messageAdmission?: {
820
+ readonly schemaVersion: 1;
821
+ readonly message: {
822
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
823
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
824
+ };
825
+ readonly peerName: string;
826
+ readonly sender: {
827
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
828
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
829
+ };
830
+ readonly returnAddress: {
831
+ readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
832
+ readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
833
+ };
834
+ readonly inReplyTo?: {
835
+ readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
836
+ readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
837
+ } | undefined;
838
+ } | {
820
839
  readonly _tag: "WorkerCompletion";
821
840
  readonly budgetExhausted: boolean;
822
841
  readonly schemaVersion: 1;
@@ -857,25 +876,6 @@ export declare const prepareMessageDelivery: (options: {
857
876
  readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
858
877
  };
859
878
  readonly update: Update;
860
- } | {
861
- readonly schemaVersion: 1;
862
- readonly message: {
863
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
864
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
865
- };
866
- readonly peerName: string;
867
- readonly sender: {
868
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
869
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
870
- };
871
- readonly returnAddress: {
872
- readonly threadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
873
- readonly agentId: string & import("effect/Brand").Brand<"@effect-agent/core/AgentId">;
874
- };
875
- readonly inReplyTo?: {
876
- readonly ownerThreadId: string & import("effect/Brand").Brand<"@effect-agent/core/ThreadId">;
877
- readonly messageId: string & import("effect/Brand").Brand<"@effect-agent/thread/IdempotencyKey">;
878
- } | undefined;
879
879
  } | undefined;
880
880
  };
881
881
  readonly envelopeDigest: string & import("effect/Brand").Brand<"@effect-agent/thread/Digest">;
@@ -5,7 +5,7 @@ import { r as Diagnostic } from "../FailureDiagnostic-CaAkzGHL.mjs";
5
5
  import { t as AgentPolicy } from "../AgentPolicy-BqDoSXO6.mjs";
6
6
  import { h as DefinitionDigests } from "../Records-B5GFWCpn.mjs";
7
7
  import { t as DigestError } from "../Digest-U69rDHuO.mjs";
8
- import { dn as Settlement } from "../Admin-C34cVKlT.mjs";
8
+ import { dn as Settlement } from "../Admin-CUja0lmO.mjs";
9
9
  import { MessageDeliveryError, MessageDeliveryFailure, MessageDeliveryStore } from "./MessageDelivery.mjs";
10
10
  import { Effect, Schema } from "effect";
11
11
  //#region src/durable/MessageDeliveryStoreConformance.d.ts
@@ -1,5 +1,5 @@
1
1
  import { t as ThreadHistory } from "../ThreadHistory-tS1KwxHR.mjs";
2
- import { Qr as ThreadStore } from "../Admin-C34cVKlT.mjs";
2
+ import { ei as ThreadStore } from "../Admin-CUja0lmO.mjs";
3
3
  import { Layer } from "effect";
4
4
  declare namespace PersistentHistory_d_exports {
5
5
  export { layer };
@@ -1,2 +1,2 @@
1
- import { r as admitPreparedInput, t as PreparedInputAdmission } from "../PreparedInputAdmission-DcQGQ0Yp.mjs";
1
+ import { r as admitPreparedInput, t as PreparedInputAdmission } from "../PreparedInputAdmission-B1bzyIuV.mjs";
2
2
  export { PreparedInputAdmission, admitPreparedInput };
@@ -1,2 +1,2 @@
1
- import { $ as RepairSubagentStartLink, A as AwaitChildSettlement, B as MarkUnknown, D as ApplyUnknownResolutions, E as ApplyJoinAccounting, F as CompleteMaterialization, G as PropagateChildAbort, H as OpenDelegationCallEvidence, I as DeclaredPendingBatchEvidence, K as RecoveryDecision, L as DelegationAdmissionEvidence, M as AwaitParentEstablishment, N as AwaitUnknownResolution, O as AwaitApprovalDecision, P as CompleteChildAdmission, Q as RepairReadiness, R as EnsureWaitingForChild, T as ApplyInput, U as OpenToolCallEvidence, V as NoAction, W as PendingApprovalEvidence, X as RepairInputMarker, Y as ReleaseOrphanChildReservation, Z as RepairJoinMarker, at as SettleAborted, et as ResumeFromTurnBoundary, it as RevertJoining, j as AwaitHostSettlement, k as AwaitChildAdmissionResolution, nt as ResumeSuspended, ot as SettleJoinedWithHost, q as RecoveryEvidence, rt as ResumeWaitingParent, st as classifyRecovery, tt as ResumePendingToolBatch, w as AppendReservedSettlement, z as FinalizeLedgerFromHistory } from "../Admin-C34cVKlT.mjs";
1
+ import { $ as RepairSubagentStartLink, A as AwaitChildSettlement, B as MarkUnknown, D as ApplyUnknownResolutions, E as ApplyJoinAccounting, F as CompleteMaterialization, G as PropagateChildAbort, H as OpenDelegationCallEvidence, I as DeclaredPendingBatchEvidence, K as RecoveryDecision, L as DelegationAdmissionEvidence, M as AwaitParentEstablishment, N as AwaitUnknownResolution, O as AwaitApprovalDecision, P as CompleteChildAdmission, Q as RepairReadiness, R as EnsureWaitingForChild, T as ApplyInput, U as OpenToolCallEvidence, V as NoAction, W as PendingApprovalEvidence, X as RepairInputMarker, Y as ReleaseOrphanChildReservation, Z as RepairJoinMarker, at as SettleAborted, et as ResumeFromTurnBoundary, it as RevertJoining, j as AwaitHostSettlement, k as AwaitChildAdmissionResolution, nt as ResumeSuspended, ot as SettleJoinedWithHost, q as RecoveryEvidence, rt as ResumeWaitingParent, st as classifyRecovery, tt as ResumePendingToolBatch, w as AppendReservedSettlement, z as FinalizeLedgerFromHistory } from "../Admin-CUja0lmO.mjs";
2
2
  export { AppendReservedSettlement, ApplyInput, ApplyJoinAccounting, ApplyUnknownResolutions, AwaitApprovalDecision, AwaitChildAdmissionResolution, AwaitChildSettlement, AwaitHostSettlement, AwaitParentEstablishment, AwaitUnknownResolution, CompleteChildAdmission, CompleteMaterialization, DeclaredPendingBatchEvidence, DelegationAdmissionEvidence, EnsureWaitingForChild, FinalizeLedgerFromHistory, MarkUnknown, NoAction, OpenDelegationCallEvidence, OpenToolCallEvidence, PendingApprovalEvidence, PropagateChildAbort, RecoveryDecision, RecoveryEvidence, ReleaseOrphanChildReservation, RepairInputMarker, RepairJoinMarker, RepairReadiness, RepairSubagentStartLink, ResumeFromTurnBoundary, ResumePendingToolBatch, ResumeSuspended, ResumeWaitingParent, RevertJoining, SettleAborted, SettleJoinedWithHost, classifyRecovery };
@@ -1,2 +1,2 @@
1
- import { $i as toolCallResolutionBatchId, Ai as modelResponseRecordId, Bi as runStartedBatchId, Ci as childThreadIdFor, Di as markUnknownBatchId, Ei as firstWorkerInputRecordId, Fi as runCompletedRecordId, Gi as subagentLineageRecordId, Hi as subagentJoinBatchId, Ii as runCompletionDigest, Ji as subagentStartedBatchId, Ki as subagentRequestedBatchId, Li as runDurationBatchId, Mi as projectRunJournal, Ni as projectRunJournalStream, Oi as modelResponseInterruptedBatchId, Pi as promptFromCanonicalRecords, Qi as toolCallPreparedRecordId, Ri as runDurationRecordId, Si as childIdempotencyKeyFor, Ti as compactionRecordId, Ui as subagentJoinedRecordId, Vi as runStartedRecordId, Wi as subagentLineageBatchId, Xi as toolApprovalDecisionRecordId, Yi as subagentStartedRecordId, Zi as toolApprovalRequestRecordId, _a as workerReportRecordId, _i as RunJournalUsage, aa as toolStepSettledRecordId, bi as agentUpdateRecordId, ca as turnCanonicalBatch, da as turnResponseBatch, ea as toolCallResolvedRecordId, fa as turnResponseBatchId, ga as workerOriginRecordId, gi as RunJournalProjection, ha as workerInputRecordId, hi as RunJournalError, ia as toolStepSettledBatchId, ji as peerMessageRecordId, ki as modelResponseInterruptedRecordId, la as turnIdForRun, ma as turnResultsBatchId, mi as JournalBoundary, na as toolCallSettledRecordId, oa as turnApprovalsBatchId, pa as turnResultsBatch, qi as subagentRequestedRecordId, ra as toolCallUnknownRecordId, sa as turnBatchId, ta as toolCallResultBatchId, ua as turnPreparedBatchId, wi as compactionBatchId, xi as approvalDecisionBatchId, yi as TurnCommitInput, zi as runIdForSubmission } from "../Admin-C34cVKlT.mjs";
1
+ import { $i as toolApprovalRequestRecordId, Ai as modelResponseInterruptedBatchId, Bi as runDurationRecordId, Ci as approvalDecisionBatchId, Di as compactionRecordId, Ei as compactionBatchId, Fi as projectRunJournalStream, Gi as subagentJoinedRecordId, Hi as runStartedBatchId, Ii as promptFromCanonicalRecords, Ji as subagentRequestedBatchId, Ki as subagentLineageBatchId, Li as runCompletedRecordId, Mi as modelResponseRecordId, Ni as peerMessageRecordId, Oi as firstWorkerInputRecordId, Pi as projectRunJournal, Qi as toolApprovalDecisionRecordId, Ri as runCompletionDigest, Si as agentUpdateRecordId, Ti as childThreadIdFor, Ui as runStartedRecordId, Vi as runIdForSubmission, Wi as subagentJoinBatchId, Xi as subagentStartedBatchId, Yi as subagentRequestedRecordId, Zi as subagentStartedRecordId, _a as workerInputRecordId, _i as RunJournalError, aa as toolCallUnknownRecordId, ca as turnApprovalsBatchId, da as turnIdForRun, ea as toolCallPreparedRecordId, fa as turnPreparedBatchId, ga as turnResultsBatchId, gi as JournalBoundary, ha as turnResultsBatch, ia as toolCallSettledRecordId, ji as modelResponseInterruptedRecordId, ki as markUnknownBatchId, la as turnBatchId, ma as turnResponseBatchId, na as toolCallResolvedRecordId, oa as toolStepSettledBatchId, pa as turnResponseBatch, qi as subagentLineageRecordId, ra as toolCallResultBatchId, sa as toolStepSettledRecordId, ta as toolCallResolutionBatchId, ua as turnCanonicalBatch, va as workerOriginRecordId, vi as RunJournalProjection, wi as childIdempotencyKeyFor, xi as TurnCommitInput, ya as workerReportRecordId, yi as RunJournalUsage, zi as runDurationBatchId } from "../Admin-CUja0lmO.mjs";
2
2
  export { JournalBoundary, RunJournalError, RunJournalProjection, RunJournalUsage, TurnCommitInput, agentUpdateRecordId, approvalDecisionBatchId, childIdempotencyKeyFor, childThreadIdFor, compactionBatchId, compactionRecordId, firstWorkerInputRecordId, markUnknownBatchId, modelResponseInterruptedBatchId, modelResponseInterruptedRecordId, modelResponseRecordId, peerMessageRecordId, projectRunJournal, projectRunJournalStream, promptFromCanonicalRecords, runCompletedRecordId, runCompletionDigest, runDurationBatchId, runDurationRecordId, runIdForSubmission, runStartedBatchId, runStartedRecordId, subagentJoinBatchId, subagentJoinedRecordId, subagentLineageBatchId, subagentLineageRecordId, subagentRequestedBatchId, subagentRequestedRecordId, subagentStartedBatchId, subagentStartedRecordId, toolApprovalDecisionRecordId, toolApprovalRequestRecordId, toolCallPreparedRecordId, toolCallResolutionBatchId, toolCallResolvedRecordId, toolCallResultBatchId, toolCallSettledRecordId, toolCallUnknownRecordId, toolStepSettledBatchId, toolStepSettledRecordId, turnApprovalsBatchId, turnBatchId, turnCanonicalBatch, turnIdForRun, turnPreparedBatchId, turnResponseBatch, turnResponseBatchId, turnResultsBatch, turnResultsBatchId, workerInputRecordId, workerOriginRecordId, workerReportRecordId };
@@ -1,6 +1,6 @@
1
1
  import { r as Principal } from "../Receipt-BAHyigAF.mjs";
2
2
  import { h as DefinitionDigests } from "../Records-B5GFWCpn.mjs";
3
- import { lr as DurableSubmitAgent, pt as AdmissionFence } from "../Admin-C34cVKlT.mjs";
3
+ import { lr as DurableSubmitAgent, pt as AdmissionFence } from "../Admin-CUja0lmO.mjs";
4
4
  import { A as ScheduleSnapshotPage, B as ScheduledInputAdmission, C as ScheduleRecord, D as ScheduleScope, F as ScheduleTimingRequest, I as ScheduleValidationError, L as ScheduleWake, M as ScheduleStore, N as ScheduleStoreFailure, W as SchedulingLimits, c as ScheduleDestination, f as ScheduleId, j as ScheduleStorageError, k as ScheduleSnapshot, m as ScheduleKey, n as ScheduleAuthorizationError, r as ScheduleAuthorizer, y as ScheduleOwner } from "../Schedule-CtYREFnz.mjs";
5
5
  import { Context, Crypto, Effect, Layer, Schema } from "effect";
6
6
  declare namespace Scheduling_d_exports {
@@ -1,5 +1,5 @@
1
1
  import { d as ScheduleFailpointError } from "../Schedule-CtYREFnz.mjs";
2
- import { g as SubscriptionFailpointError } from "../Subscription-Bk2Smmqc.mjs";
2
+ import { g as SubscriptionFailpointError } from "../Subscription-m_yNfNeN.mjs";
3
3
  import { Effect, Schema } from "effect";
4
4
  import * as SqlClient from "effect/unstable/sql/SqlClient";
5
5
  //#region src/durable/SqlStorageV2Upgrade.d.ts
@@ -1,5 +1,5 @@
1
1
  import { _ as Digest } from "../Records-B5GFWCpn.mjs";
2
- import { C as SubscriptionScanCursors, O as SubscriptionStoreFailure, S as SubscriptionRetentionPolicy, _ as SubscriptionKey, b as SubscriptionRecord, d as SubscriptionDelivery, f as SubscriptionDeliveryKey, g as SubscriptionFailpointError, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, t as AcceptedEvent, v as SubscriptionLimits } from "../Subscription-Bk2Smmqc.mjs";
2
+ import { C as SubscriptionScanCursors, O as SubscriptionStoreFailure, S as SubscriptionRetentionPolicy, _ as SubscriptionKey, b as SubscriptionRecord, d as SubscriptionDelivery, f as SubscriptionDeliveryKey, g as SubscriptionFailpointError, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, t as AcceptedEvent, v as SubscriptionLimits } from "../Subscription-m_yNfNeN.mjs";
3
3
  import { Context, Effect } from "effect";
4
4
  import * as SqlClientService from "effect/unstable/sql/SqlClient";
5
5
  //#region src/durable/SqlSubscriptionStore.d.ts
@@ -1,5 +1,5 @@
1
1
  import { j as RecordEnvelope, l as CanonicalRecordEnvelope } from "../Records-B5GFWCpn.mjs";
2
- import { Gr as ThreadPeerCountRequest, Vr as ThreadNotMaterialized, ei as ThreadStoreError } from "../Admin-C34cVKlT.mjs";
2
+ import { Br as ThreadIdentity, Ur as ThreadNotMaterialized, Vr as ThreadIdentityRequest, ni as ThreadStoreError, qr as ThreadPeerCountRequest } from "../Admin-CUja0lmO.mjs";
3
3
  import { Effect, Schema } from "effect";
4
4
  import * as SqlClient from "effect/unstable/sql/SqlClient";
5
5
  declare namespace SqlThreadNativeReads_d_exports {
@@ -48,6 +48,7 @@ export declare const makeSelectedReads: (envelope: (row: typeof Row.Type) => Eff
48
48
  };
49
49
  }) => Effect.Effect<CanonicalRecordEnvelope[], ThreadNotMaterialized | ThreadStoreError, never>;
50
50
  countPeerMessages: (request: ThreadPeerCountRequest) => Effect.Effect<number, ThreadStoreError | ThreadNotMaterialized>;
51
+ readIdentity: (request: ThreadIdentityRequest) => Effect.Effect<ThreadIdentity, ThreadStoreError | ThreadNotMaterialized>;
51
52
  }, never, SqlClient.SqlClient>;
52
53
  //#endregion
53
54
  export { SqlThreadNativeReads_d_exports as t };
@@ -1,7 +1,7 @@
1
1
  import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
2
- import { CanonicalRecord, CanonicalRecordEnvelope, CanonicalSequence, Digest, RecordId } from "./Records.mjs";
3
- import { S as runIdForSubmission } from "../RunJournal-BXrq0VIK.mjs";
4
- import { SelectedThreadRead, ThreadNotMaterialized, ThreadPeerCountRequest, ThreadStoreError } from "./ThreadStore.mjs";
2
+ import { CanonicalRecord, CanonicalRecordEnvelope, CanonicalSequence, Digest, ProducerEpoch, RecordId } from "./Records.mjs";
3
+ import { $ as workerOriginRecordId, O as subagentLineageRecordId, S as runIdForSubmission } from "../RunJournal-BXrq0VIK.mjs";
4
+ import { SelectedThreadRead, ThreadIdentity, ThreadIdentityRequest, ThreadNotMaterialized, ThreadPeerCountRequest, ThreadStoreError } from "./ThreadStore.mjs";
5
5
  import { Effect, Schema } from "effect";
6
6
  import * as SqlClient from "effect/unstable/sql/SqlClient";
7
7
  //#region src/durable/SqlThreadNativeReads.ts
@@ -98,33 +98,32 @@ const makeSelectedReads = Effect.fnUntraced(function* (envelope) {
98
98
  if (decoded.length !== 1 || decoded[0] === void 0) return yield* failure("native thread tail");
99
99
  return decoded[0];
100
100
  });
101
- return {
102
- read: Effect.fnUntraced(function* (request) {
103
- return yield* sql.withTransaction(Effect.gen(function* () {
104
- const tail = yield* requireThread(request.threadId);
105
- const selection = request.selection;
106
- if ("expectedTailSequence" in selection && (tail.tail_sequence !== selection.expectedTailSequence || tail.tail_digest !== selection.expectedTailDigest)) return yield* failure("selected read tail changed");
107
- const after = request.page.afterSequence ?? 0;
108
- let rows;
109
- switch (selection._tag) {
110
- case "RecordId":
111
- rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;
112
- break;
113
- case "RunInput":
114
- rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;
115
- break;
116
- case "Outstanding":
117
- rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;
118
- break;
119
- case "WorkerExecution":
120
- rows = (yield* Effect.forEach(["UserInputRecorded", "RunStarted"], (tag) => sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records
101
+ const read = Effect.fnUntraced(function* (request) {
102
+ return yield* sql.withTransaction(Effect.gen(function* () {
103
+ const tail = yield* requireThread(request.threadId);
104
+ const selection = request.selection;
105
+ if ("expectedTailSequence" in selection && (tail.tail_sequence !== selection.expectedTailSequence || tail.tail_digest !== selection.expectedTailDigest)) return yield* failure("selected read tail changed");
106
+ const after = request.page.afterSequence ?? 0;
107
+ let rows;
108
+ switch (selection._tag) {
109
+ case "RecordId":
110
+ rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;
111
+ break;
112
+ case "RunInput":
113
+ rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;
114
+ break;
115
+ case "Outstanding":
116
+ rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;
117
+ break;
118
+ case "WorkerExecution":
119
+ rows = (yield* Effect.forEach(["UserInputRecorded", "RunStarted"], (tag) => sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records
121
120
  WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}
122
121
  AND json_extract(record_json, '$.payload.runId') IS NOT NULL
123
122
  ORDER BY sequence DESC LIMIT 1`)).flat().filter((row) => Number(row.sequence) > after).sort((a, b) => Number(a.sequence) - Number(b.sequence)).slice(0, request.page.limit);
124
- break;
125
- case "WorkerState": {
126
- const runId = selection.sourceSubmissionId === void 0 ? null : runIdForSubmission(selection.sourceSubmissionId);
127
- rows = yield* sql`
123
+ break;
124
+ case "WorkerState": {
125
+ const runId = selection.sourceSubmissionId === void 0 ? null : runIdForSubmission(selection.sourceSubmissionId);
126
+ rows = yield* sql`
128
127
  SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records
129
128
  WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') IN ('ThreadCreated', 'WorkerOriginRecorded', 'SubagentLineageRecorded', 'WorkerInputRequested', 'WorkerInputCompleted', 'WorkerStopRequested')
130
129
  UNION ALL
@@ -134,23 +133,61 @@ const makeSelectedReads = Effect.fnUntraced(function* (envelope) {
134
133
  SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records
135
134
  WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubagentJoined' AND json_extract(record_json, '$.payload.runId') = ${runId}
136
135
  ORDER BY sequence LIMIT ${request.page.limit}`;
137
- break;
138
- }
136
+ break;
139
137
  }
140
- const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);
141
- if (selection._tag === "RunInput" && decoded.length > 1) return yield* failure("ambiguous original Run input");
142
- return yield* Effect.forEach(decoded.filter((row) => row.sequence > after), (row) => Effect.gen(function* () {
143
- const value = yield* envelope(row);
144
- if (value.record.recordId !== row.record_id || row.thread_id !== request.threadId || selection._tag === "Outstanding" && !(row.outstanding === 1 && value.record.payload._tag === "ToolCallPrepared" || row.outstanding === 2 && value.record.payload._tag === "ToolCallUnknown" || row.outstanding === 3 && value.record.payload._tag === "WorkerInputRequested")) return yield* failure("selected record incomplete or corrupt");
145
- return value;
146
- }));
138
+ }
139
+ const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);
140
+ if (selection._tag === "RunInput" && decoded.length > 1) return yield* failure("ambiguous original Run input");
141
+ return yield* Effect.forEach(decoded.filter((row) => row.sequence > after), (row) => Effect.gen(function* () {
142
+ const value = yield* envelope(row);
143
+ if (value.record.recordId !== row.record_id || row.thread_id !== request.threadId || selection._tag === "Outstanding" && !(row.outstanding === 1 && value.record.payload._tag === "ToolCallPrepared" || row.outstanding === 2 && value.record.payload._tag === "ToolCallUnknown" || row.outstanding === 3 && value.record.payload._tag === "WorkerInputRequested")) return yield* failure("selected record incomplete or corrupt");
144
+ return value;
147
145
  }));
148
- }, Effect.mapError((cause) => cause._tag === "ThreadNotMaterialized" || cause._tag === "ThreadStoreError" ? cause : failure("selected read", cause))),
146
+ }));
147
+ }, Effect.mapError((cause) => cause._tag === "ThreadNotMaterialized" || cause._tag === "ThreadStoreError" ? cause : failure("selected read", cause)));
148
+ const readIdentity = Effect.fnUntraced(function* (request) {
149
+ yield* Schema.decodeEffect(Schema.toType(ThreadIdentityRequest))(request);
150
+ return yield* sql.withTransaction(Effect.gen(function* () {
151
+ const tails = yield* sql`SELECT tail_sequence, tail_digest, producer_epoch
152
+ FROM effect_agent_threads WHERE thread_id = ${request.threadId}`;
153
+ if (tails.length === 0) return yield* ThreadNotMaterialized.make({ threadId: request.threadId });
154
+ const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({
155
+ tail_sequence: CanonicalSequence,
156
+ tail_digest: Digest,
157
+ producer_epoch: ProducerEpoch
158
+ })))(tails);
159
+ const tail = decoded[0];
160
+ if (decoded.length !== 1 || tail === void 0) return yield* failure("identity tail");
161
+ const origin = workerOriginRecordId(request.threadId);
162
+ const lineage = subagentLineageRecordId(request.threadId);
163
+ const rows = yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM (
164
+ SELECT thread_id, sequence, record_id, batch_id, record_json, 0 AS identity_order
165
+ FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND sequence = 1
166
+ UNION ALL
167
+ SELECT thread_id, sequence, record_id, batch_id, record_json, 1 AS identity_order
168
+ FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${origin} AND sequence <> 1
169
+ UNION ALL
170
+ SELECT thread_id, sequence, record_id, batch_id, record_json, 2 AS identity_order
171
+ FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${lineage} AND sequence <> 1
172
+ ) ORDER BY identity_order`;
173
+ const records = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows).pipe(Effect.flatMap(Effect.forEach((row) => envelope(row).pipe(Effect.filterOrFail((value) => value.record.recordId === row.record_id, () => failure("identity record locator"))))));
174
+ return yield* ThreadIdentity.makeEffect({
175
+ threadId: request.threadId,
176
+ tailSequence: tail.tail_sequence,
177
+ tailDigest: tail.tail_digest,
178
+ producerEpoch: tail.producer_epoch,
179
+ records
180
+ });
181
+ }));
182
+ }, Effect.mapError((cause) => cause._tag === "ThreadNotMaterialized" || cause._tag === "ThreadStoreError" ? cause : failure("readIdentity", cause)));
183
+ return {
184
+ read,
149
185
  countPeerMessages: Effect.fnUntraced(function* (request) {
150
186
  yield* Schema.decodeEffect(ThreadPeerCountRequest)(request);
151
187
  yield* requireThread(request.threadId);
152
188
  return (yield* sql`SELECT 1 FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'PeerMessagePrepared' LIMIT ${request.limit}`).length;
153
- }, Effect.mapError((cause) => cause._tag === "ThreadNotMaterialized" || cause._tag === "ThreadStoreError" ? cause : failure("countPeerMessages", cause)))
189
+ }, Effect.mapError((cause) => cause._tag === "ThreadNotMaterialized" || cause._tag === "ThreadStoreError" ? cause : failure("countPeerMessages", cause))),
190
+ readIdentity
154
191
  };
155
192
  });
156
193
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"SqlThreadNativeReads.mjs","names":[],"sources":["../../src/durable/SqlThreadNativeReads.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport {\n CanonicalRecord,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n RecordId,\n} from \"./Records.ts\";\nimport { runIdForSubmission } from \"./RunJournal.ts\";\nimport type { ThreadStore } from \"./ThreadStore.ts\";\nimport {\n SelectedThreadRead,\n ThreadPeerCountRequest,\n ThreadNotMaterialized,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\n\nconst failure = (operation: string, cause?: unknown) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n ...(cause === undefined ? {} : { cause }),\n });\n\n/** Adapter-owned metadata on canonical rows, never a second copy of execution records. */\nexport const createNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`ALTER TABLE effect_agent_canonical_records ADD COLUMN outstanding INTEGER NOT NULL DEFAULT 0`;\n yield* sql`CREATE INDEX effect_agent_records_outstanding ON effect_agent_canonical_records(thread_id, sequence) WHERE outstanding <> 0`;\n yield* sql`CREATE INDEX effect_agent_records_call ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload._tag'), json_extract(record_json, '$.payload.runId'), json_extract(record_json, '$.payload.toolCallId'))`;\n yield* sql`CREATE INDEX effect_agent_records_run_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.runId')) WHERE json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user'`;\n yield* sql`CREATE INDEX effect_agent_records_subtree ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.sourceSubmissionId'), sequence) WHERE json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved'`;\n yield* sql`CREATE INDEX effect_agent_records_worker_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.admission.messageId')) WHERE json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'`;\n});\n\n/** Must run in the canonical append/upgrade transaction, after inserting this record. */\nexport const indexCanonicalRecord = Effect.fnUntraced(function* (\n threadId: string,\n record: CanonicalRecord,\n) {\n const sql = yield* SqlClient.SqlClient;\n const payload = record.payload;\n\n switch (payload._tag) {\n case \"ToolCallPrepared\":\n case \"ToolCallUnknown\": {\n if (payload._tag === \"ToolCallUnknown\")\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'ToolCallPrepared'\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = ${payload._tag === \"ToolCallPrepared\" ? 1 : 2}\n WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n }\n case \"ToolCallSettled\":\n for (const tag of [\"ToolCallPrepared\", \"ToolCallUnknown\"])\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n break;\n case \"WorkerInputRequested\":\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = 3 WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n case \"WorkerInputCompleted\":\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = ${payload.effectsResolved ? 0 : 4}\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'\n AND json_extract(record_json, '$.payload.admission.messageId') = ${payload.messageId}`;\n break;\n }\n});\n\n/** One-time native index construction during the atomic supported-format upgrade. */\nexport const seedNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n // This is the one supported-format upgrade, in the adapter transaction. Decode in\n // bounded pages; malformed rows or gaps roll back both metadata and version.\n const gaps =\n yield* sql`SELECT t.thread_id FROM effect_agent_threads t LEFT JOIN effect_agent_canonical_records r ON r.thread_id = t.thread_id\n GROUP BY t.thread_id HAVING count(r.sequence) <> t.tail_sequence OR coalesce(max(r.sequence), 0) <> t.tail_sequence\n UNION ALL SELECT r.thread_id FROM effect_agent_canonical_records r LEFT JOIN effect_agent_threads t ON t.thread_id = r.thread_id WHERE t.thread_id IS NULL LIMIT 1`;\n\n if (gaps.length > 0) return yield* failure(\"native index upgrade canonical gap\");\n let afterThread = \"\";\n let afterSequence = 0;\n\n while (true) {\n const rows = yield* sql<{\n thread_id: string;\n record_id: string;\n sequence: number;\n record_json: string;\n }>`SELECT thread_id, record_id, sequence, record_json FROM effect_agent_canonical_records\n WHERE (thread_id, sequence) > (${afterThread}, ${afterSequence}) ORDER BY thread_id, sequence LIMIT 100`;\n\n if (rows.length === 0) break;\n for (const row of rows) {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(CanonicalRecord))(\n row.record_json,\n );\n\n if (\n record.recordId !== row.record_id ||\n row.sequence !== (row.thread_id === afterThread ? afterSequence : 0) + 1\n )\n return yield* failure(\"native index upgrade canonical identity\");\n yield* indexCanonicalRecord(row.thread_id, record);\n afterThread = row.thread_id;\n afterSequence = row.sequence;\n }\n }\n});\n\nconst Row = Schema.Struct({\n thread_id: SelectedThreadRead.fields.threadId,\n sequence: CanonicalSequence,\n record_id: RecordId,\n batch_id: CanonicalRecordEnvelope.fields.batchId,\n record_json: Schema.String,\n outstanding: Schema.optionalKey(Schema.Int),\n});\n\nexport const makeSelectedReads = Effect.fnUntraced(function* (\n envelope: (row: typeof Row.Type) => Effect.Effect<CanonicalRecordEnvelope, ThreadStoreError>,\n) {\n const sql = yield* SqlClient.SqlClient;\n\n const requireThread = Effect.fnUntraced(function* (threadId: SelectedThreadRead[\"threadId\"]) {\n const rows =\n yield* sql`SELECT tail_sequence, tail_digest FROM effect_agent_threads WHERE thread_id = ${threadId}`;\n\n if (rows.length === 0) return yield* ThreadNotMaterialized.make({ threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(Schema.Struct({ tail_sequence: CanonicalSequence, tail_digest: Digest })),\n )(rows);\n\n if (decoded.length !== 1 || decoded[0] === undefined)\n return yield* failure(\"native thread tail\");\n\n return decoded[0];\n });\n\n const read = Effect.fnUntraced(\n function* (request: SelectedThreadRead) {\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tail = yield* requireThread(request.threadId);\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n (tail.tail_sequence !== selection.expectedTailSequence ||\n tail.tail_digest !== selection.expectedTailDigest)\n )\n return yield* failure(\"selected read tail changed\");\n const after = request.page.afterSequence ?? 0;\n let rows: unknown;\n\n switch (selection._tag) {\n case \"RecordId\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;\n break;\n case \"RunInput\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;\n break;\n case \"Outstanding\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n case \"WorkerExecution\":\n rows = (yield* Effect.forEach(\n [\"UserInputRecorded\", \"RunStarted\"],\n (tag) =>\n sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') IS NOT NULL\n ORDER BY sequence DESC LIMIT 1`,\n ))\n .flat()\n .filter((row) => Number(row.sequence) > after)\n .sort((a, b) => Number(a.sequence) - Number(b.sequence))\n .slice(0, request.page.limit);\n break;\n case \"WorkerState\": {\n const runId =\n selection.sourceSubmissionId === undefined\n ? null\n : runIdForSubmission(selection.sourceSubmissionId);\n\n rows = yield* sql`\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') IN ('ThreadCreated', 'WorkerOriginRecorded', 'SubagentLineageRecorded', 'WorkerInputRequested', 'WorkerInputCompleted', 'WorkerStopRequested')\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved' AND json_extract(record_json, '$.payload.sourceSubmissionId') IS ${selection.sourceSubmissionId ?? null}\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubagentJoined' AND json_extract(record_json, '$.payload.runId') = ${runId}\n ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n }\n }\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);\n\n if (selection._tag === \"RunInput\" && decoded.length > 1)\n return yield* failure(\"ambiguous original Run input\");\n\n return yield* Effect.forEach(\n decoded.filter((row) => row.sequence > after),\n (row) =>\n Effect.gen(function* () {\n const value = yield* envelope(row);\n\n if (\n value.record.recordId !== row.record_id ||\n row.thread_id !== request.threadId ||\n (selection._tag === \"Outstanding\" &&\n !(\n (row.outstanding === 1 && value.record.payload._tag === \"ToolCallPrepared\") ||\n (row.outstanding === 2 && value.record.payload._tag === \"ToolCallUnknown\") ||\n (row.outstanding === 3 &&\n value.record.payload._tag === \"WorkerInputRequested\")\n ))\n )\n return yield* failure(\"selected record incomplete or corrupt\");\n\n return value;\n }),\n );\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"selected read\", cause),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(ThreadPeerCountRequest)(request);\n yield* requireThread(request.threadId);\n\n const rows =\n yield* sql`SELECT 1 FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'PeerMessagePrepared' LIMIT ${request.limit}`;\n\n return rows.length;\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"countPeerMessages\", cause),\n ),\n );\n\n return { read, countPeerMessages };\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"SqlThreadNativeReads.mjs","names":[],"sources":["../../src/durable/SqlThreadNativeReads.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport {\n CanonicalRecord,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n ProducerEpoch,\n RecordId,\n} from \"./Records.ts\";\nimport { runIdForSubmission, subagentLineageRecordId, workerOriginRecordId } from \"./RunJournal.ts\";\nimport type { ThreadStore } from \"./ThreadStore.ts\";\nimport {\n SelectedThreadRead,\n ThreadPeerCountRequest,\n ThreadIdentity,\n ThreadIdentityRequest,\n ThreadNotMaterialized,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\n\nconst failure = (operation: string, cause?: unknown) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n ...(cause === undefined ? {} : { cause }),\n });\n\n/** Adapter-owned metadata on canonical rows, never a second copy of execution records. */\nexport const createNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`ALTER TABLE effect_agent_canonical_records ADD COLUMN outstanding INTEGER NOT NULL DEFAULT 0`;\n yield* sql`CREATE INDEX effect_agent_records_outstanding ON effect_agent_canonical_records(thread_id, sequence) WHERE outstanding <> 0`;\n yield* sql`CREATE INDEX effect_agent_records_call ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload._tag'), json_extract(record_json, '$.payload.runId'), json_extract(record_json, '$.payload.toolCallId'))`;\n yield* sql`CREATE INDEX effect_agent_records_run_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.runId')) WHERE json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user'`;\n yield* sql`CREATE INDEX effect_agent_records_subtree ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.sourceSubmissionId'), sequence) WHERE json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved'`;\n yield* sql`CREATE INDEX effect_agent_records_worker_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.admission.messageId')) WHERE json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'`;\n});\n\n/** Must run in the canonical append/upgrade transaction, after inserting this record. */\nexport const indexCanonicalRecord = Effect.fnUntraced(function* (\n threadId: string,\n record: CanonicalRecord,\n) {\n const sql = yield* SqlClient.SqlClient;\n const payload = record.payload;\n\n switch (payload._tag) {\n case \"ToolCallPrepared\":\n case \"ToolCallUnknown\": {\n if (payload._tag === \"ToolCallUnknown\")\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'ToolCallPrepared'\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = ${payload._tag === \"ToolCallPrepared\" ? 1 : 2}\n WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n }\n case \"ToolCallSettled\":\n for (const tag of [\"ToolCallPrepared\", \"ToolCallUnknown\"])\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n break;\n case \"WorkerInputRequested\":\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = 3 WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n case \"WorkerInputCompleted\":\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = ${payload.effectsResolved ? 0 : 4}\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'\n AND json_extract(record_json, '$.payload.admission.messageId') = ${payload.messageId}`;\n break;\n }\n});\n\n/** One-time native index construction during the atomic supported-format upgrade. */\nexport const seedNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n // This is the one supported-format upgrade, in the adapter transaction. Decode in\n // bounded pages; malformed rows or gaps roll back both metadata and version.\n const gaps =\n yield* sql`SELECT t.thread_id FROM effect_agent_threads t LEFT JOIN effect_agent_canonical_records r ON r.thread_id = t.thread_id\n GROUP BY t.thread_id HAVING count(r.sequence) <> t.tail_sequence OR coalesce(max(r.sequence), 0) <> t.tail_sequence\n UNION ALL SELECT r.thread_id FROM effect_agent_canonical_records r LEFT JOIN effect_agent_threads t ON t.thread_id = r.thread_id WHERE t.thread_id IS NULL LIMIT 1`;\n\n if (gaps.length > 0) return yield* failure(\"native index upgrade canonical gap\");\n let afterThread = \"\";\n let afterSequence = 0;\n\n while (true) {\n const rows = yield* sql<{\n thread_id: string;\n record_id: string;\n sequence: number;\n record_json: string;\n }>`SELECT thread_id, record_id, sequence, record_json FROM effect_agent_canonical_records\n WHERE (thread_id, sequence) > (${afterThread}, ${afterSequence}) ORDER BY thread_id, sequence LIMIT 100`;\n\n if (rows.length === 0) break;\n for (const row of rows) {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(CanonicalRecord))(\n row.record_json,\n );\n\n if (\n record.recordId !== row.record_id ||\n row.sequence !== (row.thread_id === afterThread ? afterSequence : 0) + 1\n )\n return yield* failure(\"native index upgrade canonical identity\");\n yield* indexCanonicalRecord(row.thread_id, record);\n afterThread = row.thread_id;\n afterSequence = row.sequence;\n }\n }\n});\n\nconst Row = Schema.Struct({\n thread_id: SelectedThreadRead.fields.threadId,\n sequence: CanonicalSequence,\n record_id: RecordId,\n batch_id: CanonicalRecordEnvelope.fields.batchId,\n record_json: Schema.String,\n outstanding: Schema.optionalKey(Schema.Int),\n});\n\nexport const makeSelectedReads = Effect.fnUntraced(function* (\n envelope: (row: typeof Row.Type) => Effect.Effect<CanonicalRecordEnvelope, ThreadStoreError>,\n) {\n const sql = yield* SqlClient.SqlClient;\n\n const requireThread = Effect.fnUntraced(function* (threadId: SelectedThreadRead[\"threadId\"]) {\n const rows =\n yield* sql`SELECT tail_sequence, tail_digest FROM effect_agent_threads WHERE thread_id = ${threadId}`;\n\n if (rows.length === 0) return yield* ThreadNotMaterialized.make({ threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(Schema.Struct({ tail_sequence: CanonicalSequence, tail_digest: Digest })),\n )(rows);\n\n if (decoded.length !== 1 || decoded[0] === undefined)\n return yield* failure(\"native thread tail\");\n\n return decoded[0];\n });\n\n const read = Effect.fnUntraced(\n function* (request: SelectedThreadRead) {\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tail = yield* requireThread(request.threadId);\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n (tail.tail_sequence !== selection.expectedTailSequence ||\n tail.tail_digest !== selection.expectedTailDigest)\n )\n return yield* failure(\"selected read tail changed\");\n const after = request.page.afterSequence ?? 0;\n let rows: unknown;\n\n switch (selection._tag) {\n case \"RecordId\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;\n break;\n case \"RunInput\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;\n break;\n case \"Outstanding\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n case \"WorkerExecution\":\n rows = (yield* Effect.forEach(\n [\"UserInputRecorded\", \"RunStarted\"],\n (tag) =>\n sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') IS NOT NULL\n ORDER BY sequence DESC LIMIT 1`,\n ))\n .flat()\n .filter((row) => Number(row.sequence) > after)\n .sort((a, b) => Number(a.sequence) - Number(b.sequence))\n .slice(0, request.page.limit);\n break;\n case \"WorkerState\": {\n const runId =\n selection.sourceSubmissionId === undefined\n ? null\n : runIdForSubmission(selection.sourceSubmissionId);\n\n rows = yield* sql`\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') IN ('ThreadCreated', 'WorkerOriginRecorded', 'SubagentLineageRecorded', 'WorkerInputRequested', 'WorkerInputCompleted', 'WorkerStopRequested')\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved' AND json_extract(record_json, '$.payload.sourceSubmissionId') IS ${selection.sourceSubmissionId ?? null}\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubagentJoined' AND json_extract(record_json, '$.payload.runId') = ${runId}\n ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n }\n }\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);\n\n if (selection._tag === \"RunInput\" && decoded.length > 1)\n return yield* failure(\"ambiguous original Run input\");\n\n return yield* Effect.forEach(\n decoded.filter((row) => row.sequence > after),\n (row) =>\n Effect.gen(function* () {\n const value = yield* envelope(row);\n\n if (\n value.record.recordId !== row.record_id ||\n row.thread_id !== request.threadId ||\n (selection._tag === \"Outstanding\" &&\n !(\n (row.outstanding === 1 && value.record.payload._tag === \"ToolCallPrepared\") ||\n (row.outstanding === 2 && value.record.payload._tag === \"ToolCallUnknown\") ||\n (row.outstanding === 3 &&\n value.record.payload._tag === \"WorkerInputRequested\")\n ))\n )\n return yield* failure(\"selected record incomplete or corrupt\");\n\n return value;\n }),\n );\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"selected read\", cause),\n ),\n );\n\n const readIdentity: ThreadStore[\"Service\"][\"readIdentity\"] = Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(Schema.toType(ThreadIdentityRequest))(request);\n\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tails = yield* sql`SELECT tail_sequence, tail_digest, producer_epoch\n FROM effect_agent_threads WHERE thread_id = ${request.threadId}`;\n\n if (tails.length === 0)\n return yield* ThreadNotMaterialized.make({ threadId: request.threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(\n Schema.Struct({\n tail_sequence: CanonicalSequence,\n tail_digest: Digest,\n producer_epoch: ProducerEpoch,\n }),\n ),\n )(tails);\n\n const tail = decoded[0];\n\n if (decoded.length !== 1 || tail === undefined) return yield* failure(\"identity tail\");\n const origin = workerOriginRecordId(request.threadId);\n const lineage = subagentLineageRecordId(request.threadId);\n\n const rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM (\n SELECT thread_id, sequence, record_id, batch_id, record_json, 0 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND sequence = 1\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json, 1 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${origin} AND sequence <> 1\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json, 2 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${lineage} AND sequence <> 1\n ) ORDER BY identity_order`;\n\n const records = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows).pipe(\n Effect.flatMap(\n Effect.forEach((row) =>\n envelope(row).pipe(\n Effect.filterOrFail(\n (value) => value.record.recordId === row.record_id,\n () => failure(\"identity record locator\"),\n ),\n ),\n ),\n ),\n );\n\n return yield* ThreadIdentity.makeEffect({\n threadId: request.threadId,\n tailSequence: tail.tail_sequence,\n tailDigest: tail.tail_digest,\n producerEpoch: tail.producer_epoch,\n records,\n });\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"readIdentity\", cause),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(ThreadPeerCountRequest)(request);\n yield* requireThread(request.threadId);\n\n const rows =\n yield* sql`SELECT 1 FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'PeerMessagePrepared' LIMIT ${request.limit}`;\n\n return rows.length;\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"countPeerMessages\", cause),\n ),\n );\n\n return { read, countPeerMessages, readIdentity };\n});\n"],"mappings":"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"}