core

package
v1.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 8, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ValidSecretSources = map[string]bool{
	"file": true, "keychain": true,
}

ValidSecretSources is the set of recognized SecretRef sources.

Functions

func GetConfigDir

func GetConfigDir() string

GetConfigDir returns the config directory path. If the home directory cannot be determined, it falls back to a relative path and prints a warning to stderr.

func GetConfigPath

func GetConfigPath() string

GetConfigPath returns the config file path.

func RemoveSecretStore

func RemoveSecretStore(input SecretInput, kc keychain.KeychainAccess)

RemoveSecretStore cleans up keychain entries when an app is removed. Errors are intentionally ignored — cleanup is best-effort.

func ResolveOpenBaseURL

func ResolveOpenBaseURL(brand LarkBrand) string

ResolveOpenBaseURL returns the Open API base URL for the given brand.

func ResolveSecretInput

func ResolveSecretInput(s SecretInput, kc keychain.KeychainAccess) (string, error)

ResolveSecretInput resolves a SecretInput to a plain string. SecretRef objects are resolved by source (file / keychain).

func SaveMultiAppConfig

func SaveMultiAppConfig(config *MultiAppConfig) error

SaveMultiAppConfig saves config to disk.

func ValidateProfileName added in v1.0.5

func ValidateProfileName(name string) error

ValidateProfileName checks that a profile name is valid. Rejects empty names, whitespace, control characters, and shell-problematic characters, but allows Unicode letters (e.g. Chinese, Japanese) for localized profile names.

Types

type AppConfig

type AppConfig struct {
	Name       string      `json:"name,omitempty"`
	AppId      string      `json:"appId"`
	AppSecret  SecretInput `json:"appSecret"`
	Brand      LarkBrand   `json:"brand"`
	Lang       string      `json:"lang,omitempty"`
	DefaultAs  Identity    `json:"defaultAs,omitempty"` // AsUser | AsBot | AsAuto
	StrictMode *StrictMode `json:"strictMode,omitempty"`
	Users      []AppUser   `json:"users"`
}

AppConfig is a per-app configuration entry (stored format — secrets may be unresolved).

func (*AppConfig) ProfileName added in v1.0.5

func (a *AppConfig) ProfileName() string

ProfileName returns the display name for this app config. If Name is set, returns Name; otherwise falls back to AppId.

type AppUser

type AppUser struct {
	UserOpenId string `json:"userOpenId"`
	UserName   string `json:"userName"`
}

AppUser is a logged-in user record stored in config.

type CliConfig

type CliConfig struct {
	ProfileName         string
	AppID               string
	AppSecret           string
	Brand               LarkBrand
	DefaultAs           Identity // AsUser | AsBot | AsAuto | "" (from config file)
	UserOpenId          string
	UserName            string
	SupportedIdentities uint8 `json:"-"` // bitflag: 1=user, 2=bot; set by credential provider
}

CliConfig is the resolved single-app config used by downstream code.

func RequireAuth

func RequireAuth(kc keychain.KeychainAccess) (*CliConfig, error)

RequireAuth loads config and ensures a user is logged in.

func RequireAuthForProfile added in v1.0.5

func RequireAuthForProfile(kc keychain.KeychainAccess, profileOverride string) (*CliConfig, error)

RequireAuthForProfile loads config for a profile and ensures a user is logged in.

func RequireConfig

func RequireConfig(kc keychain.KeychainAccess) (*CliConfig, error)

RequireConfig loads the single-app config using the default profile resolution.

func RequireConfigForProfile added in v1.0.5

func RequireConfigForProfile(kc keychain.KeychainAccess, profileOverride string) (*CliConfig, error)

RequireConfigForProfile loads the single-app config for a specific profile. Resolution priority: profileOverride > config.CurrentApp > Apps[0].

func ResolveConfigFromMulti added in v1.0.5

func ResolveConfigFromMulti(raw *MultiAppConfig, kc keychain.KeychainAccess, profileOverride string) (*CliConfig, error)

ResolveConfigFromMulti resolves a single-app config from an already-loaded MultiAppConfig. This avoids re-reading the config file when the caller has already loaded it.

type ConfigError

type ConfigError struct {
	Code    int    // exit code: 2=validation, 3=auth
	Type    string // "config" or "auth"
	Message string
	Hint    string
}

ConfigError is a structured error from config resolution. It carries enough information for main.go to convert it into an output.ExitError.

func (*ConfigError) Error

func (e *ConfigError) Error() string

type Endpoints

type Endpoints struct {
	Open     string // e.g. "https://open.feishu.cn"
	Accounts string // e.g. "https://accounts.feishu.cn"
	MCP      string // e.g. "https://mcp.feishu.cn"
}

Endpoints holds resolved endpoint URLs for different Lark services.

func ResolveEndpoints

func ResolveEndpoints(brand LarkBrand) Endpoints

ResolveEndpoints resolves endpoint URLs based on brand.

