agent: move TokenUsage and SkillEvent to the leaf types package · Entire

agent: move TokenUsage and SkillEvent to the leaf types package

8ff1f70→main· Soph·4w ago·5 files·+120 added/-82 removed

The checkpoint contract DTOs embed TokenUsage and SkillEvent, but both lived in the heavy agent package — so any package referencing the checkpoint metadata types transitively pulled in agent (and its TUI/launch/review dependencies). That blocks relocating the contract to a standalone api/checkpoint package.

Move the type definitions (and the SkillEvent string constants) into the existing leaf agent/types package (which has no imports) and leave transparent aliases in agent:

type TokenUsage = types.TokenUsage type SkillEvent = types.SkillEvent (+ the four Skill* sub-types) const SkillEventTypePromptInvocation = types.SkillEventTypePromptInvocation (+ the rest)

All ~34 existing agent.TokenUsage / agent.SkillEvent references keep compiling unchanged via the aliases. The SkillEventExtractor interface stays in agent (it's agent-implementation behavior, not contract data); the constants move alongside the structs so the leaf package is self-contained for constructing skill events. checkpoint.go now references types.* and no longer imports agent — the prerequisite for the api/checkpoint relocation (next in the stack).

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com

Sessions

44f690c46059View transcript

[?
can you run simplify on each PR?Claude Code·Opus 4.8[1m]·5 steps](/content/gh/entireio/cli/session/345ffa6b-bd28-4afc-953f-78cb65a1c2eb#timeline-44f690c46059/index.html)

Changes

5

1
2
3
4
5
6
7
3
4
9
5
6
7
8
9
11
12
13
14
10
11
12
16
17
18
19
13
14
15
16
21
22
23
24
17
18
19
20
21
22
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
23
24
25
26
27
28
29
30
31
32

package agent

// Skill event types recorded in checkpoint metadata. const ( SkillEventTypePromptInvocation = "prompt_invocation" SkillEventTypeToolInvocation = "tool_invocation" ) import "github.com/entireio/cli/cmd/entire/cli/agent/types";

// Skill event source signals. // The skill-event types and their constants live in the leaf agent/types // package so the checkpoint contract can construct and reference skill events // without importing the full agent package. These aliases keep existing // agent.SkillEvent* references working. const ( SkillSignalPiInputSlashCommand = "input_slash_command" SkillSignalPromptSlashCommand = "prompt_slash_command" SkillSignalClaudeSkillToolUse = "skill_tool_use" ); SkillEventTypePromptInvocation = types.SkillEventTypePromptInvocation SkillEventTypeToolInvocation = types.SkillEventTypeToolInvocation

// Skill event confidence values. const ( SkillConfidenceExplicit = "explicit" ); SkillSignalPiInputSlashCommand = types.SkillSignalPiInputSlashCommand SkillSignalPromptSlashCommand = types.SkillSignalPromptSlashCommand SkillSignalClaudeSkillToolUse = types.SkillSignalClaudeSkillToolUse

// Skill event collapse targets. const ( SkillCollapseTargetUserMessage = "user_message" SkillCollapseTargetToolPair = "tool_pair" SkillConfidenceExplicit = types.SkillConfidenceExplicit

SkillCollapseTargetUserMessage = types.SkillCollapseTargetUserMessage SkillCollapseTargetToolPair = types.SkillCollapseTargetToolPair );

// SkillEvent records a native agent skill signal without rewriting the raw transcript. // Consumers use TranscriptAnchor/Native to locate the underlying raw event and Collapse // to decide whether/how to hide verbose skill material by default. type SkillEvent struct { ID string json:"id,omitempty" EventType string json:"event_type" Skill SkillEventSkill json:"skill" Source SkillEventSource json:"source"

TurnID string json:"turn_id,omitempty" Timestamp string json:"timestamp,omitempty"

TranscriptAnchor *SkillEventTranscriptAnchor json:"transcript_anchor,omitempty" Native map[string]string json:"native,omitempty" Collapse SkillEventCollapse json:"collapse" }

type SkillEventSkill struct { Name string json:"name" }

type SkillEventSource struct { Agent string json:"agent" Signal string json:"signal" Confidence string json:"confidence" }

type SkillEventTranscriptAnchor struct { Unit string json:"unit,omitempty" Start int json:"start,omitempty" End int json:"end,omitempty" EntryIDs []string json:"entry_ids,omitempty" ToolUseID string json:"tool_use_id,omitempty" }

type SkillEventCollapse struct { Target string json:"target" Label string json:"label,omitempty" DefaultCollapsed bool json:"default_collapsed" } type ( SkillEvent = types.SkillEvent SkillEventSkill = types.SkillEventSkill SkillEventSource = types.SkillEventSource SkillEventTranscriptAnchor = types.SkillEventTranscriptAnchor SkillEventCollapse = types.SkillEventCollapse )

// SkillEventExtractor is implemented by agents that can derive native skill events // from their transcript format.


Mcmd/entire/cli/agent/skill_events.go+21/-58

1 2 3 3 4 5 6 7 8 9 10 36 unmodified lines

47 48 49 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 50 51 52 53


package agent

import "time"
import (
    "time"

"github.com/entireio/cli/cmd/entire/cli/agent/types"
)

// HookType represents agent lifecycle events
type HookType string
36 unmodified lines

