@archznn/crewloop-skills 0.4.0 → 0.4.1
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/package.json +15 -3
- package/packages/cli/README.md +55 -0
- package/packages/cli/bin/crewloop.js +6 -0
- package/packages/cli/dist/agents.d.ts +7 -0
- package/packages/cli/dist/agents.d.ts.map +1 -0
- package/packages/cli/dist/agents.js +31 -0
- package/packages/cli/dist/agents.js.map +1 -0
- package/packages/cli/dist/cli.d.ts +14 -0
- package/packages/cli/dist/cli.d.ts.map +1 -0
- package/packages/cli/dist/cli.js +255 -0
- package/packages/cli/dist/cli.js.map +1 -0
- package/packages/cli/dist/installer.d.ts +19 -0
- package/packages/cli/dist/installer.d.ts.map +1 -0
- package/packages/cli/dist/installer.js +89 -0
- package/packages/cli/dist/installer.js.map +1 -0
- package/packages/cli/dist/mcp.d.ts +20 -0
- package/packages/cli/dist/mcp.d.ts.map +1 -0
- package/packages/cli/dist/mcp.js +130 -0
- package/packages/cli/dist/mcp.js.map +1 -0
- package/packages/cli/dist/resolver.d.ts +7 -0
- package/packages/cli/dist/resolver.d.ts.map +1 -0
- package/packages/cli/dist/resolver.js +57 -0
- package/packages/cli/dist/resolver.js.map +1 -0
- package/packages/cli/dist/tests/agents.test.d.ts +2 -0
- package/packages/cli/dist/tests/agents.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/agents.test.js +27 -0
- package/packages/cli/dist/tests/agents.test.js.map +1 -0
- package/packages/cli/dist/tests/cli.test.d.ts +2 -0
- package/packages/cli/dist/tests/cli.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/cli.test.js +103 -0
- package/packages/cli/dist/tests/cli.test.js.map +1 -0
- package/packages/cli/dist/tests/installer.test.d.ts +2 -0
- package/packages/cli/dist/tests/installer.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/installer.test.js +129 -0
- package/packages/cli/dist/tests/installer.test.js.map +1 -0
- package/packages/cli/dist/tests/mcp.test.d.ts +2 -0
- package/packages/cli/dist/tests/mcp.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/mcp.test.js +153 -0
- package/packages/cli/dist/tests/mcp.test.js.map +1 -0
- package/packages/cli/dist/tests/resolver.test.d.ts +2 -0
- package/packages/cli/dist/tests/resolver.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/resolver.test.js +41 -0
- package/packages/cli/dist/tests/resolver.test.js.map +1 -0
- package/servers/dashboard/bin/crewloop-dashboard.js +0 -0
- package/servers/dashboard/dist/adapters/codex.d.ts +23 -0
- package/servers/dashboard/dist/adapters/codex.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/codex.js +28 -0
- package/servers/dashboard/dist/adapters/codex.js.map +1 -0
- package/servers/dashboard/dist/adapters/kimi.d.ts +13 -0
- package/servers/dashboard/dist/adapters/kimi.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/kimi.js +28 -0
- package/servers/dashboard/dist/adapters/kimi.js.map +1 -0
- package/servers/dashboard/dist/adapters/opencode.d.ts +9 -0
- package/servers/dashboard/dist/adapters/opencode.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/opencode.js +26 -0
- package/servers/dashboard/dist/adapters/opencode.js.map +1 -0
- package/servers/dashboard/dist/adapters/shim.d.ts +7 -0
- package/servers/dashboard/dist/adapters/shim.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/shim.js +107 -0
- package/servers/dashboard/dist/adapters/shim.js.map +1 -0
- package/servers/dashboard/dist/adapters/shim.test.d.ts +2 -0
- package/servers/dashboard/dist/adapters/shim.test.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/shim.test.js +72 -0
- package/servers/dashboard/dist/adapters/shim.test.js.map +1 -0
- package/servers/dashboard/dist/api/event.d.ts +13 -0
- package/servers/dashboard/dist/api/event.d.ts.map +1 -0
- package/servers/dashboard/dist/api/event.js +52 -0
- package/servers/dashboard/dist/api/event.js.map +1 -0
- package/servers/dashboard/dist/api/skills.d.ts +4 -0
- package/servers/dashboard/dist/api/skills.d.ts.map +1 -0
- package/servers/dashboard/dist/api/skills.js +12 -0
- package/servers/dashboard/dist/api/skills.js.map +1 -0
- package/servers/dashboard/dist/config.d.ts +11 -0
- package/servers/dashboard/dist/config.d.ts.map +1 -0
- package/servers/dashboard/dist/config.js +65 -0
- package/servers/dashboard/dist/config.js.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.d.ts +14 -0
- package/servers/dashboard/dist/filters/sanitize.d.ts.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.js +64 -0
- package/servers/dashboard/dist/filters/sanitize.js.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.test.d.ts +2 -0
- package/servers/dashboard/dist/filters/sanitize.test.d.ts.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.test.js +71 -0
- package/servers/dashboard/dist/filters/sanitize.test.js.map +1 -0
- package/servers/dashboard/dist/index.d.ts +2 -0
- package/servers/dashboard/dist/index.d.ts.map +1 -0
- package/servers/dashboard/dist/index.js +22 -0
- package/servers/dashboard/dist/index.js.map +1 -0
- package/servers/dashboard/dist/presenter.d.ts +7 -0
- package/servers/dashboard/dist/presenter.d.ts.map +1 -0
- package/servers/dashboard/dist/presenter.js +54 -0
- package/servers/dashboard/dist/presenter.js.map +1 -0
- package/servers/dashboard/dist/presenter.test.d.ts +2 -0
- package/servers/dashboard/dist/presenter.test.d.ts.map +1 -0
- package/servers/dashboard/dist/presenter.test.js +66 -0
- package/servers/dashboard/dist/presenter.test.js.map +1 -0
- package/servers/dashboard/dist/server.d.ts +13 -0
- package/servers/dashboard/dist/server.d.ts.map +1 -0
- package/servers/dashboard/dist/server.js +162 -0
- package/servers/dashboard/dist/server.js.map +1 -0
- package/servers/dashboard/dist/server.test.d.ts +2 -0
- package/servers/dashboard/dist/server.test.d.ts.map +1 -0
- package/servers/dashboard/dist/server.test.js +113 -0
- package/servers/dashboard/dist/server.test.js.map +1 -0
- package/servers/dashboard/dist/skills/infer.d.ts +8 -0
- package/servers/dashboard/dist/skills/infer.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/infer.js +48 -0
- package/servers/dashboard/dist/skills/infer.js.map +1 -0
- package/servers/dashboard/dist/skills/infer.test.d.ts +2 -0
- package/servers/dashboard/dist/skills/infer.test.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/infer.test.js +82 -0
- package/servers/dashboard/dist/skills/infer.test.js.map +1 -0
- package/servers/dashboard/dist/skills/mapping.d.ts +5 -0
- package/servers/dashboard/dist/skills/mapping.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/mapping.js +28 -0
- package/servers/dashboard/dist/skills/mapping.js.map +1 -0
- package/servers/dashboard/dist/skills/registry.d.ts +11 -0
- package/servers/dashboard/dist/skills/registry.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/registry.js +59 -0
- package/servers/dashboard/dist/skills/registry.js.map +1 -0
- package/servers/dashboard/dist/state.d.ts +18 -0
- package/servers/dashboard/dist/state.d.ts.map +1 -0
- package/servers/dashboard/dist/state.js +91 -0
- package/servers/dashboard/dist/state.js.map +1 -0
- package/servers/dashboard/dist/state.test.d.ts +2 -0
- package/servers/dashboard/dist/state.test.d.ts.map +1 -0
- package/servers/dashboard/dist/state.test.js +83 -0
- package/servers/dashboard/dist/state.test.js.map +1 -0
- package/servers/dashboard/dist/types.d.ts +86 -0
- package/servers/dashboard/dist/types.d.ts.map +1 -0
- package/servers/dashboard/dist/types.js +3 -0
- package/servers/dashboard/dist/types.js.map +1 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateStore = void 0;
|
|
4
|
+
class StateStore {
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
options;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
applyEvent(event) {
|
|
11
|
+
let session = this.sessions.get(event.session_id);
|
|
12
|
+
if (!session) {
|
|
13
|
+
session = this.createSession(event.session_id, event.source);
|
|
14
|
+
}
|
|
15
|
+
session.source = event.source;
|
|
16
|
+
session.last_event_at = event.timestamp;
|
|
17
|
+
session.events.unshift(event);
|
|
18
|
+
if (session.events.length > this.options.maxEventsPerSession) {
|
|
19
|
+
session.events.length = this.options.maxEventsPerSession;
|
|
20
|
+
}
|
|
21
|
+
if (event.tool) {
|
|
22
|
+
session.tool_counts[event.tool] = (session.tool_counts[event.tool] || 0) + 1;
|
|
23
|
+
}
|
|
24
|
+
if (event.skill) {
|
|
25
|
+
session.active_skill = event.skill;
|
|
26
|
+
session.active_confidence = event.event_type === 'skill_change' ? 'explicit' : 'heuristic';
|
|
27
|
+
}
|
|
28
|
+
session.status = deriveSessionStatus(event);
|
|
29
|
+
this.sessions.set(event.session_id, session);
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
setActiveSkill(sessionId, skill, confidence) {
|
|
33
|
+
const session = this.sessions.get(sessionId);
|
|
34
|
+
if (!session) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
session.active_skill = skill;
|
|
38
|
+
session.active_confidence = confidence;
|
|
39
|
+
return session;
|
|
40
|
+
}
|
|
41
|
+
getSession(id) {
|
|
42
|
+
return this.sessions.get(id);
|
|
43
|
+
}
|
|
44
|
+
getAllSessions() {
|
|
45
|
+
return Array.from(this.sessions.values()).sort((a, b) => b.last_event_at - a.last_event_at);
|
|
46
|
+
}
|
|
47
|
+
getState() {
|
|
48
|
+
return {
|
|
49
|
+
sessions: Object.fromEntries(this.sessions),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
pruneInactive(now = Date.now()) {
|
|
53
|
+
let removed = 0;
|
|
54
|
+
for (const [id, session] of this.sessions) {
|
|
55
|
+
if (now - session.last_event_at > this.options.sessionMaxAgeMs) {
|
|
56
|
+
this.sessions.delete(id);
|
|
57
|
+
removed++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return removed;
|
|
61
|
+
}
|
|
62
|
+
createSession(id, source) {
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const session = {
|
|
65
|
+
id,
|
|
66
|
+
source,
|
|
67
|
+
events: [],
|
|
68
|
+
tool_counts: {},
|
|
69
|
+
started_at: now,
|
|
70
|
+
last_event_at: now,
|
|
71
|
+
};
|
|
72
|
+
this.sessions.set(id, session);
|
|
73
|
+
return session;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.StateStore = StateStore;
|
|
77
|
+
function deriveSessionStatus(event) {
|
|
78
|
+
switch (event.event_type) {
|
|
79
|
+
case 'session_start':
|
|
80
|
+
case 'tool_start':
|
|
81
|
+
case 'skill_change':
|
|
82
|
+
return 'running';
|
|
83
|
+
case 'tool_end':
|
|
84
|
+
return event.status || 'success';
|
|
85
|
+
case 'session_end':
|
|
86
|
+
return 'success';
|
|
87
|
+
default:
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const state_1 = require("./state");
|
|
9
|
+
function makeEvent(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
id: 'ev-1',
|
|
12
|
+
timestamp: Date.now(),
|
|
13
|
+
source: 'kimi',
|
|
14
|
+
session_id: 'sess-1',
|
|
15
|
+
event_type: 'tool_start',
|
|
16
|
+
tool: 'Read',
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
(0, node_test_1.describe)('StateStore', () => {
|
|
21
|
+
(0, node_test_1.it)('creates session on first event', () => {
|
|
22
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
23
|
+
const session = store.applyEvent(makeEvent());
|
|
24
|
+
strict_1.default.equal(session.id, 'sess-1');
|
|
25
|
+
strict_1.default.equal(session.source, 'kimi');
|
|
26
|
+
strict_1.default.equal(session.events.length, 1);
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('caps events per session', () => {
|
|
29
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 3, sessionMaxAgeMs: 60000 });
|
|
30
|
+
for (let i = 0; i < 5; i++) {
|
|
31
|
+
store.applyEvent(makeEvent({ id: `ev-${i}`, timestamp: Date.now() + i }));
|
|
32
|
+
}
|
|
33
|
+
const session = store.getSession('sess-1');
|
|
34
|
+
strict_1.default.equal(session.events.length, 3);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)('counts tool usage', () => {
|
|
37
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
38
|
+
store.applyEvent(makeEvent({ tool: 'Read' }));
|
|
39
|
+
store.applyEvent(makeEvent({ tool: 'Read' }));
|
|
40
|
+
store.applyEvent(makeEvent({ tool: 'Edit' }));
|
|
41
|
+
const session = store.getSession('sess-1');
|
|
42
|
+
strict_1.default.equal(session.tool_counts['Read'], 2);
|
|
43
|
+
strict_1.default.equal(session.tool_counts['Edit'], 1);
|
|
44
|
+
});
|
|
45
|
+
(0, node_test_1.it)('sets active skill when event carries skill', () => {
|
|
46
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
47
|
+
store.applyEvent(makeEvent({ skill: 'architect', event_type: 'skill_change' }));
|
|
48
|
+
const session = store.getSession('sess-1');
|
|
49
|
+
strict_1.default.equal(session.active_skill, 'architect');
|
|
50
|
+
strict_1.default.equal(session.active_confidence, 'explicit');
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.it)('derives running status from tool_start', () => {
|
|
53
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
54
|
+
store.applyEvent(makeEvent({ event_type: 'tool_start' }));
|
|
55
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'running');
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.it)('derives success status from tool_end', () => {
|
|
58
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
59
|
+
store.applyEvent(makeEvent({ event_type: 'tool_end', status: 'success' }));
|
|
60
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'success');
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.it)('derives error status from failed tool_end', () => {
|
|
63
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
64
|
+
store.applyEvent(makeEvent({ event_type: 'tool_end', status: 'error' }));
|
|
65
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'error');
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)('prunes inactive sessions', () => {
|
|
68
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 1000 });
|
|
69
|
+
store.applyEvent(makeEvent());
|
|
70
|
+
const removed = store.pruneInactive(Date.now() + 2000);
|
|
71
|
+
strict_1.default.equal(removed, 1);
|
|
72
|
+
strict_1.default.equal(store.getSession('sess-1'), undefined);
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.it)('returns sessions sorted by last event', () => {
|
|
75
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
76
|
+
store.applyEvent(makeEvent({ session_id: 'a', timestamp: 1000 }));
|
|
77
|
+
store.applyEvent(makeEvent({ session_id: 'b', timestamp: 2000 }));
|
|
78
|
+
const sessions = store.getAllSessions();
|
|
79
|
+
strict_1.default.equal(sessions[0].id, 'b');
|
|
80
|
+
strict_1.default.equal(sessions[1].id, 'a');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,mCAAqC;AAGrC,SAAS,SAAS,CAAC,YAAqC,EAAE;IACxD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,YAAY;QACxB,IAAI,EAAE,MAAM;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAA,oBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnC,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC;QAC5C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC;QAC5C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC;QAC5C,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAChD,gBAAM,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QAC1D,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC3E,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACvD,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzB,gBAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;QACxC,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export type AgentSource = 'kimi' | 'codex' | 'opencode' | 'log-watcher';
|
|
2
|
+
export type EventType = 'session_start' | 'session_end' | 'tool_start' | 'tool_end' | 'skill_change';
|
|
3
|
+
export type EventStatus = 'running' | 'success' | 'error';
|
|
4
|
+
export interface DashboardEvent {
|
|
5
|
+
id: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
source: AgentSource;
|
|
8
|
+
session_id: string;
|
|
9
|
+
event_type: EventType;
|
|
10
|
+
skill?: string;
|
|
11
|
+
tool?: string;
|
|
12
|
+
detail?: string;
|
|
13
|
+
status?: EventStatus;
|
|
14
|
+
duration_ms?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface Session {
|
|
17
|
+
id: string;
|
|
18
|
+
source: AgentSource;
|
|
19
|
+
active_skill?: string;
|
|
20
|
+
active_confidence?: 'explicit' | 'heuristic' | 'unknown';
|
|
21
|
+
status?: EventStatus;
|
|
22
|
+
events: DashboardEvent[];
|
|
23
|
+
tool_counts: Record<string, number>;
|
|
24
|
+
started_at: number;
|
|
25
|
+
last_event_at: number;
|
|
26
|
+
}
|
|
27
|
+
export interface DashboardState {
|
|
28
|
+
sessions: Record<string, Session>;
|
|
29
|
+
}
|
|
30
|
+
export interface ClientActiveSkill {
|
|
31
|
+
name: string;
|
|
32
|
+
confidence: 'explicit' | 'heuristic' | 'unknown';
|
|
33
|
+
}
|
|
34
|
+
export interface ClientEvent {
|
|
35
|
+
id: string;
|
|
36
|
+
timestamp: number;
|
|
37
|
+
event_type: EventType;
|
|
38
|
+
tool?: string;
|
|
39
|
+
detail?: string;
|
|
40
|
+
status?: EventStatus;
|
|
41
|
+
duration_ms?: number;
|
|
42
|
+
skill?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ClientSession {
|
|
45
|
+
id: string;
|
|
46
|
+
source: AgentSource;
|
|
47
|
+
skill?: string;
|
|
48
|
+
activeSkill?: ClientActiveSkill;
|
|
49
|
+
status?: EventStatus;
|
|
50
|
+
events: ClientEvent[];
|
|
51
|
+
startTime: number;
|
|
52
|
+
lastActivity: number;
|
|
53
|
+
toolCounts: Record<string, number>;
|
|
54
|
+
}
|
|
55
|
+
export interface ClientSnapshotMessage {
|
|
56
|
+
type: 'snapshot';
|
|
57
|
+
sessions: ClientSession[];
|
|
58
|
+
}
|
|
59
|
+
export interface ClientUpdateMessage {
|
|
60
|
+
type: 'update';
|
|
61
|
+
session: ClientSession;
|
|
62
|
+
isActive: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface ClientPongMessage {
|
|
65
|
+
type: 'pong';
|
|
66
|
+
}
|
|
67
|
+
export type ClientWebSocketMessage = ClientSnapshotMessage | ClientUpdateMessage | ClientPongMessage;
|
|
68
|
+
export interface SkillMeta {
|
|
69
|
+
name: string;
|
|
70
|
+
description: string;
|
|
71
|
+
icon: string;
|
|
72
|
+
}
|
|
73
|
+
export type ToolToSkillMap = Record<string, string | undefined>;
|
|
74
|
+
export interface SkillInferenceResult {
|
|
75
|
+
skill: string | undefined;
|
|
76
|
+
confidence: 'explicit' | 'heuristic' | 'unknown';
|
|
77
|
+
}
|
|
78
|
+
export interface ServerConfig {
|
|
79
|
+
port: number;
|
|
80
|
+
host: string;
|
|
81
|
+
packageRoot: string;
|
|
82
|
+
maxEventsPerSession: number;
|
|
83
|
+
sessionMaxAgeMs: number;
|
|
84
|
+
pruneIntervalMs: number;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|