Files
fn_registry/registry/models.go
T
egutierrez e3bb9c3b38 feat: content hash y timestamps inteligentes en registry
Agrega content_hash a functions, types y apps para detectar cambios reales
entre reindexaciones. Los timestamps created_at se preservan si el contenido
no cambió, y updated_at solo se actualiza cuando hay cambios efectivos.
Incluye migración 005, hash.go con SHA256 determinístico, y ajustes en
store/indexer/models para el nuevo flujo de timestamps.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 14:23:45 +02:00

165 lines
5.4 KiB
Go

package registry
import "time"
// Kind classifies a registry entry.
type Kind string
const (
KindFunction Kind = "function"
KindPipeline Kind = "pipeline"
KindComponent Kind = "component"
)
// Purity indicates whether a function has side effects.
type Purity string
const (
PurityPure Purity = "pure"
PurityImpure Purity = "impure"
)
// Algebraic classifies a type.
type Algebraic string
const (
AlgebraicProduct Algebraic = "product"
AlgebraicSum Algebraic = "sum"
)
// Function represents an entry in the functions table.
// Covers kind: function, pipeline, and component.
type Function struct {
ID string `json:"id"`
Name string `json:"name"`
Kind Kind `json:"kind"`
Lang string `json:"lang"`
Domain string `json:"domain"`
Version string `json:"version"`
Purity Purity `json:"purity"`
Signature string `json:"signature"`
Description string `json:"description"`
Tags []string `json:"tags"`
UsesFunctions []string `json:"uses_functions"`
UsesTypes []string `json:"uses_types"`
Returns []string `json:"returns"`
ReturnsOptional bool `json:"returns_optional"`
ErrorType string `json:"error_type"`
Imports []string `json:"imports"`
Example string `json:"example"`
Notes string `json:"notes"`
Documentation string `json:"documentation"`
Code string `json:"code"`
Tested bool `json:"tested"`
Tests []string `json:"tests"`
TestFilePath string `json:"test_file_path"`
FilePath string `json:"file_path"`
ContentHash string `json:"content_hash"`
SourceRepo string `json:"source_repo"`
SourceLicense string `json:"source_license"`
SourceFile string `json:"source_file"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
// Component-only fields (kind: component)
Props []PropDef `json:"props,omitempty"`
Emits []string `json:"emits,omitempty"`
HasState *bool `json:"has_state,omitempty"`
Framework string `json:"framework,omitempty"`
Variant []string `json:"variant,omitempty"`
}
// PropDef describes a component prop.
type PropDef struct {
Name string `json:"name"`
Type string `json:"type"`
Required bool `json:"required"`
Description string `json:"description"`
}
// Type represents an entry in the types table.
type Type struct {
ID string `json:"id"`
Name string `json:"name"`
Lang string `json:"lang"`
Domain string `json:"domain"`
Version string `json:"version"`
Algebraic Algebraic `json:"algebraic"`
Definition string `json:"definition"`
Description string `json:"description"`
Tags []string `json:"tags"`
UsesTypes []string `json:"uses_types"`
Examples string `json:"examples"`
Notes string `json:"notes"`
Documentation string `json:"documentation"`
Code string `json:"code"`
FilePath string `json:"file_path"`
ContentHash string `json:"content_hash"`
SourceRepo string `json:"source_repo"`
SourceLicense string `json:"source_license"`
SourceFile string `json:"source_file"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// App represents an entry in the apps table.
type App struct {
ID string `json:"id"`
Name string `json:"name"`
Lang string `json:"lang"`
Domain string `json:"domain"`
Description string `json:"description"`
Tags []string `json:"tags"`
UsesFunctions []string `json:"uses_functions"`
UsesTypes []string `json:"uses_types"`
Framework string `json:"framework"`
EntryPoint string `json:"entry_point"`
Documentation string `json:"documentation"`
Notes string `json:"notes"`
DirPath string `json:"dir_path"`
ContentHash string `json:"content_hash"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// ProposalKind classifies a proposal.
type ProposalKind string
const (
ProposalNewFunction ProposalKind = "new_function"
ProposalNewType ProposalKind = "new_type"
ProposalImproveFunction ProposalKind = "improve_function"
ProposalImproveType ProposalKind = "improve_type"
ProposalNewPipeline ProposalKind = "new_pipeline"
)
// ProposalStatus represents the review state of a proposal.
type ProposalStatus string
const (
ProposalPending ProposalStatus = "pending"
ProposalApproved ProposalStatus = "approved"
ProposalRejected ProposalStatus = "rejected"
ProposalImplemented ProposalStatus = "implemented"
)
// Proposal represents a suggested improvement to the registry.
type Proposal struct {
ID string `json:"id"`
Kind ProposalKind `json:"kind"`
TargetID string `json:"target_id"`
Title string `json:"title"`
Description string `json:"description"`
Evidence map[string]any `json:"evidence"`
Status ProposalStatus `json:"status"`
CreatedBy string `json:"created_by"`
ReviewedBy string `json:"reviewed_by"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// GenerateID builds the canonical ID: {name}_{lang}_{domain}
func GenerateID(name, lang, domain string) string {
return name + "_" + lang + "_" + domain
}