ci / vet-and-test (pull_request) Successful in 42s
Why: Generative UI U3 - the agent needs a real submission path and the next turn needs to see prior pages: a built-in in-process plugin registers generative-ui.present (exposeAsTool) carrying the catalog (prompt=validation single source) with a schema-repair strategy measured against real MiniMax-M3 deviations; the command bus gains an owner-scoped tool gate so a disabled plugin stops injecting its tool (execution guard remains in surfacesvc); ctxasm projects saved surfaces back into context so the model can revise existing structure; doc-refs are authorized against the owner's real artifacts. Evidence: unit suites green (genui guards/epoch/doc-ref, gate fail-closed, projection content); full go test ./... green; cmdbus/ctxasm also green under AGENT_PG_TEST_DSN; real-model closed loop (env-gated TestRealModelSurfaceLoop) passes: task->spec->save->projection->revise with revision 1->2 and structure change, CNY 0.08 total. Impact: New internal/genui package; additive cmdbus/ctxasm/runmgr/ runtime hooks; no storage or contract changes (U2 layer untouched). Refs: Documents proposal r2 U3; Core PR #25/#26; Backend #143; Dev task feature/generative-ui-u3
53 lines
1.8 KiB
Go
53 lines
1.8 KiB
Go
package ctxasm
|
|
|
|
// U3/R6:已保存页面的语义投影并入上下文——下一轮模型能看到结构、来源与修订
|
|
// 入口(present + baseRevision),可据此解释并修改已有 table/compare/tabs。
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
agentllm "agent-native/runtime/llm"
|
|
core "agent-system-core"
|
|
)
|
|
|
|
func surfaceSnap() core.SurfaceSnapshot {
|
|
return core.SurfaceSnapshot{
|
|
Identity: core.SurfaceIdentity{SurfaceID: "surf_x", Owner: "alice", PluginID: "generative-ui", ConversationID: "c1"},
|
|
Revision: 2,
|
|
Spec: core.SurfaceSpec{Title: "选型对比", Nodes: []core.UINode{
|
|
{Type: core.UISection, ID: "n1", Title: "概览", Children: []core.UINode{
|
|
{Type: core.UIMarkdown, ID: "n1a", Source: []string{"doc:a"}, Markdown: "结论"},
|
|
}},
|
|
{Type: core.UITable, ID: "n2", Source: []string{"doc:a", "doc:b"}},
|
|
}},
|
|
SemanticText: "三工具对比页",
|
|
}
|
|
}
|
|
|
|
func TestSurfaceProjectionInContext(t *testing.T) {
|
|
msgs, rep := AssembleInput(core.AgentProfile{}, nil, nil,
|
|
core.Message{Role: core.RoleUser, Parts: []core.Part{{Type: core.PartText, Text: "改一下"}}},
|
|
nil, nil, nil, nil, nil, nil, AssembleOptions{Surfaces: []core.SurfaceSnapshot{surfaceSnap()}})
|
|
joined := make([]string, len(msgs))
|
|
for i, m := range msgs {
|
|
joined[i] = m.Content
|
|
}
|
|
all := strings.Join(joined, "\n---\n")
|
|
for _, need := range []string{"surf_x", "修订 2", "选型对比", "section(\"概览\")#n1", "markdown#n1a[doc:a]", "table#n2", "baseRevision=2"} {
|
|
if !strings.Contains(all, need) {
|
|
t.Fatalf("projection missing %q in assembled context:\n%s", need, all)
|
|
}
|
|
}
|
|
found := false
|
|
for _, it := range rep.Items {
|
|
if strings.HasPrefix(it, "surface(") {
|
|
found = true
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatalf("report should count surface injection: %v", rep.Items)
|
|
}
|
|
_ = agentllm.RoleSystem
|
|
}
|