@ironbee-ai/cli 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/analysis/cross-session.d.ts +1 -1
- package/dist/analysis/cross-session.js +1 -1
- package/dist/analysis/cross-session.js.map +1 -1
- package/dist/analysis/time-analysis.js +3 -3
- package/dist/analysis/time-analysis.js.map +1 -1
- package/dist/analysis/verdict-details.d.ts +1 -1
- package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/clear-verdict.js +17 -9
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verification.js +31 -4
- package/dist/clients/claude/hooks/require-verification.js.map +1 -1
- package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-end.js +6 -1
- package/dist/clients/claude/hooks/session-end.js.map +1 -1
- package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +9 -3
- package/dist/clients/claude/hooks/session-start.js.map +1 -1
- package/dist/clients/claude/hooks/track-action.d.ts +25 -4
- package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/claude/hooks/track-action.js +160 -29
- package/dist/clients/claude/hooks/track-action.js.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.js +5 -0
- package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +18 -1
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/claude/util.d.ts +74 -0
- package/dist/clients/claude/util.d.ts.map +1 -0
- package/dist/clients/claude/util.js +352 -0
- package/dist/clients/claude/util.js.map +1 -0
- package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.js +19 -10
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.js +28 -4
- package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
- package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-end.js +6 -1
- package/dist/clients/cursor/hooks/session-end.js.map +1 -1
- package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-start.js +7 -2
- package/dist/clients/cursor/hooks/session-start.js.map +1 -1
- package/dist/clients/cursor/hooks/track-action.d.ts +30 -8
- package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/track-action.js +192 -54
- package/dist/clients/cursor/hooks/track-action.js.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.js +4 -0
- package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +13 -2
- package/dist/clients/cursor/index.js.map +1 -1
- package/dist/clients/cursor/util.d.ts +52 -0
- package/dist/clients/cursor/util.d.ts.map +1 -0
- package/dist/clients/cursor/util.js +264 -0
- package/dist/clients/cursor/util.js.map +1 -0
- package/dist/commands/analyze.js +3 -3
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/hook.js +1 -2
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/process-job-file.d.ts +10 -0
- package/dist/commands/process-job-file.d.ts.map +1 -0
- package/dist/commands/process-job-file.js +19 -0
- package/dist/commands/process-job-file.js.map +1 -0
- package/dist/commands/queue.d.ts +12 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +495 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/hooks/core/actions.d.ts +168 -27
- package/dist/hooks/core/actions.d.ts.map +1 -1
- package/dist/hooks/core/actions.js +81 -4
- package/dist/hooks/core/actions.js.map +1 -1
- package/dist/hooks/core/activity.d.ts.map +1 -1
- package/dist/hooks/core/activity.js +13 -6
- package/dist/hooks/core/activity.js.map +1 -1
- package/dist/hooks/core/session-state.d.ts +19 -7
- package/dist/hooks/core/session-state.d.ts.map +1 -1
- package/dist/hooks/core/session-state.js +66 -12
- package/dist/hooks/core/session-state.js.map +1 -1
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +13 -4
- package/dist/hooks/core/submit-verdict.js.map +1 -1
- package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
- package/dist/hooks/core/verification-lifecycle.js +14 -4
- package/dist/hooks/core/verification-lifecycle.js.map +1 -1
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +31 -19
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/collector.d.ts +64 -5
- package/dist/lib/collector.d.ts.map +1 -1
- package/dist/lib/collector.js +107 -44
- package/dist/lib/collector.js.map +1 -1
- package/dist/lib/config.d.ts +72 -8
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +40 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/queue/dead-letter.d.ts +26 -0
- package/dist/queue/dead-letter.d.ts.map +1 -0
- package/dist/queue/dead-letter.js +233 -0
- package/dist/queue/dead-letter.js.map +1 -0
- package/dist/queue/drain.d.ts +36 -0
- package/dist/queue/drain.d.ts.map +1 -0
- package/dist/queue/drain.js +170 -0
- package/dist/queue/drain.js.map +1 -0
- package/dist/queue/flush.d.ts +64 -0
- package/dist/queue/flush.d.ts.map +1 -0
- package/dist/queue/flush.js +119 -0
- package/dist/queue/flush.js.map +1 -0
- package/dist/queue/handlers/send-event.d.ts +23 -0
- package/dist/queue/handlers/send-event.d.ts.map +1 -0
- package/dist/queue/handlers/send-event.js +131 -0
- package/dist/queue/handlers/send-event.js.map +1 -0
- package/dist/queue/index.d.ts +30 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +71 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/paths.d.ts +40 -0
- package/dist/queue/paths.d.ts.map +1 -0
- package/dist/queue/paths.js +107 -0
- package/dist/queue/paths.js.map +1 -0
- package/dist/queue/process-file.d.ts +22 -0
- package/dist/queue/process-file.d.ts.map +1 -0
- package/dist/queue/process-file.js +257 -0
- package/dist/queue/process-file.js.map +1 -0
- package/dist/queue/register-handlers.d.ts +26 -0
- package/dist/queue/register-handlers.d.ts.map +1 -0
- package/dist/queue/register-handlers.js +36 -0
- package/dist/queue/register-handlers.js.map +1 -0
- package/dist/queue/registry.d.ts +42 -0
- package/dist/queue/registry.d.ts.map +1 -0
- package/dist/queue/registry.js +36 -0
- package/dist/queue/registry.js.map +1 -0
- package/dist/queue/snapshot.d.ts +16 -0
- package/dist/queue/snapshot.d.ts.map +1 -0
- package/dist/queue/snapshot.js +39 -0
- package/dist/queue/snapshot.js.map +1 -0
- package/dist/queue/spawn.d.ts +15 -0
- package/dist/queue/spawn.d.ts.map +1 -0
- package/dist/queue/spawn.js +45 -0
- package/dist/queue/spawn.js.map +1 -0
- package/dist/queue/submit.d.ts +19 -0
- package/dist/queue/submit.d.ts.map +1 -0
- package/dist/queue/submit.js +94 -0
- package/dist/queue/submit.js.map +1 -0
- package/dist/queue/types.d.ts +77 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +83 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/queue/worker-log.d.ts +21 -0
- package/dist/queue/worker-log.d.ts.map +1 -0
- package/dist/queue/worker-log.js +140 -0
- package/dist/queue/worker-log.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,74 +4,215 @@
|
|
|
4
4
|
* Appends typed events to .ironbee/sessions/{sessionId}/actions.jsonl
|
|
5
5
|
* Event types: session_start, tool_call, verification_requested, etc.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* Event type catalog — mirrors Java `EventType` enum.
|
|
9
|
+
* Using a const object + union type gives enum-like ergonomics without
|
|
10
|
+
* blocking raw string literal assignments (e.g. in tests).
|
|
11
|
+
*/
|
|
12
|
+
export declare const EventType: {
|
|
13
|
+
readonly SESSION_START: "session_start";
|
|
14
|
+
readonly SESSION_END: "session_end";
|
|
15
|
+
readonly ACTIVITY_START: "activity_start";
|
|
16
|
+
readonly ACTIVITY_END: "activity_end";
|
|
17
|
+
readonly VERIFICATION_START: "verification_start";
|
|
18
|
+
readonly VERIFICATION_END: "verification_end";
|
|
19
|
+
readonly VERIFICATION_REQUESTED: "verification_requested";
|
|
20
|
+
readonly VERDICT_WRITE: "verdict_write";
|
|
21
|
+
readonly FIX_START: "fix_start";
|
|
22
|
+
readonly FIX_END: "fix_end";
|
|
23
|
+
readonly FILE_EDIT: "file_edit";
|
|
24
|
+
readonly TOOL_CALL: "tool_call";
|
|
25
|
+
};
|
|
26
|
+
export type EventTypeValue = typeof EventType[keyof typeof EventType];
|
|
7
27
|
export interface ActionEntry {
|
|
8
|
-
id
|
|
9
|
-
type:
|
|
10
|
-
timestamp:
|
|
28
|
+
id: string;
|
|
29
|
+
type: EventTypeValue;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
session_id: string;
|
|
32
|
+
project_name: string;
|
|
33
|
+
user_email?: string;
|
|
11
34
|
[key: string]: unknown;
|
|
12
35
|
}
|
|
13
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Resolve project name by walking up from the given directory looking for a
|
|
38
|
+
* `.git` entry (directory or file — the latter covers worktrees). If a git
|
|
39
|
+
* root is found, its basename becomes the project name. Otherwise falls back
|
|
40
|
+
* to the basename of the starting directory.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveProjectName(startDir: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Base fields that every event must carry — derived from the actionsFile path.
|
|
45
|
+
* Writers spread this into concrete event constructions to satisfy the strict
|
|
46
|
+
* `ActionEntry` contract without duplicating derivation logic.
|
|
47
|
+
*
|
|
48
|
+
* `user_email` is read from the per-session `state.json` (populated once at
|
|
49
|
+
* session start). If state.json is absent or the field is unset, it is
|
|
50
|
+
* omitted from the returned object so JSON.stringify drops it downstream.
|
|
51
|
+
*/
|
|
52
|
+
export declare function baseFields(actionsFile: string): {
|
|
53
|
+
id: string;
|
|
54
|
+
session_id: string;
|
|
55
|
+
project_name: string;
|
|
56
|
+
user_email?: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Marker interfaces for hierarchical parent IDs.
|
|
60
|
+
* Hierarchy: session > activity > verification + fix.
|
|
61
|
+
* VerificationAware and FixAware extend ActivityAware — a verification or fix
|
|
62
|
+
* cycle is always part of an activity turn.
|
|
63
|
+
*/
|
|
64
|
+
export interface ActivityAwareActionEntry extends ActionEntry {
|
|
65
|
+
activity_id: string;
|
|
66
|
+
}
|
|
67
|
+
export interface VerificationAwareActionEntry extends ActivityAwareActionEntry {
|
|
68
|
+
verification_id: string;
|
|
69
|
+
}
|
|
70
|
+
export interface FixAwareActionEntry extends ActivityAwareActionEntry {
|
|
71
|
+
fix_id: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A tool_call event. Extends ActivityAwareActionEntry (activity is always
|
|
75
|
+
* known when a tool runs) but NOT VerificationAwareActionEntry — tool calls
|
|
76
|
+
* happen everywhere in a session, most of them outside verification cycles
|
|
77
|
+
* (Bash / Edit / Read fire any time the agent wants, whereas verification
|
|
78
|
+
* cycles are bounded windows explicitly opened by the agent). Downstream
|
|
79
|
+
* schema must therefore treat `verification_id` and `trace_id` as optional.
|
|
80
|
+
*/
|
|
81
|
+
export interface ToolCallAction extends ActivityAwareActionEntry {
|
|
14
82
|
type: "tool_call";
|
|
83
|
+
/**
|
|
84
|
+
* Canonical tool identity after classification:
|
|
85
|
+
* - `tool_type="mcp"` → bare tool name WITHOUT server prefix (e.g. `"bdt_navigation_go-to"`)
|
|
86
|
+
* - `tool_type="skill"` → skill name from `tool_input.skill` (e.g. `"commit"`)
|
|
87
|
+
* - `tool_type="sub_agent"` → sub-agent type from `tool_input.subagent_type` (e.g. `"code-reviewer"`)
|
|
88
|
+
* - `tool_type=null` → the raw tool name (`"Read"`, `"Bash"`, …)
|
|
89
|
+
* See `src/lib/tool-taxonomy.ts:classifyTool`.
|
|
90
|
+
*/
|
|
15
91
|
tool_name: string;
|
|
92
|
+
/**
|
|
93
|
+
* Coarse classification of the tool invocation. `null` for native
|
|
94
|
+
* (Read/Write/Bash/…) tool calls; otherwise one of the three special
|
|
95
|
+
* buckets.
|
|
96
|
+
*/
|
|
97
|
+
tool_type?: "mcp" | "skill" | "sub_agent" | null;
|
|
98
|
+
/**
|
|
99
|
+
* Hook-provided tool invocation id. Claude sets `tool_use_id` on both
|
|
100
|
+
* PreToolUse and PostToolUse stdin; Cursor sets it on postToolUse. Lets
|
|
101
|
+
* collector joins correlate a `tool_call` event with the MCP server's
|
|
102
|
+
* own span for the same invocation. Absent on nested (bdt_execute-parsed)
|
|
103
|
+
* entries since those never enter the hook lifecycle with a dedicated id.
|
|
104
|
+
*/
|
|
105
|
+
tool_use_id?: string;
|
|
16
106
|
tool_input?: unknown;
|
|
17
107
|
tool_response?: unknown;
|
|
108
|
+
/**
|
|
109
|
+
* UTF-8 byte length of `tool_input` (serialized when non-string). Used
|
|
110
|
+
* for size-only telemetry where the raw content would leak sensitive
|
|
111
|
+
* data. `actions.jsonl` entries keep the raw fields; queue `send_event`
|
|
112
|
+
* wire payloads strip content and carry only sizes.
|
|
113
|
+
*/
|
|
114
|
+
tool_input_size?: number;
|
|
115
|
+
/** UTF-8 byte length of `tool_response`. See `tool_input_size`. */
|
|
116
|
+
tool_response_size?: number;
|
|
117
|
+
/** Present only when the tool call ran inside a verification cycle. */
|
|
118
|
+
verification_id?: string;
|
|
119
|
+
/** Present only when the tool call ran inside a verification cycle (OTel correlation). */
|
|
120
|
+
trace_id?: string;
|
|
121
|
+
/**
|
|
122
|
+
* MCP server name owning this tool, when applicable. Claude fills this
|
|
123
|
+
* from its `mcp__<server>__<tool>` naming convention; Cursor leaves it
|
|
124
|
+
* null because none of Cursor's hook stdin fields expose the server.
|
|
125
|
+
* `null` means either "not an MCP tool" OR "Cursor adapter couldn't
|
|
126
|
+
* determine it".
|
|
127
|
+
*/
|
|
128
|
+
mcp_server?: string | null;
|
|
129
|
+
/**
|
|
130
|
+
* Tool wall-clock duration in ms — pure tool-execution time, excluding
|
|
131
|
+
* PreToolUse hooks and permission-prompt wait. Claude Code supplies it
|
|
132
|
+
* on both PostToolUse and PostToolUseFailure via stdin `duration_ms`;
|
|
133
|
+
* Cursor supplies it on postToolUseFailure (and sometimes postToolUse).
|
|
134
|
+
* `null` on pre-duration-support Claude versions.
|
|
135
|
+
* Downstream must treat missing / null as "unknown" not "zero".
|
|
136
|
+
*/
|
|
137
|
+
duration?: number | null;
|
|
138
|
+
error?: string;
|
|
18
139
|
}
|
|
19
|
-
export interface VerificationRequestedAction extends
|
|
140
|
+
export interface VerificationRequestedAction extends ActivityAwareActionEntry {
|
|
20
141
|
type: "verification_requested";
|
|
21
|
-
action
|
|
22
|
-
reason
|
|
142
|
+
action: "allow" | "block";
|
|
143
|
+
reason: string;
|
|
23
144
|
}
|
|
24
|
-
|
|
145
|
+
/**
|
|
146
|
+
* Verdict payload recorded inside VerdictWriteAction.
|
|
147
|
+
* Mirrors the Java `Verdict` domain class: status/pages_tested/checks are
|
|
148
|
+
* always present; counts and issue/fix lists are optional.
|
|
149
|
+
*/
|
|
150
|
+
export interface Verdict {
|
|
151
|
+
status: string;
|
|
152
|
+
pages_tested: string[];
|
|
153
|
+
checks: string[];
|
|
154
|
+
console_errors?: number;
|
|
155
|
+
network_failures?: number;
|
|
156
|
+
issues?: string[];
|
|
157
|
+
fixes?: string[];
|
|
158
|
+
}
|
|
159
|
+
export interface VerdictWriteAction extends VerificationAwareActionEntry {
|
|
25
160
|
type: "verdict_write";
|
|
26
|
-
|
|
161
|
+
trace_id?: string;
|
|
162
|
+
verdict: Verdict;
|
|
27
163
|
}
|
|
28
|
-
export interface FileEditAction extends
|
|
164
|
+
export interface FileEditAction extends FixAwareActionEntry {
|
|
29
165
|
type: "file_edit";
|
|
30
166
|
tool_name: string;
|
|
31
|
-
file_path
|
|
167
|
+
file_path: string;
|
|
32
168
|
}
|
|
33
169
|
export interface SessionStartAction extends ActionEntry {
|
|
34
170
|
type: "session_start";
|
|
35
|
-
|
|
171
|
+
source: string;
|
|
36
172
|
client?: string;
|
|
37
|
-
source?: string;
|
|
38
173
|
}
|
|
39
174
|
export interface SessionEndAction extends ActionEntry {
|
|
40
175
|
type: "session_end";
|
|
41
|
-
session_id: string;
|
|
42
176
|
duration?: number;
|
|
43
177
|
reason?: string;
|
|
44
178
|
}
|
|
45
|
-
export interface VerificationStartAction extends
|
|
179
|
+
export interface VerificationStartAction extends VerificationAwareActionEntry {
|
|
46
180
|
type: "verification_start";
|
|
47
|
-
|
|
48
|
-
trace_id?: string;
|
|
181
|
+
trace_id: string;
|
|
49
182
|
}
|
|
50
|
-
export interface VerificationEndAction extends
|
|
183
|
+
export interface VerificationEndAction extends VerificationAwareActionEntry {
|
|
51
184
|
type: "verification_end";
|
|
52
|
-
|
|
53
|
-
trace_id?: string;
|
|
185
|
+
trace_id: string;
|
|
54
186
|
duration?: number;
|
|
55
187
|
status?: string;
|
|
188
|
+
reason?: string;
|
|
56
189
|
}
|
|
57
|
-
export interface FixStartAction extends
|
|
190
|
+
export interface FixStartAction extends FixAwareActionEntry {
|
|
58
191
|
type: "fix_start";
|
|
59
|
-
fix_id: string;
|
|
60
192
|
}
|
|
61
|
-
export interface FixEndAction extends
|
|
193
|
+
export interface FixEndAction extends FixAwareActionEntry {
|
|
62
194
|
type: "fix_end";
|
|
63
|
-
fix_id: string;
|
|
64
195
|
duration?: number;
|
|
196
|
+
reason?: string;
|
|
65
197
|
}
|
|
66
|
-
export interface ActivityStartAction extends
|
|
198
|
+
export interface ActivityStartAction extends ActivityAwareActionEntry {
|
|
67
199
|
type: "activity_start";
|
|
68
200
|
source?: string;
|
|
69
201
|
}
|
|
70
|
-
export interface ActivityEndAction extends
|
|
202
|
+
export interface ActivityEndAction extends ActivityAwareActionEntry {
|
|
71
203
|
type: "activity_end";
|
|
72
204
|
duration?: number;
|
|
205
|
+
reason?: string;
|
|
73
206
|
}
|
|
74
|
-
export
|
|
207
|
+
export type AppendActionInput = {
|
|
208
|
+
type: EventTypeValue;
|
|
209
|
+
timestamp: number;
|
|
210
|
+
id?: string;
|
|
211
|
+
session_id?: string;
|
|
212
|
+
project_name?: string;
|
|
213
|
+
[key: string]: unknown;
|
|
214
|
+
};
|
|
215
|
+
export declare function appendAction(actionsFile: string, entry: AppendActionInput): Promise<void>;
|
|
75
216
|
/**
|
|
76
217
|
* Find the last action of a given type in actions.jsonl and calculate
|
|
77
218
|
* duration from its timestamp to now.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,WAAW;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* Event types: session_start, tool_call, verification_requested, etc.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.EventType = void 0;
|
|
10
|
+
exports.resolveProjectName = resolveProjectName;
|
|
11
|
+
exports.baseFields = baseFields;
|
|
9
12
|
exports.appendAction = appendAction;
|
|
10
13
|
exports.findDurationSinceLastAction = findDurationSinceLastAction;
|
|
11
14
|
exports.readActionsSinceLastMarker = readActionsSinceLastMarker;
|
|
@@ -18,9 +21,84 @@ const crypto_1 = require("crypto");
|
|
|
18
21
|
const path_1 = require("path");
|
|
19
22
|
const logger_1 = require("../../lib/logger");
|
|
20
23
|
const collector_1 = require("../../lib/collector");
|
|
24
|
+
/**
|
|
25
|
+
* Event type catalog — mirrors Java `EventType` enum.
|
|
26
|
+
* Using a const object + union type gives enum-like ergonomics without
|
|
27
|
+
* blocking raw string literal assignments (e.g. in tests).
|
|
28
|
+
*/
|
|
29
|
+
exports.EventType = {
|
|
30
|
+
SESSION_START: "session_start",
|
|
31
|
+
SESSION_END: "session_end",
|
|
32
|
+
ACTIVITY_START: "activity_start",
|
|
33
|
+
ACTIVITY_END: "activity_end",
|
|
34
|
+
VERIFICATION_START: "verification_start",
|
|
35
|
+
VERIFICATION_END: "verification_end",
|
|
36
|
+
VERIFICATION_REQUESTED: "verification_requested",
|
|
37
|
+
VERDICT_WRITE: "verdict_write",
|
|
38
|
+
FIX_START: "fix_start",
|
|
39
|
+
FIX_END: "fix_end",
|
|
40
|
+
FILE_EDIT: "file_edit",
|
|
41
|
+
TOOL_CALL: "tool_call",
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Resolve project name by walking up from the given directory looking for a
|
|
45
|
+
* `.git` entry (directory or file — the latter covers worktrees). If a git
|
|
46
|
+
* root is found, its basename becomes the project name. Otherwise falls back
|
|
47
|
+
* to the basename of the starting directory.
|
|
48
|
+
*/
|
|
49
|
+
function resolveProjectName(startDir) {
|
|
50
|
+
let current = startDir;
|
|
51
|
+
while (true) {
|
|
52
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(current, ".git"))) {
|
|
53
|
+
return (0, path_1.basename)(current);
|
|
54
|
+
}
|
|
55
|
+
const parent = (0, path_1.dirname)(current);
|
|
56
|
+
if (parent === current) {
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
current = parent;
|
|
60
|
+
}
|
|
61
|
+
return (0, path_1.basename)(startDir);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Base fields that every event must carry — derived from the actionsFile path.
|
|
65
|
+
* Writers spread this into concrete event constructions to satisfy the strict
|
|
66
|
+
* `ActionEntry` contract without duplicating derivation logic.
|
|
67
|
+
*
|
|
68
|
+
* `user_email` is read from the per-session `state.json` (populated once at
|
|
69
|
+
* session start). If state.json is absent or the field is unset, it is
|
|
70
|
+
* omitted from the returned object so JSON.stringify drops it downstream.
|
|
71
|
+
*/
|
|
72
|
+
function baseFields(actionsFile) {
|
|
73
|
+
const sessionId = (0, path_1.basename)((0, path_1.dirname)(actionsFile));
|
|
74
|
+
const projectDir = (0, path_1.dirname)((0, path_1.dirname)((0, path_1.dirname)((0, path_1.dirname)(actionsFile))));
|
|
75
|
+
const sessionDir = (0, path_1.dirname)(actionsFile);
|
|
76
|
+
// Local require to avoid a circular import between actions.ts and
|
|
77
|
+
// session-state.ts (which imports several action types).
|
|
78
|
+
const { getUserEmail } = require("./session-state");
|
|
79
|
+
const userEmail = getUserEmail(sessionDir);
|
|
80
|
+
const out = {
|
|
81
|
+
id: (0, crypto_1.randomUUID)(),
|
|
82
|
+
session_id: sessionId,
|
|
83
|
+
project_name: resolveProjectName(projectDir),
|
|
84
|
+
};
|
|
85
|
+
if (userEmail) {
|
|
86
|
+
out.user_email = userEmail;
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
21
90
|
async function appendAction(actionsFile, entry) {
|
|
91
|
+
// Safety net: enrich base fields from path if caller left any blank.
|
|
92
|
+
// Writers using `baseFields(actionsFile)` already have these set.
|
|
93
|
+
const base = baseFields(actionsFile);
|
|
22
94
|
if (!entry.id) {
|
|
23
|
-
entry.id =
|
|
95
|
+
entry.id = base.id;
|
|
96
|
+
}
|
|
97
|
+
if (!entry.session_id) {
|
|
98
|
+
entry.session_id = base.session_id;
|
|
99
|
+
}
|
|
100
|
+
if (!entry.project_name) {
|
|
101
|
+
entry.project_name = base.project_name;
|
|
24
102
|
}
|
|
25
103
|
try {
|
|
26
104
|
(0, fs_1.mkdirSync)((0, path_1.dirname)(actionsFile), { recursive: true });
|
|
@@ -56,9 +134,8 @@ function findDurationSinceLastAction(actionsFile, actionType, now) {
|
|
|
56
134
|
for (let i = lines.length - 1; i >= 0; i--) {
|
|
57
135
|
try {
|
|
58
136
|
const entry = JSON.parse(lines[i]);
|
|
59
|
-
if (entry.type === actionType && entry.timestamp) {
|
|
60
|
-
|
|
61
|
-
return now - startTime;
|
|
137
|
+
if (entry.type === actionType && typeof entry.timestamp === "number") {
|
|
138
|
+
return now - entry.timestamp;
|
|
62
139
|
}
|
|
63
140
|
}
|
|
64
141
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxE"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.startActivity = startActivity;
|
|
12
12
|
exports.endActivity = endActivity;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
13
14
|
const logger_1 = require("../../lib/logger");
|
|
14
15
|
const session_state_1 = require("./session-state");
|
|
15
16
|
const actions_1 = require("./actions");
|
|
@@ -18,29 +19,35 @@ async function startActivity(input) {
|
|
|
18
19
|
if ((0, session_state_1.isActive)(sessionDir)) {
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
21
|
-
(0,
|
|
22
|
+
const activityId = (0, crypto_1.randomUUID)();
|
|
23
|
+
(0, session_state_1.setActiveActivity)(sessionDir, activityId);
|
|
22
24
|
const entry = {
|
|
25
|
+
...(0, actions_1.baseFields)(actionsFile),
|
|
23
26
|
type: "activity_start",
|
|
24
|
-
timestamp:
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
activity_id: activityId,
|
|
25
29
|
source,
|
|
26
30
|
};
|
|
27
31
|
await (0, actions_1.appendAction)(actionsFile, entry);
|
|
28
|
-
logger_1.logger.debug(`activity-start: source=${source ?? "unknown"}`);
|
|
32
|
+
logger_1.logger.debug(`activity-start: ${activityId} source=${source ?? "unknown"}`);
|
|
29
33
|
}
|
|
30
34
|
async function endActivity(input) {
|
|
31
35
|
const { sessionDir, actionsFile } = input;
|
|
32
36
|
if (!(0, session_state_1.isActive)(sessionDir)) {
|
|
33
37
|
return;
|
|
34
38
|
}
|
|
35
|
-
(0, session_state_1.
|
|
39
|
+
const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
|
|
40
|
+
(0, session_state_1.clearActiveActivity)(sessionDir);
|
|
36
41
|
const now = Date.now();
|
|
37
42
|
const duration = (0, actions_1.findDurationSinceLastAction)(actionsFile, "activity_start", now);
|
|
38
43
|
const entry = {
|
|
44
|
+
...(0, actions_1.baseFields)(actionsFile),
|
|
39
45
|
type: "activity_end",
|
|
40
|
-
timestamp:
|
|
46
|
+
timestamp: now,
|
|
47
|
+
activity_id: activityId,
|
|
41
48
|
duration,
|
|
42
49
|
};
|
|
43
50
|
await (0, actions_1.appendAction)(actionsFile, entry);
|
|
44
|
-
logger_1.logger.debug(`activity-end: duration=${duration ?? "unknown"}`);
|
|
51
|
+
logger_1.logger.debug(`activity-end: ${activityId ?? ""} duration=${duration ?? "unknown"}`);
|
|
45
52
|
}
|
|
46
53
|
//# sourceMappingURL=activity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAkBH,sCAmBC;AAED,kCAsBC;AA3DD,mCAAoC;AACpC,6CAA0C;AAC1C,mDAAwG;AACxG,uCAA0H;AAanH,KAAK,UAAU,aAAa,CAAC,KAAyB;IACzD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAElD,IAAI,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAW,IAAA,mBAAU,GAAE,CAAC;IACxC,IAAA,iCAAiB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAwB;QAC/B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,UAAU;QACvB,MAAM;KACT,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,WAAW,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AAChF,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,KAAuB;IACrD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAE1C,IAAI,CAAC,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACxB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAuB,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IACvE,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAuB,IAAA,qCAA2B,EAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAErG,MAAM,KAAK,GAAsB;QAC7B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,UAAW;QACxB,QAAQ;KACX,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,IAAI,EAAE,aAAa,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* All session state (retries, activeVerificationId, lastVerdictStatus)
|
|
6
6
|
* is stored in a single state.json file per session.
|
|
7
7
|
*/
|
|
8
|
+
import { ActionEntry } from "./actions";
|
|
8
9
|
export type SessionPhase = "coding" | "verifying" | "fixing" | null;
|
|
9
10
|
export interface SessionState {
|
|
10
11
|
retries: number;
|
|
@@ -12,10 +13,18 @@ export interface SessionState {
|
|
|
12
13
|
activeTraceId: string | null;
|
|
13
14
|
lastVerdictStatus: string | null;
|
|
14
15
|
activeFixId: string | null;
|
|
16
|
+
activeActivityId: string | null;
|
|
15
17
|
phase: SessionPhase;
|
|
16
18
|
recordingRequired: boolean;
|
|
17
19
|
recordingActive: boolean;
|
|
18
20
|
active: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Authenticated user email, resolved once at session start and attached
|
|
23
|
+
* to every action/event via `baseFields()`. Cached here so hooks avoid
|
|
24
|
+
* re-reading `~/.claude.json` / stdin on every invocation.
|
|
25
|
+
* `null` = unauthenticated session or lookup failed.
|
|
26
|
+
*/
|
|
27
|
+
userEmail: string | null;
|
|
19
28
|
}
|
|
20
29
|
/** Generate an OTEL-compatible trace ID (32 hex chars / 16 bytes). */
|
|
21
30
|
export declare function generateTraceId(): string;
|
|
@@ -41,16 +50,19 @@ export declare function isRecordingActive(sessionDir: string): boolean;
|
|
|
41
50
|
export declare function setRecordingActive(sessionDir: string, active: boolean): void;
|
|
42
51
|
export declare function isActive(sessionDir: string): boolean;
|
|
43
52
|
export declare function setActive(sessionDir: string, active: boolean): void;
|
|
53
|
+
export declare function getActiveActivityId(sessionDir: string): string | undefined;
|
|
54
|
+
export declare function getUserEmail(sessionDir: string): string | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Persist the authenticated user email into state.json. Idempotent — writing
|
|
57
|
+
* the same value twice is a no-op write. `null` / empty clears the field.
|
|
58
|
+
*/
|
|
59
|
+
export declare function setUserEmail(sessionDir: string, email: string | null | undefined): void;
|
|
60
|
+
export declare function setActiveActivity(sessionDir: string, activityId: string): void;
|
|
61
|
+
export declare function clearActiveActivity(sessionDir: string): void;
|
|
44
62
|
/**
|
|
45
63
|
* Reconcile session state on session start/resume.
|
|
46
64
|
* Closes any open verification or fix cycles, records appropriate
|
|
47
65
|
* end entries in actions.jsonl, and resets phase to "coding".
|
|
48
|
-
*
|
|
49
|
-
* @param appendFn — action appender function (avoids circular import with actions.ts)
|
|
50
66
|
*/
|
|
51
|
-
export declare function reconcileSessionState(sessionDir: string, actionsFile: string, appendFn: (file: string, entry:
|
|
52
|
-
type: string;
|
|
53
|
-
timestamp: string;
|
|
54
|
-
[key: string]: unknown;
|
|
55
|
-
}) => Promise<void>): Promise<void>;
|
|
67
|
+
export declare function reconcileSessionState(sessionDir: string, actionsFile: string, appendFn: (file: string, entry: ActionEntry) => Promise<void>): Promise<void>;
|
|
56
68
|
//# sourceMappingURL=session-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/session-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/session-state.ts"],"names":[],"mappings":"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"}
|