flow

package
v0.6.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

Package flow 实现垂类路由:Host 根据事实决定下一个调哪个子代理做什么。

设计原则:

  • Route 是纯函数:输入 State,输出 *Instruction。无 IO、无 Store 调用,可单测。
  • State 由 LoadState(非纯)从 Store 构造,一次性把路由需要的事实读齐。
  • 返回 nil 是合法的:表示"裁定场景,让 Coordinator LLM 自主决策"。

Router 覆盖的是"查表型"决策(每章下一步、弧末后处理、队列驱动), 不覆盖"语义理解型"决策(选规划师、处理用户 Steer、输出总结)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func FormatMessage

func FormatMessage(i *Instruction) string

FormatMessage 把 Instruction 格式化为发给 Coordinator 的用户消息。 格式固定,便于 Coordinator prompt 识别与 LLM 直接响应。

Types

type Dispatcher

type Dispatcher struct {
	// contains filtered or unexported fields
}

Dispatcher 在子代理返回的同步工具边界计算路由并下达 Host 指令。

func NewDispatcher

func NewDispatcher(coordinator *agentcore.Agent, store *storepkg.Store) *Dispatcher

NewDispatcher 创建 Dispatcher。

func (*Dispatcher) Dispatch

func (d *Dispatcher) Dispatch()

Dispatch 立即计算路由并下达指令;可被 Host 在特殊时机(如 Resume 后)主动调用。

func (*Dispatcher) Enable

func (d *Dispatcher) Enable()

Enable 打开路由派发;关闭时 Dispatch 不产生指令。 Host 在 Start/Resume 完成首条 prompt 之后启用,避免与启动流程冲突。

func (*Dispatcher) ResetRepeat added in v0.5.0

func (d *Dispatcher) ResetRepeat()

ResetRepeat 清空重复追踪。Resume / 新 Start 时 Host 调用, 确保恢复或新建后首条指令以"第 1 次"语义下达。

func (*Dispatcher) SetOnRepeat added in v0.5.0

func (d *Dispatcher) SetOnRepeat(cb func(agent, task string, n int))

SetOnRepeat 注册重复指令的 telemetry 回调。须在派发开始前调用一次。

type Instruction

type Instruction struct {
	Agent   string // architect_long / architect_short / writer / editor
	Task    string // 给子代理的任务描述
	Reason  string // 给 Coordinator 看的理由(可选,方便调试与日志)
	Chapter int    // writer 任务涉及的章节号(续写/重写/打磨);0 表示不涉及(editor/architect 任务)
}

Instruction 指示 Host 下一步要求 Coordinator 调用的子代理与任务。

func Route

func Route(s State) *Instruction

Route 根据事实返回下一步指令;返回 nil 表示让 Coordinator LLM 自主裁定。

决策优先级(互斥,自上而下匹配第一个):

  1. Phase=Complete → nil(LLM 输出总结)
  2. Phase!=Writing → nil(LLM 裁定规划师选型 / 规划补齐)
  3. PendingRewrites 非空 → writer 按队列重写/打磨
  4. Flow=Reviewing → nil(dormant:当前无写入者,评审期 Flow 实为 writing)
  5. Flow=Steering → nil(用户干预处理中)
  6. 弧末评审缺失 → editor(arc review)
  7. 弧末评审有但弧摘要缺失 → editor(arc summary)
  8. 卷末弧摘要有但卷摘要缺失 → editor(volume summary)
  9. 下一弧是骨架 → architect_long(expand_arc)

10. 卷末需决策下一卷 → architect_long(append_volume / complete_book) 11. 其它 → writer(写 next_chapter)

type PauseResolution added in v0.6.1

type PauseResolution int

PauseResolution 停靠点在当前事实下的裁定结果。

const (
	// PauseKeep 条件未满足,停靠点保留。
	PauseKeep PauseResolution = iota
	// PauseConsume 条件已满足但不停机(如完本收尾优先,run 自然结束即验收点),
	// 只消费停靠点防止残留误触发下一次 run。
	PauseConsume
	// PauseConsumeAndStop 条件已满足,消费停靠点并暂停运行。
	PauseConsumeAndStop
)

func ResolvePausePoint added in v0.6.1

func ResolvePausePoint(pp *domain.PausePoint, p *domain.Progress) PauseResolution

ResolvePausePoint 按当前事实裁定停靠点去向。与 Route 同纪律:纯函数、零 IO, 事实不全时保守返回 Keep(宁可晚停一拍,不做误判消费)。

type State

type State struct {
	Progress *domain.Progress

	// 上一个已完成章节(Progress.CompletedChapters 末尾);为 0 表示尚未开始写作。
	LastCompleted int

	// 上一章的弧边界信息;IsArcEnd=false 时其他字段无意义。
	// 当 LastCompleted=0 或非 Layered 模式时应为 nil。
	ArcBoundary *storepkg.ArcBoundary

	// 弧末后处理的三个事实:评审 / 弧摘要 / 卷摘要是否已完成。
	HasArcReview     bool
	HasArcSummary    bool
	HasVolumeSummary bool

	// 基础设定缺项(规划阶段的补齐信号)。
	FoundationMissing []string
}

State 是 Route 的输入:所有事实必须在此显式声明,禁止 Route 内部读 Store。

func LoadState

func LoadState(store *storepkg.Store) State

LoadState 从 Store 读取 Route 所需的全部事实。 这是路由的"IO 边界":所有读取集中在这里,Route 保持纯。 读取失败按保守默认填充(has*=false, boundary=nil),让 Router 倾向重派而非跳过。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL