@acme-engine/core 0.1.0

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 (137) hide show
  1. package/dist/common.d.ts +40 -0
  2. package/dist/common.d.ts.map +1 -0
  3. package/dist/common.js +2 -0
  4. package/dist/common.js.map +1 -0
  5. package/dist/contracts.d.ts +65 -0
  6. package/dist/contracts.d.ts.map +1 -0
  7. package/dist/contracts.js +2 -0
  8. package/dist/contracts.js.map +1 -0
  9. package/dist/errors.d.ts +24 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +20 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/evaluation.d.ts +14 -0
  14. package/dist/evaluation.d.ts.map +1 -0
  15. package/dist/evaluation.js +2 -0
  16. package/dist/evaluation.js.map +1 -0
  17. package/dist/execution-engine.d.ts +30 -0
  18. package/dist/execution-engine.d.ts.map +1 -0
  19. package/dist/execution-engine.js +885 -0
  20. package/dist/execution-engine.js.map +1 -0
  21. package/dist/execution-identity.d.ts +35 -0
  22. package/dist/execution-identity.d.ts.map +1 -0
  23. package/dist/execution-identity.js +177 -0
  24. package/dist/execution-identity.js.map +1 -0
  25. package/dist/execution-status.d.ts +2 -0
  26. package/dist/execution-status.d.ts.map +1 -0
  27. package/dist/execution-status.js +2 -0
  28. package/dist/execution-status.js.map +1 -0
  29. package/dist/execution-types.d.ts +58 -0
  30. package/dist/execution-types.d.ts.map +1 -0
  31. package/dist/execution-types.js +2 -0
  32. package/dist/execution-types.js.map +1 -0
  33. package/dist/hashing.d.ts +6 -0
  34. package/dist/hashing.d.ts.map +1 -0
  35. package/dist/hashing.js +73 -0
  36. package/dist/hashing.js.map +1 -0
  37. package/dist/index.d.ts +34 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +33 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/memory-engine.d.ts +13 -0
  42. package/dist/memory-engine.d.ts.map +1 -0
  43. package/dist/memory-engine.js +591 -0
  44. package/dist/memory-engine.js.map +1 -0
  45. package/dist/memory.d.ts +151 -0
  46. package/dist/memory.d.ts.map +1 -0
  47. package/dist/memory.js +2 -0
  48. package/dist/memory.js.map +1 -0
  49. package/dist/model-call-usage.d.ts +40 -0
  50. package/dist/model-call-usage.d.ts.map +1 -0
  51. package/dist/model-call-usage.js +0 -0
  52. package/dist/model-call-usage.js.map +1 -0
  53. package/dist/model-execution-engine.d.ts +16 -0
  54. package/dist/model-execution-engine.d.ts.map +1 -0
  55. package/dist/model-execution-engine.js +598 -0
  56. package/dist/model-execution-engine.js.map +1 -0
  57. package/dist/model-execution-identity.d.ts +16 -0
  58. package/dist/model-execution-identity.d.ts.map +1 -0
  59. package/dist/model-execution-identity.js +84 -0
  60. package/dist/model-execution-identity.js.map +1 -0
  61. package/dist/model-execution-types.d.ts +66 -0
  62. package/dist/model-execution-types.d.ts.map +1 -0
  63. package/dist/model-execution-types.js +8 -0
  64. package/dist/model-execution-types.js.map +1 -0
  65. package/dist/model-gateway-router.d.ts +11 -0
  66. package/dist/model-gateway-router.d.ts.map +1 -0
  67. package/dist/model-gateway-router.js +69 -0
  68. package/dist/model-gateway-router.js.map +1 -0
  69. package/dist/model-request-hash.d.ts +5 -0
  70. package/dist/model-request-hash.d.ts.map +1 -0
  71. package/dist/model-request-hash.js +11 -0
  72. package/dist/model-request-hash.js.map +1 -0
  73. package/dist/model-response-hash.d.ts +5 -0
  74. package/dist/model-response-hash.d.ts.map +1 -0
  75. package/dist/model-response-hash.js +11 -0
  76. package/dist/model-response-hash.js.map +1 -0
  77. package/dist/model-validation.d.ts +11 -0
  78. package/dist/model-validation.d.ts.map +1 -0
  79. package/dist/model-validation.js +580 -0
  80. package/dist/model-validation.js.map +1 -0
  81. package/dist/model.d.ts +125 -0
  82. package/dist/model.d.ts.map +1 -0
  83. package/dist/model.js +4 -0
  84. package/dist/model.js.map +1 -0
  85. package/dist/modules.d.ts +83 -0
  86. package/dist/modules.d.ts.map +1 -0
  87. package/dist/modules.js +7 -0
  88. package/dist/modules.js.map +1 -0
  89. package/dist/outbox.d.ts +88 -0
  90. package/dist/outbox.d.ts.map +1 -0
  91. package/dist/outbox.js +180 -0
  92. package/dist/outbox.js.map +1 -0
  93. package/dist/payload-encryptor.d.ts +92 -0
  94. package/dist/payload-encryptor.d.ts.map +1 -0
  95. package/dist/payload-encryptor.js +173 -0
  96. package/dist/payload-encryptor.js.map +1 -0
  97. package/dist/registries.d.ts +5 -0
  98. package/dist/registries.d.ts.map +1 -0
  99. package/dist/registries.js +159 -0
  100. package/dist/registries.js.map +1 -0
  101. package/dist/repository-digest.d.ts +5 -0
  102. package/dist/repository-digest.d.ts.map +1 -0
  103. package/dist/repository-digest.js +25 -0
  104. package/dist/repository-digest.js.map +1 -0
  105. package/dist/repository-model-call.d.ts +43 -0
  106. package/dist/repository-model-call.d.ts.map +1 -0
  107. package/dist/repository-model-call.js +2 -0
  108. package/dist/repository-model-call.js.map +1 -0
  109. package/dist/repository-model-execution.d.ts +49 -0
  110. package/dist/repository-model-execution.d.ts.map +1 -0
  111. package/dist/repository-model-execution.js +2 -0
  112. package/dist/repository-model-execution.js.map +1 -0
  113. package/dist/repository.d.ts +260 -0
  114. package/dist/repository.d.ts.map +1 -0
  115. package/dist/repository.js +2 -0
  116. package/dist/repository.js.map +1 -0
  117. package/dist/response-pipeline.d.ts +3 -0
  118. package/dist/response-pipeline.d.ts.map +1 -0
  119. package/dist/response-pipeline.js +132 -0
  120. package/dist/response-pipeline.js.map +1 -0
  121. package/dist/state-engine.d.ts +19 -0
  122. package/dist/state-engine.d.ts.map +1 -0
  123. package/dist/state-engine.js +272 -0
  124. package/dist/state-engine.js.map +1 -0
  125. package/dist/state-projection.d.ts +5 -0
  126. package/dist/state-projection.d.ts.map +1 -0
  127. package/dist/state-projection.js +145 -0
  128. package/dist/state-projection.js.map +1 -0
  129. package/dist/state.d.ts +41 -0
  130. package/dist/state.d.ts.map +1 -0
  131. package/dist/state.js +2 -0
  132. package/dist/state.js.map +1 -0
  133. package/dist/stranded-execution.d.ts +59 -0
  134. package/dist/stranded-execution.d.ts.map +1 -0
  135. package/dist/stranded-execution.js +235 -0
  136. package/dist/stranded-execution.js.map +1 -0
  137. package/package.json +36 -0
