From 098b7bf20fdbf229d1dea94c01222ba2ebe4c8bb Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 21:41:47 -0700 Subject: [PATCH 1/6] feat(langgraph): report a development session when the agent bridge is created Co-Authored-By: Claude Fable 5.1 --- .../src/lib/internals/stream-manager.bridge.spec.ts | 11 +++++++++-- .../src/lib/internals/stream-manager.bridge.ts | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/langgraph/src/lib/internals/stream-manager.bridge.spec.ts b/libs/langgraph/src/lib/internals/stream-manager.bridge.spec.ts index 7031e2f40..92ef08577 100644 --- a/libs/langgraph/src/lib/internals/stream-manager.bridge.spec.ts +++ b/libs/langgraph/src/lib/internals/stream-manager.bridge.spec.ts @@ -32,13 +32,20 @@ describe('automatic development evidence', () => { return { transport, subjects, destroy$, bridge }; } + it('reports a session on construction before any request', () => { + const { destroy$ } = setup(); + expect(developmentEvidence.touches).toBe(1); + expect(developmentEvidence.events).toEqual([]); + destroy$.next(); + expect(developmentEvidence.disposed).toBe(1); + }); + it('requires root terminal evidence and disposes with the bridge', async () => { const { transport, bridge, destroy$ } = setup(); - expect(developmentEvidence.touches).toBe(0); const run = bridge.submit({}); transport.emit([{ type: 'values', data: { done: true } }]); transport.close(); await run; - expect(developmentEvidence.touches).toBeGreaterThan(0); + expect(developmentEvidence.touches).toBeGreaterThan(1); expect(developmentEvidence.events).toContain('transport.connected'); expect(developmentEvidence.events).toContain('runtime.first_stream_completed'); destroy$.next(); diff --git a/libs/langgraph/src/lib/internals/stream-manager.bridge.ts b/libs/langgraph/src/lib/internals/stream-manager.bridge.ts index 39a11844c..5a8579b88 100644 --- a/libs/langgraph/src/lib/internals/stream-manager.bridge.ts +++ b/libs/langgraph/src/lib/internals/stream-manager.bridge.ts @@ -150,6 +150,9 @@ export function createStreamManagerBridge options.telemetry === undefined, }); + // One session observation per boot. touch() carries every guard and the + // per-session dedupe, so this is inert in production, automation and SSR. + developmentRuntime.touch(); // Intercept onThreadId so currentThreadId tracks a thread the DEFAULT // transport auto-creates. Without this, each submit() would create a new // thread because currentThreadId stays null. This wrapper only reaches the From e3ab8d4288a07e0d90a3b54008feb0c62b22b216 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 21:45:26 -0700 Subject: [PATCH 2/6] feat(ag-ui): report a development session when the agent is created Co-Authored-By: Claude Fable 5.1 --- libs/ag-ui/src/lib/to-agent.spec.ts | 7 ++++--- libs/ag-ui/src/lib/to-agent.ts | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libs/ag-ui/src/lib/to-agent.spec.ts b/libs/ag-ui/src/lib/to-agent.spec.ts index 7f3a1ff68..ab159085f 100644 --- a/libs/ag-ui/src/lib/to-agent.spec.ts +++ b/libs/ag-ui/src/lib/to-agent.spec.ts @@ -40,14 +40,15 @@ describe('automatic development evidence', () => { expect(isDevelopmentRuntimeEnabled(agent)).toBe(telemetry === undefined); } }); - it('requires a current RUN_FINISHED success, and ignores construction and empty close', async () => { + it('reports a session on construction and requires a current RUN_FINISHED success', async () => { developmentEvidence.events = []; developmentEvidence.touches = 0; const stub = new StubAgent(); const agent = toAgent(stub as unknown as AbstractAgent); - expect(developmentEvidence.touches).toBe(0); - await agent.submit({}); expect(developmentEvidence.touches).toBe(1); expect(developmentEvidence.events).toEqual([]); + await agent.submit({}); + expect(developmentEvidence.touches).toBe(2); + expect(developmentEvidence.events).toEqual([]); stub.runAgent.mockImplementationOnce(async () => { stub.emit({ type: 'UNKNOWN' } as BaseEvent); expect(developmentEvidence.events).toEqual([]); diff --git a/libs/ag-ui/src/lib/to-agent.ts b/libs/ag-ui/src/lib/to-agent.ts index f82de093b..b5dc3be9e 100644 --- a/libs/ag-ui/src/lib/to-agent.ts +++ b/libs/ag-ui/src/lib/to-agent.ts @@ -265,6 +265,8 @@ function createAgentAdapter( installationToken: (typeof ngDevMode === 'undefined' || ngDevMode) && isDevMode() ? installationToken : null, enabled: () => options.telemetry === undefined, }); + // One session observation per boot; guards and dedupe live inside touch(). + developmentRuntime.touch(); interface AdapterRun extends ReducerDeliveryRun { startedAt: number; telemetrySettled: boolean; From c9845585bf893339e525591668d43b54d850dee8 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 21:49:26 -0700 Subject: [PATCH 3/6] feat(render): report a development session when the render element is constructed Co-Authored-By: Claude Fable 5.1 --- libs/render/src/lib/development-mount.spec.ts | 19 ++++++++++++++++++- .../src/lib/render-element.component.ts | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libs/render/src/lib/development-mount.spec.ts b/libs/render/src/lib/development-mount.spec.ts index 7aa9509f8..535e4953f 100644 --- a/libs/render/src/lib/development-mount.spec.ts +++ b/libs/render/src/lib/development-mount.spec.ts @@ -20,11 +20,15 @@ class FallbackComponent {} describe('development generative UI mount evidence', () => { let mounted: ReturnType; + let touched: ReturnType; beforeEach(() => { mounted = vi.fn(); + touched = vi.fn(); vi.spyOn(telemetry, 'createDevelopmentRuntime').mockImplementation( (options) => ({ - touch: vi.fn(), + touch: () => { + if (options.enabled?.() !== false) touched(); + }, dispose: vi.fn(), milestone: (kind) => { if (options.enabled?.() !== false) mounted(kind); @@ -104,4 +108,17 @@ describe('development generative UI mount evidence', () => { fx.detectChanges(); expect(mounted).not.toHaveBeenCalled(); }); + it('reports a session when the element is constructed, before any mount', () => { + const fx = fixture(spec()); + expect(mounted).not.toHaveBeenCalled(); + fx.detectChanges(); + expect(touched).toHaveBeenCalledTimes(1); + fx.detectChanges(); + expect(touched).toHaveBeenCalledTimes(1); + }); + it('does not report a session when the collection policy is disabled', () => { + const fx = fixture(spec(), false); + fx.detectChanges(); + expect(touched).not.toHaveBeenCalled(); + }); }); diff --git a/libs/render/src/lib/render-element.component.ts b/libs/render/src/lib/render-element.component.ts index 2493357cf..b387209ec 100644 --- a/libs/render/src/lib/render-element.component.ts +++ b/libs/render/src/lib/render-element.component.ts @@ -162,6 +162,8 @@ export class RenderElementComponent implements OnInit { private destroyed = false; constructor() { + // One session observation per boot; guards and dedupe live inside touch(). + this.development.touch(); this.destroyRef.onDestroy(() => this.development.dispose()); afterEveryRender(() => { // Evidence is the mounted outlet itself: an element that is hidden, From 4b6f5275a2984ff45a25c6c80dd2e7b00a800f6e Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 21:55:51 -0700 Subject: [PATCH 4/6] docs(telemetry): creating an agent reports one development session; harden construction tests Co-Authored-By: Claude Fable 5.1 --- libs/ag-ui/README.md | 4 ++-- libs/ag-ui/src/lib/to-agent.spec.ts | 2 +- libs/chat/README.md | 4 ++-- libs/langgraph/README.md | 4 ++-- libs/render/README.md | 4 ++-- libs/render/src/lib/development-mount.spec.ts | 7 +++++-- libs/telemetry/README.md | 4 ++-- libs/telemetry/src/browser/development/runtime.ts | 2 +- 8 files changed, 17 insertions(+), 14 deletions(-) diff --git a/libs/ag-ui/README.md b/libs/ag-ui/README.md index 14b1d420a..d5959e6bc 100644 --- a/libs/ag-ui/README.md +++ b/libs/ag-ui/README.md @@ -236,8 +236,8 @@ MIT. See [LICENSE](../../LICENSE). Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, unused adapter construction, and -automated browsers reporting `navigator.webdriver` are inert. +are required. Production builds, SSR, imports, and +automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/ag-ui/src/lib/to-agent.spec.ts b/libs/ag-ui/src/lib/to-agent.spec.ts index ab159085f..19632dc2e 100644 --- a/libs/ag-ui/src/lib/to-agent.spec.ts +++ b/libs/ag-ui/src/lib/to-agent.spec.ts @@ -47,7 +47,7 @@ describe('automatic development evidence', () => { expect(developmentEvidence.touches).toBe(1); expect(developmentEvidence.events).toEqual([]); await agent.submit({}); - expect(developmentEvidence.touches).toBe(2); + expect(developmentEvidence.touches).toBeGreaterThan(1); expect(developmentEvidence.events).toEqual([]); stub.runAgent.mockImplementationOnce(async () => { stub.emit({ type: 'UNKNOWN' } as BaseEvent); diff --git a/libs/chat/README.md b/libs/chat/README.md index 30640fcda..e628e1f9d 100644 --- a/libs/chat/README.md +++ b/libs/chat/README.md @@ -381,8 +381,8 @@ MIT. See [LICENSE.md](./LICENSE.md). Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, unused adapter construction, and -automated browsers reporting `navigator.webdriver` are inert. +are required. Production builds, SSR, imports, and +automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/langgraph/README.md b/libs/langgraph/README.md index 679d6d21b..3964d3d2f 100644 --- a/libs/langgraph/README.md +++ b/libs/langgraph/README.md @@ -253,8 +253,8 @@ MIT. See [LICENSE](../../LICENSE). Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, unused adapter construction, and -automated browsers reporting `navigator.webdriver` are inert. +are required. Production builds, SSR, imports, and +automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/render/README.md b/libs/render/README.md index 128326a8d..2434f074c 100644 --- a/libs/render/README.md +++ b/libs/render/README.md @@ -130,8 +130,8 @@ MIT. See [LICENSE](../../LICENSE). Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, unused adapter construction, and -automated browsers reporting `navigator.webdriver` are inert. +are required. Production builds, SSR, imports, and +automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/render/src/lib/development-mount.spec.ts b/libs/render/src/lib/development-mount.spec.ts index 535e4953f..8ea84b642 100644 --- a/libs/render/src/lib/development-mount.spec.ts +++ b/libs/render/src/lib/development-mount.spec.ts @@ -99,6 +99,7 @@ describe('development generative UI mount evidence', () => { fx.componentRef.setInput('telemetry', false); fx.detectChanges(); expect(mounted).not.toHaveBeenCalled(); + expect(touched).not.toHaveBeenCalled(); }); it('honors provideRender telemetry false', () => { TestBed.configureTestingModule({ @@ -107,14 +108,16 @@ describe('development generative UI mount evidence', () => { const fx = fixture(spec()); fx.detectChanges(); expect(mounted).not.toHaveBeenCalled(); + expect(touched).not.toHaveBeenCalled(); }); it('reports a session when the element is constructed, before any mount', () => { - const fx = fixture(spec()); - expect(mounted).not.toHaveBeenCalled(); + const fx = fixture(spec({ type: 'Unknown' })); fx.detectChanges(); expect(touched).toHaveBeenCalledTimes(1); + expect(mounted).not.toHaveBeenCalled(); fx.detectChanges(); expect(touched).toHaveBeenCalledTimes(1); + expect(mounted).not.toHaveBeenCalled(); }); it('does not report a session when the collection policy is disabled', () => { const fx = fixture(spec(), false); diff --git a/libs/telemetry/README.md b/libs/telemetry/README.md index 8c49354ca..25a083fda 100644 --- a/libs/telemetry/README.md +++ b/libs/telemetry/README.md @@ -45,8 +45,8 @@ retains its own inert install and explicit helper behavior. LangGraph and AG-UI adapters and the supported JSON renderer use this package's lazy development collector when they are actually used. Angular's `isDevMode()` must be true and browser APIs must be available before identity/storage/network -work. Production builds, SSR, imports, unused runtime construction, and automated -browsers reporting `navigator.webdriver` are inert. +work. Production builds, SSR, imports, and automated +browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. A development build served on a remote hostname is still development software. Events contain random event IDs, a browser-origin UUID, an inactivity session UUID, diff --git a/libs/telemetry/src/browser/development/runtime.ts b/libs/telemetry/src/browser/development/runtime.ts index f77254b58..4ba54272e 100644 --- a/libs/telemetry/src/browser/development/runtime.ts +++ b/libs/telemetry/src/browser/development/runtime.ts @@ -76,7 +76,7 @@ function browserAllowed(): boolean { typeof fetch === 'function' ); } -/** Inert until a supported integration is actually used; never initialize this at module import. */ +/** Inert at module import and until an integration calls touch() or reports a milestone; never initialize this at module import. */ export function createDevelopmentRuntime( options: DevelopmentRuntimeOptions ): DevelopmentRuntime { From 99c1b8d9925512a4832a60c038f4b99f40b606f4 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 22:16:04 -0700 Subject: [PATCH 5/6] test(telemetry): expose structuredClone to the development-bundle sandbox The ag-ui adapter reads an interrupt snapshot via structuredClone during construction since a38669280, which landed after the v0.1.0 tag, so the publish-time bundle verification has failed on main since then. Co-Authored-By: Claude Fable 5.1 --- libs/telemetry/scripts/verify-angular-install-bridge.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/telemetry/scripts/verify-angular-install-bridge.mjs b/libs/telemetry/scripts/verify-angular-install-bridge.mjs index 1b6465497..2f00f2e1b 100644 --- a/libs/telemetry/scripts/verify-angular-install-bridge.mjs +++ b/libs/telemetry/scripts/verify-angular-install-bridge.mjs @@ -253,6 +253,7 @@ async function exerciseBundle( TransformStream, DOMException, queueMicrotask, + structuredClone, crypto: globalThis.crypto, console: { info: () => undefined, From 1fa60abe0e62b420b01a47f60fc134d13b847133 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 16 Sep 2026 22:25:36 -0700 Subject: [PATCH 6/6] docs(website): agent-context disclosure reports one session start on construction Co-Authored-By: Claude Sonnet 5 --- apps/website/content/AGENTS.md.template | 6 ++++-- apps/website/content/CLAUDE.md.template | 6 ++++-- apps/website/public/AGENTS.md | 6 ++++-- apps/website/public/CLAUDE.md | 6 ++++-- libs/ag-ui/README.md | 8 +++++--- libs/ag-ui/src/lib/to-agent.spec.ts | 3 ++- libs/chat/README.md | 8 +++++--- libs/langgraph/README.md | 8 +++++--- libs/render/README.md | 8 +++++--- libs/render/src/lib/development-mount.spec.ts | 2 +- libs/telemetry/README.md | 14 ++++++++------ libs/telemetry/src/browser/development/runtime.ts | 2 +- 12 files changed, 48 insertions(+), 29 deletions(-) diff --git a/apps/website/content/AGENTS.md.template b/apps/website/content/AGENTS.md.template index 6cabb0c97..df100321e 100644 --- a/apps/website/content/AGENTS.md.template +++ b/apps/website/content/AGENTS.md.template @@ -25,8 +25,10 @@ See https://threadplane.ai/privacy. Supported runtime/browser collection is automatic only in Angular development mode. -Production builds, SSR, imports, unused construction, and automated browsers -reporting `navigator.webdriver` are inert. It sends closed +Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; +milestones are reported only when the runtime is actually used. It sends closed progress milestones with package/version and random browser-origin/session IDs, never conversation content or private URLs. Adapter `telemetry: false` disables it; a custom sink replaces the automatic destination, including nested chat JSON rendering. Use diff --git a/apps/website/content/CLAUDE.md.template b/apps/website/content/CLAUDE.md.template index 6cabb0c97..df100321e 100644 --- a/apps/website/content/CLAUDE.md.template +++ b/apps/website/content/CLAUDE.md.template @@ -25,8 +25,10 @@ See https://threadplane.ai/privacy. Supported runtime/browser collection is automatic only in Angular development mode. -Production builds, SSR, imports, unused construction, and automated browsers -reporting `navigator.webdriver` are inert. It sends closed +Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; +milestones are reported only when the runtime is actually used. It sends closed progress milestones with package/version and random browser-origin/session IDs, never conversation content or private URLs. Adapter `telemetry: false` disables it; a custom sink replaces the automatic destination, including nested chat JSON rendering. Use diff --git a/apps/website/public/AGENTS.md b/apps/website/public/AGENTS.md index 0fad5a52d..fcab0fe5f 100644 --- a/apps/website/public/AGENTS.md +++ b/apps/website/public/AGENTS.md @@ -25,8 +25,10 @@ See https://threadplane.ai/privacy. Supported runtime/browser collection is automatic only in Angular development mode. -Production builds, SSR, imports, unused construction, and automated browsers -reporting `navigator.webdriver` are inert. It sends closed +Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; +milestones are reported only when the runtime is actually used. It sends closed progress milestones with package/version and random browser-origin/session IDs, never conversation content or private URLs. Adapter `telemetry: false` disables it; a custom sink replaces the automatic destination, including nested chat JSON rendering. Use diff --git a/apps/website/public/CLAUDE.md b/apps/website/public/CLAUDE.md index 0fad5a52d..fcab0fe5f 100644 --- a/apps/website/public/CLAUDE.md +++ b/apps/website/public/CLAUDE.md @@ -25,8 +25,10 @@ See https://threadplane.ai/privacy. Supported runtime/browser collection is automatic only in Angular development mode. -Production builds, SSR, imports, unused construction, and automated browsers -reporting `navigator.webdriver` are inert. It sends closed +Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; +milestones are reported only when the runtime is actually used. It sends closed progress milestones with package/version and random browser-origin/session IDs, never conversation content or private URLs. Adapter `telemetry: false` disables it; a custom sink replaces the automatic destination, including nested chat JSON rendering. Use diff --git a/libs/ag-ui/README.md b/libs/ag-ui/README.md index d5959e6bc..372b49f9f 100644 --- a/libs/ag-ui/README.md +++ b/libs/ag-ui/README.md @@ -235,9 +235,11 @@ MIT. See [LICENSE](../../LICENSE). ## Development browser collection Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically -report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, and -automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. +report development progress to Threadplane. Angular development mode and browser APIs are +required. Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; milestones +are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/ag-ui/src/lib/to-agent.spec.ts b/libs/ag-ui/src/lib/to-agent.spec.ts index 19632dc2e..3908295b5 100644 --- a/libs/ag-ui/src/lib/to-agent.spec.ts +++ b/libs/ag-ui/src/lib/to-agent.spec.ts @@ -47,7 +47,8 @@ describe('automatic development evidence', () => { expect(developmentEvidence.touches).toBe(1); expect(developmentEvidence.events).toEqual([]); await agent.submit({}); - expect(developmentEvidence.touches).toBeGreaterThan(1); + // construction plus exactly one beginRun per submit + expect(developmentEvidence.touches).toBe(2); expect(developmentEvidence.events).toEqual([]); stub.runAgent.mockImplementationOnce(async () => { stub.emit({ type: 'UNKNOWN' } as BaseEvent); diff --git a/libs/chat/README.md b/libs/chat/README.md index e628e1f9d..21468c8ea 100644 --- a/libs/chat/README.md +++ b/libs/chat/README.md @@ -380,9 +380,11 @@ MIT. See [LICENSE.md](./LICENSE.md). ## Development browser collection Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically -report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, and -automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. +report development progress to Threadplane. Angular development mode and browser APIs are +required. Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; milestones +are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/langgraph/README.md b/libs/langgraph/README.md index 3964d3d2f..12d54c39f 100644 --- a/libs/langgraph/README.md +++ b/libs/langgraph/README.md @@ -252,9 +252,11 @@ MIT. See [LICENSE](../../LICENSE). ## Development browser collection Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically -report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, and -automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. +report development progress to Threadplane. Angular development mode and browser APIs are +required. Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; milestones +are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/render/README.md b/libs/render/README.md index 2434f074c..3a11dd002 100644 --- a/libs/render/README.md +++ b/libs/render/README.md @@ -129,9 +129,11 @@ MIT. See [LICENSE](../../LICENSE). ## Development browser collection Supported LangGraph/AG-UI runtime use and real JSON-render component mounts automatically -report development progress to Threadplane. Angular development mode and browser APIs -are required. Production builds, SSR, imports, and -automated browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. +report development progress to Threadplane. Angular development mode and browser APIs are +required. Production builds, SSR, imports, and automated browsers reporting +`navigator.webdriver` are inert. Creating an agent (or a render element) in a +development-mode browser reports one session start per integration per session; milestones +are reported only when the runtime is actually used. Reports contain package/version, integration, closed milestones, timestamps, a random browser-origin ID, and a session with a 30-minute inactivity boundary. They exclude prompts, messages, application state, private URLs, thread/run IDs, and credentials. diff --git a/libs/render/src/lib/development-mount.spec.ts b/libs/render/src/lib/development-mount.spec.ts index 8ea84b642..dfae19060 100644 --- a/libs/render/src/lib/development-mount.spec.ts +++ b/libs/render/src/lib/development-mount.spec.ts @@ -110,7 +110,7 @@ describe('development generative UI mount evidence', () => { expect(mounted).not.toHaveBeenCalled(); expect(touched).not.toHaveBeenCalled(); }); - it('reports a session when the element is constructed, before any mount', () => { + it('reports a session when the element is constructed, even when nothing mounts', () => { const fx = fixture(spec({ type: 'Unknown' })); fx.detectChanges(); expect(touched).toHaveBeenCalledTimes(1); diff --git a/libs/telemetry/README.md b/libs/telemetry/README.md index 25a083fda..a3feba2aa 100644 --- a/libs/telemetry/README.md +++ b/libs/telemetry/README.md @@ -42,12 +42,14 @@ retains its own inert install and explicit helper behavior. ## Automatic development runtime collection -LangGraph and AG-UI adapters and the supported JSON renderer use this package's -lazy development collector when they are actually used. Angular's `isDevMode()` -must be true and browser APIs must be available before identity/storage/network -work. Production builds, SSR, imports, and automated -browsers reporting `navigator.webdriver` are inert. Creating an agent (or a render element) in a development-mode browser reports one session start per integration per session; milestones are reported only when the runtime is actually used. -A development build served on a remote hostname is still development software. +LangGraph and AG-UI adapters and the supported JSON renderer use this package's lazy +development collector when they are constructed and used. Angular's `isDevMode()` must +be true and browser APIs must be available before identity/storage/network work. +Production builds, SSR, imports, and automated browsers reporting `navigator.webdriver` +are inert. Creating an agent (or a render element) in a development-mode browser reports +one session start per integration per session; milestones are reported only when the +runtime is actually used. A development build served on a remote hostname is still +development software. Events contain random event IDs, a browser-origin UUID, an inactivity session UUID, package/version, integration, timestamps, closed progress milestones, and an optional diff --git a/libs/telemetry/src/browser/development/runtime.ts b/libs/telemetry/src/browser/development/runtime.ts index 4ba54272e..8cf4bbe64 100644 --- a/libs/telemetry/src/browser/development/runtime.ts +++ b/libs/telemetry/src/browser/development/runtime.ts @@ -76,7 +76,7 @@ function browserAllowed(): boolean { typeof fetch === 'function' ); } -/** Inert at module import and until an integration calls touch() or reports a milestone; never initialize this at module import. */ +/** Inert until an integration calls touch() or reports a milestone; never initialize this at module import. */ export function createDevelopmentRuntime( options: DevelopmentRuntimeOptions ): DevelopmentRuntime {