Commit 0539b84
feat(gtm): Spec 1C — cockpit instrumentation (analytics-foundation 1c) (#351)
* docs(gtm): spec for analytics-foundation-1c (cockpit instrumentation)
Spec 1C of the GTM motion. Three-surface cockpit instrumentation:
- Outer (React shell): cockpit:recipe_opened, mode_switched, code_copied
via posthog-js direct
- Inner (Angular iframes, per-example): cockpit:chat_first_message,
transport_connected, thread_persisted, interrupt_handled,
generative_component_rendered via new @ngaf/cockpit-telemetry
private library that subscribes to lifecycle signals on
@ngaf/chat, @ngaf/langgraph, @ngaf/render
- Cross-frame correlation via session UUID in URL params; memory-only
persistence on both frames
Key decisions:
- Architecture B (lifecycle signals + external adapter) — libraries
expose @ngaf/* tokens, adapter is private. Customer apps never emit
cockpit:* events.
- cockpit-telemetry uses posthog-js directly, not @ngaf/telemetry/browser
(cockpit is internal product, different posture from customer libs)
- main.cockpit.ts build-time entry override per example, so example
reference code (main.ts, app.config.ts, components) stays pristine
- Telemetry on by default in production, off on localhost unless
NEXT_PUBLIC_COCKPIT_CAPTURE_LOCAL=true; honors DO_NOT_TRACK
- Activation funnel = 5 signals (dropped cockpit:install_command_copied;
ngaf:postinstall from PR #328 is uncorrelatable to cockpit sessions
by design)
- Renamed cockpit:six_signals_complete → cockpit:activation_complete
- All 32 examples rolled out in batched per-category commits within
this plan; canonical example: cockpit/langgraph/streaming/angular
- Website docs for the three public *_LIFECYCLE tokens land as Phase 5
Phases:
0. Library lifecycle additions (~21 tests)
1. @ngaf/cockpit-telemetry private library (~24 tests, incl.
permanent browser silence test)
2. React shell instrumentation (~17 tests)
3. Canonical streaming example + Chrome MCP smoke
4. 31 remaining examples in 4 category batches
5. Website docs at /docs/<lib>/lifecycle
6. Taxonomy + PostHog dashboard cleanup (drop install_command_copied,
rename event + insight + dashboard, posthog:sync)
Total ~65 tests, 15 new spec files. Pre-PR-#328 design adjusted to
match the new ingest proxy + per-package install telemetry pattern.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(gtm): implementation plan for analytics-foundation-1c (cockpit instrumentation)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(chat): add CHAT_LIFECYCLE InjectionToken + interface
Public API addition for cockpit-telemetry (and other consumers) to
subscribe to per-instance chat lifecycle signals. componentReady,
firstMessageSent (sticky), messageCount and inputSubmittedAt (reset on
clearThread). Token only; wiring lands in next task.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(chat): wire CHAT_LIFECYCLE in ChatComponent
Populates the four lifecycle signals from existing component code
paths: componentReady on the first agent-resolved effect,
firstMessageSent/messageCount/inputSubmittedAt in a new public
submitMessage() (also driven by the chat-input submitted output),
and reset (except sticky firstMessageSent) in a new public
clearThread(). The token is provided component-scoped via a factory
that hands ChatComponent a writable internal handle while consumers
see only the readonly Signal<T> surface. Adds 6 tests covering all
transitions.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(chat): add onUserSubmitted coverage + clarify clearThread doc
Addresses code-quality review feedback on Task 0.2.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(langgraph): add AGENT_LIFECYCLE InjectionToken + interface
8 lifecycle signals exposing transition timestamps. Wiring lands in
agent.fn.ts in the next task. Three signals (interruptResolvedAt,
threadCreatedAt, threadPersistedAt) require new hook points; five are
derived from existing BehaviorSubjects.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(langgraph): wire AGENT_LIFECYCLE in agent.fn.ts
Eight signal updates hooked into existing stream subscriptions and the
agent's submit/switchThread/load-history paths. Three new hooks
(interruptResolvedAt, threadCreatedAt, threadPersistedAt) — five
signals derive from existing stream state. All reset on switchThread.
Lifecycle surface exposed via a new `lifecycle: AgentLifecycle` field
on the returned LangGraphAgent (the factory has no DI scope of its own,
so this is the minimal-pollution path; consumers can re-provide the
AGENT_LIFECYCLE token via standard Angular providers if needed).
Mock agent updated to satisfy the new field. 10 tests cover all
transitions; 154/154 langgraph suite passes.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(render): add RENDER_LIFECYCLE token + service + wiring
Service subscribes to the existing render-event stream and reduces to
five signals. firstMountAt is sticky; the rest update on each event.
Provided via provideRender() so all consumers automatically have access.
All RenderEvents flow through a single emitTapped() in RenderSpecComponent,
which fans out to the events output AND notifies the lifecycle service
(when present). Service is injected optionally so the components remain
usable without provideRender().
5 tests cover all signal transitions.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): scaffold private Nx library
@ngaf/cockpit-telemetry — private (not in publishable group), Angular
library, consumed by the 32 Angular examples via main.cockpit.ts
build-time entry override. Mirrors @ngaf/cockpit-shell scaffold pattern.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): config token + typed event names
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): readCockpitConfigFromIframe — URL param reader
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): ActivationAggregator — 5-signal rollup with 30-min window
6 tests cover the rollup math: pre-complete state, fire-once-when-complete,
idempotent signals, 30-min window reset, duration_ms property on emit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): CockpitTelemetryService — lifecycle subscribers + posthog init
Initializes posthog-js with memory persistence + parent-provided
distinct_id, subscribes to CHAT/AGENT/RENDER lifecycle tokens
(each optional — graceful no-op if absent), fires cockpit:* events
and marks signals on the ActivationAggregator.
6 tests cover init idempotency, capture format, missing-lifecycle
gracefulness, capability property stamping.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): provideCockpitTelemetry() EnvironmentProviders factory
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-telemetry): bootstrapWithCockpitHarness — main.cockpit.ts entry helper
Each cockpit example's main.cockpit.ts calls this with its
AppComponent + appConfig. When URL params present, telemetry providers
are added; otherwise bootstraps pristine.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(cockpit-telemetry): permanent browser silence contract test
When the cockpit harness is not present (no URL params), no eager
import of posthog-js. Mirrors @ngaf/telemetry/browser silence pattern.
Stays green permanently.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(cockpit-telemetry): declare peer deps + use lib- selector in spec
- Add @angular/platform-browser, @ngaf/chat, @ngaf/langgraph, @ngaf/render
to peerDependencies (consumed by harness + service).
- TestComponent in harness.spec.ts uses lib- prefix per project eslint rules.
- Lockfile updated to record posthog-js install for the new private lib.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): analytics module — distinct-id, properties, events, client
Mirrors apps/website/src/lib/analytics/ structure. Memory-only session
UUID, shouldCaptureAnalytics guard with localhost gate + DO_NOT_TRACK
honoring, typed track() helper. ~10 tests.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): posthog-js initialization via instrumentation-client.ts
Memory persistence + parent-side session UUID. Off on localhost by
default (NEXT_PUBLIC_COCKPIT_CAPTURE_LOCAL=true to override). Honors
DO_NOT_TRACK. Three new env vars documented in .env.example.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): fire cockpit:recipe_opened on sidebar capability click
Properties: capability, category, from_capability.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): fire cockpit:mode_switched on mode tab change
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): fire cockpit:code_copied on Code mode copy
Properties: capability, surface=code_mode, file_path.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): fire cockpit:code_copied on narrative docs copy buttons
Two surfaces: docs_code_snippet (inline code blocks) and agentic_prompt
(prompt callouts).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit): RunMode appends cockpit_did/cockpit_cap to iframe src
The iframe URL now carries the session UUID + capability slug + posthog
key + host so the Angular harness can correlate to the parent session.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-streaming): main.cockpit.ts harness entry
Three-line harness uses bootstrapWithCockpitHarness from
@ngaf/cockpit-telemetry. Pristine main.ts unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-streaming): add cockpit build configuration
cockpit/<...>/project.json gains a cockpit build that uses main.cockpit.ts
as the entry. apps/cockpit:serve-streaming now invokes serve:cockpit on
the example. Production build unchanged.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-langgraph): wire 7 examples to cockpit-telemetry harness
Add main.cockpit.ts + cockpit build/serve configurations to the
remaining LangGraph cockpit examples (memory, durable-execution,
subgraphs, deployment-runtime, interrupts, persistence, time-travel).
Update apps/cockpit serve-* targets to use the :serve:cockpit config
so the iframe loads the harness-enabled build.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-deep-agents): wire 6 examples to cockpit-telemetry harness
Add main.cockpit.ts + cockpit build/serve configurations to all
Deep Agents cockpit examples (sandboxes, subagents, memory, planning,
filesystem, skills). Update apps/cockpit serve-* targets to use the
:serve:cockpit config so the iframe loads the harness-enabled build.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-chat): wire 11 examples to cockpit-telemetry harness
Add main.cockpit.ts + cockpit build/serve configurations to all chat
cockpit examples (tool-calls, messages, subagents, input, a2ui,
theming, threads, interrupts, timeline, generative-ui, debug). The
timeline harness preserves the installEmbeddedTheme() call before
bootstrap. Chat examples are launched via the serve-example.ts script;
that script is updated in the render batch.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(cockpit-render): wire 6 examples to cockpit-telemetry harness
Add main.cockpit.ts + cockpit build/serve configurations to all render
cockpit examples (computed-functions, element-rendering, repeat-loops,
state-management, spec-rendering, registry). Also update the shared
serve-example.ts script so both --capability and --all modes launch
the harness-enabled :serve:cockpit configuration; this covers the
chat + render capabilities that don't have per-capability serve-*
targets in apps/cockpit/project.json.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(website): chat/lifecycle.md — CHAT_LIFECYCLE signal docs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(website): langgraph/lifecycle.md — AGENT_LIFECYCLE signal docs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(website): render/lifecycle.md — RENDER_LIFECYCLE signal docs
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(website): link lifecycle pages from each lib's landing
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(gtm): drop install_command_copied + rename activation event
Activation funnel is 5 signals per Spec 1C. ngaf:postinstall is its
own top-of-funnel metric, uncorrelated to cockpit sessions.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(posthog): rename six-signal-activation-funnel → activation-funnel
5 steps (dropped install_command_copied), 30-minute window. posthog_id
nulled to force create on next sync (PostHog will assign a new id).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(posthog): developer-funnel references activation-funnel insight
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* test(cockpit): polyfill CSS.escape in jsdom test setup
jsdom doesn't implement CSS.escape; code-mode copy handler calls it. Tests
passed but vitest flagged an unhandled error. Polyfill restores green nx
test target.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore(gtm): align taxonomy with implemented cockpit shell events
- Rename cockpit:recipe_start → cockpit:recipe_opened (sidebar click)
- Add cockpit:mode_switched (Run/Code/Docs tab change)
- Add cockpit:code_copied (code mode, doc snippet, agentic prompt)
- Update cockpit-recipe-completion insight to use renamed event
- Document that shell events are funnel context, not activation steps
Addresses code-review finding on Spec 1C.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(langgraph,cockpit-telemetry): wire AGENT_LIFECYCLE via registry
Bug: CockpitTelemetryService.subscribeAgent() injected AGENT_LIFECYCLE
which is never provided in DI (agent() exposes lifecycle on its return
object). Three activation signals (transport_connected, thread_persisted,
interrupt_handled) never fired; activation funnel was unreachable.
Fix: Add AgentLifecycleRegistry to @ngaf/langgraph as an optional
service. agent() registers itself if the registry is provided.
provideCockpitTelemetry now provides the registry, and the service
subscribes to lifecycles reactively via a signal effect.
Addresses code-review item on Spec 1C.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* refactor(render): drop providedIn:root on RenderLifecycleService
Service is already provided by provideRender(). The redundant
providedIn:'root' caused both paths to resolve to the same singleton —
removing it makes the scope follow the consumer's provideRender() call
(sub-tree-friendly).
Addresses code-review minor item on Spec 1C.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* docs(website): regenerate api-docs.json for lifecycle additions
Picks up CHAT_LIFECYCLE, AGENT_LIFECYCLE, RENDER_LIFECYCLE tokens +
AgentLifecycleRegistry from Spec 1C. CI drift check would fail without
this regeneration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>1 parent 5909873 commit 0539b84
146 files changed
Lines changed: 6810 additions & 90 deletions
File tree
- apps
- cockpit
- scripts
- src
- components
- code-mode
- modes
- narrative-docs
- run-mode
- sidebar
- lib/analytics
- website
- content/docs
- agent
- api
- getting-started
- guides
- chat
- api
- getting-started
- guides
- render
- api
- getting-started
- guides
- src/lib
- cockpit
- chat
- a2ui/angular
- src
- debug/angular
- src
- generative-ui/angular
- src
- input/angular
- src
- interrupts/angular
- src
- messages/angular
- src
- subagents/angular
- src
- theming/angular
- src
- threads/angular
- src
- timeline/angular
- src
- tool-calls/angular
- src
- deep-agents
- filesystem/angular
- src
- memory/angular
- src
- planning/angular
- src
- sandboxes/angular
- src
- skills/angular
- src
- subagents/angular
- src
- langgraph
- deployment-runtime/angular
- src
- durable-execution/angular
- src
- interrupts/angular
- src
- memory/angular
- src
- persistence/angular
- src
- streaming/angular
- src
- subgraphs/angular
- src
- time-travel/angular
- src
- render
- computed-functions/angular
- src
- element-rendering/angular
- src
- registry/angular
- src
- repeat-loops/angular
- src
- spec-rendering/angular
- src
- state-management/angular
- src
- docs
- gtm
- superpowers
- plans/gtm
- specs/gtm
- libs
- chat/src
- lib
- compositions/chat
- cockpit-telemetry
- src
- lib
- langgraph/src
- lib
- testing
- render/src
- lib
- tools/posthog
- dashboards
- insights
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
| |||
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | | - | |
| 71 | + | |
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
| |||
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | | - | |
| 82 | + | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | | - | |
| 93 | + | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| |||
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
104 | | - | |
| 104 | + | |
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
115 | | - | |
| 115 | + | |
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
126 | | - | |
| 126 | + | |
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
| |||
134 | 134 | | |
135 | 135 | | |
136 | 136 | | |
137 | | - | |
| 137 | + | |
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
| |||
145 | 145 | | |
146 | 146 | | |
147 | 147 | | |
148 | | - | |
| 148 | + | |
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
159 | | - | |
| 159 | + | |
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
| |||
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
170 | | - | |
| 170 | + | |
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
| |||
178 | 178 | | |
179 | 179 | | |
180 | 180 | | |
181 | | - | |
| 181 | + | |
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
| |||
189 | 189 | | |
190 | 190 | | |
191 | 191 | | |
192 | | - | |
| 192 | + | |
193 | 193 | | |
194 | 194 | | |
195 | 195 | | |
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
203 | | - | |
| 203 | + | |
204 | 204 | | |
205 | 205 | | |
206 | 206 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
| 38 | + | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
| 105 | + | |
105 | 106 | | |
106 | 107 | | |
107 | 108 | | |
| |||
112 | 113 | | |
113 | 114 | | |
114 | 115 | | |
| 116 | + | |
115 | 117 | | |
116 | 118 | | |
117 | 119 | | |
| |||
121 | 123 | | |
122 | 124 | | |
123 | 125 | | |
| 126 | + | |
124 | 127 | | |
125 | 128 | | |
126 | 129 | | |
127 | | - | |
| 130 | + | |
128 | 131 | | |
129 | 132 | | |
130 | 133 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
6 | 10 | | |
7 | 11 | | |
8 | 12 | | |
| |||
14 | 18 | | |
15 | 19 | | |
16 | 20 | | |
| 21 | + | |
17 | 22 | | |
18 | 23 | | |
19 | 24 | | |
| |||
111 | 116 | | |
112 | 117 | | |
113 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
114 | 157 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| 5 | + | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
| 13 | + | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
16 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
17 | 27 | | |
18 | 28 | | |
19 | 29 | | |
| |||
38 | 48 | | |
39 | 49 | | |
40 | 50 | | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
41 | 56 | | |
42 | 57 | | |
43 | 58 | | |
| |||
57 | 72 | | |
58 | 73 | | |
59 | 74 | | |
60 | | - | |
| 75 | + | |
61 | 76 | | |
62 | 77 | | |
63 | 78 | | |
| |||
94 | 109 | | |
95 | 110 | | |
96 | 111 | | |
97 | | - | |
| 112 | + | |
98 | 113 | | |
99 | 114 | | |
100 | 115 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
6 | 10 | | |
7 | 11 | | |
8 | 12 | | |
| |||
31 | 35 | | |
32 | 36 | | |
33 | 37 | | |
| 38 | + | |
34 | 39 | | |
35 | 40 | | |
36 | 41 | | |
| |||
70 | 75 | | |
71 | 76 | | |
72 | 77 | | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
73 | 114 | | |
0 commit comments