Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions fallow-baselines/health.json
Original file line number Diff line number Diff line change
Expand Up @@ -283,14 +283,6 @@
"count": 1
}
},
"src/daemon/network-log.ts": {
"complexity_critical": {
"count": 1
},
"crap_critical": {
"count": 1
}
},
"src/daemon/recording-gestures.ts": {
"complexity_moderate": {
"count": 1
Expand Down Expand Up @@ -579,7 +571,6 @@
"src/daemon/session-routing.ts:high impact",
"src/daemon/handlers/session-state.ts:complexity",
"src/snapshot/snapshot-processing.ts:high impact",
"src/daemon/network-log.ts:high impact",
"src/commands/cli-grammar/common.ts:high impact",
"src/daemon/snapshot-presentation/tree.ts:high impact",
"src/utils/success-text.ts:high impact",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
"check:affected:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/check-affected/model.test.ts scripts/check-affected/platform-packages.test.ts scripts/check-affected/run.test.ts",
"check:coverage-changed": "node --experimental-strip-types scripts/coverage-changed/run.ts",
"check:coverage-changed:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/coverage-changed/model.test.ts scripts/coverage-changed/run.test.ts",
"check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/platform-package-policy.test.ts scripts/layering/platform-package-repository.test.ts scripts/layering/platform-package-source-policy.test.ts scripts/layering/device-inventory-cutover-policy.test.ts scripts/layering/logs-runtime-cutover-policy.test.ts scripts/layering/contracts-implementation-policy.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
"check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/platform-package-policy.test.ts scripts/layering/platform-package-repository.test.ts scripts/layering/platform-package-source-policy.test.ts scripts/layering/device-inventory-cutover-policy.test.ts scripts/layering/logs-runtime-cutover-policy.test.ts scripts/layering/network-runtime-cutover-policy.test.ts scripts/layering/contracts-implementation-policy.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
"depgraph": "node --experimental-strip-types scripts/depgraph/build.ts",
"depgraph:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/affected.test.ts",
"check:production-exports": "fallow dead-code --config fallow-production-exports.json --production --unused-exports --fail-on-issues",
Expand Down
32 changes: 0 additions & 32 deletions packages/capture-kit/src/app-log-runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@ import assert from 'node:assert/strict';
import { test, vi } from 'vitest';
import { AppError } from '@agent-device/kernel/errors';
import {
localRuntimeOwner,
providerRuntimeOwner,
type AppLogCompletion,
type AppLogBackgroundProcessRequest,
type AppLogProcessOwnership,
type AppLogProcessTransport,
type AppLogRuntimeHost,
type AppLogRuntimeProviderModule,
type DurableDescriptorCodec,
} from '@agent-device/contracts/platform';
import { APP_LOG_ENVELOPE_FIXTURE } from './durable-resource-envelope.fixtures.ts';
Expand All @@ -26,18 +23,6 @@ const completion: AppLogCompletion = {
completedAt: 42,
};

function compileTimeProviderModuleProof(): void {
const invalid: AppLogRuntimeProviderModule = {
// @ts-expect-error Provider modules cannot advertise a local-family owner.
owner: localRuntimeOwner('apple'),
loadRuntime: async () => {
throw new Error('not loaded');
},
};
void invalid;
}
void compileTimeProviderModuleProof;

function compileTimeProcessTransportProof(): void {
const invalid: AppLogProcessTransport = {
// @ts-expect-error A direct provider runtime is an owner, not a narrow process transport.
Expand Down Expand Up @@ -230,20 +215,3 @@ test('app-log artifact authority resolves canonical paths from durable session i
pidPath: '/sessions/session-a/app-log.pid',
});
});

test('app-log provider module exposes inert exact-owner metadata without loading mechanics', () => {
const loadRuntime = vi.fn(async () => {
throw new Error('not loaded');
});
const module: AppLogRuntimeProviderModule = {
owner: providerRuntimeOwner('limrun', 'tenant-a'),
loadRuntime,
};

assert.deepEqual(module.owner, {
kind: 'provider-runtime',
provider: 'limrun',
instance: 'tenant-a',
});
assert.equal(loadRuntime.mock.calls.length, 0);
});
83 changes: 0 additions & 83 deletions packages/capture-kit/src/app-log-unavailable-runtime.test.ts

This file was deleted.

70 changes: 0 additions & 70 deletions packages/capture-kit/src/app-log-unavailable-runtime.ts

This file was deleted.

7 changes: 4 additions & 3 deletions packages/capture-kit/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export {
assertAppLogSessionArtifacts,
} from './app-log-session-artifacts.ts';
export {
createUnavailableAppLogBinding,
createUnavailableAppLogRuntimeOwner,
} from './app-log-unavailable-runtime.ts';
createUnavailablePlatformRuntimeBinding,
createUnavailablePlatformRuntimeOwner,
} from './platform-runtime-unavailable.ts';
export { mergeNetworkDumps, readRecentNetworkTrafficFromText } from './network-traffic.ts';
37 changes: 37 additions & 0 deletions packages/capture-kit/src/network-traffic-android.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import assert from 'node:assert/strict';
import { test } from 'vitest';
import { readRecentNetworkTrafficFromText } from './network-traffic.ts';

