Skip to content

Add the new ChangeSet utility#689

Merged
kyasbal merged 3 commits into
GoogleCloudPlatform:epic/file-schema-v6from
kyasbal:push-zvrvvunrunvz
May 29, 2026
Merged

Add the new ChangeSet utility#689
kyasbal merged 3 commits into
GoogleCloudPlatform:epic/file-schema-v6from
kyasbal:push-zvrvvunrunvz

Conversation

@kyasbal

@kyasbal kyasbal commented May 22, 2026

Copy link
Copy Markdown
Member

Introduces LogChangeSet and TimelineChangeSet utilities to stage log metadata modifications and timeline events/revisions during parsing. This pattern decouples the parsing logic from the underlying serialization details (such as string interning, ID resolution, and lock management) and significantly improves the testability of parsers.

Key Changes

  • ChangeSet Utilities (changeset.go): Added LogChangeSet to accumulate metadata updates for a log, and TimelineChangeSet to stage events and revisions for multiple timeline paths. Both structures provide a Flush method to apply accumulated changes safely.
  • Test Asserters (changeset_asserter.go): Added TimelineChangeSetAsserter and LogChangeSetAsserter to allow highly readable, chainable assertions on accumulated ChangeSet data in parser tests.
  • Log ID Resolution (log_accumulator.go): Updated LogAccumulator to maintain a mapping between parser-side log IDs and serialized log IDs, enabling dynamic ID resolution during timeline item construction.
  • Encapsulated Timeline Building (timeline_builder.go, timeline_registry.go): Modified TimelineBuilder methods to accept parser-side domain models (log.Log and StagingRevision) rather than raw protobuf messages, encapsulating string interning and ID resolution logic within the builder.

Mock code

// ParseLog parses the given log and returns the sets of mutations for the log metadata and timeline items.
// This is the extension side parser. By just returning changeset types, we can easily use asserters to verify them.
func ParseLog(l *log.Log) (*khifilev6.LogChangeSet, *khifilev6.TimelineChangeSet, error) {
	logCS, err := khifilev6.NewLogChangeSet(l)
	if err != nil {
		return nil, nil, err
	}
	logCS.SetSummary("Parsed summary content")
	timelineCS := khifilev6.NewTimelineChangeSet(l)
	targetPath := khifilev6.NewTimelinePath("target-resource")
	// Accumulate an event to the changeset
	timelineCS.AddEvent(targetPath)
	return logCS, timelineCS, nil
}
// ProcessLog is an example of the caller side (e.g., a pipeline runner) flushing the changes. This should be wrapped by base task type side.
func ProcessLog(l *log.Log, logAcc *khifilev6.LogAccumulator, timelineReg *khifilev6.TimelineRegistry) error {
	logCS, timelineCS, err := ParseLog(l)
	if err != nil {
		return err
	}
	// Flush accumulated changes safely to the actual storage
	if err := logCS.Flush(logAcc); err != nil {
		return err
	}
	if err := timelineCS.Flush(timelineReg); err != nil {
		return err
	}
	return nil
}

