// Package contract 是 Gateway / Dispatcher / MCP 之间的共享契约: // Task 数据结构与 NATS subject 命名约定。 package contract import "encoding/json" // NATS subject / stream 约定(与 README、各服务 config 保持一致)。 const ( StreamTasks = "SUNDYNIX_TASKS" // JetStream stream 名 SubjectTasks = "sundynix.tasks" // 任务发布主题前缀;实际为 sundynix.tasks. SubjectTasksAll = "sundynix.tasks.>" // stream 捕获的通配 SubjectStream = "sundynix.streams" // Token 回流前缀;实际 sundynix.streams. ConsumerDurable = "dispatchers" // Dispatcher 持久消费者(队列组负载均衡) // HeaderStreamEnd 是 Token 流的结束信号(core NATS 消息头)。 // 置为 "1" 的消息体为空,表示该 task 的 Token 流结束。 HeaderStreamEnd = "X-Stream-End" ) // Task 是 DSL 解析组装后的可调度任务,在 NATS 上以 JSON 传输。 type Task struct { ID string `json:"id"` Graph json.RawMessage `json:"graph"` // React Flow 导出的 Agent 编排图 Meta map[string]any `json:"meta,omitempty"` } // TaskSubject 返回某任务的发布主题。 func TaskSubject(id string) string { return SubjectTasks + "." + id } // StreamSubject 返回某任务的 Token 回流主题。 func StreamSubject(id string) string { return SubjectStream + "." + id } // Marshal / Unmarshal 便捷方法。 func (t *Task) Marshal() ([]byte, error) { return json.Marshal(t) } func Unmarshal(b []byte) (*Task, error) { var t Task if err := json.Unmarshal(b, &t); err != nil { return nil, err } return &t, nil }