specweave 1.0.395 → 1.0.397
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/README.md +2 -0
- package/bin/specweave.js +22 -0
- package/dist/dashboard/assets/index-DMjF8l_s.css +1 -0
- package/dist/dashboard/assets/index-Dfd-aHLI.js +11 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/src/core/config/types.d.ts +1 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js +1 -0
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts +10 -4
- package/dist/src/core/lazy-loading/llm-plugin-detector.d.ts.map +1 -1
- package/dist/src/core/lazy-loading/llm-plugin-detector.js +51 -49
- package/dist/src/core/lazy-loading/llm-plugin-detector.js.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.d.ts +6 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +114 -15
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/dashboard/server/hooks/handlers/passthrough.d.ts +8 -0
- package/dist/src/dashboard/server/hooks/handlers/passthrough.d.ts.map +1 -0
- package/dist/src/dashboard/server/hooks/handlers/passthrough.js +9 -0
- package/dist/src/dashboard/server/hooks/handlers/passthrough.js.map +1 -0
- package/dist/src/dashboard/server/hooks/handlers/pre-tool-use.d.ts +7 -0
- package/dist/src/dashboard/server/hooks/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/src/dashboard/server/hooks/handlers/pre-tool-use.js +42 -0
- package/dist/src/dashboard/server/hooks/handlers/pre-tool-use.js.map +1 -0
- package/dist/src/dashboard/server/hooks/handlers/subagent-lifecycle.d.ts +5 -0
- package/dist/src/dashboard/server/hooks/handlers/subagent-lifecycle.d.ts.map +1 -0
- package/dist/src/dashboard/server/hooks/handlers/subagent-lifecycle.js +31 -0
- package/dist/src/dashboard/server/hooks/handlers/subagent-lifecycle.js.map +1 -0
- package/dist/src/dashboard/server/hooks/hook-event-router.d.ts +24 -0
- package/dist/src/dashboard/server/hooks/hook-event-router.d.ts.map +1 -0
- package/dist/src/dashboard/server/hooks/hook-event-router.js +77 -0
- package/dist/src/dashboard/server/hooks/hook-event-router.js.map +1 -0
- package/dist/src/dashboard/server/hooks/hook-event-store.d.ts +46 -0
- package/dist/src/dashboard/server/hooks/hook-event-store.d.ts.map +1 -0
- package/dist/src/dashboard/server/hooks/hook-event-store.js +203 -0
- package/dist/src/dashboard/server/hooks/hook-event-store.js.map +1 -0
- package/dist/src/dashboard/types.d.ts +22 -1
- package/dist/src/dashboard/types.d.ts.map +1 -1
- package/dist/src/hooks/generate-settings.d.ts +8 -0
- package/dist/src/hooks/generate-settings.d.ts.map +1 -0
- package/dist/src/hooks/generate-settings.js +70 -0
- package/dist/src/hooks/generate-settings.js.map +1 -0
- package/dist/src/hooks/hooks-status.d.ts +12 -0
- package/dist/src/hooks/hooks-status.d.ts.map +1 -0
- package/dist/src/hooks/hooks-status.js +101 -0
- package/dist/src/hooks/hooks-status.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/hooks/.specweave/logs/auto-iterations.log +1 -0
- package/plugins/specweave/hooks/.specweave/logs/auto-stop-reasons.log +1 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +80 -50
- package/plugins/specweave/skills/.specweave/logs/reflect/auto-reflect.log +15 -0
- package/plugins/specweave/skills/.specweave/logs/reflect/reflect.log +3 -0
- package/plugins/specweave/skills/.specweave/logs/stop-auto.log +1 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +180 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +1266 -0
- package/plugins/specweave-github/lib/enhanced-github-sync.js +249 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +150 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1260 -0
- package/dist/dashboard/assets/index-Bg3O0ISk.js +0 -11
- package/dist/dashboard/assets/index-SBBktW9a.css +0 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { HookEvent } from '../../types.js';
|
|
2
|
+
import type { HookEventStore } from './hook-event-store.js';
|
|
3
|
+
export interface HookPayload {
|
|
4
|
+
eventName: string;
|
|
5
|
+
body: unknown;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HookResponse {
|
|
9
|
+
status: number;
|
|
10
|
+
body?: unknown;
|
|
11
|
+
storedEvent?: HookEvent;
|
|
12
|
+
}
|
|
13
|
+
export type HookHandler = (payload: HookPayload) => Promise<HookResponse>;
|
|
14
|
+
export declare class HookEventRouter {
|
|
15
|
+
private store;
|
|
16
|
+
private projectRoot;
|
|
17
|
+
private handlers;
|
|
18
|
+
private logPath;
|
|
19
|
+
constructor(store: HookEventStore, projectRoot: string);
|
|
20
|
+
register(eventName: string, handler: HookHandler): void;
|
|
21
|
+
handle(eventName: string, body: unknown): Promise<HookResponse>;
|
|
22
|
+
private appendLog;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=hook-event-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-event-router.d.ts","sourceRoot":"","sources":["../../../../../src/dashboard/server/hooks/hook-event-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE1E,qBAAa,eAAe;IAKxB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,WAAW;IALrB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAS;gBAGd,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,MAAM;IAK7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIjD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAsDrE,OAAO,CAAC,SAAS;CAWlB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
4
|
+
export class HookEventRouter {
|
|
5
|
+
constructor(store, projectRoot) {
|
|
6
|
+
this.store = store;
|
|
7
|
+
this.projectRoot = projectRoot;
|
|
8
|
+
this.handlers = new Map();
|
|
9
|
+
this.logPath = path.join(projectRoot, '.specweave', 'logs', 'hooks.log');
|
|
10
|
+
}
|
|
11
|
+
register(eventName, handler) {
|
|
12
|
+
this.handlers.set(eventName, handler);
|
|
13
|
+
}
|
|
14
|
+
async handle(eventName, body) {
|
|
15
|
+
const handler = this.handlers.get(eventName);
|
|
16
|
+
if (!handler) {
|
|
17
|
+
return { status: 400, body: { error: `Unknown event type: ${eventName}` } };
|
|
18
|
+
}
|
|
19
|
+
const sessionId = (body && typeof body === 'object' && 'sessionId' in body)
|
|
20
|
+
? String(body.sessionId)
|
|
21
|
+
: 'unknown';
|
|
22
|
+
const payload = { eventName, body, sessionId };
|
|
23
|
+
const start = Date.now();
|
|
24
|
+
try {
|
|
25
|
+
const result = await handler(payload);
|
|
26
|
+
const durationMs = Date.now() - start;
|
|
27
|
+
const event = {
|
|
28
|
+
id: randomUUID(),
|
|
29
|
+
eventName: eventName,
|
|
30
|
+
sessionId,
|
|
31
|
+
timestamp: new Date().toISOString(),
|
|
32
|
+
payload: body,
|
|
33
|
+
durationMs,
|
|
34
|
+
result: (() => {
|
|
35
|
+
if (!result.body || typeof result.body !== 'object')
|
|
36
|
+
return undefined;
|
|
37
|
+
const hso = result.body.hookSpecificOutput;
|
|
38
|
+
if (!hso)
|
|
39
|
+
return undefined;
|
|
40
|
+
const decision = hso.permissionDecision;
|
|
41
|
+
if (!decision)
|
|
42
|
+
return undefined;
|
|
43
|
+
return { decision: decision, reason: hso.permissionDecisionReason ?? undefined };
|
|
44
|
+
})(),
|
|
45
|
+
};
|
|
46
|
+
this.store.addEvent(event);
|
|
47
|
+
return { ...result, storedEvent: event };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
const durationMs = Date.now() - start;
|
|
51
|
+
this.appendLog(eventName, err);
|
|
52
|
+
const event = {
|
|
53
|
+
id: randomUUID(),
|
|
54
|
+
eventName: eventName,
|
|
55
|
+
sessionId,
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
payload: body,
|
|
58
|
+
durationMs,
|
|
59
|
+
};
|
|
60
|
+
this.store.addEvent(event);
|
|
61
|
+
return { status: 200, body: {}, storedEvent: event };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
appendLog(eventName, err) {
|
|
65
|
+
try {
|
|
66
|
+
const logDir = path.dirname(this.logPath);
|
|
67
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
68
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
69
|
+
const line = `[${new Date().toISOString()}] [${eventName}] ERROR: ${message}\n`;
|
|
70
|
+
fs.appendFileSync(this.logPath, line);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Logging failure must never propagate
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=hook-event-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-event-router.js","sourceRoot":"","sources":["../../../../../src/dashboard/server/hooks/hook-event-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { HookEvent, AgentRecord } from '../../types.js';
|
|
2
|
+
export interface AgentUpdate {
|
|
3
|
+
agentId: string;
|
|
4
|
+
agentType: string;
|
|
5
|
+
sessionId: string;
|
|
6
|
+
startedAt?: string;
|
|
7
|
+
stoppedAt?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface EventQueryOptions {
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
eventType?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AgentQueryOptions {
|
|
15
|
+
sessionId?: string;
|
|
16
|
+
status?: 'running' | 'stopped';
|
|
17
|
+
}
|
|
18
|
+
export interface StoreStats {
|
|
19
|
+
totalEvents: number;
|
|
20
|
+
activeSessions: number;
|
|
21
|
+
activeAgents: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class HookEventStore {
|
|
24
|
+
private projectRoot;
|
|
25
|
+
private eventsBySession;
|
|
26
|
+
private agents;
|
|
27
|
+
private eventsFilePath;
|
|
28
|
+
private agentsFilePath;
|
|
29
|
+
private totalEventCount;
|
|
30
|
+
private fileSizes;
|
|
31
|
+
private dirEnsured;
|
|
32
|
+
constructor(projectRoot: string);
|
|
33
|
+
addEvent(event: HookEvent): void;
|
|
34
|
+
updateAgent(data: AgentUpdate): void;
|
|
35
|
+
getEvents(opts?: EventQueryOptions): HookEvent[];
|
|
36
|
+
getAgents(opts?: AgentQueryOptions): AgentRecord[];
|
|
37
|
+
getStats(): StoreStats;
|
|
38
|
+
flush(): void;
|
|
39
|
+
hydrate(): Promise<void>;
|
|
40
|
+
cleanup(): void;
|
|
41
|
+
private hydrateFile;
|
|
42
|
+
private ensureDir;
|
|
43
|
+
private getFileSize;
|
|
44
|
+
private appendJSONL;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=hook-event-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-event-store.d.ts","sourceRoot":"","sources":["../../../../../src/dashboard/server/hooks/hook-event-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IASb,OAAO,CAAC,WAAW;IAR/B,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAAS;gBAEP,WAAW,EAAE,MAAM;IAMvC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAchC,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAuBpC,SAAS,CAAC,IAAI,GAAE,iBAAsB,GAAG,SAAS,EAAE;IAmBpD,SAAS,CAAC,IAAI,GAAE,iBAAsB,GAAG,WAAW,EAAE;IAatD,QAAQ,IAAI,UAAU;IAQtB,KAAK,IAAI,IAAI;IAKP,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC9B,OAAO,IAAI,IAAI;YAmBD,WAAW;IAezB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;CAiBpB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as readline from 'readline';
|
|
4
|
+
export class HookEventStore {
|
|
5
|
+
constructor(projectRoot) {
|
|
6
|
+
this.projectRoot = projectRoot;
|
|
7
|
+
this.eventsBySession = new Map();
|
|
8
|
+
this.agents = new Map();
|
|
9
|
+
this.totalEventCount = 0;
|
|
10
|
+
this.fileSizes = new Map();
|
|
11
|
+
this.dirEnsured = false;
|
|
12
|
+
const hooksDir = path.join(projectRoot, '.specweave', 'state', 'hooks');
|
|
13
|
+
this.eventsFilePath = path.join(hooksDir, 'events.jsonl');
|
|
14
|
+
this.agentsFilePath = path.join(hooksDir, 'agents.jsonl');
|
|
15
|
+
}
|
|
16
|
+
addEvent(event) {
|
|
17
|
+
const events = this.eventsBySession.get(event.sessionId) ?? [];
|
|
18
|
+
events.push(event);
|
|
19
|
+
// Cap in-memory events per session to prevent unbounded growth
|
|
20
|
+
if (events.length > 10000) {
|
|
21
|
+
const removed = events.length - 10000;
|
|
22
|
+
events.splice(0, removed);
|
|
23
|
+
this.totalEventCount -= removed;
|
|
24
|
+
}
|
|
25
|
+
this.eventsBySession.set(event.sessionId, events);
|
|
26
|
+
this.totalEventCount++;
|
|
27
|
+
this.appendJSONL(this.eventsFilePath, event);
|
|
28
|
+
}
|
|
29
|
+
updateAgent(data) {
|
|
30
|
+
const existing = this.agents.get(data.agentId);
|
|
31
|
+
if (existing) {
|
|
32
|
+
if (data.stoppedAt) {
|
|
33
|
+
existing.stoppedAt = data.stoppedAt;
|
|
34
|
+
existing.durationMs = new Date(data.stoppedAt).getTime() - new Date(existing.startedAt).getTime();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const record = {
|
|
39
|
+
agentId: data.agentId,
|
|
40
|
+
agentType: data.agentType,
|
|
41
|
+
sessionId: data.sessionId,
|
|
42
|
+
startedAt: data.startedAt ?? new Date().toISOString(),
|
|
43
|
+
stoppedAt: data.stoppedAt,
|
|
44
|
+
};
|
|
45
|
+
if (data.stoppedAt && record.startedAt) {
|
|
46
|
+
record.durationMs = new Date(data.stoppedAt).getTime() - new Date(record.startedAt).getTime();
|
|
47
|
+
}
|
|
48
|
+
this.agents.set(data.agentId, record);
|
|
49
|
+
}
|
|
50
|
+
this.appendJSONL(this.agentsFilePath, this.agents.get(data.agentId));
|
|
51
|
+
}
|
|
52
|
+
getEvents(opts = {}) {
|
|
53
|
+
let result = [];
|
|
54
|
+
if (opts.sessionId) {
|
|
55
|
+
result = this.eventsBySession.get(opts.sessionId) ?? [];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
for (const events of this.eventsBySession.values()) {
|
|
59
|
+
result.push(...events);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (opts.eventType) {
|
|
63
|
+
result = result.filter(e => e.eventName === opts.eventType);
|
|
64
|
+
}
|
|
65
|
+
result.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
66
|
+
if (opts.limit) {
|
|
67
|
+
result = result.slice(0, opts.limit);
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
getAgents(opts = {}) {
|
|
72
|
+
let result = Array.from(this.agents.values());
|
|
73
|
+
if (opts.sessionId) {
|
|
74
|
+
result = result.filter(a => a.sessionId === opts.sessionId);
|
|
75
|
+
}
|
|
76
|
+
if (opts.status === 'running') {
|
|
77
|
+
result = result.filter(a => !a.stoppedAt);
|
|
78
|
+
}
|
|
79
|
+
else if (opts.status === 'stopped') {
|
|
80
|
+
result = result.filter(a => !!a.stoppedAt);
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
getStats() {
|
|
85
|
+
return {
|
|
86
|
+
totalEvents: this.totalEventCount,
|
|
87
|
+
activeSessions: this.eventsBySession.size,
|
|
88
|
+
activeAgents: Array.from(this.agents.values()).filter(a => !a.stoppedAt).length,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
flush() {
|
|
92
|
+
// All events are already appended to JSONL in real-time
|
|
93
|
+
// This is a no-op for safety; called on shutdown
|
|
94
|
+
}
|
|
95
|
+
async hydrate() {
|
|
96
|
+
this.ensureDir();
|
|
97
|
+
// Seed file size counters from disk
|
|
98
|
+
for (const fp of [this.eventsFilePath, this.agentsFilePath]) {
|
|
99
|
+
try {
|
|
100
|
+
this.fileSizes.set(fp, fs.statSync(fp).size);
|
|
101
|
+
}
|
|
102
|
+
catch { /* doesn't exist yet */ }
|
|
103
|
+
}
|
|
104
|
+
await this.hydrateFile(this.eventsFilePath, (parsed) => {
|
|
105
|
+
const event = parsed;
|
|
106
|
+
if (event.sessionId && event.id) {
|
|
107
|
+
const events = this.eventsBySession.get(event.sessionId) ?? [];
|
|
108
|
+
events.push(event);
|
|
109
|
+
this.eventsBySession.set(event.sessionId, events);
|
|
110
|
+
this.totalEventCount++;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// Apply per-session cap after hydration to prevent unbounded memory
|
|
114
|
+
for (const [sessionId, events] of this.eventsBySession) {
|
|
115
|
+
if (events.length > 10000) {
|
|
116
|
+
const removed = events.length - 10000;
|
|
117
|
+
events.splice(0, removed);
|
|
118
|
+
this.totalEventCount -= removed;
|
|
119
|
+
this.eventsBySession.set(sessionId, events);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
await this.hydrateFile(this.agentsFilePath, (parsed) => {
|
|
123
|
+
const agent = parsed;
|
|
124
|
+
if (agent.agentId) {
|
|
125
|
+
this.agents.set(agent.agentId, agent);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
cleanup() {
|
|
130
|
+
const hooksDir = path.dirname(this.eventsFilePath);
|
|
131
|
+
try {
|
|
132
|
+
const files = fs.readdirSync(hooksDir);
|
|
133
|
+
const thirtyDaysMs = 30 * 86400 * 1000;
|
|
134
|
+
for (const file of files) {
|
|
135
|
+
const match = file.match(/^(?:events|agents)-(\d+)\.jsonl$/);
|
|
136
|
+
if (match) {
|
|
137
|
+
const ts = parseInt(match[1], 10);
|
|
138
|
+
if (Date.now() - ts > thirtyDaysMs) {
|
|
139
|
+
fs.rmSync(path.join(hooksDir, file), { force: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Directory may not exist
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async hydrateFile(filePath, handler) {
|
|
149
|
+
if (!fs.existsSync(filePath))
|
|
150
|
+
return;
|
|
151
|
+
const stream = fs.createReadStream(filePath, { encoding: 'utf-8' });
|
|
152
|
+
const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
153
|
+
for await (const line of rl) {
|
|
154
|
+
if (!line.trim())
|
|
155
|
+
continue;
|
|
156
|
+
try {
|
|
157
|
+
const parsed = JSON.parse(line);
|
|
158
|
+
handler(parsed);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Skip malformed lines
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
ensureDir() {
|
|
166
|
+
if (this.dirEnsured)
|
|
167
|
+
return;
|
|
168
|
+
fs.mkdirSync(path.dirname(this.eventsFilePath), { recursive: true });
|
|
169
|
+
this.dirEnsured = true;
|
|
170
|
+
}
|
|
171
|
+
getFileSize(filePath) {
|
|
172
|
+
const cached = this.fileSizes.get(filePath);
|
|
173
|
+
if (cached !== undefined)
|
|
174
|
+
return cached;
|
|
175
|
+
try {
|
|
176
|
+
const s = fs.statSync(filePath).size;
|
|
177
|
+
this.fileSizes.set(filePath, s);
|
|
178
|
+
return s;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
appendJSONL(filePath, record) {
|
|
185
|
+
try {
|
|
186
|
+
this.ensureDir();
|
|
187
|
+
const line = JSON.stringify(record) + '\n';
|
|
188
|
+
const currentSize = this.getFileSize(filePath);
|
|
189
|
+
if (currentSize > 10485760) { // 10MB
|
|
190
|
+
const ext = path.extname(filePath);
|
|
191
|
+
const base = filePath.slice(0, -ext.length);
|
|
192
|
+
fs.renameSync(filePath, `${base}-${Date.now()}${ext}`);
|
|
193
|
+
this.fileSizes.set(filePath, 0);
|
|
194
|
+
}
|
|
195
|
+
fs.appendFileSync(filePath, line);
|
|
196
|
+
this.fileSizes.set(filePath, (this.fileSizes.get(filePath) ?? 0) + Buffer.byteLength(line));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// JSONL write failure must never block
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=hook-event-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-event-store.js","sourceRoot":"","sources":["../../../../../src/dashboard/server/hooks/hook-event-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type SSEEventType = 'heartbeat' | 'increment-update' | 'analytics-event' | 'cost-update' | 'notification' | 'sync-update' | 'sync-audit' | 'error-detected' | 'config-changed' | 'activity' | 'command-output' | 'command-complete' | 'job-progress' | 'marketplace-scan' | 'submission-update' | 'verification-complete';
|
|
1
|
+
export type SSEEventType = 'heartbeat' | 'increment-update' | 'analytics-event' | 'cost-update' | 'notification' | 'sync-update' | 'sync-audit' | 'error-detected' | 'config-changed' | 'activity' | 'command-output' | 'command-complete' | 'job-progress' | 'marketplace-scan' | 'submission-update' | 'verification-complete' | 'hook-event' | 'hook-agent';
|
|
2
2
|
export interface SSEMessage {
|
|
3
3
|
type: SSEEventType;
|
|
4
4
|
data: unknown;
|
|
@@ -249,4 +249,25 @@ export interface ApiResponse<T> {
|
|
|
249
249
|
error?: string;
|
|
250
250
|
}
|
|
251
251
|
export type RouteHandler = (req: import('http').IncomingMessage, res: import('http').ServerResponse, params: Record<string, string>) => Promise<void>;
|
|
252
|
+
export type CCHookEventName = 'PreToolUse' | 'PostToolUse' | 'Stop' | 'SubagentStop' | 'TaskCompleted' | 'UserPromptSubmit' | 'PostToolUseFailure' | 'PermissionRequest' | 'SessionStart' | 'SessionEnd' | 'Notification' | 'SubagentStart' | 'ConfigChange' | 'PreCompact' | 'TeammateIdle';
|
|
253
|
+
export interface HookEvent {
|
|
254
|
+
id: string;
|
|
255
|
+
eventName: CCHookEventName;
|
|
256
|
+
sessionId: string;
|
|
257
|
+
timestamp: string;
|
|
258
|
+
payload: unknown;
|
|
259
|
+
result?: {
|
|
260
|
+
decision?: 'allow' | 'deny' | 'approve' | 'block';
|
|
261
|
+
reason?: string;
|
|
262
|
+
};
|
|
263
|
+
durationMs?: number;
|
|
264
|
+
}
|
|
265
|
+
export interface AgentRecord {
|
|
266
|
+
agentId: string;
|
|
267
|
+
agentType: string;
|
|
268
|
+
sessionId: string;
|
|
269
|
+
startedAt: string;
|
|
270
|
+
stoppedAt?: string;
|
|
271
|
+
durationMs?: number;
|
|
272
|
+
}
|
|
252
273
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dashboard/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,kBAAkB,GAClB,iBAAiB,GACjB,aAAa,GACb,cAAc,GACd,aAAa,GACb,YAAY,GACZ,gBAAgB,GAChB,gBAAgB,GAChB,UAAU,GACV,gBAAgB,GAChB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/dashboard/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface GenerateSettingsOptions {
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function getHttpMode(config: Record<string, unknown>): boolean;
|
|
6
|
+
export declare function generateHooksSettings(options: GenerateSettingsOptions): Record<string, unknown>;
|
|
7
|
+
export declare function writeSettings(projectRoot: string, port?: number): void;
|
|
8
|
+
//# sourceMappingURL=generate-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-settings.d.ts","sourceRoot":"","sources":["../../../src/hooks/generate-settings.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGpE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsC/F;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAsBtE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const HTTP_EVENTS = [
|
|
4
|
+
'PreToolUse', 'PostToolUse', 'Stop', 'SubagentStop',
|
|
5
|
+
'TaskCompleted', 'UserPromptSubmit', 'PostToolUseFailure',
|
|
6
|
+
'PermissionRequest',
|
|
7
|
+
];
|
|
8
|
+
const COMMAND_EVENTS = [
|
|
9
|
+
'SessionStart', 'SessionEnd', 'Notification', 'SubagentStart',
|
|
10
|
+
'ConfigChange', 'PreCompact', 'TeammateIdle',
|
|
11
|
+
];
|
|
12
|
+
export function getHttpMode(config) {
|
|
13
|
+
const hooks = config?.hooks;
|
|
14
|
+
return hooks?.httpMode === true;
|
|
15
|
+
}
|
|
16
|
+
export function generateHooksSettings(options) {
|
|
17
|
+
const { projectRoot, port = 8340 } = options;
|
|
18
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
19
|
+
let config = {};
|
|
20
|
+
try {
|
|
21
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// No config file
|
|
25
|
+
}
|
|
26
|
+
if (!getHttpMode(config)) {
|
|
27
|
+
return {};
|
|
28
|
+
}
|
|
29
|
+
const configPort = config?.hooks?.port ?? port;
|
|
30
|
+
// Resolve bridge path relative to this module's location (works in both src/ and dist/)
|
|
31
|
+
const bridgePath = path.resolve(path.dirname(new URL(import.meta.url).pathname), 'command-bridge.mjs');
|
|
32
|
+
const hooks = {};
|
|
33
|
+
// HTTP events
|
|
34
|
+
for (const event of HTTP_EVENTS) {
|
|
35
|
+
hooks[event] = [{
|
|
36
|
+
type: 'http',
|
|
37
|
+
url: `http://localhost:${configPort}/api/hooks/${event}`,
|
|
38
|
+
}];
|
|
39
|
+
}
|
|
40
|
+
// Command events
|
|
41
|
+
for (const event of COMMAND_EVENTS) {
|
|
42
|
+
hooks[event] = [{
|
|
43
|
+
type: 'command',
|
|
44
|
+
command: `node ${bridgePath} ${event}`,
|
|
45
|
+
}];
|
|
46
|
+
}
|
|
47
|
+
return { hooks };
|
|
48
|
+
}
|
|
49
|
+
export function writeSettings(projectRoot, port) {
|
|
50
|
+
const settings = generateHooksSettings({ projectRoot, port });
|
|
51
|
+
if (Object.keys(settings).length === 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const settingsPath = path.join(projectRoot, '.claude', 'settings.json');
|
|
55
|
+
const settingsDir = path.dirname(settingsPath);
|
|
56
|
+
fs.mkdirSync(settingsDir, { recursive: true });
|
|
57
|
+
let existing = {};
|
|
58
|
+
try {
|
|
59
|
+
existing = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// No existing settings
|
|
63
|
+
}
|
|
64
|
+
// Deep-merge hooks to preserve user-defined hook configurations
|
|
65
|
+
const existingHooks = (existing.hooks ?? {});
|
|
66
|
+
const newHooks = (settings.hooks ?? {});
|
|
67
|
+
const merged = { ...existing, hooks: { ...existingHooks, ...newHooks } };
|
|
68
|
+
fs.writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + '\n');
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=generate-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-settings.js","sourceRoot":"","sources":["../../../src/hooks/generate-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,WAAW,GAAG;IAClB,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc;IACnD,eAAe,EAAE,kBAAkB,EAAE,oBAAoB;IACzD,mBAAmB;CACX,CAAC;AAEX,MAAM,cAAc,GAAG;IACrB,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe;IAC7D,cAAc,EAAE,YAAY,EAAE,cAAc;CACpC,CAAC;AAOX,MAAM,UAAU,WAAW,CAAC,MAA+B;IACzD,MAAM,KAAK,GAAG,MAAM,EAAE,KAA4C,CAAC;IACnE,OAAO,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IACvE,IAAI,MAAM,GAA4B,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAI,MAAM,EAAE,KAAiC,EAAE,IAAc,IAAI,IAAI,CAAC;IACtF,wFAAwF;IACxF,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAEvG,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,cAAc;IACd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,oBAAoB,UAAU,cAAc,KAAK,EAAE;aACzD,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBACd,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,QAAQ,UAAU,IAAI,KAAK,EAAE;aACvC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,IAAa;IAC9D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,gEAAgE;IAChE,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;IACxE,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;IACnE,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,QAAQ,EAAE,EAAE,CAAC;IACzE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface HooksStatusResult {
|
|
2
|
+
serverRunning: boolean;
|
|
3
|
+
port?: number;
|
|
4
|
+
pid?: number;
|
|
5
|
+
startedAt?: string;
|
|
6
|
+
stalePidFile: boolean;
|
|
7
|
+
eventCount?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function isPortReachable(port: number, timeoutMs?: number): Promise<boolean>;
|
|
10
|
+
export declare function getHooksStatus(projectRoot: string): Promise<HooksStatusResult>;
|
|
11
|
+
export declare function formatHooksStatus(result: HooksStatusResult): string;
|
|
12
|
+
//# sourceMappingURL=hooks-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-status.d.ts","sourceRoot":"","sources":["../../../src/hooks/hooks-status.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB/E;AA6BD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoCpF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAoBnE"}
|