@agentstrack/collector 0.2.1 → 0.4.1
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/CHANGELOG.md +209 -1
- package/README.md +114 -38
- package/dist/adapters/claude.d.ts +18 -0
- package/dist/adapters/claude.js +153 -45
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.d.ts +15 -1
- package/dist/adapters/codex.js +87 -34
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/opencode.d.ts +17 -6
- package/dist/adapters/opencode.js +72 -26
- package/dist/adapters/opencode.js.map +1 -1
- package/dist/adapters/types.d.ts +16 -0
- package/dist/adapters/types.js +61 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/cli.js +164 -33
- package/dist/cli.js.map +1 -1
- package/dist/commands/service.js +40 -10
- package/dist/commands/service.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +18 -5
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +73 -21
- package/dist/daemon.js +350 -119
- package/dist/daemon.js.map +1 -1
- package/dist/git/commits.d.ts +7 -1
- package/dist/git/commits.js +36 -17
- package/dist/git/commits.js.map +1 -1
- package/dist/git/repo.d.ts +13 -4
- package/dist/git/repo.js +34 -20
- package/dist/git/repo.js.map +1 -1
- package/dist/machine.d.ts +27 -0
- package/dist/machine.js +46 -0
- package/dist/machine.js.map +1 -0
- package/dist/privacy/pipeline.d.ts +6 -0
- package/dist/privacy/pipeline.js +41 -7
- package/dist/privacy/pipeline.js.map +1 -1
- package/dist/privacy/redact.d.ts +15 -2
- package/dist/privacy/redact.js +45 -6
- package/dist/privacy/redact.js.map +1 -1
- package/dist/queue/event-id.d.ts +9 -0
- package/dist/queue/event-id.js +15 -0
- package/dist/queue/event-id.js.map +1 -0
- package/dist/queue/spool.d.ts +24 -5
- package/dist/queue/spool.js +89 -33
- package/dist/queue/spool.js.map +1 -1
- package/dist/queue/tailer.d.ts +27 -4
- package/dist/queue/tailer.js +89 -28
- package/dist/queue/tailer.js.map +1 -1
- package/dist/sessions/title.d.ts +14 -2
- package/dist/sessions/title.js +18 -6
- package/dist/sessions/title.js.map +1 -1
- package/dist/transport/client.d.ts +37 -13
- package/dist/transport/client.js +50 -3
- package/dist/transport/client.js.map +1 -1
- package/package.json +2 -2
package/dist/sessions/title.js
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { redact } from '../privacy/redact.js';
|
|
2
|
+
/**
|
|
3
|
+
* First meaningful line of a prompt, secret-redacted and NOT truncated.
|
|
4
|
+
*
|
|
5
|
+
* Truncation deliberately does not happen here. Cutting the line first slices a
|
|
6
|
+
* straddling secret in half, neither half matches its pattern any more, and the
|
|
7
|
+
* fragment ships inside the title. Only the built-in rules are reachable from an
|
|
8
|
+
* adapter, so doing the cut here could only ever be safe for those — an
|
|
9
|
+
* org-supplied pattern would still be bisected.
|
|
10
|
+
*
|
|
11
|
+
* The privacy pipeline redacts this field again with the org's own rules and
|
|
12
|
+
* only then truncates it (see TITLE_MAX_LENGTH in privacy/pipeline.ts), so the
|
|
13
|
+
* cut always lands on already-redacted text whatever the rule's source.
|
|
14
|
+
*/
|
|
15
|
+
export function deriveTitle(text) {
|
|
16
|
+
const line = redact(text)
|
|
17
|
+
.text.split('\n')
|
|
5
18
|
.map((l) => l.trim())
|
|
6
19
|
// Skip markdown fences, quotes and system-reminder noise.
|
|
7
20
|
.find((l) => l.length > 0 && !l.startsWith('```') && !l.startsWith('<') && !l.startsWith('>')) ?? '';
|
|
8
|
-
|
|
9
|
-
return cleaned.length <= maxLength ? cleaned : `${cleaned.slice(0, maxLength - 1)}…`;
|
|
21
|
+
return line.replace(/\s+/g, ' ').trim();
|
|
10
22
|
}
|
|
11
23
|
//# sourceMappingURL=title.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"title.js","sourceRoot":"","sources":["../../src/sessions/title.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"title.js","sourceRoot":"","sources":["../../src/sessions/title.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,IAAI,GACR,MAAM,CAAC,IAAI,CAAC;SACT,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrB,0DAA0D;SACzD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzG,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
1
2
|
import type { EventEnvelope } from '../schema.js';
|
|
3
|
+
import type { MachineInfo } from '../machine.js';
|
|
4
|
+
/** Read from package.json so the CLI, register and health can never drift from what is published. */
|
|
5
|
+
export declare const VERSION: string;
|
|
2
6
|
/**
|
|
3
7
|
* HTTP client for the AgentsTrack API.
|
|
4
8
|
*
|
|
@@ -10,14 +14,25 @@ export interface ClientOptions {
|
|
|
10
14
|
apiKey: string;
|
|
11
15
|
timeoutMs?: number;
|
|
12
16
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
/**
|
|
18
|
+
* The batch response is a trust boundary: a proxy error page or a newer
|
|
19
|
+
* server shape must fail loudly here, not surface as `undefined.length` deep
|
|
20
|
+
* in the upload policy. `quota` arrives only from servers that meter events.
|
|
21
|
+
*/
|
|
22
|
+
export declare const BatchResult: z.ZodObject<{
|
|
23
|
+
accepted: z.ZodNumber;
|
|
24
|
+
duplicates: z.ZodNumber;
|
|
25
|
+
rejected: z.ZodArray<z.ZodObject<{
|
|
26
|
+
index: z.ZodNumber;
|
|
27
|
+
reason: z.ZodString;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
quota: z.ZodOptional<z.ZodObject<{
|
|
30
|
+
limit: z.ZodNullable<z.ZodNumber>;
|
|
31
|
+
used: z.ZodNullable<z.ZodNumber>;
|
|
32
|
+
exceeded: z.ZodBoolean;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type BatchResult = z.infer<typeof BatchResult>;
|
|
21
36
|
export interface ServerConfig {
|
|
22
37
|
privacy_mode: 'metadata' | 'analytics' | 'full';
|
|
23
38
|
idle_timeout_seconds: number;
|
|
@@ -33,18 +48,25 @@ export declare class ApiError extends Error {
|
|
|
33
48
|
readonly status: number;
|
|
34
49
|
/** Whether trying again later could succeed. */
|
|
35
50
|
readonly retryable: boolean;
|
|
51
|
+
/** Server-requested minimum wait before the next attempt, from Retry-After. */
|
|
52
|
+
readonly retryAfterMs?: number | undefined;
|
|
36
53
|
constructor(message: string, status: number,
|
|
37
54
|
/** Whether trying again later could succeed. */
|
|
38
|
-
retryable: boolean
|
|
55
|
+
retryable: boolean,
|
|
56
|
+
/** Server-requested minimum wait before the next attempt, from Retry-After. */
|
|
57
|
+
retryAfterMs?: number | undefined);
|
|
39
58
|
}
|
|
40
59
|
export declare class ApiClient {
|
|
41
60
|
private readonly options;
|
|
42
61
|
constructor(options: ClientOptions);
|
|
43
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Register and health both carry `MachineInfo`. The server keeps hostname,
|
|
64
|
+
* os, release, arch, machine kind and the request IP for operations and
|
|
65
|
+
* abuse prevention only; none of it is shown in the product.
|
|
66
|
+
*/
|
|
67
|
+
registerCollector(input: Partial<MachineInfo> & {
|
|
44
68
|
hostname: string;
|
|
45
69
|
label?: string;
|
|
46
|
-
os?: string;
|
|
47
|
-
arch?: string;
|
|
48
70
|
version?: string;
|
|
49
71
|
/** The mode this device will actually enforce, which may be stricter than the org's. */
|
|
50
72
|
privacy_mode?: string;
|
|
@@ -58,7 +80,7 @@ export declare class ApiClient {
|
|
|
58
80
|
}>;
|
|
59
81
|
getConfig(): Promise<ServerConfig>;
|
|
60
82
|
sendBatch(events: EventEnvelope[]): Promise<BatchResult>;
|
|
61
|
-
health(input: {
|
|
83
|
+
health(input: Partial<MachineInfo> & {
|
|
62
84
|
collector_id: string;
|
|
63
85
|
queue_depth: number;
|
|
64
86
|
version?: string;
|
|
@@ -72,5 +94,7 @@ export declare class ApiClient {
|
|
|
72
94
|
}>;
|
|
73
95
|
private request;
|
|
74
96
|
}
|
|
97
|
+
/** Retry-After is either delta-seconds or an HTTP date. Unparseable means no request. */
|
|
98
|
+
export declare function retryAfterMs(header: string | null): number | undefined;
|
|
75
99
|
/** Exponential backoff with jitter, capped. */
|
|
76
100
|
export declare function backoffMs(attempt: number, baseMs?: number, capMs?: number): number;
|
package/dist/transport/client.js
CHANGED
|
@@ -1,13 +1,38 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { gzipSync } from 'node:zlib';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
/** Read from package.json so the CLI, register and health can never drift from what is published. */
|
|
5
|
+
export const VERSION = createRequire(import.meta.url)('../../package.json').version;
|
|
6
|
+
/**
|
|
7
|
+
* The batch response is a trust boundary: a proxy error page or a newer
|
|
8
|
+
* server shape must fail loudly here, not surface as `undefined.length` deep
|
|
9
|
+
* in the upload policy. `quota` arrives only from servers that meter events.
|
|
10
|
+
*/
|
|
11
|
+
export const BatchResult = z.object({
|
|
12
|
+
accepted: z.number().int().nonnegative(),
|
|
13
|
+
duplicates: z.number().int().nonnegative(),
|
|
14
|
+
rejected: z.array(z.object({ index: z.number().int(), reason: z.string() })),
|
|
15
|
+
quota: z
|
|
16
|
+
.object({
|
|
17
|
+
limit: z.number().nullable(),
|
|
18
|
+
used: z.number().nullable(),
|
|
19
|
+
exceeded: z.boolean(),
|
|
20
|
+
})
|
|
21
|
+
.optional(),
|
|
22
|
+
});
|
|
2
23
|
export class ApiError extends Error {
|
|
3
24
|
status;
|
|
4
25
|
retryable;
|
|
26
|
+
retryAfterMs;
|
|
5
27
|
constructor(message, status,
|
|
6
28
|
/** Whether trying again later could succeed. */
|
|
7
|
-
retryable
|
|
29
|
+
retryable,
|
|
30
|
+
/** Server-requested minimum wait before the next attempt, from Retry-After. */
|
|
31
|
+
retryAfterMs) {
|
|
8
32
|
super(message);
|
|
9
33
|
this.status = status;
|
|
10
34
|
this.retryable = retryable;
|
|
35
|
+
this.retryAfterMs = retryAfterMs;
|
|
11
36
|
this.name = 'ApiError';
|
|
12
37
|
}
|
|
13
38
|
}
|
|
@@ -16,6 +41,11 @@ export class ApiClient {
|
|
|
16
41
|
constructor(options) {
|
|
17
42
|
this.options = options;
|
|
18
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Register and health both carry `MachineInfo`. The server keeps hostname,
|
|
46
|
+
* os, release, arch, machine kind and the request IP for operations and
|
|
47
|
+
* abuse prevention only; none of it is shown in the product.
|
|
48
|
+
*/
|
|
19
49
|
async registerCollector(input) {
|
|
20
50
|
return this.request('POST', '/v1/collector/register', input);
|
|
21
51
|
}
|
|
@@ -23,7 +53,13 @@ export class ApiClient {
|
|
|
23
53
|
return this.request('GET', '/v1/collector/config');
|
|
24
54
|
}
|
|
25
55
|
async sendBatch(events) {
|
|
26
|
-
|
|
56
|
+
const raw = await this.request('POST', '/v1/events/batch', { events }, true);
|
|
57
|
+
const parsed = BatchResult.safeParse(raw);
|
|
58
|
+
if (!parsed.success) {
|
|
59
|
+
// Not acking on a response we cannot read: the events stay spooled.
|
|
60
|
+
throw new ApiError('POST /v1/events/batch returned an unreadable response', 200, true);
|
|
61
|
+
}
|
|
62
|
+
return parsed.data;
|
|
27
63
|
}
|
|
28
64
|
async health(input) {
|
|
29
65
|
return this.request('POST', '/v1/collector/health', input);
|
|
@@ -33,6 +69,7 @@ export class ApiClient {
|
|
|
33
69
|
const headers = {
|
|
34
70
|
authorization: `Bearer ${this.options.apiKey}`,
|
|
35
71
|
accept: 'application/json',
|
|
72
|
+
'user-agent': `agentstrack-collector/${VERSION}`,
|
|
36
73
|
};
|
|
37
74
|
let payload;
|
|
38
75
|
if (body !== undefined) {
|
|
@@ -55,7 +92,7 @@ export class ApiClient {
|
|
|
55
92
|
// 4xx means we sent something wrong — retrying will not fix it, except
|
|
56
93
|
// 408/429 which are explicitly "try again".
|
|
57
94
|
const retryable = response.status >= 500 || response.status === 408 || response.status === 429;
|
|
58
|
-
throw new ApiError(`${method} ${path} failed: ${response.status} ${text.slice(0, 200)}`, response.status, retryable);
|
|
95
|
+
throw new ApiError(`${method} ${path} failed: ${response.status} ${text.slice(0, 200)}`, response.status, retryable, retryAfterMs(response.headers.get('retry-after-ingest') ?? response.headers.get('retry-after')));
|
|
59
96
|
}
|
|
60
97
|
return (await response.json());
|
|
61
98
|
}
|
|
@@ -70,6 +107,16 @@ export class ApiClient {
|
|
|
70
107
|
}
|
|
71
108
|
}
|
|
72
109
|
}
|
|
110
|
+
/** Retry-After is either delta-seconds or an HTTP date. Unparseable means no request. */
|
|
111
|
+
export function retryAfterMs(header) {
|
|
112
|
+
if (!header)
|
|
113
|
+
return undefined;
|
|
114
|
+
const seconds = Number(header);
|
|
115
|
+
if (Number.isFinite(seconds))
|
|
116
|
+
return Math.max(0, seconds * 1000);
|
|
117
|
+
const at = Date.parse(header);
|
|
118
|
+
return Number.isFinite(at) ? Math.max(0, at - Date.now()) : undefined;
|
|
119
|
+
}
|
|
73
120
|
/** Exponential backoff with jitter, capped. */
|
|
74
121
|
export function backoffMs(attempt, baseMs = 1000, capMs = 300_000) {
|
|
75
122
|
const exponential = Math.min(capMs, baseMs * 2 ** attempt);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/transport/client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentstrack/collector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Privacy-first telemetry collector for AI coding agents \u2014 Claude Code, Codex, and more. Local-first, open source.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"CHANGELOG.md"
|
|
17
17
|
],
|
|
18
18
|
"engines": {
|
|
19
|
-
"node": ">=
|
|
19
|
+
"node": ">=22"
|
|
20
20
|
},
|
|
21
21
|
"keywords": [
|
|
22
22
|
"claude-code",
|