Something went wrong. Try again.
small gleam coding and persistent agent daemon with a detachable cli and a canvas ui forked from okami.mom/albedo
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172// Package acp adapts newline JSON-RPC to daemon-owned execution.package acp
import ( "bytes" "encoding/json" "errors" "unicode/utf8")
type rpcError struct { Data map[string]any `json:"data,omitempty"` Message string `json:"message"` Code int `json:"code"`}
func (e *rpcError) Error() string { return e.Message }func problem(code int, reason, message string) *rpcError { return &rpcError{Code: code, Message: message, Data: map[string]any{"reason": reason}}}
type request struct { Result json.RawMessage `json:"result"` Error json.RawMessage `json:"error"` JSONRPC string `json:"jsonrpc"` ID json.RawMessage `json:"id"` Method string `json:"method"` Params json.RawMessage `json:"params"`}
func parse(line []byte) (request, *rpcError) { var message request if !utf8.Valid(line) || !json.Valid(line) { return message, problem(-32700, "parse_error", "Malformed JSON") } if json.Unmarshal(line, &message) != nil || message.JSONRPC != "2.0" { return request{}, problem(-32600, "invalid_request", "Invalid JSON-RPC request") } if message.Method == "" { if message.ID == nil || (message.Result == nil) == (message.Error == nil) { return request{}, problem(-32600, "invalid_request", "Invalid JSON-RPC response") } return message, nil } if message.ID != nil { var value any decoder := json.NewDecoder(bytes.NewReader(message.ID)) decoder.UseNumber() if decoder.Decode(&value) != nil { return request{}, problem(-32600, "invalid_request", "Invalid request id") } switch value.(type) { case string, json.Number: default: return request{}, problem(-32600, "invalid_request", "Invalid request id") } } if len(message.Params) > 0 && message.Params[0] != '{' { return message, problem(-32602, "invalid_params", "Parameters must be an object") } return message, nil}func initialize(version string) any { return map[string]any{"protocolVersion": 1, "agentCapabilities": map[string]any{"loadSession": true, "promptCapabilities": map[string]bool{"image": false, "audio": false, "embeddedContext": false}, "mcpCapabilities": map[string]bool{"http": false, "sse": false}, "sessionCapabilities": map[string]any{"resume": map[string]any{}, "list": map[string]any{}}}, "authMethods": []any{}, "agentInfo": map[string]string{"name": "albedo", "title": "albedo", "version": version}}}func decodeParams(raw json.RawMessage, target any) error { if len(raw) == 0 || string(raw) == "null" { return errors.New("missing parameters") } return json.Unmarshal(raw, target)}