---
package myparser_test
import (
	"testing"
	pb "github.com/GoogleCloudPlatform/khi/pkg/generated/khifile/v6"
	khifilev6 "github.com/GoogleCloudPlatform/khi/pkg/model/khifile/v6"
	"github.com/GoogleCloudPlatform/khi/pkg/model/log"
	"github.com/GoogleCloudPlatform/khi/pkg/testutil/testchangeset"
	"github.com/myproject/myparser" // replace with actual package path
	"google.golang.org/protobuf/proto"
)
func TestParseLog(t *testing.T) {
	// Initialize common pools required for resolving paths
	idGen := khifilev6.NewIDGenerator()
	internPool := khifilev6.NewInternPool(idGen)
	pathPool := khifilev6.NewTimelinePathPool(idGen, internPool)
	// Pre-resolve expected path using the same pool definition
	expectedSegment := khifilev6.PathSegment{
		Name: "target-resource",
		Type: &pb.TimelineType{Id: proto.Uint32(1)},
	}
	expectedPath := pathPool.Get(nil, expectedSegment)
	testCases := []struct {
		name        string
		inputLog    *log.Log
		wantSummary string
		wantEventOn *khifilev6.TimelinePath
	}{
		{
			name:        "successfully parses log and returns changesets",
			inputLog:    &log.Log{ID: "test-log-id"},
			wantSummary: "Parsed summary content",
			wantEventOn: expectedPath,
		},
	}
	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			// Pass pathPool to the parser
			logCS, timelineCS, err := myparser.ParseLog(tc.inputLog, pathPool)
			if err != nil {
				t.Fatalf("ParseLog() returned unexpected error: %v", err)
			}
			// Verify LogChangeSet fluently
			testchangeset.AssertLog(t, logCS).
				HasSummary(tc.wantSummary)
			// Verify TimelineChangeSet fluently
			if tc.wantEventOn != nil {
				testchangeset.AssertTimeline(t, timelineCS).
					HasEvent(tc.wantEventOn)
			}
		})
	}
}

@kyasbal kyasbal added this to the KHI file format v6 milestone May 22, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces LogChangeSet and TimelineChangeSet to decouple parsing logic from serialization, along with corresponding test utilities and unit tests. It also updates the LogAccumulator to support log ID resolution and refactors the TimelineRegistry and TimelineAccumulator to utilize this new functionality. Feedback highlights a critical issue in NewTimelinePath regarding pointer equality and invalid string interning that could lead to duplicate timelines and corrupted data. Additionally, a performance optimization was suggested to move log ID resolution outside of the event processing loop.

