mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-02 18:39:05 +01:00
dbacae8a99
A bunch of the Wave AI types still mentioned OpenAI. Now that most of them are being used for multiple AI backends, we need to update the names to be more generic.
94 lines
2.9 KiB
Go
94 lines
2.9 KiB
Go
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package blockservice
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/wavetermdev/waveterm/pkg/blockcontroller"
|
|
"github.com/wavetermdev/waveterm/pkg/filestore"
|
|
"github.com/wavetermdev/waveterm/pkg/tsgen/tsgenmeta"
|
|
"github.com/wavetermdev/waveterm/pkg/waveobj"
|
|
"github.com/wavetermdev/waveterm/pkg/wshrpc"
|
|
"github.com/wavetermdev/waveterm/pkg/wstore"
|
|
)
|
|
|
|
type BlockService struct{}
|
|
|
|
const DefaultTimeout = 2 * time.Second
|
|
|
|
var BlockServiceInstance = &BlockService{}
|
|
|
|
func (bs *BlockService) SendCommand_Meta() tsgenmeta.MethodMeta {
|
|
return tsgenmeta.MethodMeta{
|
|
Desc: "send command to block",
|
|
ArgNames: []string{"blockid", "cmd"},
|
|
}
|
|
}
|
|
|
|
func (bs *BlockService) GetControllerStatus(ctx context.Context, blockId string) (*blockcontroller.BlockControllerRuntimeStatus, error) {
|
|
bc := blockcontroller.GetBlockController(blockId)
|
|
if bc == nil {
|
|
return nil, nil
|
|
}
|
|
return bc.GetRuntimeStatus(), nil
|
|
}
|
|
|
|
func (*BlockService) SaveTerminalState_Meta() tsgenmeta.MethodMeta {
|
|
return tsgenmeta.MethodMeta{
|
|
Desc: "save the terminal state to a blockfile",
|
|
ArgNames: []string{"ctx", "blockId", "state", "stateType", "ptyOffset", "termSize"},
|
|
}
|
|
}
|
|
|
|
func (bs *BlockService) SaveTerminalState(ctx context.Context, blockId string, state string, stateType string, ptyOffset int64, termSize waveobj.TermSize) error {
|
|
_, err := wstore.DBMustGet[*waveobj.Block](ctx, blockId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if stateType != "full" && stateType != "preview" {
|
|
return fmt.Errorf("invalid state type: %q", stateType)
|
|
}
|
|
// ignore MakeFile error (already exists is ok)
|
|
filestore.WFS.MakeFile(ctx, blockId, "cache:term:"+stateType, nil, filestore.FileOptsType{})
|
|
err = filestore.WFS.WriteFile(ctx, blockId, "cache:term:"+stateType, []byte(state))
|
|
if err != nil {
|
|
return fmt.Errorf("cannot save terminal state: %w", err)
|
|
}
|
|
fileMeta := filestore.FileMeta{
|
|
"ptyoffset": ptyOffset,
|
|
"termsize": termSize,
|
|
}
|
|
err = filestore.WFS.WriteMeta(ctx, blockId, "cache:term:"+stateType, fileMeta, true)
|
|
if err != nil {
|
|
return fmt.Errorf("cannot save terminal state meta: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (bs *BlockService) SaveWaveAiData(ctx context.Context, blockId string, history []wshrpc.WaveAIPromptMessageType) error {
|
|
block, err := wstore.DBMustGet[*waveobj.Block](ctx, blockId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
viewName := block.Meta.GetString(waveobj.MetaKey_View, "")
|
|
if viewName != "waveai" {
|
|
return fmt.Errorf("invalid view type: %s", viewName)
|
|
}
|
|
historyBytes, err := json.Marshal(history)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to serialize ai history: %v", err)
|
|
}
|
|
// ignore MakeFile error (already exists is ok)
|
|
filestore.WFS.MakeFile(ctx, blockId, "aidata", nil, filestore.FileOptsType{})
|
|
err = filestore.WFS.WriteFile(ctx, blockId, "aidata", historyBytes)
|
|
if err != nil {
|
|
return fmt.Errorf("cannot save terminal state: %w", err)
|
|
}
|
|
return nil
|
|
}
|