Files
heranran 71c7672545 feat: Skill Hub hardening with session usage tracking and egress governance (#163)
* feat(skill-hub): add Skill Hub catalog, publish flow, and lite materialize pipeline

Introduce Skill Hub for browsing, importing, publishing, and installing skills, with lite instance package materialization and runtime sync support.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(skill-hub): remove token-governance hooks from Skill Hub PR

Strip validateManagedRuntimeEnvironmentOverrides, network lock policy sync,
and egress proxy audit wiring that belong to the upcoming token-usage work,
so the Skill Hub branch compiles independently.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(skill-hub): update migration number in materialize docs

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(skill-hub): make RuntimeAgentClient test stub and hub tests compile-safe

Add ResyncInstanceSkills to the runtime pool handler fake client, and harden
skill hub payload helpers/tests against nil storage/instance repos so go test passes.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: add Skill Hub hardening with session usage tracking and egress governance

Unify Skill Hub runtime sync improvements with session-token observability,
egress network policy, and admin/instance usage reporting for reopenable PR.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(skill-hub): repair CI tests and nested skill install

* fix(ci): restore release deployment configuration

---------

Co-authored-by: heshengran <heshengran@ieisystem.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 12:37:01 +08:00

89 lines
4.4 KiB
Go

package models
import "time"
type Skill struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
UserID int `db:"user_id" json:"user_id"`
SkillKey string `db:"skill_key" json:"skill_key"`
Name string `db:"name" json:"name"`
Description *string `db:"description" json:"description,omitempty"`
CurrentVersionID *int `db:"current_version_id" json:"current_version_id,omitempty"`
SourceType string `db:"source_type" json:"source_type"`
Status string `db:"status" json:"status"`
Visibility string `db:"visibility" json:"visibility"`
PublishedAt *time.Time `db:"published_at" json:"published_at,omitempty"`
PublishedBy *int `db:"published_by" json:"published_by,omitempty"`
RiskLevel string `db:"risk_level" json:"risk_level"`
LastScannedAt *time.Time `db:"last_scanned_at" json:"last_scanned_at,omitempty"`
LastScanResultID *int `db:"last_scan_result_id" json:"last_scan_result_id,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (s Skill) TableName() string { return "skills" }
type SkillBlob struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
ContentHash string `db:"content_hash" json:"content_hash"`
ArchiveHash string `db:"archive_hash" json:"archive_hash"`
ObjectKey string `db:"object_key" json:"object_key"`
FileName string `db:"file_name" json:"file_name"`
MediaType string `db:"media_type" json:"media_type"`
SizeBytes int64 `db:"size_bytes" json:"size_bytes"`
ScanStatus string `db:"scan_status" json:"scan_status"`
RiskLevel string `db:"risk_level" json:"risk_level"`
LastScannedAt *time.Time `db:"last_scanned_at" json:"last_scanned_at,omitempty"`
LastScanResultID *int `db:"last_scan_result_id" json:"last_scan_result_id,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (s SkillBlob) TableName() string { return "skill_blobs" }
type SkillVersion struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
SkillID int `db:"skill_id" json:"skill_id"`
BlobID int `db:"blob_id" json:"blob_id"`
VersionNo int `db:"version_no" json:"version_no"`
ManifestJSON *string `db:"manifest_json" json:"-"`
SourceType string `db:"source_type" json:"source_type"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (s SkillVersion) TableName() string { return "skill_versions" }
type InstanceSkill struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
InstanceID int `db:"instance_id" json:"instance_id"`
SkillID int `db:"skill_id" json:"skill_id"`
SkillVersionID *int `db:"skill_version_id" json:"skill_version_id,omitempty"`
SourceType string `db:"source_type" json:"source_type"`
InstallPath *string `db:"install_path" json:"install_path,omitempty"`
WorkspaceDir *string `db:"workspace_dir" json:"workspace_dir,omitempty"`
ObservedHash *string `db:"observed_hash" json:"observed_hash,omitempty"`
Status string `db:"status" json:"status"`
LastSeenAt *time.Time `db:"last_seen_at" json:"last_seen_at,omitempty"`
RemovedAt *time.Time `db:"removed_at" json:"removed_at,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (s InstanceSkill) TableName() string { return "instance_skills" }
type SkillScanResult struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
BlobID int `db:"blob_id" json:"blob_id"`
Engine string `db:"engine" json:"engine"`
RiskLevel string `db:"risk_level" json:"risk_level"`
Status string `db:"status" json:"status"`
Summary *string `db:"summary" json:"summary,omitempty"`
FindingsJSON *string `db:"findings_json" json:"-"`
ScannedAt *time.Time `db:"scanned_at" json:"scanned_at,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (s SkillScanResult) TableName() string { return "skill_scan_results" }