@tangle-network/agent-runtime 0.105.0 → 0.106.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.
- package/README.md +2 -2
- package/dist/activation-CRjVfOiy.js +203 -0
- package/dist/activation-CRjVfOiy.js.map +1 -0
- package/dist/activation-DyWB0K6E.d.ts +98 -0
- package/dist/agent.d.ts +216 -234
- package/dist/agent.js +615 -547
- package/dist/agent.js.map +1 -1
- package/dist/analyst-loop-DGdtVENg.js +517 -0
- package/dist/analyst-loop-DGdtVENg.js.map +1 -0
- package/dist/analyst-loop.d.ts +10 -43
- package/dist/analyst-loop.js +2 -11
- package/dist/backends-Dy8NujB4.js +713 -0
- package/dist/backends-Dy8NujB4.js.map +1 -0
- package/dist/candidate-execution/index.d.ts +4 -192
- package/dist/candidate-execution/index.js +5 -66
- package/dist/candidate-execution-DqMbv1rU.js +488 -0
- package/dist/candidate-execution-DqMbv1rU.js.map +1 -0
- package/dist/coder-yhVWbdWc.js +40 -0
- package/dist/coder-yhVWbdWc.js.map +1 -0
- package/dist/conversation-XucG_K3l.js +1265 -0
- package/dist/conversation-XucG_K3l.js.map +1 -0
- package/dist/conversation.d.ts +2 -804
- package/dist/conversation.js +2 -55
- package/dist/environment-provider-CfLUmKmf.js +1168 -0
- package/dist/environment-provider-CfLUmKmf.js.map +1 -0
- package/dist/environment-provider-IUGU3epE.d.ts +964 -0
- package/dist/environment-provider.d.ts +2 -78
- package/dist/environment-provider.js +2 -18
- package/dist/errors-DEAvWQPy.js +111 -0
- package/dist/errors-DEAvWQPy.js.map +1 -0
- package/dist/improvement-adapter-Cr5TBSji.d.ts +166 -0
- package/dist/improvement-cycle-C095kS_g.js +2624 -0
- package/dist/improvement-cycle-C095kS_g.js.map +1 -0
- package/dist/index-BGdxAwfO.d.ts +838 -0
- package/dist/index-C-FYUuFG.d.ts +193 -0
- package/dist/index-CbNM40xG.d.ts +140 -0
- package/dist/index-DruSKs3Z.d.ts +7224 -0
- package/dist/index-Efjb3nrQ.d.ts +671 -0
- package/dist/index.d.ts +14 -1058
- package/dist/index.js +2106 -2082
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +768 -889
- package/dist/intelligence.js +1466 -1367
- package/dist/intelligence.js.map +1 -1
- package/dist/{kb-gate-CwHO0vz6.d.ts → kb-gate-C8z2juK8.d.ts} +33 -31
- package/dist/kb-gate-DpaSwXVx.js +80 -0
- package/dist/kb-gate-DpaSwXVx.js.map +1 -0
- package/dist/knowledge-Ku-mPP4f.js +433 -0
- package/dist/knowledge-Ku-mPP4f.js.map +1 -0
- package/dist/knowledge.d.ts +2 -150
- package/dist/knowledge.js +2 -40
- package/dist/local-harness-Dh8PJ0ot.d.ts +455 -0
- package/dist/loop-runner-bin-BXsFEUcf.d.ts +162 -0
- package/dist/loop-runner-bin-BwjQ1NfH.js +268 -0
- package/dist/loop-runner-bin-BwjQ1NfH.js.map +1 -0
- package/dist/loop-runner-bin.d.ts +2 -15
- package/dist/loop-runner-bin.js +2 -24
- package/dist/loops.d.ts +5 -4164
- package/dist/loops.js +8 -419
- package/dist/mcp/bin.d.ts +1 -1
- package/dist/mcp/bin.js +116 -146
- package/dist/mcp/bin.js.map +1 -1
- package/dist/mcp/index.d.ts +295 -436
- package/dist/mcp/index.js +1242 -1177
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/memory-bin.d.ts +1 -1
- package/dist/mcp/memory-bin.js +37 -16
- package/dist/mcp/memory-bin.js.map +1 -1
- package/dist/memory-server-DL6cE2Ag.js +234 -0
- package/dist/memory-server-DL6cE2Ag.js.map +1 -0
- package/dist/model-resolution-Btd9iIKV.js +98 -0
- package/dist/model-resolution-Btd9iIKV.js.map +1 -0
- package/dist/openai-tools-B68JaOCx.d.ts +24 -0
- package/dist/openai-tools-CKLy1C7M.js +44 -0
- package/dist/openai-tools-CKLy1C7M.js.map +1 -0
- package/dist/otel-export-D34IQW1C.js +843 -0
- package/dist/otel-export-D34IQW1C.js.map +1 -0
- package/dist/platform.d.ts +188 -185
- package/dist/platform.js +185 -218
- package/dist/platform.js.map +1 -1
- package/dist/prepare-B53sPV7M.js +4292 -0
- package/dist/prepare-B53sPV7M.js.map +1 -0
- package/dist/primeintellect/index.d.ts +149 -145
- package/dist/primeintellect/index.js +626 -1003
- package/dist/primeintellect/index.js.map +1 -1
- package/dist/profiles.d.ts +296 -490
- package/dist/profiles.js +722 -749
- package/dist/profiles.js.map +1 -1
- package/dist/protected-model-port-BLPH5VVv.js +722 -0
- package/dist/protected-model-port-BLPH5VVv.js.map +1 -0
- package/dist/protected-model-port-BP6Z4eau.d.ts +283 -0
- package/dist/protected-redaction--F3v1oo8.js +200 -0
- package/dist/protected-redaction--F3v1oo8.js.map +1 -0
- package/dist/redact-D-u-rrcn.js +82 -0
- package/dist/redact-D-u-rrcn.js.map +1 -0
- package/dist/redact-kbIOjfjM.d.ts +452 -0
- package/dist/researcher-CoVqNhfI.js +433 -0
- package/dist/researcher-CoVqNhfI.js.map +1 -0
- package/dist/runtime-BG0BziaP.js +5408 -0
- package/dist/runtime-BG0BziaP.js.map +1 -0
- package/dist/sandbox-events-DeI5xX8P.js +316 -0
- package/dist/sandbox-events-DeI5xX8P.js.map +1 -0
- package/dist/spawn-journal-CwPvKUTa.js +456 -0
- package/dist/spawn-journal-CwPvKUTa.js.map +1 -0
- package/dist/structural-rollout-IXUEplky.js +1445 -0
- package/dist/structural-rollout-IXUEplky.js.map +1 -0
- package/dist/substrate-B0TYNrXn.js +27 -0
- package/dist/substrate-B0TYNrXn.js.map +1 -0
- package/dist/{substrate-Dyiqmd3o.d.ts → substrate-BcnuSHXm.d.ts} +57 -54
- package/dist/supervise-BiRutHS9.js +7321 -0
- package/dist/supervise-BiRutHS9.js.map +1 -0
- package/dist/supervisor-DTKhF-RV.js +3826 -0
- package/dist/supervisor-DTKhF-RV.js.map +1 -0
- package/dist/testing.d.ts +4 -3
- package/dist/testing.js +2478 -2637
- package/dist/testing.js.map +1 -1
- package/dist/tool-server-RcWgLIsL.js +141 -0
- package/dist/tool-server-RcWgLIsL.js.map +1 -0
- package/dist/trace-propagation-CJJC7SVB.js +57 -0
- package/dist/trace-propagation-CJJC7SVB.js.map +1 -0
- package/dist/types-BaIpb0XT.d.ts +492 -0
- package/dist/types-BevOjfTY.d.ts +765 -0
- package/dist/types-C9j4qg6l.d.ts +500 -0
- package/dist/types-Cja5OTGh.d.ts +190 -0
- package/dist/util-MVgdwuIS.js +145 -0
- package/dist/util-MVgdwuIS.js.map +1 -0
- package/dist/workspace-archive-BosQiotA.js +575 -0
- package/dist/workspace-archive-BosQiotA.js.map +1 -0
- package/package.json +43 -56
- package/skills/build-with-agent-runtime/SKILL.md +1 -0
- package/dist/activation-Cm-9MMX1.d.ts +0 -69
- package/dist/analyst-loop.js.map +0 -1
- package/dist/backends-BO4Jqoe2.d.ts +0 -134
- package/dist/candidate-execution/index.js.map +0 -1
- package/dist/chunk-2KGAN2HM.js +0 -1256
- package/dist/chunk-2KGAN2HM.js.map +0 -1
- package/dist/chunk-2VZYRB55.js +0 -834
- package/dist/chunk-2VZYRB55.js.map +0 -1
- package/dist/chunk-3MDZX7YU.js +0 -125
- package/dist/chunk-3MDZX7YU.js.map +0 -1
- package/dist/chunk-5IBQAPVB.js +0 -29
- package/dist/chunk-5IBQAPVB.js.map +0 -1
- package/dist/chunk-5QOB7H74.js +0 -387
- package/dist/chunk-5QOB7H74.js.map +0 -1
- package/dist/chunk-C5RTIBNZ.js +0 -48
- package/dist/chunk-C5RTIBNZ.js.map +0 -1
- package/dist/chunk-CTRA64LY.js +0 -680
- package/dist/chunk-CTRA64LY.js.map +0 -1
- package/dist/chunk-DPEUKJRO.js +0 -27
- package/dist/chunk-DPEUKJRO.js.map +0 -1
- package/dist/chunk-FD2MBMOH.js +0 -494
- package/dist/chunk-FD2MBMOH.js.map +0 -1
- package/dist/chunk-H5QPIZNX.js +0 -907
- package/dist/chunk-H5QPIZNX.js.map +0 -1
- package/dist/chunk-HLKC4UYB.js +0 -3514
- package/dist/chunk-HLKC4UYB.js.map +0 -1
- package/dist/chunk-HNP72PNU.js +0 -192
- package/dist/chunk-HNP72PNU.js.map +0 -1
- package/dist/chunk-ISPWRSEC.js +0 -408
- package/dist/chunk-ISPWRSEC.js.map +0 -1
- package/dist/chunk-KRBFHMV6.js +0 -1228
- package/dist/chunk-KRBFHMV6.js.map +0 -1
- package/dist/chunk-M22PL4GH.js +0 -171
- package/dist/chunk-M22PL4GH.js.map +0 -1
- package/dist/chunk-NURIQBJQ.js +0 -72
- package/dist/chunk-NURIQBJQ.js.map +0 -1
- package/dist/chunk-OPVWXJ2H.js +0 -75
- package/dist/chunk-OPVWXJ2H.js.map +0 -1
- package/dist/chunk-PZZKQVQV.js +0 -52
- package/dist/chunk-PZZKQVQV.js.map +0 -1
- package/dist/chunk-Q2JSAVQ3.js +0 -671
- package/dist/chunk-Q2JSAVQ3.js.map +0 -1
- package/dist/chunk-RDOAVVHY.js +0 -699
- package/dist/chunk-RDOAVVHY.js.map +0 -1
- package/dist/chunk-SGKPNBXE.js +0 -60
- package/dist/chunk-SGKPNBXE.js.map +0 -1
- package/dist/chunk-SMQXZGLZ.js +0 -351
- package/dist/chunk-SMQXZGLZ.js.map +0 -1
- package/dist/chunk-UHEZW5BU.js +0 -2918
- package/dist/chunk-UHEZW5BU.js.map +0 -1
- package/dist/chunk-UPWGXKXB.js +0 -254
- package/dist/chunk-UPWGXKXB.js.map +0 -1
- package/dist/chunk-VISA6CI3.js +0 -200
- package/dist/chunk-VISA6CI3.js.map +0 -1
- package/dist/chunk-WMTCUOQL.js +0 -474
- package/dist/chunk-WMTCUOQL.js.map +0 -1
- package/dist/chunk-WRTOVNN4.js +0 -4728
- package/dist/chunk-WRTOVNN4.js.map +0 -1
- package/dist/chunk-WSTRQZYQ.js +0 -5576
- package/dist/chunk-WSTRQZYQ.js.map +0 -1
- package/dist/chunk-XBG2W2VW.js +0 -6434
- package/dist/chunk-XBG2W2VW.js.map +0 -1
- package/dist/chunk-YEJR7IXO.js +0 -68
- package/dist/chunk-YEJR7IXO.js.map +0 -1
- package/dist/chunk-YJZA2BIK.js +0 -1338
- package/dist/chunk-YJZA2BIK.js.map +0 -1
- package/dist/completion-gate-BMy5LGoP.d.ts +0 -256
- package/dist/conversation.js.map +0 -1
- package/dist/coordination-BZZSVYpZ.d.ts +0 -2570
- package/dist/environment-provider.js.map +0 -1
- package/dist/improvement-adapter-HAZz-7vK.d.ts +0 -203
- package/dist/knowledge.js.map +0 -1
- package/dist/local-harness-BDNcl6jI.d.ts +0 -175
- package/dist/loop-runner-bin-68aoM9-7.d.ts +0 -199
- package/dist/loop-runner-bin.js.map +0 -1
- package/dist/loops.js.map +0 -1
- package/dist/openai-tools-fnj6SRVg.d.ts +0 -46
- package/dist/protected-model-port-B4t-OQjL.d.ts +0 -271
- package/dist/redact-BuFjxBUJ.d.ts +0 -481
- package/dist/sanitize-DEbPNtyI.d.ts +0 -328
- package/dist/structural-rollout-DEh6CEsa.d.ts +0 -446
- package/dist/supervise-4_48wwvy.d.ts +0 -379
- package/dist/types-BCoemcXU.d.ts +0 -802
- package/dist/types-BwoZWq-i.d.ts +0 -510
- package/dist/types-Cbp72qyu.d.ts +0 -491
- package/dist/types-CmYCMbFT.d.ts +0 -203
- package/dist/types-CvNwMzQt.d.ts +0 -957
- package/dist/worktree-fanout-DxhAWr5Z.d.ts +0 -999
package/dist/chunk-UPWGXKXB.js
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
// src/candidate-execution/protected-redaction.ts
|
|
2
|
-
import { createHmac, randomBytes } from "crypto";
|
|
3
|
-
import {
|
|
4
|
-
DEFAULT_REDACTION_RULES,
|
|
5
|
-
REDACTION_VERSION,
|
|
6
|
-
redactString
|
|
7
|
-
} from "@tangle-network/agent-eval";
|
|
8
|
-
function createProtectedRecordRedactor(protectedValues) {
|
|
9
|
-
const identityKey = randomBytes(32);
|
|
10
|
-
const aggregate = {
|
|
11
|
-
version: REDACTION_VERSION,
|
|
12
|
-
redactionCount: 0,
|
|
13
|
-
byRule: {}
|
|
14
|
-
};
|
|
15
|
-
const mergeReport = (report) => {
|
|
16
|
-
aggregate.version = report.version;
|
|
17
|
-
aggregate.redactionCount += report.redactionCount;
|
|
18
|
-
for (const [rule, count] of Object.entries(report.byRule)) {
|
|
19
|
-
aggregate.byRule[rule] = (aggregate.byRule[rule] ?? 0) + count;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const redactScalar = (value, record) => {
|
|
23
|
-
const redacted = redactProtectedValue(value, protectedValues);
|
|
24
|
-
if (record) mergeReport(redacted.report);
|
|
25
|
-
return redacted.value;
|
|
26
|
-
};
|
|
27
|
-
const identifier = (value, record) => {
|
|
28
|
-
const redacted = redactScalar(value, record);
|
|
29
|
-
if (redacted === value) return value;
|
|
30
|
-
const digest = createHmac("sha256", identityKey).update(value).digest("hex");
|
|
31
|
-
return `${redacted}:hmac-sha256:${digest}`;
|
|
32
|
-
};
|
|
33
|
-
const transform = (value, record) => {
|
|
34
|
-
const transformed = transformProtectedRecord(
|
|
35
|
-
value,
|
|
36
|
-
void 0,
|
|
37
|
-
record,
|
|
38
|
-
redactScalar,
|
|
39
|
-
identifier
|
|
40
|
-
);
|
|
41
|
-
assertNoProtectedEvidence(transformed, protectedValues);
|
|
42
|
-
return transformed;
|
|
43
|
-
};
|
|
44
|
-
return Object.freeze({
|
|
45
|
-
record: (value) => transform(value, true),
|
|
46
|
-
query: (value) => transform(value, false),
|
|
47
|
-
identifier: (value) => identifier(value, false),
|
|
48
|
-
traceIdentity: (trace) => transform(trace, false),
|
|
49
|
-
report: () => ({
|
|
50
|
-
version: aggregate.version,
|
|
51
|
-
redactionCount: aggregate.redactionCount,
|
|
52
|
-
byRule: { ...aggregate.byRule }
|
|
53
|
-
})
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
function redactProtectedValue(value, protectedValues) {
|
|
57
|
-
const report = {
|
|
58
|
-
version: REDACTION_VERSION,
|
|
59
|
-
redactionCount: 0,
|
|
60
|
-
byRule: {}
|
|
61
|
-
};
|
|
62
|
-
const rules = protectedRedactionRules(protectedValues);
|
|
63
|
-
const redacted = redactNode(value, protectedValues, rules, report);
|
|
64
|
-
assertNoProtectedEvidence(redacted, protectedValues);
|
|
65
|
-
return { value: redacted, report };
|
|
66
|
-
}
|
|
67
|
-
function redactProtectedReason(reason, protectedValues) {
|
|
68
|
-
try {
|
|
69
|
-
return redactProtectedValue(reason, protectedValues).value;
|
|
70
|
-
} catch {
|
|
71
|
-
return "candidate execution failed with a protected error";
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
function assertNoProtectedEvidence(value, protectedValues) {
|
|
75
|
-
if (value instanceof Uint8Array) {
|
|
76
|
-
assertNoProtectedBytes(value, protectedValues);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
if (typeof value === "string") {
|
|
80
|
-
for (const protectedValue of protectedValueVariants(protectedValues)) {
|
|
81
|
-
if (value.includes(protectedValue)) {
|
|
82
|
-
throw new Error("protected value survived candidate evidence redaction");
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (decodedBase64ContainsProtectedValue(value, protectedValues)) {
|
|
86
|
-
throw new Error("base64 protected value survived candidate evidence redaction");
|
|
87
|
-
}
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
if (Array.isArray(value)) {
|
|
91
|
-
for (const entry of value) assertNoProtectedEvidence(entry, protectedValues);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
if (value && typeof value === "object") {
|
|
95
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
96
|
-
assertNoProtectedEvidence(key, protectedValues);
|
|
97
|
-
assertNoProtectedEvidence(entry, protectedValues);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
function assertNoProtectedBytes(bytes, protectedValues) {
|
|
102
|
-
if (containsProtectedBytes(bytes, protectedValues)) {
|
|
103
|
-
throw new Error("protected value survived candidate evidence byte redaction");
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function redactNode(value, protectedValues, rules, report) {
|
|
107
|
-
if (value instanceof Uint8Array) {
|
|
108
|
-
if (containsProtectedBytes(value, protectedValues)) {
|
|
109
|
-
recordRedaction(report, "candidate-access-binary", 1);
|
|
110
|
-
return Uint8Array.from(Buffer.from("[redacted:candidate-access-binary]", "utf8"));
|
|
111
|
-
}
|
|
112
|
-
return Uint8Array.from(value);
|
|
113
|
-
}
|
|
114
|
-
if (typeof value === "string") {
|
|
115
|
-
if (decodedBase64ContainsProtectedValue(value, protectedValues)) {
|
|
116
|
-
recordRedaction(report, "candidate-access-binary", 1);
|
|
117
|
-
return "[redacted:candidate-access-binary]";
|
|
118
|
-
}
|
|
119
|
-
const redacted = redactString(value, [...rules]);
|
|
120
|
-
for (const [rule, count] of Object.entries(redacted.report.byRule)) {
|
|
121
|
-
recordRedaction(report, rule, count);
|
|
122
|
-
}
|
|
123
|
-
return redacted.output;
|
|
124
|
-
}
|
|
125
|
-
if (Array.isArray(value)) {
|
|
126
|
-
return value.map((entry) => redactNode(entry, protectedValues, rules, report));
|
|
127
|
-
}
|
|
128
|
-
if (value && typeof value === "object") {
|
|
129
|
-
const entries = [];
|
|
130
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
131
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
132
|
-
const redactedKey = redactNode(key, protectedValues, rules, report);
|
|
133
|
-
if (typeof redactedKey !== "string" || seenKeys.has(redactedKey)) {
|
|
134
|
-
throw new Error("protected evidence redaction produced an ambiguous object key");
|
|
135
|
-
}
|
|
136
|
-
seenKeys.add(redactedKey);
|
|
137
|
-
entries.push([redactedKey, redactNode(entry, protectedValues, rules, report)]);
|
|
138
|
-
}
|
|
139
|
-
return Object.fromEntries(entries);
|
|
140
|
-
}
|
|
141
|
-
return value;
|
|
142
|
-
}
|
|
143
|
-
function transformProtectedRecord(value, fieldName, record, redactScalar, redactIdentifier) {
|
|
144
|
-
if (value instanceof Uint8Array) return redactScalar(value, record);
|
|
145
|
-
if (typeof value === "string") {
|
|
146
|
-
return fieldName && isIdentifierFieldName(fieldName) ? redactIdentifier(value, record) : redactScalar(value, record);
|
|
147
|
-
}
|
|
148
|
-
if (Array.isArray(value)) {
|
|
149
|
-
return value.map(
|
|
150
|
-
(entry) => transformProtectedRecord(entry, fieldName, record, redactScalar, redactIdentifier)
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
if (!value || typeof value !== "object") return value;
|
|
154
|
-
if (fieldName === "tags") {
|
|
155
|
-
return transformTagMap(value, record, redactScalar, redactIdentifier);
|
|
156
|
-
}
|
|
157
|
-
if (fieldName === "tag") {
|
|
158
|
-
return transformTagFilter(value, record, redactScalar, redactIdentifier);
|
|
159
|
-
}
|
|
160
|
-
const entries = [];
|
|
161
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
162
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
163
|
-
const redactedKey = redactScalar(key, record);
|
|
164
|
-
if (seenKeys.has(redactedKey)) {
|
|
165
|
-
throw new Error("protected evidence redaction produced an ambiguous object key");
|
|
166
|
-
}
|
|
167
|
-
seenKeys.add(redactedKey);
|
|
168
|
-
entries.push([
|
|
169
|
-
redactedKey,
|
|
170
|
-
transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier)
|
|
171
|
-
]);
|
|
172
|
-
}
|
|
173
|
-
return Object.fromEntries(entries);
|
|
174
|
-
}
|
|
175
|
-
function transformTagMap(value, record, redactScalar, redactIdentifier) {
|
|
176
|
-
const entries = [];
|
|
177
|
-
const seenKeys = /* @__PURE__ */ new Set();
|
|
178
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
179
|
-
const redactedKey = redactIdentifier(key, record);
|
|
180
|
-
if (seenKeys.has(redactedKey)) {
|
|
181
|
-
throw new Error("protected evidence redaction produced an ambiguous trace tag");
|
|
182
|
-
}
|
|
183
|
-
seenKeys.add(redactedKey);
|
|
184
|
-
entries.push([
|
|
185
|
-
redactedKey,
|
|
186
|
-
typeof entry === "string" ? redactIdentifier(entry, record) : transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier)
|
|
187
|
-
]);
|
|
188
|
-
}
|
|
189
|
-
return Object.fromEntries(entries);
|
|
190
|
-
}
|
|
191
|
-
function transformTagFilter(value, record, redactScalar, redactIdentifier) {
|
|
192
|
-
const output = {};
|
|
193
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
194
|
-
const redactedKey = redactScalar(key, record);
|
|
195
|
-
output[redactedKey] = (key === "key" || key === "value") && typeof entry === "string" ? redactIdentifier(entry, record) : transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier);
|
|
196
|
-
}
|
|
197
|
-
return output;
|
|
198
|
-
}
|
|
199
|
-
function isIdentifierFieldName(name) {
|
|
200
|
-
return /ids?$/i.test(name);
|
|
201
|
-
}
|
|
202
|
-
function protectedRedactionRules(protectedValues) {
|
|
203
|
-
const exactRules = protectedValueVariants(protectedValues).sort((left, right) => right.length - left.length || left.localeCompare(right)).map((value, index) => ({
|
|
204
|
-
id: `candidate-access-${index}`,
|
|
205
|
-
pattern: new RegExp(escapeRegularExpression(value), "g"),
|
|
206
|
-
replacement: "[redacted:candidate-access]"
|
|
207
|
-
}));
|
|
208
|
-
return [...exactRules, ...DEFAULT_REDACTION_RULES];
|
|
209
|
-
}
|
|
210
|
-
function recordRedaction(report, rule, count) {
|
|
211
|
-
if (count <= 0) return;
|
|
212
|
-
report.redactionCount += count;
|
|
213
|
-
report.byRule[rule] = (report.byRule[rule] ?? 0) + count;
|
|
214
|
-
}
|
|
215
|
-
function containsProtectedBytes(bytes, protectedValues) {
|
|
216
|
-
const source = Buffer.from(bytes);
|
|
217
|
-
return protectedValueVariants(protectedValues).some(
|
|
218
|
-
(value) => source.includes(Buffer.from(value, "utf8"))
|
|
219
|
-
);
|
|
220
|
-
}
|
|
221
|
-
function decodedBase64ContainsProtectedValue(value, protectedValues) {
|
|
222
|
-
if (value.length < 4 || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {
|
|
223
|
-
return false;
|
|
224
|
-
}
|
|
225
|
-
try {
|
|
226
|
-
return containsProtectedBytes(Buffer.from(value, "base64"), protectedValues);
|
|
227
|
-
} catch {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
function protectedValueVariants(protectedValues) {
|
|
232
|
-
const variants = /* @__PURE__ */ new Set();
|
|
233
|
-
for (const value of normalizedProtectedValues(protectedValues)) {
|
|
234
|
-
variants.add(value);
|
|
235
|
-
variants.add(Buffer.from(value, "utf8").toString("base64"));
|
|
236
|
-
variants.add(Buffer.from(value, "utf8").toString("base64url"));
|
|
237
|
-
variants.add(encodeURIComponent(value));
|
|
238
|
-
}
|
|
239
|
-
return [...variants];
|
|
240
|
-
}
|
|
241
|
-
function normalizedProtectedValues(values) {
|
|
242
|
-
return [...new Set(values.filter((value) => value.length > 0))];
|
|
243
|
-
}
|
|
244
|
-
function escapeRegularExpression(value) {
|
|
245
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
export {
|
|
249
|
-
createProtectedRecordRedactor,
|
|
250
|
-
redactProtectedValue,
|
|
251
|
-
redactProtectedReason,
|
|
252
|
-
assertNoProtectedBytes
|
|
253
|
-
};
|
|
254
|
-
//# sourceMappingURL=chunk-UPWGXKXB.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/candidate-execution/protected-redaction.ts"],"sourcesContent":["import { createHmac, randomBytes } from 'node:crypto'\n\nimport {\n DEFAULT_REDACTION_RULES,\n REDACTION_VERSION,\n type RedactionRule,\n redactString,\n} from '@tangle-network/agent-eval'\n\nexport interface ProtectedRedactionReport {\n version: string\n redactionCount: number\n byRule: Record<string, number>\n}\n\nexport interface ProtectedTraceIdentity {\n readonly runId: string\n readonly tags: Readonly<Record<string, string>>\n}\n\nexport interface ProtectedRecordRedactor {\n record<T>(value: T): T\n query<T>(value: T): T\n identifier(value: string): string\n traceIdentity(trace: ProtectedTraceIdentity): ProtectedTraceIdentity\n report(): ProtectedRedactionReport\n}\n\n/** Create one execution-local namespace for identifiers changed by redaction. */\nexport function createProtectedRecordRedactor(\n protectedValues: readonly string[],\n): ProtectedRecordRedactor {\n const identityKey = randomBytes(32)\n const aggregate: ProtectedRedactionReport = {\n version: REDACTION_VERSION,\n redactionCount: 0,\n byRule: {},\n }\n\n const mergeReport = (report: ProtectedRedactionReport): void => {\n aggregate.version = report.version\n aggregate.redactionCount += report.redactionCount\n for (const [rule, count] of Object.entries(report.byRule)) {\n aggregate.byRule[rule] = (aggregate.byRule[rule] ?? 0) + count\n }\n }\n\n const redactScalar = <T>(value: T, record: boolean): T => {\n const redacted = redactProtectedValue(value, protectedValues)\n if (record) mergeReport(redacted.report)\n return redacted.value\n }\n\n const identifier = (value: string, record: boolean): string => {\n const redacted = redactScalar(value, record)\n if (redacted === value) return value\n const digest = createHmac('sha256', identityKey).update(value).digest('hex')\n return `${redacted}:hmac-sha256:${digest}`\n }\n\n const transform = <T>(value: T, record: boolean): T => {\n const transformed = transformProtectedRecord(\n value,\n undefined,\n record,\n redactScalar,\n identifier,\n ) as T\n assertNoProtectedEvidence(transformed, protectedValues)\n return transformed\n }\n\n return Object.freeze({\n record: <T>(value: T): T => transform(value, true),\n query: <T>(value: T): T => transform(value, false),\n identifier: (value: string): string => identifier(value, false),\n traceIdentity: (trace: ProtectedTraceIdentity): ProtectedTraceIdentity =>\n transform(trace, false),\n report: (): ProtectedRedactionReport => ({\n version: aggregate.version,\n redactionCount: aggregate.redactionCount,\n byRule: { ...aggregate.byRule },\n }),\n })\n}\n\n/** Redact protected values at the first persistence boundary, including object keys and bytes. */\nexport function redactProtectedValue<T>(\n value: T,\n protectedValues: readonly string[],\n): { value: T; report: ProtectedRedactionReport } {\n const report: ProtectedRedactionReport = {\n version: REDACTION_VERSION,\n redactionCount: 0,\n byRule: {},\n }\n const rules = protectedRedactionRules(protectedValues)\n const redacted = redactNode(value, protectedValues, rules, report) as T\n assertNoProtectedEvidence(redacted, protectedValues)\n return { value: redacted, report }\n}\n\nexport function redactProtectedReason(reason: string, protectedValues: readonly string[]): string {\n try {\n return redactProtectedValue(reason, protectedValues).value\n } catch {\n return 'candidate execution failed with a protected error'\n }\n}\n\nexport function assertNoProtectedEvidence(\n value: unknown,\n protectedValues: readonly string[],\n): void {\n if (value instanceof Uint8Array) {\n assertNoProtectedBytes(value, protectedValues)\n return\n }\n if (typeof value === 'string') {\n for (const protectedValue of protectedValueVariants(protectedValues)) {\n if (value.includes(protectedValue)) {\n throw new Error('protected value survived candidate evidence redaction')\n }\n }\n if (decodedBase64ContainsProtectedValue(value, protectedValues)) {\n throw new Error('base64 protected value survived candidate evidence redaction')\n }\n return\n }\n if (Array.isArray(value)) {\n for (const entry of value) assertNoProtectedEvidence(entry, protectedValues)\n return\n }\n if (value && typeof value === 'object') {\n for (const [key, entry] of Object.entries(value)) {\n assertNoProtectedEvidence(key, protectedValues)\n assertNoProtectedEvidence(entry, protectedValues)\n }\n }\n}\n\nexport function assertNoProtectedBytes(\n bytes: Uint8Array,\n protectedValues: readonly string[],\n): void {\n if (containsProtectedBytes(bytes, protectedValues)) {\n throw new Error('protected value survived candidate evidence byte redaction')\n }\n}\n\nfunction redactNode(\n value: unknown,\n protectedValues: readonly string[],\n rules: readonly RedactionRule[],\n report: ProtectedRedactionReport,\n): unknown {\n if (value instanceof Uint8Array) {\n if (containsProtectedBytes(value, protectedValues)) {\n recordRedaction(report, 'candidate-access-binary', 1)\n return Uint8Array.from(Buffer.from('[redacted:candidate-access-binary]', 'utf8'))\n }\n return Uint8Array.from(value)\n }\n if (typeof value === 'string') {\n if (decodedBase64ContainsProtectedValue(value, protectedValues)) {\n recordRedaction(report, 'candidate-access-binary', 1)\n return '[redacted:candidate-access-binary]'\n }\n const redacted = redactString(value, [...rules])\n for (const [rule, count] of Object.entries(redacted.report.byRule)) {\n recordRedaction(report, rule, count)\n }\n return redacted.output\n }\n if (Array.isArray(value)) {\n return value.map((entry) => redactNode(entry, protectedValues, rules, report))\n }\n if (value && typeof value === 'object') {\n const entries: Array<[string, unknown]> = []\n const seenKeys = new Set<string>()\n for (const [key, entry] of Object.entries(value)) {\n const redactedKey = redactNode(key, protectedValues, rules, report)\n if (typeof redactedKey !== 'string' || seenKeys.has(redactedKey)) {\n throw new Error('protected evidence redaction produced an ambiguous object key')\n }\n seenKeys.add(redactedKey)\n entries.push([redactedKey, redactNode(entry, protectedValues, rules, report)])\n }\n return Object.fromEntries(entries)\n }\n return value\n}\n\nfunction transformProtectedRecord(\n value: unknown,\n fieldName: string | undefined,\n record: boolean,\n redactScalar: <T>(value: T, record: boolean) => T,\n redactIdentifier: (value: string, record: boolean) => string,\n): unknown {\n if (value instanceof Uint8Array) return redactScalar(value, record)\n if (typeof value === 'string') {\n return fieldName && isIdentifierFieldName(fieldName)\n ? redactIdentifier(value, record)\n : redactScalar(value, record)\n }\n if (Array.isArray(value)) {\n return value.map((entry) =>\n transformProtectedRecord(entry, fieldName, record, redactScalar, redactIdentifier),\n )\n }\n if (!value || typeof value !== 'object') return value\n\n if (fieldName === 'tags') {\n return transformTagMap(value, record, redactScalar, redactIdentifier)\n }\n if (fieldName === 'tag') {\n return transformTagFilter(value, record, redactScalar, redactIdentifier)\n }\n\n const entries: Array<[string, unknown]> = []\n const seenKeys = new Set<string>()\n for (const [key, entry] of Object.entries(value)) {\n const redactedKey = redactScalar(key, record)\n if (seenKeys.has(redactedKey)) {\n throw new Error('protected evidence redaction produced an ambiguous object key')\n }\n seenKeys.add(redactedKey)\n entries.push([\n redactedKey,\n transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier),\n ])\n }\n return Object.fromEntries(entries)\n}\n\nfunction transformTagMap(\n value: object,\n record: boolean,\n redactScalar: <T>(value: T, record: boolean) => T,\n redactIdentifier: (value: string, record: boolean) => string,\n): Record<string, unknown> {\n const entries: Array<[string, unknown]> = []\n const seenKeys = new Set<string>()\n for (const [key, entry] of Object.entries(value)) {\n const redactedKey = redactIdentifier(key, record)\n if (seenKeys.has(redactedKey)) {\n throw new Error('protected evidence redaction produced an ambiguous trace tag')\n }\n seenKeys.add(redactedKey)\n entries.push([\n redactedKey,\n typeof entry === 'string'\n ? redactIdentifier(entry, record)\n : transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier),\n ])\n }\n return Object.fromEntries(entries)\n}\n\nfunction transformTagFilter(\n value: object,\n record: boolean,\n redactScalar: <T>(value: T, record: boolean) => T,\n redactIdentifier: (value: string, record: boolean) => string,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {}\n for (const [key, entry] of Object.entries(value)) {\n const redactedKey = redactScalar(key, record)\n output[redactedKey] =\n (key === 'key' || key === 'value') && typeof entry === 'string'\n ? redactIdentifier(entry, record)\n : transformProtectedRecord(entry, key, record, redactScalar, redactIdentifier)\n }\n return output\n}\n\nfunction isIdentifierFieldName(name: string): boolean {\n return /ids?$/i.test(name)\n}\n\nfunction protectedRedactionRules(protectedValues: readonly string[]): RedactionRule[] {\n const exactRules = protectedValueVariants(protectedValues)\n .sort((left, right) => right.length - left.length || left.localeCompare(right))\n .map((value, index) => ({\n id: `candidate-access-${index}`,\n pattern: new RegExp(escapeRegularExpression(value), 'g'),\n replacement: '[redacted:candidate-access]',\n }))\n return [...exactRules, ...DEFAULT_REDACTION_RULES]\n}\n\nfunction recordRedaction(report: ProtectedRedactionReport, rule: string, count: number): void {\n if (count <= 0) return\n report.redactionCount += count\n report.byRule[rule] = (report.byRule[rule] ?? 0) + count\n}\n\nfunction containsProtectedBytes(bytes: Uint8Array, protectedValues: readonly string[]): boolean {\n const source = Buffer.from(bytes)\n return protectedValueVariants(protectedValues).some((value) =>\n source.includes(Buffer.from(value, 'utf8')),\n )\n}\n\nfunction decodedBase64ContainsProtectedValue(\n value: string,\n protectedValues: readonly string[],\n): boolean {\n if (value.length < 4 || value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) {\n return false\n }\n try {\n return containsProtectedBytes(Buffer.from(value, 'base64'), protectedValues)\n } catch {\n return false\n }\n}\n\nfunction protectedValueVariants(protectedValues: readonly string[]): string[] {\n const variants = new Set<string>()\n for (const value of normalizedProtectedValues(protectedValues)) {\n variants.add(value)\n variants.add(Buffer.from(value, 'utf8').toString('base64'))\n variants.add(Buffer.from(value, 'utf8').toString('base64url'))\n variants.add(encodeURIComponent(value))\n }\n return [...variants]\n}\n\nfunction normalizedProtectedValues(values: readonly string[]): string[] {\n return [...new Set(values.filter((value) => value.length > 0))]\n}\n\nfunction escapeRegularExpression(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-VISA6CI3.js
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
agentImprovementTargetDigest,
|
|
3
|
-
agentImprovementTargetInput,
|
|
4
|
-
verifyAgentImprovementActivation,
|
|
5
|
-
verifyAgentImprovementProposal
|
|
6
|
-
} from "./chunk-UHEZW5BU.js";
|
|
7
|
-
import {
|
|
8
|
-
canonicalCandidateDigest,
|
|
9
|
-
canonicalCandidateDocument,
|
|
10
|
-
immutableCandidateValue,
|
|
11
|
-
verifyCanonicalCandidateDocument
|
|
12
|
-
} from "./chunk-WSTRQZYQ.js";
|
|
13
|
-
|
|
14
|
-
// src/intelligence/activation.ts
|
|
15
|
-
import {
|
|
16
|
-
agentImprovementActivationResultSchema,
|
|
17
|
-
agentImprovementActivationSchema
|
|
18
|
-
} from "@tangle-network/agent-interface";
|
|
19
|
-
function createAgentImprovementActivationResult(transition, options) {
|
|
20
|
-
const activation = verifyCanonicalCandidateDocument(
|
|
21
|
-
agentImprovementActivationSchema.parse(transition.activation),
|
|
22
|
-
"agent improvement activation"
|
|
23
|
-
);
|
|
24
|
-
assertTransitionInput(activation, transition);
|
|
25
|
-
const result = agentImprovementActivationResultSchema.parse(
|
|
26
|
-
canonicalCandidateDocument({
|
|
27
|
-
kind: "agent-improvement-activation-result",
|
|
28
|
-
idempotencyKey: activation.digest,
|
|
29
|
-
attemptedAt: transition.attemptedAt,
|
|
30
|
-
completedAt: options.completedAt,
|
|
31
|
-
outcome: options.outcome
|
|
32
|
-
}).value
|
|
33
|
-
);
|
|
34
|
-
assertResultAgainstActivation(activation, result);
|
|
35
|
-
assertOutcomeDesiredState(
|
|
36
|
-
activation,
|
|
37
|
-
result,
|
|
38
|
-
new Map(transition.targets.map((target) => [targetIdentity(target), target.desiredDigest]))
|
|
39
|
-
);
|
|
40
|
-
return immutableCandidateValue(result);
|
|
41
|
-
}
|
|
42
|
-
function verifyAgentImprovementActivationResult(input) {
|
|
43
|
-
const proposal = verifyAgentImprovementProposal(input.proposal);
|
|
44
|
-
const activation = verifyAgentImprovementActivation(input);
|
|
45
|
-
const result = verifyCanonicalCandidateDocument(
|
|
46
|
-
agentImprovementActivationResultSchema.parse(input.result),
|
|
47
|
-
"agent improvement activation result"
|
|
48
|
-
);
|
|
49
|
-
assertResultAgainstActivation(activation, result);
|
|
50
|
-
assertResultDesiredState(proposal, activation, result);
|
|
51
|
-
return result;
|
|
52
|
-
}
|
|
53
|
-
async function executeAgentImprovementActivation(input, options) {
|
|
54
|
-
const proposal = verifyAgentImprovementProposal(input.proposal);
|
|
55
|
-
const activation = verifyAgentImprovementActivation(input);
|
|
56
|
-
const experiment = proposal.evaluation.experiment;
|
|
57
|
-
const targetArm = activation.intent === "activate-candidate" ? "candidate" : "baseline";
|
|
58
|
-
const observedAt = (options.now ?? (() => /* @__PURE__ */ new Date()))().toISOString();
|
|
59
|
-
const attemptedAt = Date.parse(observedAt) < Date.parse(activation.authorizedAt) ? activation.authorizedAt : observedAt;
|
|
60
|
-
const transition = immutableCandidateValue({
|
|
61
|
-
activation,
|
|
62
|
-
candidateBundle: experiment.candidate,
|
|
63
|
-
bundle: experiment[targetArm],
|
|
64
|
-
targets: activation.targets.map((target) => ({
|
|
65
|
-
...target,
|
|
66
|
-
desiredDigest: agentImprovementTargetDigest(experiment, targetArm, target.surface),
|
|
67
|
-
desiredInput: agentImprovementTargetInput(experiment[targetArm], target.surface)
|
|
68
|
-
})),
|
|
69
|
-
attemptedAt,
|
|
70
|
-
expired: Date.parse(attemptedAt) >= Date.parse(activation.expiresAt)
|
|
71
|
-
});
|
|
72
|
-
if (transition.expired) {
|
|
73
|
-
if (!options.reconcile) {
|
|
74
|
-
return uncertainActivationResult(transition, "RECONCILIATION_UNAVAILABLE");
|
|
75
|
-
}
|
|
76
|
-
let reconciled;
|
|
77
|
-
try {
|
|
78
|
-
reconciled = await options.reconcile(transition);
|
|
79
|
-
} catch {
|
|
80
|
-
return uncertainActivationResult(transition, "RECONCILIATION_THROW");
|
|
81
|
-
}
|
|
82
|
-
if (reconciled === void 0) {
|
|
83
|
-
return createAgentImprovementActivationResult(transition, {
|
|
84
|
-
completedAt: transition.attemptedAt,
|
|
85
|
-
outcome: { status: "expired" }
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
return verifyAgentImprovementActivationResult({ ...input, result: reconciled });
|
|
90
|
-
} catch {
|
|
91
|
-
return uncertainActivationResult(transition, "INVALID_RECONCILIATION");
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
let rawResult;
|
|
95
|
-
try {
|
|
96
|
-
rawResult = await options.transition(transition);
|
|
97
|
-
} catch {
|
|
98
|
-
return uncertainActivationResult(transition, "TRANSITION_THROW");
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
return verifyAgentImprovementActivationResult({ ...input, result: rawResult });
|
|
102
|
-
} catch {
|
|
103
|
-
return uncertainActivationResult(transition, "INVALID_RESULT");
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function uncertainActivationResult(transition, code) {
|
|
107
|
-
return createAgentImprovementActivationResult(transition, {
|
|
108
|
-
completedAt: transition.attemptedAt,
|
|
109
|
-
outcome: {
|
|
110
|
-
status: "indeterminate",
|
|
111
|
-
code,
|
|
112
|
-
message: "The product transition did not return a trustworthy commit result."
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function assertTransitionInput(activation, transition) {
|
|
117
|
-
const authorized = targetMap(activation.targets);
|
|
118
|
-
const planned = targetMap(transition.targets);
|
|
119
|
-
const desiredInputsMatch = transition.targets.every(
|
|
120
|
-
(target) => canonicalCandidateDigest(target.desiredInput) === canonicalCandidateDigest(agentImprovementTargetInput(transition.bundle, target.surface))
|
|
121
|
-
);
|
|
122
|
-
if (authorized.size !== planned.size || [...authorized.entries()].some(
|
|
123
|
-
([identity, target]) => planned.get(identity)?.expectedBaseDigest !== target.expectedBaseDigest
|
|
124
|
-
) || transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) || transition.candidateBundle.digest !== activation.candidateBundleDigest || !desiredInputsMatch || activation.intent === "activate-candidate" && transition.bundle.digest !== transition.candidateBundle.digest) {
|
|
125
|
-
throw new Error("activation transition does not match its authorization");
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
function assertResultAgainstActivation(activation, result) {
|
|
129
|
-
const attemptedAt = Date.parse(result.attemptedAt);
|
|
130
|
-
const completedAt = Date.parse(result.completedAt);
|
|
131
|
-
const expiresAt = Date.parse(activation.expiresAt);
|
|
132
|
-
if (result.idempotencyKey !== activation.digest || attemptedAt < Date.parse(activation.authorizedAt) || completedAt < attemptedAt) {
|
|
133
|
-
throw new Error("activation result does not bind its authorization");
|
|
134
|
-
}
|
|
135
|
-
const expired = attemptedAt >= expiresAt;
|
|
136
|
-
if (result.outcome.status === "expired" && !expired || expired && !["expired", "indeterminate", "already-applied"].includes(result.outcome.status)) {
|
|
137
|
-
throw new Error("activation result does not honor its authorization expiry");
|
|
138
|
-
}
|
|
139
|
-
if (!("targets" in result.outcome)) return;
|
|
140
|
-
const authorized = targetMap(activation.targets);
|
|
141
|
-
const observed = new Set(result.outcome.targets.map(targetIdentity));
|
|
142
|
-
if (authorized.size !== observed.size || [...authorized.keys()].some((identity) => !observed.has(identity))) {
|
|
143
|
-
throw new Error("activation result must cover every authorized target exactly once");
|
|
144
|
-
}
|
|
145
|
-
if (result.outcome.status === "applied" && result.outcome.targets.some(
|
|
146
|
-
(target) => target.beforeDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest
|
|
147
|
-
)) {
|
|
148
|
-
throw new Error("applied activation did not start from its authorized base state");
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function assertResultDesiredState(proposal, activation, result) {
|
|
152
|
-
if (!("targets" in result.outcome)) return;
|
|
153
|
-
const experiment = proposal.evaluation.experiment;
|
|
154
|
-
const targetArm = activation.intent === "activate-candidate" ? "candidate" : "baseline";
|
|
155
|
-
const desired = new Map(
|
|
156
|
-
activation.targets.map((target) => [
|
|
157
|
-
targetIdentity(target),
|
|
158
|
-
agentImprovementTargetDigest(experiment, targetArm, target.surface)
|
|
159
|
-
])
|
|
160
|
-
);
|
|
161
|
-
assertOutcomeDesiredState(activation, result, desired);
|
|
162
|
-
}
|
|
163
|
-
function assertOutcomeDesiredState(activation, result, desired) {
|
|
164
|
-
if (!("targets" in result.outcome)) return;
|
|
165
|
-
if (result.outcome.status === "applied") {
|
|
166
|
-
if (result.outcome.targets.some(
|
|
167
|
-
(target) => target.afterDigest !== desired.get(targetIdentity(target))
|
|
168
|
-
)) {
|
|
169
|
-
throw new Error("applied activation does not match the requested bundle");
|
|
170
|
-
}
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
const allDesired = result.outcome.targets.every(
|
|
174
|
-
(target) => target.currentDigest === desired.get(targetIdentity(target))
|
|
175
|
-
);
|
|
176
|
-
if (result.outcome.status === "already-applied") {
|
|
177
|
-
if (!allDesired) throw new Error("already-applied activation is not at the requested state");
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const authorized = targetMap(activation.targets);
|
|
181
|
-
const hasStaleTarget = result.outcome.targets.some(
|
|
182
|
-
(target) => target.currentDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest
|
|
183
|
-
);
|
|
184
|
-
if (allDesired || !hasStaleTarget) {
|
|
185
|
-
throw new Error("activation conflict does not identify stale target state");
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
function targetMap(targets) {
|
|
189
|
-
return new Map(targets.map((target) => [targetIdentity(target), target]));
|
|
190
|
-
}
|
|
191
|
-
function targetIdentity(target) {
|
|
192
|
-
return `${target.surface}\0${target.identity}`;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export {
|
|
196
|
-
createAgentImprovementActivationResult,
|
|
197
|
-
verifyAgentImprovementActivationResult,
|
|
198
|
-
executeAgentImprovementActivation
|
|
199
|
-
};
|
|
200
|
-
//# sourceMappingURL=chunk-VISA6CI3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/intelligence/activation.ts"],"sourcesContent":["import type {\n AgentCandidateBundle,\n AgentImprovementActivation,\n AgentImprovementActivationOutcome,\n AgentImprovementActivationResult,\n AgentImprovementActivationTarget,\n AgentImprovementProposal,\n AgentImprovementReview,\n AgentImprovementSurface,\n Sha256Digest,\n} from '@tangle-network/agent-interface'\nimport {\n agentImprovementActivationResultSchema,\n agentImprovementActivationSchema,\n} from '@tangle-network/agent-interface'\n\nimport {\n canonicalCandidateDigest,\n canonicalCandidateDocument,\n immutableCandidateValue,\n verifyCanonicalCandidateDocument,\n} from '../candidate-execution/digest'\nimport {\n verifyAgentImprovementActivation,\n verifyAgentImprovementProposal,\n} from './improvement-cycle'\nimport { agentImprovementTargetDigest, agentImprovementTargetInput } from './improvement-surfaces'\n\nexport interface CreateAgentImprovementActivationResultOptions {\n completedAt: string\n outcome: AgentImprovementActivationOutcome\n}\n\nexport interface AgentImprovementActivationTargetPlan extends AgentImprovementActivationTarget {\n desiredDigest: Sha256Digest\n /**\n * Exact measured input the product must apply to reach `desiredDigest`.\n * Transition surfaces such as code and knowledge are applied operations, so\n * their resulting state digest is not the digest of this input document.\n */\n desiredInput: unknown\n}\n\nexport interface AgentImprovementActivationTransitionInput {\n activation: AgentImprovementActivation\n candidateBundle: AgentCandidateBundle\n bundle: AgentCandidateBundle\n targets: [AgentImprovementActivationTargetPlan, ...AgentImprovementActivationTargetPlan[]]\n attemptedAt: string\n expired: boolean\n}\n\nexport interface AgentImprovementActivationResultStore {\n load(idempotencyKey: Sha256Digest): Promise<unknown | undefined>\n putIfAbsent(result: AgentImprovementActivationResult): Promise<unknown>\n}\n\n/**\n * Product-owned or Runtime-composed transition.\n *\n * Implementations resolve a stored result for `activation.digest`, compare\n * every target, and make the write durably idempotent. Co-located targets store\n * the all-or-none write with its result. Other targets throw when result\n * storage fails so a retry can reconcile it. Runtime never invokes this write\n * function after authorization expires.\n */\nexport type AgentImprovementActivationTransition = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown>\n\n/**\n * Target-read-only check for a prior exact write.\n * It may persist recovered result metadata, but must not change an activation target.\n * Return undefined only when no target write can have committed.\n */\nexport type AgentImprovementActivationReconciliation = (\n input: AgentImprovementActivationTransitionInput,\n) => Promise<unknown | undefined>\n\nexport interface ExecuteAgentImprovementActivationInput {\n proposal: AgentImprovementProposal\n review: AgentImprovementReview\n activation: AgentImprovementActivation\n}\n\nexport interface ExecuteAgentImprovementActivationOptions {\n transition: AgentImprovementActivationTransition\n reconcile?: AgentImprovementActivationReconciliation\n now?: () => Date\n}\n\n/** Create the exact result a product stores in the same transaction as its target write. */\nexport function createAgentImprovementActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n options: CreateAgentImprovementActivationResultOptions,\n): AgentImprovementActivationResult {\n const activation = verifyCanonicalCandidateDocument(\n agentImprovementActivationSchema.parse(transition.activation),\n 'agent improvement activation',\n )\n assertTransitionInput(activation, transition)\n const result = agentImprovementActivationResultSchema.parse(\n canonicalCandidateDocument<AgentImprovementActivationResult>({\n kind: 'agent-improvement-activation-result',\n idempotencyKey: activation.digest,\n attemptedAt: transition.attemptedAt,\n completedAt: options.completedAt,\n outcome: options.outcome,\n }).value,\n )\n assertResultAgainstActivation(activation, result)\n assertOutcomeDesiredState(\n activation,\n result,\n new Map(transition.targets.map((target) => [targetIdentity(target), target.desiredDigest])),\n )\n return immutableCandidateValue(result)\n}\n\n/**\n * Recompute one historical activation result against the exact measured proposal and authority.\n * The result records that attempt; it is not a query of the target's current state.\n */\nexport function verifyAgentImprovementActivationResult(input: {\n proposal: unknown\n review: unknown\n activation: unknown\n result: unknown\n}): AgentImprovementActivationResult {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const result = verifyCanonicalCandidateDocument(\n agentImprovementActivationResultSchema.parse(input.result),\n 'agent improvement activation result',\n )\n assertResultAgainstActivation(activation, result)\n assertResultDesiredState(proposal, activation, result)\n return result\n}\n\n/** Validate and execute one product-owned activation transition. */\nexport async function executeAgentImprovementActivation(\n input: ExecuteAgentImprovementActivationInput,\n options: ExecuteAgentImprovementActivationOptions,\n): Promise<AgentImprovementActivationResult> {\n const proposal = verifyAgentImprovementProposal(input.proposal)\n const activation = verifyAgentImprovementActivation(input)\n const experiment = proposal.evaluation.experiment\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const observedAt = (options.now ?? (() => new Date()))().toISOString()\n const attemptedAt =\n Date.parse(observedAt) < Date.parse(activation.authorizedAt)\n ? activation.authorizedAt\n : observedAt\n const transition = immutableCandidateValue<AgentImprovementActivationTransitionInput>({\n activation,\n candidateBundle: experiment.candidate,\n bundle: experiment[targetArm],\n targets: activation.targets.map((target) => ({\n ...target,\n desiredDigest: agentImprovementTargetDigest(experiment, targetArm, target.surface),\n desiredInput: agentImprovementTargetInput(experiment[targetArm], target.surface),\n })) as AgentImprovementActivationTransitionInput['targets'],\n attemptedAt,\n expired: Date.parse(attemptedAt) >= Date.parse(activation.expiresAt),\n })\n\n if (transition.expired) {\n if (!options.reconcile) {\n return uncertainActivationResult(transition, 'RECONCILIATION_UNAVAILABLE')\n }\n let reconciled: unknown\n try {\n reconciled = await options.reconcile(transition)\n } catch {\n return uncertainActivationResult(transition, 'RECONCILIATION_THROW')\n }\n if (reconciled === undefined) {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: { status: 'expired' },\n })\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: reconciled })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RECONCILIATION')\n }\n }\n\n let rawResult: unknown\n try {\n rawResult = await options.transition(transition)\n } catch {\n return uncertainActivationResult(transition, 'TRANSITION_THROW')\n }\n try {\n return verifyAgentImprovementActivationResult({ ...input, result: rawResult })\n } catch {\n return uncertainActivationResult(transition, 'INVALID_RESULT')\n }\n}\n\nfunction uncertainActivationResult(\n transition: AgentImprovementActivationTransitionInput,\n code: string,\n): AgentImprovementActivationResult {\n return createAgentImprovementActivationResult(transition, {\n completedAt: transition.attemptedAt,\n outcome: {\n status: 'indeterminate',\n code,\n message: 'The product transition did not return a trustworthy commit result.',\n },\n })\n}\n\nfunction assertTransitionInput(\n activation: AgentImprovementActivation,\n transition: AgentImprovementActivationTransitionInput,\n): void {\n const authorized = targetMap(activation.targets)\n const planned = targetMap(transition.targets)\n const desiredInputsMatch = transition.targets.every(\n (target) =>\n canonicalCandidateDigest(target.desiredInput) ===\n canonicalCandidateDigest(agentImprovementTargetInput(transition.bundle, target.surface)),\n )\n if (\n authorized.size !== planned.size ||\n [...authorized.entries()].some(\n ([identity, target]) =>\n planned.get(identity)?.expectedBaseDigest !== target.expectedBaseDigest,\n ) ||\n transition.expired !== Date.parse(transition.attemptedAt) >= Date.parse(activation.expiresAt) ||\n transition.candidateBundle.digest !== activation.candidateBundleDigest ||\n !desiredInputsMatch ||\n (activation.intent === 'activate-candidate' &&\n transition.bundle.digest !== transition.candidateBundle.digest)\n ) {\n throw new Error('activation transition does not match its authorization')\n }\n}\n\nfunction assertResultAgainstActivation(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n const attemptedAt = Date.parse(result.attemptedAt)\n const completedAt = Date.parse(result.completedAt)\n const expiresAt = Date.parse(activation.expiresAt)\n if (\n result.idempotencyKey !== activation.digest ||\n attemptedAt < Date.parse(activation.authorizedAt) ||\n completedAt < attemptedAt\n ) {\n throw new Error('activation result does not bind its authorization')\n }\n const expired = attemptedAt >= expiresAt\n if (\n (result.outcome.status === 'expired' && !expired) ||\n (expired && !['expired', 'indeterminate', 'already-applied'].includes(result.outcome.status))\n ) {\n throw new Error('activation result does not honor its authorization expiry')\n }\n if (!('targets' in result.outcome)) return\n const authorized = targetMap(activation.targets)\n const observed = new Set(result.outcome.targets.map(targetIdentity))\n if (\n authorized.size !== observed.size ||\n [...authorized.keys()].some((identity) => !observed.has(identity))\n ) {\n throw new Error('activation result must cover every authorized target exactly once')\n }\n if (\n result.outcome.status === 'applied' &&\n result.outcome.targets.some(\n (target) =>\n target.beforeDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n ) {\n throw new Error('applied activation did not start from its authorized base state')\n }\n}\n\nfunction assertResultDesiredState(\n proposal: AgentImprovementProposal,\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n): void {\n if (!('targets' in result.outcome)) return\n const experiment = proposal.evaluation.experiment\n const targetArm = activation.intent === 'activate-candidate' ? 'candidate' : 'baseline'\n const desired = new Map(\n activation.targets.map((target) => [\n targetIdentity(target),\n agentImprovementTargetDigest(experiment, targetArm, target.surface),\n ]),\n )\n assertOutcomeDesiredState(activation, result, desired)\n}\n\nfunction assertOutcomeDesiredState(\n activation: AgentImprovementActivation,\n result: AgentImprovementActivationResult,\n desired: ReadonlyMap<string, Sha256Digest>,\n): void {\n if (!('targets' in result.outcome)) return\n if (result.outcome.status === 'applied') {\n if (\n result.outcome.targets.some(\n (target) => target.afterDigest !== desired.get(targetIdentity(target)),\n )\n ) {\n throw new Error('applied activation does not match the requested bundle')\n }\n return\n }\n const allDesired = result.outcome.targets.every(\n (target) => target.currentDigest === desired.get(targetIdentity(target)),\n )\n if (result.outcome.status === 'already-applied') {\n if (!allDesired) throw new Error('already-applied activation is not at the requested state')\n return\n }\n const authorized = targetMap(activation.targets)\n const hasStaleTarget = result.outcome.targets.some(\n (target) => target.currentDigest !== authorized.get(targetIdentity(target))?.expectedBaseDigest,\n )\n if (allDesired || !hasStaleTarget) {\n throw new Error('activation conflict does not identify stale target state')\n }\n}\n\nfunction targetMap<T extends { surface: AgentImprovementSurface; identity: string }>(\n targets: readonly T[],\n): Map<string, T> {\n return new Map(targets.map((target) => [targetIdentity(target), target]))\n}\n\nfunction targetIdentity(target: { surface: AgentImprovementSurface; identity: string }): string {\n return `${target.surface}\\u0000${target.identity}`\n}\n"],"mappings":"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","names":[]}
|