feat: add type: event for operational state changes (bd-ecmd)
Adds support for event beads that capture operational state transitions as immutable records. Events are a new issue type with fields: - event_kind: namespaced category (patrol.muted, agent.started) - actor: entity URI who caused the event - target: entity URI or bead ID affected - payload: event-specific JSON data This enables: - bd activity --follow showing events - bd list --type=event --target=agent:deacon - Full audit trail for operational state - HOP-compatible transaction records 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> Executed-By: beads/crew/dave Rig: beads Role: crew
This commit is contained in:
@@ -281,6 +281,11 @@ func (s *SQLiteStorage) GetIssue(ctx context.Context, id string) (*types.Issue,
|
||||
var rig sql.NullString
|
||||
// Molecule type field
|
||||
var molType sql.NullString
|
||||
// Event fields
|
||||
var eventKind sql.NullString
|
||||
var actor sql.NullString
|
||||
var target sql.NullString
|
||||
var payload sql.NullString
|
||||
|
||||
var contentHash sql.NullString
|
||||
var compactedAtCommit sql.NullString
|
||||
@@ -292,7 +297,8 @@ func (s *SQLiteStorage) GetIssue(ctx context.Context, id string) (*types.Issue,
|
||||
deleted_at, deleted_by, delete_reason, original_type,
|
||||
sender, ephemeral, pinned, is_template,
|
||||
await_type, await_id, timeout_ns, waiters,
|
||||
hook_bead, role_bead, agent_state, last_activity, role_type, rig, mol_type
|
||||
hook_bead, role_bead, agent_state, last_activity, role_type, rig, mol_type,
|
||||
event_kind, actor, target, payload
|
||||
FROM issues
|
||||
WHERE id = ?
|
||||
`, id).Scan(
|
||||
@@ -305,6 +311,7 @@ func (s *SQLiteStorage) GetIssue(ctx context.Context, id string) (*types.Issue,
|
||||
&sender, &wisp, &pinned, &isTemplate,
|
||||
&awaitType, &awaitID, &timeoutNs, &waiters,
|
||||
&hookBead, &roleBead, &agentState, &lastActivity, &roleType, &rig, &molType,
|
||||
&eventKind, &actor, &target, &payload,
|
||||
)
|
||||
|
||||
if err == sql.ErrNoRows {
|
||||
@@ -406,6 +413,19 @@ func (s *SQLiteStorage) GetIssue(ctx context.Context, id string) (*types.Issue,
|
||||
if molType.Valid {
|
||||
issue.MolType = types.MolType(molType.String)
|
||||
}
|
||||
// Event fields
|
||||
if eventKind.Valid {
|
||||
issue.EventKind = eventKind.String
|
||||
}
|
||||
if actor.Valid {
|
||||
issue.Actor = actor.String
|
||||
}
|
||||
if target.Valid {
|
||||
issue.Target = target.String
|
||||
}
|
||||
if payload.Valid {
|
||||
issue.Payload = payload.String
|
||||
}
|
||||
|
||||
// Fetch labels for this issue
|
||||
labels, err := s.GetLabels(ctx, issue.ID)
|
||||
|
||||
Reference in New Issue
Block a user