@@ -0,0 +1,125 @@
1
+ import type { ExecutionId, IsoTimestamp, JsonValue } from './common.js';
2
+ import type { AcmeErrorData } from './errors.js';
3
+ export interface ModelCapabilities {
4
+ readonly structuredOutput: boolean;
5
+ readonly tools: boolean;
6
+ readonly vision: boolean;
7
+ readonly maxInputTokens?: number;
8
+ readonly maxOutputTokens?: number;
9
+ }
10
+ export type ModelContentPart = {
11
+ readonly type: 'text';
12
+ readonly text: string;
13
+ } | {
14
+ readonly type: 'image';
15
+ readonly mediaType: string;
16
+ readonly dataRef: string;
17
+ } | {
18
+ readonly type: 'tool-result';
19
+ readonly toolCallId: string;
20
+ readonly value: JsonValue;
21
+ } | {
22
+ readonly type: 'tool-call';
23
+ readonly toolCallId: string;
24
+ readonly name: string;
25
+ readonly arguments: JsonValue;
26
+ };
27
+ export interface ModelMessage {
28
+ readonly role: 'system' | 'user' | 'assistant' | 'tool';
29
+ readonly content: readonly ModelContentPart[];
30
+ }
31
+ export type ModelJsonOutput = {
32
+ readonly mode: 'json';
33
+ readonly schemaName: string;
34
+ readonly jsonSchema: JsonValue;
35
+ };
36
+ export type ModelTextOutput = {
37
+ readonly mode: 'text';
38
+ };
39
+ export type ModelOutputSpec = ModelJsonOutput | ModelTextOutput;
40
+ export interface ModelFunctionTool {
41
+ readonly type: 'function';
42
+ readonly name: string;
43
+ readonly description?: string;
44
+ readonly parameters: JsonValue;
45
+ }
46
+ export interface ModelRequest {
47
+ readonly messages: readonly ModelMessage[];
48
+ readonly output: ModelOutputSpec;
49
+ readonly tools?: readonly ModelFunctionTool[];
50
+ readonly temperature?: number;
51
+ readonly topP?: number;
52
+ readonly maxOutputTokens?: number;
53
+ readonly stop?: readonly string[];
54
+ readonly reasoningBudget?: number;
55
+ readonly enableThinking?: boolean;
56
+ readonly reasoningEffort?: string;
57
+ readonly seed?: number;
58
+ }
59
+ export declare function isJsonModelOutput(output: ModelOutputSpec): output is ModelJsonOutput;
60
+ export interface ModelSelection {
61
+ readonly profile: string;
62
+ readonly providerHint?: string;
63
+ readonly modelHint?: string;
64
+ }
65
+ export interface GatewayCallContext {
66
+ readonly executionId: ExecutionId;
67
+ readonly callKey: string;
68
+ readonly selection: ModelSelection;
69
+ readonly requiredCapabilities: Partial<ModelCapabilities>;
70
+ readonly timeoutMs: number;
71
+ readonly signal: AbortSignal;
72
+ }
73
+ export interface NormalizedUsage {
74
+ readonly inputTokens?: number;
75
+ readonly outputTokens?: number;
76
+ readonly totalTokens?: number;
77
+ readonly estimatedCostMinor?: number;
78
+ readonly currency?: string;
79
+ }
80
+ export interface NormalizedToolCall {
81
+ readonly toolCallId: string;
82
+ readonly name: string;
83
+ readonly arguments: JsonValue;
84
+ }
85
+ export interface NormalizedModelResponse {
86
+ readonly provider: string;
87
+ readonly model: string;
88
+ readonly providerResponseId?: string;
89
+ readonly receivedAt: IsoTimestamp;
90
+ readonly finishReason: 'stop' | 'length' | 'tool' | 'content-filter' | 'unknown';
91
+ readonly text: string;
92
+ readonly toolCalls?: readonly NormalizedToolCall[];
93
+ readonly usage: NormalizedUsage;
94
+ readonly metadata: Readonly<Record<string, JsonValue>>;
95
+ }
96
+ export type ModelStreamEvent = {
97
+ readonly type: 'reasoning-delta';
98
+ readonly sequence: number;
99
+ readonly text: string;
100
+ } | {
101
+ readonly type: 'content-delta';
102
+ readonly sequence: number;
103
+ readonly text: string;
104
+ } | {
105
+ readonly type: 'tool-call-delta';
106
+ readonly sequence: number;
107
+ readonly index: number;
108
+ readonly toolCallId?: string;
109
+ readonly name?: string;
110
+ readonly argumentsDelta?: string;
111
+ } | {
112
+ readonly type: 'completed';
113
+ readonly sequence: number;
114
+ readonly response: NormalizedModelResponse;
115
+ } | {
116
+ readonly type: 'failed';
117
+ readonly sequence: number;
118
+ readonly error: AcmeErrorData;
119
+ };
120
+ export interface ModelGateway {
121
+ capabilities(selection: ModelSelection): Promise<ModelCapabilities>;
122
+ generate(request: ModelRequest, context: GatewayCallContext): Promise<NormalizedModelResponse>;
123
+ stream?(request: ModelRequest, context: GatewayCallContext): AsyncIterable<ModelStreamEvent>;
124
+ }
125
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
package/dist/model.js ADDED
@@ -0,0 +1,4 @@
1
+ export function isJsonModelOutput(output) {
2
+ return output.mode === 'json';
3
+ }
4
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAoEA,MAAM,UAAU,iBAAiB,CAC/B,MAAuB;IAEvB,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AAChC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { DiagnosticFact, EntityId, ExecutionId, IsoTimestamp, JsonValue, Namespace, Schema, StoredDocument } from './common.js';
2
+ import type { ContractRef } from './contracts.js';
3
+ import type { AppliedMemoryResolution, DomainMemoryPolicy, MemoryCandidate, MemoryRecord } from './memory.js';
4
+ import type { DomainIssue, StateSnapshot } from './state.js';
5
+ export type ModuleRole = 'producer' | 'analyzer' | 'transformer';
6
+ export interface ExecutionReadContext<TState> {
7
+ readonly executionId: ExecutionId;
8
+ readonly entityId: EntityId;
9
+ readonly now: IsoTimestamp;
10
+ readonly state: StateSnapshot<TState> | null;
11
+ readonly memories: readonly MemoryRecord[];
12
+ readonly documents: readonly StoredDocument[];
13
+ }
14
+ export interface CandidateDocument {
15
+ readonly key: string;
16
+ readonly kind: string;
17
+ readonly schemaVersion: string;
18
+ readonly value: JsonValue;
19
+ readonly contentHash: string;
20
+ }
21
+ export interface CandidateEvent {
22
+ readonly key: string;
23
+ readonly type: string;
24
+ readonly schemaVersion: string;
25
+ readonly payload: JsonValue;
26
+ }
27
+ export interface StateDelta<TDelta> {
28
+ readonly schemaVersion: string;
29
+ readonly value: TDelta;
30
+ }
31
+ export interface ModuleResult<TDelta> {
32
+ readonly documents: readonly CandidateDocument[];
33
+ readonly memories: readonly MemoryCandidate[];
34
+ readonly stateIntent?: StateDelta<TDelta>;
35
+ readonly events: readonly CandidateEvent[];
36
+ readonly diagnostics: readonly DiagnosticFact[];
37
+ }
38
+ export interface StateProjectionMemoryDecision {
39
+ readonly candidate: MemoryCandidate;
40
+ readonly identityKey: string;
41
+ readonly resolution: AppliedMemoryResolution;
42
+ readonly affectedMemoryIds: readonly string[];
43
+ }
44
+ export interface StateProjectionInput<TDelta> {
45
+ readonly stateIntent?: StateDelta<TDelta>;
46
+ readonly memory: readonly StateProjectionMemoryDecision[];
47
+ }
48
+ export interface TaskDefinition<TInput, TContractInput, TContractOutput, TState, TDelta> {
49
+ readonly role: ModuleRole;
50
+ readonly inputSchema: Schema<TInput>;
51
+ readonly contract: ContractRef;
52
+ project(input: TInput, context: ExecutionReadContext<TState>): Promise<TContractInput> | TContractInput;
53
+ interpret(output: TContractOutput, input: TInput, context: ExecutionReadContext<TState>): Promise<ModuleResult<TDelta>> | ModuleResult<TDelta>;
54
+ projectState(input: StateProjectionInput<TDelta>, context: ExecutionReadContext<TState>): StateDelta<TDelta> | undefined;
55
+ }
56
+ export type AnyTaskDefinition<TState, TDelta> = TaskDefinition<any, any, any, TState, TDelta>;
57
+ export type TaskMap<TState, TDelta> = Readonly<Record<string, AnyTaskDefinition<TState, TDelta>>>;
58
+ export interface DomainModule<TState, TDelta, TTasks extends TaskMap<TState, TDelta>> {
59
+ readonly namespace: Namespace;
60
+ readonly stateSchemaVersion: string;
61
+ readonly deltaSchemaVersion: string;
62
+ readonly stateSchema: Schema<TState>;
63
+ readonly deltaSchema: Schema<TDelta>;
64
+ readonly tasks: TTasks;
65
+ readonly memoryPolicy: DomainMemoryPolicy;
66
+ initialState(context: {
67
+ readonly entityId: EntityId;
68
+ readonly now: IsoTimestamp;
69
+ }): TState;
70
+ reduce(state: TState, delta: TDelta): TState;
71
+ invariants(next: TState, previous: TState | null): readonly DomainIssue[];
72
+ }
73
+ export type AnyDomainModule = DomainModule<any, any, TaskMap<any, any>>;
74
+ export type TaskName<M extends AnyDomainModule> = Extract<keyof M['tasks'], string>;
75
+ export type TaskInput<M extends AnyDomainModule, K extends TaskName<M>> = M['tasks'][K] extends TaskDefinition<infer TInput, any, any, any, any> ? TInput : never;
76
+ export type TaskContractOutput<M extends AnyDomainModule, K extends TaskName<M>> = M['tasks'][K] extends TaskDefinition<any, any, infer TContractOutput, any, any> ? TContractOutput : never;
77
+ export interface ModuleRegistry {
78
+ get(namespace: Namespace): AnyDomainModule;
79
+ list(): readonly Namespace[];
80
+ }
81
+ export declare function defineTask<TInput, TContractInput, TContractOutput, TState, TDelta>(task: TaskDefinition<TInput, TContractInput, TContractOutput, TState, TDelta>): TaskDefinition<TInput, TContractInput, TContractOutput, TState, TDelta>;
82
+ export declare function defineModule<TState, TDelta, const TTasks extends TaskMap<TState, TDelta>>(module: DomainModule<TState, TDelta, TTasks>): DomainModule<TState, TDelta, TTasks>;
83
+ //# sourceMappingURL=modules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.d.ts","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export function defineTask(task) {
2
+ return task;
3
+ }
4
+ export function defineModule(module) {
5
+ return module;
6
+ }
7
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAkLA,MAAM,UAAU,UAAU,CAOxB,IAA6E;IAE7E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAK1B,MAA4C;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import type { Clock, DiagnosticFact, IsoTimestamp } from './common.js';
2
+ import { type AcmeErrorData } from './errors.js';
3
+ import type { DomainEventRecord, ExecutionRepository } from './repository.js';
4
+ /** Versioned drain report identity. */
5
+ export declare const ACME_OUTBOX_DRAIN_REPORT = "acme-outbox-drain-report/1";
6
+ /** Versioned redrive report identity. */
7
+ export declare const ACME_OUTBOX_REDRIVE_REPORT = "acme-outbox-redrive-report/1";
8
+ /**
9
+ * Delivers one committed domain event. A rejected promise is a delivery
10
+ * failure. Transports live in composition roots, never in core (ADR-0018).
11
+ */
12
+ export interface OutboxDispatcher {
13
+ deliver(event: DomainEventRecord): Promise<void>;
14
+ }
15
+ /**
16
+ * Decides what happens after a failed delivery. Returning a delay retries the
17
+ * entry that many milliseconds later; returning `null` gives up and marks the
18
+ * entry `failed`. The repository owns no retry policy.
19
+ */
20
+ export type OutboxRetryPolicy = (attemptCount: number) => number | null;
21
+ export interface OutboxDrainOptions {
22
+ readonly repository: ExecutionRepository;
23
+ readonly dispatcher: OutboxDispatcher;
24
+ readonly clock: Clock;
25
+ /** Maximum entries leased by this call. */
26
+ readonly limit: number;
27
+ /** How long a lease stays exclusive before the entry is available again. */
28
+ readonly leaseTimeoutMs: number;
29
+ /** Defaults to a single retry after the lease timeout, then `failed`. */
30
+ readonly retry?: OutboxRetryPolicy;
31
+ }
32
+ export type OutboxDeliveryOutcome = 'delivered' | 'retry-scheduled' | 'failed';
33
+ export interface OutboxDrainEntryReport {
34
+ readonly eventId: string;
35
+ readonly attemptCount: number;
36
+ readonly outcome: OutboxDeliveryOutcome;
37
+ readonly retryAt?: IsoTimestamp;
38
+ readonly error?: AcmeErrorData;
39
+ }
40
+ export interface OutboxDrainReport {
41
+ readonly report: typeof ACME_OUTBOX_DRAIN_REPORT;
42
+ readonly leasedAt: IsoTimestamp;
43
+ readonly leased: number;
44
+ readonly delivered: number;
45
+ readonly retryScheduled: number;
46
+ readonly failed: number;
47
+ readonly entries: readonly OutboxDrainEntryReport[];
48
+ readonly diagnostics: readonly DiagnosticFact[];
49
+ }
50
+ export interface OutboxRedriveOptions {
51
+ readonly repository: ExecutionRepository;
52
+ readonly clock: Clock;
53
+ /**
54
+ * Specific event ids to redrive. When omitted, every `failed` entry up to
55
+ * `limit` is selected in list order.
56
+ */
57
+ readonly eventIds?: readonly string[];
58
+ /** Maximum entries to redrive in this call. */
59
+ readonly limit: number;
60
+ }
61
+ export interface OutboxRedriveEntryReport {
62
+ readonly eventId: string;
63
+ readonly outcome: 'redriven';
64
+ readonly availableAt: IsoTimestamp;
65
+ readonly attemptCount: number;
66
+ }
67
+ export interface OutboxRedriveReport {
68
+ readonly report: typeof ACME_OUTBOX_REDRIVE_REPORT;
69
+ readonly redrivenAt: IsoTimestamp;
70
+ readonly redriven: number;
71
+ readonly entries: readonly OutboxRedriveEntryReport[];
72
+ }
73
+ /**
74
+ * Leases one bounded batch of due outbox entries, delivers each through the
75
+ * dispatcher and settles every outcome (ADR-0018).
76
+ *
77
+ * Exactly one leased batch per call: no internal loop and no recursion. A
78
+ * caller that wants the outbox emptied calls again and sees each batch.
79
+ * Delivery is at-least-once — a crash between `deliver` and its settlement
80
+ * re-delivers once the lease expires.
81
+ */
82
+ export declare function drainOutbox(options: OutboxDrainOptions): Promise<OutboxDrainReport>;
83
+ /**
84
+ * Move terminal `failed` outbox entries back to `pending` so a later drain
85
+ * may lease them (ACME-0059). One bounded batch; never redrives `delivered`.
86
+ */
87
+ export declare function redriveOutbox(options: OutboxRedriveOptions): Promise<OutboxRedriveReport>;
88
+ //# sourceMappingURL=outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
package/dist/outbox.js ADDED
@@ -0,0 +1,180 @@
1
+ import { AcmeError } from './errors.js';
2
+ /** Versioned drain report identity. */
3
+ export const ACME_OUTBOX_DRAIN_REPORT = 'acme-outbox-drain-report/1';
4
+ /** Versioned redrive report identity. */
5
+ export const ACME_OUTBOX_REDRIVE_REPORT = 'acme-outbox-redrive-report/1';
6
+ const TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u;
7
+ function invalid(message, details) {
8
+ throw new AcmeError({
9
+ code: 'INVALID_REQUEST',
10
+ message,
11
+ stage: 'accepted',
12
+ retryable: false,
13
+ ...(details === undefined ? {} : { details: details }),
14
+ });
15
+ }
16
+ function requireTimestamp(value) {
17
+ if (!TIMESTAMP.test(value) ||
18
+ Number.isNaN(Date.parse(value)) ||
19
+ new Date(value).toISOString() !== value) {
20
+ invalid('Clock returned a non-canonical UTC timestamp.');
21
+ }
22
+ return value;
23
+ }
24
+ function shift(from, milliseconds) {
25
+ return new Date(Date.parse(from) + milliseconds).toISOString();
26
+ }
27
+ function failureData(error) {
28
+ if (error instanceof AcmeError) {
29
+ return error.data;
30
+ }
31
+ return Object.freeze({
32
+ code: 'INTERNAL',
33
+ message: error instanceof Error
34
+ ? `Outbox delivery failed: ${error.message}`
35
+ : 'Outbox delivery failed with a non-Error value.',
36
+ stage: 'committed',
37
+ retryable: true,
38
+ });
39
+ }
40
+ function deepFreeze(value) {
41
+ if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
42
+ Object.freeze(value);
43
+ for (const child of Object.values(value)) {
44
+ deepFreeze(child);
45
+ }
46
+ }
47
+ return value;
48
+ }
49
+ /**
50
+ * Leases one bounded batch of due outbox entries, delivers each through the
51
+ * dispatcher and settles every outcome (ADR-0018).
52
+ *
53
+ * Exactly one leased batch per call: no internal loop and no recursion. A
54
+ * caller that wants the outbox emptied calls again and sees each batch.
55
+ * Delivery is at-least-once — a crash between `deliver` and its settlement
56
+ * re-delivers once the lease expires.
57
+ */
58
+ export async function drainOutbox(options) {
59
+ if (!Number.isSafeInteger(options.limit) || options.limit <= 0) {
60
+ invalid('Outbox drain limit must be a positive integer.', {
61
+ limit: options.limit,
62
+ });
63
+ }
64
+ if (!Number.isSafeInteger(options.leaseTimeoutMs) ||
65
+ options.leaseTimeoutMs <= 0) {
66
+ invalid('Outbox lease timeout must be a positive integer.', {
67
+ leaseTimeoutMs: options.leaseTimeoutMs,
68
+ });
69
+ }
70
+ const now = requireTimestamp(options.clock.now());
71
+ const leaseExpiresAt = shift(now, options.leaseTimeoutMs);
72
+ const retry = options.retry ??
73
+ ((attempt) => (attempt <= 1 ? options.leaseTimeoutMs : null));
74
+ const leased = await options.repository.leaseOutbox({
75
+ now,
76
+ limit: options.limit,
77
+ leaseExpiresAt,
78
+ });
79
+ const entries = [];
80
+ for (const entry of leased) {
81
+ entries.push(await settle(options, entry, now, retry));
82
+ }
83
+ return deepFreeze({
84
+ report: ACME_OUTBOX_DRAIN_REPORT,
85
+ leasedAt: now,
86
+ leased: leased.length,
87
+ delivered: entries.filter((entry) => entry.outcome === 'delivered').length,
88
+ retryScheduled: entries.filter((entry) => entry.outcome === 'retry-scheduled').length,
89
+ failed: entries.filter((entry) => entry.outcome === 'failed').length,
90
+ entries,
91
+ diagnostics: [],
92
+ });
93
+ }
94
+ /**
95
+ * Move terminal `failed` outbox entries back to `pending` so a later drain
96
+ * may lease them (ACME-0059). One bounded batch; never redrives `delivered`.
97
+ */
98
+ export async function redriveOutbox(options) {
99
+ if (!Number.isSafeInteger(options.limit) || options.limit <= 0) {
100
+ invalid('Outbox redrive limit must be a positive integer.', {
101
+ limit: options.limit,
102
+ });
103
+ }
104
+ const now = requireTimestamp(options.clock.now());
105
+ const entries = [];
106
+ if (options.eventIds !== undefined && options.eventIds.length > 0) {
107
+ if (options.eventIds.length > options.limit) {
108
+ invalid('eventIds length exceeds redrive limit.', {
109
+ count: options.eventIds.length,
110
+ limit: options.limit,
111
+ });
112
+ }
113
+ for (const eventId of options.eventIds) {
114
+ if (typeof eventId !== 'string' || eventId.trim().length === 0) {
115
+ invalid('eventIds must be non-empty strings.');
116
+ }
117
+ await options.repository.redriveOutbox({
118
+ eventId,
119
+ availableAt: now,
120
+ });
121
+ entries.push({
122
+ eventId,
123
+ outcome: 'redriven',
124
+ availableAt: now,
125
+ attemptCount: 0,
126
+ });
127
+ }
128
+ }
129
+ else {
130
+ const failed = await options.repository.listOutbox({
131
+ status: 'failed',
132
+ limit: options.limit,
133
+ });
134
+ for (const entry of failed) {
135
+ await options.repository.redriveOutbox({
136
+ eventId: entry.record.eventId,
137
+ availableAt: now,
138
+ });
139
+ entries.push({
140
+ eventId: entry.record.eventId,
141
+ outcome: 'redriven',
142
+ availableAt: now,
143
+ attemptCount: entry.record.attemptCount,
144
+ });
145
+ }
146
+ }
147
+ return deepFreeze({
148
+ report: ACME_OUTBOX_REDRIVE_REPORT,
149
+ redrivenAt: now,
150
+ redriven: entries.length,
151
+ entries,
152
+ });
153
+ }
154
+ async function settle(options, entry, now, retry) {
155
+ const { eventId, attemptCount } = entry.record;
156
+ try {
157
+ await options.dispatcher.deliver(entry.event);
158
+ }
159
+ catch (error) {
160
+ const data = failureData(error);
161
+ const delay = retry(attemptCount);
162
+ const retryAt = delay === null ? undefined : shift(now, delay);
163
+ await options.repository.markOutboxFailed({
164
+ eventId,
165
+ error: data,
166
+ failedAt: now,
167
+ ...(retryAt === undefined ? {} : { retryAt }),
168
+ });
169
+ return {
170
+ eventId,
171
+ attemptCount,
172
+ outcome: retryAt === undefined ? 'failed' : 'retry-scheduled',
173
+ ...(retryAt === undefined ? {} : { retryAt }),
174
+ error: data,
175
+ };
176
+ }
177
+ await options.repository.markOutboxDelivered({ eventId, deliveredAt: now });
178
+ return { eventId, attemptCount, outcome: 'delivered' };
179
+ }
180
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { JsonValue } from './common.js';
2
+ import type { NormalizedModelResponse } from './model.js';
3
+ export declare const ACME_PAYLOAD_ENCRYPTION_ALGORITHM: "aes-256-gcm";
4
+ export declare const ACME_PAYLOAD_ENVELOPE_VERSION: "acme-payload-envelope-1";
5
+ /**
6
+ * Ciphertext at rest for `retention: 'encrypted-payload'`.
7
+ * Stored as canonical JSON in `ModelCallRecord.protectedResponse`.
8
+ */
9
+ export interface ProtectedPayloadEnvelope {
10
+ readonly v: typeof ACME_PAYLOAD_ENVELOPE_VERSION;
11
+ readonly algorithm: typeof ACME_PAYLOAD_ENCRYPTION_ALGORITHM;
12
+ readonly keyId: string;
13
+ readonly iv: string;
14
+ readonly authTag: string;
15
+ readonly ciphertext: string;
16
+ }
17
+ /**
18
+ * Composition-owned crypto. Core defines the port; adapters call it when
19
+ * policy demands encryption. Implementations must not read environment or
20
+ * key stores themselves—callers inject key material.
21
+ */
22
+ export interface PayloadEncryptor {
23
+ readonly keyId: string;
24
+ encrypt(plaintext: JsonValue): ProtectedPayloadEnvelope;
25
+ /**
26
+ * Returns plaintext when this encryptor can open the envelope.
27
+ * Returns `null` when the key is missing, `keyId` is unknown, or
28
+ * authentication fails—never invents plaintext.
29
+ */
30
+ decrypt(envelope: ProtectedPayloadEnvelope): JsonValue | null;
31
+ }
32
+ export interface Aes256GcmPayloadEncryptorOptions {
33
+ /** Exactly 32 bytes. */
34
+ readonly key: Uint8Array;
35
+ readonly keyId: string;
36
+ }
37
+ export declare function isProtectedPayloadEnvelope(value: unknown): value is ProtectedPayloadEnvelope;
38
+ export declare function parseProtectedPayloadEnvelope(protectedResponse: string): ProtectedPayloadEnvelope;
39
+ export declare function serializeProtectedPayloadEnvelope(envelope: ProtectedPayloadEnvelope): string;
40
+ /**
41
+ * Pure AES-256-GCM encryptor. Key material is supplied by the composition
42
+ * root; this function never reads the environment.
43
+ */
44
+ export declare function createAes256GcmPayloadEncryptor(options: Aes256GcmPayloadEncryptorOptions): PayloadEncryptor;
45
+ export interface ModelCallRetentionFields {
46
+ readonly response?: NormalizedModelResponse;
47
+ readonly responseHash: string;
48
+ readonly protectedResponse?: string;
49
+ readonly callMetadata?: ModelCallMetadata;
50
+ }
51
+ /**
52
+ * Content-free evidence about a completed call, retained under every retention
53
+ * mode including `none` and `hash-only`.
54
+ *
55
+ * Provider, model id and token counts are operational metadata, not model
56
+ * output: they describe that a call happened and what it consumed, never what
57
+ * it said. Retaining them is what makes cost measurable from recorded evidence
58
+ * instead of inferred, which ADR-0044 requires now that no campaign ceiling
59
+ * stands in for measurement. Usage stays optional because a provider may not
60
+ * report it, and an absent count must read as absent rather than as zero.
61
+ */
62
+ export interface ModelCallMetadata {
63
+ readonly provider: string;
64
+ readonly model: string;
65
+ readonly finishReason: NormalizedModelResponse['finishReason'];
66
+ readonly usage: NormalizedModelResponse['usage'];
67
+ }
68
+ /**
69
+ * Apply retention at the repository write boundary. Engine stays dumb:
70
+ * plaintext arrives on `completed.response`; this decides what rests at rest.
71
+ */
72
+ export declare function applyModelCallRetention(options: {
73
+ readonly retention: 'none' | 'hash-only' | 'encrypted-payload';
74
+ readonly completed: {
75
+ readonly response: NormalizedModelResponse;
76
+ readonly responseHash: string;
77
+ };
78
+ readonly payloadEncryptor?: PayloadEncryptor;
79
+ }): ModelCallRetentionFields;
80
+ /**
81
+ * Reveal plaintext for replay when an encryptor can open the envelope.
82
+ * At-rest records keep `response` absent; this is only for read paths that
83
+ * feed `replayVerify()`.
84
+ */
85
+ export declare function revealModelCallResponse(options: {
86
+ readonly call: {
87
+ readonly response?: NormalizedModelResponse;
88
+ readonly protectedResponse?: string;
89
+ };
90
+ readonly payloadEncryptor?: PayloadEncryptor;
91
+ }): NormalizedModelResponse | undefined;
92
+ //# sourceMappingURL=payload-encryptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-encryptor.d.ts","sourceRoot":"","sources":["../src/payload-encryptor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,iCAAiC,EAAG,aAAsB,CAAC;AACxE,eAAO,MAAM,6BAA6B,EAAG,yBAAkC,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,CAAC,EAAE,OAAO,6BAA6B,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,OAAO,iCAAiC,CAAC;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,wBAAwB,CAAC;IACxD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,SAAS,GAAG,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,gCAAgC;IAC/C,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA2BD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,wBAAwB,CAcnC;AAED,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,MAAM,GACxB,wBAAwB,CAW1B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,wBAAwB,GACjC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,gCAAgC,GACxC,gBAAgB,CAkDlB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAC3C;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;CAClD;AAWD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,mBAAmB,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;QAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C,GAAG,wBAAwB,CAoB3B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;QAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CAC9C,GAAG,uBAAuB,GAAG,SAAS,CA2BtC"}