@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,173 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
2
+ import { AcmeError } from './errors.js';
3
+ import { canonicalJson, nodeHashing } from './hashing.js';
4
+ import { validateNormalizedModelResponse } from './model-validation.js';
5
+ export const ACME_PAYLOAD_ENCRYPTION_ALGORITHM = 'aes-256-gcm';
6
+ export const ACME_PAYLOAD_ENVELOPE_VERSION = 'acme-payload-envelope-1';
7
+ function invalid(message, details) {
8
+ throw new AcmeError({
9
+ code: 'INVALID_REQUEST',
10
+ message,
11
+ stage: 'preparing-commit',
12
+ retryable: false,
13
+ ...(details === undefined ? {} : { details }),
14
+ });
15
+ }
16
+ function toBase64(bytes) {
17
+ return Buffer.from(bytes).toString('base64');
18
+ }
19
+ function fromBase64(value, label) {
20
+ if (typeof value !== 'string' || value.length === 0) {
21
+ invalid(`Protected payload ${label} must be a non-empty base64 string.`);
22
+ }
23
+ try {
24
+ return Buffer.from(value, 'base64');
25
+ }
26
+ catch {
27
+ invalid(`Protected payload ${label} is not valid base64.`);
28
+ }
29
+ }
30
+ export function isProtectedPayloadEnvelope(value) {
31
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
32
+ return false;
33
+ }
34
+ const candidate = value;
35
+ return (candidate.v === ACME_PAYLOAD_ENVELOPE_VERSION &&
36
+ candidate.algorithm === ACME_PAYLOAD_ENCRYPTION_ALGORITHM &&
37
+ typeof candidate.keyId === 'string' &&
38
+ candidate.keyId.length > 0 &&
39
+ typeof candidate.iv === 'string' &&
40
+ typeof candidate.authTag === 'string' &&
41
+ typeof candidate.ciphertext === 'string');
42
+ }
43
+ export function parseProtectedPayloadEnvelope(protectedResponse) {
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(protectedResponse);
47
+ }
48
+ catch {
49
+ invalid('protectedResponse is not valid JSON.');
50
+ }
51
+ if (!isProtectedPayloadEnvelope(parsed)) {
52
+ invalid('protectedResponse is not a recognized payload envelope.');
53
+ }
54
+ return parsed;
55
+ }
56
+ export function serializeProtectedPayloadEnvelope(envelope) {
57
+ return nodeHashing.canonicalJson(envelope);
58
+ }
59
+ /**
60
+ * Pure AES-256-GCM encryptor. Key material is supplied by the composition
61
+ * root; this function never reads the environment.
62
+ */
63
+ export function createAes256GcmPayloadEncryptor(options) {
64
+ if (!(options.key instanceof Uint8Array) || options.key.byteLength !== 32) {
65
+ invalid('AES-256-GCM payload encryption requires a 32-byte key.');
66
+ }
67
+ if (typeof options.keyId !== 'string' || options.keyId.trim().length === 0) {
68
+ invalid('AES-256-GCM payload encryption requires a non-empty keyId.');
69
+ }
70
+ const key = Buffer.from(options.key);
71
+ const keyId = options.keyId;
72
+ return Object.freeze({
73
+ keyId,
74
+ encrypt(plaintext) {
75
+ const iv = randomBytes(12);
76
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
77
+ const body = Buffer.from(canonicalJson(plaintext), 'utf8');
78
+ const encrypted = Buffer.concat([cipher.update(body), cipher.final()]);
79
+ const authTag = cipher.getAuthTag();
80
+ return Object.freeze({
81
+ v: ACME_PAYLOAD_ENVELOPE_VERSION,
82
+ algorithm: ACME_PAYLOAD_ENCRYPTION_ALGORITHM,
83
+ keyId,
84
+ iv: toBase64(iv),
85
+ authTag: toBase64(authTag),
86
+ ciphertext: toBase64(encrypted),
87
+ });
88
+ },
89
+ decrypt(envelope) {
90
+ if (!isProtectedPayloadEnvelope(envelope)) {
91
+ return null;
92
+ }
93
+ if (envelope.keyId !== keyId) {
94
+ return null;
95
+ }
96
+ try {
97
+ const iv = fromBase64(envelope.iv, 'iv');
98
+ const authTag = fromBase64(envelope.authTag, 'authTag');
99
+ const ciphertext = fromBase64(envelope.ciphertext, 'ciphertext');
100
+ const decipher = createDecipheriv('aes-256-gcm', key, iv);
101
+ decipher.setAuthTag(authTag);
102
+ const decrypted = Buffer.concat([
103
+ decipher.update(ciphertext),
104
+ decipher.final(),
105
+ ]);
106
+ return JSON.parse(decrypted.toString('utf8'));
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ },
112
+ });
113
+ }
114
+ function callMetadataOf(response) {
115
+ return {
116
+ provider: response.provider,
117
+ model: response.model,
118
+ finishReason: response.finishReason,
119
+ usage: { ...response.usage },
120
+ };
121
+ }
122
+ /**
123
+ * Apply retention at the repository write boundary. Engine stays dumb:
124
+ * plaintext arrives on `completed.response`; this decides what rests at rest.
125
+ */
126
+ export function applyModelCallRetention(options) {
127
+ const { retention, completed, payloadEncryptor } = options;
128
+ const callMetadata = callMetadataOf(completed.response);
129
+ if (retention !== 'encrypted-payload') {
130
+ return { responseHash: completed.responseHash, callMetadata };
131
+ }
132
+ if (payloadEncryptor === undefined) {
133
+ invalid("retention 'encrypted-payload' requires a PayloadEncryptor on the repository.", { retention });
134
+ }
135
+ const envelope = payloadEncryptor.encrypt(completed.response);
136
+ return {
137
+ responseHash: completed.responseHash,
138
+ protectedResponse: serializeProtectedPayloadEnvelope(envelope),
139
+ callMetadata,
140
+ };
141
+ }
142
+ /**
143
+ * Reveal plaintext for replay when an encryptor can open the envelope.
144
+ * At-rest records keep `response` absent; this is only for read paths that
145
+ * feed `replayVerify()`.
146
+ */
147
+ export function revealModelCallResponse(options) {
148
+ if (options.call.response !== undefined) {
149
+ return options.call.response;
150
+ }
151
+ if (options.call.protectedResponse === undefined ||
152
+ options.payloadEncryptor === undefined) {
153
+ return undefined;
154
+ }
155
+ let envelope;
156
+ try {
157
+ envelope = parseProtectedPayloadEnvelope(options.call.protectedResponse);
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ const plaintext = options.payloadEncryptor.decrypt(envelope);
163
+ if (plaintext === null) {
164
+ return undefined;
165
+ }
166
+ try {
167
+ return validateNormalizedModelResponse(plaintext);
168
+ }
169
+ catch {
170
+ return undefined;
171
+ }
172
+ }
173
+ //# sourceMappingURL=payload-encryptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-encryptor.js","sourceRoot":"","sources":["../src/payload-encryptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AnyPromptContract, ContractRegistry } from './contracts.js';
2
+ import type { AnyDomainModule, ModuleRegistry } from './modules.js';
3
+ export declare function createContractRegistry(contracts: readonly AnyPromptContract[]): ContractRegistry;
4
+ export declare function createModuleRegistry(modules: readonly AnyDomainModule[]): ModuleRegistry;
5
+ //# sourceMappingURL=registries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EAEjB,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgLpE,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,iBAAiB,EAAE,GACtC,gBAAgB,CAElB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,cAAc,CAEhB"}
@@ -0,0 +1,159 @@
1
+ import { z } from 'zod';
2
+ import { AcmeError } from './errors.js';
3
+ import { nodeHashing } from './hashing.js';
4
+ function contractKey(ref) {
5
+ if (ref.id.length === 0 || ref.version.length === 0) {
6
+ throw new AcmeError({
7
+ code: 'INVALID_REQUEST',
8
+ message: 'Contract id and version must be non-empty.',
9
+ stage: 'accepted',
10
+ retryable: false,
11
+ });
12
+ }
13
+ return `${ref.id}@${ref.version}`;
14
+ }
15
+ function compareStrings(left, right) {
16
+ if (left < right) {
17
+ return -1;
18
+ }
19
+ return left > right ? 1 : 0;
20
+ }
21
+ function jsonSchema(schema) {
22
+ return z.toJSONSchema(schema);
23
+ }
24
+ function capabilityDescriptor(contract) {
25
+ const descriptor = {};
26
+ for (const [key, value] of Object.entries(contract.requiredCapabilities)) {
27
+ if (value !== undefined) {
28
+ descriptor[key] = value;
29
+ }
30
+ }
31
+ return descriptor;
32
+ }
33
+ function fingerprintContract(contract) {
34
+ const descriptor = {
35
+ ref: {
36
+ id: contract.ref.id,
37
+ version: contract.ref.version,
38
+ },
39
+ inputSchema: jsonSchema(contract.inputSchema),
40
+ outputSchema: jsonSchema(contract.outputSchema),
41
+ requiredCapabilities: capabilityDescriptor(contract),
42
+ retention: contract.retention,
43
+ };
44
+ return nodeHashing.sha256(nodeHashing.canonicalJson(descriptor));
45
+ }
46
+ class StaticContractRegistry {
47
+ #contracts;
48
+ #fingerprints;
49
+ #refs;
50
+ constructor(contracts) {
51
+ const byKey = new Map();
52
+ const fingerprints = new Map();
53
+ for (const contract of contracts) {
54
+ const key = contractKey(contract.ref);
55
+ if (byKey.has(key)) {
56
+ throw new AcmeError({
57
+ code: 'INTERNAL',
58
+ message: `Duplicate contract registration: ${key}.`,
59
+ stage: 'accepted',
60
+ retryable: false,
61
+ details: { key },
62
+ });
63
+ }
64
+ byKey.set(key, contract);
65
+ fingerprints.set(key, fingerprintContract(contract));
66
+ }
67
+ this.#contracts = byKey;
68
+ this.#fingerprints = fingerprints;
69
+ this.#refs = Object.freeze([...byKey.values()]
70
+ .map(({ ref }) => Object.freeze({ ...ref }))
71
+ .sort((left, right) => compareStrings(contractKey(left), contractKey(right))));
72
+ }
73
+ get(ref) {
74
+ const key = contractKey(ref);
75
+ const contract = this.#contracts.get(key);
76
+ if (contract === undefined) {
77
+ throw new AcmeError({
78
+ code: 'NOT_FOUND_CONTRACT',
79
+ message: `Contract not found: ${key}.`,
80
+ stage: 'accepted',
81
+ retryable: false,
82
+ details: { key },
83
+ });
84
+ }
85
+ return contract;
86
+ }
87
+ has(ref) {
88
+ return this.#contracts.has(contractKey(ref));
89
+ }
90
+ fingerprint(ref) {
91
+ const key = contractKey(ref);
92
+ const fingerprint = this.#fingerprints.get(key);
93
+ if (fingerprint === undefined) {
94
+ throw new AcmeError({
95
+ code: 'NOT_FOUND_CONTRACT',
96
+ message: `Contract not found: ${key}.`,
97
+ stage: 'accepted',
98
+ retryable: false,
99
+ details: { key },
100
+ });
101
+ }
102
+ return fingerprint;
103
+ }
104
+ list() {
105
+ return this.#refs;
106
+ }
107
+ }
108
+ class StaticModuleRegistry {
109
+ #modules;
110
+ #namespaces;
111
+ constructor(modules) {
112
+ const byNamespace = new Map();
113
+ for (const module of modules) {
114
+ if (module.namespace.length === 0) {
115
+ throw new AcmeError({
116
+ code: 'INVALID_REQUEST',
117
+ message: 'Module namespace must be non-empty.',
118
+ stage: 'accepted',
119
+ retryable: false,
120
+ });
121
+ }
122
+ if (byNamespace.has(module.namespace)) {
123
+ throw new AcmeError({
124
+ code: 'INTERNAL',
125
+ message: `Duplicate module registration: ${module.namespace}.`,
126
+ stage: 'accepted',
127
+ retryable: false,
128
+ details: { namespace: module.namespace },
129
+ });
130
+ }
131
+ byNamespace.set(module.namespace, module);
132
+ }
133
+ this.#modules = byNamespace;
134
+ this.#namespaces = Object.freeze([...byNamespace.keys()].sort());
135
+ }
136
+ get(namespace) {
137
+ const module = this.#modules.get(namespace);
138
+ if (module === undefined) {
139
+ throw new AcmeError({
140
+ code: 'NOT_FOUND_MODULE',
141
+ message: `Module not found: ${namespace}.`,
142
+ stage: 'accepted',
143
+ retryable: false,
144
+ details: { namespace },
145
+ });
146
+ }
147
+ return module;
148
+ }
149
+ list() {
150
+ return this.#namespaces;
151
+ }
152
+ }
153
+ export function createContractRegistry(contracts) {
154
+ return new StaticContractRegistry(contracts);
155
+ }
156
+ export function createModuleRegistry(modules) {
157
+ return new StaticModuleRegistry(modules);
158
+ }
159
+ //# sourceMappingURL=registries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registries.js","sourceRoot":"","sources":["../src/registries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,SAAS,WAAW,CAAC,GAAgB;IACnC,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,4CAA4C;YACrD,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,MAAiB;IACnC,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,CAAc,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAA2B;IAE3B,MAAM,UAAU,GAA8B,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACzE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA2B;IACtD,MAAM,UAAU,GAAc;QAC5B,GAAG,EAAE;YACH,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YACnB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO;SAC9B;QACD,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC7C,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/C,oBAAoB,EAAE,oBAAoB,CAAC,QAAQ,CAAC;QACpD,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;IACF,OAAO,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,sBAAsB;IACjB,UAAU,CAAyC;IACnD,aAAa,CAA8B;IAC3C,KAAK,CAAyB;IAEvC,YAAY,SAAuC;QACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,oCAAoC,GAAG,GAAG;oBACnD,KAAK,EAAE,UAAU;oBACjB,SAAS,EAAE,KAAK;oBAChB,OAAO,EAAE,EAAE,GAAG,EAAE;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CACxB,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;aAChB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;aAC3C,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CACtD,CACJ,CAAC;IACJ,CAAC;IAED,GAAG,CAAkB,GAAgB;QACnC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,oBAAoB;gBAC1B,OAAO,EAAE,uBAAuB,GAAG,GAAG;gBACtC,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE,GAAG,EAAE;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAA2C,CAAC;IACrD,CAAC;IAED,GAAG,CAAC,GAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW,CAAC,GAAgB;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,oBAAoB;gBAC1B,OAAO,EAAE,uBAAuB,GAAG,GAAG;gBACtC,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE,GAAG,EAAE;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,oBAAoB;IACf,QAAQ,CAAuC;IAC/C,WAAW,CAAoB;IAExC,YAAY,OAAmC;QAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;QAEvD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,qCAAqC;oBAC9C,KAAK,EAAE,UAAU;oBACjB,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,kCAAkC,MAAM,CAAC,SAAS,GAAG;oBAC9D,KAAK,EAAE,UAAU;oBACjB,SAAS,EAAE,KAAK;oBAChB,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;iBACzC,CAAC,CAAC;YACL,CAAC;YACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,qBAAqB,SAAS,GAAG;gBAC1C,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE,SAAS,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAuC;IAEvC,OAAO,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAmC;IAEnC,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Hashing } from './common.js';
2
+ import type { PreparedCommit, PreparedCommitContent } from './repository.js';
3
+ export declare const ACME_OPERATION_DIGEST_ALGORITHM: "acme-operation-digest-1";
4
+ export declare function computeOperationDigest(prepared: PreparedCommitContent | PreparedCommit, hashing?: Hashing): string;
5
+ //# sourceMappingURL=repository-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-digest.d.ts","sourceRoot":"","sources":["../src/repository-digest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,aAAa,CAAC;AAEtD,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,+BAA+B,EAC1C,yBAAkC,CAAC;AAgBrC,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,qBAAqB,GAAG,cAAc,EAChD,OAAO,GAAE,OAAqB,GAC7B,MAAM,CAuBR"}
@@ -0,0 +1,25 @@
1
+ import { nodeHashing } from './hashing.js';
2
+ export const ACME_OPERATION_DIGEST_ALGORITHM = 'acme-operation-digest-1';
3
+ function compareText(left, right) {
4
+ return left < right ? -1 : left > right ? 1 : 0;
5
+ }
6
+ function compareEvaluators(left, right) {
7
+ return (compareText(left.evaluatorId, right.evaluatorId) ||
8
+ left.attempt - right.attempt);
9
+ }
10
+ export function computeOperationDigest(prepared, hashing = nodeHashing) {
11
+ const input = {
12
+ algorithm: ACME_OPERATION_DIGEST_ALGORITHM,
13
+ executionId: prepared.executionId,
14
+ expectedRevision: prepared.expectedRevision,
15
+ documents: [...prepared.documents].sort((left, right) => compareText(left.key, right.key)),
16
+ memoryCandidates: [...prepared.memoryCandidates].sort((left, right) => compareText(left.key, right.key)),
17
+ memory: prepared.memory,
18
+ state: prepared.state,
19
+ evaluatorRuns: [...prepared.evaluatorRuns].sort(compareEvaluators),
20
+ events: [...prepared.events].sort((left, right) => compareText(left.key, right.key)),
21
+ committedAt: prepared.committedAt,
22
+ };
23
+ return hashing.sha256(hashing.canonicalJson(input));
24
+ }
25
+ //# sourceMappingURL=repository-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-digest.js","sourceRoot":"","sources":["../src/repository-digest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAO3C,MAAM,CAAC,MAAM,+BAA+B,GAC1C,yBAAkC,CAAC;AAErC,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,iBAAiB,CACxB,IAA0B,EAC1B,KAA2B;IAE3B,OAAO,CACL,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAgD,EAChD,UAAmB,WAAW;IAE9B,MAAM,KAAK,GAAc;QACvB,SAAS,EAAE,+BAA+B;QAC1C,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACtD,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CACT;QACzB,gBAAgB,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpE,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CACT;QACzB,MAAM,EAAE,QAAQ,CAAC,MAA8B;QAC/C,KAAK,EAAE,QAAQ,CAAC,KAA6B;QAC7C,aAAa,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAC7C,iBAAiB,CACM;QACzB,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAChD,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CACT;QACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { ExecutionId, IsoTimestamp, ModelCallId } from './common.js';
2
+ import type { AcmeErrorData } from './errors.js';
3
+ import type { ModelSelection, NormalizedModelResponse } from './model.js';
4
+ import type { ModelCallMetadata } from './payload-encryptor.js';
5
+ export interface ModelCallReservation {
6
+ readonly modelCallId: ModelCallId;
7
+ readonly executionId: ExecutionId;
8
+ readonly callKey: string;
9
+ readonly attempt: number;
10
+ readonly purpose: 'primary' | 'repair' | 'revision';
11
+ readonly selection: ModelSelection;
12
+ /** Digest produced by the immutable acme-model-request-hash-1 algorithm. */
13
+ readonly requestHash: string;
14
+ readonly protectedRequest?: string;
15
+ readonly startedAt: IsoTimestamp;
16
+ }
17
+ export interface ModelCallRecord extends ModelCallReservation {
18
+ readonly status: 'reserved' | 'in-flight' | 'succeeded' | 'failed' | 'ambiguous';
19
+ readonly response?: NormalizedModelResponse;
20
+ readonly responseHash?: string;
21
+ readonly protectedResponse?: string;
22
+ /**
23
+ * Content-free provider, model and usage evidence, retained under every
24
+ * retention mode so cost is measurable without decrypting anything.
25
+ */
26
+ readonly callMetadata?: ModelCallMetadata;
27
+ readonly error?: AcmeErrorData;
28
+ readonly completedAt?: IsoTimestamp;
29
+ }
30
+ export interface CompletedModelCall {
31
+ readonly modelCallId: ModelCallId;
32
+ readonly response: NormalizedModelResponse;
33
+ readonly responseHash: string;
34
+ readonly protectedResponse?: string;
35
+ readonly completedAt: IsoTimestamp;
36
+ }
37
+ export interface FailedModelCall {
38
+ readonly modelCallId: ModelCallId;
39
+ readonly error: AcmeErrorData;
40
+ readonly ambiguous: boolean;
41
+ readonly completedAt: IsoTimestamp;
42
+ }
43
+ //# sourceMappingURL=repository-model-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-model-call.d.ts","sourceRoot":"","sources":["../src/repository-model-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;CAClC;AAED,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC3D,QAAQ,CAAC,MAAM,EACb,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repository-model-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-model-call.js","sourceRoot":"","sources":["../src/repository-model-call.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import type { IsoTimestamp } from './common.js';
2
+ import type { AcmeErrorData } from './errors.js';
3
+ import type { ModelCapabilities, ModelRequest, ModelSelection } from './model.js';
4
+ import type { ModelExecutionDiagnostic, ModelExecutionPolicy, ModelExecutionRecord, ModelExecutionResult, ModelExecutionStatus } from './model-execution-types.js';
5
+ import type { CompletedModelCall, FailedModelCall, ModelCallRecord, ModelCallReservation } from './repository-model-call.js';
6
+ export interface AcceptedModelExecution {
7
+ readonly modelExecutionId: string;
8
+ readonly requestKey: string;
9
+ readonly requestFingerprint: string;
10
+ readonly requestHash: string;
11
+ readonly selection: ModelSelection;
12
+ readonly request: ModelRequest;
13
+ readonly requiredCapabilities: Partial<ModelCapabilities>;
14
+ readonly effectivePolicy: ModelExecutionPolicy;
15
+ readonly createdAt: IsoTimestamp;
16
+ }
17
+ export type ModelExecutionAcceptResult = {
18
+ readonly kind: 'created';
19
+ readonly execution: ModelExecutionRecord;
20
+ } | {
21
+ readonly kind: 'existing';
22
+ readonly execution: ModelExecutionRecord;
23
+ } | {
24
+ readonly kind: 'conflict';
25
+ readonly existingExecutionId: string;
26
+ };
27
+ export interface ModelExecutionResumeState {
28
+ readonly modelExecutionId: string;
29
+ readonly execution: ModelExecutionRecord;
30
+ readonly modelCalls: readonly ModelCallRecord[];
31
+ }
32
+ export interface ModelExecutionTerminal {
33
+ readonly modelExecutionId: string;
34
+ readonly status: Extract<ModelExecutionStatus, 'succeeded' | 'failed' | 'cancelled' | 'conflicted' | 'ambiguous'>;
35
+ readonly result: ModelExecutionResult;
36
+ readonly error?: AcmeErrorData;
37
+ readonly diagnostic: ModelExecutionDiagnostic;
38
+ readonly terminalAt: IsoTimestamp;
39
+ }
40
+ export interface ModelExecutionRepository {
41
+ accept(input: AcceptedModelExecution): Promise<ModelExecutionAcceptResult>;
42
+ get(modelExecutionId: string): Promise<ModelExecutionRecord | null>;
43
+ reserveModelCall(call: ModelCallReservation): Promise<ModelCallRecord>;
44
+ completeModelCall(call: CompletedModelCall): Promise<void>;
45
+ failModelCall(call: FailedModelCall): Promise<void>;
46
+ loadResumeState(modelExecutionId: string): Promise<ModelExecutionResumeState | null>;
47
+ markTerminal(terminal: ModelExecutionTerminal): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=repository-model-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-model-execution.d.ts","sourceRoot":"","sources":["../src/repository-model-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1D,QAAQ,CAAC,eAAe,EAAE,oBAAoB,CAAC;IAC/C,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;CAClC;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,OAAO,CACtB,oBAAoB,EACpB,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAClE,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3E,GAAG,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACpE,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvE,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,CACb,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IAC7C,YAAY,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=repository-model-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository-model-execution.js","sourceRoot":"","sources":["../src/repository-model-execution.ts"],"names":[],"mappings":""}