test('preserves Android adjacent packet enrichment', () => {
const dump = readRecentNetworkTrafficFromText(
[
'03-31 17:43:32.564 V/GIBSDK (17434): [NetworkAgent]: packet id 23911610 added, queue size: 1',
'03-31 17:43:32.700 V/OtherTag (17434): unrelated line 1',
'03-31 17:43:32.800 V/OtherTag (17434): unrelated line 2',
'03-31 17:43:32.900 V/OtherTag (17434): unrelated line 3',
'03-31 17:43:33.000 V/OtherTag (17434): unrelated line 4',
'03-31 17:43:33.031 D/GIBSDK (17434): [NetworkAgent] packet id 23911610 total elapsed request/response time, ms: 377; response code: 200;',
'03-31 17:43:33.032 D/GIBSDK (17434): URL: https://api.example.com/fixture',
].join('\n'),
{
path: '/sessions/one/app.log',
exists: true,
backend: 'android',
maxEntries: 5,
include: 'summary',
maxPayloadChars: 2048,
maxScanLines: 100,
},
);

assert.deepEqual(dump.entries[0], {
method: undefined,
url: 'https://api.example.com/fixture',
status: 200,
timestamp: '03-31 17:43:33.032',
packetId: '23911610',
durationMs: 377,
raw: '03-31 17:43:33.032 D/GIBSDK (17434): URL: https://api.example.com/fixture',
line: 7,
});
});
52 changes: 52 additions & 0 deletions packages/capture-kit/src/network-traffic-android.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import type { NetworkEntry } from '@agent-device/contracts/observability';
import { parseNetworkStatusCode, parseNetworkTimestamp } from './network-traffic-value.ts';

const NEARBY_LINE_RADIUS = 5;
const PACKET_SCAN_RADIUS = 12;

export function enrichNetworkEntryFromAndroidLines(
result: NetworkEntry,
lines: string[],
lineIndex: number,
): void {
const nearby = collectNearbyLines(lines, lineIndex, NEARBY_LINE_RADIUS);
const packetId =
result.packetId ??
nearby
.map(parseAndroidPacketId)
.find((value): value is string => typeof value === 'string' && value.length > 0);
if (packetId) result.packetId = packetId;

const related = packetId
? collectNearbyLines(lines, lineIndex, PACKET_SCAN_RADIUS).filter(
(line) => parseAndroidPacketId(line) === packetId,
)
: nearby;
result.timestamp ??= related
.map(parseNetworkTimestamp)
.find((value): value is string => typeof value === 'string' && value.length > 0);
result.status ??=
related
.map(parseNetworkStatusCode)
.find((value): value is number => typeof value === 'number') ?? undefined;
result.durationMs ??=
related
.map(parseAndroidDurationMs)
.find((value): value is number => typeof value === 'number') ?? undefined;
}

export function parseAndroidPacketId(line: string): string | null {
return /\bpacket id (\d+)\b/i.exec(line)?.[1] ?? null;
}

export function parseAndroidDurationMs(line: string): number | null {
const match = /\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(line);
return match ? Number.parseInt(match[1] ?? '', 10) : null;
}

function collectNearbyLines(lines: string[], index: number, radius: number): string[] {
return lines
.slice(Math.max(0, index - radius), Math.min(lines.length, index + radius + 1))
.map((line) => line.trim())
.filter(Boolean);
}
28 changes: 28 additions & 0 deletions packages/capture-kit/src/network-traffic-value.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import assert from 'node:assert/strict';
import { test } from 'vitest';
import {
parseEmbeddedNetworkJson,
parseNetworkStatusCode,
parseNetworkTimestamp,
readNetworkBody,
readNetworkHeaders,
readNetworkJsonNumber,
readNetworkJsonString,
} from './network-traffic-value.ts';

test('decodes embedded network fields without widening parsed JSON', () => {
const line =
'prefix {"method":"POST","statusCode":"201","headers":{"x-id":"abc"},"requestBody":{"ok":true}}';
const decoded = parseEmbeddedNetworkJson(line);

assert.equal(readNetworkJsonString(decoded, ['method']), 'POST');
assert.equal(readNetworkJsonNumber(decoded, ['statusCode']), 201);
assert.equal(readNetworkHeaders(line, decoded), '{"x-id":"abc"}');
assert.equal(readNetworkBody(line, decoded, ['requestBody']), '{"ok":true}');
assert.equal(parseNetworkStatusCode('response code: 204'), 204);
assert.equal(parseNetworkTimestamp('2026-04-02T08:14:44Z GET'), '2026-04-02T08:14:44Z');
});

test('treats malformed embedded JSON as absent', () => {
assert.equal(parseEmbeddedNetworkJson('prefix {bad json}'), null);
});
Loading
Loading