diff --git a/agent/assistant/agent.go b/agent/assistant/agent.go index 4f2fc7df..c1f62e29 100644 --- a/agent/assistant/agent.go +++ b/agent/assistant/agent.go @@ -171,11 +171,12 @@ func (ast *Assistant) Stream(ctx *context.Context, inputMessages []context.Messa var v2Computer infraV2.Computer var v2LoadingMsgID string + var v2Cfg *sandboxTypes.SandboxConfig if ast.HasSandboxV2() { ctx.Logger.Phase("Sandbox V2") var err error var v2Cleanup func() - v2Runner, v2Computer, v2Cleanup, v2LoadingMsgID, err = ast.initSandboxV2(ctx, opts) + v2Runner, v2Computer, v2Cfg, v2Cleanup, v2LoadingMsgID, err = ast.initSandboxV2(ctx, opts) if err != nil { ast.traceAgentFail(agentNode, err) ast.sendStreamEndOnError(ctx, streamHandler, streamStartTime, err) @@ -189,7 +190,7 @@ func (ast *Assistant) Stream(ctx *context.Context, inputMessages []context.Messa if ci.BoxID != "" { ctx.Logger.Trace("Computer: %s", ci.BoxID) } - ctx.Logger.Trace("Workspace: %s", ast.SandboxV2.WorkspaceID) + ctx.Logger.Trace("Workspace: %s", v2Cfg.WorkspaceID) if conn, _, err := ast.GetConnector(ctx, opts); err == nil && conn != nil { ctx.Logger.Trace("Connector: %s", conn.ID()) } @@ -337,6 +338,7 @@ func (ast *Assistant) Stream(ctx *context.Context, inputMessages []context.Messa Handler: streamHandler, Runner: v2Runner, Computer: v2Computer, + Config: v2Cfg, LoadingMsgID: v2LoadingMsgID, Options: opts, }) diff --git a/agent/assistant/sandbox_v2.go b/agent/assistant/sandbox_v2.go index 006caaa8..d01e33ba 100644 --- a/agent/assistant/sandbox_v2.go +++ b/agent/assistant/sandbox_v2.go @@ -13,6 +13,7 @@ import ( "github.com/yaoapp/yao/agent/output/message" sandboxv2 "github.com/yaoapp/yao/agent/sandbox/v2" sandboxTypes "github.com/yaoapp/yao/agent/sandbox/v2/types" + store "github.com/yaoapp/yao/agent/store/types" "github.com/yaoapp/yao/config" infraV2 "github.com/yaoapp/yao/sandbox/v2" traceTypes "github.com/yaoapp/yao/trace/types" @@ -25,12 +26,16 @@ func (ast *Assistant) HasSandboxV2() bool { } // initSandboxV2 initializes the V2 sandbox: obtains a Computer, gets a Runner, -// runs Prepare, and returns the runner, computer, cleanup closure, loading -// message ID, and any error. +// runs Prepare, and returns the runner, computer, a per-request copy of the +// SandboxConfig, cleanup closure, loading message ID, and any error. +// +// A shallow copy of ast.SandboxV2 is made so that concurrent requests to the +// same assistant each get their own mutable config (Owner, ID, NodeID, etc.). func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) ( - sandboxTypes.Runner, infraV2.Computer, func(), string, error, + sandboxTypes.Runner, infraV2.Computer, *sandboxTypes.SandboxConfig, func(), string, error, ) { - cfg := ast.SandboxV2 + cfgCopy := *ast.SandboxV2 + cfg := &cfgCopy manager := infraV2.M() loadingMsg := &message.Message{ @@ -47,7 +52,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) conn, _, err := ast.GetConnector(ctx, opts) if err != nil && cfg.Runner.Name != "yao" { closeLoadingV2(ctx, loadingMsgID, "sandbox.failed") - return nil, nil, nil, "", fmt.Errorf("get connector: %w", err) + return nil, nil, nil, nil, "", fmt.Errorf("get connector: %w", err) } // 2. Build human-readable DisplayName from real Agent name + Workspace name. @@ -84,7 +89,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) computer, identifier, err := sandboxv2.GetComputer(ctx, cfg, manager) if err != nil { closeLoadingV2(ctx, loadingMsgID, "sandbox.failed") - return nil, nil, nil, "", fmt.Errorf("getComputer failed: %w", err) + return nil, nil, nil, nil, "", fmt.Errorf("getComputer failed: %w", err) } _ = identifier @@ -93,7 +98,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) if err != nil { sandboxv2.LifecycleAction(stdCtx, cfg, computer, manager) closeLoadingV2(ctx, loadingMsgID, "sandbox.failed") - return nil, nil, nil, "", fmt.Errorf("get runner %q: %w", cfg.Runner.Name, err) + return nil, nil, nil, nil, "", fmt.Errorf("get runner %q: %w", cfg.Runner.Name, err) } // 5. Resolve assistant directory and skills subdirectory. @@ -124,6 +129,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) Computer: computer, Config: cfg, Connector: conn, + AssistantID: ast.ID, SkillsDir: skillsDir, AssistantDir: assistantDir, MCPServers: mcpServers, @@ -134,7 +140,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) runner.Cleanup(stdCtx, computer) sandboxv2.LifecycleAction(stdCtx, cfg, computer, manager) closeLoadingV2(ctx, loadingMsgID, "sandbox.failed") - return nil, nil, nil, "", fmt.Errorf("runner.Prepare: %w", err) + return nil, nil, nil, nil, "", fmt.Errorf("runner.Prepare: %w", err) } // Inject computer + workspace into context so Create/Next hooks @@ -148,7 +154,7 @@ func (ast *Assistant) initSandboxV2(ctx *context.Context, opts *context.Options) sandboxv2.LifecycleAction(cleanCtx, cfg, computer, manager) } - return runner, computer, cleanup, loadingMsgID, nil + return runner, computer, cfg, cleanup, loadingMsgID, nil } // sandboxV2StreamParams groups arguments for executeSandboxV2Stream. @@ -158,6 +164,7 @@ type sandboxV2StreamParams struct { Handler message.StreamFunc Runner sandboxTypes.Runner Computer infraV2.Computer + Config *sandboxTypes.SandboxConfig LoadingMsgID string Options *context.Options } @@ -169,13 +176,15 @@ func (ast *Assistant) executeSandboxV2Stream( ) (*context.CompletionResponse, error) { _ = p.AgentNode - cfg := ast.SandboxV2 + cfg := p.Config manager := infraV2.M() - // Build system prompt. + // Build system prompt (parse $CTX variables the same way as buildSystemPrompts). var systemPrompt string if len(ast.Prompts) > 0 { - for _, pr := range ast.Prompts { + ctxVars := ast.buildContextVariables(ctx) + parsed := store.Prompts(ast.Prompts).Parse(ctxVars) + for _, pr := range parsed { if pr.Role == "system" && pr.Content != "" { systemPrompt = pr.Content break @@ -199,6 +208,7 @@ func (ast *Assistant) executeSandboxV2Stream( Computer: p.Computer, Config: cfg, Connector: conn, + AssistantID: ast.ID, Messages: p.Messages, SystemPrompt: systemPrompt, ChatID: ctx.ChatID, diff --git a/agent/robot/api/robot.go b/agent/robot/api/robot.go index 9014fc03..51ac7435 100644 --- a/agent/robot/api/robot.go +++ b/agent/robot/api/robot.go @@ -199,7 +199,7 @@ func loadRobotFromDB(memberID string) (*types.Robot, error) { "id", "member_id", "team_id", "display_name", "bio", "system_prompt", "robot_status", "autonomous_mode", "robot_config", "robot_email", "agents", "mcp_servers", - "manager_id", "language_model", + "manager_id", "language_model", "workspace", }, Wheres: []model.QueryWhere{ {Column: "member_id", Value: memberID}, @@ -268,7 +268,7 @@ func ListRobotsFromDB(query *ListQuery) (*ListResult, error) { "id", "member_id", "team_id", "display_name", "bio", "system_prompt", "robot_status", "autonomous_mode", "robot_config", "robot_email", "agents", "mcp_servers", - "language_model", + "language_model", "workspace", }, Wheres: wheres, Orders: orders, @@ -444,6 +444,7 @@ func CreateRobot(ctx *types.Context, req *CreateRobotRequest) (*RobotResponse, e Agents: req.Agents, MCPServers: req.MCPServers, LanguageModel: req.LanguageModel, + Workspace: req.Workspace, // Limits CostLimit: req.CostLimit, @@ -559,6 +560,9 @@ func UpdateRobot(ctx *types.Context, memberID string, req *UpdateRobotRequest) ( if req.LanguageModel != nil { existing.LanguageModel = *req.LanguageModel } + if req.Workspace != nil { + existing.Workspace = *req.Workspace + } // Limits if req.CostLimit != nil { @@ -684,6 +688,7 @@ func recordToResponse(record *store.RobotRecord) *RobotResponse { Agents: record.Agents, MCPServers: record.MCPServers, LanguageModel: record.LanguageModel, + Workspace: record.Workspace, CostLimit: record.CostLimit, InvitedBy: record.InvitedBy, diff --git a/agent/robot/api/types.go b/agent/robot/api/types.go index 3e7557a6..8b870427 100644 --- a/agent/robot/api/types.go +++ b/agent/robot/api/types.go @@ -144,7 +144,7 @@ type CreateRobotRequest struct { AutonomousMode *bool `json:"autonomous_mode,omitempty"` // Whether autonomous mode is enabled // Communication - RobotEmail string `json:"robot_email,omitempty"` // Robot email address + RobotEmail string `json:"robot_email,omitempty"` // Deprecated: Robot email address AuthorizedSenders interface{} `json:"authorized_senders,omitempty"` // Email whitelist (JSON array) EmailFilterRules interface{} `json:"email_filter_rules,omitempty"` // Email filter rules (JSON array) @@ -153,6 +153,7 @@ type CreateRobotRequest struct { Agents interface{} `json:"agents,omitempty"` // Accessible agents (JSON array) MCPServers interface{} `json:"mcp_servers,omitempty"` // MCP servers (JSON array) LanguageModel string `json:"language_model,omitempty"` // Language model name + Workspace string `json:"workspace,omitempty"` // Workspace ID bound to this robot // Limits CostLimit float64 `json:"cost_limit,omitempty"` // Monthly cost limit USD @@ -179,7 +180,7 @@ type UpdateRobotRequest struct { AutonomousMode *bool `json:"autonomous_mode,omitempty"` // Autonomous mode // Communication - RobotEmail *string `json:"robot_email,omitempty"` // Robot email address + RobotEmail *string `json:"robot_email,omitempty"` // Deprecated: Robot email address AuthorizedSenders interface{} `json:"authorized_senders,omitempty"` // Email whitelist EmailFilterRules interface{} `json:"email_filter_rules,omitempty"` // Email filter rules @@ -188,6 +189,7 @@ type UpdateRobotRequest struct { Agents interface{} `json:"agents,omitempty"` // Accessible agents MCPServers interface{} `json:"mcp_servers,omitempty"` // MCP servers LanguageModel *string `json:"language_model,omitempty"` // Language model name + Workspace *string `json:"workspace,omitempty"` // Workspace ID (nil=no change, ""=unbind) // Limits CostLimit *float64 `json:"cost_limit,omitempty"` // Monthly cost limit USD @@ -226,6 +228,7 @@ type RobotResponse struct { Agents interface{} `json:"agents,omitempty"` MCPServers interface{} `json:"mcp_servers,omitempty"` LanguageModel string `json:"language_model,omitempty"` + Workspace string `json:"workspace,omitempty"` // Limits CostLimit float64 `json:"cost_limit,omitempty"` diff --git a/agent/robot/cache/load.go b/agent/robot/cache/load.go index 471ea6f8..a07a2ef0 100644 --- a/agent/robot/cache/load.go +++ b/agent/robot/cache/load.go @@ -28,6 +28,7 @@ var memberFields = []interface{}{ "mcp_servers", "manager_id", "language_model", + "workspace", } // SetMemberModel sets the member model name diff --git a/agent/robot/executor/standard/agent.go b/agent/robot/executor/standard/agent.go index 25834364..4d9ee84c 100644 --- a/agent/robot/executor/standard/agent.go +++ b/agent/robot/executor/standard/agent.go @@ -49,6 +49,10 @@ type AgentCaller struct { // When non-empty, passed as opts.Connector to ast.Stream so the agent uses the Robot's model. Connector string + // Workspace is the workspace ID bound to the Robot. + // When non-empty, injected into agentCtx.Metadata["workspace_id"] for sandbox node resolution. + Workspace string + // log is an optional structured logger; when set, Call emits agent-call logs. log *execLogger } @@ -444,6 +448,13 @@ func (c *AgentCaller) buildAgentContext(ctx *robottypes.Context, assistantID str } agentCtx.Logger = agentcontext.Noop() + if c.Workspace != "" { + if agentCtx.Metadata == nil { + agentCtx.Metadata = map[string]interface{}{} + } + agentCtx.Metadata["workspace_id"] = c.Workspace + } + kunlog.Trace("[robot-agent] context built: assistantID=%s chatID=%s contextID=%s", assistantID, c.ChatID, agentCtx.ID) return agentCtx } diff --git a/agent/robot/executor/standard/delivery.go b/agent/robot/executor/standard/delivery.go index ffe624b9..96bf9414 100644 --- a/agent/robot/executor/standard/delivery.go +++ b/agent/robot/executor/standard/delivery.go @@ -43,6 +43,7 @@ func (e *Executor) RunDelivery(ctx *robottypes.Context, exec *robottypes.Executi caller := NewAgentCaller() caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, userContent) if err != nil { return fmt.Errorf("delivery agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/executor/standard/goals.go b/agent/robot/executor/standard/goals.go index bf014ccb..cb1d3629 100644 --- a/agent/robot/executor/standard/goals.go +++ b/agent/robot/executor/standard/goals.go @@ -85,6 +85,7 @@ func (e *Executor) RunGoals(ctx *robottypes.Context, exec *robottypes.Execution, // Call agent caller := NewAgentCaller() caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, userContent) if err != nil { return fmt.Errorf("goals agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/executor/standard/host.go b/agent/robot/executor/standard/host.go index dd9aa9fc..afb019f0 100644 --- a/agent/robot/executor/standard/host.go +++ b/agent/robot/executor/standard/host.go @@ -32,6 +32,8 @@ func (e *Executor) CallHostAgent(ctx *robottypes.Context, robot *robottypes.Robo kunlog.Info("calling Host Agent %s for scenario=%s chatID=%s", agentID, input.Scenario, chatID) caller := NewConversationCaller(chatID) + caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, string(inputJSON)) if err != nil { return nil, fmt.Errorf("host agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/executor/standard/inspiration.go b/agent/robot/executor/standard/inspiration.go index 8b1e235e..c31faada 100644 --- a/agent/robot/executor/standard/inspiration.go +++ b/agent/robot/executor/standard/inspiration.go @@ -54,6 +54,7 @@ func (e *Executor) RunInspiration(ctx *robottypes.Context, exec *robottypes.Exec // Call agent caller := NewAgentCaller() caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, userContent) if err != nil { return fmt.Errorf("inspiration agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/executor/standard/log.go b/agent/robot/executor/standard/log.go index 938ed757..7fbdc13f 100644 --- a/agent/robot/executor/standard/log.go +++ b/agent/robot/executor/standard/log.go @@ -37,6 +37,13 @@ func (l *execLogger) connector() string { return "" } +func (l *execLogger) workspace() string { + if l.robot != nil { + return l.robot.Workspace + } + return "" +} + // --------------------------------------------------------------------------- // P2: Task Overview // --------------------------------------------------------------------------- @@ -51,6 +58,7 @@ func (l *execLogger) logTaskOverview(tasks []robottypes.Task) { "phase": "tasks", "task_count": len(tasks), "language_model": l.connector(), + "workspace": l.workspace(), }).Info("P2 task overview: %d tasks generated", len(tasks)) } @@ -69,6 +77,9 @@ func (l *execLogger) devTaskOverview(tasks []robottypes.Task) { if l.connector() != "" { sb.WriteString(fmt.Sprintf("%s Model: %s%s%s\n", w, v, l.connector(), r)) } + if l.workspace() != "" { + sb.WriteString(fmt.Sprintf("%s Workspace: %s%s%s\n", w, v, l.workspace(), r)) + } sb.WriteString(fmt.Sprintf("%s%s%s\n", w, strings.Repeat("─", 60), r)) for i, t := range tasks { desc := t.Description diff --git a/agent/robot/executor/standard/runner.go b/agent/robot/executor/standard/runner.go index d78a3041..9fedbebc 100644 --- a/agent/robot/executor/standard/runner.go +++ b/agent/robot/executor/standard/runner.go @@ -134,6 +134,7 @@ func (r *Runner) executeAssistantTask(task *robottypes.Task, taskCtx *RunnerCont caller := NewAgentCaller() caller.log = r.log caller.Connector = r.robot.LanguageModel + caller.Workspace = r.robot.Workspace caller.ChatID = r.chatID messages := r.BuildAssistantMessages(task, taskCtx) diff --git a/agent/robot/executor/standard/tasks.go b/agent/robot/executor/standard/tasks.go index 9cb2a16d..3d447d0f 100644 --- a/agent/robot/executor/standard/tasks.go +++ b/agent/robot/executor/standard/tasks.go @@ -55,6 +55,7 @@ func (e *Executor) RunTasks(ctx *robottypes.Context, exec *robottypes.Execution, caller := NewAgentCaller() caller.log = newExecLogger(robot, exec.ID) caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, userContent) if err != nil { return fmt.Errorf("tasks agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/executor/standard/validator.go b/agent/robot/executor/standard/validator.go index d1b9ab7a..9d597fa6 100644 --- a/agent/robot/executor/standard/validator.go +++ b/agent/robot/executor/standard/validator.go @@ -434,6 +434,7 @@ func (v *Validator) validateSemantic(task *robottypes.Task, output interface{}) // Call validation agent caller := NewAgentCaller() caller.Connector = v.robot.LanguageModel + caller.Workspace = v.robot.Workspace result, err := caller.CallWithMessages(v.ctx, validationAgentID, validationPrompt) if err != nil { return &robottypes.ValidationResult{ @@ -641,6 +642,7 @@ func (av *robotAgentValidator) Validate(agentID string, output, input, criteria // Call agent caller := NewAgentCaller() caller.Connector = av.v.robot.LanguageModel + caller.Workspace = av.v.robot.Workspace callResult, err := caller.CallWithMessages(av.v.ctx, agentID, string(inputJSON)) if err != nil { result.Passed = false diff --git a/agent/robot/manager/interact.go b/agent/robot/manager/interact.go index 08fcfd03..100758f9 100644 --- a/agent/robot/manager/interact.go +++ b/agent/robot/manager/interact.go @@ -326,17 +326,19 @@ func (m *Manager) callHostAgentForScenario(ctx *types.Context, robot *types.Robo Scenario: scenario, Messages: []agentcontext.Message{{Role: "user", Content: message}}, Context: hostCtx, - }, chatID) + }, chatID, robot) } // callHostAgent calls the Host Agent assistant and parses output. -func (m *Manager) callHostAgent(ctx *types.Context, agentID string, input *types.HostInput, chatID string) (*types.HostOutput, error) { +func (m *Manager) callHostAgent(ctx *types.Context, agentID string, input *types.HostInput, chatID string, robot *types.Robot) (*types.HostOutput, error) { inputJSON, err := json.Marshal(input) if err != nil { return nil, fmt.Errorf("failed to marshal host input: %w", err) } caller := standard.NewConversationCaller(chatID) + caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessages(ctx, agentID, string(inputJSON)) if err != nil { return nil, fmt.Errorf("host agent (%s) call failed: %w", agentID, err) @@ -728,16 +730,18 @@ func (m *Manager) callHostAgentForScenarioStream(ctx *types.Context, robot *type Scenario: scenario, Messages: []agentcontext.Message{{Role: "user", Content: msg}}, Context: hostCtx, - }, chatID, streamFn) + }, chatID, robot, streamFn) } -func (m *Manager) callHostAgentStream(ctx *types.Context, agentID string, input *types.HostInput, chatID string, streamFn standard.StreamCallback) (*types.HostOutput, error) { +func (m *Manager) callHostAgentStream(ctx *types.Context, agentID string, input *types.HostInput, chatID string, robot *types.Robot, streamFn standard.StreamCallback) (*types.HostOutput, error) { inputJSON, err := json.Marshal(input) if err != nil { return nil, fmt.Errorf("failed to marshal host input: %w", err) } caller := standard.NewConversationCaller(chatID) + caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessagesStream(ctx, agentID, string(inputJSON), streamFn) if err != nil { return nil, fmt.Errorf("host agent (%s) call failed: %w", agentID, err) @@ -895,7 +899,7 @@ func (m *Manager) callHostAgentForScenarioStreamRaw(ctx *types.Context, robot *t Scenario: scenario, Messages: []agentcontext.Message{{Role: "user", Content: msg}}, Context: hostCtx, - }, chatID, onMessage) + }, chatID, robot, onMessage) } // callHostAgentStreamRaw calls the Host Agent with CUI raw message streaming. @@ -903,7 +907,7 @@ func (m *Manager) callHostAgentForScenarioStreamRaw(ctx *types.Context, robot *t // so the frontend never sees raw decision JSON. If the final result is a decision, // the buffered chunks are discarded and a clean reply is sent instead. If the // result is a normal conversation turn, buffered chunks are flushed through. -func (m *Manager) callHostAgentStreamRaw(ctx *types.Context, agentID string, input *types.HostInput, chatID string, onMessage agentcontext.OnMessageFunc) (*types.HostOutput, error) { +func (m *Manager) callHostAgentStreamRaw(ctx *types.Context, agentID string, input *types.HostInput, chatID string, robot *types.Robot, onMessage agentcontext.OnMessageFunc) (*types.HostOutput, error) { inputJSON, err := json.Marshal(input) if err != nil { return nil, fmt.Errorf("failed to marshal host input: %w", err) @@ -956,6 +960,8 @@ func (m *Manager) callHostAgentStreamRaw(ctx *types.Context, agentID string, inp } caller := standard.NewConversationCaller(chatID) + caller.Connector = robot.LanguageModel + caller.Workspace = robot.Workspace result, err := caller.CallWithMessagesStreamRaw(ctx, agentID, string(inputJSON), wrappedOnMessage) if err != nil { return nil, fmt.Errorf("host agent (%s) call failed: %w", agentID, err) diff --git a/agent/robot/store/robot.go b/agent/robot/store/robot.go index 983115b0..49145247 100644 --- a/agent/robot/store/robot.go +++ b/agent/robot/store/robot.go @@ -33,7 +33,7 @@ type RobotRecord struct { ManagerID string `json:"manager_id"` // Direct manager user_id (who manages this robot) // Communication - RobotEmail string `json:"robot_email"` // Robot email address + RobotEmail string `json:"robot_email"` // Deprecated: Robot email address AuthorizedSenders interface{} `json:"authorized_senders,omitempty"` // Email whitelist (JSON array) EmailFilterRules interface{} `json:"email_filter_rules,omitempty"` // Email filter rules (JSON array) @@ -42,6 +42,7 @@ type RobotRecord struct { Agents interface{} `json:"agents,omitempty"` // Accessible agents (JSON array) MCPServers interface{} `json:"mcp_servers,omitempty"` // MCP servers (JSON array) LanguageModel string `json:"language_model,omitempty"` // Language model name + Workspace string `json:"workspace,omitempty"` // Workspace ID bound to this robot // Limits CostLimit float64 `json:"cost_limit,omitempty"` // Monthly cost limit USD @@ -117,6 +118,7 @@ var robotFields = []interface{}{ "agents", "mcp_servers", "language_model", + "workspace", // Limits "cost_limit", @@ -435,6 +437,9 @@ func (s *RobotStore) recordToMap(record *RobotRecord) map[string]interface{} { if record.LanguageModel != "" { data["language_model"] = record.LanguageModel } + if record.Workspace != "" { + data["workspace"] = record.Workspace + } // Limits if record.CostLimit > 0 { @@ -547,6 +552,9 @@ func (s *RobotStore) mapToRecord(row map[string]interface{}) (*RobotRecord, erro if v, ok := row["language_model"].(string); ok { record.LanguageModel = v } + if v, ok := row["workspace"].(string); ok { + record.Workspace = v + } // Limits if v := row["cost_limit"]; v != nil { @@ -596,6 +604,8 @@ func (r *RobotRecord) ToRobot() (*types.Robot, error) { SystemPrompt: r.SystemPrompt, AutonomousMode: r.AutonomousMode, RobotEmail: r.RobotEmail, + LanguageModel: r.LanguageModel, + Workspace: r.Workspace, } // Parse robot_status @@ -678,6 +688,8 @@ func FromRobot(robot *types.Robot) *RobotRecord { RobotStatus: string(robot.Status), AutonomousMode: robot.AutonomousMode, RobotEmail: robot.RobotEmail, + LanguageModel: robot.LanguageModel, + Workspace: robot.Workspace, MemberType: "robot", Status: "active", } diff --git a/agent/robot/types/robot.go b/agent/robot/types/robot.go index 2ba90f06..10e8e033 100644 --- a/agent/robot/types/robot.go +++ b/agent/robot/types/robot.go @@ -21,8 +21,9 @@ type Robot struct { SystemPrompt string `json:"system_prompt"` Status RobotStatus `json:"robot_status"` AutonomousMode bool `json:"autonomous_mode"` - RobotEmail string `json:"robot_email"` // Robot's email address for sending emails + RobotEmail string `json:"robot_email"` // Deprecated: Robot's email address for sending emails LanguageModel string `json:"language_model"` // LLM connector override (from __yao.member.language_model) + Workspace string `json:"workspace"` // Workspace ID bound to this robot (nullable in DB) // Manager info (from __yao.member) ManagerID string `json:"manager_id"` // Direct manager user_id (who manages this robot) @@ -509,6 +510,7 @@ func NewRobotFromMap(m map[string]interface{}) (*Robot, error) { ManagerID: getString(m, "manager_id"), ManagerEmail: getString(m, "manager_email"), LanguageModel: getString(m, "language_model"), + Workspace: getString(m, "workspace"), } // Parse robot_status diff --git a/agent/sandbox/v2/claude/command.go b/agent/sandbox/v2/claude/command.go index f2c42534..6e75d674 100644 --- a/agent/sandbox/v2/claude/command.go +++ b/agent/sandbox/v2/claude/command.go @@ -11,6 +11,7 @@ import ( "github.com/google/uuid" "github.com/yaoapp/gou/connector" "github.com/yaoapp/gou/store" + "github.com/yaoapp/kun/str" agentContext "github.com/yaoapp/yao/agent/context" "github.com/yaoapp/yao/agent/sandbox/v2/types" infra "github.com/yaoapp/yao/sandbox/v2" @@ -53,13 +54,10 @@ type command struct { workDir string } -func (r *ClaudeRunner) buildCommand(ctx context.Context, req *types.StreamRequest, p platform) command { +func (r *Runner) buildCommand(ctx context.Context, req *types.StreamRequest, p platform) command { computer := req.Computer workDir := computer.GetWorkDir() - assistantID := "" - if req.Config != nil { - assistantID = req.Config.ID - } + assistantID := req.AssistantID chatID := req.ChatID var isContinuation bool @@ -110,14 +108,17 @@ func buildEnv(req *types.StreamRequest, p platform) map[string]string { for k, v := range p.HomeEnv(workDir) { env[k] = v } + env["WORKDIR"] = workDir - assistantID := "" - if req.Config != nil { - assistantID = req.Config.ID - } + assistantID := req.AssistantID if assistantID != "" { configDir := p.PathJoin(workDir, ".yao", "assistants", assistantID) env["CLAUDE_CONFIG_DIR"] = configDir + env["CTX_ASSISTANT_ID"] = assistantID + // CTX_SKILLS_DIR: absolute path to the skills directory inside the sandbox. + // Use this in skill scripts instead of constructing the path manually, + // so it works correctly on all platforms (Linux, macOS, Windows). + env["CTX_SKILLS_DIR"] = p.PathJoin(workDir, ".yao", "assistants", assistantID, "skills") } if req.Connector != nil { @@ -165,7 +166,7 @@ func buildEnv(req *types.StreamRequest, p platform) map[string]string { if req.Config != nil && len(req.Config.Secrets) > 0 { for k, v := range req.Config.Secrets { - env[k] = v + env[k] = str.EnvVar(v) } } @@ -181,7 +182,7 @@ func buildEnv(req *types.StreamRequest, p platform) map[string]string { return env } -func buildArgs(req *types.StreamRequest, r *ClaudeRunner, p platform, isContinuation bool, assistantID, chatID string) []string { +func buildArgs(req *types.StreamRequest, r *Runner, p platform, isContinuation bool, assistantID, chatID string) []string { var args []string permMode := "" @@ -248,12 +249,18 @@ func buildSandboxEnvPrompt(p platform, workDir string) string { shellNote := p.EnvPromptNote() + envVarSyntax := "$VAR_NAME" + if osName == "windows" { + envVarSyntax = "$env:VAR_NAME" + } + return fmt.Sprintf(`## Sandbox Environment - **Operating System**: %[2]s - **Shell**: %[3]s - **Working Directory**: %[1]s -- **File Access**: You have full read/write access to %[1]s%[4]s +- **File Access**: You have full read/write access to %[1]s +- **Environment variable syntax**: `+"`%[5]s`"+` (e.g. `+"`$CTX_SKILLS_DIR`"+` on POSIX, `+"`$env:CTX_SKILLS_DIR`"+` on Windows)%[4]s ## User Attachments @@ -261,7 +268,7 @@ User-uploaded files (images, documents, code files, etc.) are placed in %[1]s/.a Each chat session has its own subdirectory to avoid conflicts. When the user references an attached file, read it from this directory using the Read or Bash tool. For image files, you can view them directly as Claude supports vision on local files. -`, workDir, osName, shell, shellNote) +`, workDir, osName, shell, shellNote, envVarSyntax) } func hasExistingSession(ctx context.Context, computer infra.Computer, p platform, assistantID string) bool { diff --git a/agent/sandbox/v2/claude/command_test.go b/agent/sandbox/v2/claude/command_test.go index bbfd3460..5500cf6d 100644 --- a/agent/sandbox/v2/claude/command_test.go +++ b/agent/sandbox/v2/claude/command_test.go @@ -33,7 +33,8 @@ func TestBuildEnv_HomeEnv(t *testing.T) { func TestBuildEnv_ConfigDirIsolation(t *testing.T) { req := &types.StreamRequest{ - Config: &types.SandboxConfig{ID: "my-assistant"}, + Config: &types.SandboxConfig{ID: "my-assistant"}, + AssistantID: "my-assistant", } req.Computer = newFakeComputer("/workspace") p := testPlatform() @@ -89,7 +90,7 @@ func TestBuildEnv_Secrets(t *testing.T) { func TestBuildArgs_Default(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, false, "", "") @@ -103,7 +104,7 @@ func TestBuildArgs_Default(t *testing.T) { func TestBuildArgs_Continuation(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, true, "", "") @@ -121,7 +122,7 @@ func TestBuildArgs_PermissionMode(t *testing.T) { }, } req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, false, "", "") @@ -132,7 +133,7 @@ func TestBuildArgs_PermissionMode(t *testing.T) { func TestBuildArgs_MCP(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{hasMCP: true, mcpToolPattern: "mcp__yao__*"} + r := &Runner{hasMCP: true, mcpToolPattern: "mcp__yao__*"} p := testPlatform() args := buildArgs(req, r, p, false, "test-assistant", "") @@ -163,7 +164,7 @@ func TestBuildArgs_WhitelistOptions(t *testing.T) { }, } req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, false, "", "") @@ -378,7 +379,7 @@ func TestSanitizeSessionName_Empty(t *testing.T) { func TestBuildArgs_SessionID_NewSession(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, false, "asst-1", "robot_m1_e1") @@ -402,7 +403,7 @@ func TestBuildArgs_SessionID_NewSession(t *testing.T) { func TestBuildArgs_SessionID_Continuation(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, true, "asst-1", "robot_m1_e1") @@ -425,7 +426,7 @@ func TestBuildArgs_SessionID_Continuation(t *testing.T) { func TestBuildArgs_EmptyChatID_Continuation(t *testing.T) { req := &types.StreamRequest{Config: &types.SandboxConfig{}} req.Computer = newFakeComputer("/workspace") - r := &ClaudeRunner{} + r := &Runner{} p := testPlatform() args := buildArgs(req, r, p, true, "", "") diff --git a/agent/sandbox/v2/claude/parse.go b/agent/sandbox/v2/claude/parse.go index 52b89a4b..a5039aa8 100644 --- a/agent/sandbox/v2/claude/parse.go +++ b/agent/sandbox/v2/claude/parse.go @@ -172,6 +172,30 @@ func (p *streamParser) closeTextMessage() { } } +// closeCurrentTool closes the in-flight streaming tool message (if any), +// flushing its accumulated input and emitting message_end. This must be +// called before opening a new message group so that the downstream handler +// never sees interleaved message_start/message_end pairs. +func (p *streamParser) closeCurrentTool() { + if p.curTool == nil { + return + } + toolID := p.curTool.id + inputStr := p.curTool.inputJSON.String() + if inputStr != "" { + p.toolInputs[toolID] = inputStr + summary := extractSummary(p.curTool.name, inputStr) + if summary != "" { + p.toolSummaries[toolID] = summary + p.emitExecute(map[string]any{ + "summary": summary, + }) + } + } + p.endMessage() + p.curTool = nil +} + func (p *streamParser) ensureTextMessage() (stopped bool) { if !p.textActive { _, stopped = p.beginMessage("text") @@ -318,22 +342,7 @@ func (p *streamParser) onContentBlockStart(event map[string]any) (stopped bool) } func (p *streamParser) onContentBlockStop() (stopped bool) { - if p.curTool != nil { - toolID := p.curTool.id - inputStr := p.curTool.inputJSON.String() - if inputStr != "" { - p.toolInputs[toolID] = inputStr - summary := extractSummary(p.curTool.name, inputStr) - if summary != "" { - p.toolSummaries[toolID] = summary - p.emitExecute(map[string]any{ - "summary": summary, - }) - } - } - p.endMessage() - p.curTool = nil - } + p.closeCurrentTool() return false } @@ -417,6 +426,7 @@ func (p *streamParser) handleAssistant(msg map[string]any) (stopped bool) { } p.closeTextMessage() + p.closeCurrentTool() toolName, _ := ci["name"].(string) if toolID == "" { @@ -488,12 +498,17 @@ func (p *streamParser) handleUser(msg map[string]any) (stopped bool) { continue } - // Close any open text message before opening an execute message, - // otherwise textActive stays true while currentGroupID gets - // overwritten by the execute message lifecycle, causing subsequent - // text chunks to be emitted without a message_id. + // Close any open text message before opening an execute message. p.closeTextMessage() + // When Claude CLI executes tools in parallel, tool_result messages + // can arrive while a new tool_use is still streaming. The downstream + // handler (stream.go) tracks only a single currentGroupID, so we + // must close the in-flight streaming tool message before opening + // the result message — otherwise the message_start/message_end + // pairs become interleaved and chunks lose their message_id. + p.closeCurrentTool() + toolUseID, _ := ci["tool_use_id"].(string) content := ci["content"] isError, _ := ci["is_error"].(bool) diff --git a/agent/sandbox/v2/claude/runner.go b/agent/sandbox/v2/claude/runner.go index 98eb8175..bf3455d4 100644 --- a/agent/sandbox/v2/claude/runner.go +++ b/agent/sandbox/v2/claude/runner.go @@ -15,8 +15,8 @@ import ( infra "github.com/yaoapp/yao/sandbox/v2" ) -// ClaudeRunner implements the Runner interface for Claude CLI (mode=cli). -type ClaudeRunner struct { +// Runner implements the sandbox Runner interface for Claude CLI (mode=cli). +type Runner struct { mode string hasMCP bool mcpToolPattern string @@ -25,21 +25,22 @@ type ClaudeRunner struct { logger *agentContext.RequestLogger } -// New creates a new ClaudeRunner. -func New() *ClaudeRunner { - return &ClaudeRunner{mode: "cli"} +// New creates a new Runner. +func New() *Runner { + return &Runner{mode: "cli"} } -func (r *ClaudeRunner) Name() string { return "claude" } +// Name returns the runner identifier. +func (r *Runner) Name() string { return "claude" } // Prepare executes user-defined and runner-specific prepare steps. -func (r *ClaudeRunner) Prepare(ctx context.Context, req *types.PrepareRequest) error { +func (r *Runner) Prepare(ctx context.Context, req *types.PrepareRequest) error { r.mode = req.Config.Runner.Mode if r.mode == "" { r.mode = "cli" } - assistantID := req.Config.ID + assistantID := req.AssistantID prefix := ".yao/assistants/" + assistantID if assistantID == "" { prefix = ".claude" @@ -70,7 +71,7 @@ func (r *ClaudeRunner) Prepare(ctx context.Context, req *types.PrepareRequest) e } if req.RunSteps != nil && len(steps) > 0 { - if err := req.RunSteps(ctx, steps, req.Computer, req.Config.ID, req.ConfigHash, req.AssistantDir); err != nil { + if err := req.RunSteps(ctx, steps, req.Computer, req.AssistantID, req.ConfigHash, req.AssistantDir); err != nil { return fmt.Errorf("claude prepare steps: %w", err) } } @@ -79,7 +80,7 @@ func (r *ClaudeRunner) Prepare(ctx context.Context, req *types.PrepareRequest) e } // Stream executes the Claude CLI and streams output to handler. -func (r *ClaudeRunner) Stream(ctx context.Context, req *types.StreamRequest, handler message.StreamFunc) error { +func (r *Runner) Stream(ctx context.Context, req *types.StreamRequest, handler message.StreamFunc) error { computer := req.Computer if computer == nil { return fmt.Errorf("computer is nil") @@ -111,12 +112,17 @@ func (r *ClaudeRunner) Stream(ctx context.Context, req *types.StreamRequest, han chatID := req.ChatID r.lastChatID = chatID - assistantID := "" - if req.Config != nil { - assistantID = req.Config.ID - } + assistantID := req.AssistantID log.Trace("[claude-runner] Stream started: assistantID=%s chatID=%s promptLen=%d", assistantID, chatID, len(cmd.shell)) + r.logger.Debug("env vars passed to session (%d total):", len(cmd.env)) + for k, v := range cmd.env { + if strings.HasPrefix(k, "CTX_") || k == "CLAUDE_CONFIG_DIR" || k == "HOME" || k == "WORKDIR" { + r.logger.Debug(" %s=%s", k, v) + } else { + r.logger.Debug(" %s=(set, len=%d)", k, len(v)) + } + } sess, err := startSession(ctx, computer, p, cmd, chatID, r.logger) if err != nil { @@ -132,10 +138,6 @@ func (r *ClaudeRunner) Stream(ctx context.Context, req *types.StreamRequest, han if completed { sess.shutdown() if chatID != "" { - assistantID := "" - if req.Config != nil { - assistantID = req.Config.ID - } storeKey := "claude-session:" + assistantID + ":" + chatID sessionUUID := chatIDToSessionUUID(assistantID, chatID) markChatSession(storeKey, sessionUUID, 90*24*time.Hour) @@ -146,7 +148,7 @@ func (r *ClaudeRunner) Stream(ctx context.Context, req *types.StreamRequest, han // Cleanup kills any remaining claude processes. If the stream completed // normally (received "result"), child processes are preserved. -func (r *ClaudeRunner) Cleanup(ctx context.Context, computer infra.Computer) error { +func (r *Runner) Cleanup(ctx context.Context, computer infra.Computer) error { if computer == nil { return nil } diff --git a/agent/sandbox/v2/lifecycle.go b/agent/sandbox/v2/lifecycle.go index b58ce398..606352a1 100644 --- a/agent/sandbox/v2/lifecycle.go +++ b/agent/sandbox/v2/lifecycle.go @@ -60,6 +60,8 @@ func ResolveNodeID(ctx *agentContext.Context, cfg *types.SandboxConfig, manager if err == nil && wsNode != "" { log.Trace("[sandbox/v2] ResolveNodeID: workspace %s -> node %s", workspaceID, wsNode) computerID = wsNode + } else if err != nil { + log.Warn("[sandbox/v2] ResolveNodeID: workspace %s not found or deleted, falling back to auto-select: %v", workspaceID, err) } } @@ -132,6 +134,8 @@ func GetComputer(ctx *agentContext.Context, cfg *types.SandboxConfig, manager *i log.Trace("[sandbox/v2] workspace %s bound to node %s overrides computer_id %s", workspaceID, wsNode, computerID) } computerID = wsNode + } else if err != nil { + log.Warn("[sandbox/v2] GetComputer: workspace %s not found or deleted, falling back: %v", workspaceID, err) } } @@ -280,24 +284,30 @@ func resolveBox( // LifecycleAction performs the post-request lifecycle operation based on policy. // Called in defer after executeSandboxStream completes. +// +// NOTE: cfg.ID must NOT be used here — it is a shared mutable field on the +// Assistant struct and is overwritten by concurrent requests. The authoritative +// box ID is computer.ComputerInfo().BoxID, which is set once when the Box is +// created and never changes. func LifecycleAction(ctx context.Context, cfg *types.SandboxConfig, computer infra.Computer, manager *infra.Manager) { if computer == nil || cfg == nil { return } info := computer.ComputerInfo() + boxID := info.BoxID // use the box's own immutable ID, not cfg.ID switch cfg.Lifecycle { case "oneshot": if info.Kind == "box" && manager != nil { - if err := manager.Remove(ctx, cfg.ID); err != nil { - log.Trace("[sandbox/v2] oneshot remove %s: %v", cfg.ID, err) + if err := manager.Remove(ctx, boxID); err != nil { + log.Trace("[sandbox/v2] oneshot remove %s: %v", boxID, err) } } case "session", "longrunning": if info.Kind == "box" && manager != nil { - manager.Heartbeat(cfg.ID, false, 0) // active=false: request finished, start idle timer + manager.Heartbeat(boxID, false, 0) // active=false: request finished, start idle timer } case "persistent": diff --git a/agent/sandbox/v2/options.go b/agent/sandbox/v2/options.go index 2e51f55f..d3d56d7e 100644 --- a/agent/sandbox/v2/options.go +++ b/agent/sandbox/v2/options.go @@ -2,22 +2,14 @@ package sandboxv2 import ( "fmt" - "os" "strings" "time" + "github.com/yaoapp/kun/str" "github.com/yaoapp/yao/agent/sandbox/v2/types" infra "github.com/yaoapp/yao/sandbox/v2" ) -// resolveEnvRef resolves $ENV.XXX references to os.Getenv("XXX"). -func resolveEnvRef(value string) string { - if strings.HasPrefix(value, "$ENV.") { - return os.Getenv(value[5:]) - } - return value -} - // BuildCreateOptions converts a SandboxConfig into the V2 infrastructure // CreateOptions. Connector config injection is handled separately via the // a2o HTTP API (POST /config) after the container starts. @@ -120,10 +112,10 @@ func BuildCreateOptions(cfg *types.SandboxConfig, identifier, ownerID, workspace if envSize > 0 { opts.Env = make(map[string]string, envSize) for k, v := range cfg.Environment { - opts.Env[k] = resolveEnvRef(v) + opts.Env[k] = str.EnvVar(v) } for k, v := range cfg.Secrets { - opts.Env[k] = resolveEnvRef(v) + opts.Env[k] = str.EnvVar(v) } } @@ -135,7 +127,7 @@ func BuildCreateOptions(cfg *types.SandboxConfig, identifier, ownerID, workspace if cfg.Computer.VNC.Enabled { opts.Env["VNC_ENABLED"] = "true" if cfg.Computer.VNC.Password != "" { - opts.Env["VNC_PASSWORD"] = resolveEnvRef(cfg.Computer.VNC.Password) + opts.Env["VNC_PASSWORD"] = str.EnvVar(cfg.Computer.VNC.Password) } if cfg.Computer.VNC.Resolution != "" { opts.Env["VNC_RESOLUTION"] = cfg.Computer.VNC.Resolution diff --git a/agent/sandbox/v2/prepare.go b/agent/sandbox/v2/prepare.go index 57006c79..e7297694 100644 --- a/agent/sandbox/v2/prepare.go +++ b/agent/sandbox/v2/prepare.go @@ -93,6 +93,7 @@ func runFileStep(ws workspace.FS, step types.PrepareStep) error { return fmt.Errorf("file step requires workspace") } + step.Path = expandTilde(step.Path) dir := path.Dir(step.Path) if dir != "." && dir != "/" { if err := ws.MkdirAll(dir, 0755); err != nil { @@ -126,8 +127,9 @@ func runCopyStep(ws workspace.FS, step types.PrepareStep, assistantDir string) e src = "local:///" + pathpkg.Join(assistantDir, src) } - if _, err := ws.Copy(src, step.Dst); err != nil { - return fmt.Errorf("copy %s -> %s: %w", src, step.Dst, err) + dst := expandTilde(step.Dst) + if _, err := ws.Copy(src, dst); err != nil { + return fmt.Errorf("copy %s -> %s: %w", src, dst, err) } return nil } @@ -136,6 +138,19 @@ func isHostURI(s string) bool { return strings.HasPrefix(s, "local:///") || strings.HasPrefix(s, "tmp:///") } +// expandTilde replaces a leading "~/" with the empty string so the path +// becomes relative to the workspace root (which is HOME inside the sandbox). +// Paths without "~/" are returned unchanged. +func expandTilde(p string) string { + if strings.HasPrefix(p, "~/") { + return p[2:] + } + if p == "~" { + return "." + } + return p +} + func runExecStep(ctx context.Context, computer infra.Computer, step types.PrepareStep) error { if step.Cmd == "" { return fmt.Errorf("exec step requires cmd") diff --git a/agent/sandbox/v2/stream.go b/agent/sandbox/v2/stream.go index c6615ceb..e72ea868 100644 --- a/agent/sandbox/v2/stream.go +++ b/agent/sandbox/v2/stream.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "log" "time" agentContext "github.com/yaoapp/yao/agent/context" @@ -24,9 +23,11 @@ type ExecuteRequest struct { LoadingMsgID string } -// ExecuteSandboxStream is the V2 replacement for executeSandboxStream. -// It calls runner.Stream, handles interrupts, and performs cleanup/lifecycle -// in defer. +// ExecuteSandboxStream runs runner.Stream and bridges agentContext interrupts. +// +// Cleanup (runner.Cleanup + LifecycleAction) is NOT performed here; the caller +// (agent.go sandboxCleanup closure) is responsible for all lifecycle management +// so that cleanup happens exactly once regardless of code path. func ExecuteSandboxStream( ctx *agentContext.Context, req *ExecuteRequest, @@ -38,42 +39,6 @@ func ExecuteSandboxStream( } stdCtx := ctx.Context - panicked := true // Assume panic; set false on normal exit. - - // Resolve stop timeout from config (default 2s). - stopTimeout := 2 * time.Second - if req.Config != nil && req.Config.StopTimeout != "" { - if d, err := time.ParseDuration(req.Config.StopTimeout); err == nil { - stopTimeout = d - } - } - - // Panic recovery (registered first, executes last in LIFO order). - defer func() { - if r := recover(); r != nil { - log.Printf("[sandbox/v2] panic in stream: %v", r) - cleanCtx, cancel := context.WithTimeout(context.Background(), stopTimeout) - defer cancel() - req.Runner.Cleanup(cleanCtx, req.Computer) - LifecycleAction(cleanCtx, req.Config, req.Computer, req.Manager) - } - }() - - // Lifecycle action (registered second, executes second-to-last). - defer func() { - if !panicked { - LifecycleAction(stdCtx, req.Config, req.Computer, req.Manager) - } - }() - - // Runner cleanup (registered last, executes first). - defer func() { - if !panicked { - cleanCtx, cancel := context.WithTimeout(context.Background(), stopTimeout) - defer cancel() - req.Runner.Cleanup(cleanCtx, req.Computer) - } - }() // Build a cancellable runnerCtx that bridges agentContext interrupts. runnerCtx, cancelRunner := context.WithCancel(stdCtx) @@ -144,8 +109,6 @@ func ExecuteSandboxStream( closeLoading(ctx, req.LoadingMsgID) } - panicked = false // Normal exit reached. - if err != nil { if errors.Is(err, context.Canceled) { return nil, err diff --git a/agent/sandbox/v2/types/runner.go b/agent/sandbox/v2/types/runner.go index 0166e4c7..fb7c1796 100644 --- a/agent/sandbox/v2/types/runner.go +++ b/agent/sandbox/v2/types/runner.go @@ -38,6 +38,7 @@ type PrepareRequest struct { Computer infra.Computer Config *SandboxConfig Connector connector.Connector + AssistantID string // the assistant's own ID (e.g. "yao/postman") SkillsDir string AssistantDir string // absolute host path to the assistant source directory MCPServers []MCPServer @@ -50,6 +51,7 @@ type StreamRequest struct { Computer infra.Computer Config *SandboxConfig Connector connector.Connector + AssistantID string // the assistant's own ID (e.g. "yao/postman") Messages []agentContext.Message SystemPrompt string ChatID string diff --git a/cmd/inspect.go b/cmd/inspect.go index 9c969e33..fbf96059 100644 --- a/cmd/inspect.go +++ b/cmd/inspect.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/cobra" "github.com/yaoapp/kun/maps" "github.com/yaoapp/kun/utils" + "github.com/yaoapp/yao/commercial" "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/engine" "github.com/yaoapp/yao/share" @@ -15,11 +16,13 @@ var inspectCmd = &cobra.Command{ Long: L("Show app configure"), Run: func(cmd *cobra.Command, args []string) { Boot() + commercial.Load(config.Conf.Root, "yao") engine.InspectExtTools() res := maps.Map{ "version": share.VERSION, "config": config.Conf, } + res["license"] = commercial.License if share.Tools != nil { res["tools"] = share.Tools } diff --git a/cmd/migrate.go b/cmd/migrate.go index 7c90f56a..946ced2b 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -36,8 +36,8 @@ var migrateCmd = &cobra.Command{ exception.New(L("Migrate is not allowed on production mode."), 403).Throw() } - // 加载数据模型 - loadWarnings, err := engine.Load(config.Conf, engine.LoadOption{Action: "migrate"}) + // 仅加载 Application、DB 连接和 Model(含自动 migrate),不启动完整 Engine + loadWarnings, err := engine.LoadForMigrate(config.Conf) if err != nil { fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) os.Exit(1) diff --git a/commercial/cmd/generate-test-cert/main.go b/commercial/cmd/generate-test-cert/main.go new file mode 100644 index 00000000..b7a7e023 --- /dev/null +++ b/commercial/cmd/generate-test-cert/main.go @@ -0,0 +1,121 @@ +// Command generate-test-cert creates a test root CA and a license certificate +// for local development and testing. +// +// Usage: +// +// go run ./commercial/cmd/generate-test-cert \ +// -out-cert /path/to/yao-dev-app/license.pem \ +// -out-root-ca ./commercial/roots/root-ca-1.pem +package main + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "flag" + "fmt" + "math/big" + "os" + "time" + + "github.com/yaoapp/yao/commercial" +) + +func main() { + outCert := flag.String("out-cert", "license.pem", "path to write the license certificate PEM") + outRootCA := flag.String("out-root-ca", "", "path to write the root CA PEM (optional; for injecting into commercial/roots/)") + flag.Parse() + + rootKey, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) + if err != nil { + fmt.Fprintf(os.Stderr, "generate root key: %v\n", err) + os.Exit(1) + } + + rootSerial, _ := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + rootTmpl := &x509.Certificate{ + SerialNumber: rootSerial, + Subject: pkix.Name{ + CommonName: "Yao Test Root CA", + Organization: []string{"Infinite Wisdom Software"}, + Country: []string{"CN"}, + }, + NotBefore: time.Now().Add(-1 * time.Hour), + NotAfter: time.Now().Add(10 * 365 * 24 * time.Hour), + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign, + BasicConstraintsValid: true, + IsCA: true, + MaxPathLen: 1, + } + + rootDER, err := x509.CreateCertificate(rand.Reader, rootTmpl, rootTmpl, &rootKey.PublicKey, rootKey) + if err != nil { + fmt.Fprintf(os.Stderr, "create root cert: %v\n", err) + os.Exit(1) + } + + rootCert, _ := x509.ParseCertificate(rootDER) + rootPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: rootDER}) + + leafKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + fmt.Fprintf(os.Stderr, "generate leaf key: %v\n", err) + os.Exit(1) + } + + leafTmpl := &x509.Certificate{ + SerialNumber: big.NewInt(20001), + Subject: pkix.Name{ + CommonName: "Yao Dev App", + Organization: []string{"Dev Testing"}, + Country: []string{"CN"}, + }, + EmailAddresses: []string{"dev@yaoapps.com"}, + NotBefore: time.Now().Add(-1 * time.Hour), + NotAfter: time.Now().Add(365 * 24 * time.Hour), + KeyUsage: x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageAny}, + ExtraExtensions: []pkix.Extension{ + {Id: commercial.OIDProduct, Value: []byte("yao,tai")}, + {Id: commercial.OIDEdition, Value: []byte("enterprise")}, + {Id: commercial.OIDMaxUsers, Value: []byte("0")}, + {Id: commercial.OIDMaxTaiNodes, Value: []byte("0")}, + {Id: commercial.OIDMaxAgents, Value: []byte("0")}, + {Id: commercial.OIDMaxSandboxes, Value: []byte("0")}, + {Id: commercial.OIDMaxAPIRPM, Value: []byte("0")}, + {Id: commercial.OIDMaxStorageGB, Value: []byte("0")}, + {Id: commercial.OIDAllowBrandingRemoval, Value: []byte("true")}, + {Id: commercial.OIDAllowWhiteLabel, Value: []byte("true")}, + {Id: commercial.OIDAllowMultiTenant, Value: []byte("true")}, + {Id: commercial.OIDAllowCustomDomain, Value: []byte("true")}, + {Id: commercial.OIDAllowHostExec, Value: []byte("true")}, + {Id: commercial.OIDAllowSSO, Value: []byte("true")}, + {Id: commercial.OIDSupportLevel, Value: []byte("dedicated")}, + }, + } + + leafDER, err := x509.CreateCertificate(rand.Reader, leafTmpl, rootCert, &leafKey.PublicKey, rootKey) + if err != nil { + fmt.Fprintf(os.Stderr, "create leaf cert: %v\n", err) + os.Exit(1) + } + + leafPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: leafDER}) + + if err := os.WriteFile(*outCert, leafPEM, 0644); err != nil { + fmt.Fprintf(os.Stderr, "write cert: %v\n", err) + os.Exit(1) + } + fmt.Printf("Wrote license certificate to %s\n", *outCert) + + if *outRootCA != "" { + if err := os.WriteFile(*outRootCA, rootPEM, 0644); err != nil { + fmt.Fprintf(os.Stderr, "write root CA: %v\n", err) + os.Exit(1) + } + fmt.Printf("Wrote root CA to %s\n", *outRootCA) + } +} diff --git a/commercial/commercial.go b/commercial/commercial.go new file mode 100644 index 00000000..eb6c0e5f --- /dev/null +++ b/commercial/commercial.go @@ -0,0 +1,296 @@ +package commercial + +import ( + "crypto/sha256" + "crypto/x509" + "encoding/asn1" + "fmt" + "log" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +const envLicenseCert = "YAO_LICENSE_CERT" + +// Load discovers and verifies the commercial license certificate, +// writing the result into the global License variable. +// It never returns an error — failures degrade to community defaults. +func Load(appRoot, product string) { + License = DefaultLicense() + License.Product = []string{product} + + pemData, source := findCert(appRoot) + if pemData == nil { + log.Printf("[License] No license certificate found, running with community defaults") + return + } + + info, err := verify(pemData, product) + if err != nil { + License.Source = source + License.Error = err.Error() + log.Printf("[License] %v — running with community defaults", err) + return + } + + info.Source = source + info.LoadedAt = time.Now().Unix() + License = *info + + if License.Valid { + remaining := time.Until(time.Unix(License.NotAfter, 0)) + log.Printf("[License] Loaded: %s (%s) — valid until %s", + License.LicenseeName, License.Edition, + time.Unix(License.NotAfter, 0).UTC().Format("2006-01-02")) + if remaining < 90*24*time.Hour { + log.Printf("[License] WARNING: Certificate expires in %d days", int(remaining.Hours()/24)) + } + } +} + +// findCert locates the license PEM data. +// Search order: +// 1. YAO_LICENSE_CERT env (PEM content or file path) +// 2. /license.pem +// 3. /certs/license.pem +func findCert(appRoot string) (pemData []byte, source string) { + if v := os.Getenv(envLicenseCert); v != "" { + if strings.HasPrefix(v, "-----BEGIN") { + return []byte(v), "env" + } + data, err := os.ReadFile(v) + if err == nil { + return data, "env" + } + log.Printf("[License] env %s points to unreadable file: %v", envLicenseCert, err) + } + + candidates := []string{ + filepath.Join(appRoot, "license.pem"), + filepath.Join(appRoot, "certs", "license.pem"), + } + for _, path := range candidates { + data, err := os.ReadFile(path) + if err == nil { + return data, "file" + } + } + return nil, "none" +} + +// verify parses PEM data, validates the certificate chain against built-in +// roots, checks revocation, time validity, product scope, and extracts +// custom extension fields. +func verify(pemData []byte, product string) (*LicenseInfo, error) { + certs, err := ParsePEMChain(pemData) + if err != nil { + return nil, fmt.Errorf("parse PEM: %w", err) + } + if len(certs) == 0 { + return nil, fmt.Errorf("no certificates found in PEM data") + } + + leaf := certs[0] + + pool := RootPool() + if pool == nil { + return nil, fmt.Errorf("no root certificates available (development build)") + } + + // Verify the trust chain with a synthetic time within the leaf's validity + // window. This lets us extract structured info from expired/future + // certificates instead of returning an opaque x509 error. + // We use NotAfter-1s (just before expiry) to maximize overlap with CA validity. + opts := x509.VerifyOptions{ + Roots: pool, + CurrentTime: leaf.NotAfter.Add(-time.Second), + KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageAny}, + } + + if len(certs) > 1 { + intermediates := x509.NewCertPool() + for _, c := range certs[1:] { + intermediates.AddCert(c) + } + opts.Intermediates = intermediates + } + + if _, err := leaf.Verify(opts); err != nil { + return nil, fmt.Errorf("certificate verification failed: %w", err) + } + + if IsRevoked(leaf.SerialNumber) { + return nil, fmt.Errorf("certificate serial %s has been revoked", leaf.SerialNumber.Text(16)) + } + + info := extractIdentity(leaf) + parseExtensions(leaf, info) + + now := time.Now() + if now.Before(leaf.NotBefore) { + info.Valid = false + info.Error = fmt.Sprintf("certificate not yet valid (starts %s)", + leaf.NotBefore.UTC().Format("2006-01-02")) + return info, nil + } + if now.After(leaf.NotAfter) { + info.Valid = false + info.IsExpired = true + info.Error = fmt.Sprintf("certificate expired on %s", + leaf.NotAfter.UTC().Format("2006-01-02")) + return info, nil + } + + if !info.HasProduct(product) { + info.Valid = false + info.Error = fmt.Sprintf("certificate not licensed for product %q (licensed: %v)", + product, info.Product) + return info, nil + } + + // Machine ID binding: if the certificate specifies a machine ID, + // it must match the current runtime machine ID. + // Empty machine_id means no binding — runs on any machine. + if info.MachineID != "" { + if got := currentMachineID(); got != info.MachineID { + info.Valid = false + info.Error = "certificate machine_id does not match this host" + return info, nil + } + } + + info.Valid = true + return info, nil +} + +func extractIdentity(cert *x509.Certificate) *LicenseInfo { + info := &LicenseInfo{ + LicenseeName: cert.Subject.CommonName, + SerialNumber: cert.SerialNumber.Text(16), + NotBefore: cert.NotBefore.Unix(), + NotAfter: cert.NotAfter.Unix(), + Issuer: cert.Issuer.CommonName, + Edition: "community", + Product: []string{}, + Permissions: Permissions{SupportLevel: "none"}, + } + if len(cert.Subject.Organization) > 0 { + info.LicenseeOrg = cert.Subject.Organization[0] + } + if len(cert.Subject.Country) > 0 { + info.LicenseeCountry = cert.Subject.Country[0] + } + if len(cert.EmailAddresses) > 0 { + info.LicenseeEmail = cert.EmailAddresses[0] + } + return info +} + +func parseExtensions(cert *x509.Certificate, info *LicenseInfo) { + for _, ext := range cert.Extensions { + val := string(ext.Value) + + switch { + // Scope + case ext.Id.Equal(OIDProduct): + info.Product = splitCSV(val) + case ext.Id.Equal(OIDEdition): + info.Edition = val + case ext.Id.Equal(OIDEnv): + if val != "" { + info.Env = splitCSV(val) + } + case ext.Id.Equal(OIDDomain): + info.Domain = val + case ext.Id.Equal(OIDAppID): + info.AppID = val + case ext.Id.Equal(OIDMachineID): + info.MachineID = val + + // Quota + case ext.Id.Equal(OIDMaxUsers): + info.MaxUsers = atoi(val) + case ext.Id.Equal(OIDMaxTaiNodes): + info.MaxTaiNodes = atoi(val) + case ext.Id.Equal(OIDMaxAgents): + info.MaxAgents = atoi(val) + case ext.Id.Equal(OIDMaxSandboxes): + info.MaxSandboxes = atoi(val) + case ext.Id.Equal(OIDMaxAPIRPM): + info.MaxAPIRPM = atoi(val) + case ext.Id.Equal(OIDMaxStorageGB): + info.MaxStorageGB = atoi(val) + + // Permissions + case ext.Id.Equal(OIDAllowBrandingRemoval): + info.Permissions.AllowBrandingRemoval = toBool(val) + case ext.Id.Equal(OIDAllowWhiteLabel): + info.Permissions.AllowWhiteLabel = toBool(val) + case ext.Id.Equal(OIDAllowMultiTenant): + info.Permissions.AllowMultiTenant = toBool(val) + case ext.Id.Equal(OIDAllowCustomDomain): + info.Permissions.AllowCustomDomain = toBool(val) + case ext.Id.Equal(OIDAllowHostExec): + info.Permissions.AllowHostExec = toBool(val) + case ext.Id.Equal(OIDAllowSSO): + info.Permissions.AllowSSO = toBool(val) + case ext.Id.Equal(OIDSupportLevel): + info.Permissions.SupportLevel = val + } + } +} + +// MakeExtension creates a pkix.Extension for embedding in a certificate. +func MakeExtension(oid asn1.ObjectIdentifier, value string) ExtensionValue { + return ExtensionValue{OID: oid, Value: value} +} + +// ExtensionValue pairs an OID with its string value for certificate generation. +type ExtensionValue struct { + OID asn1.ObjectIdentifier + Value string +} + +func splitCSV(s string) []string { + parts := strings.Split(s, ",") + var result []string + for _, p := range parts { + if t := strings.TrimSpace(p); t != "" { + result = append(result, t) + } + } + return result +} + +func atoi(s string) int { + n, _ := strconv.Atoi(strings.TrimSpace(s)) + return n +} + +func toBool(s string) bool { + s = strings.TrimSpace(strings.ToLower(s)) + return s == "true" || s == "1" || s == "yes" +} + +// currentMachineID returns a deterministic identifier for the current host, +// using the same algorithm as tai/machine.ID(): +// - macOS: IOPlatformUUID via ioreg +// - Linux: /etc/machine-id +// - Windows: HKLM MachineGuid registry value +// - fallback: sha256("tai-fallback:" + hostname)[:16] +// +// Implemented via platform-specific machine_{os}.go files in this package. +func currentMachineID() string { + if id := platformMachineID(); id != "" { + return id + } + hostname, err := os.Hostname() + if err != nil || hostname == "" { + hostname = "unknown" + } + h := sha256.Sum256([]byte("tai-fallback:" + hostname)) + return fmt.Sprintf("%x", h[:16]) +} diff --git a/commercial/commercial_test.go b/commercial/commercial_test.go new file mode 100644 index 00000000..c981d756 --- /dev/null +++ b/commercial/commercial_test.go @@ -0,0 +1,587 @@ +package commercial + +import ( + "crypto/x509" + _ "embed" + "math/big" + "os" + "path/filepath" + "sync" + "testing" + "time" +) + +//go:embed testdata/test-intermediate-ca.pem +var testIntermediateCAPEM []byte + +//go:embed testdata/test-license.pem +var testLicensePEM []byte + +// withTestRootPool temporarily replaces the root pool and revocation list +// for testing, restoring originals on cleanup. +func withTestRootPool(t *testing.T, ca *testCA, revoked []*big.Int) { + t.Helper() + + origPool := rootPool + origOnce := rootPoolOnce + origSerials := revokedSerials + origRevokedOnce := revokedOnce + + pool := x509.NewCertPool() + pool.AddCert(ca.Cert) + rootPool = pool + doneOnce := &sync.Once{} + doneOnce.Do(func() {}) // pre-mark as done so RootPool() returns our pool + rootPoolOnce = doneOnce + revokedSerials = revoked + doneOnce2 := &sync.Once{} + doneOnce2.Do(func() {}) + revokedOnce = doneOnce2 + + t.Cleanup(func() { + rootPool = origPool + rootPoolOnce = origOnce + revokedSerials = origSerials + revokedOnce = origRevokedOnce + }) +} + +func TestNoCertificate(t *testing.T) { + dir := t.TempDir() + License = DefaultLicense() + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false with no certificate") + } + if License.Source != "none" { + t.Fatalf("expected Source=none, got %s", License.Source) + } + if License.Edition != "community" { + t.Fatalf("expected Edition=community, got %s", License.Edition) + } + if License.MaxUsers != 100 { + t.Fatalf("expected MaxUsers=100, got %d", License.MaxUsers) + } +} + +func TestValidCertificate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + if err := os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644); err != nil { + t.Fatal(err) + } + + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true, got error: %s", License.Error) + } + if License.Source != "file" { + t.Fatalf("expected Source=file, got %s", License.Source) + } + if License.Edition != "pro" { + t.Fatalf("expected Edition=pro, got %s", License.Edition) + } + if License.LicenseeName != "Test Corp" { + t.Fatalf("expected LicenseeName=Test Corp, got %s", License.LicenseeName) + } + if License.MaxUsers != 500 { + t.Fatalf("expected MaxUsers=500, got %d", License.MaxUsers) + } +} + +func TestExpiredCertificate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + opts.NotBefore = time.Now().Add(-30 * time.Minute) + opts.NotAfter = time.Now().Add(-1 * time.Minute) + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false for expired certificate") + } + if !License.IsExpired { + t.Fatal("expected IsExpired=true") + } +} + +func TestNotYetValidCertificate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + opts.NotBefore = time.Now().Add(24 * time.Hour) + opts.NotAfter = time.Now().Add(365 * 24 * time.Hour) + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false for not-yet-valid certificate") + } + if License.IsExpired { + t.Fatal("expected IsExpired=false for future certificate") + } +} + +func TestTamperedCertificate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + // Generate with a different root (not in our pool) to simulate tampering + fakeRoot, err := generateRootCA("Fake Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + + opts := defaultLicenseOpts() + leaf, err := generateLicenseCert(fakeRoot, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false for tampered certificate") + } + if License.Error == "" { + t.Fatal("expected Error to be set") + } +} + +func TestWrongProduct(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + // Only licensed for "tai", not "yao" + for i, ext := range opts.Extensions { + if ext.OID.Equal(OIDProduct) { + opts.Extensions[i].Value = "tai" + } + } + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false for wrong product") + } +} + +func TestCertificateChainWithIntermediate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + intermediate, err := generateIntermediateCA("Test Intermediate CA", 3*365*24*time.Hour, root) + if err != nil { + t.Fatal(err) + } + + opts := defaultLicenseOpts() + leaf, err := generateLicenseCert(intermediate, opts) + if err != nil { + t.Fatal(err) + } + + // PEM chain: leaf + intermediate + chainPEM := append(leaf.CertPEM, intermediate.CertPEM...) + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), chainPEM, 0644) + + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true with intermediate chain, got error: %s", License.Error) + } +} + +func TestRevokedCertificate(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + + opts := defaultLicenseOpts() + opts.Serial = big.NewInt(99999) + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + withTestRootPool(t, root, []*big.Int{big.NewInt(99999)}) + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false for revoked certificate") + } +} + +func TestEnvVarLoading(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + // Write cert to a temp file and point env var to it + certFile := filepath.Join(t.TempDir(), "test-license.pem") + os.WriteFile(certFile, leaf.CertPEM, 0644) + + t.Setenv(envLicenseCert, certFile) + + Load(t.TempDir(), "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true via env, got error: %s", License.Error) + } + if License.Source != "env" { + t.Fatalf("expected Source=env, got %s", License.Source) + } +} + +func TestAllExtensions(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + opts.Extensions = []ExtensionValue{ + {OID: OIDProduct, Value: "yao,tai"}, + {OID: OIDEdition, Value: "enterprise"}, + {OID: OIDEnv, Value: "production,staging"}, + {OID: OIDDomain, Value: "*.acme.com"}, + {OID: OIDAppID, Value: "acme-crm"}, + {OID: OIDMaxUsers, Value: "0"}, + {OID: OIDMaxTaiNodes, Value: "0"}, + {OID: OIDMaxAgents, Value: "0"}, + {OID: OIDMaxSandboxes, Value: "0"}, + {OID: OIDMaxAPIRPM, Value: "0"}, + {OID: OIDMaxStorageGB, Value: "0"}, + {OID: OIDAllowBrandingRemoval, Value: "true"}, + {OID: OIDAllowWhiteLabel, Value: "true"}, + {OID: OIDAllowMultiTenant, Value: "true"}, + {OID: OIDAllowCustomDomain, Value: "true"}, + {OID: OIDAllowHostExec, Value: "true"}, + {OID: OIDAllowSSO, Value: "true"}, + {OID: OIDSupportLevel, Value: "dedicated"}, + } + + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true, got error: %s", License.Error) + } + if License.Edition != "enterprise" { + t.Fatalf("expected enterprise, got %s", License.Edition) + } + if !License.HasProduct("yao") || !License.HasProduct("tai") { + t.Fatalf("expected product yao,tai, got %v", License.Product) + } + if len(License.Env) != 2 { + t.Fatalf("expected 2 envs, got %v", License.Env) + } + if License.Domain != "*.acme.com" { + t.Fatalf("expected domain *.acme.com, got %s", License.Domain) + } + if License.AppID != "acme-crm" { + t.Fatalf("expected app_id acme-crm, got %s", License.AppID) + } + if License.MaxUsers != 0 { + t.Fatalf("expected MaxUsers=0 (unlimited), got %d", License.MaxUsers) + } + if !License.Permissions.AllowBrandingRemoval { + t.Fatal("expected AllowBrandingRemoval=true") + } + if !License.Permissions.AllowWhiteLabel { + t.Fatal("expected AllowWhiteLabel=true") + } + if !License.Permissions.AllowMultiTenant { + t.Fatal("expected AllowMultiTenant=true") + } + if !License.Permissions.AllowSSO { + t.Fatal("expected AllowSSO=true") + } + if License.Permissions.SupportLevel != "dedicated" { + t.Fatalf("expected SupportLevel=dedicated, got %s", License.Permissions.SupportLevel) + } +} + +func TestDefaultLicenseAndHelpers(t *testing.T) { + def := DefaultLicense() + + if def.Valid { + t.Fatal("default should not be Valid") + } + if def.Edition != "community" { + t.Fatalf("expected community, got %s", def.Edition) + } + if !def.IsLevel("community") { + t.Fatal("community should satisfy IsLevel(community)") + } + if def.IsLevel("starter") { + t.Fatal("community should not satisfy IsLevel(starter)") + } + if def.IsLevel("pro") { + t.Fatal("community should not satisfy IsLevel(pro)") + } + + pro := LicenseInfo{Edition: "pro"} + if !pro.IsLevel("community") { + t.Fatal("pro should satisfy IsLevel(community)") + } + if !pro.IsLevel("starter") { + t.Fatal("pro should satisfy IsLevel(starter)") + } + if !pro.IsLevel("pro") { + t.Fatal("pro should satisfy IsLevel(pro)") + } + if pro.IsLevel("enterprise") { + t.Fatal("pro should not satisfy IsLevel(enterprise)") + } + + multi := LicenseInfo{Product: []string{"yao", "tai"}} + if !multi.HasProduct("yao") { + t.Fatal("expected HasProduct(yao)=true") + } + if !multi.HasProduct("tai") { + t.Fatal("expected HasProduct(tai)=true") + } + if multi.HasProduct("other") { + t.Fatal("expected HasProduct(other)=false") + } +} + +// TestRealChainIntermediate verifies a certificate signed by a real test intermediate CA, +// which in turn is signed by the real Root CA 1 embedded in the binary. +// Uses testdata/test-intermediate-ca.pem and testdata/test-license.pem generated by +// /Volumes/DATA/Work/Yaobots/keys/gen-test-certs.go. +func TestRealChainIntermediate(t *testing.T) { + // Use the real embedded root pool (not overridden) + dir := t.TempDir() + if err := os.WriteFile(filepath.Join(dir, "license.pem"), testLicensePEM, 0644); err != nil { + t.Fatal(err) + } + + License = DefaultLicense() + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true with real chain, got error: %s", License.Error) + } + if License.Edition != "enterprise" { + t.Fatalf("expected Edition=enterprise, got %s", License.Edition) + } + if !License.HasProduct("yao") { + t.Fatalf("expected HasProduct(yao)=true, got products: %v", License.Product) + } + if !License.Permissions.AllowBrandingRemoval { + t.Fatal("expected AllowBrandingRemoval=true") + } + if !License.Permissions.AllowWhiteLabel { + t.Fatal("expected AllowWhiteLabel=true") + } + if !License.IsLevel("enterprise") { + t.Fatalf("expected IsLevel(enterprise)=true, edition=%s", License.Edition) + } +} + +// TestRealIntermediateCACert parses the embedded test intermediate CA cert +// and verifies it is signed by the real Root CA 1. +func TestRealIntermediateCACert(t *testing.T) { + intCert, err := ParsePEMChain(testIntermediateCAPEM) + if err != nil || len(intCert) == 0 { + t.Fatalf("failed to parse test intermediate CA: %v", err) + } + + opts := x509.VerifyOptions{ + Roots: RootPool(), + CurrentTime: time.Now(), + } + // Intermediate CA certs are not end-entity; relax KeyUsages check + opts.KeyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageAny} + if _, err := intCert[0].Verify(opts); err != nil { + t.Fatalf("test intermediate CA not verified by real root pool: %v", err) + } +} + +func TestCertsSubdirectoryFallback(t *testing.T) { + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + certsDir := filepath.Join(dir, "certs") + os.MkdirAll(certsDir, 0755) + os.WriteFile(filepath.Join(certsDir, "license.pem"), leaf.CertPEM, 0644) + + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true from certs/ fallback, got error: %s", License.Error) + } + if License.Source != "file" { + t.Fatalf("expected Source=file, got %s", License.Source) + } +} + +func TestMachineIDEmpty(t *testing.T) { + // No machine_id in cert → valid on any machine + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + // defaultLicenseOpts has no OIDMachineID → empty + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true when machine_id is empty, got: %s", License.Error) + } +} + +func TestMachineIDMatch(t *testing.T) { + // machine_id in cert matches current machine → valid + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + thisID := currentMachineID() + opts := defaultLicenseOpts() + opts.Extensions = append(opts.Extensions, ExtensionValue{OID: OIDMachineID, Value: thisID}) + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + Load(dir, "yao") + + if !License.Valid { + t.Fatalf("expected Valid=true when machine_id matches, got: %s", License.Error) + } + if License.MachineID != thisID { + t.Fatalf("expected MachineID=%s, got %s", thisID, License.MachineID) + } +} + +func TestMachineIDMismatch(t *testing.T) { + // machine_id in cert does not match current machine → invalid + root, err := generateRootCA("Test Root CA", 10*365*24*time.Hour) + if err != nil { + t.Fatal(err) + } + withTestRootPool(t, root, nil) + + opts := defaultLicenseOpts() + opts.Extensions = append(opts.Extensions, ExtensionValue{OID: OIDMachineID, Value: "000000000000000000000000deadbeef"}) + leaf, err := generateLicenseCert(root, opts) + if err != nil { + t.Fatal(err) + } + + dir := t.TempDir() + os.WriteFile(filepath.Join(dir, "license.pem"), leaf.CertPEM, 0644) + Load(dir, "yao") + + if License.Valid { + t.Fatal("expected Valid=false when machine_id does not match") + } + if License.Error == "" { + t.Fatal("expected Error to be set") + } +} diff --git a/commercial/machine_darwin.go b/commercial/machine_darwin.go new file mode 100644 index 00000000..7af237b6 --- /dev/null +++ b/commercial/machine_darwin.go @@ -0,0 +1,27 @@ +//go:build darwin + +package commercial + +import ( + "os/exec" + "strings" +) + +func platformMachineID() string { + out, err := exec.Command("ioreg", "-rd1", "-c", "IOPlatformExpertDevice").Output() + if err != nil { + return "" + } + for _, line := range strings.Split(string(out), "\n") { + if strings.Contains(line, "IOPlatformUUID") { + parts := strings.SplitN(line, "=", 2) + if len(parts) == 2 { + uuid := strings.Trim(strings.TrimSpace(parts[1]), "\"") + if uuid != "" { + return strings.TrimSpace(strings.ToLower(uuid)) + } + } + } + } + return "" +} diff --git a/commercial/machine_linux.go b/commercial/machine_linux.go new file mode 100644 index 00000000..18775e51 --- /dev/null +++ b/commercial/machine_linux.go @@ -0,0 +1,23 @@ +//go:build linux + +package commercial + +import ( + "os" + "strings" +) + +func platformMachineID() string { + data, err := os.ReadFile("/etc/machine-id") + if err != nil { + data, err = os.ReadFile("/var/lib/dbus/machine-id") + if err != nil { + return "" + } + } + id := strings.TrimSpace(strings.ToLower(string(data))) + if id == "" { + return "" + } + return id +} diff --git a/commercial/machine_windows.go b/commercial/machine_windows.go new file mode 100644 index 00000000..19da9916 --- /dev/null +++ b/commercial/machine_windows.go @@ -0,0 +1,28 @@ +//go:build windows + +package commercial + +import ( + "os/exec" + "strings" +) + +func platformMachineID() string { + out, err := exec.Command("reg", "query", + `HKLM\SOFTWARE\Microsoft\Cryptography`, + "/v", "MachineGuid", + ).Output() + if err != nil { + return "" + } + for _, line := range strings.Split(string(out), "\n") { + line = strings.TrimSpace(line) + if strings.Contains(line, "MachineGuid") { + fields := strings.Fields(line) + if len(fields) >= 3 { + return strings.TrimSpace(strings.ToLower(fields[len(fields)-1])) + } + } + } + return "" +} diff --git a/commercial/oid.go b/commercial/oid.go new file mode 100644 index 00000000..a6c24788 --- /dev/null +++ b/commercial/oid.go @@ -0,0 +1,41 @@ +package commercial + +import "encoding/asn1" + +// OID prefix: 1.3.6.1.4.1.15099.1 +// 15099 is Yao's internal port number, used as a recognizable enterprise number +// for this closed-loop certificate system. Not registered with IANA. + +var ( + // Scope + OIDProduct = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 1, 1} + OIDEdition = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 1, 2} + OIDEnv = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 1, 3} + OIDDomain = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 1, 4} + OIDAppID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 1, 5} + + // Quota + OIDMaxUsers = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 1} + OIDMaxTaiNodes = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 2} + OIDMaxAgents = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 3} + OIDMaxSandboxes = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 4} + OIDMaxAPIRPM = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 5} + OIDMaxStorageGB = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 2, 6} + + // Permissions + OIDAllowBrandingRemoval = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 1} + OIDAllowWhiteLabel = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 2} + OIDAllowMultiTenant = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 3} + OIDAllowCustomDomain = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 4} + OIDAllowHostExec = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 5} + OIDAllowSSO = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 6} + OIDSupportLevel = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 3, 7} + + // Binding (optional — if present, must match at runtime) + OIDMachineID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 5, 1} + + // Issuance (internal tracking) + OIDIssuerID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 4, 1} + OIDOrderID = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 4, 2} + OIDNote = asn1.ObjectIdentifier{1, 3, 6, 1, 4, 1, 15099, 1, 4, 3} +) diff --git a/commercial/roots.go b/commercial/roots.go new file mode 100644 index 00000000..839bb834 --- /dev/null +++ b/commercial/roots.go @@ -0,0 +1,98 @@ +package commercial + +import ( + "crypto/x509" + _ "embed" + "encoding/json" + "encoding/pem" + "math/big" + "sync" +) + +//go:embed roots/root-ca-1.pem +var rootCA1PEM []byte + +//go:embed roots/root-ca-2.pem +var rootCA2PEM []byte + +//go:embed roots/revoked.json +var revokedJSON []byte + +var ( + rootPoolOnce = &sync.Once{} + rootPool *x509.CertPool + + revokedOnce = &sync.Once{} + revokedSerials []*big.Int +) + +// RootPool returns the built-in root certificate pool (primary + backup). +// Returns nil if neither root certificate could be parsed (e.g. dev placeholder). +func RootPool() *x509.CertPool { + rootPoolOnce.Do(func() { + pool := x509.NewCertPool() + added := false + for _, pemData := range [][]byte{rootCA1PEM, rootCA2PEM} { + if pool.AppendCertsFromPEM(pemData) { + added = true + } + } + if added { + rootPool = pool + } + }) + return rootPool +} + +// RevokedSerials returns the list of revoked certificate serial numbers +// embedded in the binary. +func RevokedSerials() []*big.Int { + revokedOnce.Do(func() { + var data struct { + Serials []string `json:"serials"` + } + if err := json.Unmarshal(revokedJSON, &data); err != nil { + return + } + for _, s := range data.Serials { + n := new(big.Int) + if _, ok := n.SetString(s, 0); ok { + revokedSerials = append(revokedSerials, n) + } + } + }) + return revokedSerials +} + +// IsRevoked checks whether the given serial number is in the revocation list. +func IsRevoked(serial *big.Int) bool { + for _, s := range RevokedSerials() { + if s.Cmp(serial) == 0 { + return true + } + } + return false +} + +// ParsePEMChain parses a PEM bundle into a list of x509 certificates. +// The first certificate is treated as the leaf; remaining are intermediates. +func ParsePEMChain(pemData []byte) ([]*x509.Certificate, error) { + var certs []*x509.Certificate + rest := pemData + for { + var block *pem.Block + block, rest = pem.Decode(rest) + if block == nil { + break + } + if block.Type != "CERTIFICATE" { + continue + } + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + return nil, err + } + certs = append(certs, cert) + } + return certs, nil +} diff --git a/commercial/roots/revoked.json b/commercial/roots/revoked.json new file mode 100644 index 00000000..113c7cb8 --- /dev/null +++ b/commercial/roots/revoked.json @@ -0,0 +1 @@ +{"serials": []} diff --git a/commercial/roots/root-ca-1.pem b/commercial/roots/root-ca-1.pem new file mode 100644 index 00000000..3d631d68 --- /dev/null +++ b/commercial/roots/root-ca-1.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICATCCAYegAwIBAgIBATAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJDTjEhMB8G +A1UEChMYSW5maW5pdGUgV2lzZG9tIFNvZnR3YXJlMRYwFAYDVQQDEw1ZYW8gUm9v +dCBDQSAxMB4XDTI2MDMyNzA2MzYxMloXDTM2MDMyNDA3MzYxMlowSDELMAkGA1UE +BhMCQ04xITAfBgNVBAoTGEluZmluaXRlIFdpc2RvbSBTb2Z0d2FyZTEWMBQGA1UE +AxMNWWFvIFJvb3QgQ0EgMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDg0J9BxEjOn +Os5D7i3fzFxFOlLR13nanGIjde3bqaohZoD7fCGtfVd5+2vq7y/UOQRAvbu5/RzK +e1S9LFlWjFppdpgbeegd0dMCDEe/9tJknAO35MpWCJxmU7f3Jo4QE6NFMEMwDgYD +VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQIwHQYDVR0OBBYEFB6XvPEQ +D+g1yTpwyPj3Quwu9wuXMAoGCCqGSM49BAMDA2gAMGUCMFc2K+Xggn5GRo181pAU +aU43Sud8kyXlOuMMpQ/+mfqVNKJhPN75VditQoGiau8VjQIxAO4lJGpuG8f/j4mE +6WaF1x4x45GKc6zaHtgpVUTaX2FazAqkZgSYy57Ipnx0UWrD+A== +-----END CERTIFICATE----- diff --git a/commercial/roots/root-ca-2.pem b/commercial/roots/root-ca-2.pem new file mode 100644 index 00000000..cbb88b0d --- /dev/null +++ b/commercial/roots/root-ca-2.pem @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICATCCAYegAwIBAgIBAjAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJDTjEhMB8G +A1UEChMYSW5maW5pdGUgV2lzZG9tIFNvZnR3YXJlMRYwFAYDVQQDEw1ZYW8gUm9v +dCBDQSAyMB4XDTI2MDMyNzA2MzYxMloXDTM2MDMyNDA3MzYxMlowSDELMAkGA1UE +BhMCQ04xITAfBgNVBAoTGEluZmluaXRlIFdpc2RvbSBTb2Z0d2FyZTEWMBQGA1UE +AxMNWWFvIFJvb3QgQ0EgMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABB01XlJON6el +vpif5oCD4Mmdvj5muXeq02ZGHSWSrqrxkzUbCbI5LpwURiGObOVnGMw2MT76hW0P +Eq28XDTiXxnVqrjkE95ppl5npgnqMv3PTODizkak2HSXqwuIESLip6NFMEMwDgYD +VR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQIwHQYDVR0OBBYEFNHmPR9D +aXyJZQng5BcwhaB9H9CsMAoGCCqGSM49BAMDA2gAMGUCMQDkQlbGE1yZq7cLele8 +4S+RiYhj3sTsZejU5215f0doOfDka18iv5BeclELP2aQOeQCMFqfeeSKS9SFrHly +SRfZV9o/qxQM3i9EgV1l/D7T9qzPZWR2YcTUSS8TTcwxyIiLAA== +-----END CERTIFICATE----- diff --git a/commercial/testdata/test-intermediate-ca.pem b/commercial/testdata/test-intermediate-ca.pem new file mode 100644 index 00000000..a2a09477 --- /dev/null +++ b/commercial/testdata/test-intermediate-ca.pem @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICLzCCAbSgAwIBAgICIykwCgYIKoZIzj0EAwMwSDELMAkGA1UEBhMCQ04xITAf +BgNVBAoTGEluZmluaXRlIFdpc2RvbSBTb2Z0d2FyZTEWMBQGA1UEAxMNWWFvIFJv +b3QgQ0EgMTAeFw0yNjAzMjcwNjQyNTlaFw0yODAzMjYwNzQyNTlaMFMxCzAJBgNV +BAYTAkNOMSEwHwYDVQQKExhJbmZpbml0ZSBXaXNkb20gU29mdHdhcmUxITAfBgNV +BAMTGFlhbyBUZXN0IEludGVybWVkaWF0ZSBDQTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABHG2U+9ScPK/NBfGW3jgg8fNVH/NfGcPOkypKHonsIad1fG4H+kUtEyyQTvP +4of6FO8FmnvyezMdtaEPlUxRLmYPW9dqsnCZswZasgQLOd5b+qxe4bFY86yla2Iq +HxWIyKNmMGQwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD +VR0OBBYEFHoGH8BliDziOpSBraPs5+ehyWBMMB8GA1UdIwQYMBaAFB6XvPEQD+g1 +yTpwyPj3Quwu9wuXMAoGCCqGSM49BAMDA2kAMGYCMQCkN/W+unUuHyP/2phruVv4 +itASDUZfm3ZDGS450ixZO9OMQZ9t/dNv1HyfN0M9wCMCMQDoYKwveqllF7XvSPQp +fBfRbxsR+t8LpJqzNXMGgzUpKuZ/KLBAjnbZgwCCGCR1zN0= +-----END CERTIFICATE----- diff --git a/commercial/testdata/test-license.pem b/commercial/testdata/test-license.pem new file mode 100644 index 00000000..6c525429 --- /dev/null +++ b/commercial/testdata/test-license.pem @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIDSzCCAtGgAwIBAgIDAV+RMAoGCCqGSM49BAMDMFMxCzAJBgNVBAYTAkNOMSEw +HwYDVQQKExhJbmZpbml0ZSBXaXNkb20gU29mdHdhcmUxITAfBgNVBAMTGFlhbyBU +ZXN0IEludGVybWVkaWF0ZSBDQTAeFw0yNjAzMjcwNjQyNTlaFw0yNzAzMjcwNzQy +NTlaMD4xCzAJBgNVBAYTAkNOMRkwFwYDVQQKExBZYW8gQXBwIFRlc3QgT3JnMRQw +EgYDVQQDEwtZYW8gRGV2IEFwcDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLBN +Ikb7MXULLpHymC2qV2YjB2pbUjuB7hP6tQa/5aN82o5W7lxMUF2jP4kuptMeaiXj +QyKrtlhDWZzAJ/HshhmjggGnMIIBozAOBgNVHQ8BAf8EBAMCB4AwDwYDVR0lBAgw +BgYEVR0lADAfBgNVHSMEGDAWgBR6Bh/AZYg84jqUga2j7OfnoclgTDAaBgNVHREE +EzARgQ9kZXZAeWFvYXBwcy5jb20wFQYKKwYBBAH1ewEBAQQHeWFvLHRhaTAYBgor +BgEEAfV7AQECBAplbnRlcnByaXNlMA8GCisGAQQB9XsBAgEEATAwDwYKKwYBBAH1 +ewECAgQBMDAPBgorBgEEAfV7AQIDBAEwMA8GCisGAQQB9XsBAgQEATAwDwYKKwYB +BAH1ewECBQQBMDAPBgorBgEEAfV7AQIGBAEwMBIGCisGAQQB9XsBAwEEBHRydWUw +EgYKKwYBBAH1ewEDAgQEdHJ1ZTASBgorBgEEAfV7AQMDBAR0cnVlMBIGCisGAQQB +9XsBAwQEBHRydWUwEgYKKwYBBAH1ewEDBQQEdHJ1ZTASBgorBgEEAfV7AQMGBAR0 +cnVlMBcGCisGAQQB9XsBAwcECWRlZGljYXRlZDAbBgorBgEEAfV7AQQCBA1URVNU +LTIwMjYtMDAxMAoGCCqGSM49BAMDA2gAMGUCMDKJ9oL04HJa0Djh5PbB/bEDEpZA +nS/UWyfaXCbgqQeI+rIhjIXFsEC9CXeFXfa5iwIxAKmTybVyE0QkIQqEifB50LLy +8FXcL1owzKWB5JHn2rTVGr2cSf2SrBQJMefFWiLEUQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICLzCCAbSgAwIBAgICIykwCgYIKoZIzj0EAwMwSDELMAkGA1UEBhMCQ04xITAf +BgNVBAoTGEluZmluaXRlIFdpc2RvbSBTb2Z0d2FyZTEWMBQGA1UEAxMNWWFvIFJv +b3QgQ0EgMTAeFw0yNjAzMjcwNjQyNTlaFw0yODAzMjYwNzQyNTlaMFMxCzAJBgNV +BAYTAkNOMSEwHwYDVQQKExhJbmZpbml0ZSBXaXNkb20gU29mdHdhcmUxITAfBgNV +BAMTGFlhbyBUZXN0IEludGVybWVkaWF0ZSBDQTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABHG2U+9ScPK/NBfGW3jgg8fNVH/NfGcPOkypKHonsIad1fG4H+kUtEyyQTvP +4of6FO8FmnvyezMdtaEPlUxRLmYPW9dqsnCZswZasgQLOd5b+qxe4bFY86yla2Iq +HxWIyKNmMGQwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYD +VR0OBBYEFHoGH8BliDziOpSBraPs5+ehyWBMMB8GA1UdIwQYMBaAFB6XvPEQD+g1 +yTpwyPj3Quwu9wuXMAoGCCqGSM49BAMDA2kAMGYCMQCkN/W+unUuHyP/2phruVv4 +itASDUZfm3ZDGS450ixZO9OMQZ9t/dNv1HyfN0M9wCMCMQDoYKwveqllF7XvSPQp +fBfRbxsR+t8LpJqzNXMGgzUpKuZ/KLBAjnbZgwCCGCR1zN0= +-----END CERTIFICATE----- diff --git a/commercial/testhelper_test.go b/commercial/testhelper_test.go new file mode 100644 index 00000000..038a805a --- /dev/null +++ b/commercial/testhelper_test.go @@ -0,0 +1,177 @@ +package commercial + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "math/big" + "time" +) + +// testCA holds a generated CA certificate and its private key. +type testCA struct { + Cert *x509.Certificate + Key *ecdsa.PrivateKey + CertPEM []byte +} + +// testLicenseCert holds a generated leaf (license) certificate. +type testLicenseCert struct { + Cert *x509.Certificate + CertPEM []byte +} + +// generateRootCA creates a self-signed ECDSA P-384 root CA for testing. +func generateRootCA(cn string, validity time.Duration) (*testCA, error) { + key, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) + if err != nil { + return nil, err + } + + serial, _ := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + tmpl := &x509.Certificate{ + SerialNumber: serial, + Subject: pkix.Name{ + CommonName: cn, + Organization: []string{"Infinite Wisdom Software"}, + Country: []string{"CN"}, + }, + NotBefore: time.Now().Add(-1 * time.Hour), + NotAfter: time.Now().Add(validity), + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign, + BasicConstraintsValid: true, + IsCA: true, + MaxPathLen: 1, + } + + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, &key.PublicKey, key) + if err != nil { + return nil, err + } + + cert, err := x509.ParseCertificate(certDER) + if err != nil { + return nil, err + } + + certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) + return &testCA{Cert: cert, Key: key, CertPEM: certPEM}, nil +} + +// generateIntermediateCA creates an intermediate CA signed by the given parent. +func generateIntermediateCA(cn string, validity time.Duration, parent *testCA) (*testCA, error) { + key, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) + if err != nil { + return nil, err + } + + serial, _ := rand.Int(rand.Reader, new(big.Int).Lsh(big.NewInt(1), 128)) + tmpl := &x509.Certificate{ + SerialNumber: serial, + Subject: pkix.Name{ + CommonName: cn, + Organization: []string{"Test Partner Inc."}, + Country: []string{"US"}, + }, + NotBefore: time.Now().Add(-1 * time.Hour), + NotAfter: time.Now().Add(validity), + KeyUsage: x509.KeyUsageCertSign | x509.KeyUsageCRLSign, + BasicConstraintsValid: true, + IsCA: true, + MaxPathLen: 0, + MaxPathLenZero: true, + } + + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, parent.Cert, &key.PublicKey, parent.Key) + if err != nil { + return nil, err + } + + cert, err := x509.ParseCertificate(certDER) + if err != nil { + return nil, err + } + + certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) + return &testCA{Cert: cert, Key: key, CertPEM: certPEM}, nil +} + +// licenseOpts configures a test license certificate. +type licenseOpts struct { + CN string + Org string + Country string + Email string + NotBefore time.Time + NotAfter time.Time + Serial *big.Int + Extensions []ExtensionValue +} + +func defaultLicenseOpts() licenseOpts { + return licenseOpts{ + CN: "Test Corp", + Org: "Test Inc.", + Country: "CN", + Email: "test@example.com", + NotBefore: time.Now().Add(-1 * time.Hour), + NotAfter: time.Now().Add(365 * 24 * time.Hour), + Serial: big.NewInt(10042), + Extensions: []ExtensionValue{ + {OID: OIDProduct, Value: "yao"}, + {OID: OIDEdition, Value: "pro"}, + {OID: OIDMaxUsers, Value: "500"}, + {OID: OIDMaxTaiNodes, Value: "10"}, + {OID: OIDMaxAgents, Value: "50"}, + {OID: OIDMaxSandboxes, Value: "20"}, + {OID: OIDMaxAPIRPM, Value: "10000"}, + {OID: OIDMaxStorageGB, Value: "100"}, + {OID: OIDSupportLevel, Value: "priority"}, + }, + } +} + +// generateLicenseCert creates a leaf license certificate signed by the given CA. +func generateLicenseCert(signer *testCA, opts licenseOpts) (*testLicenseCert, error) { + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + return nil, err + } + + tmpl := &x509.Certificate{ + SerialNumber: opts.Serial, + Subject: pkix.Name{ + CommonName: opts.CN, + Organization: []string{opts.Org}, + Country: []string{opts.Country}, + }, + EmailAddresses: []string{opts.Email}, + NotBefore: opts.NotBefore, + NotAfter: opts.NotAfter, + KeyUsage: x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageAny}, + } + + for _, ext := range opts.Extensions { + tmpl.ExtraExtensions = append(tmpl.ExtraExtensions, pkix.Extension{ + Id: ext.OID, + Value: []byte(ext.Value), + }) + } + + certDER, err := x509.CreateCertificate(rand.Reader, tmpl, signer.Cert, &key.PublicKey, signer.Key) + if err != nil { + return nil, err + } + + cert, err := x509.ParseCertificate(certDER) + if err != nil { + return nil, err + } + + certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER}) + return &testLicenseCert{Cert: cert, CertPEM: certPEM}, nil +} diff --git a/commercial/types.go b/commercial/types.go new file mode 100644 index 00000000..8f383e1d --- /dev/null +++ b/commercial/types.go @@ -0,0 +1,115 @@ +package commercial + +import "time" + +// License is the global commercial license state, populated by Load(). +// Read-only after initialization; all modules may read without synchronization. +var License LicenseInfo + +// LicenseInfo holds the parsed result of a commercial license certificate. +type LicenseInfo struct { + Valid bool `json:"valid"` + Source string `json:"source"` // "none" | "file" | "env" + LoadedAt int64 `json:"loaded_at"` + Error string `json:"error,omitempty"` + + // Identity (from X.509 Subject) + LicenseeName string `json:"licensee_name"` + LicenseeOrg string `json:"licensee_org"` + LicenseeCountry string `json:"licensee_country,omitempty"` + LicenseeEmail string `json:"licensee_email,omitempty"` + SerialNumber string `json:"serial_number"` + NotBefore int64 `json:"not_before"` + NotAfter int64 `json:"not_after"` + IsExpired bool `json:"is_expired"` + Issuer string `json:"issuer"` + + // Scope + Product []string `json:"product"` + Edition string `json:"edition"` // "community" | "starter" | "pro" | "enterprise" + Env []string `json:"env,omitempty"` + Domain string `json:"domain,omitempty"` + AppID string `json:"app_id,omitempty"` + MachineID string `json:"machine_id,omitempty"` // if set, must match runtime machine ID + + // Quota (0 = unlimited) + MaxUsers int `json:"max_users"` + MaxTaiNodes int `json:"max_tai_nodes"` + MaxAgents int `json:"max_agents"` + MaxSandboxes int `json:"max_sandboxes"` + MaxAPIRPM int `json:"max_api_rpm"` + MaxStorageGB int `json:"max_storage_gb"` + + // Permissions + Permissions Permissions `json:"permissions"` +} + +// Permissions controls feature switches. +type Permissions struct { + AllowBrandingRemoval bool `json:"allow_branding_removal"` + AllowWhiteLabel bool `json:"allow_white_label"` + AllowMultiTenant bool `json:"allow_multi_tenant"` + AllowCustomDomain bool `json:"allow_custom_domain"` + AllowHostExec bool `json:"allow_host_exec"` + AllowSSO bool `json:"allow_sso"` + SupportLevel string `json:"support_level"` // "none" | "email" | "priority" | "dedicated" +} + +// PublicInfo is the subset safe for well-known / public API exposure. +type PublicInfo struct { + Valid bool `json:"valid"` + Edition string `json:"edition"` + NotAfter int64 `json:"not_after,omitempty"` + Product []string `json:"product"` +} + +// DefaultLicense returns community-level defaults when no certificate is present. +func DefaultLicense() LicenseInfo { + return LicenseInfo{ + Source: "none", + LoadedAt: time.Now().Unix(), + Edition: "community", + Product: []string{"yao"}, + MaxUsers: 100, + MaxTaiNodes: 1, + MaxAgents: 3, + MaxSandboxes: 1, + MaxAPIRPM: 1000, + MaxStorageGB: 10, + Permissions: Permissions{ + SupportLevel: "none", + }, + } +} + +// GetPublicInfo returns the public-safe subset of the current license state. +func GetPublicInfo() *PublicInfo { + return &PublicInfo{ + Valid: License.Valid, + Edition: License.Edition, + NotAfter: License.NotAfter, + Product: License.Product, + } +} + +var editionRank = map[string]int{ + "community": 0, + "starter": 1, + "pro": 2, + "enterprise": 3, +} + +// IsLevel reports whether the license meets or exceeds the given minimum edition. +func (l LicenseInfo) IsLevel(minEdition string) bool { + return editionRank[l.Edition] >= editionRank[minEdition] +} + +// HasProduct reports whether the license covers the given product name. +func (l LicenseInfo) HasProduct(product string) bool { + for _, p := range l.Product { + if p == product { + return true + } + } + return false +} diff --git a/data/bindata.go b/data/bindata.go index 69496782..5c33b135 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -551,7 +551,7 @@ func cuiSetupIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -571,7 +571,7 @@ func cuiV09IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -591,7 +591,7 @@ func cuiV10IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -611,7 +611,7 @@ func cuiV10Layouts__indexAsyncJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -631,12 +631,12 @@ func cuiV10UmiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _initCursorSkillsSuiDevelopmentSkillMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x3a\xdb\x72\x1b\xcb\x71\xef\xfb\x15\xad\xa5\xea\x10\xe0\x01\x76\x75\x71\x5c\x29\x08\x80\x4c\x51\x94\x4c\x5b\x3a\xa2\x45\x32\xa7\x5c\x3a\x8a\x30\xd8\x1d\x00\x63\x2d\x76\xf6\xcc\x0c\x48\xc1\x24\xab\xfc\x01\xa9\x3c\x9d\x24\x0f\xb9\x54\x2a\x55\x7e\xcb\x07\xe4\xc5\x95\x87\xfc\xc9\x29\xdb\xc9\x67\xa4\xba\x7b\xf6\x82\x1b\x25\xf3\x41\xc2\xce\x74\xf7\x74\xf7\xf4\xf4\x74\xf7\x74\xb7\xdb\x0d\x72\x31\x97\x3d\xb0\x0b\xd5\x4d\xe5\xa5\xcc\x74\x31\x97\xb9\x0b\x52\x69\x13\xa3\x0a\xa7\x74\xde\x83\x97\x0b\x95\x4a\x98\x68\x03\x1e\x44\xe5\x53\xb8\x92\x63\x10\x45\x91\xa9\x44\x20\x94\x85\x85\xc5\xe1\x5f\x0b\x0d\x67\x17\x27\x30\x31\x62\x2e\xaf\xb4\xf9\x18\xc1\x85\x95\x70\x35\x93\x39\x8c\x17\x2a\x4b\x11\x08\x01\x0a\x31\x95\xb6\x03\x89\x9e\x17\x3a\x97\xb9\xb3\x1d\x70\x72\x5e\x64\xc2\xe1\xf0\x4c\xe4\x69\x86\xa0\xa9\x70\x02\xc6\x2a\x47\xbc\x0e\xc8\x4b\x99\xbb\x6a\xb2\x03\x63\x91\x7c\x94\x79\x0a\xcc\xac\xed\x80\xd1\x0b\x47\x33\xea\xe1\x5f\xe7\x1d\xd0\x06\x54\xee\xe4\xd4\x08\x47\x3c\x2b\x37\x83\xa3\x8b\x93\x08\xce\x8d\x9a\x4e\xa5\x61\xbe\x16\x56\x1a\x40\xb1\x49\x8e\xb3\x8b\x93\x0e\x89\x81\x12\x36\x74\xd2\x21\x96\x9b\x4c\x6a\x03\x13\xa3\x73\x27\xf3\x34\x2e\x39\xa9\x96\xd3\x39\xa8\x9c\xe8\x34\xb5\x14\x05\xa8\xf3\x60\x8f\x54\xf0\xbc\x26\xce\x3a\x0e\x02\x1c\x6e\x9d\xa9\x79\x91\x49\xb8\x38\x69\x83\xb2\x48\x62\xdf\x92\xee\x5c\x57\xe5\xc4\x55\xa5\x5c\xda\x94\x4a\xad\x56\x9a\x4b\x69\xba\x46\xe6\xa9\x34\x32\x65\x15\xb3\xd0\x46\x8a\xc4\xa9\x4b\xd9\xd0\x77\x14\x04\x7b\x7b\x70\xa4\x8d\x84\x23\x9d\x27\xb2\x70\x36\x08\x1e\x46\x70\x70\xf0\x42\x65\xb2\x3b\x16\x56\xa6\xa5\x3e\x0f\x0e\xa0\x0b\xcf\x95\x91\x89\xd3\x66\x09\xd6\x99\x45\xe2\x16\x46\x42\x2a\x27\x2a\x97\x16\x2e\xde\xbe\x22\x58\x69\x83\x47\x48\xe2\x14\x55\x35\x80\xa3\x72\x35\x22\x70\x7c\x29\xcd\x92\xb5\x98\x88\x1c\xc6\x12\x35\x9f\x82\xb0\x20\x6a\xbe\x82\xc7\x88\x7f\xc6\xa2\x58\x34\x3c\x96\xa7\xe4\xe2\xbc\xd4\x3f\x54\x72\xea\xdc\x8b\xce\xb2\x36\x4d\x26\xf8\x09\x71\x63\xf4\xd4\x48\x6b\x51\x01\x32\x9f\x89\x3c\x91\xf3\x92\xa9\x17\x7e\x07\x4b\x1b\x02\x91\xf2\x2e\x1a\xd2\x98\x72\x4b\xd2\x53\x2d\xfc\x59\x29\x7c\x10\x8c\x46\xa3\x20\xb6\x0b\x65\xe3\xbe\x5d\xa8\x61\x5c\xd9\x46\xdc\x2f\x7f\x0e\xe3\xe0\xc7\x1f\xfe\xe5\xc7\x1f\x7e\xf7\xe3\x0f\xbf\x83\x0f\x1f\x52\x9d\x2c\x70\xe9\x68\xe6\xe6\x19\xf0\xdf\x1e\xbc\xcc\xf4\x58\x64\x50\x4e\xc2\x95\x11\x45\x21\xcd\x2a\xa6\x70\x22\xfa\x8d\xd5\x39\xd4\x7f\x35\x26\x8a\xdc\xba\x3f\xa5\xaf\xf6\x0a\x9e\xb0\x56\x3a\x1b\x03\xac\xe0\x9d\x39\xe1\x54\x02\x3c\xb9\x02\x9f\xe9\x44\x64\x72\x15\x61\x8f\x8e\x13\x4c\x54\x26\x11\xf8\x07\x0f\x4c\xf6\x15\x07\x08\x51\x0f\xf6\x71\x74\x18\xaf\x60\xbf\x45\xcb\x80\x01\x4c\x74\x96\x4a\x03\xe8\x72\x82\x72\xb6\x5e\x9b\x31\x4b\xcd\xec\x55\x3b\xbd\x1b\x34\xb1\xb6\x14\x67\x99\x49\x0b\x2d\xb1\x70\xba\x6b\x13\x5d\xc8\xb4\xbd\x1b\xcd\x59\xcf\xd7\xda\xde\xef\xc6\xf0\x7a\xdf\x03\xb2\x6b\xd2\x76\xa2\xf3\x89\x9a\xde\xc1\x1b\xcd\x97\x28\x56\x3a\x3c\x47\x16\x5a\xd3\x85\x30\x69\x07\x12\x91\xcc\x64\x07\xce\x8e\xdf\x34\x19\x5d\x55\x62\xe4\x9d\x0a\x31\xbc\x07\xcd\x33\x91\xe9\xa9\x4a\xc8\xfe\xd0\x38\x9f\xa1\x07\xc0\xc3\x36\x17\x79\x6a\xc9\x2e\xc7\xc2\xce\x82\xa5\xd0\xe8\xd9\xd9\x43\x00\xd9\x28\xd4\x96\x59\xee\x0e\x63\xa3\x27\x29\x8c\x4e\x17\x09\x3a\xaa\xcf\xa1\x76\x9f\x13\x6a\xd3\x83\xcd\x75\x2a\x2b\xb4\x2b\xe1\x92\xd9\xce\x15\xbf\xa5\xd9\x15\x04\x67\x44\x6e\x77\x22\x1c\x7f\x72\x78\x1c\xd9\x0c\xad\x43\x67\x60\x59\x7a\xef\x4e\x4b\x5b\x81\xb3\x65\xee\xc4\x27\x3e\xb2\xb8\x4d\x27\x78\x92\x0b\x9d\x91\xfb\x25\xcd\xa0\x7d\x05\xd7\xd7\x64\x85\x70\x7b\x0b\x5b\xfe\xfa\xf7\xba\x5d\xf8\x1b\x61\x94\x18\x67\x12\xba\xdd\x21\xc2\xe3\x2d\x11\xc9\xb9\x50\xd9\x06\x16\xc1\x7f\x23\xad\x93\x69\x09\xed\x94\xcb\x24\x3c\x7d\x0a\xfb\xcf\xe5\x44\x2c\x32\xb7\x5f\x61\x11\xb4\x1f\x85\x4b\x91\x2d\xaa\x25\x0a\xa3\x12\x09\x07\xf0\xfd\x42\xe4\x4e\xb9\x65\x63\x21\x42\x3a\xfe\x54\x90\x1b\xd3\x79\x89\x91\xe8\x45\xee\x60\x08\x0f\xe0\x29\xec\xff\x5a\xda\x7d\xe8\xc1\xfe\x37\x9a\x16\x23\x94\x73\x69\x72\x61\x96\x04\x5f\x9a\xcb\x91\xce\x53\x85\xfa\x10\x99\xad\x55\xd2\x4f\xd5\x25\xd8\x9e\x9a\x0c\xc2\xeb\x6b\x50\xf6\x90\x2f\x8c\xdb\xdb\x70\xc8\x3f\xfb\x71\xaa\x2e\x87\x25\x9c\xcc\x2a\xc8\x53\x49\xbe\x96\x40\xfd\xef\x75\x58\x2b\x87\x17\xf9\xc7\x5c\x5f\xe5\x7e\x26\x20\xee\xde\x14\xd2\x08\xa7\x8d\xed\xc1\x60\xd0\x81\x7b\x83\x0e\x0c\x3b\xd0\xef\xc0\x70\xd0\x81\xfe\xa0\x03\x5f\x7d\xd5\x81\x9b\x9b\x0e\xdc\x23\x01\x36\x58\x4c\xe7\x2a\x87\xaf\xbe\x5a\xe3\x96\x46\x4f\x45\x2e\x33\xbf\x58\x29\xf8\x2b\xad\x8b\xa6\xc4\x99\x02\xdb\x9b\x68\xc3\xe4\x9c\x9c\x5b\x24\xc0\x63\x5d\xfc\x1e\x84\xf8\x6f\x35\x92\xa7\xf2\xd3\x20\x54\xe1\x30\x00\x40\x0c\xf8\x1a\x1e\xc2\xed\x6d\x04\x1e\x3d\xf2\x36\x15\xf4\xe3\x4c\x95\x32\x7e\x8b\x77\x52\x52\xab\xbc\x29\x49\xb9\x36\xda\xd6\xe6\xda\x38\x1a\xd6\xf2\x92\x01\x8a\x5a\x4e\x66\x82\x46\xeb\x75\x57\xe4\x3d\x74\xce\xa8\x31\xfa\xde\x67\xfe\x3a\xac\x65\x17\x30\x33\x92\x09\xef\xc7\x48\x24\xde\x87\xaf\x41\xa5\x44\xfa\x95\xca\x3f\xf6\x63\x31\x0c\xfa\xe3\x85\x73\x78\xbf\xf6\x84\x73\xa6\x9b\x2a\x8b\x47\x22\x25\xb4\x7b\x97\x22\xf3\xf0\x67\x8b\xf1\x5c\xb9\x7e\xcc\xd0\x5e\xbc\x24\x13\xd6\x0e\x42\x0c\x24\xa0\x69\x51\x4f\x61\x9f\xa5\x20\x63\xdd\x27\x02\x47\xe4\x88\x5d\xd3\x6c\xa2\x28\x2a\x8c\x2e\xec\x90\x07\xfd\x11\x38\x2b\x8c\x14\xe9\x8a\x39\x3f\x2b\x43\xa3\xf2\xc4\xda\x20\xb8\xa9\x8f\x2f\xc0\x0d\x3c\xaf\xc3\xd9\xd5\x93\x7b\x03\xc7\x9f\x04\x45\x5b\x6b\xe3\xc1\x0d\x74\xab\x3f\x68\x7e\xac\xfe\xed\x9a\x22\x0a\xa3\xfb\x85\x30\x62\x3e\xa2\x85\xf8\x12\xa4\x01\xe9\x70\xbb\x6b\x1e\x46\xd7\xd7\xc0\xa0\x11\x29\x74\x54\xf1\x30\xba\xff\xfd\x42\x9a\x25\x53\xc0\x20\x8b\x3e\x99\xca\x06\x05\x9a\x8b\xac\x14\x26\x99\x11\x95\x92\x87\x65\xa6\x45\x3a\x82\x1b\x38\x7d\x73\x76\x0e\x63\x9d\x2e\xd7\x3d\x5e\xc5\x03\x81\x96\xf6\x54\x52\xe0\xb8\x62\x84\x60\xcd\x80\x63\x1b\x05\x06\x8d\xd8\xfd\xd5\x14\xdc\x4c\xce\x25\x4b\x71\xb4\x30\x06\xef\x0b\x1a\xda\x42\x81\xc7\x4b\x25\x54\x7a\xe0\xb8\x64\xd4\xa4\xc0\x43\x9b\x14\xfc\x78\x4d\x82\x29\x88\x85\x9b\x8d\x18\xec\xcd\xe1\xc2\xcd\x40\xe5\x13\x0d\x2d\x4a\x01\xe8\x56\x96\x69\xdb\x53\x40\xd0\x08\x0f\xc5\x07\xbf\x1f\x37\xab\x96\xf6\x62\x91\xd3\x35\x69\x57\x6e\x94\xd3\x0f\xad\x7d\xbc\xd4\x32\x4b\xb8\xd1\x0b\x95\xa7\xfb\x1d\x50\x69\x9b\x1d\x39\x19\xf0\x91\xc8\x32\xbc\x68\x13\x69\x6d\xe9\xc5\xcf\xcd\x42\xb6\x10\xa5\x7d\xd7\x85\x74\x6e\x16\x6e\xb6\x84\x64\x26\x93\x8f\x25\xe6\xf1\xbc\x70\xcb\x16\xb9\xae\xed\xb8\x7c\x6f\x20\xd4\x2a\x62\x26\xf3\xbb\xd0\x3c\xe2\xa1\x31\x62\x89\xb0\x53\x37\x2b\x31\x27\x2a\x73\xd2\x30\x72\x07\xbc\x43\x6a\xaf\x5f\x55\x2f\x08\x0a\x04\x11\xa8\x4e\xab\xbf\xad\xe9\x66\xae\x5c\xd2\x9e\x8f\x91\x68\xb4\x35\x6a\x84\x5c\xa3\x36\xe9\x17\x7f\x06\xd7\x01\x40\x48\x66\x15\xf6\x20\xf4\xf1\x2b\xdd\x9e\x61\x07\xa7\xee\x93\x0f\xc5\xb9\xe6\x16\xbc\x94\xae\x31\x1d\xf6\xe0\x9a\xa2\xad\xd0\x6f\xc0\x3a\x38\xee\x18\xc1\x03\x84\xc2\x4c\x71\xfe\x5d\x58\x9d\xcc\xf0\x7d\x00\x70\xcb\xe4\x48\xfc\xad\xf4\x7e\xf6\x52\xba\x13\x9a\x5d\x27\xc4\xaa\x0a\x3b\xf0\xf0\x01\x51\x0a\x6e\xbd\x56\xe0\x97\x72\xe9\x13\xb5\xd1\xfd\x11\x14\x46\x4e\xd4\x27\x48\x1a\x96\x22\x6d\xd0\x85\xd1\xcf\x5e\x4b\x37\xd3\xe9\x37\x02\xcf\x12\x4e\xdb\xb5\x0c\x18\x26\x95\x61\x76\x29\xef\x2e\x3d\x50\xa7\xf2\x24\x9d\xa6\x47\x50\x39\x20\x77\x6c\xdc\x9e\xd2\x19\x53\xaa\x36\xa2\x0e\x42\xfd\x76\xb8\x65\xe1\xdd\x69\x10\xc7\x64\xcf\x32\x85\xb1\x9c\x60\x26\x49\xc9\x1d\x27\x66\x41\xc9\x0b\x3c\xa3\xb9\xb7\x34\xda\x32\xf2\xfb\x85\xb4\xae\x07\x6f\xf9\x47\x1b\x7f\x25\xda\xa4\x7d\x8e\xeb\x3a\x20\xf2\xe5\x90\xf4\x9a\xe8\xdc\x3a\xbc\x92\x06\xe0\xb1\x22\x76\x7c\x91\x4a\x9f\x00\xc4\x31\x7c\xf3\xe6\xbc\x76\x9c\x01\x80\x91\x6e\x61\x72\xbf\x29\xb8\xa3\x3d\x38\x65\x05\xb6\xb6\xec\x33\x9e\x4c\xde\x23\xda\xcd\x4d\x58\xba\xd3\xc9\x84\xe0\x1a\x32\x35\x57\xae\x07\x0f\x1f\xc0\x2d\x61\xdd\x3e\x09\x6e\x03\xd4\xc0\xe1\xe9\x09\xcc\x69\x63\xa0\x4b\xbb\x22\x53\xb8\x54\x02\xee\x7b\x8d\xb6\xda\x11\x2a\xa9\x15\xbe\x94\xee\x82\x8c\xb4\x5d\xeb\xe6\xb0\x50\xe5\xf0\x36\xd5\x88\x7c\xf9\xee\x3d\xc9\xe3\x45\xdb\x2a\x8e\x67\xf1\xb6\x5d\xb2\xe4\x37\x65\x62\xf4\x1c\x38\x79\x11\x96\x2d\x93\x75\x1d\xd6\x0c\x54\x63\x3b\x96\xbf\x6b\x71\x43\x88\xa5\x36\x37\xf6\x88\xd8\x21\x0b\x1f\xc2\xc1\xc1\xc9\xbc\xd0\xc6\x09\x4c\xbb\x7b\xf5\xcd\xa8\x2c\x6d\xa2\xb8\x14\x2a\xa3\xeb\x5a\xe5\xeb\x55\x1d\xae\x20\x8d\x56\xc9\x8f\xa2\xca\x9b\x54\x45\x06\x1b\x04\x8d\x12\x83\x5a\x29\x2b\x78\x22\xca\x8e\x40\x54\x51\x91\x36\x30\xea\x2b\xe2\x6b\x38\x02\xa7\x41\xce\xc7\x32\xed\x35\xa2\x24\x74\x65\x17\x54\xd8\x42\x72\x15\x62\x15\xc2\x29\x3b\x08\xe3\x44\x98\x34\xe4\x88\x7f\x10\xbe\x5e\xc2\x11\x7e\x63\x78\xd6\x2f\xea\xc0\xa6\x18\x06\x2b\xa1\xaf\xa7\x4a\x8b\x33\x3d\xff\xdb\xf6\x84\x1d\x84\x44\x03\xa3\x41\xa3\xe7\xd5\x12\xf1\x30\xe8\xe3\xc4\xc6\x5a\xab\x0b\xf5\x63\x1c\x6d\xc6\xfb\x5e\x09\xcd\xda\xc5\xc1\xc1\x88\xa8\xd2\x3f\x94\x74\x8f\x0e\x0e\x7a\x6b\xe9\x80\x0f\xe1\x92\x4a\xa0\xd9\xe3\x61\x95\xdc\xdc\xde\xf6\xe3\xd9\x63\x1a\x6e\x86\x7b\x3a\x5d\x86\xc3\x7e\x32\x53\x59\x6a\x64\x3e\xec\xc7\x8d\x9f\x1c\xdd\xad\x06\xa9\xe8\xcd\x52\x38\xcb\xb4\xb3\x6b\x8a\xaf\xf9\xae\xf4\xed\x17\x99\xeb\x54\x64\xe1\xfa\xd2\x33\x29\x52\x69\xc2\x61\xdf\x66\xda\x51\x7e\xd7\x18\x8b\x71\xb0\x64\xe1\x2f\x65\x79\x15\x7e\xa2\xb5\x5b\x5f\xa7\x1a\x5b\x59\x67\x6d\xc7\xd1\x2c\x57\x4d\xa7\x21\xc8\x36\xa6\x67\x8f\x86\xe7\xa8\xeb\x7e\x3c\x7b\x54\x92\x66\xbb\x7a\x86\x41\x5c\xd2\x30\xae\x55\x0a\x15\x3b\x3e\x22\x7f\xf3\xcb\x2a\x38\x2f\xc9\xac\x6d\xc3\x29\xc6\xda\x70\x98\xe0\x01\x47\xeb\x28\x6b\x23\x07\x07\xd0\x1a\x91\x8d\xe0\x05\xd0\x5b\xbf\x01\xbc\xd1\x5e\x37\x36\xeb\x96\xfd\x4e\xf8\xb3\xa5\xd0\xb1\x5d\xa8\xf0\x49\xc0\x9e\xdc\xca\x6c\x02\x03\x70\x33\x3c\x4b\xb6\xc6\x78\x12\x78\x00\xb6\xab\x01\x01\x72\xf0\x8f\xae\xad\xe5\xaf\xfd\x76\x49\x47\x64\x19\x73\xbb\x02\xf9\x4a\x59\xd7\x6a\x3f\x61\x81\x0e\x0e\xbc\xf3\xad\xd9\x6f\xde\x63\x1b\x62\x7c\xd9\x5d\xd5\x01\x5a\x6a\xeb\x8d\xf5\xd9\x7b\x0c\x3d\xf5\x09\xde\x65\xcc\x2e\x7f\x3e\x69\x5c\x5a\x5f\x70\x61\x31\x52\x9b\xef\x9e\x66\x44\x75\x4c\x85\xf1\x9f\xfb\xc2\x38\x6d\x28\x0f\x6d\x26\x7e\x55\x46\xa7\xf3\x6e\x92\xa9\xe4\xe3\x20\x24\x3c\x79\x84\x1f\xe1\x90\xfe\x6b\xa4\x72\x2a\x2f\x16\x8e\xc1\xe9\x67\x09\x7e\x82\x1f\xec\x93\x26\xda\xcc\x19\xc2\x52\x22\x58\x82\x70\x5a\x18\x0e\xa3\x28\xea\xc7\x08\xb4\x92\x13\x53\x0e\x41\xc7\x61\x0b\x4b\xcf\x65\x26\x9d\x3c\xf1\xd9\x37\x82\x76\x55\x5a\xe5\xe9\x9c\x26\xe1\x0c\x5e\x6e\x3e\x5d\xf6\x73\x65\x6e\xcc\x14\x82\x5a\x92\xd2\xd2\x1b\xba\x92\x66\xa7\x3d\x97\xb7\x77\xa7\xb6\xd3\x0e\xa3\x52\x9c\xba\xc5\xc8\x3f\x6f\xe5\x64\xad\xb5\x64\x30\x00\x61\x97\x79\x02\x2d\x7a\xd7\xe8\x31\xf9\x0e\x29\xa6\x57\xaf\xd5\x86\xc1\x46\x3c\x44\xd5\x60\x8a\x82\xaa\xbf\x38\x86\x17\xc8\x52\xa5\xad\x1a\x83\xd7\x62\x1c\x27\xe7\x4f\x36\x30\x2a\x2d\x06\x00\x01\x80\xb8\x12\xca\x6d\xc6\x2f\x8d\x3d\xa1\xd8\x09\x8d\x97\x59\x8f\x9c\x30\x53\xe9\x50\xde\x9f\x9f\xbf\x7e\x75\x9c\x51\x7d\xbd\x1d\x25\x99\xb6\xd2\xba\x56\x48\xeb\x86\xed\xa7\x91\x91\x73\x7d\x29\xf1\x9c\xde\x96\x0a\x69\xda\xca\x76\x95\x54\x1a\xe0\xc5\x0a\x43\xff\xfb\x12\x5a\x8b\xf8\x60\x49\xc9\x10\x07\xb0\x8d\xa7\x17\xda\xcc\x3d\x5f\xab\xf0\xb4\x9d\x03\xc8\xe5\x15\xbc\xf0\x9f\x2d\x1c\x27\xb2\x3b\x34\xe1\x0d\xbb\x03\x6f\xc6\xbf\x91\x89\x8b\xd0\x16\x8e\x73\x67\x94\xb4\xad\x92\x66\x9b\x65\x2c\xad\x0e\x33\x16\x09\xaf\x45\x2e\xa6\xc4\xc4\xba\xe1\x7d\xd6\x78\xe2\x18\xce\xa4\x03\x8b\x74\x58\x71\xf4\x33\x3a\x43\x0f\x49\x75\xc0\xb0\x03\x0f\xda\x0c\xc9\x15\xd6\x64\x26\xf2\xa9\xb4\x0c\xcd\x25\xd9\x81\xb7\xa4\x05\x2a\xb7\x45\xf9\x53\x0f\xf2\xc5\x7c\x8c\xc9\xa7\xd7\x32\xb0\x5b\x35\x5a\xbb\x88\x92\x86\x33\x99\xd1\xe3\x47\x2b\x8c\x78\xa1\xf6\xbd\xc8\xc9\x4f\xce\xc7\x1c\x30\xc0\xc0\x42\xe5\x53\xa6\x47\x8a\xbb\xed\xd0\x06\xc7\x71\xf5\xd4\xb6\x28\xd2\x8a\xf3\x93\x3c\x31\xa4\x05\x18\x40\x6b\xcd\xbe\xb9\xa4\xe9\x5d\x3b\x8b\xf8\xb2\x16\xb1\x0d\x37\x37\xf0\x00\x57\xd8\xa5\x02\xc6\xff\x1a\x1e\x36\xf4\xef\xbd\x64\x55\xef\x3f\x3c\x3d\x59\xc9\x79\x70\x57\xed\x67\x5d\xc1\xd6\x43\xef\xa3\x6d\xdb\x8c\xe4\x37\x83\xd8\xa0\xbe\x03\xf0\xda\xda\x61\x56\x75\x82\xf0\xa4\x81\xf0\x59\x78\xcc\x28\x1f\x3d\x6e\x3f\xd9\x12\xf0\xfd\x0a\xb7\x6f\xbb\xa9\xe1\xa5\x08\x03\xb8\x7f\xbf\x15\xee\xcd\x97\x5d\x8a\xf1\xda\x4f\x1a\xde\xe4\xa5\x74\x75\xfc\x0c\xe3\x25\x9c\x3c\x0f\x38\x10\xd0\xd3\x69\x86\x67\x78\x5b\xdd\x80\x71\xa9\xca\xc1\x49\x11\xe3\x34\x36\x4a\x7e\x2a\x44\x9e\x4a\xbc\xcf\x9c\x41\x73\x61\x94\xda\xb8\x3d\x83\xfe\x56\x18\x34\x82\xf8\x89\xca\xd3\x56\xc8\x13\x61\x89\x88\x77\x23\x50\xc4\xb6\x16\x46\xd4\x78\x64\xc5\xad\x30\x2a\x03\x09\x46\x24\xe5\x80\x64\xa7\x50\x29\x8f\xef\x7e\x36\x91\xb5\xda\x38\x27\xb6\x5c\x98\xc5\x70\x23\x2c\x23\x42\x1c\xe8\x66\x38\x32\x6c\x86\x55\xab\x6a\x27\x83\x7d\x2b\x27\x46\xda\xd9\x45\x69\x08\xec\xec\xd6\x8e\xc0\x5f\x60\x26\xa5\x8b\xe2\x13\xcb\x61\x4b\xcd\x5f\x07\xaa\xda\xf2\xaa\x37\x7a\x53\xc8\x1c\xf3\xd6\xa3\x4c\xed\xf4\x45\xa2\x50\xde\x2f\x7a\xe8\xd6\x35\x8c\x85\x95\x17\x6f\x5f\xf5\x20\x8c\x45\xa1\x42\x22\xeb\xc1\x8d\xb4\x85\xce\xad\xac\xf8\x16\x85\xc2\x93\xdb\x47\x5e\xdf\xbd\x1f\xb6\xc2\x78\x51\x72\xad\x26\xd0\xba\x87\xf3\x27\xf6\xd8\x18\x8d\x91\x16\x23\xb7\xdb\x95\x1a\x74\x26\xa3\x4c\x4f\xab\xa9\x08\xef\x2f\xce\x70\x6b\xfa\xa7\xda\xf2\x02\x35\x79\x94\x99\x9b\x1a\xc2\x5f\xe8\x59\xce\x3c\x36\xbd\x00\x15\x9b\x8e\xe8\x79\x6e\x61\xfc\xbb\xd0\xc1\xc1\x68\xe5\xdd\xae\xca\x85\xb6\xd4\x9e\x08\x9f\xc2\x72\x2e\x2d\x51\xed\x10\x27\xb4\x58\xb8\x19\x8f\xd1\xf3\x5e\xd8\x83\xc7\x3f\x7d\xf0\x80\x06\x90\xf9\xa3\x72\xd0\x8f\x59\xa9\xeb\x0a\x52\x5d\xda\x3a\x7e\xd3\xa0\x8e\xa8\x75\xf1\x1a\xe7\x5f\x4b\x27\xa0\x39\x56\x15\xa5\x70\x47\x2a\x7a\x29\xdf\x8e\x2f\x37\x99\x2b\x59\xae\xcb\x57\x00\xe1\xe9\x62\x9c\xa9\x84\xeb\x4b\x08\xde\x0d\x69\xe6\xb6\x59\xa7\xda\xdb\x03\x22\x47\xf5\x75\xfa\x55\x17\x5e\x77\x56\xd8\xab\x02\xec\x97\x54\xcd\x57\xab\xe7\xba\xaa\xd8\xd6\x35\xdb\x47\xd1\x43\x68\x19\x99\xe8\xf9\x1c\x8d\x3d\x6d\x37\x56\x18\x8d\xa5\x30\xd2\x74\x7f\x73\xe5\x46\x70\x03\xcf\xe8\x0b\x9c\xfe\x28\x73\xf8\xc5\xb7\xe7\x9b\x2c\x8d\x12\xad\x3f\x2a\x59\x22\x1c\xf1\x17\x77\x3e\x6c\x47\xe8\x8e\x1a\x03\xc0\x4a\x83\x56\xae\x01\x59\x6d\xaf\x23\x94\x16\xf7\x96\xbb\x28\xf8\x55\x72\x99\x8b\xb9\x4a\xf8\x39\xc0\x06\x01\x95\x25\xde\x51\x51\xe3\x3d\x15\xe4\x1a\x8f\xe4\xb6\x87\x9a\xae\x92\xf6\x75\xa5\xd2\x83\xc0\xda\x10\x27\x70\xdb\xbc\xf2\xfa\x1e\xdc\xbd\x1d\x77\xed\x10\xab\x82\x8f\x5b\xfc\x4e\xa5\xef\xe3\x15\xad\x94\x33\x0f\x1f\x3d\x1e\x95\x43\x5b\x1f\x38\x2a\xad\xc6\xef\x12\xe1\xe4\x54\x9b\xe5\xfb\x26\x3d\x9c\xc9\xe5\x95\x8d\x7f\xf2\x57\x3f\xad\xcc\xa0\x41\xaa\x44\xf2\x04\xb9\x46\x8f\x3a\x79\x2b\xaf\x8c\xa2\x8e\x9f\xd6\x48\x14\x45\xb4\x14\x7a\xa3\x94\x5c\xd0\xde\xd5\xe7\xc5\x10\x0e\x9e\xc0\x77\xfe\x4c\x5c\x43\xf8\xb7\xdf\x7d\x17\x73\x8f\xc4\x77\xdf\xc5\xad\xe8\xa0\x7d\x3f\x24\xd7\xc7\x3d\x15\xf7\x1f\x86\x7c\xf2\x1a\xd0\x24\x3a\x02\xbf\xc3\xaf\xf7\x5f\x7b\x8c\x5a\x57\x11\xc6\x0d\x1b\x68\x35\xed\xfb\x0f\x3d\x04\x01\xac\xd6\x89\xd9\x9a\xe8\x49\x3b\x17\xfc\x9a\xa8\x7e\xeb\x3d\xd8\xde\x1e\x9c\x1b\x91\x5b\x7e\xe9\x86\xd7\xc2\x7c\x94\xa6\x59\x51\xb1\x85\xc0\x14\x8b\x1e\xda\x87\x3f\x97\x59\xa6\xe1\x5b\x6d\xb2\xb4\x1f\xe3\xcc\x90\x01\x86\xd7\xd7\xb0\xdf\xeb\x7d\x2b\xb3\x44\xcf\xe5\x3e\xd5\x78\x78\x7a\xcb\x85\xc6\x7e\x7f\x2e\xad\xe5\x6e\x9f\x0f\x1f\xe6\xad\xd0\xa3\x52\xfc\x13\x36\x62\x92\x57\xfc\x28\xf3\x82\x7a\x48\xd0\xdf\xd6\xad\x26\xbf\x9d\x75\x93\x3c\x9e\xe9\xb9\x8c\x96\x8d\x32\xd4\x52\xcc\x33\xdf\x9e\x46\x10\x41\x4a\x3d\x38\xd4\x92\x96\x39\x13\xf8\x85\x6d\x2f\x00\x68\xc8\xd3\x83\x3f\xfe\xe1\xdf\xff\xf4\xfb\x3f\xfc\xf1\xbf\xfe\xf1\x7f\xff\xe1\xef\x02\x00\xcf\x51\x0f\xfe\xfc\x9f\xff\xf1\x7f\xff\xfd\xf7\x01\x73\xff\xa1\x89\xbe\xca\x75\x0f\x42\x06\xfd\xd3\x3f\xff\xdb\x9f\xff\xf5\xf7\xe1\x8a\xf6\x0f\xa7\x54\x48\xbb\x38\x09\x82\xb3\x42\x26\x4a\x64\xbe\x15\xc4\xdf\x25\xd4\x48\x71\x78\xe2\xe1\x44\x51\xd8\x08\x5e\x69\x91\x5a\x8e\x1d\x47\xb1\xc0\x89\xaa\x55\x28\x1e\x81\xc8\x53\x1c\xb6\x56\x59\x27\x72\x67\xe3\x3e\x0a\x3d\x8c\xb9\xbd\x66\xc4\x7d\x5a\xfc\x7a\xf8\x5a\x14\x05\x39\x92\x1b\x52\x24\x9c\x0a\x37\xdb\x76\xd6\x37\xce\x7e\xe9\xaa\x36\x3c\xc6\x5d\x6e\xe1\x4b\x7d\xc5\x9a\x5f\x58\x13\x90\xc5\xc8\xf4\x54\xe5\xfc\x2f\x17\x1b\xab\x13\x4e\xe0\x1e\x60\x04\x6b\x8e\xa1\xa1\x95\x54\xce\xb5\x27\x46\x0f\xf1\xfc\x6f\x4d\xac\x41\x8b\x40\x69\xba\x7c\x49\xad\xba\x64\x76\x35\xc7\x10\xe6\x5a\xfb\x0a\x8f\x55\x41\xf5\xc5\x09\x1d\xbd\xa9\xa9\x7b\x49\x56\x9f\x42\xde\xca\x44\x72\x8f\x5d\x8e\xd9\x11\x6f\xf8\xd1\xc5\x49\x70\xa5\xf2\x54\x5f\x45\x22\x4d\x29\x9d\xc5\xd0\x4c\xe6\x18\xa8\x79\x1b\x0c\x3b\xd0\x92\x55\x0c\x88\xc1\x11\x47\x3b\x11\xd2\x87\xc1\x60\x80\xb1\x82\x5b\x14\x61\xdb\x7b\x2b\x3e\x79\xd7\xfc\x86\xda\x29\x1f\x42\x6f\x31\xf5\x65\x44\x4f\xf8\x09\x41\x57\x4d\x67\xe5\x0f\x9f\x07\x47\x56\xba\xaa\x45\xa0\x45\x21\x4a\x97\x28\x62\x64\x8e\xff\x73\x26\x17\xdc\xb6\xcb\xf4\x33\x4f\x41\xf0\xfb\x12\x38\x4d\xa2\x95\x69\x6b\x9e\x1e\x72\x01\x6d\x00\x2d\xdf\x52\xea\xcb\x60\xfe\xb1\xe9\x29\xbd\x26\x54\x42\x7a\x95\x14\xc2\x50\x46\xaf\xad\x7b\xcd\x2c\xb7\x02\x76\x8b\x28\x7a\x0f\x42\x5e\x2e\xec\x94\x6e\xa6\xe7\xa3\xbb\x8a\x2e\xdc\x96\xce\xd4\x93\x44\x65\x20\x4e\xa4\x8d\x9a\xaa\x3c\x00\xa8\x8a\x0d\x25\x93\xad\x30\xd7\x4e\x4d\x96\x91\x5d\xd0\x75\x49\x31\x63\xb5\x40\xf8\x5c\xe7\xf2\x1e\xc7\x8d\x2b\x38\xe2\x52\x4d\x85\x93\x04\x4d\xcd\x8e\x74\x17\x34\x4c\x2e\x95\x4e\xa8\x0c\xb5\x87\xf1\x1b\x52\xa2\x01\xbb\x19\x83\xfe\x6a\xa1\x92\x8f\xf0\x56\x4e\xa4\x91\x79\x22\xcb\xac\x6d\xae\x73\x3c\xd3\xe8\xdf\xc9\x49\x9e\x1a\xed\x64\xe2\x7c\x2f\x27\xbf\x10\x1e\x9e\x9e\xac\x04\xa7\x71\x4c\x93\x3e\x70\x0d\xae\x37\x03\xd2\x2a\x32\xdc\x15\x15\xa2\x0e\xcb\xba\x29\x1a\xa7\xef\xa3\xa4\x72\xcf\xe6\xa3\xc0\x17\xb5\xcc\x94\x2d\x32\xcd\xae\x18\x80\xdd\x95\xbe\x3b\xaa\x7c\xc3\xff\xf9\xa7\x46\x39\xf2\xee\xf4\x8a\x89\x35\xaa\x48\x9f\x2d\xaa\x7d\x49\xad\xcb\x57\xdb\x7c\xc1\xeb\xb3\xc5\xae\x54\x5d\x6e\x94\xba\xbc\x76\x5f\x50\xa5\x74\x31\x9e\x2b\x6a\xe3\x5a\x55\xee\x66\x19\xb5\x2c\xa0\xa2\xea\xb8\x0e\xcb\xe5\x7d\x6a\x43\x0b\xe9\x8c\x54\x1f\x46\x7e\xbf\x50\x46\xa6\x10\x0f\x1b\x9a\x66\x10\xeb\xe9\x6c\xf4\xe9\xf8\xaa\xec\x2e\x75\x6e\x14\xe5\x36\x0a\x72\x5f\x50\x8c\xbb\xbb\x10\xb7\xab\xc2\x26\xe8\xa5\x7c\x4b\x7d\x6d\xb3\x50\xb7\x56\x69\xa3\x9b\xb1\x71\xb4\xfc\x5d\xb9\xe5\x4a\x34\x85\xb6\x1b\x13\x77\xdd\x8a\x77\xe7\x2d\x7c\x67\x35\xda\x58\xab\xfe\x93\xba\x3f\x71\xc7\x5a\xa3\xba\xa3\xb5\xee\x7b\xd9\xda\xd6\xba\x0d\xcb\xd9\x46\x40\xbd\xde\xd5\xba\x73\x2d\xea\xb0\xa8\xb0\x9e\xd7\x4d\xad\x65\x24\xb3\x9d\x43\xce\x8f\x4b\x1d\xae\x34\xb7\xee\x96\xab\xf1\xf8\x82\x72\xad\x77\xb2\xae\x63\xad\x35\x4a\x73\xe3\x90\x6f\x3d\xf2\xcd\xd1\x5b\xd6\x6a\x34\x49\xd7\x72\xed\x6c\x58\xaa\xb1\xca\x38\xb4\xa1\x79\x6a\x34\x75\x75\x3c\x6d\x37\xb1\x7c\x12\xd0\xd4\xbc\xef\x4a\xa1\x3e\xe9\xcd\xb5\xfe\x3f\x00\x00\xff\xff\x33\xc5\xaa\x05\x6e\x31\x00\x00") +var _initCursorSkillsSuiDevelopmentSkillMd = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x7c\x5d\x93\x1b\xc9\x91\xd8\x7b\xff\x8a\x64\x0f\xbd\x03\x60\x81\x06\xb9\x94\x14\x17\x20\x80\xd5\xec\xf0\x63\xe7\x44\x2e\x29\xce\xcc\x6d\x28\xb8\x6b\x76\x4d\x77\x01\xa8\x65\xa3\xab\x55\x55\x98\x21\x34\x1c\xc5\x5a\x8e\x3b\x9f\xc2\xbe\xf3\x85\x6e\xc3\xf6\xc3\x3d\xdc\x5d\xd8\xbe\x7b\xb1\x9f\x6c\x87\x2d\x7f\x3d\xf8\x9f\xac\xf6\x23\xf6\x5f\x38\x32\xb3\xfa\x0b\xc0\x90\x2b\xcd\x43\x0f\x50\x5d\x99\x95\x95\x95\x95\x5f\x95\x85\xc1\x60\x10\xe4\x62\x29\x47\x60\x57\x6a\x90\xca\x73\x99\xe9\x62\x29\x73\x17\xa4\xd2\x26\x46\x15\x4e\xe9\x7c\x04\x0f\x57\x2a\x95\x30\xd3\x06\x7c\x17\x95\xcf\xe1\x42\x9e\x81\x28\x8a\x4c\x25\x02\x7b\x59\x58\x59\x6c\xfe\x99\xd0\x70\x7c\x7a\x04\x33\x23\x96\xf2\x42\x9b\x97\x11\x9c\x5a\x09\x17\x0b\x99\xc3\xd9\x4a\x65\x29\x76\xc2\x0e\x85\x98\x4b\xdb\x87\x44\x2f\x0b\x9d\xcb\xdc\xd9\x3e\x38\xb9\x2c\x32\xe1\xb0\x79\x21\xf2\x34\xc3\xae\xa9\x70\x02\xce\x54\x8e\x70\x7d\x90\xe7\x32\x77\xd5\xcb\x3e\x9c\x89\xe4\xa5\xcc\x53\x60\x62\x6d\x1f\x8c\x5e\x39\x7a\xa3\x6e\xff\x51\xde\x07\x6d\x40\xe5\x4e\xce\x8d\x70\x44\xb3\x72\x0b\x38\x3c\x3d\x8a\xe0\xc4\xa8\xf9\x5c\x1a\xa6\x6b\x65\xa5\x01\x9c\x36\xcd\xe3\xf8\xf4\xa8\x4f\xd3\xc0\x19\x36\x78\xd2\x27\x92\x9b\x44\x6a\x03\x33\xa3\x73\x27\xf3\x74\x58\x52\x52\x0d\xa7\x73\x50\x39\xe1\x69\x72\x29\x0a\x90\xe7\xc1\x1e\xb1\xe0\x5e\x8d\x9c\x79\x1c\x04\xd8\xdc\x39\x56\xcb\x22\x93\x70\x7a\xd4\x05\x65\x11\xc5\xbe\x25\xde\xb9\x81\xca\x89\xaa\x8a\xb9\xb4\x28\x15\x5b\xad\x34\xe7\xd2\x0c\x8c\xcc\x53\x69\x64\xca\x2c\xe6\x49\x1b\x29\x12\xa7\xce\x65\x83\xdf\x51\x10\xec\xed\xc1\xa1\x36\x12\x0e\x75\x9e\xc8\xc2\xd9\x20\xb8\x1d\x41\xaf\xf7\x40\x65\x72\x70\x26\xac\x4c\x4b\x7e\xf6\x7a\x30\x80\x7b\xca\xc8\xc4\x69\xb3\x06\xeb\xcc\x2a\x71\x2b\x23\x21\x95\x33\x95\x4b\x0b\xa7\xcf\x1e\x51\x5f\x69\x83\xf7\x10\xc5\x53\x64\xd5\x04\x0e\xcb\xd1\x08\xc1\xfd\x73\x69\xd6\xcc\xc5\x44\xe4\x70\x26\x91\xf3\x29\x08\x0b\xa2\xa6\x2b\xb8\x83\xf0\xc7\x3c\x15\x8b\x82\xc7\xf3\x29\xa9\x38\x29\xf9\x0f\xd5\x3c\x75\xee\xa7\xce\x73\x6d\x8a\x4c\xf0\x03\xa2\xc6\xe8\xb9\x91\xd6\x22\x03\x64\xbe\x10\x79\x22\x97\x25\x51\x0f\xfc\x0a\x96\x32\x04\x22\xe5\x55\x34\xc4\x31\xe5\xd6\xc4\xa7\x7a\xf2\xc7\xe5\xe4\x83\x20\x8e\xe3\x60\x68\x57\xca\x0e\xc7\x76\xa5\xa6\xc3\x4a\x36\x86\xe3\xf2\xe3\x74\x18\x7c\xf9\xc5\xdf\x7c\xf9\xc5\xe7\x5f\x7e\xf1\x39\xbc\x78\x91\xea\x64\x85\x43\x47\x0b\xb7\xcc\x80\xff\xf6\xe0\x61\xa6\xcf\x44\x06\xe5\x4b\xb8\x30\xa2\x28\xa4\x69\x43\x0a\x27\xa2\xcf\xac\xce\xa1\xfe\xab\x21\x71\xca\x9d\x9b\x73\xfa\xd6\x6d\xc1\x09\x6b\xa5\xb3\x43\x80\x16\xdc\xb1\x13\x4e\x25\xc0\x2f\x5b\xfd\x33\x9d\x88\x4c\xb6\x01\xf6\x68\x3b\xc1\x4c\x65\x12\x3b\x7f\xe1\x3b\x93\x7c\x0d\x03\xec\x51\x37\x8e\xb1\x75\x3a\x6c\x41\x3f\x43\xc9\x80\x09\xcc\x74\x96\x4a\x03\xa8\x72\x82\xf2\x6d\x3d\x36\x43\x96\x9c\xd9\xab\x56\xfa\xfa\xae\x89\xb5\xe5\x74\xd6\x99\xb4\xd0\x11\x2b\xa7\x07\x36\xd1\x85\x4c\xbb\xd7\x83\x39\xeb\xe9\xda\x58\xfb\xeb\x21\x3c\xdf\xf7\x80\xe4\x9a\xb8\x9d\xe8\x7c\xa6\xe6\x6f\xa0\x8d\xde\x97\x20\x56\x3a\xdc\x47\x16\x3a\xf3\x95\x30\x69\x1f\x12\x91\x2c\x64\x1f\x8e\xef\x3f\x69\x12\xda\x66\x62\xe4\x95\x0a\x11\xbc\x07\xcd\x3d\x91\xe9\xb9\x4a\x48\xfe\x50\x38\x3f\x40\x0d\x80\x9b\x6d\x29\xf2\xd4\x92\x5c\x9e\x09\xbb\x08\xd6\x42\xa3\x66\x67\x0d\x01\x24\xa3\x50\x4b\x66\xb9\x3a\x0c\x8d\x9a\xa4\x30\x3a\x5d\x25\xa8\xa8\xde\x06\x3a\xb8\x47\xa0\x4d\x0d\xb6\xd4\xa9\xac\xc0\x2e\x84\x4b\x16\xd7\x8e\xf8\x31\xbd\x6d\x01\x38\x23\x72\x7b\x2d\xc0\xfd\x57\x0e\xb7\x23\x8b\xa1\x75\xa8\x0c\x2c\xcf\xde\xab\xd3\x52\x56\xe0\x78\x9d\x3b\xf1\x8a\xb7\x2c\x2e\xd3\x11\xee\xe4\x42\x67\xa4\x7e\x89\x33\x28\x5f\xc1\xe5\x25\x49\x21\x5c\x5d\xc1\x8e\xbf\xf1\x8d\xc1\x00\xfe\x44\x18\x25\xce\x32\x09\x83\xc1\x14\xfb\xa3\x95\x88\xe4\x52\xa8\x6c\x0b\x8a\xfa\x7f\x24\xad\x93\x69\xd9\xdb\x29\x97\x49\x78\xff\x7d\xd8\xbf\x27\x67\x62\x95\xb9\xfd\x0a\x8a\x7a\xfb\x56\x38\x17\xd9\xaa\x1a\xa2\x30\x2a\x91\xd0\x83\x9f\xaf\x44\xee\x94\x5b\x37\x06\x22\xa0\xfb\xaf\x0a\x52\x63\x3a\x2f\x21\x12\xbd\xca\x1d\x4c\xe1\x16\xbc\x0f\xfb\x3f\x93\x76\x1f\x46\xb0\xff\x91\xa6\xc1\x08\xe4\x44\x9a\x5c\x98\x35\xf5\x2f\xc5\xe5\x50\xe7\xa9\x42\x7e\x88\xcc\xd6\x2c\x19\xa7\xea\x1c\xec\x48\xcd\x26\xe1\xe5\x25\x28\x7b\xc0\x06\xe3\xea\x2a\x9c\xf2\xc7\xf1\x30\x55\xe7\xd3\xb2\x9f\xcc\xaa\x9e\x4f\x25\xe9\x5a\xea\xea\x3f\x6f\xf6\xb5\x72\x7a\x9a\xbf\xcc\xf5\x45\xee\xdf\x04\x44\xdd\x93\x42\x1a\xe1\xb4\xb1\x23\x98\x4c\xfa\x70\x63\xd2\x87\x69\x1f\xc6\x7d\x98\x4e\xfa\x30\x9e\xf4\xe1\x9d\x77\xfa\xf0\xfa\x75\x1f\x6e\xd0\x04\xb6\x48\x4c\x97\x2a\x87\x77\xde\xd9\xa0\x96\x5a\x9f\x8a\x5c\x66\x7e\xb0\x72\xe2\x8f\xb4\x2e\x9a\x33\xce\x14\xd8\xd1\x4c\x1b\x46\xe7\xe4\xd2\x22\x02\x6e\x1b\xe0\xf7\x49\x88\xcf\xaa\x25\x4f\xe5\xab\x49\xa8\xc2\x69\x00\x80\x10\xf0\x2e\xdc\x86\xab\xab\x08\x3c\x78\xe4\x65\x2a\x18\x0f\x33\x55\xce\xf1\x63\xb4\x49\x49\xcd\xf2\xe6\x4c\xca\xb1\x51\xb6\xb6\xc7\xc6\xd6\xb0\x9e\x2f\x09\xa0\xa8\xe7\xc9\x44\x50\x6b\x3d\x6e\x6b\xbe\x07\xce\x19\x75\x86\xba\xf7\x03\x6f\x0e\xeb\xb9\x0b\x58\x18\xc9\x88\xf7\x87\x88\x64\xb8\x0f\xef\x82\x4a\x09\xf5\x23\x95\xbf\x1c\x0f\xc5\x34\x18\x9f\xad\x9c\x43\xfb\x3a\x12\xce\x99\x41\xaa\x2c\x6e\x89\x94\xc0\x6e\x9c\x8b\xcc\xf7\x3f\x5e\x9d\x2d\x95\x1b\x0f\xb9\xb7\x9f\x5e\x92\x09\x6b\x27\x21\x3a\x12\xd0\x94\xa8\xf7\x61\x9f\x67\x41\xc2\xba\x4f\x08\x0e\x49\x11\xbb\xa6\xd8\x44\x51\x54\x18\x5d\xd8\x29\x37\xfa\x2d\x70\x5c\x18\x29\xd2\x96\x38\x7f\x50\xba\x46\xe5\x8e\xb5\x41\xf0\xba\xde\xbe\x00\xaf\xe1\x5e\xed\xce\xb6\x77\xee\x6b\xb8\xff\x4a\x90\xb7\xb5\xd1\x1e\xbc\x86\x41\xf5\x07\xcd\x2f\xed\xbf\xeb\x5e\x11\x86\xf8\x66\x21\x8c\x58\xc6\x34\x10\x1b\x41\x6a\x90\x0e\x97\xbb\xa6\x21\xbe\xbc\x04\xee\x1a\x11\x43\xe3\x8a\x86\xf8\xe6\xcf\x57\xd2\xac\x19\x03\x3a\x59\xf4\x95\xb1\x6c\x61\xa0\x77\x91\x95\xc2\x24\x0b\xc2\x52\xd2\xb0\xce\xb4\x48\x63\x78\x0d\x4f\x9f\x1c\x9f\xc0\x99\x4e\xd7\x9b\x1a\xaf\xa2\x81\xba\x96\xf2\x54\x62\x60\xbf\x22\xc6\x6e\x4d\x87\x63\x17\x06\xee\x1a\xb1\xfa\xab\x31\xb8\x85\x5c\x4a\x9e\xc5\xe1\xca\x18\xb4\x17\xd4\xb4\x03\x03\xb7\x97\x4c\xa8\xf8\xc0\x7e\x49\xdc\xc4\xc0\x4d\xdb\x18\x7c\x7b\x8d\x82\x31\x88\x95\x5b\xc4\xdc\xed\xc9\xc1\xca\x2d\x40\xe5\x33\x0d\x1d\x0a\x01\xc8\x2a\xcb\xb4\xeb\x31\x60\xd7\x08\x37\xc5\x0b\xbf\x1e\xaf\xdb\x92\xf6\x60\x95\x93\x99\xb4\x2d\x8b\xf2\xf4\x45\x67\x1f\x8d\x5a\x66\x09\x36\x7a\xa0\xf2\x74\xbf\x0f\x2a\xed\xb2\x22\x27\x01\x3e\x14\x59\x86\x86\x36\x91\xd6\x96\x5a\xfc\xc4\xac\x64\x07\x41\xba\x6f\x32\x48\x27\x66\xe5\x16\x6b\x48\x16\x32\x79\x59\x42\xde\x5f\x16\x6e\xdd\x21\xd5\xb5\x1b\x96\xed\x06\xf6\x6a\x03\x66\x32\x7f\x13\x98\x07\x3c\x30\x46\xac\xb1\xef\xdc\x2d\x4a\xc8\x99\xca\x9c\x34\x0c\xdc\x07\xaf\x90\xba\x9b\xa6\xea\x01\xf5\x02\x41\x08\xaa\xdd\xea\xad\x35\x59\xe6\x4a\x25\xed\x79\x1f\x89\x5a\x3b\x71\xc3\xe5\x8a\xbb\xc4\x5f\xfc\x18\x5c\x06\x00\x21\x89\x55\x38\x82\xd0\xfb\xaf\x64\x3d\xc3\x3e\xbe\xba\x49\x3a\x14\xdf\x35\x97\xe0\xa1\x74\x8d\xd7\xe1\x08\x2e\xc9\xdb\x0a\xfd\x02\x6c\x76\xc7\x15\xa3\xfe\x00\xa1\x30\x73\x7c\xff\x3c\xac\x76\x66\xf8\x69\x00\x70\xc5\xe8\x68\xfa\x3b\xf1\xfd\xf8\xa1\x74\x47\xf4\x76\x13\x11\xb3\x2a\xec\xc3\xed\x5b\x84\x29\xb8\xf2\x5c\x81\x9f\xc8\xb5\x0f\xd4\xe2\x9b\x31\x14\x46\xce\xd4\x2b\x48\x1a\x92\x22\x6d\x30\x80\xf8\xc7\x8f\xa5\x5b\xe8\xf4\x23\x81\x7b\x09\x5f\xdb\x8d\x08\x18\x66\x95\x60\x0e\x28\xee\x2e\x35\x50\xbf\xd2\x24\xfd\xa6\x46\x50\x39\x20\x75\x2c\xdc\x1e\xd3\x31\x63\xaa\x16\xa2\x76\x42\xfd\x72\xb8\x75\xe1\xd5\x69\x30\x1c\x92\x3c\xcb\x14\xce\xe4\x0c\x23\x49\x0a\xee\x38\x30\x0b\x4a\x5a\xe0\x03\x7a\xf7\x8c\x5a\x3b\x46\xfe\x7c\x25\xad\x1b\xc1\x33\xfe\xd0\xc5\x4f\x89\x36\xe9\x98\xfd\xba\x3e\x88\x7c\x3d\x25\xbe\x26\x3a\xb7\x0e\x4d\xd2\x04\x3c\x54\xc4\x8a\x2f\x52\xe9\x5d\x80\xe1\x10\x3e\x7a\x72\x52\x2b\xce\x00\xc0\x48\xb7\x32\xb9\x5f\x14\x5c\xd1\x11\x3c\x65\x06\x76\x76\xac\x33\xee\x4c\x5e\x23\x5a\xcd\xed\xbe\x64\xd3\x49\x84\xe0\x12\x32\xb5\x54\x6e\x04\xb7\x6f\xc1\x15\x41\x5d\xdd\x0d\xae\x02\xe4\xc0\xc1\xd3\x23\x58\xd2\xc2\xc0\x80\x56\x45\xa6\x70\xae\x04\xdc\xf4\x1c\xed\x74\x23\x64\x52\x27\x7c\x28\xdd\x29\x09\x69\xb7\xe6\xcd\x41\xa1\xca\xe6\x5d\xac\x11\xf9\xfa\xf9\xa7\x34\x1f\x3f\xb5\x9d\xd3\xf1\x24\x5e\x75\x4b\x92\xfc\xa2\xcc\x8c\x5e\x02\x07\x2f\xc2\xb2\x64\x32\xaf\xc3\x9a\x80\xaa\xed\x9a\xe1\xdf\x34\xb8\x21\xc0\x92\x9b\x5b\x6b\x44\xe4\x90\x84\x4f\xa1\xd7\x3b\x5a\x16\xda\x38\x81\x61\xf7\xa8\xb6\x8c\xca\xd2\x22\x8a\x73\xa1\x32\x32\xd7\x2a\xdf\xcc\xea\x70\x06\x29\x6e\xa3\x8f\xa3\x4a\x9b\x54\x49\x06\x1b\x04\x8d\x14\x83\x6a\xa5\x15\x3c\x12\x65\x63\x10\x95\x57\xa4\x0d\xc4\x63\x45\x74\x4d\x63\x70\x1a\xe4\xf2\x4c\xa6\xa3\x86\x97\x84\xaa\xec\x94\x12\x5b\x88\xae\x02\xac\x5c\x38\x65\x27\xe1\x30\x11\x26\x0d\xd9\xe3\x9f\x84\x8f\xd7\x70\x88\xdf\xd1\x3d\x1b\x17\xb5\x63\x53\x4c\x83\x96\xeb\xeb\xb1\xd2\xe0\x8c\xcf\x7f\xb6\x23\x61\x27\x21\xe1\x40\x6f\xd0\xe8\x65\x35\xc4\x70\x1a\x8c\xf1\xc5\xd6\x58\xed\x81\xc6\x43\x6c\x6d\xfa\xfb\x9e\x09\xcd\xdc\x45\xaf\x17\x13\x56\x7a\x50\xd0\x1d\xf7\x7a\xa3\x8d\x70\xc0\xbb\x70\x49\x35\xa1\xc5\x9d\x69\x15\xdc\x5c\x5d\x8d\x87\x8b\x3b\xd4\xdc\x74\xf7\x74\xba\x0e\xa7\xe3\x64\xa1\xb2\xd4\xc8\x7c\x3a\x1e\x36\x3e\xb2\x77\xd7\x76\x52\x51\x9b\xa5\x70\x9c\x69\x67\x37\x18\x5f\xd3\x5d\xf1\xdb\x0f\xb2\xd4\xa9\xc8\xc2\xcd\xa1\x17\x52\xa4\xd2\x84\xd3\xb1\xcd\xb4\xa3\xf8\xae\xd1\x36\xc4\xc6\x92\x84\xdf\x97\xe4\x76\xff\x99\xd6\x6e\x73\x9c\xaa\xad\x35\xce\xc6\x8a\xa3\x58\xb6\x45\xa7\x31\x91\x5d\x44\x2f\xde\x9b\x9e\x20\xaf\xc7\xc3\xc5\x7b\x25\x6a\x96\xab\x0f\xd0\x89\x4b\x1a\xc2\xd5\xc6\x50\x91\xe3\x3d\xf2\x27\x3f\xa9\x9c\xf3\x12\xcd\xc6\x32\x3c\x45\x5f\x1b\x0e\x12\xdc\xe0\x28\x1d\x65\x6e\xa4\xd7\x83\x4e\x4c\x32\x82\x06\x60\xb4\x69\x01\xbc\xd0\x5e\x36\x16\xeb\x8a\xf5\x4e\xf8\xe3\xb5\xd0\x43\xbb\x52\xe1\xdd\x80\x35\xb9\x95\xd9\x0c\x26\xe0\x16\xb8\x97\x6c\x0d\x71\x37\xf0\x1d\x58\xae\x26\xd4\x91\x9d\x7f\x54\x6d\x1d\x6f\xf6\xbb\x25\x1e\x91\x65\x4c\x6d\xab\xe7\x23\x65\x5d\xa7\x7b\x97\x27\xd4\xeb\x79\xe5\x5b\x93\xdf\xb4\x63\x5b\xd3\xf8\x7e\xb6\xaa\x0f\x34\xd4\x4e\x8b\xf5\x56\x3b\x86\x9a\xfa\x08\x6d\x19\x93\xcb\x5f\xef\x36\x8c\xd6\xf7\x30\x58\x0c\xd4\x65\xdb\xd3\xf4\xa8\xee\x53\x62\xfc\x43\x9f\x18\xa7\x05\xe5\xa6\xed\xc0\xaf\x8a\xe8\x74\x3e\x48\x32\x95\xbc\x9c\x84\x04\x27\x0f\xf1\x4b\x38\xa5\x7f\x8d\x50\x4e\xe5\xc5\xca\x71\x77\xfa\x58\x76\x3f\xc2\x2f\xac\x93\x66\xda\x2c\xb9\x87\xa5\x40\xb0\xec\xc2\x61\x61\x38\x8d\xa2\x68\x3c\xc4\x4e\xad\x98\x98\x62\x08\xda\x0e\x3b\x48\xba\x27\x33\xe9\xe4\x91\x8f\xbe\xb1\xeb\x40\xa5\x55\x9c\xce\x61\x12\xbe\x41\xe3\xe6\xc3\x65\xff\xae\x8c\x8d\x19\x43\x50\xcf\xa4\x94\xf4\x06\xaf\xa4\xb9\x56\x9e\x4b\xeb\xdd\xaf\xe5\xb4\xcf\xa0\xe4\xa7\xee\x10\xf2\xb7\x4b\x39\x49\x6b\x3d\x33\x98\x80\xb0\xeb\x3c\x81\x0e\x9d\x6b\x8c\x18\x7d\x9f\x18\x33\xaa\xc7\xea\xc2\x64\xcb\x1f\xa2\x6c\x30\x79\x41\xd5\xdf\x70\x08\x0f\x90\xa4\x8a\x5b\x35\x04\x8f\xc5\x30\x4e\x2e\xef\x6e\x41\x54\x5c\x0c\x00\x02\x00\x71\x21\x94\xdb\xf6\x5f\x1a\x6b\x42\xbe\x13\x0a\x2f\x93\x1e\x39\x61\xe6\xd2\xe1\x7c\x3f\x3c\x79\xfc\xe8\x7e\x46\xf9\xf5\x6e\x94\x64\xda\x4a\xeb\x3a\x21\x8d\x1b\x76\xdf\x8f\x8c\x5c\xea\x73\x89\xfb\xf4\xaa\x64\x48\x53\x56\x76\xb3\xa4\xe2\x00\x0f\x56\x18\xfa\xef\x53\x68\x1d\xa2\x83\x67\x4a\x82\x38\x81\x5d\x34\x3d\xd0\x66\xe9\xe9\x6a\xf7\xa7\xe5\x9c\x40\x2e\x2f\xe0\x81\xff\xda\xc1\x76\x42\x7b\x0d\x27\xbc\x60\xf7\xe1\xc9\xd9\x67\x32\x71\x11\xca\xc2\xfd\xdc\x19\x25\x6d\xa7\xc4\xd9\xe5\x39\x96\x52\x87\x11\x8b\x84\xc7\x22\x17\x73\x22\x62\x53\xf0\xde\x2a\x3c\xc3\x21\x1c\x4b\x07\x16\xf1\x30\xe3\xe8\x63\x74\x8c\x1a\x92\xf2\x80\x61\x1f\x6e\x75\xb9\x27\x67\x58\x93\x85\xc8\xe7\xd2\x72\x6f\x4e\xc9\x4e\xbc\x24\xad\x90\xb9\x1d\x8a\x9f\x46\x90\xaf\x96\x67\x18\x7c\x7a\x2e\x03\xab\x55\xa3\xb5\x8b\x28\x68\x38\x96\x19\x1d\x7e\x74\xc2\x88\x07\xea\xde\x88\x9c\x7c\xe5\xbc\xcf\x01\x13\x74\x2c\x54\x3e\x67\x7c\xc4\xb8\xab\x3e\x2d\xf0\x70\x58\x1d\xb5\xad\x8a\xb4\xa2\xfc\x28\x4f\x0c\x71\x01\x26\xd0\xd9\x90\x6f\x4e\x69\x7a\xd5\xce\x53\x7c\x58\x4f\xb1\x0b\xaf\x5f\xc3\x2d\x1c\xe1\x3a\x16\x30\xfc\xbb\x70\xbb\xc1\x7f\xaf\x25\xab\x7c\xff\xc1\xd3\xa3\x56\xcc\x83\xab\x6a\xdf\xaa\x0a\x76\x6e\x7a\xef\x6d\xdb\xa6\x27\xbf\xed\xc4\x06\xb5\x0d\x40\xb3\x75\x8d\x58\xd5\x01\xc2\xdd\x06\xc0\x5b\xfb\x63\x44\xf9\xde\x9d\xee\xdd\x1d\x0e\xdf\x4f\x71\xf9\x76\x8b\x1a\x1a\x45\x98\xc0\xcd\x9b\x9d\x70\x6f\xb9\x1e\x90\x8f\xd7\xbd\xdb\xd0\x26\x0f\xa5\xab\xfd\x67\x38\x5b\xc3\xd1\xbd\x80\x1d\x01\x3d\x9f\x67\xb8\x87\x77\xe5\x0d\x18\x96\xb2\x1c\x1c\x14\x31\x4c\x63\xa1\xe4\xab\x42\xe4\xa9\x44\x7b\xe6\x0c\x8a\x0b\x83\xd4\xc2\xed\x09\xf4\x56\x61\xd2\x70\xe2\x67\x2a\x4f\x3b\x21\xbf\x08\x4b\x40\xb4\x8d\x40\x1e\xdb\x86\x1b\x51\xc3\x91\x14\x77\xc2\xa8\x74\x24\x18\x90\x98\x03\x92\x95\x42\xc5\x3c\xb6\xfd\x2c\x22\x1b\xb9\x71\x0e\x6c\x39\x31\x8b\xee\x46\x58\x7a\x84\xd8\x30\xc8\xb0\x65\xda\x74\xab\xda\x6c\x27\x81\x7d\x26\x67\x46\xda\xc5\x69\x29\x08\xac\xec\x36\xb6\xc0\xef\x21\x26\xa5\x8a\xe2\x1d\xcb\x6e\x4b\x4d\x5f\x1f\xaa\xdc\x72\x5b\x1b\x3d\x29\x64\x8e\x71\xeb\x61\xa6\xae\xd5\x45\xa2\x50\x5e\x2f\xfa\xde\x9d\x4b\x38\x13\x56\x9e\x3e\x7b\x34\x82\x70\x28\x0a\x15\x12\x5a\xdf\xdd\x48\x5b\xe8\xdc\xca\x8a\x6e\x51\x28\xdc\xb9\x63\xa4\xf5\xf9\xa7\xd3\x4e\x38\x5c\x95\x54\xab\x19\x74\x6e\xe0\xfb\x23\x7b\xdf\x18\x8d\x9e\x16\x03\x77\xbb\x15\x1b\x74\x26\xa3\x4c\xcf\xab\x57\x11\xda\x2f\x8e\x70\x6b\xfc\x4f\xb5\xe5\x01\x6a\xf4\x38\x67\x2e\x6a\x08\xff\x58\x2f\x72\xa6\xb1\xa9\x05\x28\xd9\x74\x48\xc7\x73\x2b\xe3\xcf\x85\x7a\xbd\xb8\x75\x6e\x57\xc5\x42\x3b\x72\x4f\x04\x4f\x6e\x39\xa7\x96\x28\x77\x88\x2f\xb4\x58\xb9\x05\xb7\xd1\xf1\x5e\x38\x82\x3b\x3f\xba\x75\x8b\x1a\x90\xf8\xc3\xb2\xd1\xb7\x59\xa9\xeb\x0c\x52\x9d\xda\xba\xff\xa4\x81\x1d\x41\xeb\xe4\x35\xbe\x7f\x2c\x9d\x80\x66\x5b\x95\x94\xc2\x15\xa9\xf0\xa5\x6c\x1d\x1f\x6e\x13\x57\x92\x5c\xa7\xaf\x00\xc2\xa7\xab\xb3\x4c\x25\x9c\x5f\xc2\xee\x83\x90\xde\x5c\x35\xf3\x54\x7b\x7b\x40\xe8\x28\xbf\x4e\x9f\xea\xc4\xeb\xb5\x19\xf6\x2a\x01\xfb\x7d\xb2\xe6\xed\xec\xb9\xae\x32\xb6\x75\xce\xf6\xbd\xe8\x36\x74\x8c\x4c\xf4\x72\x89\xc2\x9e\x76\x1b\x23\xc4\x67\x52\x18\x69\x06\x9f\x5d\xb8\x18\x5e\xc3\x07\xf4\x0d\x9c\x7e\x29\x73\xf8\xe3\x8f\x4f\xb6\x49\x8a\x13\xad\x5f\x2a\x59\x02\x1c\xf2\x37\xae\x7c\xd8\x0d\x30\x88\x1b\x0d\xc0\x4c\x83\x4e\xae\x01\x49\xed\x6e\x02\x94\x12\xf7\x8c\xab\x28\xf8\x54\x72\x9d\x8b\xa5\x4a\xf8\x38\xc0\x06\x01\xa5\x25\x9e\x53\x52\xe3\x53\x4a\xc8\x35\x0e\xc9\xed\x08\x39\x5d\x05\xed\x9b\x4c\xa5\x03\x81\x8d\x26\x0e\xe0\x76\x69\xe5\xcd\x35\x78\xf3\x72\xbc\x69\x85\x98\x15\xbc\xdd\x86\xcf\x55\xfa\xe9\xb0\xc5\x95\xf2\xcd\xed\xf7\xee\xc4\x65\xd3\xce\x03\x8e\x8a\xab\xc3\xe7\x89\x70\x72\xae\xcd\xfa\xd3\x26\x3e\x7c\x93\xcb\x0b\x3b\xfc\xc1\x0f\x7f\x54\x89\x41\x03\x55\x09\xe4\x11\x72\x8e\x1e\x79\xf2\x4c\x5e\x18\x45\x15\x3f\x9d\x58\x14\x45\xb4\x16\x7a\x2b\x95\x5c\xd0\xda\xd5\xfb\xc5\x10\x0c\xee\xc0\xe7\x7e\x4f\x5c\x42\xf8\x4f\x3f\xf9\x64\xc8\x35\x12\x9f\x7c\x32\xec\x44\xbd\xee\xcd\x90\x54\x1f\xd7\x54\xdc\xbc\x1d\xf2\xce\x6b\xf4\xa6\xa9\x63\xe7\xe7\xf8\xed\xd3\x77\x3d\x44\xcd\xab\x08\xfd\x86\x2d\xb0\x1a\xf7\xcd\xdb\xbe\x07\x75\x68\xe7\x89\x59\x9a\xe8\x48\x3b\x17\x7c\x9a\xa8\x7e\xe1\x35\xd8\xde\x1e\x7c\xa8\x2f\xe0\xc8\xc1\xc7\xda\xbc\xb4\xd0\xe1\x63\xfd\xa7\xaa\x90\x99\xca\x65\x97\x6b\x8b\xe8\x00\x5d\x59\xe8\xf5\xec\x56\x85\x8d\x4c\x7b\xbd\x08\x4e\x16\xd2\x1f\xfa\xfb\xd4\xf3\x88\xaa\x82\x8e\x13\x91\xb3\x23\x4d\x95\x02\xb1\x1d\xd1\x89\x7d\x5c\x9a\x4f\x0b\x22\x4f\x21\xde\x1f\x8d\xd0\x31\xdc\x8f\x61\x08\xf1\x8b\x17\xcb\x4e\x88\x5f\xc3\x6e\x0c\x4b\x61\x5e\x4a\x43\xe5\x41\xfe\x34\xdf\x02\xbe\xeb\x83\xb0\x56\xcd\x73\x0b\x54\xbc\x31\x97\xb9\x34\xc2\xc9\x14\x5e\xca\xb5\x85\x4c\xbd\x94\x10\xd3\x50\x2f\x5e\x8c\xa9\xc2\x68\xfa\xe2\x76\xdc\xdf\x6a\x7b\x2f\xee\x43\x14\x45\xc1\x9d\x08\x1e\x69\xfd\xd2\xc2\xaa\x00\x29\x92\x05\x48\x1e\x4c\xa6\x34\x1a\x6e\x30\xb7\x90\xe5\xd1\xd1\x4c\x65\x72\xdf\x42\xbc\x94\xd6\x8a\xb9\xb4\x23\xa4\xb3\x00\xa7\x01\x3d\x0d\x2e\x4a\xe0\xd2\x01\x1b\xfc\x20\x82\x8f\x51\x42\x2c\xf9\x15\x2a\x93\x69\x13\x8b\x45\xa0\x98\x85\x6a\x18\x95\x45\x34\x63\xfe\x30\x1d\x7a\x32\xa3\xf5\x32\x8b\x7d\xa2\x1f\xe7\xc7\xe3\x05\x3f\x8c\xe0\xc0\x95\xf9\x53\x70\x6a\x29\xfb\x60\xa4\x48\x2d\xd1\x1a\x97\x47\x5f\xac\xad\xfa\x90\xe9\xf2\xd5\x06\x25\x7d\x5a\x04\x23\x8b\x4c\x24\x92\xd9\x8b\xa6\xed\x64\x1b\x09\x2c\x57\xec\x67\x40\xa6\x2f\xa4\x49\x84\x95\x7c\x98\x62\x47\x10\xff\x62\x31\x48\x72\xe4\xb1\xcc\x07\x2b\x8b\x1f\x3e\x13\x71\x1f\xa4\x4b\xa2\x5e\x8f\x24\xed\xa4\x66\x0c\x3c\xf6\x0b\x1b\x9c\x2c\x8c\x94\x70\x21\xd6\xc4\x0b\x5c\xef\x8a\x81\x94\xd9\xf5\xd9\xaa\xcd\xf4\xea\xed\x08\xbc\x30\x35\x12\xac\x9d\xa5\xa6\x50\x60\xb9\xd4\x79\x17\xbe\xfc\xfc\x0b\xaa\x89\xe2\x49\x7b\x89\xdb\xe7\x09\x96\x68\x39\x93\x60\x0b\x91\x97\xe8\xa6\x1f\xca\x2c\xd3\xb8\x1d\xb2\x74\x3c\xc4\x37\xd3\x60\x5c\x54\x6f\x4f\x30\xc6\x92\xb9\x53\x86\x4f\x65\xe7\x46\x14\x0b\xb8\x50\x59\x06\x67\xb2\xa2\x5c\xa6\x11\xe7\x6e\xab\x1c\x05\x43\x6f\x9e\x78\xf3\x5c\xde\x8b\xe0\x28\xc7\xed\xd6\x14\x1d\x92\xb9\xb2\x3e\x45\x56\x25\x1c\xb6\xa6\x78\x7a\x79\x09\xfb\xa3\xd1\xc7\x32\x4b\xf4\x52\xee\x53\x66\x95\xe9\x65\xb4\x77\x10\x6d\x55\x6b\x58\x55\xaa\x21\x5b\x70\x09\x71\x9f\x75\x41\x1b\x38\xe9\x74\xeb\xb3\xb6\x5d\x2e\x9d\x97\x73\x98\x10\x4c\xe8\x07\xa4\x58\xa5\x8e\x39\x32\x71\x26\x33\x98\xc0\x49\x27\x3c\xf6\x65\x4b\x61\xe9\x42\x6d\x27\xf2\x2b\x45\x90\x88\x02\x8d\x14\xaf\x51\xaf\xe7\x8c\x5a\x2e\xcb\x5d\xe7\xd7\xa8\xd7\x03\x3d\x6b\xae\x21\xc6\xb8\xbc\x1d\xf5\xcb\x55\x81\x5b\x3e\x0a\xa6\xa4\x82\x5e\xca\x35\xf2\xad\xb5\x33\x51\x64\x97\x14\xc5\xf6\x7a\xf2\x95\x48\x5c\xb6\xee\xf5\xa0\x83\xc2\x3b\xb0\x32\xb7\xca\xa9\x73\xd9\x87\x8b\x05\xee\xd2\x42\x24\x72\xe0\x89\xe8\x46\xbe\xfc\x83\xb6\xeb\x03\x95\xc9\x66\x26\xfc\x51\x73\x17\x67\xea\x5c\xc2\x8a\x22\x00\x24\xac\x5a\x37\x0c\x86\x51\xa3\x95\x3b\x3b\x86\xb4\xac\x08\xec\x83\x36\x73\x91\xab\x5f\xc8\x14\xa3\x24\xee\xc1\x52\x1e\xd4\x00\x8d\x22\x3b\xda\x56\xd8\xf0\xab\x56\xe1\xd8\x8b\x17\xfe\xf0\x7c\x5d\x95\x06\xc2\x1e\x1c\x2f\x84\x91\x6d\x55\x04\x1d\x4e\x10\xf7\x81\xd3\xbc\xbc\x35\xbb\x5b\x08\xa9\x5e\xa5\x89\xad\x2a\x61\x1b\xd8\x42\x26\x6a\xa6\x92\x11\x0c\xa9\x57\x05\x5b\x56\xa0\x59\xb7\xce\xe4\x7c\xa5\x52\x59\x23\xd8\x86\xad\x7b\x35\xa6\x47\xea\xe3\xcd\xd3\xbb\x9e\xd4\xb7\x10\xd2\x1e\xc6\x5d\x0c\xb7\xfa\xa3\x11\xa8\xbf\x7d\x26\x36\xeb\x13\xf1\xbd\x4f\x11\x1f\x3e\x3b\x3a\x39\x3a\x3c\x78\x04\x66\x95\x49\x3b\x42\xdd\xd6\xac\x72\x25\x0f\x0c\x1e\x9f\x1e\x9f\xa0\x42\xe8\xf5\x2a\x4d\x49\x72\xbf\x53\x49\xa2\x2b\xe8\xe8\xdd\xe1\x47\x71\x37\x18\x70\xac\xd1\x30\x13\x5c\x75\x36\xf1\xe7\xa4\x68\x13\x46\xfc\x0f\xe2\x06\x33\x63\xf8\xf2\xcf\x7e\x03\x71\x7b\xea\x71\x30\x40\x01\xac\x99\x48\x87\x67\x4b\x69\xe6\x92\x0a\x56\x35\xc8\xea\xf0\x6b\xdf\x96\x83\x0a\xe7\xad\x39\x5a\x95\xa0\x79\xa6\xf2\x26\x89\xa2\xf3\xcb\x98\x4e\x28\xfc\x59\x44\xdc\x05\x61\x64\x6b\x38\xde\xe7\x85\xa0\x5a\x0c\x1e\xb5\xd7\x2b\xc7\x4d\x57\x06\xfd\x2f\x1a\x1b\xb9\xaa\xe9\x98\xaf\x58\xb9\xb6\xd1\x54\x39\x39\x20\x75\x9a\xa1\xdc\x55\x4a\x5a\xe8\xc8\x68\x1e\xc1\x2f\x7f\x19\x33\x0d\xc3\xc6\xee\xfb\xe5\x2f\xd9\x2a\x90\x4f\x33\xcf\x35\xeb\x1d\x6d\xe5\xd6\x46\x7f\xa0\xcd\x52\x90\x19\x6c\xec\x5e\x16\xd1\x16\x33\x7b\x3d\x42\x68\x79\xbb\x89\xc4\x68\x6b\x81\x4e\xe0\x49\xfd\xd0\x76\x5e\x8b\x65\x16\x30\x85\x54\x18\x9f\x39\x13\x20\x5f\x7f\xa1\x73\x0c\x37\xdf\xbd\xf5\x47\xa3\x5b\xb7\xc2\xa0\xd2\x59\x01\xc0\x87\x1a\x23\xd1\xef\xfe\xe3\xbf\xf9\xee\xef\xfe\x6b\x00\xf0\x40\x0a\x52\x92\x23\xf8\xf6\xd7\xff\xe3\x9b\xcf\xff\x01\x3d\xd1\x87\xd2\xc1\xb1\x13\xc6\x49\x8c\xbc\xbe\xfe\x5f\x9f\x7f\xfd\x0f\xff\xf2\xab\xff\xfd\x7f\xbf\xfd\xe2\x1f\x4b\x41\xdd\xa2\x7c\x43\x32\x3c\xed\x45\x6b\x77\xd6\x14\x37\xe9\x09\x4f\x28\x79\x83\x3a\x76\x89\xce\xee\xd7\x7f\xfe\x2f\xbe\xf9\x8b\xbf\xff\xea\xbf\xff\xcf\xef\xfe\xfe\xdf\xe1\xeb\x53\x8c\x7d\xb8\xaa\x1c\x0d\x9b\xed\x43\xa6\xf2\x97\x96\x3d\x8b\xba\x2c\xba\xd2\xe0\x36\x0a\x47\xf0\xed\x17\xff\xf8\xd5\x6f\xff\xf2\x9b\x7f\xf5\xeb\xef\x7e\xf3\x9f\x7f\xf7\xf9\x3f\xfb\xee\xaf\xff\xcf\x37\x7f\xf9\x1f\xbe\xfd\x4f\xbf\xfe\xea\xb7\xff\xfe\xab\xdf\xfe\xe6\xeb\x3f\xfd\xe7\xdf\xfe\x97\xbf\xfd\xdd\xe7\xbf\xda\x31\x1d\x56\x85\xbb\x16\xc2\xc7\xaf\xa5\xb8\x74\xd0\x20\x4c\xd8\x47\xe9\x5e\x33\x37\xe6\x35\x3e\x5b\x9c\x2e\x3f\x6d\xf3\xba\xf1\xad\x8c\x70\xf7\xbc\xc0\xc0\x3d\xe9\x84\xca\x28\xd4\x7d\xa0\x64\x96\x52\xb8\x67\x0a\x6d\x25\xbc\xa6\xf3\x20\x85\x72\x52\x05\x55\x75\xbc\xd4\x88\x9c\x38\xba\x69\x98\xb0\xd7\xf0\x58\x14\x68\x03\xb5\x51\x73\x95\x8b\x8c\xcd\x23\xee\xf6\xda\xe1\xa0\xb6\x08\x7e\x42\x13\x26\x3b\xc7\xbd\x28\xf7\xb8\xe5\x78\xc3\x6b\xf8\x99\xb4\x3c\x52\x2d\x9a\x38\xd4\x09\x02\x35\xa4\x35\xce\x9c\x89\xe9\xcc\xdb\xb8\x0c\x3b\x7c\xa4\x19\xac\x12\x61\x82\xf2\x5f\x40\xcf\x66\x96\x52\x72\xb4\x91\xeb\xde\xde\x6f\x7d\x0d\x07\x6d\x7f\xfd\x6c\x0d\x71\xab\x9a\x37\xe6\x75\xe4\x9d\x2f\x53\x85\xc6\x3b\x5f\x89\x2c\x5b\x37\xb0\xb1\x7b\xf2\xa2\xc5\xa3\x93\xa6\x66\xa2\x68\x83\x3c\x1c\x8a\x29\x4e\xf0\x3f\x97\xbe\xa0\x7b\x10\x39\x1b\x57\xfe\x90\xc7\x4a\x4e\x4a\x93\xeb\x28\x3a\xe4\x37\xd0\x1d\x82\x51\xe5\x5f\x90\x43\x81\xbe\x1e\x3a\x24\xcc\xe7\x1d\x4e\x0b\xf3\x1d\xfb\x60\xf4\x83\xfe\xc9\x03\xaa\x1b\x78\x8b\xab\x19\xf7\x09\x86\xfc\x18\x0b\x71\xa3\x43\x1c\xb1\xa0\x3d\x56\xaf\x64\xca\x21\x55\x99\x48\x47\x86\x9d\x5a\x09\xc7\x12\x3d\x52\x27\xc1\x9f\x58\xd8\x20\xb8\xd6\xd1\x9a\xad\xb2\x0c\x54\x9e\x4b\x83\xa8\xb6\x5c\xac\x08\x8e\x66\x20\xf2\x4a\x5c\x70\x56\x42\xe5\x96\x33\xa6\x3c\xbc\x13\x73\x1b\x74\x38\xd6\x1a\x5b\x67\x74\x3e\x47\xfa\xe3\xb1\xe0\x7f\x89\x4e\xe5\x34\xee\xf2\x8c\xbc\xcb\x5c\x8d\x08\x67\x12\x9d\x48\x5b\x4e\x97\x1c\xb0\x64\x81\xb3\x9e\x19\x31\x47\x1d\x2c\xf2\x34\xd0\x33\x27\x73\x98\xe1\x9e\xe2\xf0\xc0\x25\x8b\x08\x7a\xbd\x83\x8c\x22\x06\x5b\x64\x28\x20\xc4\x92\x92\xf1\x64\x65\x6c\xc9\x8a\x56\x2c\x51\x69\x1f\x34\xda\xbd\xde\xc7\x48\xb2\x57\x1c\x35\xa3\x74\x0e\x02\xbc\x7d\x72\x0b\xb1\x35\x77\x9c\xf6\x68\xb3\x1c\x98\xd7\xb3\xe4\xc2\x53\xa3\x96\xc2\xac\xc7\x43\xff\x9d\x46\x78\x2c\x54\xce\x16\x5c\xf0\xa1\x71\xe7\xf0\xe4\xa0\xcb\x35\xbf\xe4\xaf\xe3\xa2\x7b\xae\x8c\x20\xfc\x03\x70\x85\x1c\x1b\x50\xd5\x1f\x86\x29\x14\x95\xe0\x36\x62\xf7\x77\x3b\x88\xa5\xfe\xcd\xe8\x86\x4e\x71\xa1\xaa\xf2\xdd\x0b\xa7\x0b\x69\xe4\x78\x28\xa6\xc8\x7d\x64\x84\xca\x57\xd2\xc7\x36\xdb\x34\xb7\xc1\x3f\x09\xf7\x3e\xb9\x06\x41\xc8\xc1\x99\xce\xf7\x4b\xdf\xbc\x0a\x40\x7a\xbd\x43\x6d\x50\xfb\x94\xe6\x69\xe5\x5a\x8b\x93\xad\x71\x85\x32\x29\x66\x75\x12\xc1\xaf\x10\x6a\x9c\x62\x65\x24\x6d\xc4\xf6\x12\xbd\x79\x69\xda\xbb\xf2\xba\x85\xa2\x0d\xda\x5e\xaf\x11\x84\xd7\x2d\xc5\x97\x7f\xf3\xd7\x25\x7b\xa7\x6d\xfc\xfe\xa8\x9c\xd0\x35\x79\x5d\x75\xa8\x58\xd6\x86\x6b\xaf\x80\xa7\xa6\xb1\x10\xd5\x0a\x84\x7d\x08\x11\x07\xfe\xdf\xe0\xba\x27\xca\x73\xfa\xd9\x2a\x93\xbc\xf1\x57\xcb\x33\xd4\x71\x6a\xf7\xa6\x17\xf9\x7a\x73\xe3\xf7\x4b\x15\xbd\xb9\x3e\xa0\x5c\x14\x1c\xe5\xd6\x49\x91\xf6\x29\xfe\xe6\x8c\x4a\x6b\x23\x92\xa6\xb4\x72\xbe\xe4\x0d\x0b\xca\x59\xd0\x17\xf9\xa6\x7e\x24\xbb\xd3\x1a\x20\xd0\x2c\xc4\x4c\x4d\x49\x28\x9b\xab\x6c\x1d\xc1\x47\x3a\x1f\xec\x4a\x1f\x40\xe7\xbc\xac\xec\x26\x07\xbd\x0f\x87\xc7\xc7\x7c\x0e\xe3\x1b\x02\x54\x57\x9c\xf6\xb5\x5d\xb0\x0e\xd5\x8b\x5e\x39\x72\x34\xb7\xf3\x56\x5e\x19\xff\xec\xe0\xf1\x23\xf8\x13\xba\x8c\xf1\xd3\x95\xe6\x6c\x2d\xb5\x71\x56\xa4\xa5\x3f\x20\xd1\x19\x39\xcd\xf1\x28\xee\x56\x01\xc2\xcf\x57\xda\xc9\xb4\x0f\xda\x2d\xa4\xb9\x50\x96\xed\x0a\xe1\x28\x84\xb1\x18\x50\x1a\x29\x9c\x0d\x38\x71\x93\x71\x51\x9e\x80\x9c\xef\x8d\x2c\x45\x41\xf7\x2a\x53\x49\x85\x86\xd2\x90\xc7\xd5\x50\xb8\xb4\xcd\x2b\xfd\x49\x28\xa3\x86\xee\xbb\xce\xdf\xfb\x90\x7c\x67\x38\x13\xe8\xdc\x67\x9a\x2f\x42\x16\x22\x97\x19\xb9\x6e\xdf\xfd\xdd\x7f\xfb\xe6\x6f\xff\xf5\xef\x3e\xff\xd5\x77\x7f\xfa\x17\x5f\xff\xd5\x9f\x53\x2a\x20\x35\xba\x18\x70\x99\xef\x08\xce\xb2\x95\x01\x76\x47\xd1\x85\xc3\x28\xf0\xcb\x3f\xfb\xab\xd6\xbc\xa4\x31\xda\x8c\x20\x2c\xa7\xe0\x59\x86\xf1\x02\x86\x43\x22\xc3\xc8\x29\x05\x12\xe4\x2d\xd5\xf0\x07\xd2\x1d\xfe\x9e\x84\x87\x15\xe5\x7c\xe3\x46\xd9\x6a\xc1\x78\x2d\x7c\x24\xa2\x2c\x58\x31\x93\x25\x99\xde\x3a\x51\xd7\x5d\xa2\x40\xa1\xe0\x08\x8d\xe4\x1e\x3e\x2e\xf1\x71\x85\x8f\xe7\xf8\xf8\x14\x1f\x7d\x7c\xbc\x83\x8f\x1e\x3e\xde\xc7\xc7\x6b\x7c\x0c\xc8\xb6\xe2\x83\xac\xec\x04\x1f\x37\xf0\xf1\x4f\xf0\xf1\x63\x7c\xc4\x10\x43\xcc\xfe\xc2\x5b\x2f\x79\xbd\xe9\x06\x55\x1d\xfd\x97\x37\xa9\xfc\x25\x2a\x78\x07\x4a\x0f\xae\x34\x27\x36\x11\xb3\x99\xce\x52\xfb\x36\xcc\x83\x8c\x43\xfd\xfe\x67\x02\x31\x3f\x41\x85\x5e\x46\x1f\x1e\x99\xfd\x5e\x57\xd0\x6a\xea\x78\x8e\x1d\x9f\xd6\xb4\xed\x18\x95\xdc\x01\x9f\x61\xed\xfa\x1c\xd7\x86\xc3\x69\x29\x4b\x5d\x45\x6d\xfd\x32\xfb\x6b\x1b\x1b\x7f\x58\xb9\x93\x3e\xfd\x9c\xa7\x70\xc1\x89\xdd\x6a\xea\xe0\x74\xd0\x88\x52\xde\x90\xc6\x95\x54\x5a\xdf\xf4\x36\x25\xd7\x81\x90\xe3\xba\xd6\x2b\x4e\x26\x93\x8b\x16\xb5\x0e\x80\xe2\x31\xdd\x74\xcc\x04\x3a\x5b\x7c\x0e\xe4\x7c\xee\x9d\xee\x18\xd4\x57\x1e\x2a\x85\x47\xee\x10\xdd\x9c\xa8\xef\x8a\x22\xfc\x8a\x6e\x25\x32\x5e\xf4\xaf\x9b\x16\xb3\x1a\x84\x0a\xa4\xea\xbb\x11\x61\xa3\x3e\x94\x0e\x81\x07\xc7\x28\xff\x3e\x74\x3e\xbe\x50\xec\x2f\x07\xc1\xb1\x1f\x71\x33\x83\xdc\xa9\xf2\x21\x37\xba\x3e\xef\x9c\x69\xe1\xab\x67\x3f\x13\xe7\xc2\x67\x1e\xab\x2b\xaf\x1e\x6e\x02\x21\x63\x9a\x90\xf4\xdc\x2d\x84\x5b\x4c\x86\x77\x97\xe2\xd5\x40\xcc\xe5\xe4\xce\xed\x1f\xde\xf9\xd1\xad\x5b\xb7\xc2\xbb\xc1\x85\xca\x53\x7d\x41\xc9\x74\x94\x80\x88\x07\xa8\x6a\xfc\x30\xf6\xbf\x36\x4b\x8e\xf6\x8b\xac\x55\x95\x55\xd7\x90\x4a\x27\xcd\x52\xe5\xd2\x7b\xa8\xbb\xf2\xf8\xd8\x6f\x45\x9a\xd5\x9f\xb6\x1c\xcc\xa9\x70\xf6\xf4\x28\x08\x8e\x51\xb8\x45\xe6\xaf\x7e\xfa\xb3\x63\x5a\xe7\x83\x23\xdf\x4f\x14\x85\x8d\xe0\x11\x25\xe8\x39\x5e\x1b\x0a\x7c\x51\x5d\x0d\x1e\xc6\x7c\x50\x32\x14\xd6\x2a\xeb\x44\xee\xec\x70\x8c\x76\x6b\x3a\xe4\xeb\xb4\x7e\xb7\xf3\x6d\xa1\xc7\xac\x51\x39\x08\xcd\x24\x3c\x15\x6e\xb1\xeb\x6c\x6f\xeb\xac\xaf\x3c\x9a\xdc\x3a\x21\x7c\xd3\x31\xe0\xf7\x3d\x1b\xdc\x38\x07\xdc\x98\x20\x4f\x23\xd3\x73\x95\xf3\x93\x8b\x8b\xab\x13\x3d\xea\xee\x3b\xc4\xb0\x71\x10\xd8\xe0\x4a\x2a\x97\xda\x23\xa3\xec\x20\x3f\x6b\x64\x0d\x5c\xd4\x95\x5e\x97\x37\xa7\x2a\x85\x79\xdd\x65\x58\x82\xdc\xb8\xae\xca\x6d\xd5\xae\x38\x3d\xa2\xa3\xb6\xb9\xa9\xef\x8e\xb6\xaf\x3e\x3c\x93\x89\xe4\x3b\xf5\x79\x1d\xa0\x1f\x9e\x1e\x95\x82\x2b\xd2\x94\xca\xd7\x1e\x29\xeb\x50\xc9\x76\x42\xaf\x26\xc2\x3e\x74\x64\x55\xf3\xa1\x66\xd0\xe1\xea\x86\x08\xf1\xc3\x64\x32\x81\xd0\x4a\xb7\x2a\xc2\xae\x3f\x9d\xe4\xc4\xfc\x25\xdf\x99\xea\x97\xf2\x7a\x05\x13\xf0\x80\x1e\xf1\x5d\xea\x5d\xed\xb8\xf2\x83\x8f\x22\x23\x2b\x5d\x75\x25\xb0\x43\x25\x09\x03\xc2\x18\xf6\x19\x33\x57\x6e\x05\x57\xdd\xb2\xdc\x2c\x4f\xbd\x2f\x4c\x3e\x07\x4e\xad\x2c\x53\xcb\xd3\x03\x76\x92\x27\xd0\xf1\x3f\x21\xe1\xcb\x5e\xfd\xe5\x92\xf7\xe9\xf6\x40\x35\x49\xcf\x12\x8e\xc6\xa2\x42\x5b\xf7\x98\x49\xee\x04\x7c\x0c\x8a\x53\x1f\x41\xc8\xc3\x85\xfd\xf2\xa8\x62\xe4\xab\x39\x2a\xbc\x70\x55\x1e\x9e\x6e\xaa\x07\xce\xa9\x04\x00\x55\x71\x61\x49\x64\x27\xcc\xb5\x53\xb3\x75\x64\x57\x74\x3c\x4e\x35\x22\xd5\x00\xe1\x3d\x9d\xcb\x1b\x5c\x27\xd2\x82\x11\xe7\x6a\x2e\x9c\xa4\xde\x3e\x57\x1b\xb6\x44\x2e\xa5\x1c\x11\x72\x4f\xb9\x8c\x30\x71\xd2\x68\xbb\xe6\xe4\xa7\x2b\x8c\xa7\x9e\xc9\x99\x34\x32\x4f\x64\x59\xa5\xb5\xd4\x39\xee\x69\x27\x4d\x4e\x45\xd7\x4f\x8d\x76\x92\x0e\x2b\x29\x0e\x21\x0b\x73\xf0\xf4\xa8\x55\x8c\x32\x1c\xd2\x4b\x5f\xa8\x12\x5c\x6e\x17\xa0\x54\x95\x20\xd7\x55\x81\x20\x0f\x4b\x0f\x07\x85\xd3\xff\x6e\x02\x95\x77\x6e\x5f\x02\xf8\x5e\x57\x64\xcb\x2b\xb1\xcd\x5b\xb0\x00\xd7\x57\xf6\xbe\xa1\xaa\x77\xfa\xff\xfe\x6d\xa3\xfc\xf8\xcd\xe5\x54\x8c\xac\x51\x35\xfa\xd6\x22\xda\xef\x53\xdb\xea\xab\x6b\x7d\x81\xeb\x5b\x8b\x5b\x53\x75\xbe\x55\xda\xea\xb9\xfb\x80\x2a\xa3\x57\x67\x4b\x45\x67\x7e\x6d\xe6\x6e\x97\x4d\x97\x05\xd3\xc8\x3a\xae\xbb\xe6\x72\x7e\xba\x76\x1e\xd2\x1e\xa9\xbe\x98\x32\x07\x39\x9c\x36\x38\xcd\x5d\xac\xc7\xb3\x75\x2f\xd7\x57\x61\x5f\xc7\xce\xad\x22\xdc\xad\x02\xdc\xef\x51\x7c\xfb\xe6\xc2\xdb\xeb\x2a\x6a\x05\xdd\x8c\xdb\x51\x4f\xbb\x5d\x98\xbb\x51\x59\x4b\x96\xb1\xb1\xb5\xbc\xad\xdc\x61\x12\x39\x7d\xbb\xd3\x60\xee\xb6\x8a\x6f\xae\x53\x62\x9b\xd5\xf8\xd9\x8a\xea\xbe\x69\xfd\x7b\x04\xd7\x8c\x15\xd7\xbf\x60\x51\xdf\x73\xdd\xf9\x33\x16\xbb\xa0\x9c\x6d\x14\xd0\x6c\xfe\x8a\xc5\xb5\x63\xd1\x8d\xca\x0a\xea\x5e\xfd\x23\x16\xa5\x27\xb3\x9b\x42\xae\x87\x2b\x79\xd8\xfa\x31\x8b\xeb\xe7\xd5\xb8\x6c\x81\xf3\xda\xfc\xe5\x8a\x4d\xa8\x8d\x1f\x46\xe1\x8b\xc2\xfe\xaa\xb1\xff\x31\x94\x1d\x63\x35\x7e\x14\xa5\x9e\xd7\xb5\x17\x94\x6b\xa8\xfa\x0c\xb7\x82\xa2\xba\x98\x56\xb4\xb1\x05\xe5\x8b\x7e\x9a\x9c\xf7\xb7\x50\xf9\x28\x6b\x6b\xac\xff\x1f\x00\x00\xff\xff\x4c\x77\x8c\xee\x5e\x49\x00\x00") func initCursorSkillsSuiDevelopmentSkillMdBytes() ([]byte, error) { return bindataRead( @@ -651,7 +651,7 @@ func initCursorSkillsSuiDevelopmentSkillMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/sui-development/SKILL.md", size: 12654, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/sui-development/SKILL.md", size: 18782, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -671,7 +671,7 @@ func initCursorSkillsSuiDevelopmentReferencesBackendApiMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/backend-api.md", size: 7313, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/backend-api.md", size: 7313, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -691,7 +691,7 @@ func initCursorSkillsSuiDevelopmentReferencesFrontendApiMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/frontend-api.md", size: 9375, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/frontend-api.md", size: 9375, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -711,7 +711,7 @@ func initCursorSkillsSuiDevelopmentReferencesTemplateFunctionsMd() (*asset, erro return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/template-functions.md", size: 9960, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/sui-development/references/template-functions.md", size: 9960, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -731,7 +731,7 @@ func initCursorSkillsYaoAgentDevelopmentSkillMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/SKILL.md", size: 13543, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/SKILL.md", size: 13543, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -751,7 +751,7 @@ func initCursorSkillsYaoAgentDevelopmentReferencesContextApiMd() (*asset, error) return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/context-api.md", size: 13643, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/context-api.md", size: 13643, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -771,7 +771,7 @@ func initCursorSkillsYaoAgentDevelopmentReferencesHooksPatternsMd() (*asset, err return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/hooks-patterns.md", size: 12826, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/hooks-patterns.md", size: 12826, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -791,7 +791,7 @@ func initCursorSkillsYaoAgentDevelopmentReferencesRuntimeApiMd() (*asset, error) return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/runtime-api.md", size: 16786, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/runtime-api.md", size: 16786, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -811,7 +811,7 @@ func initCursorSkillsYaoAgentDevelopmentReferencesTestingMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/testing.md", size: 11412, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.cursor/skills/yao-agent-development/references/testing.md", size: 11412, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -831,7 +831,7 @@ func initEnv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.env", size: 8585, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.env", size: 8585, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -851,7 +851,7 @@ func initVscodeSettingsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -871,7 +871,7 @@ func initVscodeTypesRuntimeAgentDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/agent.d.ts", size: 21775, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/agent.d.ts", size: 21775, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -891,7 +891,7 @@ func initVscodeTypesRuntimeConsoleDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 694, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 694, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -911,7 +911,7 @@ func initVscodeTypesRuntimeEvalDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/eval.d.ts", size: 65, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/eval.d.ts", size: 65, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -931,7 +931,7 @@ func initVscodeTypesRuntimeExceptionDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -951,7 +951,7 @@ func initVscodeTypesRuntimeFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -971,7 +971,7 @@ func initVscodeTypesRuntimeGlobalDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 2888, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 2888, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -991,7 +991,7 @@ func initVscodeTypesRuntimeHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1011,7 +1011,7 @@ func initVscodeTypesRuntimeIoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1031,7 +1031,7 @@ func initVscodeTypesRuntimeLogDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1051,7 +1051,7 @@ func initVscodeTypesRuntimeNeoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1071,7 +1071,7 @@ func initVscodeTypesRuntimePlanDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/plan.d.ts", size: 2070, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/plan.d.ts", size: 2070, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1091,7 +1091,7 @@ func initVscodeTypesRuntimeProcessFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1111,7 +1111,7 @@ func initVscodeTypesRuntimeProcessHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1131,7 +1131,7 @@ func initVscodeTypesRuntimeProcessModelDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1151,7 +1151,7 @@ func initVscodeTypesRuntimeProcessDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1171,7 +1171,7 @@ func initVscodeTypesRuntimeQueryDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6125, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6125, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1191,7 +1191,7 @@ func initVscodeTypesRuntimeStoreDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 5891, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 5891, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1211,7 +1211,7 @@ func initVscodeTypesRuntimeSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1231,7 +1231,7 @@ func initVscodeTypesRuntimeTestingDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/testing.d.ts", size: 9077, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/testing.d.ts", size: 9077, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1251,7 +1251,7 @@ func initVscodeTypesRuntimeTimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1271,7 +1271,7 @@ func initVscodeTypesRuntimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 525, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 525, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1291,7 +1291,7 @@ func initVscodeTypesSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 18323, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 18323, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1311,7 +1311,7 @@ func initAgentAgentYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/agent.yml", size: 1583, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/agent.yml", size: 1583, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1331,7 +1331,7 @@ func initAgentLocalesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/locales/en-us.yml", size: 151, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/locales/en-us.yml", size: 151, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1351,7 +1351,7 @@ func initAgentLocalesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/locales/zh-cn.yml", size: 135, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/locales/zh-cn.yml", size: 135, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1371,7 +1371,7 @@ func initAgentPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/prompts.yml", size: 713, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/prompts.yml", size: 713, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1391,7 +1391,7 @@ func initAgentSearchYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/search.yml", size: 330, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/search.yml", size: 330, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1411,7 +1411,7 @@ func initAgentTemplate__assetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1431,7 +1431,7 @@ func initAgentTemplate__assetsBrandsAppleSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/brands/apple.svg", size: 650, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/brands/apple.svg", size: 650, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1451,7 +1451,7 @@ func initAgentTemplate__assetsBrandsGithubSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/brands/github.svg", size: 822, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/brands/github.svg", size: 822, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1471,7 +1471,7 @@ func initAgentTemplate__assetsBrandsGoogleSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/brands/google.svg", size: 457, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/brands/google.svg", size: 457, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1491,7 +1491,7 @@ func initAgentTemplate__assetsBrandsMicrosoftSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/brands/microsoft.svg", size: 206, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/brands/microsoft.svg", size: 206, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1511,7 +1511,7 @@ func initAgentTemplate__assetsCssVarsCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/css/vars.css", size: 7296, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/css/vars.css", size: 7296, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1531,7 +1531,7 @@ func initAgentTemplate__assetsImagesAssistantsExpensePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/images/assistants/expense.png", size: 1434910, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/images/assistants/expense.png", size: 1434910, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1551,7 +1551,7 @@ func initAgentTemplate__assetsImagesAssistantsTasksSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/images/assistants/tasks.svg", size: 1686, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/images/assistants/tasks.svg", size: 1686, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1571,7 +1571,7 @@ func initAgentTemplate__assetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/images/icons/app.png", size: 18302, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/images/icons/app.png", size: 18302, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1591,7 +1591,7 @@ func initAgentTemplate__assetsImagesLogosLogo_colorSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/images/logos/logo_color.svg", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/images/logos/logo_color.svg", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1611,7 +1611,7 @@ func initAgentTemplate__assetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/images/logos/wordmark.svg", size: 8648, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/images/logos/wordmark.svg", size: 8648, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1631,7 +1631,7 @@ func initAgentTemplate__assetsJsEcharts543MinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/js/echarts-5.4.3.min.js", size: 1024740, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/js/echarts-5.4.3.min.js", size: 1024740, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1651,7 +1651,7 @@ func initAgentTemplate__assetsJsHighlightMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/js/highlight.min.js", size: 65157, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/js/highlight.min.js", size: 65157, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1671,7 +1671,7 @@ func initAgentTemplate__assetsJsRemarkableMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/js/remarkable.min.js", size: 122397, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/js/remarkable.min.js", size: 122397, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1691,7 +1691,7 @@ func initAgentTemplate__assetsJsYaoAgentDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/js/yao-agent.d.ts", size: 2082, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/js/yao-agent.d.ts", size: 2082, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1711,7 +1711,7 @@ func initAgentTemplate__assetsJsYaoAgentJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__assets/js/yao-agent.js", size: 15828, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__assets/js/yao-agent.js", size: 15828, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1731,7 +1731,7 @@ func initAgentTemplate__dataJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__data.json", size: 538, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__data.json", size: 538, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1751,7 +1751,7 @@ func initAgentTemplate__documentHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/__document.html", size: 4391, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/__document.html", size: 4391, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1771,7 +1771,7 @@ func initAgentTemplatePackageJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/package.json", size: 356, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/package.json", size: 356, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1791,7 +1791,7 @@ func initAgentTemplatePages401401Css() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/401.css", size: 700, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/401.css", size: 700, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1811,7 +1811,7 @@ func initAgentTemplatePages401401Html() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/401.html", size: 531, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/401.html", size: 531, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1831,7 +1831,7 @@ func initAgentTemplatePages401401Json() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/401.json", size: 54, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/401.json", size: 54, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1851,7 +1851,7 @@ func initAgentTemplatePages401401Ts() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/401.ts", size: 214, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/401.ts", size: 214, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1871,7 +1871,7 @@ func initAgentTemplatePages401__localesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/__locales/en-us.yml", size: 145, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/__locales/en-us.yml", size: 145, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1891,7 +1891,7 @@ func initAgentTemplatePages401__localesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/401/__locales/zh-cn.yml", size: 139, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/401/__locales/zh-cn.yml", size: 139, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1911,7 +1911,7 @@ func initAgentTemplatePages404404Css() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/404.css", size: 1877, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/404.css", size: 1877, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1931,7 +1931,7 @@ func initAgentTemplatePages404404Html() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/404.html", size: 896, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/404.html", size: 896, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1951,7 +1951,7 @@ func initAgentTemplatePages404404Json() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/404.json", size: 32, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/404.json", size: 32, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1971,7 +1971,7 @@ func initAgentTemplatePages404404Ts() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/404.ts", size: 450, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/404.ts", size: 450, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1991,7 +1991,7 @@ func initAgentTemplatePages404__localesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/__locales/en-us.yml", size: 243, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/__locales/en-us.yml", size: 243, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2011,7 +2011,7 @@ func initAgentTemplatePages404__localesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/agent/template/pages/404/__locales/zh-cn.yml", size: 232, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/agent/template/pages/404/__locales/zh-cn.yml", size: 232, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2031,7 +2031,7 @@ func initAiDocsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/README.md", size: 6145, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/README.md", size: 6145, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2051,7 +2051,7 @@ func initAiDocsAgentMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/agent.md", size: 11433, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/agent.md", size: 11433, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2071,7 +2071,7 @@ func initAiDocsAttachmentMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/attachment.md", size: 1891, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/attachment.md", size: 1891, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2091,7 +2091,7 @@ func initAiDocsAuthorizedMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/authorized.md", size: 4178, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/authorized.md", size: 4178, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2111,7 +2111,7 @@ func initAiDocsConcurrentMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/concurrent.md", size: 2833, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/concurrent.md", size: 2833, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2131,7 +2131,7 @@ func initAiDocsExcelMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/excel.md", size: 1911, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/excel.md", size: 1911, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2151,7 +2151,7 @@ func initAiDocsExceptionMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/exception.md", size: 1440, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/exception.md", size: 1440, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2171,7 +2171,7 @@ func initAiDocsFfmpegMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/ffmpeg.md", size: 1204, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/ffmpeg.md", size: 1204, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2191,7 +2191,7 @@ func initAiDocsFsMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/fs.md", size: 3614, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/fs.md", size: 3614, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2211,7 +2211,7 @@ func initAiDocsHttpMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/http.md", size: 2110, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/http.md", size: 2110, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2231,7 +2231,7 @@ func initAiDocsJobMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/job.md", size: 3034, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/job.md", size: 3034, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2251,7 +2251,7 @@ func initAiDocsModelMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/model.md", size: 3558, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/model.md", size: 3558, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2271,7 +2271,7 @@ func initAiDocsOfficeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/office.md", size: 1265, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/office.md", size: 1265, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2291,7 +2291,7 @@ func initAiDocsPdfMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/pdf.md", size: 860, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/pdf.md", size: 860, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2311,7 +2311,7 @@ func initAiDocsRssMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/rss.md", size: 7229, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/rss.md", size: 7229, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2331,7 +2331,7 @@ func initAiDocsSitemapMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/sitemap.md", size: 9902, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/sitemap.md", size: 9902, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2351,7 +2351,7 @@ func initAiDocsStoreMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/store.md", size: 3226, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/store.md", size: 3226, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2371,7 +2371,7 @@ func initAiDocsSuiMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/sui.md", size: 22445, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/sui.md", size: 22445, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2391,7 +2391,7 @@ func initAiDocsTestingMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/testing.md", size: 13980, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/testing.md", size: 13980, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2411,7 +2411,7 @@ func initAiDocsTextMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/ai-docs/text.md", size: 2401, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/ai-docs/text.md", size: 2401, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2431,7 +2431,7 @@ func initAppYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/app.yao", size: 1894, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/app.yao", size: 1894, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2451,7 +2451,7 @@ func initAssistantsLlmsLocalesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/llms/locales/en-us.yml", size: 235, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/llms/locales/en-us.yml", size: 235, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2471,7 +2471,7 @@ func initAssistantsLlmsLocalesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/llms/locales/zh-cn.yml", size: 231, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/llms/locales/zh-cn.yml", size: 231, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2491,7 +2491,7 @@ func initAssistantsLlmsPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/llms/package.yao", size: 546, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/llms/package.yao", size: 546, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2511,7 +2511,7 @@ func initAssistantsLlmsPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/llms/prompts.yml", size: 127, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/llms/prompts.yml", size: 127, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2531,7 +2531,7 @@ func initAssistantsMessagesLocalesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/locales/en-us.yml", size: 383, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/locales/en-us.yml", size: 383, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2551,7 +2551,7 @@ func initAssistantsMessagesLocalesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/locales/zh-cn.yml", size: 371, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/locales/zh-cn.yml", size: 371, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2571,7 +2571,7 @@ func initAssistantsMessagesPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/package.yao", size: 562, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/package.yao", size: 562, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2591,7 +2591,7 @@ func initAssistantsMessagesSrcActionTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/action.ts", size: 4752, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/action.ts", size: 4752, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2611,7 +2611,7 @@ func initAssistantsMessagesSrcBasicTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/basic.ts", size: 3310, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/basic.ts", size: 3310, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2631,7 +2631,7 @@ func initAssistantsMessagesSrcCodeTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/code.ts", size: 2463, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/code.ts", size: 2463, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2651,7 +2651,7 @@ func initAssistantsMessagesSrcErrorTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/error.ts", size: 6281, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/error.ts", size: 6281, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2671,7 +2671,7 @@ func initAssistantsMessagesSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/index.ts", size: 3326, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/index.ts", size: 3326, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2691,7 +2691,7 @@ func initAssistantsMessagesSrcMarkdownTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/messages/src/markdown.ts", size: 7045, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/messages/src/markdown.ts", size: 7045, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2711,7 +2711,7 @@ func initAssistantsYaoLocalesEnUsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/yao/locales/en-us.yml", size: 353, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/yao/locales/en-us.yml", size: 353, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2731,7 +2731,7 @@ func initAssistantsYaoLocalesZhCnYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/yao/locales/zh-cn.yml", size: 363, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/yao/locales/zh-cn.yml", size: 363, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2751,7 +2751,7 @@ func initAssistantsYaoPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/yao/package.yao", size: 582, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/yao/package.yao", size: 582, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2771,7 +2771,7 @@ func initAssistantsYaoPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/assistants/yao/prompts.yml", size: 648, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/assistants/yao/prompts.yml", size: 648, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2791,7 +2791,7 @@ func initConnectorsAnthropicClaudeOpus4_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/anthropic/claude-opus-4_5.conn.yao", size: 385, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/anthropic/claude-opus-4_5.conn.yao", size: 385, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2811,7 +2811,7 @@ func initConnectorsAnthropicClaudeSonnet4_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/anthropic/claude-sonnet-4_5.conn.yao", size: 389, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/anthropic/claude-sonnet-4_5.conn.yao", size: 389, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2831,7 +2831,7 @@ func initConnectorsAzureGpt5_2ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/azure/gpt-5_2.conn.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/azure/gpt-5_2.conn.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2851,7 +2851,7 @@ func initConnectorsClaudeHaiku3_0ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/haiku-3_0.conn.yao", size: 250, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/haiku-3_0.conn.yao", size: 250, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2871,7 +2871,7 @@ func initConnectorsClaudeHaiku4_5ThinkingConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/haiku-4_5-thinking.conn.yao", size: 403, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/haiku-4_5-thinking.conn.yao", size: 403, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2891,7 +2891,7 @@ func initConnectorsClaudeHaiku4_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/haiku-4_5.conn.yao", size: 306, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/haiku-4_5.conn.yao", size: 306, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2911,7 +2911,7 @@ func initConnectorsClaudeOpus4_6ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/opus-4_6.conn.yao", size: 360, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/opus-4_6.conn.yao", size: 360, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2931,7 +2931,7 @@ func initConnectorsClaudeSonnet4_5ThinkingConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/sonnet-4_5-thinking.conn.yao", size: 405, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/sonnet-4_5-thinking.conn.yao", size: 405, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2951,7 +2951,7 @@ func initConnectorsClaudeSonnet4_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/claude/sonnet-4_5.conn.yao", size: 308, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/claude/sonnet-4_5.conn.yao", size: 308, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2971,7 +2971,7 @@ func initConnectorsDeepseekDeepseekChatConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/deepseek/deepseek-chat.conn.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/deepseek/deepseek-chat.conn.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2991,7 +2991,7 @@ func initConnectorsDeepseekDeepseekReasonerConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/deepseek/deepseek-reasoner.conn.yao", size: 385, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/deepseek/deepseek-reasoner.conn.yao", size: 385, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3011,7 +3011,7 @@ func initConnectorsFireworksLlama4MaverickConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/fireworks/llama-4-maverick.conn.yao", size: 449, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/fireworks/llama-4-maverick.conn.yao", size: 449, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3031,7 +3031,7 @@ func initConnectorsGoogleGemini2_5ProConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/google/gemini-2_5-pro.conn.yao", size: 406, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/google/gemini-2_5-pro.conn.yao", size: 406, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3051,7 +3051,7 @@ func initConnectorsGoogleGemini3FlashConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/google/gemini-3-flash.conn.yao", size: 416, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/google/gemini-3-flash.conn.yao", size: 416, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3071,7 +3071,7 @@ func initConnectorsGroqLlama4MaverickConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/groq/llama-4-maverick.conn.yao", size: 420, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/groq/llama-4-maverick.conn.yao", size: 420, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3091,7 +3091,7 @@ func initConnectorsMetaLlama4MaverickConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/meta/llama-4-maverick.conn.yao", size: 400, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/meta/llama-4-maverick.conn.yao", size: 400, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3111,7 +3111,7 @@ func initConnectorsMistralMistralLarge3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/mistral/mistral-large-3.conn.yao", size: 381, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/mistral/mistral-large-3.conn.yao", size: 381, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3131,7 +3131,7 @@ func initConnectorsMoonshotKimiK20905PreviewConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-0905-preview.conn.yao", size: 316, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-0905-preview.conn.yao", size: 316, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3151,7 +3151,7 @@ func initConnectorsMoonshotKimiK2ThinkingTurboConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-thinking-turbo.conn.yao", size: 345, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-thinking-turbo.conn.yao", size: 345, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3171,7 +3171,7 @@ func initConnectorsMoonshotKimiK2ThinkingConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-thinking.conn.yao", size: 333, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-thinking.conn.yao", size: 333, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3191,7 +3191,7 @@ func initConnectorsMoonshotKimiK2TurboPreviewConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-turbo-preview.conn.yao", size: 318, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2-turbo-preview.conn.yao", size: 318, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3211,7 +3211,7 @@ func initConnectorsMoonshotKimiK2_5CodeConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5-code.conn.yao", size: 303, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5-code.conn.yao", size: 303, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3231,7 +3231,7 @@ func initConnectorsMoonshotKimiK2_5ThinkingConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5-thinking.conn.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5-thinking.conn.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3251,7 +3251,7 @@ func initConnectorsMoonshotKimiK2_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5.conn.yao", size: 368, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/moonshot/kimi-k2_5.conn.yao", size: 368, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3271,7 +3271,7 @@ func initConnectorsOllamaDeepseekR1ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/deepseek-r1.conn.yao", size: 356, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/deepseek-r1.conn.yao", size: 356, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3291,7 +3291,7 @@ func initConnectorsOllamaGemma3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/gemma3.conn.yao", size: 350, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/gemma3.conn.yao", size: 350, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3311,7 +3311,7 @@ func initConnectorsOllamaLlama3_3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/llama3_3.conn.yao", size: 355, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/llama3_3.conn.yao", size: 355, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3331,7 +3331,7 @@ func initConnectorsOllamaQwen2_50_5bConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-0_5b.conn.yao", size: 362, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-0_5b.conn.yao", size: 362, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3351,7 +3351,7 @@ func initConnectorsOllamaQwen2_5Coder0_5bYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-coder-0_5b.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-coder-0_5b.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3371,7 +3371,7 @@ func initConnectorsOllamaQwen2_5CoderConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-coder.conn.yao", size: 364, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/qwen2_5-coder.conn.yao", size: 364, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3391,7 +3391,7 @@ func initConnectorsOllamaQwen3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/ollama/qwen3.conn.yao", size: 345, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/ollama/qwen3.conn.yao", size: 345, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3411,7 +3411,7 @@ func initConnectorsOpenaiGpt4oMiniConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openai/gpt-4o-mini.conn.yao", size: 371, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openai/gpt-4o-mini.conn.yao", size: 371, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3431,7 +3431,7 @@ func initConnectorsOpenaiGpt4oConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openai/gpt-4o.conn.yao", size: 360, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openai/gpt-4o.conn.yao", size: 360, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3451,7 +3451,7 @@ func initConnectorsOpenaiGpt5_2ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openai/gpt-5_2.conn.yao", size: 362, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openai/gpt-5_2.conn.yao", size: 362, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3471,7 +3471,7 @@ func initConnectorsOpenaiO3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openai/o3.conn.yao", size: 354, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openai/o3.conn.yao", size: 354, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3491,7 +3491,7 @@ func initConnectorsOpenaiTextEmbedding3LargeConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openai/text-embedding-3-large.conn.yao", size: 394, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openai/text-embedding-3-large.conn.yao", size: 394, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3511,7 +3511,7 @@ func initConnectorsOpenrouterAutoConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openrouter/auto.conn.yao", size: 395, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openrouter/auto.conn.yao", size: 395, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3531,7 +3531,7 @@ func initConnectorsOpenrouterClaudeOpus4_5ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openrouter/claude-opus-4_5.conn.yao", size: 409, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openrouter/claude-opus-4_5.conn.yao", size: 409, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3551,7 +3551,7 @@ func initConnectorsOpenrouterNovaPremierConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/openrouter/nova-premier.conn.yao", size: 410, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/openrouter/nova-premier.conn.yao", size: 410, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3571,7 +3571,7 @@ func initConnectorsSiliconflowDeepseekV3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/siliconflow/deepseek-v3.conn.yao", size: 405, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/siliconflow/deepseek-v3.conn.yao", size: 405, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3591,7 +3591,7 @@ func initConnectorsSiliconflowQwen2_572bConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/siliconflow/qwen-2_5-72b.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/siliconflow/qwen-2_5-72b.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3611,7 +3611,7 @@ func initConnectorsTogetherDeepseekR1ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/together/deepseek-r1.conn.yao", size: 396, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/together/deepseek-r1.conn.yao", size: 396, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3631,7 +3631,7 @@ func initConnectorsTogetherLlama4MaverickConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/together/llama-4-maverick.conn.yao", size: 429, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/together/llama-4-maverick.conn.yao", size: 429, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3651,7 +3651,7 @@ func initConnectorsVolcengineDeepseekR1ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/volcengine/deepseek-r1.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/volcengine/deepseek-r1.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3671,7 +3671,7 @@ func initConnectorsVolcengineDeepseekV3ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/volcengine/deepseek-v3.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/volcengine/deepseek-v3.conn.yao", size: 408, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3691,7 +3691,7 @@ func initConnectorsVolcengineDoubao1_5ProConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/volcengine/doubao-1_5-pro.conn.yao", size: 412, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/volcengine/doubao-1_5-pro.conn.yao", size: 412, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3711,7 +3711,7 @@ func initConnectorsVolcengineGlm4PlusConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/volcengine/glm-4-plus.conn.yao", size: 399, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/volcengine/glm-4-plus.conn.yao", size: 399, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3731,7 +3731,7 @@ func initConnectorsVolcengineQwenVlMaxConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/volcengine/qwen-vl-max.conn.yao", size: 403, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/volcengine/qwen-vl-max.conn.yao", size: 403, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3751,7 +3751,7 @@ func initConnectorsXaiGrok4ConnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/connectors/xai/grok-4.conn.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/connectors/xai/grok-4.conn.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3771,7 +3771,7 @@ func initDataReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3791,7 +3791,7 @@ func initDataTemplatesDefault__assetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3811,7 +3811,7 @@ func initDataTemplatesDefault__assetsBrandsAppleSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/apple.svg", size: 650, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/apple.svg", size: 650, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3831,7 +3831,7 @@ func initDataTemplatesDefault__assetsBrandsDiscordSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/discord.svg", size: 1373, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/discord.svg", size: 1373, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3851,7 +3851,7 @@ func initDataTemplatesDefault__assetsBrandsGithubSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/github.svg", size: 822, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/github.svg", size: 822, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3871,7 +3871,7 @@ func initDataTemplatesDefault__assetsBrandsGoogleSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/google.svg", size: 457, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/google.svg", size: 457, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3891,7 +3891,7 @@ func initDataTemplatesDefault__assetsBrandsMicrosoftSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/microsoft.svg", size: 206, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/microsoft.svg", size: 206, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3911,7 +3911,7 @@ func initDataTemplatesDefault__assetsBrandsTwitterSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/twitter.svg", size: 252, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/twitter.svg", size: 252, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3931,7 +3931,7 @@ func initDataTemplatesDefault__assetsBrandsYaoSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/yao.svg", size: 2894, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/yao.svg", size: 2894, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3951,7 +3951,7 @@ func initDataTemplatesDefault__assetsBrandsYaoagentsSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/yaoagents.svg", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/brands/yaoagents.svg", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3971,7 +3971,7 @@ func initDataTemplatesDefault__assetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3991,7 +3991,7 @@ func initDataTemplatesDefault__assetsImagesLogosLogo_colorSvg() (*asset, error) return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4011,7 +4011,7 @@ func initDataTemplatesDefault__assetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4031,7 +4031,7 @@ func initDataTemplatesDefault__dataJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 32, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 32, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4051,7 +4051,7 @@ func initDataTemplatesDefault__documentHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4071,7 +4071,7 @@ func initDataTemplatesDefaultIndexIndexBackendTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.backend.ts", size: 1033, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.backend.ts", size: 1033, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4091,7 +4091,7 @@ func initDataTemplatesDefaultIndexIndexCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 3466, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 3466, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4111,7 +4111,7 @@ func initDataTemplatesDefaultIndexIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 4708, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 4708, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4131,7 +4131,7 @@ func initDataTemplatesDefaultIndexIndexJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 52, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 52, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4151,7 +4151,7 @@ func initDbReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4171,7 +4171,7 @@ func initIconsAppIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4191,7 +4191,7 @@ func initIconsAppIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4211,7 +4211,7 @@ func initIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4231,7 +4231,7 @@ func initLogsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4251,7 +4251,7 @@ func initMessengersChannelsYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/channels.yao", size: 477, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/channels.yao", size: 477, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4271,7 +4271,7 @@ func initMessengersProvidersPrimarySmtpYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/providers/primary.smtp.yao", size: 440, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/providers/primary.smtp.yao", size: 440, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4291,7 +4291,7 @@ func initMessengersProvidersSecondaryMailgunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/providers/secondary.mailgun.yao", size: 337, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/providers/secondary.mailgun.yao", size: 337, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4311,7 +4311,7 @@ func initMessengersProvidersUnifiedTwilioYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/providers/unified.twilio.yao", size: 508, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/providers/unified.twilio.yao", size: 508, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4331,7 +4331,7 @@ func initMessengersTemplatesEnInvite_memberMailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/en/invite_member.mail.html", size: 483, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/en/invite_member.mail.html", size: 483, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4351,7 +4351,7 @@ func initMessengersTemplatesEnInvite_memberSmsTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/en/invite_member.sms.txt", size: 114, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/en/invite_member.sms.txt", size: 114, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4371,7 +4371,7 @@ func initMessengersTemplatesEnVerify_emailMailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/en/verify_email.mail.html", size: 397, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/en/verify_email.mail.html", size: 397, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4391,7 +4391,7 @@ func initMessengersTemplatesEnVerify_mobileSmsTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/en/verify_mobile.sms.txt", size: 124, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/en/verify_mobile.sms.txt", size: 124, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4411,7 +4411,7 @@ func initMessengersTemplatesZhCnInvite_mailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_mail.html", size: 373, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_mail.html", size: 373, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4431,7 +4431,7 @@ func initMessengersTemplatesZhCnInvite_memberMailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_member.mail.html", size: 441, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_member.mail.html", size: 441, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4451,7 +4451,7 @@ func initMessengersTemplatesZhCnInvite_smsTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_sms.txt", size: 122, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/zh-cn/invite_sms.txt", size: 122, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4471,7 +4471,7 @@ func initMessengersTemplatesZhCnVerify_emailMailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/zh-cn/verify_email.mail.html", size: 347, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/zh-cn/verify_email.mail.html", size: 347, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4491,7 +4491,7 @@ func initMessengersTemplatesZhCnVerify_mobileSmsTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/messengers/templates/zh-cn/verify_mobile.sms.txt", size: 114, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/messengers/templates/zh-cn/verify_mobile.sms.txt", size: 114, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4511,7 +4511,7 @@ func initModelsMenuModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/models/menu.mod.yao", size: 3246, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/models/menu.mod.yao", size: 3246, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4531,7 +4531,7 @@ func initOpenapiCertsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/certs/README.md", size: 10174, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/certs/README.md", size: 10174, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4551,7 +4551,7 @@ func initOpenapiCertsMtlsClientCaKeyTestingOnlyDoNotUseInProductionPem() (*asset return nil, err } - info := bindataFileInfo{name: "init/openapi/certs/mtls-client-ca-key-TESTING-ONLY-DO-NOT-USE-IN-PRODUCTION.pem", size: 3268, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/certs/mtls-client-ca-key-TESTING-ONLY-DO-NOT-USE-IN-PRODUCTION.pem", size: 3268, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4571,7 +4571,7 @@ func initOpenapiCertsMtlsClientCaPem() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/certs/mtls-client-ca.pem", size: 2029, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/certs/mtls-client-ca.pem", size: 2029, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4591,7 +4591,7 @@ func initOpenapiCertsSigningCertPem() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/certs/signing-cert.pem", size: 2090, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/certs/signing-cert.pem", size: 2090, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4611,7 +4611,7 @@ func initOpenapiCertsSigningKeyPem() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/certs/signing-key.pem", size: 3272, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/certs/signing-key.pem", size: 3272, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4631,7 +4631,7 @@ func initOpenapiFeaturesAliasYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/features/alias.yml", size: 800, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/features/alias.yml", size: 800, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4651,7 +4651,7 @@ func initOpenapiFeaturesFeaturesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/features/features.yml", size: 1202, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/features/features.yml", size: 1202, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4671,7 +4671,7 @@ func initOpenapiFeaturesUserProfileYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/features/user/profile.yml", size: 96, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/features/user/profile.yml", size: 96, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4691,7 +4691,7 @@ func initOpenapiFeaturesUserTeamYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/features/user/team.yml", size: 286, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/features/user/team.yml", size: 286, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4711,7 +4711,7 @@ func initOpenapiOpenapiYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/openapi.yao", size: 8378, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/openapi.yao", size: 8378, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4731,7 +4731,7 @@ func initOpenapiScopes__yaoYaoYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/__yao/yao.yml", size: 747, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/__yao/yao.yml", size: 747, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4751,7 +4751,7 @@ func initOpenapiScopesAgentAssistantsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/agent/assistants.yml", size: 2054, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/agent/assistants.yml", size: 2054, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4771,7 +4771,7 @@ func initOpenapiScopesAgentRobotsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/agent/robots.yml", size: 4625, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/agent/robots.yml", size: 4625, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4791,7 +4791,7 @@ func initOpenapiScopesAliasYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/alias.yml", size: 18283, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/alias.yml", size: 18283, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4811,7 +4811,7 @@ func initOpenapiScopesApiApiYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/api/api.yml", size: 727, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/api/api.yml", size: 727, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4831,7 +4831,7 @@ func initOpenapiScopesAppMenuYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/app/menu.yml", size: 476, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/app/menu.yml", size: 476, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4851,7 +4851,7 @@ func initOpenapiScopesChatCompletionsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/chat/completions.yml", size: 2001, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/chat/completions.yml", size: 2001, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4871,7 +4871,7 @@ func initOpenapiScopesChatModelsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/chat/models.yml", size: 589, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/chat/models.yml", size: 589, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4891,7 +4891,7 @@ func initOpenapiScopesChatReferencesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/chat/references.yml", size: 581, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/chat/references.yml", size: 581, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4911,7 +4911,7 @@ func initOpenapiScopesChatSessionsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/chat/sessions.yml", size: 1603, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/chat/sessions.yml", size: 1603, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4931,7 +4931,7 @@ func initOpenapiScopesDslDslsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/dsl/dsls.yml", size: 2911, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/dsl/dsls.yml", size: 2911, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4951,7 +4951,7 @@ func initOpenapiScopesFileFilesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/file/files.yml", size: 1486, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/file/files.yml", size: 1486, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4971,7 +4971,7 @@ func initOpenapiScopesJobCategoriesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/job/categories.yml", size: 249, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/job/categories.yml", size: 249, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4991,7 +4991,7 @@ func initOpenapiScopesJobExecutionsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/job/executions.yml", size: 1217, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/job/executions.yml", size: 1217, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5011,7 +5011,7 @@ func initOpenapiScopesJobJobsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/job/jobs.yml", size: 937, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/job/jobs.yml", size: 937, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5031,7 +5031,7 @@ func initOpenapiScopesJobLogsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/job/logs.yml", size: 564, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/job/logs.yml", size: 564, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5051,7 +5051,7 @@ func initOpenapiScopesJobStatsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/job/stats.yml", size: 419, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/job/stats.yml", size: 419, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5071,7 +5071,7 @@ func initOpenapiScopesKbBackupsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/backups.yml", size: 713, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/backups.yml", size: 713, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5091,7 +5091,7 @@ func initOpenapiScopesKbCollectionsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/collections.yml", size: 1725, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/collections.yml", size: 1725, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5111,7 +5111,7 @@ func initOpenapiScopesKbDocumentsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/documents.yml", size: 2235, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/documents.yml", size: 2235, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5131,7 +5131,7 @@ func initOpenapiScopesKbGraphsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/graphs.yml", size: 1847, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/graphs.yml", size: 1847, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5151,7 +5151,7 @@ func initOpenapiScopesKbHitsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/hits.yml", size: 1766, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/hits.yml", size: 1766, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5171,7 +5171,7 @@ func initOpenapiScopesKbProvidersYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/providers.yml", size: 351, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/providers.yml", size: 351, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5191,7 +5191,7 @@ func initOpenapiScopesKbSearchYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/search.yml", size: 535, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/search.yml", size: 535, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5211,7 +5211,7 @@ func initOpenapiScopesKbSegmentsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/segments.yml", size: 2580, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/segments.yml", size: 2580, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5231,7 +5231,7 @@ func initOpenapiScopesKbVotesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/kb/votes.yml", size: 1805, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/kb/votes.yml", size: 1805, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5251,7 +5251,7 @@ func initOpenapiScopesLlmProvidersYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/llm/providers.yml", size: 268, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/llm/providers.yml", size: 268, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5271,7 +5271,7 @@ func initOpenapiScopesMcpServersYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/mcp/servers.yml", size: 242, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/mcp/servers.yml", size: 242, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5291,7 +5291,7 @@ func initOpenapiScopesMessengerChannelsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/messenger/channels.yml", size: 244, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/messenger/channels.yml", size: 244, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5311,7 +5311,7 @@ func initOpenapiScopesMessengerProvidersYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/messenger/providers.yml", size: 306, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/messenger/providers.yml", size: 306, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5331,7 +5331,7 @@ func initOpenapiScopesMessengerWebhooksYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/messenger/webhooks.yml", size: 512, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/messenger/webhooks.yml", size: 512, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5351,7 +5351,7 @@ func initOpenapiScopesOtpCodesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/otp/codes.yml", size: 346, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/otp/codes.yml", size: 346, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5371,7 +5371,7 @@ func initOpenapiScopesSandboxVncYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/sandbox/vnc.yml", size: 707, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/sandbox/vnc.yml", size: 707, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5391,7 +5391,7 @@ func initOpenapiScopesScopesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/scopes.yml", size: 547, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/scopes.yml", size: 547, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5411,7 +5411,7 @@ func initOpenapiScopesTraceTracesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/trace/traces.yml", size: 1456, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/trace/traces.yml", size: 1456, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5431,7 +5431,7 @@ func initOpenapiScopesUserEntryYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/entry.yml", size: 794, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/entry.yml", size: 794, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5451,7 +5451,7 @@ func initOpenapiScopesUserFeaturesYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/features.yml", size: 231, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/features.yml", size: 231, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5471,7 +5471,7 @@ func initOpenapiScopesUserInvitationsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/invitations.yml", size: 1458, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/invitations.yml", size: 1458, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5491,7 +5491,7 @@ func initOpenapiScopesUserMembersYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/members.yml", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/members.yml", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5511,7 +5511,7 @@ func initOpenapiScopesUserProfileYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/profile.yml", size: 366, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/profile.yml", size: 366, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5531,7 +5531,7 @@ func initOpenapiScopesUserTeamsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/scopes/user/teams.yml", size: 1724, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/scopes/user/teams.yml", size: 1724, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5551,7 +5551,7 @@ func initOpenapiUserClientYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/client.yao", size: 624, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/client.yao", size: 624, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5571,7 +5571,7 @@ func initOpenapiUserEntryEnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/entry/en.yao", size: 2494, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/entry/en.yao", size: 2494, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5591,7 +5591,7 @@ func initOpenapiUserEntryZhCnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/entry/zh-cn.yao", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/entry/zh-cn.yao", size: 2378, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5611,7 +5611,7 @@ func initOpenapiUserProvidersAppleYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/providers/apple.yao", size: 946, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/providers/apple.yao", size: 946, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5631,7 +5631,7 @@ func initOpenapiUserProvidersGithubYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/providers/github.yao", size: 428, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/providers/github.yao", size: 428, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5651,7 +5651,7 @@ func initOpenapiUserProvidersGoogleYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/providers/google.yao", size: 434, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/providers/google.yao", size: 434, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5671,7 +5671,7 @@ func initOpenapiUserProvidersMicrosoftYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/providers/microsoft.yao", size: 487, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/providers/microsoft.yao", size: 487, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5691,7 +5691,7 @@ func initOpenapiUserTeamEnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/team/en.yao", size: 2662, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/team/en.yao", size: 2662, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5711,7 +5711,7 @@ func initOpenapiUserTeamZhCnYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/openapi/user/team/zh-cn.yao", size: 2576, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/openapi/user/team/zh-cn.yao", size: 2576, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5731,7 +5731,7 @@ func initScriptsMenuTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/menu.ts", size: 15362, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/scripts/menu.ts", size: 15362, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5751,7 +5751,7 @@ func initScriptsSetupTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/setup.ts", size: 12586, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/scripts/setup.ts", size: 12586, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5771,7 +5771,7 @@ func initSeedsInvitation_codesCsv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/seeds/invitation_codes.csv", size: 643, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/seeds/invitation_codes.csv", size: 643, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5791,7 +5791,7 @@ func initSeedsMenusCsv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/seeds/menus.csv", size: 976, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/seeds/menus.csv", size: 976, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5811,7 +5811,7 @@ func initSeedsRolesCsv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/seeds/roles.csv", size: 2799, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/seeds/roles.csv", size: 2799, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5831,7 +5831,7 @@ func initSeedsTypesCsv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/seeds/types.csv", size: 3357, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/seeds/types.csv", size: 3357, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5851,7 +5851,7 @@ func initServicesReademeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/services/READEME.md", size: 18, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/services/READEME.md", size: 18, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5871,7 +5871,7 @@ func initSuisWebSuiYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5891,7 +5891,7 @@ func initTsconfigJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5911,7 +5911,7 @@ func libsuiIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/index.ts", size: 13051, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "libsui/index.ts", size: 13051, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5931,7 +5931,7 @@ func libsuiOpenapiTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/openapi.ts", size: 22959, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "libsui/openapi.ts", size: 22959, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5951,7 +5951,7 @@ func libsuiUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5971,7 +5971,7 @@ func libsuiYaoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5991,7 +5991,7 @@ func publicIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6011,7 +6011,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6031,7 +6031,7 @@ func yaoAssistantsEntityPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/entity/package.yao", size: 212, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/entity/package.yao", size: 212, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6051,7 +6051,7 @@ func yaoAssistantsEntityPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/entity/prompts.yml", size: 930, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/entity/prompts.yml", size: 930, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6071,7 +6071,7 @@ func yaoAssistantsKeywordPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/package.yao", size: 200, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/package.yao", size: 200, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6091,7 +6091,7 @@ func yaoAssistantsKeywordPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/prompts.yml", size: 990, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/prompts.yml", size: 990, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6111,7 +6111,7 @@ func yaoAssistantsKeywordSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/src/index.ts", size: 4104, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/src/index.ts", size: 4104, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6131,7 +6131,7 @@ func yaoAssistantsNeedsearchPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/package.yao", size: 207, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/package.yao", size: 207, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6151,7 +6151,7 @@ func yaoAssistantsNeedsearchPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/prompts.yml", size: 3092, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/prompts.yml", size: 3092, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6171,7 +6171,7 @@ func yaoAssistantsNeedsearchSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/src/index.ts", size: 2767, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/src/index.ts", size: 2767, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6191,7 +6191,7 @@ func yaoAssistantsPromptPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/prompt/package.yao", size: 186, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/prompt/package.yao", size: 186, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6211,7 +6211,7 @@ func yaoAssistantsPromptPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/prompt/prompts.yml", size: 621, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/prompt/prompts.yml", size: 621, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6231,7 +6231,7 @@ func yaoAssistantsQuerydslPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/package.yao", size: 196, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/package.yao", size: 196, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6251,7 +6251,7 @@ func yaoAssistantsQuerydslPromptsAggregationYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/aggregation.yml", size: 6982, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/aggregation.yml", size: 6982, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6271,7 +6271,7 @@ func yaoAssistantsQuerydslPromptsComplexYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/complex.yml", size: 7352, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/complex.yml", size: 7352, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6291,7 +6291,7 @@ func yaoAssistantsQuerydslPromptsFilterYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/filter.yml", size: 7087, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/filter.yml", size: 7087, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6311,7 +6311,7 @@ func yaoAssistantsQuerydslPromptsJoinYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/join.yml", size: 8167, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/join.yml", size: 8167, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6331,7 +6331,7 @@ func yaoAssistantsQuerydslPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts.yml", size: 5836, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts.yml", size: 5836, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6351,7 +6351,7 @@ func yaoAssistantsQuerydslSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/src/index.ts", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/src/index.ts", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6371,7 +6371,7 @@ func yaoAssistantsRobot_promptPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/robot_prompt/package.yao", size: 204, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/robot_prompt/package.yao", size: 204, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6391,7 +6391,7 @@ func yaoAssistantsRobot_promptPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/robot_prompt/prompts.yml", size: 2606, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/robot_prompt/prompts.yml", size: 2606, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6411,7 +6411,7 @@ func yaoAssistantsTitlePackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/title/package.yao", size: 178, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/title/package.yao", size: 178, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6431,7 +6431,7 @@ func yaoAssistantsTitlePromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/title/prompts.yml", size: 958, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/assistants/title/prompts.yml", size: 958, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6451,7 +6451,7 @@ func yaoDataIcons404Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6471,7 +6471,7 @@ func yaoDataIconsIconIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6491,7 +6491,7 @@ func yaoDataIconsIconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6511,7 +6511,7 @@ func yaoDataIconsIconPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6531,7 +6531,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6551,7 +6551,7 @@ func yaoDataKbProvidersChunkingSemanticEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6571,7 +6571,7 @@ func yaoDataKbProvidersChunkingSemanticZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6591,7 +6591,7 @@ func yaoDataKbProvidersChunkingStructuredEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6611,7 +6611,7 @@ func yaoDataKbProvidersChunkingStructuredZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6631,7 +6631,7 @@ func yaoDataKbProvidersConverterMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6651,7 +6651,7 @@ func yaoDataKbProvidersConverterMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6671,7 +6671,7 @@ func yaoDataKbProvidersConverterOcrEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6691,7 +6691,7 @@ func yaoDataKbProvidersConverterOcrZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6711,7 +6711,7 @@ func yaoDataKbProvidersConverterOfficeEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6731,7 +6731,7 @@ func yaoDataKbProvidersConverterOfficeZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6751,7 +6751,7 @@ func yaoDataKbProvidersConverterUtf8EnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6771,7 +6771,7 @@ func yaoDataKbProvidersConverterUtf8ZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6791,7 +6791,7 @@ func yaoDataKbProvidersConverterVideoEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6811,7 +6811,7 @@ func yaoDataKbProvidersConverterVideoZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6831,7 +6831,7 @@ func yaoDataKbProvidersConverterVisionEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6851,7 +6851,7 @@ func yaoDataKbProvidersConverterVisionZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6871,7 +6871,7 @@ func yaoDataKbProvidersConverterWhisperEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6891,7 +6891,7 @@ func yaoDataKbProvidersConverterWhisperZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6911,7 +6911,7 @@ func yaoDataKbProvidersEmbeddingFastembedEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6931,7 +6931,7 @@ func yaoDataKbProvidersEmbeddingFastembedZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6951,7 +6951,7 @@ func yaoDataKbProvidersEmbeddingOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6971,7 +6971,7 @@ func yaoDataKbProvidersEmbeddingOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6991,7 +6991,7 @@ func yaoDataKbProvidersExtractionOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7011,7 +7011,7 @@ func yaoDataKbProvidersExtractionOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7031,7 +7031,7 @@ func yaoDataKbProvidersFetcherHttpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7051,7 +7051,7 @@ func yaoDataKbProvidersFetcherHttpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7071,7 +7071,7 @@ func yaoDataKbProvidersFetcherMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7091,7 +7091,7 @@ func yaoDataKbProvidersFetcherMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7111,7 +7111,7 @@ func yaoFieldsModelTransJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7131,7 +7131,7 @@ func yaoLangsEnUsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7151,7 +7151,7 @@ func yaoLangsZhCnGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7171,7 +7171,7 @@ func yaoLangsZhCnLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7191,7 +7191,7 @@ func yaoLangsZhCnLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7211,7 +7211,7 @@ func yaoLangsZhHkGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7231,7 +7231,7 @@ func yaoLangsZhHkLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7251,7 +7251,7 @@ func yaoLangsZhHkLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7271,7 +7271,7 @@ func yaoModelsAgentAssistantModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 7598, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 7598, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7291,7 +7291,7 @@ func yaoModelsAgentChatModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 3093, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 3093, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7311,7 +7311,7 @@ func yaoModelsAgentExecutionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/execution.mod.yao", size: 6651, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/execution.mod.yao", size: 6651, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7331,7 +7331,7 @@ func yaoModelsAgentMessageModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3712, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3712, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7351,7 +7351,7 @@ func yaoModelsAgentResumeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7371,7 +7371,7 @@ func yaoModelsAgentSearchModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/search.mod.yao", size: 3103, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/agent/search.mod.yao", size: 3103, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7391,7 +7391,7 @@ func yaoModelsAttachmentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7411,7 +7411,7 @@ func yaoModelsAuditModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7431,7 +7431,7 @@ func yaoModelsConfigModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7451,7 +7451,7 @@ func yaoModelsDslModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7471,7 +7471,7 @@ func yaoModelsInvitationModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7491,7 +7491,7 @@ func yaoModelsJobCategoryModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7511,7 +7511,7 @@ func yaoModelsJobExecutionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7531,7 +7531,7 @@ func yaoModelsJobJobModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6429, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6429, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7551,7 +7551,7 @@ func yaoModelsJobLogModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7571,7 +7571,7 @@ func yaoModelsKbCollectionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7591,12 +7591,12 @@ func yaoModelsKbDocumentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _yaoModelsMemberModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x5b\x6f\xdb\x38\xf6\x7f\xef\xa7\x38\xf0\x43\xe1\x00\x6e\x32\x33\xff\x7f\x5f\x02\xec\x43\x9a\xcc\xec\xa6\x68\xda\xa2\x49\xb1\x0f\x83\xc2\xa0\xa9\x63\x8b\x13\x8a\xd4\x90\x54\x12\xed\xa0\xdf\x7d\xc1\x8b\x24\xea\x62\x5b\x72\xdd\x4c\xb7\x4f\x35\xc5\xc3\x73\x7e\xe4\xb9\x93\xf9\xeb\x05\xc0\x4c\x90\x0c\x67\xe7\x30\xbb\xc1\x6c\x85\x6a\xb6\xb0\x63\x9c\xac\x90\x77\x07\x13\xd4\x54\xb1\xdc\x30\x29\xec\xa7\x0b\xad\x25\x65\xc4\xfe\x04\x43\x56\x1c\x61\x2d\x15\x18\x24\x19\x64\x8e\x4a\x03\x11\x09\x98\x14\x99\x02\x25\x39\x6a\xbf\x8c\x21\x1b\x3d\x3b\x87\xdf\x67\x76\xea\x6c\x01\xb3\x42\x5b\x0e\x30\x23\xcd\x82\xf6\x67\x58\x24\x65\xb9\xfd\xe5\x17\xf8\x12\x56\x58\x71\x2b\xb2\x15\x3f\x02\x90\x35\xb2\x02\xcc\xa8\xcc\x32\x14\xe6\x40\x49\x5f\x00\x7c\x75\xbc\xa8\xe4\x45\x26\x9c\xc0\x6e\xdd\xb3\x33\xf8\xc7\x11\xff\x55\x6b\xbe\x21\x9a\x51\xf8\x8d\x21\x4f\xf4\x77\xe3\xe3\xf7\x2b\xda\x31\x96\x84\xdd\xb2\x9b\x5a\xe6\x6e\xec\xfa\xaa\x19\xab\xd5\x20\x1e\x8c\x36\xf6\xa3\x62\x19\x51\x25\xdc\x63\x09\x2c\x41\x61\xd8\x9a\xd5\x27\x00\x30\xcb\xfd\xf7\xd9\x39\x18\x55\xa0\x1b\xfd\xba\x18\x16\xc5\x1f\xc4\x72\x48\x22\x6d\x14\x13\x9b\x01\xa9\xbc\x72\xc2\x16\xe1\xfe\xc9\xe5\x8a\x70\x28\x04\xfb\xb3\xc0\x70\xd0\x83\x52\x72\x14\x1b\x93\xce\xce\xe1\x97\xd7\xaf\xeb\x41\x4f\x16\x24\xaf\x47\x99\x48\xf0\x69\x0c\x1c\xab\x5c\xd3\xc0\xdc\x59\x75\xdc\x02\xc5\x7d\x6b\x44\x87\xb9\xc2\x35\x2a\x14\x14\xb5\x53\xe3\xd3\xc0\xee\x64\x0f\x28\x51\x70\x1e\x6c\x67\x4d\xb8\x3e\x00\x97\xb5\xd5\x69\xb8\x3e\xeb\xed\x47\xe4\xbe\x6d\xc1\x65\x39\x9d\x06\x76\x27\xf0\x0a\xac\xec\xce\x6e\x95\x5c\x49\x53\x19\xee\x78\xc0\x7b\xcf\xf1\x7b\x9a\x77\xd0\xd4\xbb\x32\x47\x78\x09\x97\x52\xac\xd9\xa6\x50\xce\x23\x3d\x9f\xb5\x07\x13\x73\x27\xd6\x3b\x3f\x14\x45\xb6\xdd\xc4\xee\x5a\x34\xb1\x66\x5a\x44\x72\x1d\x8e\xe3\xdc\x9d\x1a\xcc\xd3\x22\x23\xe2\x04\xea\xc3\x9a\x93\xc2\xc8\x8c\x18\x8c\x35\x54\x56\x91\xe4\xf7\x30\x02\x75\x28\x38\x3b\x83\x7f\xd9\x25\xfc\x72\x7e\xed\x66\x92\x5b\x73\x66\x27\x5d\x54\xcb\xb6\x94\x22\xcc\xfc\x52\x73\x4a\x70\x4d\x0a\x6e\x2a\xfd\x9d\x0d\xaa\xc1\x56\x23\x79\x46\xfd\xf8\xa8\xe4\x9a\x71\x0c\x71\x00\xe6\xd6\xee\x5f\xe9\x1c\x29\x5b\x33\x1a\x0c\xc5\x94\x27\x15\xd5\x6d\x4a\x14\x26\xb0\x2a\x61\x25\x4d\xea\x37\xcb\x06\xb2\x96\x85\x3c\x9f\x7e\x25\x4c\xe7\x9c\x94\x4b\xf7\x7b\xbc\x83\xb8\xf2\x64\xf0\xbe\x45\x16\xe9\x58\x35\xc1\xae\xeb\x23\x77\xca\x74\xe5\xd0\x1f\x99\x49\x99\xb0\xb1\xdb\x07\xf4\x39\x25\x02\x12\xb6\x5e\xa3\x82\xb5\x92\x99\xf7\x23\x35\xa9\xfd\xa5\x17\x61\x87\xea\x51\xf7\x53\x0f\x7a\xcf\x9f\x7e\x3a\xc8\x99\x0c\x6e\xd0\x8a\xc9\xfe\xbe\x18\x7c\x32\x03\xbb\xf2\x26\x9e\x1b\x87\x5c\x54\x5a\x0a\xc2\x61\xc5\xe4\x59\x94\x91\xed\xdf\x18\x8f\xb9\x4b\xd2\x83\xde\x41\xb9\x13\x10\x79\x20\x86\xa8\x09\x67\x7d\xd1\x21\x88\x93\x34\xf7\xe9\x8c\x51\x29\xe0\xf3\xa7\x77\x3d\x3c\x73\xdd\xd7\x76\xdd\xa8\xfb\xe0\xe9\xbd\xde\x7e\x7a\x3b\x71\x61\x46\x18\x9f\x00\xeb\xd7\xf6\xfc\x08\x95\xfb\x72\xa0\xd2\x3a\x29\x16\xf6\xff\x89\x5b\xc1\x2e\x5b\x08\x46\x7d\x22\xcb\x04\xe5\x45\xc2\xc4\x66\x97\xf6\xfe\x80\xa1\xf0\x93\xe4\x36\x06\x7e\x44\x95\x31\xad\x2d\x92\xe7\xce\x7a\x6d\x86\x3f\x2d\x87\x71\x32\xef\xca\x61\xec\x92\x03\x16\xd7\x64\x33\x76\xc2\x69\x60\x3c\xac\xa9\x47\x4c\xd2\x98\x5e\xca\x47\x81\x03\x86\xb9\x92\x92\x23\x11\x43\x19\xbe\x86\x0f\x6d\x9a\x08\xe3\xbf\x53\x34\x29\xb6\x75\x98\xe9\x06\xa9\xe3\x66\xf1\x26\x85\x48\x88\x30\xb0\xb6\x47\xea\x94\xf6\xcf\x02\x55\x09\x39\xaa\xb5\x54\x19\x11\x14\x9d\xc9\x7e\xbe\x86\x10\x2d\xa2\xcd\x68\xc2\xf4\x76\xdc\x7b\xa3\xf4\xe0\x86\x68\x43\x4c\xa1\x47\x27\x3d\xb7\x9d\xe9\xd1\x4e\xdc\xd4\x45\x29\x74\x17\x1d\xca\x67\x72\x14\x89\x53\x29\xab\xd9\xd7\xe2\x81\x19\x6f\xbc\x1a\x85\x59\x80\x90\x06\x08\xa5\x98\xdb\x0c\xa6\x44\xd3\xd0\x11\x6a\xd8\x03\x7a\xb2\x0b\xf7\xff\x5e\x16\xc4\x44\x3c\xe9\x0e\xb3\x5c\x2a\xa2\x18\x2f\xa1\xfa\xd2\xcc\xd5\x85\xb6\x92\x60\xe2\xb2\xa6\xdb\xea\x97\xf5\xa5\x24\xc9\x98\xd8\x95\x31\xd5\x10\x7e\xb8\xa4\xe9\x93\x0b\x68\xd7\x21\x2b\x82\x97\xde\xb5\x54\xb9\x93\x14\xbc\xec\xd7\x0b\x27\xcf\xe7\x66\x74\xa9\x0d\x66\xcb\x5c\xc9\x2c\x37\xa3\xe3\xfe\xad\xa3\xb2\x99\x60\x8b\x2a\x52\xc1\x08\xb0\x73\x3b\x9e\xc1\x19\x13\xda\xa8\x82\x5a\xf5\xd2\x3d\xdc\x30\x4f\x70\xcd\x84\x73\x44\x76\x34\x0f\x59\x84\x5d\xc6\xda\xe3\x0a\x53\xf2\xc0\xa4\x3a\x30\x0f\xc8\x88\x20\x9b\xa9\x85\xe1\x15\x53\x48\x0d\xdc\x78\xda\xed\xbe\xf5\xfa\xca\x16\x18\xd6\xd7\x24\x9e\x22\x70\x3b\xd3\x45\x8e\xea\x81\x69\xa9\x9a\x00\x1b\x83\xfe\x9f\x09\x88\x56\xe4\x56\x4d\xf8\xe3\x28\xb1\xe3\xbb\x9c\x9a\x0f\x79\x48\xdb\xb3\x22\xdf\x9a\xe1\x65\xd5\x9c\x71\xeb\x03\x49\x12\x85\x5a\x87\xc3\xc4\x80\xd9\x48\x50\x48\xd1\xba\x40\xab\xa9\x1a\x45\xe2\xe7\x1f\x5a\xfb\x7f\x63\x67\x87\x14\x26\x95\x8a\xfd\x07\x93\xa5\x95\xa5\xd5\x83\xa8\x36\xe6\x0f\x2d\x87\x62\xec\x45\x4d\x0a\xb7\x5d\xd2\x56\xb4\x65\x06\x39\xd3\xc6\xea\x7d\x6b\x6b\x50\x43\xc3\xde\xee\x8c\xdb\x8d\x96\xe5\x1b\x19\x19\xc2\x69\x50\xae\x47\xc6\x39\x28\xd4\xb9\x14\x8e\xcc\x6e\x24\x3e\x21\x2d\x0c\xba\xac\x92\x88\x44\xfb\xc4\xd3\xa4\xa8\x11\x02\x30\x70\xea\x37\x7f\x7b\xfb\xe1\x3d\x10\xa5\x5a\xc1\x7a\x72\x3a\xbd\x5c\x33\x6e\x50\x2d\x55\x51\x75\x82\xc7\x6c\x99\xcf\x9f\x7f\x73\xa4\xf0\xa9\x4d\xda\x4f\xb3\xdd\x34\x97\x12\xdb\x99\x30\xd7\x45\x9e\x4b\x65\x34\x28\xdc\xe0\x13\xe4\xc4\x18\x54\x42\x9f\xd8\x3d\x48\xd0\xd8\x14\x54\x20\x3c\xa6\x8c\xa6\x41\xa7\xba\xea\x96\x2b\x49\x51\xeb\x53\xb8\x24\x55\xca\x8d\x90\xc8\x8c\x30\x51\x2f\xb7\xa8\x35\xb7\x19\x41\x43\x4f\x8f\xb0\x73\xde\xfc\xa8\xf3\x0d\xa3\xf7\x6c\xc0\xa1\x0c\x6e\x9a\x9b\xd7\xb4\x17\x68\xcb\x03\x35\xe5\x45\x15\x1b\x40\xa3\x31\x4c\x6c\xf4\x02\x34\x4d\x31\x29\x38\x13\x9b\x05\xb8\x5c\xc3\xc6\x91\x68\x3b\x44\x02\x94\xe4\x64\xc5\x38\x33\x2c\x3e\xb2\x49\xc5\xe5\x06\x85\x99\x60\x5c\xd4\x1e\x14\x5b\x71\x84\x8b\x0e\x65\x84\xf9\x5d\x30\x2b\x12\xcd\xbe\x06\xcf\x0a\xe6\x79\xb1\xe2\x8c\x82\xb6\x61\x85\x22\xbc\xff\x78\x69\x75\x25\x25\x26\xf8\x22\xea\x94\xc0\xa0\x22\xd4\xb8\x74\xff\xc0\x70\x49\xf3\xa5\xe5\x31\xc5\x77\xdc\x5c\x7e\x84\xdb\x2e\xcd\x6e\x60\x96\x24\xb0\x81\xb9\xcf\x46\x9c\xf4\x1b\xe5\x5a\x66\xc1\xf0\xab\x29\x07\x6a\x28\x27\x62\x53\x90\x0d\x2e\x33\x99\xe0\x94\x18\xf1\x2e\x10\xc2\x4d\x9b\x30\xc6\x54\x4d\x71\x6b\xfb\x42\x78\x55\x46\xb1\x61\x8e\xa7\x9b\xd3\x05\x6c\x72\xf3\xea\xff\x17\x40\x39\x29\x12\x7c\xf5\x7f\xaf\x64\x5e\x0c\x96\xc3\x3f\x1f\xd8\x0e\xa0\x52\x9b\x25\x67\x19\x1b\x48\xe3\x12\xa4\x2c\x23\x7c\x00\xe0\xa5\xd4\x06\xde\x59\x2a\x98\x7f\xbe\xbd\x3a\xcb\xa4\x30\xe9\xc9\x70\x55\x61\x3f\xf1\x12\x2c\x23\x70\x8c\x80\x09\xf8\x7c\x7b\x15\xc5\x7e\x99\xa3\x37\x4d\x1d\xdf\xaf\x20\x65\xda\x57\x1d\x3f\x37\xd8\x34\x25\x0e\xd8\x2f\x87\xd9\x5d\x61\xa4\x90\x99\x2c\xb4\x3b\xd3\x29\x45\xe4\x45\x4d\xea\x4e\x75\x67\x2d\xd9\x58\x94\x47\x86\xd0\x30\xe6\x3e\x2b\x0d\x55\x23\xd4\xdd\x63\x30\x44\xdf\xeb\x69\x15\xe3\xf3\xa5\x70\x17\x95\x27\x7c\x09\xbe\x82\x84\x3b\x45\xe8\x3d\x13\x9b\xe7\xcb\xd7\x38\xd1\x66\xe9\xa3\x46\xe5\x98\x07\x4a\x0f\x96\xa1\x36\x24\xcb\x07\xcd\x52\x9b\x0e\x9e\x6d\xc7\x28\x22\x4b\xb4\x7c\xab\xf3\xc2\x04\x88\x88\x0e\xad\x2f\xc8\x37\x77\x52\x3d\xc2\x89\x65\xbd\x47\xb5\xa3\xb8\xbf\x2c\x94\x42\x11\x99\x1a\xe1\xa1\xca\xb7\x9e\x75\xb8\xb4\x18\xaa\xfa\x59\xc2\x43\x59\xee\x59\x32\x0d\x76\x68\x01\x8f\x84\xd9\x08\xea\x33\x5c\xab\xca\x0d\xcd\xa3\x54\xf7\x75\xa7\xa0\x26\xa3\x5e\x22\x5e\x86\x74\xcd\x12\x77\x08\x73\x62\xfd\x62\x87\xce\x44\xed\x00\x3f\xa1\x21\x40\xa5\xa4\x8a\xe7\xa3\xa0\xb2\xb0\x51\xcd\x1f\x9c\xfb\xde\x4c\xb7\xa9\x8e\x41\x41\x04\xc5\x59\x8b\x47\x61\x73\x44\x88\x3e\xef\xea\x22\xf8\x2d\x19\xdb\x42\x78\x2e\xbb\x8d\x3a\x32\x2f\xe1\xad\x64\x02\xae\x85\xeb\x53\x3d\xef\xc5\x1c\xab\xc5\x98\x56\x41\x47\xe2\x6f\x6b\x4e\xfa\xfa\xaa\x61\x10\xdf\xb6\x5a\x2d\x0c\xdd\x9d\x68\x86\x86\xf9\xaa\xd0\x4c\xd8\x7c\xf6\xda\x07\xa0\xe8\xe3\xc4\xb0\x7a\xac\xa2\xcb\x49\x80\xc9\x72\x35\xe0\xcd\x76\x6f\x0f\x26\xf0\x66\xd8\x83\x55\xcd\x85\xc7\xd4\xd5\x51\xc6\x79\xb3\x06\xea\xb4\xea\x72\x94\xf4\x64\xa8\x0d\xb4\xc3\x17\x57\x00\x2e\x86\x1b\x41\xb5\x0b\x8e\x8e\xf7\x91\x68\x07\xe6\x88\xbe\xf6\x0f\xc9\xc4\x01\xc2\xbf\x75\x64\x7b\x65\xf7\x97\x96\x55\x13\xd4\x46\x7d\xcf\xaf\x6e\x2e\x1f\x11\x49\x64\x67\x46\xde\xa3\x38\xcc\xd4\xee\xda\xa4\x7d\x6b\x73\x6b\x77\x0c\x27\x40\x74\x5e\xf4\xef\xb3\x20\x8f\x1d\x9f\x72\xa6\x50\x1f\xa6\x8e\x1e\xcd\xaf\x7e\x89\x29\x9a\x19\xb8\xee\xad\x32\xbe\xa7\xbf\xaf\x33\xb4\xbf\x29\x31\xf3\x7d\xf9\xc9\x1b\xef\x72\xb2\x70\x0d\x30\xca\x9e\xac\x17\x70\x19\x99\x67\x08\xee\x56\x8a\xe9\x63\xdb\x13\x97\x1b\x26\x96\x2e\x79\xe8\x03\x72\x95\x66\xab\x09\x5b\xc3\xb1\x64\x70\xd9\x26\x8b\xb0\xbc\x2f\x5c\xcb\x5a\xae\xc1\x6d\x8a\x87\x94\x12\x1d\x6a\x5b\xe7\x1b\x7a\x60\x9a\x5c\x63\x6f\x8d\xf7\x3d\x35\xec\x06\x0d\x49\x88\x21\xcf\xa7\x58\x42\x9a\xa1\x7e\xda\x96\xeb\x85\xf7\xed\xd9\xf1\xb5\x82\xcd\x00\x6d\xc6\xeb\x16\x04\xb2\x92\x85\x89\x2f\xfc\xfc\x43\xcc\x43\xc2\x5f\x16\xf6\x64\x7c\xaf\xa3\x47\x10\xbf\x13\x48\x12\x16\x72\xf3\x6a\xe1\xee\xfd\xfa\x08\x51\x5f\x84\x3c\xd5\x2b\x3b\x36\xef\x3b\x07\xde\x48\x3e\x2d\xdd\xf3\x3a\xf7\x16\x2d\x78\xe1\x48\xb0\xfa\x79\x68\xf3\xe6\xaf\x79\x26\xf7\xa5\x07\xb9\xbf\x40\x37\x7c\x50\x29\xb4\x51\x36\xad\x3e\x07\x29\x82\x45\xdb\x3a\x39\x25\x0f\xe8\x5b\xb2\x76\xb8\x81\x6a\xeb\x2e\x6f\x0d\xbb\x23\x40\x05\x24\x0a\x05\x23\xe1\xb4\x13\xd4\x63\x80\x6a\xad\x58\x03\x80\xf9\x96\x9c\xf4\x64\x24\x34\xec\x5e\x39\x0c\xc2\xf1\xb3\xfa\x30\xbc\xe3\x1b\x36\x8e\x04\x9f\x9a\xfb\x6c\x2b\x5d\xf5\x72\x78\x55\x86\x1e\x7d\x75\xfd\xef\x70\xf8\x21\xe6\x2f\x33\xc2\x55\xb7\x3b\xbb\xb1\x48\xa2\xc7\x7a\x4b\x25\xf9\xfe\x33\x6a\xbd\xee\x8b\x1e\x39\xd4\xb7\xdf\x87\xe1\x5d\x33\x7f\x18\x11\x5c\x4b\xbe\xf0\x77\x8f\xae\x7f\xe8\x2b\xe4\x08\xfe\x48\x88\xb2\xfb\xde\x60\x58\xf7\xaa\xc7\x0c\x87\x9e\x17\xa3\xf7\xbc\xac\x71\x34\xef\x15\xf6\x4b\xe9\xac\xd8\x12\xe8\x61\x29\xeb\xc7\xb0\xbd\xdd\xaf\x3a\x13\xcd\x39\x7c\xdb\xee\x13\xce\x9d\xe4\x5e\x9f\x88\xf7\x09\xab\xb2\xba\xdd\x75\x4b\xee\x85\xe3\x9b\x26\xbd\x87\xb3\x31\xa2\x0e\x8c\x5e\x2b\xb0\xd3\x79\xf9\x46\x50\x3e\x39\x69\xbf\xe7\x1d\x89\xa2\xdf\x53\xda\x01\x63\xb0\x29\xd6\x47\x77\x18\x1a\x2f\x7e\x7d\x0b\xd2\x5c\x8d\x8c\x85\xe2\x4c\xbc\xdb\xca\xda\x81\xa6\xdd\xfb\x3a\x16\x8c\xea\x50\x5a\xa7\x61\x55\x2c\x30\x1a\x09\x66\xf8\x0d\xe8\x0e\x34\x2d\x82\x23\x8b\x9e\x44\x0f\x47\x47\x9b\x47\xff\x39\x42\x24\x7b\xf4\xce\xa1\x6d\xf3\x47\x90\xdc\x89\x5c\xb1\x9f\x1a\xc9\xb7\xa8\x4e\xe4\x47\x1b\x85\x89\xda\x11\x87\x89\xed\x84\xec\x44\xe8\xfd\x12\x6f\xe9\x72\xc5\xe2\x76\xa6\xf4\x84\xee\xd5\xaf\x87\xc9\xcf\xe2\xbe\x19\x70\x29\xef\x8b\x3c\x0a\x65\x93\xa0\x98\x6e\x37\x60\x10\x4d\x98\xf5\xdd\x60\xf8\x96\x43\x84\xc4\x2d\xee\xfb\x58\xe3\x54\x69\xb7\x43\x8d\xf4\xa8\x53\xc8\x1e\x26\xba\x8b\xc2\xb5\xcf\x34\xa1\x1a\x1f\x29\xea\x7e\x1f\x13\x89\x7b\x04\xff\xa2\x91\x28\x9a\x76\x92\xa0\xd8\xb7\x0c\xe4\x3e\x75\x7d\xa1\x90\x07\x03\xa9\xff\x5e\xcd\x4d\x3b\x6f\x00\x56\xb2\xa4\x44\x7f\x10\x11\x22\x7f\xa3\x7a\x0e\xb3\xe5\xb2\x24\xf2\xb4\x5d\xef\xde\x63\x39\x1b\xfa\x3b\xa3\xb5\x54\xc8\x36\x22\xfe\x16\xef\xaa\xff\x03\x88\xe9\xcc\xdb\x7f\x37\x11\x98\xf7\xfe\x18\x28\x62\x5e\x7d\x6b\x31\xf7\x9e\xe7\x68\xfc\x87\xba\xc2\xfb\x44\x70\xb9\xf4\x74\xfe\xed\x14\x3c\xf0\xef\x3d\x24\x8e\x98\x57\xdf\x6a\x75\xf0\x7f\x4e\xf8\x40\x78\xe1\xab\x4d\xaf\x1e\xf5\xf5\xd1\x5f\x51\x0b\x48\x57\x1d\x19\x98\x69\xb9\x36\xcb\x04\x39\x1a\x8c\x46\xf3\xfa\xf1\x74\x18\x83\xaf\x2f\xbe\xbe\xf8\x6f\x00\x00\x00\xff\xff\xe2\x64\xd3\xe6\xce\x39\x00\x00") +var _yaoModelsMemberModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x4b\x6f\x1b\xb7\xf6\xdf\xe7\x53\x1c\x68\x11\xc8\x80\x62\xb7\xfd\xff\xbb\x31\xd0\x85\x63\xb7\xf7\x3a\x88\x93\x20\x76\xd0\x45\x11\x08\x1c\xce\x91\x86\x35\x87\x9c\x92\x1c\xdb\xba\x45\xbe\xfb\x05\x1f\x33\xc3\x79\x48\x9a\x51\x14\x37\x37\xab\x88\xc3\xc3\x73\x7e\xe4\x79\x93\xfe\xfb\x05\xc0\x4c\x90\x1c\x67\xe7\x30\xbb\xc1\x3c\x41\x35\x5b\xd8\x31\x4e\x12\xe4\xdd\xc1\x14\x35\x55\xac\x30\x4c\x0a\xfb\xe9\x42\x6b\x49\x19\xb1\x3f\xc1\x90\x84\x23\xac\xa4\x02\x83\x24\x87\xdc\x51\x69\x20\x22\x05\x93\x21\x53\xa0\x24\x47\xed\x97\x31\x64\xad\x67\xe7\xf0\xc7\xcc\x4e\x9d\x2d\x60\x56\x6a\xcb\x01\x66\xa4\x59\xd0\xfe\x0c\x8b\x64\xac\xb0\xbf\xfc\x02\x9f\xc3\x0a\x09\xb7\x22\x5b\xf1\x23\x00\x79\x23\x2b\xc0\x8c\xca\x3c\x47\x61\x0e\x94\xf4\x05\xc0\x17\xc7\x8b\x4a\x5e\xe6\xc2\x09\xec\xd6\x3d\x3b\x83\x5f\x8e\xf8\xaf\x5a\xf3\x35\xd1\x8c\xc2\x6f\x0c\x79\xaa\xbf\x19\x1f\xbf\x5f\xd1\x8e\xb1\x34\xec\x96\xdd\xd4\x4d\xe1\xc6\xae\xaf\x9a\xb1\x5a\x0d\xe2\xc1\x68\x63\x3f\x28\x96\x13\xb5\x81\x7b\xdc\x00\x4b\x51\x18\xb6\x62\xf5\x09\x00\xcc\x0a\xff\x7d\x76\x0e\x46\x95\xe8\x46\xbf\x2c\x86\x45\xf1\x07\xb1\x1c\x92\x48\x1b\xc5\xc4\x7a\x40\x2a\xaf\x9c\xb0\x45\xb8\x7f\x71\x99\x10\x0e\xa5\x60\x7f\x95\x18\x0e\x7a\x50\x4a\x8e\x62\x6d\xb2\xd9\x39\xfc\xf4\xf3\xcf\xf5\xa0\x27\x0b\x92\xd7\xa3\x4c\xa4\xf8\x34\x06\x8e\x55\xae\x69\x60\xee\xac\x3a\x6e\x81\xe2\xbe\x35\xa2\xc3\x5c\xe1\x0a\x15\x0a\x8a\xda\xa9\xf1\x69\x60\x77\xb2\x07\x94\x28\x39\x0f\xb6\xb3\x22\x5c\x1f\x80\xcb\xda\xea\x34\x5c\x9f\xf4\xf6\x23\x72\xdf\xb6\xe0\xb2\x9c\x4e\x03\xbb\x13\x78\x05\x56\x76\x67\xb7\x4a\x26\xd2\x54\x86\x3b\x1e\xf0\xde\x73\xfc\x96\xe6\x1d\x34\xf5\x6e\x53\x20\xbc\x84\x4b\x29\x56\x6c\x5d\x2a\xe7\x91\x9e\xcf\xda\x83\x89\xb9\x13\xeb\x9d\x1f\x8a\x32\xdf\x6e\x62\x77\x2d\x9a\x58\x33\x2d\x22\xb9\x0a\xc7\x71\xee\x4e\x0d\xe6\x59\x99\x13\x71\x02\xf5\x61\xcd\x49\x69\x64\x4e\x0c\xc6\x1a\x2a\xab\x48\xf2\x47\x18\x81\x3a\x14\x9c\x9d\xc1\xbf\xed\x12\x7e\x39\xbf\x76\x33\xc9\xad\x39\xb3\x93\x2e\xaa\x65\x5b\x4a\x11\x66\x7e\xae\x39\xa5\xb8\x22\x25\x37\x95\xfe\xce\x06\xd5\x60\xab\x91\x3c\xa3\x7e\x7c\x50\x72\xc5\x38\x86\x38\x00\x73\x6b\xf7\xaf\x74\x81\x94\xad\x18\x0d\x86\x62\x36\x27\x15\xd5\x6d\x46\x14\xa6\x90\x6c\x20\x91\x26\xf3\x9b\x65\x03\x59\xcb\x42\x9e\x4f\xbf\x52\xa6\x0b\x4e\x36\x4b\xf7\x7b\xbc\x83\xb8\xf2\x64\xf0\xae\x45\x16\xe9\x58\x35\xc1\xae\xeb\x23\x77\xc6\x74\xe5\xd0\x1f\x99\xc9\x98\xb0\xb1\xdb\x07\xf4\x39\x25\x02\x52\xb6\x5a\xa1\x82\x95\x92\xb9\xf7\x23\x35\xa9\xfd\xa5\x17\x61\x87\xea\x51\xf7\x53\x0f\x7a\xcf\x1f\x7e\x38\xc8\x99\x0c\x6e\x50\xc2\x64\x7f\x5f\x0c\x3e\x99\x81\x5d\x79\x1d\xcf\x8d\x43\x2e\x2a\x2d\x05\xe1\x90\x30\x79\x16\x65\x64\xfb\x37\xc6\x63\xee\x92\xf4\xa0\x77\x50\xee\x04\x44\x1e\x88\x21\x6a\xc2\x59\x5f\x74\x08\xe2\x24\xcd\x7d\x3a\x63\x54\x0a\xf8\xf4\xf1\x6d\x0f\xcf\x5c\xf7\xb5\x5d\x37\xea\x3e\x78\x7a\x3f\x6f\x3f\xbd\x9d\xb8\x30\x27\x8c\x4f\x80\xf5\x6b\x7b\x7e\x84\xca\x7d\x39\x50\x69\x9d\x14\x0b\xfb\xff\xd4\xad\x60\x97\x2d\x05\xa3\x3e\x91\x65\x82\xf2\x32\x65\x62\xbd\x4b\x7b\xbf\xc3\x50\xf8\x51\x72\x1b\x03\x3f\xa0\xca\x99\xd6\x16\xc9\x73\x67\xbd\x36\xc3\x9f\x96\xc3\x38\x99\x77\xe5\x30\x76\xc9\x01\x8b\x6b\xb2\x19\x3b\xe1\x34\x30\x1e\xd6\xd4\x23\x26\x69\x4c\x2f\xe5\xa3\xc0\x01\xc3\x4c\xa4\xe4\x48\xc4\x50\x86\xaf\xe1\x7d\x9b\x26\xc2\xf8\x7b\x86\x26\xc3\xb6\x0e\x33\xdd\x20\x75\xdc\x2c\xde\xb4\x14\x29\x11\x06\x56\xf6\x48\x9d\xd2\xfe\x55\xa2\xda\x40\x81\x6a\x25\x55\x4e\x04\x45\x67\xb2\x9f\xae\x21\x44\x8b\x68\x33\x9a\x30\xbd\x1d\xf7\xde\x28\x3d\xb8\x21\xda\x10\x53\xea\xd1\x49\xcf\x6d\x67\x7a\xb4\x13\x37\x75\x51\x0a\xdd\x45\x87\xf2\x99\x02\x45\xea\x54\xca\x6a\xf6\xb5\x78\x60\xc6\x1b\xaf\x46\x61\x16\x20\xa4\x01\x42\x29\x16\x36\x83\xd9\xa0\x69\xe8\x08\x35\xec\x01\x3d\xd9\x85\xfb\x7f\x2f\x0b\x62\x22\x9e\x74\x87\x79\x21\x15\x51\x8c\x6f\xa0\xfa\xd2\xcc\xd5\xa5\xb6\x92\x60\xea\xb2\xa6\xdb\xea\x97\xf5\xa5\x24\xcd\x99\xd8\x95\x31\xd5\x10\xbe\xbb\xa4\xe9\xa3\x0b\x68\xd7\x21\x2b\x82\x97\xde\xb5\x54\xb9\x93\x14\x7c\xd3\xaf\x17\x4e\x9e\xcf\xcd\xe8\x8d\x36\x98\x2f\x0b\x25\xf3\xc2\x8c\x8e\xfb\xb7\x8e\xca\x66\x82\x2d\xaa\x48\x05\x23\xc0\xce\xed\x78\x06\x67\x4c\x68\xa3\x4a\x6a\xd5\x4b\xf7\x70\xc3\x3c\xc5\x15\x13\xce\x11\xd9\xd1\x22\x64\x11\x76\x19\x6b\x8f\x09\x66\xe4\x81\x49\x75\x60\x1e\x90\x13\x41\xd6\x53\x0b\xc3\x2b\xa6\x90\x1a\xb8\xf1\xb4\xdb\x7d\xeb\xf5\x95\x2d\x30\xac\xaf\x49\x3d\x45\xe0\x76\xa6\xcb\x02\xd5\x03\xd3\x52\x35\x01\x36\x06\xfd\x3f\x13\x10\xad\xc8\xad\x9a\xf0\xfb\x51\x62\xc7\x77\x39\x35\x1f\xf2\x90\xb6\x67\x45\xbe\x35\xc3\x37\x55\x73\xc6\xad\x0f\x24\x4d\x15\x6a\x1d\x0e\x13\x03\x66\x23\x41\x21\x45\xeb\x02\xad\xa6\x6a\x14\xa9\x9f\x7f\x68\xed\xff\x95\x9d\x1d\x52\x9a\x4c\x2a\xf6\x1f\x4c\x97\x56\x96\x56\x0f\xa2\xda\x98\x3f\xb5\x1c\x8a\xb1\x17\x35\x29\xdc\x76\x49\x5b\xd1\x96\x19\xe4\x4c\x1b\xab\xf7\xad\xad\x41\x0d\x0d\x7b\xbb\x33\x6e\x37\x5a\x96\x6f\x64\x64\x08\xa7\x41\xb9\x1e\x19\xe7\xa0\x50\x17\x52\x38\x32\xbb\x91\xf8\x84\xb4\x34\xe8\xb2\x4a\x22\x52\xed\x13\x4f\x93\xa1\x46\x08\xc0\xc0\xa9\xdf\xfc\xcd\xed\xfb\x77\x40\x94\x6a\x05\xeb\xc9\xe9\xf4\x72\xc5\xb8\x41\xb5\x54\x65\xd5\x09\x1e\xb3\x65\x3e\x7f\xfe\xcd\x91\xc2\xc7\x36\x69\x3f\xcd\x76\xd3\x5c\x4a\x6c\x67\xc2\x5c\x97\x45\x21\x95\xd1\xa0\x70\x8d\x4f\x50\x10\x63\x50\x09\x7d\x62\xf7\x20\x45\x63\x53\x50\x81\xf0\x98\x31\x9a\x05\x9d\xea\xaa\x5b\xa1\x24\x45\xad\x4f\xe1\x92\x54\x29\x37\x42\x2a\x73\xc2\x44\xbd\xdc\xa2\xd6\xdc\x66\x04\x0d\x3d\x3d\xc2\xce\x79\xf3\xa3\xce\x37\x8c\xde\xb3\x01\x87\x32\xb8\x69\x6e\x5e\xd3\x5e\xa0\x2d\x0f\xd4\x94\x17\x55\x6c\x00\x8d\xc6\x30\xb1\xd6\x0b\xd0\x34\xc3\xb4\xe4\x4c\xac\x17\xe0\x72\x0d\x1b\x47\xa2\xed\x10\x29\x50\x52\x90\x84\x71\x66\x58\x7c\x64\x93\x8a\xcb\x35\x0a\x33\xc1\xb8\xa8\x3d\x28\x96\x70\x84\x8b\x0e\x65\x84\xf9\x6d\x30\x2b\x12\xcd\xbe\x06\xcf\x0a\xe6\x45\x99\x70\x46\x41\xdb\xb0\x42\x11\xde\x7d\xb8\xb4\xba\x92\x11\x13\x7c\x11\x75\x4a\x60\x50\x11\x6a\x5c\xba\x7f\x60\xb8\xa4\xc5\xd2\xf2\x98\xe2\x3b\x6e\x2e\x3f\xc0\x6d\x97\x66\x37\x30\x4b\x12\xd8\xc0\xdc\x67\x23\x4e\xfa\xb5\x72\x2d\xb3\x60\xf8\xd5\x94\x03\x35\x94\x13\xb1\x2e\xc9\x1a\x97\xb9\x4c\x71\x4a\x8c\x78\x1b\x08\xe1\xa6\x4d\x18\x63\xaa\xa6\xb8\xb5\x7d\x21\x9c\x6c\xa2\xd8\x30\xc7\xd3\xf5\xe9\x02\xd6\x85\x79\xf5\xff\x0b\xa0\x9c\x94\x29\xbe\xfa\xbf\x57\xb2\x28\x07\xcb\xe1\x1f\x0f\x6c\x07\x3c\x4a\x75\xaf\x0b\x42\xa7\x74\xb5\x7e\xef\xd3\xc4\x2e\xbe\xfa\x6a\xb3\x9b\x44\x96\xde\x2d\xf7\x32\x18\x98\x57\x62\xc2\x2f\xae\x5a\x70\x53\x8f\x59\xe9\x0f\xe2\xa5\x52\x9b\x25\x67\x39\x1b\x48\x5b\x53\xa4\x2c\x27\x7c\x00\xf1\xa5\xd4\x06\xde\x5a\x2a\x98\x7f\xba\xbd\x3a\xcb\xa5\x30\xd9\xc9\x70\x15\x65\x3f\xf1\x0d\x58\x46\xe0\x18\x01\x13\xf0\xe9\xf6\x2a\xca\x75\x64\x81\xde\x15\xe9\xf8\x3e\x09\x29\xd3\xbe\xca\xfa\xb1\x39\x4b\x4d\x89\x43\xfb\xd3\x61\x7e\xa6\x34\x52\xc8\x5c\x96\xda\xe9\xf0\x94\xa2\xf9\xa2\x26\x75\x5a\xbc\xb3\x76\x6e\x3c\x88\x47\x86\xd0\x30\xe6\x3e\x0b\x0f\x55\x32\xd4\xdd\x72\x30\x44\xdf\xeb\x69\x15\xf2\xf3\xa5\xac\x17\x95\xe7\x7f\x09\xbe\x62\x86\x3b\x45\xe8\x3d\x13\xeb\xe7\xcb\x4f\x39\xd1\x66\xe9\xa3\x64\x15\x88\x06\x4a\x2d\x96\xa3\x36\x24\x2f\x06\xdd\x90\x36\x1d\x3c\xdb\x8e\x51\x44\x9e\xc7\xf2\xad\xce\x0b\x53\x20\x22\x3a\xb4\xbe\x20\x5f\x6d\x91\x1e\xe1\xc4\x36\x86\x47\xb5\xa3\x99\x71\x59\x2a\x85\x22\x32\x35\xc2\x43\x57\xc3\x46\x92\xe1\x52\x6a\xa8\xcb\xc1\x52\x1e\xda\x10\x9e\x25\xd3\x60\x87\x16\xf0\x48\x98\xcd\x18\x7c\x46\x6f\x55\xb9\xa1\xb1\x3e\xb5\xee\x8c\xd4\x64\xd4\x4b\xc4\x37\x21\x3d\xb5\xc4\x1d\xc2\x82\xd8\x38\xd0\xa1\x33\x51\xfb\xc3\x4f\x68\x08\x50\x29\xa9\xe2\xf9\x28\xa8\x2c\x6d\x14\xf7\x07\xe7\xbe\x37\xd3\x6d\x6a\x67\x50\x10\x41\x71\xd6\xe2\x51\xda\x9c\x18\xa2\xcf\xbb\xba\x26\x7e\x4b\xc6\xb6\x4c\x9e\xcb\x6e\xa3\x0e\xd4\x4b\x78\x23\x99\x80\x6b\xe1\xfa\x72\xcf\x7b\x11\xc9\x6a\x31\xa6\x75\x0c\x22\xf1\xb7\x35\x63\x7d\x3d\xd9\x30\x88\x6f\x97\xad\x16\x86\x6e\x56\x34\x43\xc3\x3c\x29\x35\x13\x36\x7f\xbf\xf6\x01\x28\xfa\x38\x31\x8d\x38\x56\x91\xe9\x24\xc0\x74\x99\x0c\x78\xb3\xdd\xdb\x83\x29\xbc\x1e\xf6\x60\x55\x33\xe5\x31\x73\x75\xa3\x71\xde\xac\x81\x3a\x2d\xa9\x18\x25\x3d\x19\x6a\x7b\xed\xf0\xc5\x15\x80\x8b\xe1\xc6\x57\xed\x82\xa3\xe3\x7d\x24\xda\x81\x39\xa2\xaf\xfd\x53\x32\x71\x80\xf0\x6f\x1c\xd9\x5e\xd9\xfd\x25\x6d\xd5\xf4\xb5\x51\xdf\xf3\xab\x9b\xe9\x47\x44\x12\xd9\x99\x91\xf7\x28\x0e\x33\xb5\xbb\x36\x69\xdf\xda\xdc\xda\x1d\xc3\x09\x10\x9d\x17\xfd\xe7\x2c\xc8\x63\xc7\xa7\x82\x29\xd4\x87\xa9\xa3\x47\xf3\xab\x5f\x62\x8a\x66\x06\xae\x7b\xab\xaa\x6f\xe9\xef\xeb\x0c\xed\x1f\x4a\xcc\xfc\x3d\xc4\xe4\x8d\x77\x39\x59\xb8\xf6\x18\x65\x4f\xd6\x0b\xb8\x8c\xcc\x33\x04\x77\x0b\xc7\xf4\xb1\xed\x89\xcb\x35\x13\x4b\x97\x3c\xf4\x01\xb9\xca\xba\xd5\x74\xae\xe1\x58\x32\xb8\x6c\x93\x45\x58\xde\x95\xae\xd6\x93\x2b\x70\x9b\xe2\x21\x65\x44\x87\x5a\xde\xf9\x86\x1e\x98\x26\xd7\xd8\x5b\xd3\x7e\x4b\x0d\xbb\x41\x43\x52\x62\xc8\xf3\x29\x96\x90\x66\xa8\x7f\xb8\xe5\x3a\xe5\x5d\x7b\x76\x7c\x8d\x62\x33\x40\x9b\xf1\xba\x05\x81\x24\xb2\x34\xf1\x05\xa7\x7f\x78\x7a\x48\xf8\xcb\xc3\x9e\x8c\xef\xed\xf4\x08\xe2\x77\x11\x69\xca\x42\x6e\x5e\x2d\xdc\x7d\x4f\x30\x42\xd4\x17\x21\x4f\xf5\xca\x8e\xcd\x7b\xd6\x81\x37\xa1\x4f\x4b\xf7\x9c\xd0\xbd\xbd\x0b\x5e\x38\x12\xac\x7e\x0e\xdb\xbc\x71\x6c\x9e\x05\x7e\xee\x41\xee\x2f\xd0\x0d\x1f\x54\x0a\x6d\x94\x4d\xab\xcf\x41\x8a\x60\xd1\xb6\x4e\xce\xc8\x03\xfa\x16\xb4\x1d\x6e\xa0\xda\xba\xcb\x5b\xc3\xee\x08\x50\x01\x89\x42\xc1\x48\x38\xed\x04\xf5\x18\xa0\x5a\x2b\xd6\x00\x60\xbe\x25\x27\x3d\x19\x09\x0d\xbb\x57\x2c\x83\x70\xfc\xac\x3e\x0c\xef\xf8\x86\x8d\x23\xc5\xa7\xe6\xfe\xde\x4a\x57\xbd\x94\x4e\x36\xe1\x4e\xa2\x7a\xee\xe0\x70\xf8\x21\xe6\x2f\x6f\xc2\xd5\xbe\x3b\xbb\xb1\x48\xa2\xc7\x89\x4b\x25\xf9\xfe\x33\x6a\xbd\x66\x8c\x1e\x75\xd4\xb7\xfd\x87\xe1\x5d\x31\x7f\x18\x11\x5c\x4b\xbe\xf0\x77\xad\xae\x5f\xea\x2b\xe4\x08\xfe\x48\x88\xb2\xfb\xbe\x62\x58\xf7\xaa\xc7\x1b\x87\x9e\x17\xa3\xf7\x7c\x53\xe3\x68\xde\x67\xec\x97\xd2\x59\xb1\x25\xd0\xc3\x52\xd6\x8f\x7f\x7b\xbb\x5f\x75\x26\x9a\x73\xf8\xba\xdd\x27\x9c\x3b\xc9\xbd\x3e\x11\xef\x13\x92\x4d\xd5\x16\x75\x4b\xee\x85\xe3\x9b\x26\xbd\x87\xc2\x31\xa2\x0e\x8c\x5e\x2b\xb0\xd3\x79\xf9\x4a\x50\x3e\x39\x69\xbf\x5f\x1e\x89\xa2\xdf\x53\xda\x01\x63\xb0\x29\xd6\x47\x77\x18\x1a\x2f\x7e\x7d\xeb\xd3\x5c\x05\x8d\x85\xe2\x4c\xbc\xdb\xca\xda\x81\xa6\xdd\xfb\x3a\x16\x8c\xea\x50\x5a\xa7\x61\x55\x2c\x30\x1a\x09\x66\xf8\xcd\xeb\x0e\x34\x2d\x82\x23\x8b\x9e\x46\x0f\x65\x47\x9b\x47\xff\xf9\x45\x24\x7b\xf4\xae\xa3\x6d\xf3\x47\x90\xdc\x89\x5c\xb1\x9f\x1a\xc9\xb7\xa8\x4e\xe4\x47\x1b\x85\x89\xda\x11\x87\x89\xed\x84\xec\x44\xe8\xfd\x12\x6f\xe9\x72\xc5\xe2\x76\xa6\xf4\x84\xee\xd5\xaf\x87\xc9\xcf\xe2\xbe\x19\x70\x29\xef\xcb\x22\x0a\x65\x93\xa0\x98\x6e\x37\x60\x10\x4d\x98\xf5\xcd\x60\xf8\x96\x43\x84\xc4\x2d\xee\xfb\x58\xe3\x54\x69\xb7\x43\x8d\xf4\xa8\x53\xc8\x1e\x26\xba\x8b\xc2\xb5\xcf\x34\xa1\x1a\x1f\x29\xea\x7e\x1f\x13\x89\x7b\x04\xff\xa2\x91\x28\x9a\x75\x92\xa0\xd8\xb7\x0c\xe4\x3e\x75\x7d\xa1\x90\x07\x03\xa9\xff\x3e\xcf\x4d\x3b\x6f\x00\x56\xb2\x64\x44\xbf\x17\x11\x22\x7f\x83\x7c\x0e\xb3\xe5\x72\x43\xe4\x69\xbb\xde\xbd\xc7\xcd\x6c\xe8\xef\xaa\x56\x52\x21\x5b\x8b\xf8\x5b\xbc\xab\xfe\x0f\x3e\xa6\x33\x6f\xff\x9d\x48\x60\xde\xfb\xe3\xa7\x88\x79\xf5\xad\xc5\xdc\x7b\x9e\xa3\xf1\x1f\xea\x0a\xef\x13\xc1\xe5\xd2\xd3\xf9\xb7\x53\xf0\xc0\xbf\xf7\x70\x3a\x62\x5e\x7d\xab\xd5\xc1\xff\xf9\xe4\x03\xe1\xa5\xaf\x36\xbd\x7a\xd4\xd7\x47\x7f\x47\x2d\x20\x5d\x75\x64\x60\xa6\xe5\xca\x2c\x53\xe4\x68\x30\x1a\x2d\xea\xc7\xe2\x61\x0c\xbe\xbc\xf8\xf2\xe2\xbf\x01\x00\x00\xff\xff\x60\xbb\x1b\x70\xbe\x3a\x00\x00") func yaoModelsMemberModYaoBytes() ([]byte, error) { return bindataRead( @@ -7611,7 +7611,7 @@ func yaoModelsMemberModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 14798, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 15038, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7631,7 +7631,7 @@ func yaoModelsRoleModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7651,7 +7651,7 @@ func yaoModelsTeamModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7671,7 +7671,7 @@ func yaoModelsUserOauth_accountModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7691,7 +7691,7 @@ func yaoModelsUserTypeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7711,7 +7711,7 @@ func yaoModelsUserModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7731,7 +7731,7 @@ func yaoReleaseAppYaz() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7751,7 +7751,7 @@ func yaoStoresAgentCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7771,7 +7771,7 @@ func yaoStoresAgentMemoryChatXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/chat.xun.yao", size: 497, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/chat.xun.yao", size: 497, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7791,7 +7791,7 @@ func yaoStoresAgentMemoryContextXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/context.xun.yao", size: 507, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/context.xun.yao", size: 507, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7811,7 +7811,7 @@ func yaoStoresAgentMemoryTeamXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/team.xun.yao", size: 483, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/team.xun.yao", size: 483, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7831,7 +7831,7 @@ func yaoStoresAgentMemoryUserXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/user.xun.yao", size: 489, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/user.xun.yao", size: 489, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7851,7 +7851,7 @@ func yaoStoresCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7871,7 +7871,7 @@ func yaoStoresKbCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7891,7 +7891,7 @@ func yaoStoresKbStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/store.xun.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/kb/store.xun.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7911,7 +7911,7 @@ func yaoStoresOauthCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7931,7 +7931,7 @@ func yaoStoresOauthClientXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/client.xun.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/client.xun.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7951,7 +7951,7 @@ func yaoStoresOauthStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/store.xun.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/store.xun.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7971,7 +7971,7 @@ func yaoStoresStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/store.xun.yao", size: 369, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/stores/store.xun.yao", size: 369, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7991,7 +7991,7 @@ func yaoUploadersAttachmentLocalYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1772434053, 0)} + info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1774683927, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/engine/load.go b/engine/load.go index d96baf21..05de94e7 100644 --- a/engine/load.go +++ b/engine/load.go @@ -23,6 +23,7 @@ import ( "github.com/yaoapp/yao/api" "github.com/yaoapp/yao/attachment" "github.com/yaoapp/yao/cert" + "github.com/yaoapp/yao/commercial" "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/connector" "github.com/yaoapp/yao/data" @@ -94,6 +95,27 @@ func loadStep(name string, loadFunc func() error, callback func(string, string)) return err } +// LoadForMigrate loads only the minimal modules needed for schema migration: +// application config, database connection, and models (with auto-migrate). +func LoadForMigrate(cfg config.Config) (warnings []Warning, err error) { + defer func() { err = exception.Catch(recover()) }() + exception.Mode = cfg.Mode + + if err = loadApp(cfg.AppSource); err != nil { + return append(warnings, Warning{Widget: "Load Application", Error: err}), err + } + + if err = share.DBConnect(cfg.DB); err != nil { + return append(warnings, Warning{Widget: "DB", Error: err}), err + } + + if err = model.Load(cfg); err != nil { + warnings = append(warnings, Warning{Widget: "Model", Error: err}) + } + + return warnings, err +} + // Load application engine func Load(cfg config.Config, options LoadOption, progressCallback ...func(string, string)) (warnings []Warning, err error) { @@ -149,6 +171,12 @@ func Load(cfg config.Config, options LoadOption, progressCallback ...func(string warnings = append(warnings, Warning{Widget: "Registry", Error: err}) } + // Load Commercial License + loadStep("License", func() error { + commercial.Load(cfg.Root, "yao") + return nil + }, callback) + // Load Certs err = loadStep("Cert", func() error { return cert.Load(cfg) diff --git a/openapi/agent/robot/types.go b/openapi/agent/robot/types.go index 26990677..ec9422c0 100644 --- a/openapi/agent/robot/types.go +++ b/openapi/agent/robot/types.go @@ -41,6 +41,7 @@ type CreateRobotRequest struct { Agents interface{} `json:"agents,omitempty"` // Accessible agents (JSON array) MCPServers interface{} `json:"mcp_servers,omitempty"` // MCP servers (JSON array) LanguageModel string `json:"language_model,omitempty"` // Language model name + Workspace string `json:"workspace,omitempty"` // Workspace ID bound to this robot // Limits CostLimit float64 `json:"cost_limit,omitempty"` // Monthly cost limit USD @@ -73,6 +74,7 @@ type UpdateRobotRequest struct { Agents interface{} `json:"agents,omitempty"` // Accessible agents MCPServers interface{} `json:"mcp_servers,omitempty"` // MCP servers LanguageModel *string `json:"language_model,omitempty"` // Language model name + Workspace *string `json:"workspace,omitempty"` // Workspace ID (nil=no change, ""=unbind) // Limits CostLimit *float64 `json:"cost_limit,omitempty"` // Monthly cost limit USD @@ -115,6 +117,7 @@ type Response struct { Agents interface{} `json:"agents,omitempty"` MCPServers interface{} `json:"mcp_servers,omitempty"` LanguageModel string `json:"language_model,omitempty"` + Workspace string `json:"workspace,omitempty"` // Limits CostLimit float64 `json:"cost_limit,omitempty"` @@ -186,6 +189,7 @@ func NewResponse(r *robotapi.RobotResponse) *Response { Agents: r.Agents, MCPServers: r.MCPServers, LanguageModel: r.LanguageModel, + Workspace: r.Workspace, CostLimit: r.CostLimit, InvitedBy: r.InvitedBy, JoinedAt: r.JoinedAt, @@ -215,6 +219,7 @@ func (r *CreateRobotRequest) ToAPICreateRequest() *robotapi.CreateRobotRequest { Agents: r.Agents, MCPServers: r.MCPServers, LanguageModel: r.LanguageModel, + Workspace: r.Workspace, CostLimit: r.CostLimit, } } @@ -238,6 +243,7 @@ func (r *UpdateRobotRequest) ToAPIUpdateRequest() *robotapi.UpdateRobotRequest { Agents: r.Agents, MCPServers: r.MCPServers, LanguageModel: r.LanguageModel, + Workspace: r.Workspace, CostLimit: r.CostLimit, } } diff --git a/openapi/oauth/providers/user/default.go b/openapi/oauth/providers/user/default.go index 99cee7f5..275735e4 100644 --- a/openapi/oauth/providers/user/default.go +++ b/openapi/oauth/providers/user/default.go @@ -167,7 +167,7 @@ var ( "member_id", "team_id", "user_id", "member_type", "display_name", "bio", "avatar", "email", "role_id", "is_owner", "status", "system_prompt", "manager_id", "robot_email", "authorized_senders", "email_filter_rules", "robot_config", "agents", "mcp_servers", - "language_model", "cost_limit", "autonomous_mode", "last_robot_activity", "robot_status", + "language_model", "workspace", "cost_limit", "autonomous_mode", "last_robot_activity", "robot_status", "invitation_id", "invited_by", "invited_at", "joined_at", "invitation_token", "invitation_expires_at", "last_active_at", "login_count", "notes", "metadata", "created_at", "updated_at", diff --git a/openapi/oauth/providers/user/member.go b/openapi/oauth/providers/user/member.go index 6eafd6ab..0243b464 100644 --- a/openapi/oauth/providers/user/member.go +++ b/openapi/oauth/providers/user/member.go @@ -362,7 +362,7 @@ func (u *DefaultUser) CreateRobotMember(ctx context.Context, teamID string, robo robotFields := []string{ "role_id", "system_prompt", "manager_id", "robot_email", "authorized_senders", "email_filter_rules", "robot_config", "agents", "mcp_servers", - "language_model", "cost_limit", "autonomous_mode", "robot_status", + "language_model", "workspace", "cost_limit", "autonomous_mode", "robot_status", "notes", "metadata", "__yao_created_by", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id", } @@ -444,7 +444,7 @@ func (u *DefaultUser) UpdateRobotMember(ctx context.Context, memberID string, ro robotFields := []string{ "role_id", "system_prompt", "manager_id", "robot_email", "authorized_senders", "email_filter_rules", "robot_config", "agents", "mcp_servers", - "language_model", "cost_limit", "autonomous_mode", "robot_status", + "language_model", "workspace", "cost_limit", "autonomous_mode", "robot_status", "notes", "metadata", "status", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id", } diff --git a/openapi/tests/user/member_test.go b/openapi/tests/user/member_test.go index 79dd596e..16fd1e0e 100644 --- a/openapi/tests/user/member_test.go +++ b/openapi/tests/user/member_test.go @@ -1152,6 +1152,7 @@ func TestMemberCreateRobot(t *testing.T) { "mcp_tools": []string{"filesystem", "database"}, "autonomous_mode": "enabled", "cost_limit": 100.50, + "workspace": "ws-test-create", }, map[string]string{ "Authorization": "Bearer " + tokenInfo.AccessToken, @@ -1374,6 +1375,9 @@ func TestMemberCreateRobot(t *testing.T) { if tc.body["prompt"] != nil { assert.Equal(t, tc.body["prompt"], member["system_prompt"], "Should have correct system_prompt") } + if tc.body["workspace"] != nil { + assert.Equal(t, "ws-test-create", member["workspace"], "Should have correct workspace") + } } } } @@ -1595,6 +1599,7 @@ func TestMemberUpdateRobot(t *testing.T) { "llm": "gpt-3.5-turbo", "autonomous_mode": "disabled", "cost_limit": 50.0, + "workspace": "ws-initial", } robotBodyBytes, _ := json.Marshal(robotBody) robotReq, _ := http.NewRequest("POST", serverURL+baseURL+"/user/teams/"+teamID+"/members/robots", bytes.NewBuffer(robotBodyBytes)) @@ -1655,6 +1660,7 @@ func TestMemberUpdateRobot(t *testing.T) { "cost_limit": 100.0, "status": "active", "robot_status": "working", + "workspace": "ws-updated", }, map[string]string{ "Authorization": "Bearer " + tokenInfo.AccessToken, @@ -1679,6 +1685,7 @@ func TestMemberUpdateRobot(t *testing.T) { assert.Equal(t, fmt.Sprintf("https://example.com/avatars/full-%s.png", testUUID), member["avatar"]) assert.Equal(t, "Updated system prompt", member["system_prompt"]) assert.Equal(t, "gpt-4", member["language_model"]) + assert.Equal(t, "ws-updated", member["workspace"], "Should have correct workspace") } } }, @@ -1973,6 +1980,35 @@ func TestMemberUpdateRobot(t *testing.T) { } }, }, + { + "update workspace to unbind", + func() (string, string) { return createTestRobot("15") }, + map[string]interface{}{ + "workspace": "", + }, + map[string]string{ + "Authorization": "Bearer " + tokenInfo.AccessToken, + }, + 200, + "should unbind workspace by setting to empty string", + func(t *testing.T, memberID string) { + getMemberURL := serverURL + baseURL + "/user/teams/" + teamID + "/members/" + memberID + getReq, _ := http.NewRequest("GET", getMemberURL, nil) + getReq.Header.Set("Authorization", "Bearer "+tokenInfo.AccessToken) + client := &http.Client{} + getResp, err := client.Do(getReq) + assert.NoError(t, err) + if getResp != nil { + defer getResp.Body.Close() + if getResp.StatusCode == 200 { + var member map[string]interface{} + body, _ := io.ReadAll(getResp.Body) + json.Unmarshal(body, &member) + assert.Empty(t, member["workspace"], "Workspace should be empty after unbinding") + } + } + }, + }, } for _, tc := range testCases { diff --git a/openapi/user/member.go b/openapi/user/member.go index c33b9be5..ca07f01a 100644 --- a/openapi/user/member.go +++ b/openapi/user/member.go @@ -315,6 +315,9 @@ func GinMemberCreateRobot(c *gin.Context) { if req.LanguageModel != "" { baseData["language_model"] = req.LanguageModel } + if req.Workspace != "" { + baseData["workspace"] = req.Workspace + } if len(req.Agents) > 0 { baseData["agents"] = req.Agents } @@ -431,6 +434,9 @@ func GinMemberUpdateRobot(c *gin.Context) { if req.LanguageModel != "" { updateData["language_model"] = req.LanguageModel } + if req.Workspace != nil { + updateData["workspace"] = *req.Workspace + } if req.Status != "" { updateData["status"] = req.Status } @@ -1591,6 +1597,7 @@ func mapToMemberDetailResponse(data maps.MapStr) MemberDetailResponse { SystemPrompt: utils.ToString(data["system_prompt"]), ManagerID: utils.ToString(data["manager_id"]), LanguageModel: utils.ToString(data["language_model"]), + Workspace: utils.ToString(data["workspace"]), CostLimit: utils.ToFloat64(data["cost_limit"]), AutonomousMode: data["autonomous_mode"], // Keep original type (bool or string) LastRobotActivity: utils.ToTimeString(data["last_robot_activity"]), diff --git a/openapi/user/types.go b/openapi/user/types.go index 248ef269..142d700d 100644 --- a/openapi/user/types.go +++ b/openapi/user/types.go @@ -457,6 +457,7 @@ type MemberDetailResponse struct { Agents []string `json:"agents,omitempty"` MCPServers []string `json:"mcp_servers,omitempty"` LanguageModel string `json:"language_model,omitempty"` + Workspace string `json:"workspace,omitempty"` CostLimit float64 `json:"cost_limit,omitempty"` AutonomousMode interface{} `json:"autonomous_mode,omitempty"` // Can be bool or string LastRobotActivity string `json:"last_robot_activity,omitempty"` @@ -480,6 +481,7 @@ type CreateRobotMemberRequest struct { ManagerID string `json:"report_to,omitempty"` // Direct manager user ID SystemPrompt string `json:"prompt" binding:"required"` // Identity & role prompt LanguageModel string `json:"llm,omitempty"` // Language model (e.g., "gpt-4") + Workspace string `json:"workspace,omitempty"` // Workspace ID bound to this robot Agents []string `json:"agents,omitempty"` // Accessible agents MCPServers []string `json:"mcp_tools,omitempty"` // MCP servers/tools AutonomousMode string `json:"autonomous_mode,omitempty"` // "enabled" or "disabled" @@ -499,6 +501,7 @@ type UpdateRobotMemberRequest struct { ManagerID string `json:"report_to,omitempty"` // Direct manager user ID SystemPrompt string `json:"prompt,omitempty"` // Identity & role prompt LanguageModel string `json:"llm,omitempty"` // Language model (e.g., "gpt-4") + Workspace *string `json:"workspace"` // Workspace ID (nil=no change, ""=unbind) Agents []string `json:"agents,omitempty"` // Accessible agents MCPServers []string `json:"mcp_tools,omitempty"` // MCP servers/tools AutonomousMode string `json:"autonomous_mode,omitempty"` // "enabled" or "disabled" diff --git a/openapi/well-known.go b/openapi/well-known.go index bb67c2cd..95acc647 100644 --- a/openapi/well-known.go +++ b/openapi/well-known.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/gin-gonic/gin" + "github.com/yaoapp/yao/commercial" "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/share" ) @@ -52,6 +53,9 @@ type YaoMetadata struct { GRPC string `json:"grpc,omitempty"` // gRPC server address (e.g., "127.0.0.1:9099") Optional map[string]interface{} `json:"optional,omitempty"` // Optional settings + // Commercial license + License *commercial.PublicInfo `json:"license,omitempty"` + // Developer information Developer *share.Developer `json:"developer,omitempty"` } @@ -76,6 +80,9 @@ func (openapi *OpenAPI) yaoMetadata(c *gin.Context) { Optional: share.App.Optional, } + // Include license info + metadata.License = commercial.GetPublicInfo() + // Include developer info if available if share.App.Developer.ID != "" || share.App.Developer.Name != "" { metadata.Developer = &share.App.Developer diff --git a/sandbox/v2/types.go b/sandbox/v2/types.go index 312aa54b..6334af99 100644 --- a/sandbox/v2/types.go +++ b/sandbox/v2/types.go @@ -75,6 +75,7 @@ const ( DefaultStopTimeout = 2 * time.Second DefaultSessionIdleTimeout = 30 * time.Minute DefaultLongRunningIdleTimeout = 2 * time.Hour + DefaultOneShotMaxAge = 8 * time.Hour ) // --------------------------------------------------------------------------- diff --git a/sandbox/v2/watcher.go b/sandbox/v2/watcher.go index 32c89af3..98034ed7 100644 --- a/sandbox/v2/watcher.go +++ b/sandbox/v2/watcher.go @@ -71,6 +71,31 @@ func (w *sandboxWatcher) Check(ctx context.Context) []monitor.Alert { } } + // OneShot safety net: these containers should have been removed by + // LifecycleAction right after execution. If they still exist after + // DefaultOneShotMaxAge it means cleanup failed (e.g. process crash, + // cfg.ID race before the fix). Remove them based on createdAt so we + // never kill a container that is still actively executing. + if b.policy == OneShot { + age := time.Since(b.createdAt) + if age > DefaultOneShotMaxAge { + alerts = append(alerts, monitor.Alert{ + Level: monitor.Warn, + Target: "box:" + b.id, + Message: fmt.Sprintf("oneshot exceeded max age (%s > %s), removing", age.Round(time.Second), DefaultOneShotMaxAge), + Action: func(ctx context.Context) { mgr.Remove(ctx, b.id) }, + }) + } else { + alerts = append(alerts, monitor.Alert{ + Level: monitor.Trace, + Target: "box:" + b.id, + Message: fmt.Sprintf("oneshot age %s (max=%s)", + age.Round(time.Second), DefaultOneShotMaxAge), + }) + } + return true + } + idle := time.Since(b.idleSince()) timeout := b.idleTimeout() diff --git a/tai/tunnel/grpc_handler_test.go b/tai/tunnel/grpc_handler_test.go index b5d97558..54cbeead 100644 --- a/tai/tunnel/grpc_handler_test.go +++ b/tai/tunnel/grpc_handler_test.go @@ -185,12 +185,18 @@ func TestRegister_Ping(t *testing.T) { t.Fatal(err) } - pong, err := stream.Recv() - if err != nil { - t.Fatal(err) - } - if pong.Type != "pong" { - t.Errorf("expected pong, got %q", pong.Type) + // Loop until we receive "pong"; skip "open" frames that may arrive from + // the asynchronous connectTunnelNode goroutine if a real gRPC endpoint + // happens to be reachable in the test environment. + for { + pong, err := stream.Recv() + if err != nil { + t.Fatal(err) + } + if pong.Type == "pong" { + break + } + // skip unexpected frames (e.g. "open" from connectTunnelNode) } stream.CloseSend() diff --git a/yao/models/member.mod.yao b/yao/models/member.mod.yao index 9bc40f30..9b613366 100644 --- a/yao/models/member.mod.yao +++ b/yao/models/member.mod.yao @@ -214,6 +214,15 @@ "length": 100, "nullable": true }, + { + "name": "workspace", + "type": "string", + "label": "Workspace", + "comment": "Workspace ID bound to this robot member (nullable = not bound)", + "length": 255, + "nullable": true, + "index": true + }, { "name": "cost_limit", "type": "decimal",