Files
Agent-System-Backend/internal/runtime/runner.go
T
weichen 17f7e2b168
ci / vet-and-test (pull_request) Successful in 40s
Wire the permission ask port to HITL and adopt the Policy object
Why: N1 WP2/WP3 host side - the kernel ask loop must reach the HITL
confirm card, and tool gating should run through the typed Policy with
the session-allow store port instead of a hand-built Request.

Evidence: go vet clean; go test ./... all packages ok, including new
TestConvAllowStoreKeysByName, TestPermissionAskRoutesToHITL, and
permissionAskOf tests. Nested agent-native pin at 9758a8d (PR #17).

Impact: runmgr.ExecuteTool decides via agentpolicy.Policy with
convAllowStore (keying unchanged: conversation x tool name);
runCtx.PermissionAsk routes kernel asks to the shared toolConfirmCard
HITL; direct and subagent loops pass PermissionAsk into the kernel
config (nil for hosts without the method, preserving legacy ask=reject).

Refs: Documents proposal 2026-10-07-agent-stack-n1q1i1-plans.md WP2/WP3; Agent-Native PR #17
2026-10-07 04:04:10 +00:00

75 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package runtime 定义智能体执行端口与实现:mock(脚本回放)与 LLM
// (复用 agent-native 的 OpenAI 兼容流式客户端)。执行编排归 runmgr。
package runtime
import (
"context"
nruntime "agent-native/runtime"
agentllm "agent-native/runtime/llm"
core "agent-system-core"
)
// RunCtx 是 Runner 的受控环境(由 runmgr 实现):事件发布、HITL、子代理、
// 工件、检索、工具执行、历史。Runner 不得绕过 RunCtx 直接写库。
type RunCtx interface {
Context() context.Context
Run() core.Run
Profile() core.AgentProfile
Settings() core.EffectiveSettings
Emit(typ core.StreamEventType, payload any) error
SetAssistantParts(parts []core.Part) error
AskHITL(card core.HITLCard) (core.HITLResponse, error)
SpawnSubagent(name, task string, hint string) (core.AgentResultPayload, error)
UpdatePlan(p core.PlanSnapshot) error
UpdateTodos(l core.TodoList) error
WriteArtifact(name, kind, mime string, content []byte) (core.Artifact, error)
Retrieve(q core.RetrievalQuery) ([]core.RetrievalHit, error)
ExecuteTool(call core.ToolCallRequest) core.ToolCallResult
History() []core.Message
Attachments() []core.ParsedDocument
// Tools 返回注册表全部工具(画像过滤由 runner 做)。
Tools() []core.ToolDesc
// Subtask 返回子代理任务描述(仅 subagent run 有值)。
Subtask() string
// CreateCard / SetCardStatus:产收件箱任务卡(收件箱关闭时为 no-op)。
CreateCard(card core.ActivityCard) (core.ActivityCard, error)
SetCardStatus(id string, status core.CardStatus, tone, note string) error
// SubmitCard:产物卡提交(submit_card 工具)——建卡并登记,finishRun 落库助手
// 消息后回填 AnchorMessageID(卡→消息互定位)。
SubmitCard(card core.ActivityCard) (core.ActivityCard, error)
// BeginStreamCard / AppendStreamCard / CommitStreamCard:流式产物卡三段式
// (card_begin/card_append/card_commit 工具;D44/D45)。Begin 建 active 产物卡
// 并设为活跃流式卡(多次 begin 以最后一卡为活跃);Append 向活跃卡追加正文
// (card.updated 按 250ms 窗口节流);Commit 置 done 并登记锚点回填。
BeginStreamCard(card core.ActivityCard) (core.ActivityCard, error)
AppendStreamCard(text string) error
CommitStreamCard() (core.ActivityCard, error)
// Card:按 ID 取卡(ctxasm 回填 card 部件正文用;无则 nil)。
Card(id string) *core.ActivityCard
// Artifact:按 ID 取工件与内容(ctxasm 回填 artifact_ref 正文用;无则 false)。
Artifact(id string) (core.Artifact, []byte, bool)
// SetContextObservation 记录本次运行的上下文组装观测(随 run.completed 下发)。
SetContextObservation(o core.ContextObservation)
}
// Runner 执行一个 run 至终态:返回 nil = completed;ctx 取消应返回 ctx.Err()。
type Runner interface {
Name() string
Execute(rc RunCtx) error
}
// permissionAskOf 把宿主的内核级权限询问(runmgr 的 HITL 确认卡)接成
// nruntime.Config.PermissionAsk 端口;宿主未实现时返回 nil,内核保持
// 「ask 按拒绝处理」的旧行为(N1 WP2 装配)。
func permissionAskOf(rc RunCtx) func(context.Context, agentllm.ToolCall) nruntime.AskVerdict {
asker, ok := rc.(interface {
PermissionAsk(ctx context.Context, call agentllm.ToolCall) nruntime.AskVerdict
})
if !ok {
return nil
}
return asker.PermissionAsk
}