Timestamp  time.Time
}

// TokenUsage represents aggregated token usage for a checkpoint.
// This is agent-agnostic and can be populated by any agent that tracks token usage.
type TokenUsage struct {
    // InputTokens is the number of input tokens (fresh, not from cache)
    InputTokens int `json:"input_tokens"`
    // CacheCreationTokens is tokens written to cache (billable at cache write rate)
    CacheCreationTokens int `json:"cache_creation_tokens"`
    // CacheReadTokens is tokens read from cache (discounted rate)
    CacheReadTokens int `json:"cache_read_tokens"`
    // OutputTokens is the number of output tokens generated
    OutputTokens int `json:"output_tokens"`
    // APICallCount is the number of API calls made
    APICallCount int `json:"api_call_count"`
    // SubagentTokens contains token usage from spawned subagents (if any)
    SubagentTokens *TokenUsage `json:"subagent_tokens,omitempty"`
}
// TokenUsage is defined in the leaf agent/types package so the checkpoint
// contract can reference it without importing the full agent package. The
// alias keeps existing agent.TokenUsage references working.
type TokenUsage = types.TokenUsage
``

Mcmd/entire/cli/agent/types.go+9/-17

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66


package types

// Skill event types recorded in checkpoint metadata.
const (
    SkillEventTypePromptInvocation = "prompt_invocation"
    SkillEventTypeToolInvocation   = "tool_invocation"
)

// Skill event source signals.
const (
    SkillSignalPiInputSlashCommand = "input_slash_command"
    SkillSignalPromptSlashCommand  = "prompt_slash_command"
    SkillSignalClaudeSkillToolUse  = "skill_tool_use"
)

// Skill event confidence values.
const (
    SkillConfidenceExplicit = "explicit"
)

// Skill event collapse targets.
const (
    SkillCollapseTargetUserMessage = "user_message"
    SkillCollapseTargetToolPair    = "tool_pair"
)

TurnID    string `json:"turn_id,omitempty"`
    Timestamp string `json:"timestamp,omitempty"`

type SkillEventSkill struct {
    Name string `json:"name"`
}

type SkillEventSource struct {
    Agent      string `json:"agent"`
    Signal     string `json:"signal"`
    Confidence string `json:"confidence"`
}

type SkillEventCollapse struct {
    Target           string `json:"target"`
    Label            string `json:"label,omitempty"`
    DefaultCollapsed bool   `json:"default_collapsed"`
}

Acmd/entire/cli/agent/types/skill_events.go+66

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

package types

Acmd/entire/cli/agent/types/token_usage.go+18

11 unmodified lines

12 13 14 15 15 16 17 231 unmodified lines

249 250 251 253 252 253 254 256 255 256 257 258 78 unmodified lines

337 338 339 341 340 341 342 343 124 unmodified lines

468 469 470 472 471 472 473 474 475 477 476 477 478 479 76 unmodified lines

556 557 558 560 559 560 561 562

11 unmodified lines

"errors" time".

"github.com/entireio/cli/cmd/entire/cli/agent" "github.com/entireio/cli/cmd/entire/cli/agent/types" "github.com/entireio/cli/cmd/entire/cli/checkpoint/id" "github.com/entireio/cli/redact" 231 unmodified lines

// and the deprecated CommittedMetadata.TranscriptLinesAtStart for backward compatibility.

// TokenUsage contains the token usage for this checkpoint TokenUsage *agent.TokenUsage TokenUsage *types.TokenUsage

// SkillEvents records explicit native skill signals observed in this session. SkillEvents []agent.SkillEvent SkillEvents []types.SkillEvent

// SessionMetrics contains hook-provided session metrics (duration, turns, context usage) SessionMetrics *SessionMetrics 78 unmodified lines

Agent types.AgentType

// SkillEvents replaces the session metadata skill_events when non-empty. SkillEvents []agent.SkillEvent SkillEvents []types.SkillEvent

// PrecomputedBlobs, if non-nil, provides chunk blob hashes and the // content-hash blob hash computed once for this transcript. When set, 124 unmodified lines

TranscriptLinesAtStart int json:"transcript_lines_at_start,omitempty"

// Token usage for this checkpoint TokenUsage *agent.TokenUsage json:"token_usage,omitempty" TokenUsage *types.TokenUsage json:"token_usage,omitempty"

// SkillEvents records explicit native skill signals observed in this session. // Consumers use these anchors to collapse skill-related raw transcript events. SkillEventsVersion int json:"skill_events_version,omitempty" SkillEvents []agent.SkillEvent json:"skill_events,omitempty" SkillEvents []types.SkillEvent json:"skill_events,omitempty"

// SessionMetrics contains hook-provided session metrics (duration, turns, context usage). // Populated for agents that provide these metrics via hooks (e.g., Cursor). 76 unmodified lines

CheckpointsCount int json:"checkpoints_count" FilesTouched []string json:"files_touched" Sessions []SessionFilePaths json:"sessions" TokenUsage *agent.TokenUsage json:"token_usage,omitempty" TokenUsage *types.TokenUsage json:"token_usage,omitempty" CombinedAttribution *InitialAttribution json:"combined_attribution,omitempty"

// HasReview is the umbrella "any review happened" flag: true when at least


Mcmd/entire/cli/checkpoint/checkpoint.go+6/-7