alasio 8.0.0 → 10.0.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/dist/cli/src/api-server.js +18 -0
- package/dist/cli/src/api-server.js.map +1 -0
- package/dist/cli/src/bound-harnesses.js +98 -0
- package/dist/cli/src/bound-harnesses.js.map +1 -0
- package/dist/cli/src/branches.js +79 -22
- package/dist/cli/src/branches.js.map +1 -1
- package/dist/cli/src/cluster/docker.js +40 -15
- package/dist/cli/src/cluster/docker.js.map +1 -1
- package/dist/cli/src/cluster/host.js +38 -8
- package/dist/cli/src/cluster/host.js.map +1 -1
- package/dist/cli/src/cluster/k3s.js +105 -14
- package/dist/cli/src/cluster/k3s.js.map +1 -1
- package/dist/cli/src/cluster/node.js +142 -33
- package/dist/cli/src/cluster/node.js.map +1 -1
- package/dist/cli/src/cluster/stargz.js +92 -0
- package/dist/cli/src/cluster/stargz.js.map +1 -0
- package/dist/cli/src/commands/branch.js +5 -4
- package/dist/cli/src/commands/branch.js.map +1 -1
- package/dist/cli/src/commands/common.js +11 -5
- package/dist/cli/src/commands/common.js.map +1 -1
- package/dist/cli/src/commands/folder.js +14 -0
- package/dist/cli/src/commands/folder.js.map +1 -0
- package/dist/cli/src/commands/lake.js +1 -1
- package/dist/cli/src/commands/lake.js.map +1 -1
- package/dist/cli/src/commands/login-relay.js +91 -0
- package/dist/cli/src/commands/login-relay.js.map +1 -0
- package/dist/cli/src/commands/login.js +11 -10
- package/dist/cli/src/commands/login.js.map +1 -1
- package/dist/cli/src/commands/logs.js +89 -6
- package/dist/cli/src/commands/logs.js.map +1 -1
- package/dist/cli/src/commands/restart.js +10 -4
- package/dist/cli/src/commands/restart.js.map +1 -1
- package/dist/cli/src/commands/restore-filer-store.js +27 -10
- package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
- package/dist/cli/src/commands/status.js +119 -20
- package/dist/cli/src/commands/status.js.map +1 -1
- package/dist/cli/src/commands/uninstall.js +8 -9
- package/dist/cli/src/commands/uninstall.js.map +1 -1
- package/dist/cli/src/commands/up.js +20 -9
- package/dist/cli/src/commands/up.js.map +1 -1
- package/dist/cli/src/commands/upgrade.js +22 -6
- package/dist/cli/src/commands/upgrade.js.map +1 -1
- package/dist/cli/src/commands.js +2 -1
- package/dist/cli/src/commands.js.map +1 -1
- package/dist/cli/src/config.js +4 -1
- package/dist/cli/src/config.js.map +1 -1
- package/dist/cli/src/cpu-baseline.js +8 -4
- package/dist/cli/src/cpu-baseline.js.map +1 -1
- package/dist/cli/src/folders.js +63 -0
- package/dist/cli/src/folders.js.map +1 -0
- package/dist/cli/src/gateway-calls.js +64 -0
- package/dist/cli/src/gateway-calls.js.map +1 -0
- package/dist/cli/src/install.js +45 -31
- package/dist/cli/src/install.js.map +1 -1
- package/dist/cli/src/kept-releases.js +27 -20
- package/dist/cli/src/kept-releases.js.map +1 -1
- package/dist/cli/src/kube/api.js +61 -15
- package/dist/cli/src/kube/api.js.map +1 -1
- package/dist/cli/src/kube/apply.js +122 -81
- package/dist/cli/src/kube/apply.js.map +1 -1
- package/dist/cli/src/kube/rollout.js +43 -21
- package/dist/cli/src/kube/rollout.js.map +1 -1
- package/dist/cli/src/main.js +2 -1
- package/dist/cli/src/main.js.map +1 -1
- package/dist/cli/src/manifests/admission.js +558 -222
- package/dist/cli/src/manifests/admission.js.map +1 -1
- package/dist/cli/src/manifests/alasio.js +180 -428
- package/dist/cli/src/manifests/alasio.js.map +1 -1
- package/dist/cli/src/manifests/branch.js +16 -27
- package/dist/cli/src/manifests/branch.js.map +1 -1
- package/dist/cli/src/manifests/codex-login.js +101 -0
- package/dist/cli/src/manifests/codex-login.js.map +1 -0
- package/dist/cli/src/manifests/collector.js +83 -62
- package/dist/cli/src/manifests/collector.js.map +1 -1
- package/dist/cli/src/manifests/common.js +82 -25
- package/dist/cli/src/manifests/common.js.map +1 -1
- package/dist/cli/src/manifests/config.js +137 -105
- package/dist/cli/src/manifests/config.js.map +1 -1
- package/dist/cli/src/manifests/disruption.js +18 -3
- package/dist/cli/src/manifests/disruption.js.map +1 -1
- package/dist/cli/src/manifests/folders.js +131 -0
- package/dist/cli/src/manifests/folders.js.map +1 -0
- package/dist/cli/src/manifests/grafana.js +4 -2
- package/dist/cli/src/manifests/grafana.js.map +1 -1
- package/dist/cli/src/manifests/harness-pools.js +236 -0
- package/dist/cli/src/manifests/harness-pools.js.map +1 -0
- package/dist/cli/src/manifests/image-holder.js +61 -0
- package/dist/cli/src/manifests/image-holder.js.map +1 -0
- package/dist/cli/src/manifests/index.js +14 -7
- package/dist/cli/src/manifests/index.js.map +1 -1
- package/dist/cli/src/manifests/keda.js +4 -2
- package/dist/cli/src/manifests/keda.js.map +1 -1
- package/dist/cli/src/manifests/lake.js +18 -20
- package/dist/cli/src/manifests/lake.js.map +1 -1
- package/dist/cli/src/manifests/log.js +84 -19
- package/dist/cli/src/manifests/log.js.map +1 -1
- package/dist/cli/src/manifests/neon.js +60 -80
- package/dist/cli/src/manifests/neon.js.map +1 -1
- package/dist/cli/src/manifests/network-policies.js +232 -94
- package/dist/cli/src/manifests/network-policies.js.map +1 -1
- package/dist/cli/src/manifests/node-agent.js +42 -15
- package/dist/cli/src/manifests/node-agent.js.map +1 -1
- package/dist/cli/src/manifests/object-store.js +99 -25
- package/dist/cli/src/manifests/object-store.js.map +1 -1
- package/dist/cli/src/manifests/sandbox-gateway.js +761 -0
- package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
- package/dist/cli/src/manifests/scalers.js +17 -5
- package/dist/cli/src/manifests/scalers.js.map +1 -1
- package/dist/cli/src/manifests/sizing.js +17 -9
- package/dist/cli/src/manifests/sizing.js.map +1 -1
- package/dist/cli/src/manifests/valkey.js +30 -10
- package/dist/cli/src/manifests/valkey.js.map +1 -1
- package/dist/cli/src/manifests/volume-lock.js +43 -0
- package/dist/cli/src/manifests/volume-lock.js.map +1 -0
- package/dist/cli/src/manifests/vpa.js +15 -2
- package/dist/cli/src/manifests/vpa.js.map +1 -1
- package/dist/cli/src/manifests/workspace-storage.js +182 -94
- package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
- package/dist/cli/src/neon-storage.js +54 -16
- package/dist/cli/src/neon-storage.js.map +1 -1
- package/dist/cli/src/release.js +9 -9
- package/dist/cli/src/release.js.map +1 -1
- package/dist/cli/src/setup-pod.js +44 -0
- package/dist/cli/src/setup-pod.js.map +1 -0
- package/dist/cli/src/target.js +2 -2
- package/dist/cli/src/target.js.map +1 -1
- package/dist/cli/src/telegram.js +13 -4
- package/dist/cli/src/telegram.js.map +1 -1
- package/dist/cli/src/wakes.js +68 -0
- package/dist/cli/src/wakes.js.map +1 -0
- package/dist/cli/src/webhook.js +5 -2
- package/dist/cli/src/webhook.js.map +1 -1
- package/dist/cluster/node/pins.json +11 -5
- package/dist/neon/control/branches.js +13 -6
- package/dist/neon/control/branches.js.map +1 -1
- package/dist/neon/control/endpoints.js +81 -10
- package/dist/neon/control/endpoints.js.map +1 -1
- package/dist/neon/control/secrets.js +24 -8
- package/dist/neon/control/secrets.js.map +1 -1
- package/dist/src/binder/bindings.js +195 -0
- package/dist/src/binder/bindings.js.map +1 -0
- package/dist/src/binder/names.js +63 -0
- package/dist/src/binder/names.js.map +1 -0
- package/dist/src/binder/tokens.js +71 -0
- package/dist/src/binder/tokens.js.map +1 -0
- package/dist/src/branch/names.js +20 -6
- package/dist/src/branch/names.js.map +1 -1
- package/dist/src/events/names.js +28 -0
- package/dist/src/events/names.js.map +1 -0
- package/dist/src/gateway/names.js +240 -0
- package/dist/src/gateway/names.js.map +1 -0
- package/dist/src/harness/names.js +67 -0
- package/dist/src/harness/names.js.map +1 -0
- package/dist/src/kube/client.js +212 -0
- package/dist/src/kube/client.js.map +1 -0
- package/dist/src/kube/sandbox-shape.js +14 -68
- package/dist/src/kube/sandbox-shape.js.map +1 -1
- package/dist/src/kube/started-map.js +12 -0
- package/dist/src/kube/started-map.js.map +1 -0
- package/dist/src/node-agent/names.js +62 -5
- package/dist/src/node-agent/names.js.map +1 -1
- package/dist/src/sandbox/names.js +12 -20
- package/dist/src/sandbox/names.js.map +1 -1
- package/dist/src/sandbox/otlp-resource.js +173 -0
- package/dist/src/sandbox/otlp-resource.js.map +1 -0
- package/dist/src/sandbox/telemetry.js +43 -0
- package/dist/src/sandbox/telemetry.js.map +1 -0
- package/dist/src/telegram/bot-commands.js +17 -0
- package/dist/src/telegram/bot-commands.js.map +1 -0
- package/dist/src/telegram/stop.js +12 -0
- package/dist/src/telegram/stop.js.map +1 -0
- package/dist/src/telemetry/config.js +131 -0
- package/dist/src/telemetry/config.js.map +1 -0
- package/dist/src/telemetry/forward.js +154 -0
- package/dist/src/telemetry/forward.js.map +1 -0
- package/package.json +1 -1
- package/dist/cli/src/manifests/agent-sandbox.js +0 -92
- package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
- package/dist/cli/src/manifests/juicefs-csi.js +0 -320
- package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
- package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
- package/dist/src/kube/config.js +0 -145
- package/dist/src/kube/config.js.map +0 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
const RESOURCE_LISTS = {
|
|
2
|
+
traces: ["resourceSpans", "scopeSpans"],
|
|
3
|
+
metrics: ["resourceMetrics", "scopeMetrics"],
|
|
4
|
+
logs: ["resourceLogs", "scopeLogs"],
|
|
5
|
+
};
|
|
6
|
+
/** Thrown for a request that does not parse as one, which is then not exported. */
|
|
7
|
+
export class MalformedRequest extends Error {
|
|
8
|
+
name = "MalformedRequest";
|
|
9
|
+
}
|
|
10
|
+
function isStamped(key, stamp) {
|
|
11
|
+
return Object.hasOwn(stamp, key) || key.startsWith("alasio.");
|
|
12
|
+
}
|
|
13
|
+
// --- Binary protobuf ----------------------------------------------------------
|
|
14
|
+
// The levels the resource is at, by field number, the same for all three signals:
|
|
15
|
+
// Export{Trace,Metrics,Logs}ServiceRequest 1: repeated Resource{Spans,Metrics,Logs}
|
|
16
|
+
// Resource{Spans,Metrics,Logs} 1: Resource
|
|
17
|
+
// Resource 1: repeated KeyValue attributes
|
|
18
|
+
// KeyValue 1: string key, 2: AnyValue value
|
|
19
|
+
// AnyValue 1: string string_value
|
|
20
|
+
const VARINT = 0;
|
|
21
|
+
const FIXED64 = 1;
|
|
22
|
+
const LEN = 2;
|
|
23
|
+
const FIXED32 = 5;
|
|
24
|
+
function readVarint(buf, at) {
|
|
25
|
+
let value = 0;
|
|
26
|
+
for (let shift = 0; shift < 64; shift += 7) {
|
|
27
|
+
const byte = buf[at++];
|
|
28
|
+
if (byte === undefined)
|
|
29
|
+
throw new MalformedRequest("truncated varint");
|
|
30
|
+
value += (byte & 0x7f) * 2 ** shift;
|
|
31
|
+
if ((byte & 0x80) === 0)
|
|
32
|
+
return [value, at];
|
|
33
|
+
}
|
|
34
|
+
throw new MalformedRequest("overlong varint");
|
|
35
|
+
}
|
|
36
|
+
/** Each field of a message: its number, wire type, whole encoding, and value. */
|
|
37
|
+
function* fields(buf) {
|
|
38
|
+
let at = 0;
|
|
39
|
+
while (at < buf.length) {
|
|
40
|
+
const start = at;
|
|
41
|
+
let tag;
|
|
42
|
+
[tag, at] = readVarint(buf, at);
|
|
43
|
+
const field = Math.floor(tag / 8);
|
|
44
|
+
const wire = tag % 8;
|
|
45
|
+
if (field === 0)
|
|
46
|
+
throw new MalformedRequest("field number 0");
|
|
47
|
+
let valueStart = at;
|
|
48
|
+
if (wire === VARINT)
|
|
49
|
+
[, at] = readVarint(buf, at);
|
|
50
|
+
else if (wire === FIXED64)
|
|
51
|
+
at += 8;
|
|
52
|
+
else if (wire === FIXED32)
|
|
53
|
+
at += 4;
|
|
54
|
+
else if (wire === LEN) {
|
|
55
|
+
let length;
|
|
56
|
+
[length, valueStart] = readVarint(buf, at);
|
|
57
|
+
at = valueStart + length;
|
|
58
|
+
}
|
|
59
|
+
else
|
|
60
|
+
throw new MalformedRequest(`wire type ${wire}`);
|
|
61
|
+
if (at > buf.length)
|
|
62
|
+
throw new MalformedRequest("truncated field");
|
|
63
|
+
yield { field, wire, whole: buf.subarray(start, at), value: buf.subarray(valueStart, at) };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** A message field's value, which must be length-delimited. */
|
|
67
|
+
function message({ field, wire, value }) {
|
|
68
|
+
if (wire !== LEN)
|
|
69
|
+
throw new MalformedRequest(`field ${field} has wire type ${wire}`);
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
function varint(value) {
|
|
73
|
+
const bytes = [];
|
|
74
|
+
for (; value >= 0x80; value = Math.floor(value / 128))
|
|
75
|
+
bytes.push((value % 128) | 0x80);
|
|
76
|
+
bytes.push(value);
|
|
77
|
+
return Buffer.from(bytes);
|
|
78
|
+
}
|
|
79
|
+
function lengthDelimited(field, bytes) {
|
|
80
|
+
return Buffer.concat([varint(field * 8 + LEN), varint(bytes.length), bytes]);
|
|
81
|
+
}
|
|
82
|
+
/** A KeyValue's key, the last given as protobuf merges them, or "" for none. */
|
|
83
|
+
function keyOf(keyValue) {
|
|
84
|
+
let key = "";
|
|
85
|
+
for (const field of fields(keyValue)) {
|
|
86
|
+
if (field.field === 1)
|
|
87
|
+
key = message(field).toString("utf8");
|
|
88
|
+
}
|
|
89
|
+
return key;
|
|
90
|
+
}
|
|
91
|
+
function stampedAttributesProtobuf(stamp) {
|
|
92
|
+
return Object.entries(stamp).map(([key, value]) => lengthDelimited(1, Buffer.concat([
|
|
93
|
+
lengthDelimited(1, Buffer.from(key, "utf8")),
|
|
94
|
+
lengthDelimited(2, lengthDelimited(1, Buffer.from(value, "utf8"))),
|
|
95
|
+
])));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* A Resource{Spans,Metrics,Logs} with one Resource: every Resource it held merged as
|
|
99
|
+
* protobuf merges repeated occurrences, less the stamped attributes, plus the stamp.
|
|
100
|
+
*/
|
|
101
|
+
function stampResourcePart(part, stamp) {
|
|
102
|
+
const resource = [];
|
|
103
|
+
const rest = [];
|
|
104
|
+
for (const field of fields(part)) {
|
|
105
|
+
if (field.field !== 1) {
|
|
106
|
+
rest.push(field.whole);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
for (const resourceField of fields(message(field))) {
|
|
110
|
+
if (resourceField.field === 1 && isStamped(keyOf(message(resourceField)), stamp))
|
|
111
|
+
continue;
|
|
112
|
+
resource.push(resourceField.whole);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return Buffer.concat([lengthDelimited(1, Buffer.concat([...resource, ...stampedAttributesProtobuf(stamp)])), ...rest]);
|
|
116
|
+
}
|
|
117
|
+
function stampProtobuf(body, stamp) {
|
|
118
|
+
return Buffer.concat([...fields(body)].map((field) => field.field === 1 ? lengthDelimited(1, stampResourcePart(message(field), stamp)) : field.whole));
|
|
119
|
+
}
|
|
120
|
+
// --- JSON ---------------------------------------------------------------------
|
|
121
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
122
|
+
function list(value, what) {
|
|
123
|
+
if (value === undefined)
|
|
124
|
+
return [];
|
|
125
|
+
if (!Array.isArray(value))
|
|
126
|
+
throw new MalformedRequest(`${what} is not a list`);
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
function object(value, what) {
|
|
130
|
+
if (value === undefined)
|
|
131
|
+
return {};
|
|
132
|
+
if (!isObject(value))
|
|
133
|
+
throw new MalformedRequest(`${what} is not an object`);
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
/** The fields of `source` named by `names` that it has. */
|
|
137
|
+
function only(source, names) {
|
|
138
|
+
return Object.fromEntries(names.filter((name) => source[name] !== undefined).map((name) => [name, source[name]]));
|
|
139
|
+
}
|
|
140
|
+
function stampJson(signal, body, stamp) {
|
|
141
|
+
let request;
|
|
142
|
+
try {
|
|
143
|
+
request = JSON.parse(body.toString("utf8"));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new MalformedRequest(error instanceof Error ? error.message : String(error));
|
|
147
|
+
}
|
|
148
|
+
const [partsName, scopesName] = RESOURCE_LISTS[signal];
|
|
149
|
+
const parts = list(object(request, "the request")[partsName], partsName).map((value) => {
|
|
150
|
+
const part = object(value, partsName);
|
|
151
|
+
const resource = object(part["resource"], "resource");
|
|
152
|
+
const attributes = list(resource["attributes"], "resource.attributes")
|
|
153
|
+
.filter((attribute) => !(isObject(attribute) && typeof attribute["key"] === "string" && isStamped(attribute["key"], stamp)));
|
|
154
|
+
return {
|
|
155
|
+
resource: {
|
|
156
|
+
...only(resource, ["droppedAttributesCount", "entityRefs"]),
|
|
157
|
+
attributes: [...attributes, ...Object.entries(stamp).map(([key, value]) => ({ key, value: { stringValue: value } }))],
|
|
158
|
+
},
|
|
159
|
+
...only(part, [scopesName, "schemaUrl"]),
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
return Buffer.from(JSON.stringify({ [partsName]: parts }), "utf8");
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* `body`, an OTLP export request for `signal` in `encoding` ("protobuf" or "json"),
|
|
166
|
+
* with its resources stamped. Throws MalformedRequest for one that does not parse.
|
|
167
|
+
*/
|
|
168
|
+
export function stampResources(signal, encoding, body, stamp) {
|
|
169
|
+
if (!Object.hasOwn(RESOURCE_LISTS, signal))
|
|
170
|
+
throw new Error(`unknown signal ${signal}`);
|
|
171
|
+
return encoding === "json" ? stampJson(signal, body, stamp) : stampProtobuf(body, stamp);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=otlp-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-resource.js","sourceRoot":"","sources":["../../../../src/sandbox/otlp-resource.ts"],"names":[],"mappings":"AAeA,MAAM,cAAc,GAAuE;IACzF,MAAM,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;IACvC,OAAO,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAC5C,IAAI,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;CACpC,CAAC;AAEF,mFAAmF;AACnF,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,GAAG,kBAAkB,CAAC;CACpC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAoB;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC;AAED,iFAAiF;AACjF,kFAAkF;AAClF,uFAAuF;AACvF,2DAA2D;AAC3D,+EAA+E;AAC/E,gFAAgF;AAChF,sEAAsE;AAEtE,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,GAAG,GAAG,CAAC,CAAC;AACd,MAAM,OAAO,GAAG,CAAC,CAAC;AAWlB,SAAS,UAAU,CAAC,GAAW,EAAE,EAAU;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,IAAI,GAAW,CAAC;QAChB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QACrB,IAAI,KAAK,KAAK,CAAC;YAAE,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC9D,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,KAAK,MAAM;YAAE,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aAC7C,IAAI,IAAI,KAAK,OAAO;YAAE,EAAE,IAAI,CAAC,CAAC;aAC9B,IAAI,IAAI,KAAK,OAAO;YAAE,EAAE,IAAI,CAAC,CAAC;aAC9B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,IAAI,MAAc,CAAC;YACnB,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC3C,EAAE,GAAG,UAAU,GAAG,MAAM,CAAC;QAC3B,CAAC;;YAAM,MAAM,IAAI,gBAAgB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM;YAAE,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAS;IAC5C,IAAI,IAAI,KAAK,GAAG;QAAE,MAAM,IAAI,gBAAgB,CAAC,SAAS,KAAK,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,eAAe,CAAC,KAAa,EAAE,KAAa;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,gFAAgF;AAChF,SAAS,KAAK,CAAC,QAAgB;IAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;YAAE,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAoB;IACrD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAChD,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;QAC/B,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5C,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;KACnE,CAAC,CAAC,CAAC,CAAC;AACT,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAoB;IAC3D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACnD,IAAI,aAAa,CAAC,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC;gBAAE,SAAS;YAC3F,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAoB;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnD,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,iFAAiF;AAEjF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE,SAAS,IAAI,CAAC,KAAc,EAAE,IAAY;IACxC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,GAAG,IAAI,gBAAgB,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,IAAY;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,gBAAgB,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2DAA2D;AAC3D,SAAS,IAAI,CAAC,MAA+B,EAAE,KAAwB;IACrE,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,KAAoB;IACnE,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,gBAAgB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACrF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,qBAAqB,CAAC;aACnE,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/H,OAAO;YACL,QAAQ,EAAE;gBACR,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,EAAE,YAAY,CAAC,CAAC;gBAC3D,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;aACtH;YACD,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;SACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,QAAsB,EAAE,IAAY,EAAE,KAAoB;IACvG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;IACxF,OAAO,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What bayma inside a session's sandbox exports its telemetry with, and what is stamped on
|
|
3
|
+
* it. A pool's pod's one way out without internet is the sandbox service's receiver
|
|
4
|
+
* (../receiver/receiver.ts), so its bayma exports there, with its binding's token, each signal
|
|
5
|
+
* the sandbox gateway exports, as the gateway tells the node agent attaching the workspace
|
|
6
|
+
* (../gateway/sessions.ts); the receiver stamps what arrives with what is known of the session
|
|
7
|
+
* and exports it where the stack's telemetry goes.
|
|
8
|
+
*/
|
|
9
|
+
import { parseKeyValueList, resolveTelemetry, sharedResourceAttributes, SIGNALS, telemetryEnabled } from "../telemetry/config.js";
|
|
10
|
+
/**
|
|
11
|
+
* The standard variables bayma inside a sandbox exports with, but for the endpoint and the
|
|
12
|
+
* token it sends, which are the sandbox's own: each signal `env`, the gateway's, exports, in
|
|
13
|
+
* the protocol it exports it in, and no other. Empty where it exports nothing.
|
|
14
|
+
*/
|
|
15
|
+
export function sandboxBaymaTelemetryEnv(env = process.env) {
|
|
16
|
+
const telemetry = resolveTelemetry(env);
|
|
17
|
+
if (!telemetryEnabled(telemetry))
|
|
18
|
+
return {};
|
|
19
|
+
const settings = {};
|
|
20
|
+
for (const signal of SIGNALS) {
|
|
21
|
+
const upper = signal.toUpperCase();
|
|
22
|
+
const exporter = telemetry[signal];
|
|
23
|
+
settings[`OTEL_${upper}_EXPORTER`] = exporter ? "otlp" : "none";
|
|
24
|
+
if (exporter)
|
|
25
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_PROTOCOL`] = exporter.protocol;
|
|
26
|
+
}
|
|
27
|
+
return settings;
|
|
28
|
+
}
|
|
29
|
+
/** The resource attributes a session's telemetry is stamped with. */
|
|
30
|
+
export function sandboxResource(volumeId, env = process.env) {
|
|
31
|
+
return { ...parseKeyValueList(sharedResourceAttributes(env)), "service.name": "bayma", "alasio.volume.id": volumeId };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* What a folder conversation's instance's telemetry is stamped with: bayma's, of the
|
|
35
|
+
* conversation, as alasio's own of the conversation is, and the harness it is under.
|
|
36
|
+
*/
|
|
37
|
+
export const folderResource = (harness, conversation, env = process.env) => ({
|
|
38
|
+
...parseKeyValueList(sharedResourceAttributes(env)),
|
|
39
|
+
"service.name": "bayma",
|
|
40
|
+
"alasio.conversation.id": conversation,
|
|
41
|
+
"alasio.harness": harness,
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../../src/sandbox/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGlI;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAG,GAAgC,OAAO,CAAC,GAAG;IACrF,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,QAAQ,CAAC,QAAQ,KAAK,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,IAAI,QAAQ;YAAE,QAAQ,CAAC,sBAAsB,KAAK,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACrF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAG,GAAgC,OAAO,CAAC,GAAG;IAC9F,OAAO,EAAE,GAAG,iBAAiB,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC;AACxH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,YAAoB,EAAE,GAAG,GAAgC,OAAO,CAAC,GAAG,EAAiB,EAAE,CAAC,CAAC;IACvI,GAAG,iBAAiB,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACnD,cAAc,EAAE,OAAO;IACvB,wBAAwB,EAAE,YAAY;IACtC,gBAAgB,EAAE,OAAO;CAC1B,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bot's commands, as Telegram's menu offers them: set by alasio's command line as it
|
|
3
|
+
* registers each environment's bot (cli/src/webhook.ts), not by alasio as it starts, which
|
|
4
|
+
* would ask Telegram the same of every start, and an environment that sleeps starts often.
|
|
5
|
+
* Free of anything but itself, so the command line takes it without the server.
|
|
6
|
+
*/
|
|
7
|
+
/** The bot's commands, in the menu's order. */
|
|
8
|
+
export const BOT_COMMANDS = [
|
|
9
|
+
{ command: "service", description: "Switch between Codex and Claude" },
|
|
10
|
+
{ command: "model", description: "Choose the model and effort" },
|
|
11
|
+
{ command: "workspace", description: "Choose, create or fork the workspace to work in" },
|
|
12
|
+
{ command: "session", description: "Manage the mounted agent session" },
|
|
13
|
+
{ command: "sessions", description: "Browse and mount agent sessions" },
|
|
14
|
+
{ command: "goal", description: "View or set the mounted session goal (Codex)" },
|
|
15
|
+
{ command: "stop", description: "Interrupt the active turn" },
|
|
16
|
+
];
|
|
17
|
+
//# sourceMappingURL=bot-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-commands.js","sourceRoot":"","sources":["../../../../src/telegram/bot-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACtE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE;IAChE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iDAAiD,EAAE;IACxF,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE;IACvE,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACvE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,8CAA8C,EAAE;IAChF,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;CAC9D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long an alasio is given to stop, as its Deployment says (cli/src/manifests/alasio.ts) and
|
|
3
|
+
* its drain keeps to (./drain.ts). Free of anything but itself, so the command line takes it
|
|
4
|
+
* without the app.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* How long an alasio is given to stop, in seconds: past the longest Telegram is waited for
|
|
8
|
+
* before a reply is sent again (./outbox.ts, five minutes), so a reply held off as it is told to
|
|
9
|
+
* stop is delivered still.
|
|
10
|
+
*/
|
|
11
|
+
export const STOP_GRACE_SECONDS = 360;
|
|
12
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/telegram/stop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which of alasio's signals are exported, and where, decided from the standard
|
|
3
|
+
* OpenTelemetry environment variables alone, so any OTLP backend works and none is
|
|
4
|
+
* assumed.
|
|
5
|
+
*
|
|
6
|
+
* A signal is exported when it has an endpoint, its own
|
|
7
|
+
* (`OTEL_EXPORTER_OTLP_<SIGNAL>_ENDPOINT`) or the shared one
|
|
8
|
+
* (`OTEL_EXPORTER_OTLP_ENDPOINT`), and `OTEL_<SIGNAL>_EXPORTER` is unset or `otlp`;
|
|
9
|
+
* `OTEL_SDK_DISABLED=true` turns every signal off. With no endpoint at all alasio
|
|
10
|
+
* exports nothing and loads no SDK.
|
|
11
|
+
*/
|
|
12
|
+
export const SIGNALS = ["traces", "metrics", "logs"];
|
|
13
|
+
const DEFAULT_PROTOCOL = "http/protobuf";
|
|
14
|
+
/** Variables that configure telemetry, which alasio hands no child as it is. */
|
|
15
|
+
const TELEMETRY_VARIABLE = /^(OTEL_.*|TRACEPARENT|TRACESTATE)$/u;
|
|
16
|
+
function setting(env, name) {
|
|
17
|
+
return env[name]?.trim() || null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The OTLP endpoint a signal is sent to: its own as given, else the shared one, to
|
|
21
|
+
* which OTLP over HTTP adds the signal's path and OTLP over gRPC adds nothing.
|
|
22
|
+
*/
|
|
23
|
+
function signalEndpoint(env, signal, protocol) {
|
|
24
|
+
const own = setting(env, `OTEL_EXPORTER_OTLP_${signal.toUpperCase()}_ENDPOINT`);
|
|
25
|
+
if (own)
|
|
26
|
+
return own;
|
|
27
|
+
const shared = setting(env, "OTEL_EXPORTER_OTLP_ENDPOINT");
|
|
28
|
+
if (!shared || protocol === "grpc")
|
|
29
|
+
return shared;
|
|
30
|
+
return `${shared.replace(/\/+$/u, "")}/v1/${signal}`;
|
|
31
|
+
}
|
|
32
|
+
/** How `signal` is exported, or null when it is not. */
|
|
33
|
+
function signalExporter(env, signal, disabled) {
|
|
34
|
+
const upper = signal.toUpperCase();
|
|
35
|
+
const exporter = setting(env, `OTEL_${upper}_EXPORTER`) ?? "otlp";
|
|
36
|
+
const protocol = setting(env, `OTEL_EXPORTER_OTLP_${upper}_PROTOCOL`)
|
|
37
|
+
?? setting(env, "OTEL_EXPORTER_OTLP_PROTOCOL")
|
|
38
|
+
?? DEFAULT_PROTOCOL;
|
|
39
|
+
const endpoint = signalEndpoint(env, signal, protocol);
|
|
40
|
+
if (disabled || exporter !== "otlp" || !endpoint) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return { endpoint, protocol, headers: signalHeaders(env, signal) };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `{ traces, metrics, logs }`, each `{ endpoint, protocol, headers }` for a signal
|
|
47
|
+
* alasio exports or null for one it does not. `headers` is the standard
|
|
48
|
+
* `key=value,key=value` list, or null.
|
|
49
|
+
*/
|
|
50
|
+
export function resolveTelemetry(env = process.env) {
|
|
51
|
+
const disabled = setting(env, "OTEL_SDK_DISABLED")?.toLowerCase() === "true";
|
|
52
|
+
return {
|
|
53
|
+
traces: signalExporter(env, "traces", disabled),
|
|
54
|
+
metrics: signalExporter(env, "metrics", disabled),
|
|
55
|
+
logs: signalExporter(env, "logs", disabled),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A signal's OTLP exporter setting `name` (HEADERS, TIMEOUT, ...): its own
|
|
60
|
+
* (`OTEL_EXPORTER_OTLP_<SIGNAL>_<NAME>`), else the shared one, or null.
|
|
61
|
+
*/
|
|
62
|
+
export function signalSetting(env, signal, name) {
|
|
63
|
+
return setting(env, `OTEL_EXPORTER_OTLP_${signal.toUpperCase()}_${name}`) ?? setting(env, `OTEL_EXPORTER_OTLP_${name}`);
|
|
64
|
+
}
|
|
65
|
+
/** The headers a signal is sent with: its own, else the shared ones, or null. */
|
|
66
|
+
export function signalHeaders(env, signal) {
|
|
67
|
+
return signalSetting(env, signal, "HEADERS");
|
|
68
|
+
}
|
|
69
|
+
/** Whether any signal is exported. */
|
|
70
|
+
export function telemetryEnabled(telemetry) {
|
|
71
|
+
return SIGNALS.some((signal) => telemetry[signal]);
|
|
72
|
+
}
|
|
73
|
+
/** An environment without the variables that configure telemetry. */
|
|
74
|
+
export function withoutTelemetry(env) {
|
|
75
|
+
return Object.fromEntries(Object.entries(env).filter(([name]) => !TELEMETRY_VARIABLE.test(name)));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The resource attributes a harness exporting telemetry of its own shares with alasio:
|
|
79
|
+
* the operator's `OTEL_RESOURCE_ATTRIBUTES`, which describe the deployment, without
|
|
80
|
+
* `service.name`, which is alasio's. The standard `key=value,key=value` list, or null.
|
|
81
|
+
*/
|
|
82
|
+
export function sharedResourceAttributes(env = process.env) {
|
|
83
|
+
const shared = (setting(env, "OTEL_RESOURCE_ATTRIBUTES") ?? "")
|
|
84
|
+
.split(",")
|
|
85
|
+
.filter((pair) => pair.trim() && pair.split("=")[0]?.trim() !== "service.name");
|
|
86
|
+
return shared.length ? shared.join(",") : null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The standard variables that have a process serving one conversation, Claude Code
|
|
90
|
+
* or bayma, export each signal alasio exports where alasio exports it, and no other:
|
|
91
|
+
* each exported signal's exporter, endpoint, protocol, and headers, every other
|
|
92
|
+
* signal's exporter none, and the deployment's resource attributes with the
|
|
93
|
+
* conversation's. Nothing when alasio exports nothing.
|
|
94
|
+
*/
|
|
95
|
+
export function conversationTelemetryEnv({ conversationId }, env = process.env) {
|
|
96
|
+
const telemetry = resolveTelemetry(env);
|
|
97
|
+
if (!telemetryEnabled(telemetry))
|
|
98
|
+
return {};
|
|
99
|
+
const settings = {
|
|
100
|
+
OTEL_RESOURCE_ATTRIBUTES: [sharedResourceAttributes(env), `alasio.conversation.id=${encodeURIComponent(conversationId)}`]
|
|
101
|
+
.filter(Boolean)
|
|
102
|
+
.join(","),
|
|
103
|
+
};
|
|
104
|
+
for (const signal of SIGNALS) {
|
|
105
|
+
const upper = signal.toUpperCase();
|
|
106
|
+
const exporter = telemetry[signal];
|
|
107
|
+
settings[`OTEL_${upper}_EXPORTER`] = exporter ? "otlp" : "none";
|
|
108
|
+
if (!exporter)
|
|
109
|
+
continue;
|
|
110
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_ENDPOINT`] = exporter.endpoint;
|
|
111
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_PROTOCOL`] = exporter.protocol;
|
|
112
|
+
if (exporter.headers)
|
|
113
|
+
settings[`OTEL_EXPORTER_OTLP_${upper}_HEADERS`] = exporter.headers;
|
|
114
|
+
}
|
|
115
|
+
return settings;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* A standard `key=value,key=value` list, such as OTLP headers or resource attributes, as
|
|
119
|
+
* an object, values URL-decoded.
|
|
120
|
+
*/
|
|
121
|
+
export function parseKeyValueList(list) {
|
|
122
|
+
if (!list)
|
|
123
|
+
return {};
|
|
124
|
+
return Object.fromEntries(list.split(",").flatMap((pair) => {
|
|
125
|
+
const at = pair.indexOf("=");
|
|
126
|
+
if (at <= 0)
|
|
127
|
+
return [];
|
|
128
|
+
return [[pair.slice(0, at).trim(), decodeURIComponent(pair.slice(at + 1).trim())]];
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/telemetry/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exports OTLP requests that something else encoded, as they are, over OTLP/HTTP to
|
|
3
|
+
* where alasio exports its own signals: what the sandbox service's receiver relays from
|
|
4
|
+
* inside a session's sandbox (src/receiver/receiver.ts). Each signal goes to its endpoint with its headers,
|
|
5
|
+
* timeout, compression, and TLS files from the standard variables, as OpenTelemetry's
|
|
6
|
+
* own exporters send alasio's, and is retried as they retry: on 429, 502, 503, and 504
|
|
7
|
+
* and on a failed connection, after the server's Retry-After or a jittered backoff,
|
|
8
|
+
* within the signal's timeout. alasio's deployment has it export to the stack's
|
|
9
|
+
* collector over OTLP/HTTP, which bayma exports over too.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { Agent as HttpAgent, request as httpRequest } from "node:http";
|
|
13
|
+
import { Agent as HttpsAgent, request as httpsRequest } from "node:https";
|
|
14
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
15
|
+
import { gzipSync } from "node:zlib";
|
|
16
|
+
import { context } from "@opentelemetry/api";
|
|
17
|
+
import { suppressTracing } from "@opentelemetry/core";
|
|
18
|
+
import { parseKeyValueList, resolveTelemetry, SIGNALS, signalSetting } from "./config.js";
|
|
19
|
+
const CONTENT_TYPES = { protobuf: "application/x-protobuf", json: "application/json" };
|
|
20
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
21
|
+
const RETRYABLE_STATUS = new Set([429, 502, 503, 504]);
|
|
22
|
+
const MAX_RETRIES = 5;
|
|
23
|
+
const INITIAL_BACKOFF_MS = 1000;
|
|
24
|
+
const MAX_BACKOFF_MS = 5000;
|
|
25
|
+
const BACKOFF_MULTIPLIER = 1.5;
|
|
26
|
+
const JITTER = 0.2;
|
|
27
|
+
// A response body is never needed, only drained; one this large is not an OTLP server's.
|
|
28
|
+
const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
29
|
+
/** The milliseconds a Retry-After header asks to wait, or null. */
|
|
30
|
+
export function retryAfterMs(header, now = Date.now()) {
|
|
31
|
+
if (!header)
|
|
32
|
+
return null;
|
|
33
|
+
const seconds = Number(header);
|
|
34
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
35
|
+
return seconds * 1000;
|
|
36
|
+
const at = Date.parse(header);
|
|
37
|
+
return Number.isNaN(at) ? null : Math.max(0, at - now);
|
|
38
|
+
}
|
|
39
|
+
const TLS_FILES = [["ca", "CERTIFICATE"], ["cert", "CLIENT_CERTIFICATE"], ["key", "CLIENT_KEY"]];
|
|
40
|
+
function tlsFiles(env, signal, warn) {
|
|
41
|
+
const files = {};
|
|
42
|
+
for (const [option, name] of TLS_FILES) {
|
|
43
|
+
const path = signalSetting(env, signal, name);
|
|
44
|
+
if (!path)
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
files[option] = readFileSync(path);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
warn(`${signal}: cannot read OTEL_EXPORTER_OTLP_${name} ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return files;
|
|
54
|
+
}
|
|
55
|
+
/** How each exported signal is sent, from the standard variables. */
|
|
56
|
+
function signalTargets(env, warn) {
|
|
57
|
+
const telemetry = resolveTelemetry(env);
|
|
58
|
+
const targets = {};
|
|
59
|
+
for (const signal of SIGNALS) {
|
|
60
|
+
const exporter = telemetry[signal];
|
|
61
|
+
if (!exporter)
|
|
62
|
+
continue;
|
|
63
|
+
const url = new URL(exporter.endpoint);
|
|
64
|
+
const timeout = Number(signalSetting(env, signal, "TIMEOUT"));
|
|
65
|
+
const https = url.protocol === "https:";
|
|
66
|
+
targets[signal] = {
|
|
67
|
+
url,
|
|
68
|
+
protocol: exporter.protocol,
|
|
69
|
+
headers: parseKeyValueList(exporter.headers),
|
|
70
|
+
timeoutMs: Number.isFinite(timeout) && timeout > 0 ? timeout : DEFAULT_TIMEOUT_MS,
|
|
71
|
+
gzip: signalSetting(env, signal, "COMPRESSION") === "gzip",
|
|
72
|
+
request: https ? httpsRequest : httpRequest,
|
|
73
|
+
agent: https ? new HttpsAgent({ keepAlive: true, ...tlsFiles(env, signal, warn) }) : new HttpAgent({ keepAlive: true }),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return targets;
|
|
77
|
+
}
|
|
78
|
+
/** One POST: `{ status, retryAfter }`, or `{ error }` for a connection that failed. */
|
|
79
|
+
function post(target, body, headers, timeoutMs, signal) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
// alasio's own HTTP instrumentation would otherwise trace every export it relays.
|
|
82
|
+
context.with(suppressTracing(context.active()), () => {
|
|
83
|
+
const req = target.request(target.url, { method: "POST", agent: target.agent, headers, timeout: timeoutMs, ...(signal ? { signal } : {}) }, (res) => {
|
|
84
|
+
let received = 0;
|
|
85
|
+
res.on("data", (chunk) => {
|
|
86
|
+
received += chunk.length;
|
|
87
|
+
if (received > MAX_RESPONSE_BYTES)
|
|
88
|
+
res.destroy();
|
|
89
|
+
});
|
|
90
|
+
res.on("error", () => { });
|
|
91
|
+
res.on("close", () => resolve({ status: res.statusCode, retryAfter: retryAfterMs(res.headers["retry-after"]) }));
|
|
92
|
+
});
|
|
93
|
+
req.on("timeout", () => req.destroy(new Error(`no response within ${timeoutMs}ms`)));
|
|
94
|
+
req.on("error", (error) => resolve({ error }));
|
|
95
|
+
req.end(body);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The forwarder for the signals `env` exports. `protocols` maps each signal it forwards
|
|
101
|
+
* to the protocol alasio exports it over (http/protobuf or http/json); a signal it does
|
|
102
|
+
* not forward is absent. `export(signal, encoding, body)` sends one request, encoded as
|
|
103
|
+
* `encoding` ("protobuf" or "json"), within the signal's timeout or `withinMs` where less,
|
|
104
|
+
* and resolves `{ ok: true }` once a server took it, or `{ ok: false, ... }` once it is given
|
|
105
|
+
* up on (ForwardResult), or `signal` aborts it, which ends the request it is sending.
|
|
106
|
+
* `close()` ends the connections it keeps open.
|
|
107
|
+
*/
|
|
108
|
+
export function createOtlpForwarder(env = process.env, { warn = () => { } } = {}) {
|
|
109
|
+
const targets = signalTargets(env, warn);
|
|
110
|
+
const protocols = {};
|
|
111
|
+
for (const signal of SIGNALS) {
|
|
112
|
+
const target = targets[signal];
|
|
113
|
+
if (target)
|
|
114
|
+
protocols[signal] = target.protocol;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
protocols,
|
|
118
|
+
async export(signal, encoding, body, { withinMs, signal: abort } = {}) {
|
|
119
|
+
const target = targets[signal];
|
|
120
|
+
if (!target)
|
|
121
|
+
return { ok: false, error: `${signal} are not forwarded`, retryable: false, retryAfterMs: null };
|
|
122
|
+
const headers = {
|
|
123
|
+
...target.headers,
|
|
124
|
+
"content-type": CONTENT_TYPES[encoding],
|
|
125
|
+
...(target.gzip ? { "content-encoding": "gzip" } : {}),
|
|
126
|
+
};
|
|
127
|
+
const payload = target.gzip ? gzipSync(body) : body;
|
|
128
|
+
const deadline = Date.now() + Math.min(target.timeoutMs, withinMs ?? Infinity);
|
|
129
|
+
let backoff = INITIAL_BACKOFF_MS;
|
|
130
|
+
for (let attempt = 0;; attempt += 1) {
|
|
131
|
+
const result = await post(target, payload, headers, Math.max(1, deadline - Date.now()), abort);
|
|
132
|
+
if (result.status !== undefined && result.status >= 200 && result.status < 300)
|
|
133
|
+
return { ok: true };
|
|
134
|
+
const error = result.error?.message ?? `HTTP ${result.status}`;
|
|
135
|
+
const retryable = result.error || (result.status !== undefined && RETRYABLE_STATUS.has(result.status));
|
|
136
|
+
const failed = { ok: false, error, retryable: Boolean(retryable), retryAfterMs: result.retryAfter ?? null };
|
|
137
|
+
if (attempt === MAX_RETRIES || !retryable)
|
|
138
|
+
return failed;
|
|
139
|
+
const wait = result.retryAfter ?? Math.min(backoff * (1 + (Math.random() * 2 - 1) * JITTER), MAX_BACKOFF_MS);
|
|
140
|
+
backoff *= BACKOFF_MULTIPLIER;
|
|
141
|
+
if (Date.now() + wait >= deadline || abort?.aborted)
|
|
142
|
+
return failed;
|
|
143
|
+
const waited = await sleep(wait, true, abort ? { signal: abort } : {}).catch(() => false);
|
|
144
|
+
if (!waited)
|
|
145
|
+
return failed;
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
close() {
|
|
149
|
+
for (const target of Object.values(targets))
|
|
150
|
+
target.agent.destroy();
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../../../../src/telemetry/forward.ts"],"names":[],"mappings":"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"}
|