@alisio/plugin-telemetry 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.
- package/.agents/skills/telemetry/SKILL.md +52 -0
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/cover.svg +54 -0
- package/dist/commands.d.ts +19 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +298 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +145 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +524 -0
- package/dist/config.js.map +1 -0
- package/dist/database.d.ts +16 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +67 -0
- package/dist/database.js.map +1 -0
- package/dist/events.d.ts +135 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +255 -0
- package/dist/events.js.map +1 -0
- package/dist/format.d.ts +36 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +49 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/otlp.d.ts +69 -0
- package/dist/otlp.d.ts.map +1 -0
- package/dist/otlp.js +616 -0
- package/dist/otlp.js.map +1 -0
- package/dist/redact.d.ts +36 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +163 -0
- package/dist/redact.js.map +1 -0
- package/dist/runtime.d.ts +80 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +290 -0
- package/dist/runtime.js.map +1 -0
- package/dist/store.d.ts +188 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +539 -0
- package/dist/store.js.map +1 -0
- package/dist/tools.d.ts +21 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +292 -0
- package/dist/tools.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +54 -0
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event ingestion: a defensive, synchronous bridge from the host's fire-and-
|
|
3
|
+
* forget `RunEvent` stream into a bounded in-memory record queue.
|
|
4
|
+
*
|
|
5
|
+
* THE HANDLER MUST NEVER MISBEHAVE. Alisio calls observers synchronously inside
|
|
6
|
+
* the agent run, wraps *synchronous* throws in try/catch, but does NOT catch a
|
|
7
|
+
* rejected promise from an `async` handler. Therefore the registered handler
|
|
8
|
+
* here is a plain synchronous function: it validates, maps into a compact
|
|
9
|
+
* record, enqueues, and returns `undefined`. It never awaits, never returns a
|
|
10
|
+
* promise, never throws, and never touches disk. A full queue drops the newest
|
|
11
|
+
* event and counts it rather than blocking the run.
|
|
12
|
+
*
|
|
13
|
+
* CONTENT IS STRIPPED AT THE DOOR. Tool arguments and result previews are only
|
|
14
|
+
* carried into the queue when the matching capture flag is enabled, and only
|
|
15
|
+
* after allowlist redaction. The default record contains metadata only.
|
|
16
|
+
*/
|
|
17
|
+
import type { CaptureSettings, RedactionSettings } from "./config.js";
|
|
18
|
+
export interface EventEnvelope {
|
|
19
|
+
schemaVersion?: unknown;
|
|
20
|
+
runId?: unknown;
|
|
21
|
+
sessionId?: unknown;
|
|
22
|
+
seq?: unknown;
|
|
23
|
+
timestamp?: unknown;
|
|
24
|
+
type?: unknown;
|
|
25
|
+
data?: unknown;
|
|
26
|
+
}
|
|
27
|
+
/** An envelope that passed the minimum shape check. */
|
|
28
|
+
export interface TrustedEnvelope {
|
|
29
|
+
schemaVersion: 1;
|
|
30
|
+
runId: string;
|
|
31
|
+
sessionId: string;
|
|
32
|
+
seq: number;
|
|
33
|
+
timestamp: string;
|
|
34
|
+
type: string;
|
|
35
|
+
data: unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface RunStartRecord {
|
|
38
|
+
kind: "run_start";
|
|
39
|
+
runId: string;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
seq: number;
|
|
42
|
+
timestamp: string;
|
|
43
|
+
model: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface RunEndRecord {
|
|
46
|
+
kind: "run_end";
|
|
47
|
+
runId: string;
|
|
48
|
+
sessionId: string;
|
|
49
|
+
seq: number;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
status: "completed" | "error";
|
|
52
|
+
totalTokens: number | null;
|
|
53
|
+
inputTokens: number;
|
|
54
|
+
outputTokens: number;
|
|
55
|
+
cachedInputTokens: number;
|
|
56
|
+
truncated: boolean;
|
|
57
|
+
text: string | null;
|
|
58
|
+
}
|
|
59
|
+
export interface TurnRecord {
|
|
60
|
+
kind: "turn";
|
|
61
|
+
runId: string;
|
|
62
|
+
sessionId: string;
|
|
63
|
+
seq: number;
|
|
64
|
+
timestamp: string;
|
|
65
|
+
turn: number;
|
|
66
|
+
model: string | null;
|
|
67
|
+
inputTokens: number;
|
|
68
|
+
outputTokens: number;
|
|
69
|
+
cachedInputTokens: number;
|
|
70
|
+
calls: number;
|
|
71
|
+
durationMs: number | null;
|
|
72
|
+
}
|
|
73
|
+
export interface ToolStartRecord {
|
|
74
|
+
kind: "tool_start";
|
|
75
|
+
runId: string;
|
|
76
|
+
sessionId: string;
|
|
77
|
+
seq: number;
|
|
78
|
+
timestamp: string;
|
|
79
|
+
callId: string;
|
|
80
|
+
name: string;
|
|
81
|
+
effect: string | null;
|
|
82
|
+
argsBytes: number;
|
|
83
|
+
args: string | null;
|
|
84
|
+
}
|
|
85
|
+
export interface ToolEndRecord {
|
|
86
|
+
kind: "tool_end";
|
|
87
|
+
runId: string;
|
|
88
|
+
sessionId: string;
|
|
89
|
+
seq: number;
|
|
90
|
+
timestamp: string;
|
|
91
|
+
callId: string;
|
|
92
|
+
name: string | null;
|
|
93
|
+
isError: boolean;
|
|
94
|
+
durationMs: number | null;
|
|
95
|
+
resultBytes: number;
|
|
96
|
+
preview: string | null;
|
|
97
|
+
}
|
|
98
|
+
export type TelemetryRecord = RunStartRecord | RunEndRecord | TurnRecord | ToolStartRecord | ToolEndRecord;
|
|
99
|
+
export interface RedactionContext {
|
|
100
|
+
capture: CaptureSettings;
|
|
101
|
+
redaction: RedactionSettings;
|
|
102
|
+
}
|
|
103
|
+
/** True when the envelope carries the minimum shape required to trust it. */
|
|
104
|
+
export declare function isTrustedEnvelope(event: unknown): event is TrustedEnvelope;
|
|
105
|
+
/**
|
|
106
|
+
* Map one trusted envelope into a compact record. Returns null for unknown
|
|
107
|
+
* event types, malformed payloads, or payloads missing required identifiers.
|
|
108
|
+
* Never throws.
|
|
109
|
+
*/
|
|
110
|
+
export declare function normalizeEvent(event: Readonly<TrustedEnvelope>, context: RedactionContext): TelemetryRecord | null;
|
|
111
|
+
/**
|
|
112
|
+
* A bounded queue. `push` refuses the newest record when full and reports it via
|
|
113
|
+
* the dropped counter; nothing here can block or throw.
|
|
114
|
+
*/
|
|
115
|
+
export interface EventBuffer {
|
|
116
|
+
push(record: TelemetryRecord): boolean;
|
|
117
|
+
drain(max: number): TelemetryRecord[];
|
|
118
|
+
size(): number;
|
|
119
|
+
dropped(): number;
|
|
120
|
+
}
|
|
121
|
+
export declare function createEventBuffer(maxQueue: number): EventBuffer;
|
|
122
|
+
export interface EventHandlerOptions {
|
|
123
|
+
buffer: EventBuffer;
|
|
124
|
+
capture: CaptureSettings;
|
|
125
|
+
redaction: RedactionSettings;
|
|
126
|
+
/** Invoked when normalization itself throws; must not throw. */
|
|
127
|
+
onError?: () => void;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build the synchronous event handler registered with `api.events.on`. The
|
|
131
|
+
* return type is `void`, the body contains no `await`, and every path is
|
|
132
|
+
* wrapped so a hostile or malformed event can never reach the host.
|
|
133
|
+
*/
|
|
134
|
+
export declare function createEventHandler(options: EventHandlerOptions): (event: unknown) => void;
|
|
135
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { redactJson } from "./redact.js";
|
|
2
|
+
const MAX_ID = 200;
|
|
3
|
+
const MAX_MODEL = 200;
|
|
4
|
+
const MAX_TOOL_NAME = 200;
|
|
5
|
+
const MAX_EFFECT = 40;
|
|
6
|
+
function asObject(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
8
|
+
? value
|
|
9
|
+
: null;
|
|
10
|
+
}
|
|
11
|
+
function text(value, max) {
|
|
12
|
+
if (typeof value !== "string")
|
|
13
|
+
return null;
|
|
14
|
+
const trimmed = value;
|
|
15
|
+
return trimmed.length > max ? trimmed.slice(0, max) : trimmed;
|
|
16
|
+
}
|
|
17
|
+
function whole(value) {
|
|
18
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
19
|
+
return Math.trunc(value);
|
|
20
|
+
if (typeof value === "bigint")
|
|
21
|
+
return Number(value);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/** Coerce to a non-negative integer, defaulting to 0. */
|
|
25
|
+
function count(value) {
|
|
26
|
+
const numeric = whole(value);
|
|
27
|
+
return numeric === null || numeric < 0 ? 0 : numeric;
|
|
28
|
+
}
|
|
29
|
+
function truthy(value) {
|
|
30
|
+
if (typeof value === "boolean")
|
|
31
|
+
return value;
|
|
32
|
+
if (typeof value === "string")
|
|
33
|
+
return ["1", "true", "yes", "on"].includes(value.toLowerCase());
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
function byteLength(value) {
|
|
37
|
+
return Buffer.byteLength(value, "utf8");
|
|
38
|
+
}
|
|
39
|
+
function usageOf(data) {
|
|
40
|
+
const usage = asObject(data.usage);
|
|
41
|
+
return {
|
|
42
|
+
input: count(usage?.input),
|
|
43
|
+
output: count(usage?.output),
|
|
44
|
+
cachedInput: count(usage?.cachedInput),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** True when the envelope carries the minimum shape required to trust it. */
|
|
48
|
+
export function isTrustedEnvelope(event) {
|
|
49
|
+
if (typeof event !== "object" || event === null)
|
|
50
|
+
return false;
|
|
51
|
+
const candidate = event;
|
|
52
|
+
return (candidate.schemaVersion === 1 &&
|
|
53
|
+
typeof candidate.runId === "string" &&
|
|
54
|
+
candidate.runId.length > 0 &&
|
|
55
|
+
candidate.runId.length <= 512 &&
|
|
56
|
+
typeof candidate.sessionId === "string" &&
|
|
57
|
+
candidate.sessionId.length <= 512 &&
|
|
58
|
+
typeof candidate.seq === "number" &&
|
|
59
|
+
Number.isFinite(candidate.seq) &&
|
|
60
|
+
typeof candidate.timestamp === "string" &&
|
|
61
|
+
candidate.timestamp.length <= 64 &&
|
|
62
|
+
typeof candidate.type === "string");
|
|
63
|
+
}
|
|
64
|
+
const RUN_START = new Set(["run_started", "run_start", "run.started"]);
|
|
65
|
+
const RUN_END = new Set(["run_completed", "run_finished", "run_finish", "run.completed"]);
|
|
66
|
+
const TURN = new Set(["turn_completed", "turn.completed"]);
|
|
67
|
+
const TOOL_START = new Set(["tool_started", "tool.started"]);
|
|
68
|
+
const TOOL_END = new Set(["tool_completed", "tool.completed"]);
|
|
69
|
+
/**
|
|
70
|
+
* Map one trusted envelope into a compact record. Returns null for unknown
|
|
71
|
+
* event types, malformed payloads, or payloads missing required identifiers.
|
|
72
|
+
* Never throws.
|
|
73
|
+
*/
|
|
74
|
+
export function normalizeEvent(event, context) {
|
|
75
|
+
const { runId, sessionId, seq, timestamp, type } = event;
|
|
76
|
+
const run = text(runId, MAX_ID);
|
|
77
|
+
const session = text(sessionId, MAX_ID);
|
|
78
|
+
if (run === null || session === null)
|
|
79
|
+
return null;
|
|
80
|
+
const data = asObject(event.data);
|
|
81
|
+
if (RUN_START.has(type)) {
|
|
82
|
+
return {
|
|
83
|
+
kind: "run_start",
|
|
84
|
+
runId: run,
|
|
85
|
+
sessionId: session,
|
|
86
|
+
seq,
|
|
87
|
+
timestamp,
|
|
88
|
+
model: text(data?.model, MAX_MODEL),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (RUN_END.has(type)) {
|
|
92
|
+
const usage = data ? usageOf(data) : { input: 0, output: 0, cachedInput: 0 };
|
|
93
|
+
const textValue = data ? text(data.text, 2000) : null;
|
|
94
|
+
return {
|
|
95
|
+
kind: "run_end",
|
|
96
|
+
runId: run,
|
|
97
|
+
sessionId: session,
|
|
98
|
+
seq,
|
|
99
|
+
timestamp,
|
|
100
|
+
status: data && truthy(data.error) ? "error" : "completed",
|
|
101
|
+
totalTokens: data ? whole(data.tokens) : null,
|
|
102
|
+
inputTokens: usage.input,
|
|
103
|
+
outputTokens: usage.output,
|
|
104
|
+
cachedInputTokens: usage.cachedInput,
|
|
105
|
+
truncated: data ? truthy(data.truncated) : false,
|
|
106
|
+
text: textValue !== null && context.capture.completions
|
|
107
|
+
? redactJson(textValue, { mode: context.redaction.mode })
|
|
108
|
+
: null,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (TURN.has(type)) {
|
|
112
|
+
if (!data)
|
|
113
|
+
return null;
|
|
114
|
+
const turn = whole(data.turn);
|
|
115
|
+
if (turn === null)
|
|
116
|
+
return null;
|
|
117
|
+
const usage = usageOf(data);
|
|
118
|
+
return {
|
|
119
|
+
kind: "turn",
|
|
120
|
+
runId: run,
|
|
121
|
+
sessionId: session,
|
|
122
|
+
seq,
|
|
123
|
+
timestamp,
|
|
124
|
+
turn,
|
|
125
|
+
model: text(data.model, MAX_MODEL),
|
|
126
|
+
inputTokens: usage.input,
|
|
127
|
+
outputTokens: usage.output,
|
|
128
|
+
cachedInputTokens: usage.cachedInput,
|
|
129
|
+
calls: count(data.calls),
|
|
130
|
+
durationMs: whole(data.durationMs),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (TOOL_START.has(type)) {
|
|
134
|
+
if (!data)
|
|
135
|
+
return null;
|
|
136
|
+
const callId = text(data.id, MAX_ID);
|
|
137
|
+
const name = text(data.name, MAX_TOOL_NAME);
|
|
138
|
+
if (callId === null || name === null)
|
|
139
|
+
return null;
|
|
140
|
+
const argsJson = data.arguments === undefined ? "" : safeJson(data.arguments);
|
|
141
|
+
return {
|
|
142
|
+
kind: "tool_start",
|
|
143
|
+
runId: run,
|
|
144
|
+
sessionId: session,
|
|
145
|
+
seq,
|
|
146
|
+
timestamp,
|
|
147
|
+
callId,
|
|
148
|
+
name,
|
|
149
|
+
effect: text(data.effect, MAX_EFFECT),
|
|
150
|
+
argsBytes: byteLength(argsJson),
|
|
151
|
+
args: context.capture.toolArguments && argsJson !== ""
|
|
152
|
+
? redactJson(data.arguments, { mode: context.redaction.mode })
|
|
153
|
+
: null,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
if (TOOL_END.has(type)) {
|
|
157
|
+
if (!data)
|
|
158
|
+
return null;
|
|
159
|
+
const callId = text(data.id, MAX_ID);
|
|
160
|
+
if (callId === null)
|
|
161
|
+
return null;
|
|
162
|
+
const preview = data.preview === undefined ? "" : safeJson(data.preview);
|
|
163
|
+
return {
|
|
164
|
+
kind: "tool_end",
|
|
165
|
+
runId: run,
|
|
166
|
+
sessionId: session,
|
|
167
|
+
seq,
|
|
168
|
+
timestamp,
|
|
169
|
+
callId,
|
|
170
|
+
name: text(data.name, MAX_TOOL_NAME),
|
|
171
|
+
isError: truthy(data.isError),
|
|
172
|
+
durationMs: whole(data.durationMs),
|
|
173
|
+
resultBytes: byteLength(preview),
|
|
174
|
+
preview: context.capture.toolResults && preview !== ""
|
|
175
|
+
? redactJson(data.preview, { mode: context.redaction.mode })
|
|
176
|
+
: null,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
function safeJson(value) {
|
|
182
|
+
if (typeof value === "string")
|
|
183
|
+
return value;
|
|
184
|
+
try {
|
|
185
|
+
return JSON.stringify(value) ?? "";
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return "";
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function createEventBuffer(maxQueue) {
|
|
192
|
+
const limit = Math.max(1, Math.trunc(maxQueue));
|
|
193
|
+
const items = [];
|
|
194
|
+
let head = 0;
|
|
195
|
+
let droppedCount = 0;
|
|
196
|
+
return {
|
|
197
|
+
push(record) {
|
|
198
|
+
if (items.length - head >= limit) {
|
|
199
|
+
droppedCount += 1;
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
items.push(record);
|
|
203
|
+
return true;
|
|
204
|
+
},
|
|
205
|
+
drain(max) {
|
|
206
|
+
const take = Math.max(0, Math.trunc(max));
|
|
207
|
+
const out = [];
|
|
208
|
+
while (head < items.length && out.length < take) {
|
|
209
|
+
out.push(items[head]);
|
|
210
|
+
head += 1;
|
|
211
|
+
}
|
|
212
|
+
if (head === items.length) {
|
|
213
|
+
items.length = 0;
|
|
214
|
+
head = 0;
|
|
215
|
+
}
|
|
216
|
+
else if (head > 1024) {
|
|
217
|
+
items.splice(0, head);
|
|
218
|
+
head = 0;
|
|
219
|
+
}
|
|
220
|
+
return out;
|
|
221
|
+
},
|
|
222
|
+
size() {
|
|
223
|
+
return items.length - head;
|
|
224
|
+
},
|
|
225
|
+
dropped() {
|
|
226
|
+
return droppedCount;
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Build the synchronous event handler registered with `api.events.on`. The
|
|
232
|
+
* return type is `void`, the body contains no `await`, and every path is
|
|
233
|
+
* wrapped so a hostile or malformed event can never reach the host.
|
|
234
|
+
*/
|
|
235
|
+
export function createEventHandler(options) {
|
|
236
|
+
const context = { capture: options.capture, redaction: options.redaction };
|
|
237
|
+
return (event) => {
|
|
238
|
+
try {
|
|
239
|
+
if (!isTrustedEnvelope(event))
|
|
240
|
+
return;
|
|
241
|
+
const record = normalizeEvent(event, context);
|
|
242
|
+
if (record !== null)
|
|
243
|
+
options.buffer.push(record);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
try {
|
|
247
|
+
options.onError?.();
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
// Swallow: an error reporter must not break the run either.
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAqGzC,MAAM,MAAM,GAAG,GAAG,CAAC;AACnB,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,GAAW;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC;IACtB,OAAO,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAChE,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yDAAyD;AACzD,SAAS,KAAK,CAAC,KAAc;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,OAAO,CAAC,IAA6B;IAK5C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;QAC1B,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAsB,CAAC;IACzC,OAAO,CACL,SAAS,CAAC,aAAa,KAAK,CAAC;QAC7B,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;QACnC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1B,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG;QAC7B,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,SAAS,CAAC,SAAS,CAAC,MAAM,IAAI,GAAG;QACjC,OAAO,SAAS,CAAC,GAAG,KAAK,QAAQ;QACjC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;QAC9B,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,SAAS,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE;QAChC,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,CACnC,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AACvE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAC1F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE/D;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAgC,EAChC,OAAyB;IAEzB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,OAAO;YAClB,GAAG;YACH,SAAS;YACT,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;SACpC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,OAAO;YAClB,GAAG;YACH,SAAS;YACT,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;YAC1D,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7C,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,YAAY,EAAE,KAAK,CAAC,MAAM;YAC1B,iBAAiB,EAAE,KAAK,CAAC,WAAW;YACpC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK;YAChD,IAAI,EACF,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW;gBAC/C,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzD,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,OAAO;YAClB,GAAG;YACH,SAAS;YACT,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;YAClC,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,YAAY,EAAE,KAAK,CAAC,MAAM;YAC1B,iBAAiB,EAAE,KAAK,CAAC,WAAW;YACpC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9E,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,OAAO;YAClB,GAAG;YACH,SAAS;YACT,MAAM;YACN,IAAI;YACJ,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;YACrC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC/B,IAAI,EACF,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,QAAQ,KAAK,EAAE;gBAC9C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9D,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzE,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,GAAG;YACV,SAAS,EAAE,OAAO;YAClB,GAAG;YACH,SAAS;YACT,MAAM;YACN,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;YACpC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YAClC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC;YAChC,OAAO,EACL,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,KAAK,EAAE;gBAC3C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5D,CAAC,CAAC,IAAI;SACX,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAaD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO;QACL,IAAI,CAAC,MAAuB;YAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;gBACjC,YAAY,IAAI,CAAC,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,GAAW;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAsB,EAAE,CAAC;YAClC,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAChD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,CAAC;YACZ,CAAC;YACD,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjB,IAAI,GAAG,CAAC,CAAC;YACX,CAAC;iBAAM,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;gBACvB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtB,IAAI,GAAG,CAAC,CAAC;YACX,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI;YACF,OAAO,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,OAAO,YAAY,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,OAAO,GAAqB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;IAC7F,OAAO,CAAC,KAAc,EAAQ,EAAE;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBAAE,OAAO;YACtC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,4DAA4D;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface BoundsWindow {
|
|
2
|
+
from: string;
|
|
3
|
+
to: string;
|
|
4
|
+
windowMinutes: number;
|
|
5
|
+
}
|
|
6
|
+
export interface BoundsEnvelope<T> {
|
|
7
|
+
window: BoundsWindow;
|
|
8
|
+
returned: number;
|
|
9
|
+
total: number;
|
|
10
|
+
truncated: boolean;
|
|
11
|
+
hint: string;
|
|
12
|
+
data: T;
|
|
13
|
+
}
|
|
14
|
+
/** A stable error payload. Shape is part of the tool contract. */
|
|
15
|
+
export interface TelemetryError {
|
|
16
|
+
error: {
|
|
17
|
+
code: string;
|
|
18
|
+
message: string;
|
|
19
|
+
hint?: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Redact and bound a display string. Never returns an absolute machine path. */
|
|
23
|
+
export declare function sanitizeField(value: unknown, max?: number): string;
|
|
24
|
+
export declare function hintFor(returned: number, total: number, _limit: number): string;
|
|
25
|
+
export declare function boundsEnvelope<T>(options: {
|
|
26
|
+
window: BoundsWindow;
|
|
27
|
+
data: T;
|
|
28
|
+
returned: number;
|
|
29
|
+
total: number;
|
|
30
|
+
limit: number;
|
|
31
|
+
hint?: string;
|
|
32
|
+
}): BoundsEnvelope<T>;
|
|
33
|
+
export declare function stableError(code: string, message: string, hint?: string): TelemetryError;
|
|
34
|
+
/** Serialize a tool payload to bounded JSON text. */
|
|
35
|
+
export declare function toolJson(value: unknown): string;
|
|
36
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAID,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAM,GAAG,MAAM,CAK/D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM/E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE;IACzC,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,cAAc,CAAC,CAAC,CAAC,CAUpB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAExF;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQ/C"}
|
package/dist/format.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, privacy-preserving result framing shared by every telemetry tool.
|
|
3
|
+
*
|
|
4
|
+
* No tool ever returns a raw event dump. Each result carries a bounds envelope
|
|
5
|
+
* (`returned`, `total`, `truncated`, and a refinement `hint`) so an agent can
|
|
6
|
+
* tell whether it is looking at everything or a slice. Every string that leaves
|
|
7
|
+
* this module passes through redaction and looks-like-a-path neutralization, so
|
|
8
|
+
* a hostile tool name or model string cannot smuggle a credential or an absolute
|
|
9
|
+
* machine path into a result.
|
|
10
|
+
*/
|
|
11
|
+
import { redactText } from "./redact.js";
|
|
12
|
+
const LOOKS_LIKE_PATH = /(?<!\S)\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)+/g;
|
|
13
|
+
/** Redact and bound a display string. Never returns an absolute machine path. */
|
|
14
|
+
export function sanitizeField(value, max = 200) {
|
|
15
|
+
const text = typeof value === "string" ? value : value === null || value === undefined ? "" : String(value);
|
|
16
|
+
const redacted = redactText(text, { mode: "standard", maxLength: max });
|
|
17
|
+
return redacted.replace(LOOKS_LIKE_PATH, "<path>").replace(/\s+/g, " ").trim();
|
|
18
|
+
}
|
|
19
|
+
export function hintFor(returned, total, _limit) {
|
|
20
|
+
if (total > returned)
|
|
21
|
+
return `Showing ${returned} of ${total}. Raise limit (max 100) or narrow the window with windowMinutes.`;
|
|
22
|
+
if (total === 0)
|
|
23
|
+
return "No telemetry recorded in this window; run an agent session or widen windowMinutes.";
|
|
24
|
+
return `Complete for the selected window (${returned} of ${total}).`;
|
|
25
|
+
}
|
|
26
|
+
export function boundsEnvelope(options) {
|
|
27
|
+
const truncated = options.total > options.returned;
|
|
28
|
+
return {
|
|
29
|
+
window: options.window,
|
|
30
|
+
returned: options.returned,
|
|
31
|
+
total: options.total,
|
|
32
|
+
truncated,
|
|
33
|
+
hint: options.hint ?? hintFor(options.returned, options.total, options.limit),
|
|
34
|
+
data: options.data,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function stableError(code, message, hint) {
|
|
38
|
+
return { error: hint === undefined ? { code, message } : { code, message, hint } };
|
|
39
|
+
}
|
|
40
|
+
/** Serialize a tool payload to bounded JSON text. */
|
|
41
|
+
export function toolJson(value) {
|
|
42
|
+
try {
|
|
43
|
+
return JSON.stringify(value);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return JSON.stringify(stableError("serialization_failed", "Telemetry result could not be serialized."));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0BzC,MAAM,eAAe,GAAG,iDAAiD,CAAC;AAE1E,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,GAAG,GAAG,GAAG;IACrD,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjG,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxE,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,KAAa,EAAE,MAAc;IACrE,IAAI,KAAK,GAAG,QAAQ;QAClB,OAAO,WAAW,QAAQ,OAAO,KAAK,kEAAkE,CAAC;IAC3G,IAAI,KAAK,KAAK,CAAC;QACb,OAAO,oFAAoF,CAAC;IAC9F,OAAO,qCAAqC,QAAQ,OAAO,KAAK,IAAI,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,OAOjC;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS;QACT,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QAC7E,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,IAAa;IACtE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,SAAS,CACnB,WAAW,CAAC,sBAAsB,EAAE,2CAA2C,CAAC,CACjF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@alisio/plugin-telemetry` — privacy-first local agent observability.
|
|
3
|
+
*
|
|
4
|
+
* The plugin registers five read-only query tools, four operator commands, one
|
|
5
|
+
* event observer, a session-end transcript hook (only when content capture is
|
|
6
|
+
* enabled) and an agent skill. The local SQLite database is always the source of
|
|
7
|
+
* truth; remote OTLP export is opt-in and never blocks the agent run.
|
|
8
|
+
*/
|
|
9
|
+
import { type Plugin } from "@alisio/sdk";
|
|
10
|
+
import { type TelemetryRuntimeOptions } from "./runtime.js";
|
|
11
|
+
import { TOOL_NAMES } from "./tools.js";
|
|
12
|
+
export * from "./commands.js";
|
|
13
|
+
export * from "./config.js";
|
|
14
|
+
export * from "./database.js";
|
|
15
|
+
export * from "./events.js";
|
|
16
|
+
export * from "./format.js";
|
|
17
|
+
export * from "./otlp.js";
|
|
18
|
+
export * from "./redact.js";
|
|
19
|
+
export * from "./runtime.js";
|
|
20
|
+
export * from "./store.js";
|
|
21
|
+
export * from "./tools.js";
|
|
22
|
+
export { VERSION } from "./version.js";
|
|
23
|
+
/** Package-local resource directories, registered relative to the built entry. */
|
|
24
|
+
export declare const resourcePaths: {
|
|
25
|
+
readonly skills: "../.agents/skills";
|
|
26
|
+
};
|
|
27
|
+
export type CreateTelemetryPluginOptions = TelemetryRuntimeOptions;
|
|
28
|
+
/**
|
|
29
|
+
* Build the plugin. Configuration is validated at setup: an invalid
|
|
30
|
+
* configuration disables telemetry with an actionable message instead of
|
|
31
|
+
* failing the host. The same read-only tools and commands are always registered
|
|
32
|
+
* so an agent gets a stable answer rather than a missing-tool error.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createTelemetryPlugin(options?: CreateTelemetryPluginOptions): Plugin;
|
|
35
|
+
export { TOOL_NAMES };
|
|
36
|
+
declare const _default: Plugin;
|
|
37
|
+
export default _default;
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAgB,KAAK,MAAM,EAAkB,MAAM,aAAa,CAAC;AAExE,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAwB,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9D,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,kFAAkF;AAClF,eAAO,MAAM,aAAa;aACxB,MAAM,EAAE,mBAAmB;CACnB,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,uBAAuB,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiC,GAAG,MAAM,CAuCxF;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@alisio/plugin-telemetry` — privacy-first local agent observability.
|
|
3
|
+
*
|
|
4
|
+
* The plugin registers five read-only query tools, four operator commands, one
|
|
5
|
+
* event observer, a session-end transcript hook (only when content capture is
|
|
6
|
+
* enabled) and an agent skill. The local SQLite database is always the source of
|
|
7
|
+
* truth; remote OTLP export is opt-in and never blocks the agent run.
|
|
8
|
+
*/
|
|
9
|
+
import { definePlugin } from "@alisio/sdk";
|
|
10
|
+
import { registerCommands } from "./commands.js";
|
|
11
|
+
import { createTelemetryRuntime, } from "./runtime.js";
|
|
12
|
+
import { createTelemetryTools, TOOL_NAMES } from "./tools.js";
|
|
13
|
+
import { VERSION } from "./version.js";
|
|
14
|
+
export * from "./commands.js";
|
|
15
|
+
export * from "./config.js";
|
|
16
|
+
export * from "./database.js";
|
|
17
|
+
export * from "./events.js";
|
|
18
|
+
export * from "./format.js";
|
|
19
|
+
export * from "./otlp.js";
|
|
20
|
+
export * from "./redact.js";
|
|
21
|
+
export * from "./runtime.js";
|
|
22
|
+
export * from "./store.js";
|
|
23
|
+
export * from "./tools.js";
|
|
24
|
+
export { VERSION } from "./version.js";
|
|
25
|
+
/** Package-local resource directories, registered relative to the built entry. */
|
|
26
|
+
export const resourcePaths = {
|
|
27
|
+
skills: "../.agents/skills",
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Build the plugin. Configuration is validated at setup: an invalid
|
|
31
|
+
* configuration disables telemetry with an actionable message instead of
|
|
32
|
+
* failing the host. The same read-only tools and commands are always registered
|
|
33
|
+
* so an agent gets a stable answer rather than a missing-tool error.
|
|
34
|
+
*/
|
|
35
|
+
export function createTelemetryPlugin(options = {}) {
|
|
36
|
+
let runtime = null;
|
|
37
|
+
return definePlugin({
|
|
38
|
+
id: "telemetry",
|
|
39
|
+
name: "Telemetry",
|
|
40
|
+
description: "Privacy-first local agent observability with a SQLite source of truth, bounded read-only query tools, and opt-in OpenTelemetry-aligned OTLP export",
|
|
41
|
+
categories: ["analytics"],
|
|
42
|
+
version: VERSION,
|
|
43
|
+
apiVersion: 1,
|
|
44
|
+
setup(api) {
|
|
45
|
+
const created = createTelemetryRuntime({
|
|
46
|
+
...options,
|
|
47
|
+
// Production always reads through the host storage port; an explicit
|
|
48
|
+
// opener (tests, embedders) still wins.
|
|
49
|
+
openDatabase: options.openDatabase ?? ((path) => api.storage.sqlite(path)),
|
|
50
|
+
});
|
|
51
|
+
runtime = created;
|
|
52
|
+
const tools = createTelemetryTools({
|
|
53
|
+
store: created.store,
|
|
54
|
+
config: created.config,
|
|
55
|
+
configError: created.configError,
|
|
56
|
+
now: created.now,
|
|
57
|
+
});
|
|
58
|
+
for (const tool of tools)
|
|
59
|
+
api.tools.register(tool);
|
|
60
|
+
api.events.on(created.handler);
|
|
61
|
+
api.session.onEnd(async (info) => {
|
|
62
|
+
await created.captureTranscript(info);
|
|
63
|
+
});
|
|
64
|
+
registerCommands(api, created);
|
|
65
|
+
api.resources.skills(resourcePaths.skills);
|
|
66
|
+
created.start();
|
|
67
|
+
},
|
|
68
|
+
async dispose() {
|
|
69
|
+
const current = runtime;
|
|
70
|
+
runtime = null;
|
|
71
|
+
if (current !== null)
|
|
72
|
+
await current.dispose();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export { TOOL_NAMES };
|
|
77
|
+
export default createTelemetryPlugin();
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAA+B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EACL,sBAAsB,GAGvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,kFAAkF;AAClF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,mBAAmB;CACnB,CAAC;AAIX;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAO,GAAiC,EAAE;IAC9E,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,OAAO,YAAY,CAAC;QAClB,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,oJAAoJ;QACtJ,UAAU,EAAE,CAAC,WAAW,CAAC;QACzB,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,CAAC;QACb,KAAK,CAAC,GAAc;YAClB,MAAM,OAAO,GAAG,sBAAsB,CAAC;gBACrC,GAAG,OAAO;gBACV,qEAAqE;gBACrE,wCAAwC;gBACxC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aACnF,CAAC,CAAC;YACH,OAAO,GAAG,OAAO,CAAC;YAClB,MAAM,KAAK,GAAG,oBAAoB,CAAC;gBACjC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC/B,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;YACH,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/B,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,OAAO,GAAG,OAAO,CAAC;YACxB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,eAAe,qBAAqB,EAAE,CAAC"}
|