mirror of
https://github.com/safedep/vet.git
synced 2025-12-10 00:22:08 -06:00
* Add initial UI for agent mode * fix: Cleanup and define agent contract * Add react agent * Add interactions memory * Add support for stdio based MCP integration * Add basic sqlite3 report generator * fix: Persist vulnerabilities with package relation * fix: Persist license information * refactor: Agents into its own command package * feat: Add support for tool calling introspection * refactor: UI to hide implementation detail * sqlite3 reporter persist dependency graph * fix: Support multiple LLM provider for agent * docs: Update agents doc * docs: Remove deprecated query docs * fix: UI tests * fix: Linter issue * Add support for prompt mode * Improve UI with animation * Fix UI tests after update * Add OpenSSF scorecard persistence * Add slsa provenances in sqlite3 reporter * Add test cases for sqlite3 reporter * Fix agent doc * fix: Sqlite3 reporter use safe accessors * feat: Add support for fast model * feat: Simplify and streamline agent UI for better user experience - Remove decorative borders and excessive styling to maximize output area - Implement clean minimal design similar to modern TUI interfaces - Add bordered input area for clear visual separation - Move thinking indicator above input area for better visibility - Enhance input field reset logic for proper line alignment - Remove verbose help text and status messages - Optimize layout calculations for full width utilization - Add smooth animations for agent thinking state with spinner - Clean up code structure and remove unused progress bar functionality 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: Improve agent status line * test: Update UI tests * fix: Use terminal safe rendering * fix: Fix nil deref without storing empty strings in DB * fix: Support overwriting sqlite3 database * fix: Data model to use m2m between manifest and package * style: Fix linter issue with unused variables * Misc fixes * Add test for agent memory --------- Co-authored-by: Claude <noreply@anthropic.com>
344 lines
11 KiB
Go
344 lines
11 KiB
Go
// Code generated by ent, DO NOT EDIT.
|
|
|
|
package hook
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/safedep/vet/ent"
|
|
)
|
|
|
|
// The CodeSourceFileFunc type is an adapter to allow the use of ordinary
|
|
// function as CodeSourceFile mutator.
|
|
type CodeSourceFileFunc func(context.Context, *ent.CodeSourceFileMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f CodeSourceFileFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.CodeSourceFileMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.CodeSourceFileMutation", m)
|
|
}
|
|
|
|
// The DepsUsageEvidenceFunc type is an adapter to allow the use of ordinary
|
|
// function as DepsUsageEvidence mutator.
|
|
type DepsUsageEvidenceFunc func(context.Context, *ent.DepsUsageEvidenceMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f DepsUsageEvidenceFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.DepsUsageEvidenceMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.DepsUsageEvidenceMutation", m)
|
|
}
|
|
|
|
// The ReportDependencyFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportDependency mutator.
|
|
type ReportDependencyFunc func(context.Context, *ent.ReportDependencyMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportDependencyFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportDependencyMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportDependencyMutation", m)
|
|
}
|
|
|
|
// The ReportDependencyGraphFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportDependencyGraph mutator.
|
|
type ReportDependencyGraphFunc func(context.Context, *ent.ReportDependencyGraphMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportDependencyGraphFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportDependencyGraphMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportDependencyGraphMutation", m)
|
|
}
|
|
|
|
// The ReportLicenseFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportLicense mutator.
|
|
type ReportLicenseFunc func(context.Context, *ent.ReportLicenseMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportLicenseFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportLicenseMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportLicenseMutation", m)
|
|
}
|
|
|
|
// The ReportMalwareFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportMalware mutator.
|
|
type ReportMalwareFunc func(context.Context, *ent.ReportMalwareMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportMalwareFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportMalwareMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportMalwareMutation", m)
|
|
}
|
|
|
|
// The ReportPackageFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportPackage mutator.
|
|
type ReportPackageFunc func(context.Context, *ent.ReportPackageMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportPackageFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportPackageMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportPackageMutation", m)
|
|
}
|
|
|
|
// The ReportPackageManifestFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportPackageManifest mutator.
|
|
type ReportPackageManifestFunc func(context.Context, *ent.ReportPackageManifestMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportPackageManifestFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportPackageManifestMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportPackageManifestMutation", m)
|
|
}
|
|
|
|
// The ReportProjectFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportProject mutator.
|
|
type ReportProjectFunc func(context.Context, *ent.ReportProjectMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportProjectFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportProjectMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportProjectMutation", m)
|
|
}
|
|
|
|
// The ReportScorecardFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportScorecard mutator.
|
|
type ReportScorecardFunc func(context.Context, *ent.ReportScorecardMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportScorecardFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportScorecardMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportScorecardMutation", m)
|
|
}
|
|
|
|
// The ReportScorecardCheckFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportScorecardCheck mutator.
|
|
type ReportScorecardCheckFunc func(context.Context, *ent.ReportScorecardCheckMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportScorecardCheckFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportScorecardCheckMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportScorecardCheckMutation", m)
|
|
}
|
|
|
|
// The ReportSlsaProvenanceFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportSlsaProvenance mutator.
|
|
type ReportSlsaProvenanceFunc func(context.Context, *ent.ReportSlsaProvenanceMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportSlsaProvenanceFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportSlsaProvenanceMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportSlsaProvenanceMutation", m)
|
|
}
|
|
|
|
// The ReportVulnerabilityFunc type is an adapter to allow the use of ordinary
|
|
// function as ReportVulnerability mutator.
|
|
type ReportVulnerabilityFunc func(context.Context, *ent.ReportVulnerabilityMutation) (ent.Value, error)
|
|
|
|
// Mutate calls f(ctx, m).
|
|
func (f ReportVulnerabilityFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if mv, ok := m.(*ent.ReportVulnerabilityMutation); ok {
|
|
return f(ctx, mv)
|
|
}
|
|
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.ReportVulnerabilityMutation", m)
|
|
}
|
|
|
|
// Condition is a hook condition function.
|
|
type Condition func(context.Context, ent.Mutation) bool
|
|
|
|
// And groups conditions with the AND operator.
|
|
func And(first, second Condition, rest ...Condition) Condition {
|
|
return func(ctx context.Context, m ent.Mutation) bool {
|
|
if !first(ctx, m) || !second(ctx, m) {
|
|
return false
|
|
}
|
|
for _, cond := range rest {
|
|
if !cond(ctx, m) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
// Or groups conditions with the OR operator.
|
|
func Or(first, second Condition, rest ...Condition) Condition {
|
|
return func(ctx context.Context, m ent.Mutation) bool {
|
|
if first(ctx, m) || second(ctx, m) {
|
|
return true
|
|
}
|
|
for _, cond := range rest {
|
|
if cond(ctx, m) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Not negates a given condition.
|
|
func Not(cond Condition) Condition {
|
|
return func(ctx context.Context, m ent.Mutation) bool {
|
|
return !cond(ctx, m)
|
|
}
|
|
}
|
|
|
|
// HasOp is a condition testing mutation operation.
|
|
func HasOp(op ent.Op) Condition {
|
|
return func(_ context.Context, m ent.Mutation) bool {
|
|
return m.Op().Is(op)
|
|
}
|
|
}
|
|
|
|
// HasAddedFields is a condition validating `.AddedField` on fields.
|
|
func HasAddedFields(field string, fields ...string) Condition {
|
|
return func(_ context.Context, m ent.Mutation) bool {
|
|
if _, exists := m.AddedField(field); !exists {
|
|
return false
|
|
}
|
|
for _, field := range fields {
|
|
if _, exists := m.AddedField(field); !exists {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
// HasClearedFields is a condition validating `.FieldCleared` on fields.
|
|
func HasClearedFields(field string, fields ...string) Condition {
|
|
return func(_ context.Context, m ent.Mutation) bool {
|
|
if exists := m.FieldCleared(field); !exists {
|
|
return false
|
|
}
|
|
for _, field := range fields {
|
|
if exists := m.FieldCleared(field); !exists {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
// HasFields is a condition validating `.Field` on fields.
|
|
func HasFields(field string, fields ...string) Condition {
|
|
return func(_ context.Context, m ent.Mutation) bool {
|
|
if _, exists := m.Field(field); !exists {
|
|
return false
|
|
}
|
|
for _, field := range fields {
|
|
if _, exists := m.Field(field); !exists {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
// If executes the given hook under condition.
|
|
//
|
|
// hook.If(ComputeAverage, And(HasFields(...), HasAddedFields(...)))
|
|
func If(hk ent.Hook, cond Condition) ent.Hook {
|
|
return func(next ent.Mutator) ent.Mutator {
|
|
return ent.MutateFunc(func(ctx context.Context, m ent.Mutation) (ent.Value, error) {
|
|
if cond(ctx, m) {
|
|
return hk(next).Mutate(ctx, m)
|
|
}
|
|
return next.Mutate(ctx, m)
|
|
})
|
|
}
|
|
}
|
|
|
|
// On executes the given hook only for the given operation.
|
|
//
|
|
// hook.On(Log, ent.Delete|ent.Create)
|
|
func On(hk ent.Hook, op ent.Op) ent.Hook {
|
|
return If(hk, HasOp(op))
|
|
}
|
|
|
|
// Unless skips the given hook only for the given operation.
|
|
//
|
|
// hook.Unless(Log, ent.Update|ent.UpdateOne)
|
|
func Unless(hk ent.Hook, op ent.Op) ent.Hook {
|
|
return If(hk, Not(HasOp(op)))
|
|
}
|
|
|
|
// FixedError is a hook returning a fixed error.
|
|
func FixedError(err error) ent.Hook {
|
|
return func(ent.Mutator) ent.Mutator {
|
|
return ent.MutateFunc(func(context.Context, ent.Mutation) (ent.Value, error) {
|
|
return nil, err
|
|
})
|
|
}
|
|
}
|
|
|
|
// Reject returns a hook that rejects all operations that match op.
|
|
//
|
|
// func (T) Hooks() []ent.Hook {
|
|
// return []ent.Hook{
|
|
// Reject(ent.Delete|ent.Update),
|
|
// }
|
|
// }
|
|
func Reject(op ent.Op) ent.Hook {
|
|
hk := FixedError(fmt.Errorf("%s operation is not allowed", op))
|
|
return On(hk, op)
|
|
}
|
|
|
|
// Chain acts as a list of hooks and is effectively immutable.
|
|
// Once created, it will always hold the same set of hooks in the same order.
|
|
type Chain struct {
|
|
hooks []ent.Hook
|
|
}
|
|
|
|
// NewChain creates a new chain of hooks.
|
|
func NewChain(hooks ...ent.Hook) Chain {
|
|
return Chain{append([]ent.Hook(nil), hooks...)}
|
|
}
|
|
|
|
// Hook chains the list of hooks and returns the final hook.
|
|
func (c Chain) Hook() ent.Hook {
|
|
return func(mutator ent.Mutator) ent.Mutator {
|
|
for i := len(c.hooks) - 1; i >= 0; i-- {
|
|
mutator = c.hooks[i](mutator)
|
|
}
|
|
return mutator
|
|
}
|
|
}
|
|
|
|
// Append extends a chain, adding the specified hook
|
|
// as the last ones in the mutation flow.
|
|
func (c Chain) Append(hooks ...ent.Hook) Chain {
|
|
newHooks := make([]ent.Hook, 0, len(c.hooks)+len(hooks))
|
|
newHooks = append(newHooks, c.hooks...)
|
|
newHooks = append(newHooks, hooks...)
|
|
return Chain{newHooks}
|
|
}
|
|
|
|
// Extend extends a chain, adding the specified chain
|
|
// as the last ones in the mutation flow.
|
|
func (c Chain) Extend(chain Chain) Chain {
|
|
return c.Append(chain.hooks...)
|
|
}
|