@airprompter/agent-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 (129) hide show
  1. package/README.md +28 -0
  2. package/dist/cjs/bundle/apbundle.js +98 -0
  3. package/dist/cjs/bundle/apbundle.js.map +1 -0
  4. package/dist/cjs/bundle/hpke.js +120 -0
  5. package/dist/cjs/bundle/hpke.js.map +1 -0
  6. package/dist/cjs/checks/index.js +450 -0
  7. package/dist/cjs/checks/index.js.map +1 -0
  8. package/dist/cjs/control/client.js +85 -0
  9. package/dist/cjs/control/client.js.map +1 -0
  10. package/dist/cjs/golden/index.js +138 -0
  11. package/dist/cjs/golden/index.js.map +1 -0
  12. package/dist/cjs/index.js +125 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/judge/index.js +134 -0
  15. package/dist/cjs/judge/index.js.map +1 -0
  16. package/dist/cjs/package.json +1 -0
  17. package/dist/cjs/ports/node.js +30 -0
  18. package/dist/cjs/ports/node.js.map +1 -0
  19. package/dist/cjs/protocol/assignment.js +158 -0
  20. package/dist/cjs/protocol/assignment.js.map +1 -0
  21. package/dist/cjs/protocol/canonicalJson.js +72 -0
  22. package/dist/cjs/protocol/canonicalJson.js.map +1 -0
  23. package/dist/cjs/protocol/errors.js +22 -0
  24. package/dist/cjs/protocol/errors.js.map +1 -0
  25. package/dist/cjs/protocol/ports.js +19 -0
  26. package/dist/cjs/protocol/ports.js.map +1 -0
  27. package/dist/cjs/protocol/trust.js +225 -0
  28. package/dist/cjs/protocol/trust.js.map +1 -0
  29. package/dist/cjs/protocol/types.js +15 -0
  30. package/dist/cjs/protocol/types.js.map +1 -0
  31. package/dist/cjs/protocol/version.js +8 -0
  32. package/dist/cjs/protocol/version.js.map +1 -0
  33. package/dist/cjs/release/bundleRelease.js +61 -0
  34. package/dist/cjs/release/bundleRelease.js.map +1 -0
  35. package/dist/cjs/release/reader.js +12 -0
  36. package/dist/cjs/release/reader.js.map +1 -0
  37. package/dist/cjs/render/runRef.js +33 -0
  38. package/dist/cjs/render/runRef.js.map +1 -0
  39. package/dist/cjs/render/template.js +71 -0
  40. package/dist/cjs/render/template.js.map +1 -0
  41. package/dist/cjs/telemetry/feedback.js +81 -0
  42. package/dist/cjs/telemetry/feedback.js.map +1 -0
  43. package/dist/cjs/telemetry/rows.js +28 -0
  44. package/dist/cjs/telemetry/rows.js.map +1 -0
  45. package/dist/cjs/telemetry/uploadSink.js +13 -0
  46. package/dist/cjs/telemetry/uploadSink.js.map +1 -0
  47. package/dist/cjs/testing/controlPlane.js +381 -0
  48. package/dist/cjs/testing/controlPlane.js.map +1 -0
  49. package/dist/cjs/testing/index.js +45 -0
  50. package/dist/cjs/testing/index.js.map +1 -0
  51. package/dist/cjs/testing/memoryFs.js +236 -0
  52. package/dist/cjs/testing/memoryFs.js.map +1 -0
  53. package/dist/esm/.tsbuildinfo +1 -0
  54. package/dist/esm/bundle/apbundle.d.ts +33 -0
  55. package/dist/esm/bundle/apbundle.js +89 -0
  56. package/dist/esm/bundle/apbundle.js.map +1 -0
  57. package/dist/esm/bundle/hpke.d.ts +48 -0
  58. package/dist/esm/bundle/hpke.js +107 -0
  59. package/dist/esm/bundle/hpke.js.map +1 -0
  60. package/dist/esm/checks/index.d.ts +85 -0
  61. package/dist/esm/checks/index.js +436 -0
  62. package/dist/esm/checks/index.js.map +1 -0
  63. package/dist/esm/control/client.d.ts +78 -0
  64. package/dist/esm/control/client.js +81 -0
  65. package/dist/esm/control/client.js.map +1 -0
  66. package/dist/esm/golden/index.d.ts +97 -0
  67. package/dist/esm/golden/index.js +130 -0
  68. package/dist/esm/golden/index.js.map +1 -0
  69. package/dist/esm/index.d.ts +41 -0
  70. package/dist/esm/index.js +31 -0
  71. package/dist/esm/index.js.map +1 -0
  72. package/dist/esm/judge/index.d.ts +51 -0
  73. package/dist/esm/judge/index.js +127 -0
  74. package/dist/esm/judge/index.js.map +1 -0
  75. package/dist/esm/ports/node.d.ts +8 -0
  76. package/dist/esm/ports/node.js +27 -0
  77. package/dist/esm/ports/node.js.map +1 -0
  78. package/dist/esm/protocol/assignment.d.ts +49 -0
  79. package/dist/esm/protocol/assignment.js +143 -0
  80. package/dist/esm/protocol/assignment.js.map +1 -0
  81. package/dist/esm/protocol/canonicalJson.d.ts +10 -0
  82. package/dist/esm/protocol/canonicalJson.js +65 -0
  83. package/dist/esm/protocol/canonicalJson.js.map +1 -0
  84. package/dist/esm/protocol/errors.d.ts +15 -0
  85. package/dist/esm/protocol/errors.js +19 -0
  86. package/dist/esm/protocol/errors.js.map +1 -0
  87. package/dist/esm/protocol/ports.d.ts +65 -0
  88. package/dist/esm/protocol/ports.js +16 -0
  89. package/dist/esm/protocol/ports.js.map +1 -0
  90. package/dist/esm/protocol/trust.d.ts +60 -0
  91. package/dist/esm/protocol/trust.js +211 -0
  92. package/dist/esm/protocol/trust.js.map +1 -0
  93. package/dist/esm/protocol/types.d.ts +235 -0
  94. package/dist/esm/protocol/types.js +12 -0
  95. package/dist/esm/protocol/types.js.map +1 -0
  96. package/dist/esm/protocol/version.d.ts +4 -0
  97. package/dist/esm/protocol/version.js +5 -0
  98. package/dist/esm/protocol/version.js.map +1 -0
  99. package/dist/esm/release/bundleRelease.d.ts +45 -0
  100. package/dist/esm/release/bundleRelease.js +57 -0
  101. package/dist/esm/release/bundleRelease.js.map +1 -0
  102. package/dist/esm/release/reader.d.ts +30 -0
  103. package/dist/esm/release/reader.js +11 -0
  104. package/dist/esm/release/reader.js.map +1 -0
  105. package/dist/esm/render/runRef.d.ts +17 -0
  106. package/dist/esm/render/runRef.js +29 -0
  107. package/dist/esm/render/runRef.js.map +1 -0
  108. package/dist/esm/render/template.d.ts +38 -0
  109. package/dist/esm/render/template.js +65 -0
  110. package/dist/esm/render/template.js.map +1 -0
  111. package/dist/esm/telemetry/feedback.d.ts +21 -0
  112. package/dist/esm/telemetry/feedback.js +77 -0
  113. package/dist/esm/telemetry/feedback.js.map +1 -0
  114. package/dist/esm/telemetry/rows.d.ts +85 -0
  115. package/dist/esm/telemetry/rows.js +22 -0
  116. package/dist/esm/telemetry/rows.js.map +1 -0
  117. package/dist/esm/telemetry/uploadSink.d.ts +52 -0
  118. package/dist/esm/telemetry/uploadSink.js +12 -0
  119. package/dist/esm/telemetry/uploadSink.js.map +1 -0
  120. package/dist/esm/testing/controlPlane.d.ts +116 -0
  121. package/dist/esm/testing/controlPlane.js +341 -0
  122. package/dist/esm/testing/controlPlane.js.map +1 -0
  123. package/dist/esm/testing/index.d.ts +25 -0
  124. package/dist/esm/testing/index.js +35 -0
  125. package/dist/esm/testing/index.js.map +1 -0
  126. package/dist/esm/testing/memoryFs.d.ts +64 -0
  127. package/dist/esm/testing/memoryFs.js +232 -0
  128. package/dist/esm/testing/memoryFs.js.map +1 -0
  129. package/package.json +45 -0
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ /**
3
+ * The feedback catalogue (`protocol/schemas/feedback-signals.schema.json`)
4
+ * normalised into window outcomes. Numbers, booleans and the declared enums
5
+ * only; anything else — free text above all — is named in `rejected` and
6
+ * never reaches the spool. `protocol/vectors/feedback.json` pins every rule.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.OUTCOME_NAME = exports.CATALOGUE = exports.RUNTIME_SIGNALS = exports.COUNT_SIGNALS = exports.UNIT_SIGNALS = exports.BOOLEAN_SIGNALS = void 0;
10
+ exports.normalizeFeedback = normalizeFeedback;
11
+ exports.BOOLEAN_SIGNALS = ["flagged", "accepted", "edited", "regenerated", "copied", "followUp", "escalated", "abandoned", "corrected", "resolved", "reopened", "converted", "refunded", "slaMet"];
12
+ exports.UNIT_SIGNALS = ["editDistanceRatio", "judgeScore"];
13
+ exports.COUNT_SIGNALS = ["regenerations", "timeToAcceptMs"];
14
+ /** T34: written by the runtime on a window (a golden-set run), never accepted from `feedback()`; reserved so `custom` cannot shadow it. */
15
+ exports.RUNTIME_SIGNALS = ["goldenPass"];
16
+ exports.CATALOGUE = new Set(["thumbs", "rating", "correctedValue", "custom", ...exports.BOOLEAN_SIGNALS, ...exports.UNIT_SIGNALS, ...exports.COUNT_SIGNALS, ...exports.RUNTIME_SIGNALS]);
17
+ exports.OUTCOME_NAME = /^[a-z][a-zA-Z0-9]{0,31}$/;
18
+ const finite = (value) => typeof value === "number" && Number.isFinite(value);
19
+ function normalizeFeedback(signals) {
20
+ const outcomes = {};
21
+ const rejected = {};
22
+ for (const [name, value] of Object.entries(signals)) {
23
+ if (name === "thumbs") {
24
+ if (value === "up" || value === "down")
25
+ outcomes.thumbs = value === "up";
26
+ else
27
+ rejected[name] = "invalid_value";
28
+ }
29
+ else if (name === "rating") {
30
+ if (Number.isInteger(value) && value >= 1 && value <= 5)
31
+ outcomes.rating = value;
32
+ else
33
+ rejected[name] = "invalid_value";
34
+ }
35
+ else if (exports.BOOLEAN_SIGNALS.includes(name)) {
36
+ if (typeof value === "boolean")
37
+ outcomes[name] = value;
38
+ else
39
+ rejected[name] = "invalid_value";
40
+ }
41
+ else if (exports.UNIT_SIGNALS.includes(name)) {
42
+ if (finite(value) && value >= 0 && value <= 1)
43
+ outcomes[name] = value;
44
+ else
45
+ rejected[name] = "invalid_value";
46
+ }
47
+ else if (exports.COUNT_SIGNALS.includes(name)) {
48
+ if (Number.isInteger(value) && value >= 0)
49
+ outcomes[name] = value;
50
+ else
51
+ rejected[name] = "invalid_value";
52
+ }
53
+ else if (name === "correctedValue") {
54
+ // Aggregating per enum value needs the slot's declared output check, which this writer does not hold yet.
55
+ rejected[name] = typeof value === "string" && value.length <= 64 ? "needs_slot_enum" : "invalid_value";
56
+ }
57
+ else if (exports.RUNTIME_SIGNALS.includes(name)) {
58
+ rejected[name] = "reserved_name";
59
+ }
60
+ else if (name === "custom") {
61
+ if (typeof value !== "object" || value === null || Array.isArray(value) || Object.keys(value).length > 8) {
62
+ rejected[name] = "invalid_value";
63
+ continue;
64
+ }
65
+ for (const [customName, customValue] of Object.entries(value)) {
66
+ if (!exports.OUTCOME_NAME.test(customName))
67
+ rejected[`custom.${customName}`] = "invalid_name";
68
+ else if (exports.CATALOGUE.has(customName))
69
+ rejected[`custom.${customName}`] = "reserved_name";
70
+ else if (typeof customValue === "boolean" || finite(customValue))
71
+ outcomes[customName] = customValue;
72
+ else
73
+ rejected[`custom.${customName}`] = "invalid_value";
74
+ }
75
+ }
76
+ else
77
+ rejected[name] = "unknown_signal";
78
+ }
79
+ return { accepted: Object.keys(outcomes).length > 0, outcomes, rejected };
80
+ }
81
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/telemetry/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * The telemetry row schemas (`protocol/spool-format.md`, D52/D66): what a
4
+ * spool segment carries, and nothing else. There is no field for prompt
5
+ * text, output, or an end-user identifier — the shape is the privacy rule.
6
+ * Pure: the spool writer (`@airprompter/agent-telemetry`) and the wrap
7
+ * adapters (`@airprompter/agent-runtime`) both build on these without
8
+ * importing each other.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.LATENCY_BUCKET_EDGES_MS = void 0;
12
+ exports.latencyBucketIndex = latencyBucketIndex;
13
+ exports.minuteOf = minuteOf;
14
+ exports.epochMinute = epochMinute;
15
+ exports.LATENCY_BUCKET_EDGES_MS = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 65536];
16
+ function latencyBucketIndex(latencyMs) {
17
+ const index = exports.LATENCY_BUCKET_EDGES_MS.findIndex((edge) => latencyMs <= edge);
18
+ return index === -1 ? exports.LATENCY_BUCKET_EDGES_MS.length - 1 : index;
19
+ }
20
+ function minuteOf(epochMs) {
21
+ const date = new Date(epochMs);
22
+ date.setUTCSeconds(0, 0);
23
+ return date.toISOString().replace(".000Z", "Z");
24
+ }
25
+ function epochMinute(epochMs) {
26
+ return Math.floor(epochMs / 60000);
27
+ }
28
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/telemetry/rows.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAuEH,gDAGC;AAED,4BAIC;AAED,kCAEC;AAlFY,QAAA,uBAAuB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAqE9H,SAAgB,kBAAkB,CAAC,SAAiB;IAClD,MAAM,KAAK,GAAG,+BAAuB,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;IAC7E,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,+BAAuB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnE,CAAC;AAED,SAAgB,QAAQ,CAAC,OAAe;IACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Where validated spool segments go (S13): the `UploadSink` port. The
4
+ * uploader in `@airprompter/agent-telemetry` owns the spool — the sweep, the
5
+ * budget, the quarantine, the delete-on-ack — and hands each validated
6
+ * segment to a sink. Two sinks ship: AirPrompter's (a grant per writer from
7
+ * the heartbeat, a PUT to the customer's own prefix) and the OpenTelemetry
8
+ * bridge (`@airprompter/otel-bridge`: the windows as OTLP metrics to the
9
+ * collector the customer already runs, no AirPrompter grant at all). A sink
10
+ * is data, never a class: `kind` says what it is.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ //# sourceMappingURL=uploadSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadSink.js","sourceRoot":"","sources":["../../../src/telemetry/uploadSink.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * A fake control plane for SDK tests: an offline root ceremony, a signing
4
+ * key, sealed manifests per generation, payloads by hash, an edge pointer —
5
+ * served through a `fetch` the SDK takes as an option. Signs exactly as the
6
+ * hosted service does (canonical payload bytes, ES256, P1363).
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.FakeControlPlane = exports.PROTOCOL = void 0;
43
+ exports.newKey = newKey;
44
+ exports.rootDocument = rootDocument;
45
+ exports.serveOverHttp = serveOverHttp;
46
+ const node_crypto_1 = require("node:crypto");
47
+ const canonicalJson_js_1 = require("../protocol/canonicalJson.js");
48
+ const trust_js_1 = require("../protocol/trust.js");
49
+ const version_js_1 = require("../protocol/version.js");
50
+ /** The protocol version this checkout of the repository declares; manifests the fake signs carry it. */
51
+ exports.PROTOCOL = version_js_1.PROTOCOL_VERSION;
52
+ function newKey() {
53
+ const { privateKey } = (0, node_crypto_1.generateKeyPairSync)("ec", { namedCurve: "P-256" });
54
+ const jwk = privateKey.export({ format: "jwk" });
55
+ return { kty: "EC", crv: "P-256", x: jwk.x, y: jwk.y, d: jwk.d };
56
+ }
57
+ function rootDocument(input) {
58
+ const keys = {};
59
+ const rootId = (0, trust_js_1.keyThumbprint)(input.rootKey);
60
+ keys[rootId] = { keyType: "ecdsa-p256", scheme: "ES256", publicKey: (0, trust_js_1.publicJwkOf)(input.rootKey) };
61
+ const targetIds = input.signingKeys.map((key) => {
62
+ const id = (0, trust_js_1.keyThumbprint)(key);
63
+ keys[id] = { keyType: "ecdsa-p256", scheme: "ES256", publicKey: (0, trust_js_1.publicJwkOf)(key) };
64
+ return id;
65
+ });
66
+ const signed = {
67
+ type: "root",
68
+ protocol: exports.PROTOCOL,
69
+ purpose: input.purpose ?? "platform",
70
+ environment: input.environment,
71
+ version: input.version ?? 1,
72
+ expires: input.expires ?? "2027-12-11T00:00:00Z",
73
+ keys,
74
+ roles: { root: { keyIds: [rootId], threshold: 1 }, targets: { keyIds: targetIds, threshold: 1 } },
75
+ };
76
+ return { signed, signatures: [{ keyId: rootId, alg: "ES256", sig: (0, trust_js_1.signBytes)((0, canonicalJson_js_1.canonicalBytes)(signed), input.rootKey) }] };
77
+ }
78
+ class FakeControlPlane {
79
+ scope;
80
+ apiKey;
81
+ rootKey;
82
+ signingKey;
83
+ root;
84
+ payloads = new Map();
85
+ requests = [];
86
+ current = null;
87
+ generation = 0;
88
+ edgeEtag = 0;
89
+ requireCountersign = false;
90
+ /**
91
+ * Fresh keys by default (a test). `airprompter dev` (S12) hands in the keys it persisted, so the root a customer
92
+ * pinned yesterday still verifies today's generations.
93
+ */
94
+ constructor(scope, apiKey = "apa_live_testkey", keys = {}) {
95
+ this.scope = scope;
96
+ this.apiKey = apiKey;
97
+ this.rootKey = keys.rootKey ?? newKey();
98
+ this.signingKey = keys.signingKey ?? newKey();
99
+ this.root = rootDocument({ rootKey: this.rootKey, signingKeys: [this.signingKey], environment: scope.target });
100
+ }
101
+ slot(spec) {
102
+ const bytes = Buffer.from(spec.text, "utf8");
103
+ const hash = (0, canonicalJson_js_1.sha256Prefixed)(bytes);
104
+ this.payloads.set(hash, bytes);
105
+ const slot = {
106
+ tag: spec.tag,
107
+ kind: spec.steps ? "workflow" : "prompt",
108
+ artifactId: `art_${spec.tag}`,
109
+ versionId: spec.versionId ?? `ver_${spec.tag}_1`,
110
+ versionOrdinal: 1,
111
+ contentHash: hash,
112
+ byteLength: bytes.length,
113
+ model: spec.model ?? "claude-sonnet-5",
114
+ variables: spec.variables ?? [],
115
+ };
116
+ if (spec.steps) {
117
+ slot.steps = spec.steps.map((step, index) => {
118
+ const stepBytes = Buffer.from(step.text, "utf8");
119
+ const stepHash = (0, canonicalJson_js_1.sha256Prefixed)(stepBytes);
120
+ this.payloads.set(stepHash, stepBytes);
121
+ return { stepId: `${spec.tag}#${index + 1}`, ordinal: index + 1, promptArtifactId: `art_${spec.tag}_${index + 1}`, promptVersionId: step.versionId ?? `ver_${spec.tag}_step${index + 1}`, contentHash: stepHash, byteLength: stepBytes.length };
122
+ });
123
+ }
124
+ return slot;
125
+ }
126
+ /** Seal and promote: generation + 1, signed with the signing key. */
127
+ /** T9: every heartbeat body the fake accepted, and what it answers (a test may change the cadence). */
128
+ heartbeats = [];
129
+ heartbeatIntervalSeconds = 300;
130
+ heartbeatRefusal = null;
131
+ /**
132
+ * T26: the grant issuer and a fake S3 behind it. With `grantBaseUrl` set, every accepted heartbeat answers an
133
+ * `uploadGrant` for the body's instance prefix (or `retryAfterSeconds` while `grantHold` is set); the POST endpoint at
134
+ * `<grantBaseUrl>/s3/agent-telemetry` checks the policy the way the bucket would and keeps the objects by key.
135
+ */
136
+ grantBaseUrl = null;
137
+ /** S3: a party between the fleet and the edge pins the pointer at this generation; the origin moves on regardless. */
138
+ pinnedPointer = null;
139
+ /** S3: whether the heartbeat answer names the origin's generation (an older service does not). */
140
+ heartbeatLatestGeneration = true;
141
+ grantTtlMs = 15 * 60 * 1000;
142
+ grantHold = null;
143
+ uploadIntervalSeconds = 300;
144
+ grants = [];
145
+ objects = new Map();
146
+ uploads = [];
147
+ /** A test may fail the next N POSTs (a 500) to exercise backoff. */
148
+ failNextUploads = 0;
149
+ /** The issuer's and the bucket's clock (grant expiry, policy expiry); a test drives it beside the uploader's. */
150
+ now = () => Date.now();
151
+ grantSeq = 0;
152
+ issueGrant(instanceId, now) {
153
+ const grantId = `grant_${String(++this.grantSeq).padStart(4, "0")}_${instanceId.slice(0, 8)}`.replace(/[^A-Za-z0-9_-]/g, "_").padEnd(16, "0");
154
+ const keyPrefix = `org/${this.scope.organizationId}/agent/${this.scope.agentId}/${this.scope.target}/${instanceId}/`;
155
+ const expiresAt = new Date(now + this.grantTtlMs).toISOString();
156
+ const policy = Buffer.from(JSON.stringify({ expiration: expiresAt, conditions: [["starts-with", "$key", keyPrefix], ["content-length-range", 0, 1048576], { "Content-Type": "application/x-ndjson" }, { "x-amz-meta-grant-id": grantId }] })).toString("base64");
157
+ this.grants.push({ grantId, instanceId, keyPrefix, expiresAt });
158
+ return {
159
+ grantId,
160
+ url: `${this.grantBaseUrl}/s3/agent-telemetry`,
161
+ fields: { policy, "x-amz-algorithm": "AWS4-HMAC-SHA256", "x-amz-credential": "AKIAFAKE/20260912/eu-west-1/s3/aws4_request", "x-amz-date": "20260912T000000Z", "x-amz-signature": "fake", "x-amz-server-side-encryption": "aws:kms", "x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:eu-west-1:000000000000:key/fake", "x-amz-meta-grant-id": grantId },
162
+ keyPrefix,
163
+ expiresAt,
164
+ maxObjectBytes: 1048576,
165
+ contentType: "application/x-ndjson",
166
+ };
167
+ }
168
+ /** The bucket's side of a presigned POST: the policy's conditions, the expiry, the size cap; nothing else is looked at. */
169
+ acceptUpload(init, now) {
170
+ const contentType = init?.headers?.["content-type"] ?? "";
171
+ const boundary = /boundary=(.+)$/.exec(contentType)?.[1];
172
+ if (!boundary || !init?.body)
173
+ return { status: 400, body: "<Error><Code>MalformedPOSTRequest</Code></Error>" };
174
+ const raw = typeof init.body === "string" ? Buffer.from(init.body, "utf8") : Buffer.from(init.body);
175
+ const fields = new Map();
176
+ const marker = Buffer.from(`--${boundary}`);
177
+ let offset = raw.indexOf(marker);
178
+ while (offset !== -1) {
179
+ const next = raw.indexOf(marker, offset + marker.length);
180
+ if (next === -1)
181
+ break;
182
+ const part = raw.subarray(offset + marker.length + 2, next - 2); // skip CRLF after the marker; drop CRLF before the next
183
+ const headerEnd = part.indexOf("\r\n\r\n");
184
+ const headers = part.subarray(0, headerEnd).toString("utf8");
185
+ const name = /name="([^"]+)"/.exec(headers)?.[1];
186
+ if (name)
187
+ fields.set(name, part.subarray(headerEnd + 4));
188
+ offset = next;
189
+ }
190
+ if (this.failNextUploads > 0) {
191
+ this.failNextUploads -= 1;
192
+ return { status: 500, body: "<Error><Code>InternalError</Code></Error>" };
193
+ }
194
+ const policyText = fields.get("policy")?.toString("utf8");
195
+ const policy = policyText ? JSON.parse(Buffer.from(policyText, "base64").toString("utf8")) : null;
196
+ if (!policy)
197
+ return { status: 403, body: "<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Policy missing</Message></Error>" };
198
+ if (Date.parse(policy.expiration) <= now)
199
+ return { status: 403, body: "<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Policy expired.</Message></Error>" };
200
+ const key = fields.get("key")?.toString("utf8") ?? "";
201
+ const grantId = fields.get("x-amz-meta-grant-id")?.toString("utf8");
202
+ const grant = this.grants.find((g) => g.grantId === grantId);
203
+ if (!grant || !key.startsWith(grant.keyPrefix))
204
+ return { status: 403, body: "<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Policy Condition failed: [\"starts-with\", \"$key\", ...]</Message></Error>" };
205
+ if (fields.get("Content-Type")?.toString("utf8") !== "application/x-ndjson")
206
+ return { status: 403, body: "<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: Content-Type</Message></Error>" };
207
+ if (fields.get("x-amz-server-side-encryption")?.toString("utf8") !== "aws:kms")
208
+ return { status: 403, body: "<Error><Code>AccessDenied</Code><Message>Invalid according to Policy: SSE</Message></Error>" };
209
+ const file = fields.get("file");
210
+ if (!file)
211
+ return { status: 400, body: "<Error><Code>InvalidArgument</Code><Message>POST requires exactly one file upload per request.</Message></Error>" };
212
+ if (file.length > 1048576)
213
+ return { status: 400, body: "<Error><Code>EntityTooLarge</Code></Error>" };
214
+ this.objects.set(key, Buffer.from(file));
215
+ this.uploads.push(key);
216
+ return { status: 204, body: "" };
217
+ }
218
+ promote(slots, options = {}) {
219
+ const sorted = [...slots].sort((a, b) => (a.tag < b.tag ? -1 : 1));
220
+ this.generation = options.generation ?? this.generation + 1;
221
+ const payload = {
222
+ protocol: exports.PROTOCOL,
223
+ ...this.scope,
224
+ generation: this.generation,
225
+ releaseDigest: (0, trust_js_1.releaseDigest)(sorted),
226
+ issuedAt: new Date().toISOString(),
227
+ leaseSeconds: options.leaseSeconds ?? 3600,
228
+ onLeaseExpiry: options.onLeaseExpiry ?? "degrade",
229
+ applyPolicy: options.applyPolicy ?? "auto",
230
+ ...(options.unlockWindow ? { unlockWindow: options.unlockWindow } : {}),
231
+ requireCountersign: this.requireCountersign,
232
+ slots: sorted,
233
+ ...(options.experiment ? { experiment: options.experiment } : {}),
234
+ directives: options.directives ?? [],
235
+ };
236
+ const signer = options.signWith ?? this.signingKey;
237
+ const manifest = { payload, signatures: [{ keyId: (0, trust_js_1.keyThumbprint)(signer), alg: "ES256", sig: (0, trust_js_1.signBytes)((0, canonicalJson_js_1.canonicalBytes)(payload), signer) }], countersignatures: [] };
238
+ const bytes = Buffer.from(JSON.stringify(manifest), "utf8");
239
+ this.current = { manifest, bytes, etag: (0, canonicalJson_js_1.sha256Prefixed)(bytes) };
240
+ this.edgeEtag += 1;
241
+ return manifest;
242
+ }
243
+ get manifest() {
244
+ return this.current?.manifest ?? null;
245
+ }
246
+ /** The `fetch` the SDK sees. */
247
+ fetch() {
248
+ const respond = (status, body = "", headers = {}) => ({
249
+ status,
250
+ headers: { get: (name) => headers[name.toLowerCase()] ?? null },
251
+ /** Every header, for a test that bridges this fake onto a real HTTP listener. */
252
+ headerEntries: Object.entries(headers),
253
+ arrayBuffer: async () => {
254
+ // A Buffer may be a view into a shared pool: copy exactly its bytes, never the pool.
255
+ const bytes = typeof body === "string" ? Buffer.from(body, "utf8") : body;
256
+ return new Uint8Array(bytes).buffer;
257
+ },
258
+ text: async () => (typeof body === "string" ? body : body.toString("utf8")),
259
+ });
260
+ return async (url, init) => {
261
+ this.requests.push(url);
262
+ const auth = init?.headers?.authorization ?? init?.headers?.Authorization;
263
+ const parsed = new URL(url);
264
+ if (parsed.pathname.endsWith("/generation.json")) {
265
+ if (!this.current)
266
+ return respond(404);
267
+ if (this.pinnedPointer) {
268
+ // The pinned pointer: the same stale answer, the same ETag, forever.
269
+ const pinnedEtag = `"edge-pinned-${this.pinnedPointer.generation}"`;
270
+ if (init?.headers?.["if-none-match"] === pinnedEtag)
271
+ return respond(304);
272
+ return respond(200, JSON.stringify({ generation: this.pinnedPointer.generation, releaseDigest: this.current.manifest.payload.releaseDigest, leaseSeconds: this.current.manifest.payload.leaseSeconds }), { etag: pinnedEtag });
273
+ }
274
+ const etag = `"edge-${this.edgeEtag}"`;
275
+ if (init?.headers?.["if-none-match"] === etag)
276
+ return respond(304);
277
+ return respond(200, JSON.stringify({ generation: this.current.manifest.payload.generation, releaseDigest: this.current.manifest.payload.releaseDigest, leaseSeconds: this.current.manifest.payload.leaseSeconds }), { etag });
278
+ }
279
+ if (parsed.pathname.endsWith("/root.json"))
280
+ return respond(200, JSON.stringify(this.root));
281
+ if (parsed.pathname === "/s3/agent-telemetry") {
282
+ const reply = this.acceptUpload(init, this.now());
283
+ return respond(reply.status, reply.body, { "content-type": "application/xml" });
284
+ }
285
+ if (auth !== `Bearer ${this.apiKey}`)
286
+ return respond(401, JSON.stringify({ error: "Unauthorized" }));
287
+ // T23: the hosted catalogue — the manifest's tags, variables, step ids and experiment, no payloads.
288
+ const slotsMatch = /^\/v1\/agents\/([^/]+)\/targets\/([^/]+)\/slots$/.exec(parsed.pathname);
289
+ if (slotsMatch) {
290
+ if (slotsMatch[1] !== this.scope.agentId || slotsMatch[2] !== this.scope.target)
291
+ return respond(403, JSON.stringify({ error: "Forbidden", code: "forbidden", detail: slotsMatch[1] !== this.scope.agentId ? "agent_mismatch" : "target_mismatch" }));
292
+ if (!this.current)
293
+ return respond(404, JSON.stringify({ error: "nothing is promoted to this environment", code: "nothing_promoted" }));
294
+ const payload = this.current.manifest.payload;
295
+ return respond(200, JSON.stringify({ agentId: payload.agentId, target: payload.target, generation: payload.generation, releaseDigest: payload.releaseDigest, slots: payload.slots.map((pin) => ({ tag: pin.tag, kind: pin.kind, model: pin.model, variables: pin.variables, steps: pin.steps ? pin.steps.map((s) => ({ stepId: s.stepId })) : null })), experiment: payload.experiment ? { salt: payload.experiment.salt, subjectKey: payload.experiment.subjectKey, arms: payload.experiment.arms.map((a) => a.arm) } : null }), { "x-agent-generation": String(payload.generation) });
296
+ }
297
+ // T9: the heartbeat — the protocol schema's required keys, content-free; answers the cadence and the expiry.
298
+ const heartbeatMatch = /^\/v1\/agents\/([^/]+)\/targets\/([^/]+)\/heartbeat$/.exec(parsed.pathname);
299
+ if (heartbeatMatch) {
300
+ if (heartbeatMatch[1] !== this.scope.agentId || heartbeatMatch[2] !== this.scope.target)
301
+ return respond(403, JSON.stringify({ error: "x", details: { code: heartbeatMatch[1] !== this.scope.agentId ? "agent_mismatch" : "target_mismatch" } }));
302
+ if (this.heartbeatRefusal)
303
+ return respond(this.heartbeatRefusal.status, JSON.stringify({ error: "x", details: { code: this.heartbeatRefusal.code } }));
304
+ const body = JSON.parse(typeof init?.body === "string" ? init.body : init?.body ? Buffer.from(init.body).toString("utf8") : "{}");
305
+ for (const key of ["protocol", "instanceId", "sdk", "syncMode", "generation", "applyState", "storageProtection", "catalog", "lease", "spool"]) {
306
+ if (!(key in body))
307
+ return respond(400, JSON.stringify({ error: `heartbeat: missing ${key}` }));
308
+ }
309
+ for (const key of Object.keys(body)) {
310
+ if (!["protocol", "instanceId", "instanceClass", "sdk", "host", "syncMode", "heartbeatIntervalSeconds", "generation", "activeReleaseDigest", "stagedReleaseDigest", "applyState", "refusal", "signingKeyId", "storageProtection", "catalog", "lease", "localRollback", "spool", "unlockRequestsSeen", "disabled", "applyPolicy"].includes(key))
311
+ return respond(400, JSON.stringify({ error: `heartbeat: unknown ${key}` }));
312
+ }
313
+ this.heartbeats.push(body);
314
+ const answer = { pollSeconds: 30, uploadIntervalSeconds: this.uploadIntervalSeconds, heartbeatIntervalSeconds: this.heartbeatIntervalSeconds, expiresAt: new Date(Date.now() + this.heartbeatIntervalSeconds * 3000).toISOString() };
315
+ // S3: the authenticated answer names the origin's generation; a runtime whose pointer says less goes to the manifest.
316
+ if (this.heartbeatLatestGeneration)
317
+ answer.latestGeneration = this.current?.manifest.payload.generation ?? 0;
318
+ if (this.grantBaseUrl) {
319
+ if (this.grantHold)
320
+ answer.retryAfterSeconds = this.grantHold.retryAfterSeconds;
321
+ else
322
+ answer.uploadGrant = this.issueGrant(String(body.instanceId), this.now());
323
+ }
324
+ return respond(200, JSON.stringify(answer), { "content-type": "application/json" });
325
+ }
326
+ const manifestMatch = /^\/v1\/agents\/([^/]+)\/targets\/([^/]+)\/manifest$/.exec(parsed.pathname);
327
+ if (manifestMatch) {
328
+ if (manifestMatch[1] !== this.scope.agentId)
329
+ return respond(403, JSON.stringify({ error: "x", details: { code: "agent_mismatch" } }));
330
+ if (manifestMatch[2] !== this.scope.target)
331
+ return respond(403, JSON.stringify({ error: "x", details: { code: "target_mismatch" } }));
332
+ if (!this.current)
333
+ return respond(404, JSON.stringify({ error: "Not found" }));
334
+ if (init?.headers?.["if-none-match"] === this.current.etag)
335
+ return respond(304, "", { etag: this.current.etag });
336
+ return respond(200, this.current.bytes, { etag: this.current.etag, "x-agent-generation": String(this.current.manifest.payload.generation), "content-type": "application/json" });
337
+ }
338
+ const payloadMatch = /^\/v1\/agents\/([^/]+)\/payloads\/(sha256:[0-9a-f]{64})$/.exec(parsed.pathname);
339
+ if (payloadMatch) {
340
+ const bytes = this.payloads.get(payloadMatch[2]);
341
+ return bytes ? respond(200, bytes) : respond(404, JSON.stringify({ error: "Not found" }));
342
+ }
343
+ return respond(404, JSON.stringify({ error: "Not found" }));
344
+ };
345
+ }
346
+ }
347
+ exports.FakeControlPlane = FakeControlPlane;
348
+ /** The fake behind a real HTTP listener, for daemons and CLIs that run as their own process — and `airprompter dev` (S12). */
349
+ async function serveOverHttp(plane, listen = {}) {
350
+ const { createServer } = await Promise.resolve().then(() => __importStar(require("node:http")));
351
+ const fetchImpl = plane.fetch();
352
+ const server = createServer((request, response) => {
353
+ void (async () => {
354
+ const headers = {};
355
+ for (const [name, value] of Object.entries(request.headers))
356
+ if (typeof value === "string")
357
+ headers[name.toLowerCase()] = value;
358
+ const url = `http://${request.headers.host ?? "127.0.0.1"}${request.url ?? "/"}`;
359
+ const chunks = [];
360
+ for await (const chunk of request)
361
+ chunks.push(Buffer.from(chunk));
362
+ const raw = Buffer.concat(chunks);
363
+ const body = raw.length === 0 ? undefined : headers["content-type"]?.startsWith("multipart/") ? raw : raw.toString("utf8");
364
+ const result = (await fetchImpl(url, { method: request.method ?? "GET", headers, ...(body !== undefined ? { body } : {}) }));
365
+ const answer = Buffer.from(await result.arrayBuffer());
366
+ response.writeHead(result.status, Object.fromEntries(result.headerEntries ?? []));
367
+ response.end(answer);
368
+ })();
369
+ });
370
+ const host = listen.host ?? "127.0.0.1";
371
+ await new Promise((resolve, reject) => {
372
+ server.once("error", reject);
373
+ server.listen(listen.port ?? 0, host, () => {
374
+ server.off("error", reject);
375
+ resolve();
376
+ });
377
+ });
378
+ const address = server.address();
379
+ return { baseUrl: `http://${host.includes(":") ? `[${host}]` : host}:${address.port}`, close: () => new Promise((resolve) => server.close(() => resolve())) };
380
+ }
381
+ //# sourceMappingURL=controlPlane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controlPlane.js","sourceRoot":"","sources":["../../../src/testing/controlPlane.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * The testing kit (S2, AIR-1970): what our own vectors run over and what a
4
+ * customer's CI can import to prove the same things about their host —
5
+ * a filesystem that fills, fails and loses files (`MemoryFs`), a clock
6
+ * that advances and skews (`FakeClock`), and the fake registry the SDK
7
+ * tests use (`FakeControlPlane`: signed manifests, refusals, lease and a
8
+ * 15-minute upload grant that expires). Nothing here is ever loaded by the
9
+ * runtime.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FakeClock = exports.serveOverHttp = exports.rootDocument = exports.newKey = exports.PROTOCOL = exports.FakeControlPlane = exports.MemoryFs = void 0;
13
+ var memoryFs_js_1 = require("./memoryFs.js");
14
+ Object.defineProperty(exports, "MemoryFs", { enumerable: true, get: function () { return memoryFs_js_1.MemoryFs; } });
15
+ var controlPlane_js_1 = require("./controlPlane.js");
16
+ Object.defineProperty(exports, "FakeControlPlane", { enumerable: true, get: function () { return controlPlane_js_1.FakeControlPlane; } });
17
+ Object.defineProperty(exports, "PROTOCOL", { enumerable: true, get: function () { return controlPlane_js_1.PROTOCOL; } });
18
+ Object.defineProperty(exports, "newKey", { enumerable: true, get: function () { return controlPlane_js_1.newKey; } });
19
+ Object.defineProperty(exports, "rootDocument", { enumerable: true, get: function () { return controlPlane_js_1.rootDocument; } });
20
+ Object.defineProperty(exports, "serveOverHttp", { enumerable: true, get: function () { return controlPlane_js_1.serveOverHttp; } });
21
+ /** A clock a test moves by hand: `advance(ms)`, or `skew(ms)` to model a host whose clock is off. */
22
+ class FakeClock {
23
+ currentMs;
24
+ offsetMs = 0;
25
+ constructor(currentMs = Date.UTC(2026, 8, 13, 12, 0, 0)) {
26
+ this.currentMs = currentMs;
27
+ }
28
+ nowMs() {
29
+ return this.currentMs + this.offsetMs;
30
+ }
31
+ advance(ms) {
32
+ this.currentMs += ms;
33
+ }
34
+ set(ms) {
35
+ this.currentMs = ms;
36
+ }
37
+ /** Two hosts with the same `currentMs` and different skews disagree by the difference — the ramp walk's vector. */
38
+ skew(ms) {
39
+ this.offsetMs = ms;
40
+ }
41
+ /** The `now` callback the facade and uploader accept. */
42
+ now = () => this.nowMs();
43
+ }
44
+ exports.FakeClock = FakeClock;
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,6CAAyC;AAAhC,uGAAA,QAAQ,OAAA;AACjB,qDAAmH;AAA1G,mHAAA,gBAAgB,OAAA;AAAE,2GAAA,QAAQ,OAAA;AAAE,yGAAA,MAAM,OAAA;AAAE,+GAAA,YAAY,OAAA;AAAE,gHAAA,aAAa,OAAA;AAExE,qGAAqG;AACrG,MAAa,SAAS;IAEA;IADZ,QAAQ,GAAG,CAAC,CAAC;IACrB,YAAoB,YAAoB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAAnD,cAAS,GAAT,SAAS,CAA0C;IAAG,CAAC;IAC3E,KAAK;QACH,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,EAAU;QACZ,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,mHAAmH;IACnH,IAAI,CAAC,EAAU;QACb,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IACD,yDAAyD;IAChD,GAAG,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;CAC3C;AAlBD,8BAkBC"}