Files
ragflow/internal/cli/context_parser.go
Yingfeng 4ee0702aed Feat: add skills space to context engine (#13908)
### What problem does this PR solve?

issue #13714

### Type of change

- [x] New Feature (non-breaking change which adds functionality)
2026-04-30 12:36:03 +08:00

179 lines
4.5 KiB
Go

//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package cli
import (
"fmt"
"strings"
)
func (p *Parser) parseContextListCommand() (*Command, error) {
p.nextToken() // consume LS
cmd := NewCommand("ce_ls")
if p.curToken.Type == TokenEOF {
cmd.Params["path"] = "."
return cmd, nil
}
for p.curToken.Type != TokenEOF {
if p.curToken.Type == TokenDash {
p.nextToken() // skip dash
if p.curToken.Type != TokenIdentifier {
return nil, fmt.Errorf("expect identifier")
}
if cmd.Params["parameter"] == nil {
cmd.Params["parameter"] = p.curToken.Value
} else {
cmd.Params["parameter"] = fmt.Sprintf("%s%s", cmd.Params["parameter"], p.curToken.Value)
}
p.nextToken() // skip parameter
} else if p.curToken.Type == TokenIdentifier {
if cmd.Params["path"] == nil {
cmd.Params["path"] = p.curToken.Value
} else {
err := fmt.Errorf("ls: cannot access '%s': No such file or directory", p.curToken.Value)
return nil, err
}
p.nextToken() // skip path
} else {
return nil, fmt.Errorf("syntax error")
}
}
return cmd, nil
}
func (p *Parser) parseContextCatCommand() (*Command, error) {
p.nextToken() // consume CAT
if p.curToken.Type == TokenEOF {
return nil, fmt.Errorf("expect a filename")
}
if p.curToken.Type != TokenIdentifier && p.curToken.Type != TokenQuotedString {
return nil, fmt.Errorf("expect a filename")
}
cmd := NewCommand("ce_cat")
if p.curToken.Type == TokenIdentifier {
for p.curToken.Type != TokenEOF {
if p.curToken.Type != TokenIdentifier {
return nil, fmt.Errorf("expect a identifier")
}
if cmd.Params["filename"] == nil {
cmd.Params["filename"] = p.curToken.Value
} else {
cmd.Params["filename"] = fmt.Sprintf("%s/%s", cmd.Params["filename"], p.curToken.Value)
}
p.nextToken()
if p.curToken.Type == TokenEOF {
break
}
if p.curToken.Type != TokenSlash {
return nil, fmt.Errorf("expect a slash")
}
p.nextToken()
if p.curToken.Type == TokenEOF {
return nil, fmt.Errorf("error format")
}
}
} else if p.curToken.Type == TokenQuotedString {
var err error
cmd.Params["filename"], err = p.parseQuotedString()
if err != nil {
return nil, err
}
}
p.nextToken()
if p.curToken.Type != TokenEOF {
return nil, fmt.Errorf("syntax error")
}
return cmd, nil
}
func (p *Parser) parseContextSearchCommand() (*Command, error) {
p.nextToken() // consume SEARCH
cmd := NewCommand("ce_search")
for p.curToken.Type != TokenEOF {
if p.curToken.Type == TokenDash {
p.nextToken() // skip dash
if p.curToken.Type != TokenIdentifier {
return nil, fmt.Errorf("expect identifier")
}
if strings.ToLower(p.curToken.Value) == "n" {
p.nextToken()
var err error
if p.curToken.Type != TokenInteger {
return nil, fmt.Errorf("expect number")
}
cmd.Params["number"], err = p.parseNumber()
if err != nil {
return nil, err
}
p.nextToken()
continue
}
if strings.ToLower(p.curToken.Value) == "t" {
p.nextToken()
var err error
if p.curToken.Type != TokenInteger {
return nil, fmt.Errorf("expect number")
}
cmd.Params["threshold"], err = p.parseFloat()
if err != nil {
return nil, err
}
p.nextToken()
continue
}
return nil, fmt.Errorf("unknow parameter: %s", p.curToken.Value)
} else if p.curToken.Type == TokenIdentifier {
if cmd.Params["path"] == nil {
cmd.Params["path"] = p.curToken.Value
} else {
cmd.Params["path"] = fmt.Sprintf("%s %s", cmd.Params["path"], p.curToken.Value)
}
p.nextToken() // skip path
} else if p.curToken.Type == TokenQuotedString {
if cmd.Params["query"] == nil {
var err error
cmd.Params["query"], err = p.parseQuotedString()
if err != nil {
return nil, err
}
p.nextToken()
} else {
return nil, fmt.Errorf("Query phrase exists")
}
}
return nil, fmt.Errorf("syntax error")
}
return cmd, nil
}