删除入口区分两种模式(待领/运行中/已暂停的意图均可删除): - 假删除(默认):意图置 state='deleted'、删除原因记入新字段 delete_reason, 保留节点与全部产出/血缘,不再在图上另挂 fact。 - 真删除:物理删除意图及「仅由它支撑」的独占子孙(沿 yields/derived_from 级联到叶子),避免孤立数据;共享节点、目标、任务根事实保留。被删意图先做 token rollup 并清理 activity/副会话,被删 finding 先删 findings 行。 两种模式都照常用 cancelled 触发通知 planner(带删除前捕获的意图摘要 + 原因), planner 文案不再声称原因挂为事实。 - DB: 新增 SoftDeleteIntent、重写 CancelIntent 为深度独占级联;schema 加 delete_reason 列与 intent 的 deleted 状态(含旧库迁移)。 - 前端: 删除对话框加模式切换与动态说明,状态徽章/图标新增「已删除」, 播报板展开展示删除原因。
41 lines
1.9 KiB
Go
41 lines
1.9 KiB
Go
package db
|
|
|
|
// Exploration node kinds (exploration_nodes.kind).
|
|
const (
|
|
KindBegin = "begin" // DEPRECATED: legacy task root; new tasks seed an origin fact (KindFact + StateOrigin) instead
|
|
KindGoal = "goal" // a task objective
|
|
KindIntent = "intent" // an exploration direction (planner-generated)
|
|
KindFact = "fact" // a worker's exploration result/conclusion (incl. negative results), tied to its intent
|
|
KindFinding = "finding" // a confirmed vulnerability (report_finding), distinct from a fact
|
|
KindHint = "hint"
|
|
KindDigest = "digest" // a compressed fold of cold intents/facts (cold-digest-spec §1); lossless — members kept, restorable by id
|
|
)
|
|
|
|
// Digest node states (kind='digest'). A digest is 'active' while it renders in
|
|
// graph_overview; major compaction retires a merged-away segment to 'superseded'
|
|
// (its covers edges repointed to the new digest) — cold-digest-spec §5.1.
|
|
const (
|
|
StateDigestActive = "active"
|
|
StateDigestSuperseded = "superseded"
|
|
)
|
|
|
|
// StateOrigin marks the task root fact (KindFact) seeded at task creation — the
|
|
// exploration graph's origin. Every intent traces back to it, so "an intent must
|
|
// connect to a fact" holds uniformly from the very first intent. Worker-produced
|
|
// facts use state 'confirmed', so this never collides.
|
|
const StateOrigin = "origin"
|
|
|
|
// StateIntentDeleted marks an intent the user假删除(soft delete): it drops out of
|
|
// the frontier and graph_overview like other terminal states, but keeps its node
|
|
// and full lineage. The delete reason lives in exploration_nodes.delete_reason.
|
|
const StateIntentDeleted = "deleted"
|
|
|
|
// Exploration edge relations (exploration_edges.rel).
|
|
const (
|
|
RelSpawns = "spawns"
|
|
RelDerivedFrom = "derived_from"
|
|
RelYields = "yields"
|
|
RelProves = "proves"
|
|
RelCovers = "covers" // digest --covers--> member (cold-digest-spec §1); source of truth for "which digest folds node X"
|
|
)
|