type Identity

type Identity string

Identity represents the caller identity for API requests.

const (
	AsUser Identity = "user"
	AsBot  Identity = "bot"
	AsAuto Identity = "auto"
)

func (Identity) IsBot

func (id Identity) IsBot() bool

IsBot returns true if the identity is bot.

type LarkBrand

type LarkBrand string

LarkBrand represents the Lark platform brand. "feishu" targets China-mainland, "lark" targets international. Any other string is treated as a custom base URL.

const (
	BrandFeishu LarkBrand = "feishu"
	BrandLark   LarkBrand = "lark"
)

func ParseBrand added in v1.0.5

func ParseBrand(value string) LarkBrand

ParseBrand normalizes a brand string to a LarkBrand constant. Unrecognized values default to BrandFeishu.

type MultiAppConfig

type MultiAppConfig struct {
	StrictMode  StrictMode  `json:"strictMode,omitempty"`
	CurrentApp  string      `json:"currentApp,omitempty"`
	PreviousApp string      `json:"previousApp,omitempty"`
	Apps        []AppConfig `json:"apps"`
}

MultiAppConfig is the multi-app config file format.

func LoadMultiAppConfig

func LoadMultiAppConfig() (*MultiAppConfig, error)

LoadMultiAppConfig loads multi-app config from disk.

func (*MultiAppConfig) CurrentAppConfig added in v1.0.5

func (m *MultiAppConfig) CurrentAppConfig(profileOverride string) *AppConfig

CurrentAppConfig returns the currently active app config. Resolution priority: profileOverride > CurrentApp field > Apps[0].

func (*MultiAppConfig) FindApp added in v1.0.5

func (m *MultiAppConfig) FindApp(name string) *AppConfig

FindApp looks up an app by name, then by appId. Returns nil if not found. Name match takes priority: if profile A has Name "X" and profile B has AppId "X", FindApp("X") returns profile A.

func (*MultiAppConfig) FindAppIndex added in v1.0.5

func (m *MultiAppConfig) FindAppIndex(name string) int

FindAppIndex looks up an app index by name, then by appId. Returns -1 if not found.

func (*MultiAppConfig) ProfileNames added in v1.0.5

func (m *MultiAppConfig) ProfileNames() []string

ProfileNames returns all profile names (Name if set, otherwise AppId).

type SecretInput

type SecretInput struct {
	Plain string     // non-empty for plain string values
	Ref   *SecretRef // non-nil for SecretRef values
}

SecretInput represents a secret value: either a plain string or a SecretRef object.

func ForStorage

func ForStorage(appId string, input SecretInput, kc keychain.KeychainAccess) (SecretInput, error)

ForStorage determines how to store a secret in config.json. - SecretRef → preserved as-is - Plain text → stored in keychain, returns keychain SecretRef Returns error if keychain is unavailable (no silent plaintext fallback).

func PlainSecret

func PlainSecret(s string) SecretInput

PlainSecret creates a SecretInput from a plain string.

func (SecretInput) IsPlain

func (s SecretInput) IsPlain() bool

IsPlain returns true if this is a plain text string (not a SecretRef).

func (SecretInput) IsSecretRef

func (s SecretInput) IsSecretRef() bool

IsSecretRef returns true if this is a SecretRef object (env/file/keychain).

func (SecretInput) IsZero

func (s SecretInput) IsZero() bool

IsZero returns true if the SecretInput has no value.

func (SecretInput) MarshalJSON

func (s SecretInput) MarshalJSON() ([]byte, error)

MarshalJSON serializes SecretInput: plain string → JSON string, SecretRef → JSON object.

func (*SecretInput) UnmarshalJSON

func (s *SecretInput) UnmarshalJSON(data []byte) error

UnmarshalJSON deserializes SecretInput from either a JSON string or a SecretRef object.

type SecretRef

type SecretRef struct {
	Source   string `json:"source"`             // "file" | "keychain"
	Provider string `json:"provider,omitempty"` // optional, reserved
	ID       string `json:"id"`                 // env var name / file path / command / keychain key
}

SecretRef references a secret stored externally.

type StrictMode added in v1.0.5

type StrictMode string

StrictMode represents the identity restriction policy.

const (
	StrictModeOff  StrictMode = "off"
	StrictModeBot  StrictMode = "bot"
	StrictModeUser StrictMode = "user"
)

func (StrictMode) AllowsIdentity added in v1.0.5

func (m StrictMode) AllowsIdentity(id Identity) bool

AllowsIdentity reports whether the given identity is permitted under this mode.

func (StrictMode) ForcedIdentity added in v1.0.5

func (m StrictMode) ForcedIdentity() Identity

ForcedIdentity returns the identity forced by this mode, or "" if not active.

func (StrictMode) IsActive added in v1.0.5

func (m StrictMode) IsActive() bool

IsActive returns true if strict mode restricts identity.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL