Unified Agent + reusable Go agent core.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: remove unused low-risk runtime helpers

Lyric a4165e67 9f7e70f3

-199
-162
cmd/mistermorph/consolecmd/daemon_client.go
··· 4 4 "bytes" 5 5 "context" 6 6 "encoding/json" 7 - "errors" 8 7 "fmt" 9 8 "io" 10 9 "net/http" 11 - "net/url" 12 10 "strings" 13 11 "time" 14 - 15 - "github.com/quailyquaily/mistermorph/cmd/mistermorph/daemoncmd" 16 12 ) 17 - 18 - var errTaskNotFound = errors.New("task not found") 19 13 20 14 type daemonTaskClient struct { 21 15 baseURL string ··· 78 72 return strings.ToLower(strings.TrimSpace(out.Mode)), nil 79 73 } 80 74 81 - func (c *daemonTaskClient) Overview(ctx context.Context) (map[string]any, error) { 82 - if err := c.ready(); err != nil { 83 - return nil, err 84 - } 85 - req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.baseURL+"/overview", nil) 86 - if err != nil { 87 - return nil, err 88 - } 89 - req.Header.Set("Authorization", "Bearer "+c.authToken) 90 - 91 - resp, err := c.client.Do(req) 92 - if err != nil { 93 - return nil, err 94 - } 95 - defer resp.Body.Close() 96 - 97 - raw, _ := io.ReadAll(io.LimitReader(resp.Body, 8<<20)) 98 - if resp.StatusCode == http.StatusNotFound || resp.StatusCode == http.StatusMethodNotAllowed { 99 - return c.legacyOverviewFromHealth(ctx) 100 - } 101 - if resp.StatusCode < 200 || resp.StatusCode >= 300 { 102 - return nil, fmt.Errorf("daemon overview http %d: %s", resp.StatusCode, strings.TrimSpace(string(raw))) 103 - } 104 - 105 - var out map[string]any 106 - if err := json.Unmarshal(raw, &out); err != nil { 107 - if looksLikeLegacyOverviewBody(raw) { 108 - return c.legacyOverviewFromHealth(ctx) 109 - } 110 - return nil, fmt.Errorf("invalid daemon overview response: %w", err) 111 - } 112 - if out == nil { 113 - out = map[string]any{} 114 - } 115 - return out, nil 116 - } 117 - 118 - func (c *daemonTaskClient) legacyOverviewFromHealth(ctx context.Context) (map[string]any, error) { 119 - mode, err := c.HealthMode(ctx) 120 - if err != nil { 121 - return nil, err 122 - } 123 - channel := map[string]any{ 124 - "configured": false, 125 - "telegram_configured": false, 126 - "slack_configured": false, 127 - "running": "unknown", 128 - "telegram_running": false, 129 - "slack_running": false, 130 - } 131 - switch strings.ToLower(strings.TrimSpace(mode)) { 132 - case "telegram": 133 - channel["configured"] = true 134 - channel["telegram_configured"] = true 135 - channel["running"] = "telegram" 136 - channel["telegram_running"] = true 137 - case "slack": 138 - channel["configured"] = true 139 - channel["slack_configured"] = true 140 - channel["running"] = "slack" 141 - channel["slack_running"] = true 142 - case "serve": 143 - channel["running"] = "none" 144 - default: 145 - channel["running"] = "unknown" 146 - } 147 - return map[string]any{ 148 - "mode": mode, 149 - "health": "ok", 150 - "channel": channel, 151 - }, nil 152 - } 153 - 154 - func looksLikeLegacyOverviewBody(raw []byte) bool { 155 - text := strings.ToLower(strings.TrimSpace(string(raw))) 156 - return text == "" || text == "ok" 157 - } 158 - 159 75 func (c *daemonTaskClient) Proxy(ctx context.Context, method, endpointPath string, body []byte) (int, []byte, error) { 160 76 if err := c.ready(); err != nil { 161 77 return 0, nil, err ··· 189 105 raw, _ := io.ReadAll(io.LimitReader(resp.Body, 16<<20)) 190 106 return resp.StatusCode, raw, nil 191 107 } 192 - 193 - func (c *daemonTaskClient) List(ctx context.Context, status daemoncmd.TaskStatus, limit int) ([]daemoncmd.TaskInfo, error) { 194 - if err := c.ready(); err != nil { 195 - return nil, err 196 - } 197 - if limit <= 0 { 198 - limit = 20 199 - } 200 - q := url.Values{} 201 - if strings.TrimSpace(string(status)) != "" { 202 - q.Set("status", strings.TrimSpace(string(status))) 203 - } 204 - q.Set("limit", fmt.Sprintf("%d", limit)) 205 - 206 - endpoint := c.baseURL + "/tasks" 207 - if qs := q.Encode(); qs != "" { 208 - endpoint = endpoint + "?" + qs 209 - } 210 - req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint, nil) 211 - if err != nil { 212 - return nil, err 213 - } 214 - req.Header.Set("Authorization", "Bearer "+c.authToken) 215 - 216 - resp, err := c.client.Do(req) 217 - if err != nil { 218 - return nil, err 219 - } 220 - defer resp.Body.Close() 221 - 222 - raw, _ := io.ReadAll(io.LimitReader(resp.Body, 8<<20)) 223 - if resp.StatusCode < 200 || resp.StatusCode >= 300 { 224 - return nil, fmt.Errorf("daemon http %d: %s", resp.StatusCode, strings.TrimSpace(string(raw))) 225 - } 226 - 227 - var out struct { 228 - Items []daemoncmd.TaskInfo `json:"items"` 229 - } 230 - if err := json.Unmarshal(raw, &out); err != nil { 231 - return nil, fmt.Errorf("invalid daemon response: %w", err) 232 - } 233 - return out.Items, nil 234 - } 235 - 236 - func (c *daemonTaskClient) Get(ctx context.Context, id string) (*daemoncmd.TaskInfo, error) { 237 - if err := c.ready(); err != nil { 238 - return nil, err 239 - } 240 - id = strings.TrimSpace(id) 241 - if id == "" { 242 - return nil, fmt.Errorf("missing task id") 243 - } 244 - req, err := http.NewRequestWithContext(ctx, http.MethodGet, c.baseURL+"/tasks/"+id, nil) 245 - if err != nil { 246 - return nil, err 247 - } 248 - req.Header.Set("Authorization", "Bearer "+c.authToken) 249 - 250 - resp, err := c.client.Do(req) 251 - if err != nil { 252 - return nil, err 253 - } 254 - defer resp.Body.Close() 255 - 256 - raw, _ := io.ReadAll(io.LimitReader(resp.Body, 8<<20)) 257 - if resp.StatusCode == http.StatusNotFound { 258 - return nil, errTaskNotFound 259 - } 260 - if resp.StatusCode < 200 || resp.StatusCode >= 300 { 261 - return nil, fmt.Errorf("daemon http %d: %s", resp.StatusCode, strings.TrimSpace(string(raw))) 262 - } 263 - 264 - var out daemoncmd.TaskInfo 265 - if err := json.Unmarshal(raw, &out); err != nil { 266 - return nil, fmt.Errorf("invalid daemon response: %w", err) 267 - } 268 - return &out, nil 269 - }
-27
internal/channelruntime/telegram/memory_flow.go
··· 11 11 "github.com/quailyquaily/mistermorph/agent" 12 12 "github.com/quailyquaily/mistermorph/internal/channelruntime/depsutil" 13 13 "github.com/quailyquaily/mistermorph/internal/chathistory" 14 - "github.com/quailyquaily/mistermorph/internal/entryutil" 15 14 "github.com/quailyquaily/mistermorph/internal/jsonutil" 16 15 "github.com/quailyquaily/mistermorph/internal/llminspect" 17 16 "github.com/quailyquaily/mistermorph/internal/memoryruntime" ··· 406 405 return it, true 407 406 } 408 407 return memory.KVItem{}, false 409 - } 410 - 411 - func SemanticMergeShortTerm(ctx context.Context, client llm.Client, model string, existing memory.ShortTermContent, draft memory.SessionDraft) (memory.ShortTermContent, error) { 412 - if client == nil { 413 - return memory.ShortTermContent{}, fmt.Errorf("nil llm client") 414 - } 415 - incoming := memory.MergeShortTerm(memory.ShortTermContent{}, draft, time.Now().UTC().Format(entryutil.TimestampLayout)) 416 - if len(incoming.SummaryItems) == 0 { 417 - return memory.NormalizeShortTermContent(existing), nil 418 - } 419 - combined := make([]memory.SummaryItem, 0, len(incoming.SummaryItems)+len(existing.SummaryItems)) 420 - combined = append(combined, incoming.SummaryItems...) 421 - combined = append(combined, existing.SummaryItems...) 422 - 423 - resolver := entryutil.NewLLMSemanticResolver(client, model) 424 - deduped, err := memory.SemanticDedupeSummaryItems(llminspect.WithModelScene(ctx, "memory.semantic_dedupe"), combined, resolver) 425 - if err != nil { 426 - return memory.ShortTermContent{}, err 427 - } 428 - 429 - merged := memory.NormalizeShortTermContent(memory.ShortTermContent{SummaryItems: deduped}) 430 - return merged, nil 431 - } 432 - 433 - func HasDraftContent(draft memory.SessionDraft) bool { 434 - return len(normalizeMemorySummaryItems(draft.SummaryItems)) > 0 435 408 } 436 409 437 410 func normalizeMemorySummaryItems(input []string) []string {
-10
internal/skillsutil/skillsutil.go
··· 188 188 return true 189 189 } 190 190 191 - func truncateString(s string, max int) string { 192 - if max <= 0 { 193 - return s 194 - } 195 - if len(s) <= max { 196 - return s 197 - } 198 - return s[:max] + "...(truncated)" 199 - } 200 - 201 191 func mapKeysSorted(m map[string]bool) []string { 202 192 if len(m) == 0 { 203 193 return nil