Comment thread pkg/model/khifile/v6/changeset.go Outdated
Comment thread pkg/model/khifile/v6/changeset.go
@kyasbal
kyasbal force-pushed the push-zvrvvunrunvz branch 3 times, most recently from aec808f to c0894d4 Compare May 22, 2026 08:12
@kyasbal
kyasbal marked this pull request as ready for review May 22, 2026 08:28
@kyasbal
kyasbal force-pushed the push-zvrvvunrunvz branch from c0894d4 to a46150b Compare May 25, 2026 04:16
@kyasbal
kyasbal requested a review from K53 as a code owner May 25, 2026 04:16
@kyasbal
kyasbal force-pushed the push-zvrvvunrunvz branch 2 times, most recently from 6f6a126 to ed38131 Compare May 25, 2026 13:34
@kyasbal
kyasbal force-pushed the push-zvrvvunrunvz branch from ed38131 to f658f62 Compare May 27, 2026 13:38
Comment thread pkg/model/khifile/v6/log_accumulator.go Outdated
@kyasbal
kyasbal force-pushed the push-zvrvvunrunvz branch from 11178f7 to 746bc3c Compare May 29, 2026 01:29
@kyasbal
kyasbal merged commit 0a95e8f into GoogleCloudPlatform:epic/file-schema-v6 May 29, 2026
10 checks passed
@kyasbal
kyasbal deleted the push-zvrvvunrunvz branch May 29, 2026 01:32
pull Bot pushed a commit to TheTechOddBug/khi that referenced this pull request Jun 19, 2026
* feat(proto): add proto definitions and build setup for file schema v6 migration (GoogleCloudPlatform#618)

* feat(proto): add proto definitions and build setup for file schema v7 migration

- Add Protobuf definitions for KHI file schema v7 (split into shared.proto, style.proto, timeline.proto, etc.) to migrate from the previous JSON-based file format.

- Set up Buf configuration (buf.yaml, buf.gen.yaml) to generate Go and TypeScript code.

- Add `proto-gen` target to `scripts/make/codegen.mk` using `npx @bufbuild/buf` to support the new build process.

- Generate Go code in `pkg/generated/khifile/` and TypeScript code in `web/src/app/generated/`.

* fixed typos on proto fields

* Specified proto rule and build target

* Rebuild the generated files from the updated proto

* Added linguist-generated for ignoreing generated files by proto

* fix reviewed points and lint error

* fix version number

* Skip proto breaking change check until it's merged

* Fixed shared type names

* fix typos on comments

* feat: update InternedValue proto to have int64 value (GoogleCloudPlatform#623)

* Adding KHI file schema v6 namespaced ID generator (GoogleCloudPlatform#621)

* feat: update InternedValue proto to have int64 value

* Adding KHI file schema v6 namespaced ID generator

* Adding generated files I forgot to push (GoogleCloudPlatform#626)

* feat: update InternedValue proto to have int64 value

* Adding KHI file schema v6 namespaced ID generator

* Adding generated files I forgot to push

* Rolling back GoogleCloudPlatform#626 (GoogleCloudPlatform#627)

* feat: update InternedValue proto to have int64 value

* Adding KHI file schema v6 namespaced ID generator

* Adding generated files I forgot to push

* Fix the lint thing on the generated codes

* feat(web): add v6 parser foundation (errors and interfaces) (GoogleCloudPlatform#628)

* Adding interning utility for file schema version v6 (GoogleCloudPlatform#622)

* feat: update InternedValue proto to have int64 value

* Adding KHI file schema v6 namespaced ID generator

* Adding generated files I forgot to push

* Fix the lint thing on the generated codes

* Adding interning utility used in khi file format v6

* feat(khifile): implement v6 chunk container writer and reader (GoogleCloudPlatform#624)

* Adding serializer/deserializer for InternedStruct (GoogleCloudPlatform#631)

* Add LogAccumulator storing all logs before serializing them into the (GoogleCloudPlatform#633)

khifile

* Add TimelinePath utilities and IDNamespace used for timeline types (GoogleCloudPlatform#632)

* feat(web): add v6 parser binary reader and parser (GoogleCloudPlatform#630)

* feat(web): add v6 parser binary reader and streamer

* address review comments

* Added serializer for timeline registry to flush contents as proto (GoogleCloudPlatform#634)

* Added interned pool types and struct decoder (GoogleCloudPlatform#640)

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#648)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* feat: Adding TimelineStyleRegistry (GoogleCloudPlatform#639)

* Added style related domain stores (GoogleCloudPlatform#658)

* Adding metadata accumulator (GoogleCloudPlatform#646)

* Change input of style registration not to depend on proto (GoogleCloudPlatform#656)

* Adding KHI file format spec and serializer/deserializer spec (GoogleCloudPlatform#650)

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#666)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* improve ts coding rule (GoogleCloudPlatform#667)

* Merge main branch into epic/file-schema-v6 (GoogleCloudPlatform#670)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

* fixed the flaky backend test due to race condition (GoogleCloudPlatform#665)

* improved sticky header to show resource layer (GoogleCloudPlatform#663)

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Removed InternedStuctDTO (GoogleCloudPlatform#664)

This type is duplication of the pb.InternedStruct.
It's internal type of the domain store but its a shared proto type which
is expected not to change by file version update.

* add v6 khi file builder (GoogleCloudPlatform#652)

* Add listing methods in style-store (GoogleCloudPlatform#668)

* Added log related domain stores (GoogleCloudPlatform#641)

* Updated the frontend-codegen to generate icon list from registered styles (GoogleCloudPlatform#672)

* Adding color helper functions and better validation on style (GoogleCloudPlatform#673)

registration

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#683)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

* fixed the flaky backend test due to race condition (GoogleCloudPlatform#665)

* improved sticky header to show resource layer (GoogleCloudPlatform#663)

* Removed redundant v from the version string (GoogleCloudPlatform#671)

* bugfix: automatic log scroll is not matching to the actual element (GoogleCloudPlatform#675)

* bugfix: ignore changing selected timeline when user clicked a log from log list (GoogleCloudPlatform#674)

* bugfix: automatic scroll to the beginning time of log query when user selected a timeline without point to a log (GoogleCloudPlatform#676)

* bugfix: scaling around right edge of query duration may be clipped to jump to other timing (GoogleCloudPlatform#677)

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Define log type and severity timeline style variables (GoogleCloudPlatform#685)

* Add some style fields in TimelineType (GoogleCloudPlatform#684)

* Add core timeline domain models and timeline store (GoogleCloudPlatform#682)

* Adding the InspectionDataBuilder to build the domain layer (GoogleCloudPlatform#643)

* updated tests for the updated style.proto

* Adding the InspectionDataBuilder to build the domain layer

* fix failed CI due to wrong Makefile dependency (GoogleCloudPlatform#694)

* updated tests for the updated style.proto

* fix failed CI due to wrong Makefile dependency

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#696)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

* fixed the flaky backend test due to race condition (GoogleCloudPlatform#665)

* improved sticky header to show resource layer (GoogleCloudPlatform#663)

* Removed redundant v from the version string (GoogleCloudPlatform#671)

* bugfix: automatic log scroll is not matching to the actual element (GoogleCloudPlatform#675)

* bugfix: ignore changing selected timeline when user clicked a log from log list (GoogleCloudPlatform#674)

* bugfix: automatic scroll to the beginning time of log query when user selected a timeline without point to a log (GoogleCloudPlatform#676)

* bugfix: scaling around right edge of query duration may be clipped to jump to other timing (GoogleCloudPlatform#677)

* Updated CODEOWNER file (GoogleCloudPlatform#678)

* Updated the release.yml for GitHub (GoogleCloudPlatform#679)

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* enforce @typescript-eslint/array-type ESlint rule (GoogleCloudPlatform#695)

* enforce @typescript-eslint/array-type ESlint rule

* Enable prettier with configuration files having suffix .mjs

* Add lookup methods to Timeline and their unit tests (GoogleCloudPlatform#686)

* Add lookup methods to Timeline and their unit tests

* fixed the reviewed points

* Defined TimelineTypes from the previously defined enum.ParentRelationshipTypes (GoogleCloudPlatform#688)

* Replace the serializer task to use the new file format serializer (GoogleCloudPlatform#693)

* Replace Serializer task with the new file builder and implemented progress reporting feature

* Added issue tracker ID in the TODO comment

* Add the new ChangeSet utility (GoogleCloudPlatform#689)

* Add SetAlias method on TimelineAccumulator

* Add the new ChangeSet utility

* Added issue number on the TODO comment

* Add timeline hierarchy and parent-child relationship getters/iterators (GoogleCloudPlatform#687)

* Make storybook works with BigInt (GoogleCloudPlatform#702)

* Updated Typescript coding rule (GoogleCloudPlatform#713)

* Added handling for non UTF-8 valid string (GoogleCloudPlatform#712)

* Added handling for non UTF-8 valid string

* fixed the commented part in the review and added test for the corner case

* Implemented the missing part of file parser (GoogleCloudPlatform#700)

* Added timeline mapper base task type (GoogleCloudPlatform#703)

* Added util used in log ingestor or timeline mappers

* Added timeline mapper base task type

* Added log ingester base task types (GoogleCloudPlatform#704)

* Added util used in log ingestor or timeline mappers

* Added log ingester base task types

* Added severity utils to parse GCP severity (GoogleCloudPlatform#710)

* Added severity utils to parse GCP severity

* fixed problems pointed by the review

* Add FeatureTaskLabelV2 (GoogleCloudPlatform#711)

* Pure UI components for advanced timeline toolbar (GoogleCloudPlatform#706)

* added timeline-view and its timeline filters (GoogleCloudPlatform#707)

* Adding metadata domain layer (GoogleCloudPlatform#701)

* Adding metadata domain layer

* resolving conflict

* Added SKILL for building tasks on log ingesters or timeline mapper (GoogleCloudPlatform#714)

* Added SKILL for building tasks on log ingesters or timeline mapper

* fixed reviewed points

* Defined TimelineTypes, RevisionStates and related utilities (GoogleCloudPlatform#715)

* Defined TimelineTypes, RevisionStates and related utilities

* fixed reviewed points

* Adding blueprint type for v6 (GoogleCloudPlatform#717)

* Adding blueprint type for v6

* fixed GCA reviewed points

* Adding timeline sorting logic (GoogleCloudPlatform#718)

* Adding timeline sorting logic

* fixed GCA's reviewed points

* Fixed Makefile to generate proto artifacts automatically before building other codes (GoogleCloudPlatform#719)

* Advanced timeline toolbar integrating CEL filtering and timeline-view (GoogleCloudPlatform#716)

* Advanced timeline toolbar integrating CEL filtering and timeline-view

* fixed GCA reviewed point

* Optimized structured data storing in domain store (GoogleCloudPlatform#721)

* Make domain type to hold structured data with protobuf binary

* Cache body object with WeakRef in Log and Revision

* Centralized interned struct body cache

* Adding khi_parser skill to define a new parser (GoogleCloudPlatform#720)

* Migrate CSM access log and TD resource audit log parsers to file format v6 (GoogleCloudPlatform#722)

* Migrate CSM access log and TD resource audit log parsers to file format v6

* Use resource.labels.project_id instead of the resource name

* fixed GCA's review commented part

* Migrate GCE network audit log  parsers to file format v6 (GoogleCloudPlatform#723)

* Migrate GCE network audit log  parsers to file format v6

* fixed GCA's review commented part

* Migrate K8s event log parsers to file format v6 (GoogleCloudPlatform#724)

* Migrate GKE cluster autoscaler log parsers to file format v6 (GoogleCloudPlatform#725)

* Migrate GKE cluster autoscaler log parsers to file format v6

* fix autoscale related tests

* Migrate Composer log parsers to file format v6 (GoogleCloudPlatform#726)

* Migrate Composer log parsers to file format v6

* fixed review commented part by GCA

* Migrate K8s node log parsers to file format v6 (GoogleCloudPlatform#728)

* Migrate K8s node log parsers to file format v6

* fixed GCA's review commented part

* Migrate GKE multicloud audit log parsers to file format v6 (GoogleCloudPlatform#727)

* Migrate K8s controlplane log parsers to file format v6 (GoogleCloudPlatform#729)

* Migrate K8s controlplane log parsers to file format v6

* fix control plane related tests

* fixed GCA's commented part

* Migrate GCE serial port log parsers to file format v6 (GoogleCloudPlatform#730)

* Migrate GCE serial port log parsers to file format v6

* fix serialport related parser tests

* fixed GCA's commented part

* Migrate K8s audit log parsers to file format v6 (GoogleCloudPlatform#731)

* Implemented base task utilities for k8s audit log parser

* Migrate K8s audit log parsers to file format v6

* Migrate GKE audit log parsers to file format v6 (GoogleCloudPlatform#732)

* Migrate Compute API audit log parsers to file format v6 (GoogleCloudPlatform#733)

* Migrate Compute API audit log parsers to file format v6

* fix GCA's commented parts

* Migrate K8s container log parsers to file format v6 (GoogleCloudPlatform#734)

* Migrate K8s container log parsers to file format v6

* fix GCA's commented parts

* Migrate GDC audit log parsers to file format v6 (GoogleCloudPlatform#735)

* Migrate GDC audit log parsers to file format v6

* fixed GCA's commented part

* Migrate OSS event parser to KHI file format v6 (GoogleCloudPlatform#738)

* adding mock inspection data (GoogleCloudPlatform#737)

* adding mock inspection data

* fixed GCA's suggested part

* Adding services needed to migrate timeline components to the new domain type (GoogleCloudPlatform#742)

* Add InspectionDataStore

* Adding selection manager v2

* fix issues pointed by gca and tests

* Replace referenced domain types to the new type in the log related components (GoogleCloudPlatform#743)

* Replace referenced domain types to the new type in the log related components

* fixed review points

* Replace domain types used from the timeline related components (GoogleCloudPlatform#744)

* Replace domain types used from the timeline related components

* [broken]timeline hover overlay

* [broken]timeline-legend component

* [broken]timline-ruler component

* [broken] Migrated timeline-index component

* [Broken]Migrating renderer resources

* Migrating other timeline resources

* fixed storybook build failure

* fixed reviewed points

* extend memory limit for ng lint (GoogleCloudPlatform#745)

* Integrate the new timeline view classes and current toolbar component (GoogleCloudPlatform#746)

* Integrate the timeline filter component

* Updated toolbar

* fix GCA's commented part

* Fixed the separate diff page works with the new domain store (GoogleCloudPlatform#747)

* fix graph data converter

* fixed diff separated page

* fixed compilation error

* fixed GCA's reviewed points

* Remove @type field contained in `request` and `respone` of the protoPayload in audit logs (GoogleCloudPlatform#748)

* Add field filter node

* Remove @type field of request or response in the manifest generator

* fixed GCA's comented part

* Cleaning up unused codes on backend (GoogleCloudPlatform#749)

* Removing old code on backend side

* Remove MainMessage fieldset

* Added sorting configuration on timeline type (GoogleCloudPlatform#750)

* Added sorting configuration on timeline type

* fixed failed unit tests

* Improved CEL based filtering (GoogleCloudPlatform#751)

* Improved CEL based filtering

* fixed failing unit tests

* fixed GCA's reviewed part

* Added standard log filtering components (GoogleCloudPlatform#753)

* Added standard log filtering components

* fixed GCA's commented part

* Unified timeline-advanced-toolbar and timeline-toolbar (GoogleCloudPlatform#754)

* Unified timeline-advanced-toolbar and timeline-toolbar

* defined dedicated error for cancellation

* fixed GCA's reviewed part

* Index severity field with timeline filter (GoogleCloudPlatform#755)

* Index severity field with timeline filter

* fixed GCA's reviewed part

* Added CEL guide and its popup components (GoogleCloudPlatform#756)

* Added CEL guide and its popup components

* fixed GCA's commented part

* Added typeChip foreground property on the TimelineStyle protos (GoogleCloudPlatform#758)

* Implemented functions to copy a domain store data to the other worker with SharedArrayBuffer (GoogleCloudPlatform#757)

* SharedArrayBuffer experiment

* Migrated store data to SharedArrayBuffer for utilizing WebWorkers

* Allowed empty value in the filter builder (GoogleCloudPlatform#761)

* allowed empty value in the filter builder

* fixed GCA's commented part

* Added style override dialog to preview timeline styles easier (GoogleCloudPlatform#762)

* Added style override dialog to preview timeline styles easier

* fixed GCA's commented part

* Migrate log/timeline searching to WebWorker (GoogleCloudPlatform#763)

* Migrate log searching to WebWorker

* fixed GCA's commented part

* Implement search cancellation for log and timeline async queries (GoogleCloudPlatform#764)

* Implemented cancellation

* fixed GCA's commented part

* Restructure timeline paths hierarchically under Projects and Category folders (GoogleCloudPlatform#765)

* adjusting colors and styles

* refactor: reuse common contract methods directly in autoscaler parser

* Optimized memory usage for searching (GoogleCloudPlatform#769)

* Optimized memory usage for searching

* fixed GCA's reviewed part

* bug: fix log scrolling by arrow keys (GoogleCloudPlatform#770)

* bug: fix log scrolling by arrow keys

* fixed GCA's reviewed part

* update descriptions on feature tasks (GoogleCloudPlatform#771)

* update descriptions on feature tasks

* fixed GCA's reviewed part

* Improved search feature on diffs/logs (GoogleCloudPlatform#773)

* Improved search feature on diffs/logs

* Address review comments for PR 773

* bug: fix unintentionally jump to another timeline when 2 or more logs are associated with the same log (GoogleCloudPlatform#772)

* bug: fix unintentionally jump to another timeline when 2 or more logs are associated with the same log

* Addressed review comments for PR 772

* update descriptive messages used on KHI (GoogleCloudPlatform#774)

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#775)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

* fixed the flaky backend test due to race condition (GoogleCloudPlatform#665)

* improved sticky header to show resource layer (GoogleCloudPlatform#663)

* Removed redundant v from the version string (GoogleCloudPlatform#671)

* bugfix: automatic log scroll is not matching to the actual element (GoogleCloudPlatform#675)

* bugfix: ignore changing selected timeline when user clicked a log from log list (GoogleCloudPlatform#674)

* bugfix: automatic scroll to the beginning time of log query when user selected a timeline without point to a log (GoogleCloudPlatform#676)

* bugfix: scaling around right edge of query duration may be clipped to jump to other timing (GoogleCloudPlatform#677)

* Updated CODEOWNER file (GoogleCloudPlatform#678)

* Updated the release.yml for GitHub (GoogleCloudPlatform#679)

* fix: confirm refresh when backend disconnects (GoogleCloudPlatform#692)

* fix: confirm refresh when backend disconnects

Signed-off-by: Haihan Jiang <[email protected]>

* chore: use absolute imports in root tests

Signed-off-by: Haihan Jiang <[email protected]>

* Align unload confirmation with disconnect review

---------

Signed-off-by: Haihan Jiang <[email protected]>

* Handle slog attributes in KHI log formatter (GoogleCloudPlatform#708)

* Handle slog attributes in KHI log formatter

* Optimize KHI log attribute formatting

* Handle KHI log formatter review feedback

* Change default listen host to 127.0.0.1 from localhost (GoogleCloudPlatform#759)

* Improve retry logic to consider temporal failure due to ECP issue (GoogleCloudPlatform#760)

* Improve retry logic to consider temporal failure due to ECP issue

* fixed GCA's reviewed points

---------

Signed-off-by: kyasbal <[email protected]>
Signed-off-by: Haihan Jiang <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Haihan Jiang <[email protected]>

* Update the usability of timeline hover component (GoogleCloudPlatform#777)

* Optimize log lookup and resolve sticky header overlay placement

- Resolve target timeline fallback order (selectedTimeline -> descendants -> all timelines)
- Compensate hover placement offset when hovering directly over the sticky header
- Optimize preceding and succeeding log extraction using bisectLeft
- Standardize timestamps to bigint (nanoseconds) across hover resolution

* Visualize current cursor time with a dedicated separator line

- Propagate cursor time as bigint (nanoseconds) to the hover overlay
- Update lastClickedTime dynamically on mouse movement across empty timeline periods
- Conditionally insert a dedicated cursor separator row (isCursor: true) only when hovering over empty timeline periods
- Render cursor row with flex container and CSS dashed lines flanking centered text
- Enforce dashed lines expansion with flex: 1 1 20px and height: 1px
- Update Storybook stories to include mock cursorTime property

* addressed comments on PR777

* feat: show RevisionState description popup on hover in timeline legend (GoogleCloudPlatform#776)

* feat: show RevisionState description popup on hover in timeline legend

* addressed comments on PR776

* Added diagram view to the golden layout tab (GoogleCloudPlatform#780)

* feat: embed graph view as a GoldenLayout tab

* Remove diagram button from the toolbar

* addressed PR comments on GoogleCloudPlatform#780

* make storybook not freezed by serialization (GoogleCloudPlatform#781)

* make storybook not freezed by serialization

* addressed PR781 review comments

* Make graph draw feature async (GoogleCloudPlatform#782)

* Make graph draw feature async

* addressed PR782 review comments

* removed unused frontend codes (GoogleCloudPlatform#783)

* Improved layout menu buttons (GoogleCloudPlatform#784)

* Merge main into epic/file-schema-v6 (GoogleCloudPlatform#786)

* Removing unused CORS code (GoogleCloudPlatform#619)

* Removing unused CORS code

* Update pkg/core/init/default/defaultextension.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Replaced unsafe innerHTML with textContent (GoogleCloudPlatform#620)

* feat(startup): implement smart component and integrate data loading (GoogleCloudPlatform#599)

* feat(startup): add inspection list components

* feat(startup): implement smart component and integrate data loading GoogleCloudPlatform#558

* Fix name of the function pointed out by the review

* chore: fix make setup error in jj and update dev guide (GoogleCloudPlatform#629)

* chore: fix make setup error in jj and update dev guide

* fix commented issues on review

* fixed minor issues on Makefile (GoogleCloudPlatform#644)

* Merge epic/csm-parser into main (GoogleCloudPlatform#645)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name (GoogleCloudPlatform#635)

* Add fleet PJ form task and query task to gather CSM TD audit logs (GoogleCloudPlatform#636)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for TD resource logs (GoogleCloudPlatform#637)

* Add Inventory/Discovery tasks for parsing the map from NEG name to BS name

* Adding form task to receive the fleet project and query task to gather logs from Cloud Logging

* Add timeline mapper for traffic director resource logs

* 🐛 fix set-input suggestion being wrapped for every lines (GoogleCloudPlatform#638)

* fix set-input suggestion being wrapped for every lines

* Update web/src/app/timeline-toolbar/components/set-input-popup.component.scss

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Signed-off-by: kyasbal <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Fix bugs to register the CSM TD parser tasks (GoogleCloudPlatform#647)

* Fix the same issue of GoogleCloudPlatform#638 (GoogleCloudPlatform#659)

* Adding make clean command (GoogleCloudPlatform#651)

* Addming make clean command

* fixed commented points

* Removing unused old headers on frontend (GoogleCloudPlatform#660)

* removed prefix 'v2' in shader files (GoogleCloudPlatform#661)

* rename commonlogk8sauditv2 to commonlogk8saudit (GoogleCloudPlatform#662)

* fixed the flaky backend test due to race condition (GoogleCloudPlatform#665)

* improved sticky header to show resource layer (GoogleCloudPlatform#663)

* Removed redundant v from the version string (GoogleCloudPlatform#671)

* bugfix: automatic log scroll is not matching to the actual element (GoogleCloudPlatform#675)

* bugfix: ignore changing selected timeline when user clicked a log from log list (GoogleCloudPlatform#674)

* bugfix: automatic scroll to the beginning time of log query when user selected a timeline without point to a log (GoogleCloudPlatform#676)

* bugfix: scaling around right edge of query duration may be clipped to jump to other timing (GoogleCloudPlatform#677)

* Updated CODEOWNER file (GoogleCloudPlatform#678)

* Updated the release.yml for GitHub (GoogleCloudPlatform#679)

* fix: confirm refresh when backend disconnects (GoogleCloudPlatform#692)

* fix: confirm refresh when backend disconnects

Signed-off-by: Haihan Jiang <[email protected]>

* chore: use absolute imports in root tests

Signed-off-by: Haihan Jiang <[email protected]>

* Align unload confirmation with disconnect review

---------

Signed-off-by: Haihan Jiang <[email protected]>

* Handle slog attributes in KHI log formatter (GoogleCloudPlatform#708)

* Handle slog attributes in KHI log formatter

* Optimize KHI log attribute formatting

* Handle KHI log formatter review feedback

* Change default listen host to 127.0.0.1 from localhost (GoogleCloudPlatform#759)

* Improve retry logic to consider temporal failure due to ECP issue (GoogleCloudPlatform#760)

* Improve retry logic to consider temporal failure due to ECP issue

* fixed GCA's reviewed points

* bug: fix CSM's access log query was wrong for GDC clusters (GoogleCloudPlatform#779)

* bug: fix CSM's access log query was wrong for GDC clusters

* addressed comment in GoogleCloudPlatform#779

---------

Signed-off-by: kyasbal <[email protected]>
Signed-off-by: Haihan Jiang <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Haihan Jiang <[email protected]>

---------

Signed-off-by: kyasbal <[email protected]>
Signed-off-by: Haihan Jiang <[email protected]>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Haihan Jiang <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants