codingbuddy 4.5.0 → 5.0.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/dist/src/agent/agent.module.js +3 -1
- package/dist/src/agent/agent.module.js.map +1 -1
- package/dist/src/agent/agent.service.d.ts +11 -4
- package/dist/src/agent/agent.service.js +81 -13
- package/dist/src/agent/agent.service.js.map +1 -1
- package/dist/src/agent/agent.types.d.ts +41 -1
- package/dist/src/agent/agent.types.js.map +1 -1
- package/dist/src/collaboration/discussion-engine.d.ts +14 -0
- package/dist/src/collaboration/discussion-engine.js +49 -0
- package/dist/src/collaboration/discussion-engine.js.map +1 -0
- package/dist/src/collaboration/index.d.ts +5 -0
- package/dist/src/collaboration/index.js +22 -0
- package/dist/src/collaboration/index.js.map +1 -0
- package/dist/src/collaboration/opinion-adapter.d.ts +14 -0
- package/dist/src/collaboration/opinion-adapter.js +56 -0
- package/dist/src/collaboration/opinion-adapter.js.map +1 -0
- package/dist/src/collaboration/terminal-formatter.d.ts +5 -0
- package/dist/src/collaboration/terminal-formatter.js +57 -0
- package/dist/src/collaboration/terminal-formatter.js.map +1 -0
- package/dist/src/collaboration/types.d.ts +50 -0
- package/dist/src/collaboration/types.js +53 -0
- package/dist/src/collaboration/types.js.map +1 -0
- package/dist/src/config/config.schema.d.ts +8 -0
- package/dist/src/config/config.schema.js +4 -0
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/context/context-document.service.d.ts +1 -1
- package/dist/src/context/context-document.service.js +6 -2
- package/dist/src/context/context-document.service.js.map +1 -1
- package/dist/src/context/context-document.types.d.ts +18 -0
- package/dist/src/context/context-document.types.js +13 -1
- package/dist/src/context/context-document.types.js.map +1 -1
- package/dist/src/context/context-parser.utils.js +32 -0
- package/dist/src/context/context-parser.utils.js.map +1 -1
- package/dist/src/context/context-serializer.utils.d.ts +3 -2
- package/dist/src/context/context-serializer.utils.js +25 -1
- package/dist/src/context/context-serializer.utils.js.map +1 -1
- package/dist/src/keyword/explicit-pattern-matcher.d.ts +3 -0
- package/dist/src/keyword/explicit-pattern-matcher.js +34 -0
- package/dist/src/keyword/explicit-pattern-matcher.js.map +1 -0
- package/dist/src/keyword/keyword.module.js +17 -1
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.d.ts +2 -0
- package/dist/src/keyword/keyword.service.js +8 -0
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/keyword.types.d.ts +4 -1
- package/dist/src/keyword/keyword.types.js +7 -1
- package/dist/src/keyword/keyword.types.js.map +1 -1
- package/dist/src/keyword/primary-agent-resolver.d.ts +5 -2
- package/dist/src/keyword/primary-agent-resolver.js +22 -1
- package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
- package/dist/src/keyword/strategies/act-agent.strategy.js +8 -0
- package/dist/src/keyword/strategies/act-agent.strategy.js.map +1 -1
- package/dist/src/keyword/strategies/index.d.ts +1 -1
- package/dist/src/keyword/strategies/index.js.map +1 -1
- package/dist/src/keyword/strategies/resolution-strategy.interface.d.ts +3 -0
- package/dist/src/mcp/handlers/agent.handler.d.ts +1 -0
- package/dist/src/mcp/handlers/agent.handler.js +46 -4
- package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
- package/dist/src/mcp/handlers/context-document.handler.d.ts +3 -0
- package/dist/src/mcp/handlers/context-document.handler.js +91 -10
- package/dist/src/mcp/handlers/context-document.handler.js.map +1 -1
- package/dist/src/mcp/handlers/discussion.handler.d.ts +14 -0
- package/dist/src/mcp/handlers/discussion.handler.js +168 -0
- package/dist/src/mcp/handlers/discussion.handler.js.map +1 -0
- package/dist/src/mcp/handlers/discussion.types.d.ts +18 -0
- package/dist/src/mcp/handlers/discussion.types.js +11 -0
- package/dist/src/mcp/handlers/discussion.types.js.map +1 -0
- package/dist/src/mcp/handlers/index.d.ts +3 -0
- package/dist/src/mcp/handlers/index.js +7 -1
- package/dist/src/mcp/handlers/index.js.map +1 -1
- package/dist/src/mcp/handlers/mode.handler.d.ts +3 -0
- package/dist/src/mcp/handlers/mode.handler.js +58 -0
- package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
- package/dist/src/mcp/handlers/pipeline.handler.d.ts +14 -0
- package/dist/src/mcp/handlers/pipeline.handler.js +137 -0
- package/dist/src/mcp/handlers/pipeline.handler.js.map +1 -0
- package/dist/src/mcp/mcp.module.js +5 -0
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/parallel-validation/extract-file-paths.d.ts +1 -0
- package/dist/src/parallel-validation/extract-file-paths.js +19 -0
- package/dist/src/parallel-validation/extract-file-paths.js.map +1 -0
- package/dist/src/parallel-validation/index.d.ts +5 -0
- package/dist/src/parallel-validation/index.js +12 -0
- package/dist/src/parallel-validation/index.js.map +1 -0
- package/dist/src/parallel-validation/overlap-matrix.d.ts +10 -0
- package/dist/src/parallel-validation/overlap-matrix.js +23 -0
- package/dist/src/parallel-validation/overlap-matrix.js.map +1 -0
- package/dist/src/parallel-validation/parallel-validation.handler.d.ts +8 -0
- package/dist/src/parallel-validation/parallel-validation.handler.js +84 -0
- package/dist/src/parallel-validation/parallel-validation.handler.js.map +1 -0
- package/dist/src/parallel-validation/parallel-validation.types.d.ts +12 -0
- package/dist/src/parallel-validation/parallel-validation.types.js +3 -0
- package/dist/src/parallel-validation/parallel-validation.types.js.map +1 -0
- package/dist/src/parallel-validation/wave-splitter.d.ts +2 -0
- package/dist/src/parallel-validation/wave-splitter.js +39 -0
- package/dist/src/parallel-validation/wave-splitter.js.map +1 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +14 -0
- package/dist/src/pipeline/index.js.map +1 -0
- package/dist/src/pipeline/pipeline.executors.d.ts +2 -0
- package/dist/src/pipeline/pipeline.executors.js +79 -0
- package/dist/src/pipeline/pipeline.executors.js.map +1 -0
- package/dist/src/pipeline/pipeline.module.d.ts +2 -0
- package/dist/src/pipeline/pipeline.module.js +21 -0
- package/dist/src/pipeline/pipeline.module.js.map +1 -0
- package/dist/src/pipeline/pipeline.service.d.ts +8 -0
- package/dist/src/pipeline/pipeline.service.js +89 -0
- package/dist/src/pipeline/pipeline.service.js.map +1 -0
- package/dist/src/pipeline/pipeline.types.d.ts +47 -0
- package/dist/src/pipeline/pipeline.types.js +33 -0
- package/dist/src/pipeline/pipeline.types.js.map +1 -0
- package/dist/src/rules/rule-tracker.d.ts +24 -0
- package/dist/src/rules/rule-tracker.js +74 -0
- package/dist/src/rules/rule-tracker.js.map +1 -0
- package/dist/src/shared/event-bridge-reader.d.ts +17 -0
- package/dist/src/shared/event-bridge-reader.js +56 -0
- package/dist/src/shared/event-bridge-reader.js.map +1 -0
- package/dist/src/tui/components/AgentDiscussionPanel.d.ts +8 -0
- package/dist/src/tui/components/AgentDiscussionPanel.js +21 -0
- package/dist/src/tui/components/AgentDiscussionPanel.js.map +1 -0
- package/dist/src/tui/components/AgentDiscussionPanel.spec.d.ts +1 -0
- package/dist/src/tui/components/AgentDiscussionPanel.spec.js +85 -0
- package/dist/src/tui/components/AgentDiscussionPanel.spec.js.map +1 -0
- package/dist/src/tui/components/agent-discussion-panel.pure.d.ts +10 -0
- package/dist/src/tui/components/agent-discussion-panel.pure.js +94 -0
- package/dist/src/tui/components/agent-discussion-panel.pure.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +2 -0
- package/dist/src/tui/components/index.js +9 -1
- package/dist/src/tui/components/index.js.map +1 -1
- package/dist/src/tui/dashboard-app.js +3 -2
- package/dist/src/tui/dashboard-app.js.map +1 -1
- package/dist/src/tui/dashboard-types.d.ts +2 -0
- package/dist/src/tui/dashboard-types.js.map +1 -1
- package/dist/src/tui/events/index.d.ts +1 -1
- package/dist/src/tui/events/index.js.map +1 -1
- package/dist/src/tui/events/types.d.ts +6 -0
- package/dist/src/tui/events/types.js +1 -0
- package/dist/src/tui/events/types.js.map +1 -1
- package/dist/src/tui/hooks/use-dashboard-state.d.ts +4 -1
- package/dist/src/tui/hooks/use-dashboard-state.js +10 -0
- package/dist/src/tui/hooks/use-dashboard-state.js.map +1 -1
- package/dist/src/tui-bundle.mjs +297 -86
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -14
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PipelineModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const pipeline_service_1 = require("./pipeline.service");
|
|
12
|
+
let PipelineModule = class PipelineModule {
|
|
13
|
+
};
|
|
14
|
+
exports.PipelineModule = PipelineModule;
|
|
15
|
+
exports.PipelineModule = PipelineModule = __decorate([
|
|
16
|
+
(0, common_1.Module)({
|
|
17
|
+
providers: [pipeline_service_1.PipelineService],
|
|
18
|
+
exports: [pipeline_service_1.PipelineService],
|
|
19
|
+
})
|
|
20
|
+
], PipelineModule);
|
|
21
|
+
//# sourceMappingURL=pipeline.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.module.js","sourceRoot":"","sources":["../../../src/pipeline/pipeline.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAAqD;AAM9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAJ1B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,kCAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PipelineDefinition, PipelineExecution } from './pipeline.types';
|
|
2
|
+
export declare class PipelineService {
|
|
3
|
+
private readonly executions;
|
|
4
|
+
runPipeline(definition: PipelineDefinition): Promise<PipelineExecution>;
|
|
5
|
+
getStatus(executionId: string): PipelineExecution | undefined;
|
|
6
|
+
resumePipeline(executionId: string, updatedDefinition: PipelineDefinition): Promise<PipelineExecution>;
|
|
7
|
+
private executeFromStage;
|
|
8
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PipelineService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const crypto_1 = require("crypto");
|
|
12
|
+
const pipeline_executors_1 = require("./pipeline.executors");
|
|
13
|
+
let PipelineService = class PipelineService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.executions = new Map();
|
|
16
|
+
}
|
|
17
|
+
async runPipeline(definition) {
|
|
18
|
+
const executionId = (0, crypto_1.randomUUID)();
|
|
19
|
+
const startedAt = new Date().toISOString();
|
|
20
|
+
const execution = await this.executeFromStage(executionId, definition, 0, [], startedAt);
|
|
21
|
+
this.executions.set(executionId, execution);
|
|
22
|
+
return execution;
|
|
23
|
+
}
|
|
24
|
+
getStatus(executionId) {
|
|
25
|
+
return this.executions.get(executionId);
|
|
26
|
+
}
|
|
27
|
+
async resumePipeline(executionId, updatedDefinition) {
|
|
28
|
+
const existing = this.executions.get(executionId);
|
|
29
|
+
if (!existing) {
|
|
30
|
+
throw new Error('Execution not found');
|
|
31
|
+
}
|
|
32
|
+
if (existing.status !== 'failed') {
|
|
33
|
+
throw new Error('Pipeline is not in a failed state');
|
|
34
|
+
}
|
|
35
|
+
const failedIndex = existing.stageResults.findIndex(r => r.status === 'failed');
|
|
36
|
+
const preservedResults = existing.stageResults.slice(0, failedIndex);
|
|
37
|
+
const execution = await this.executeFromStage(executionId, updatedDefinition, failedIndex, [...preservedResults], existing.startedAt);
|
|
38
|
+
this.executions.set(executionId, execution);
|
|
39
|
+
return execution;
|
|
40
|
+
}
|
|
41
|
+
async executeFromStage(executionId, definition, startIndex, previousResults, startedAt) {
|
|
42
|
+
const stageResults = [...previousResults];
|
|
43
|
+
let lastOutput;
|
|
44
|
+
if (previousResults.length > 0) {
|
|
45
|
+
const lastResult = previousResults[previousResults.length - 1];
|
|
46
|
+
lastOutput = lastResult.output?.trim();
|
|
47
|
+
}
|
|
48
|
+
for (let i = startIndex; i < definition.stages.length; i++) {
|
|
49
|
+
const stage = definition.stages[i];
|
|
50
|
+
const inProgress = {
|
|
51
|
+
id: executionId,
|
|
52
|
+
pipelineId: definition.id,
|
|
53
|
+
status: 'running',
|
|
54
|
+
currentStageIndex: i,
|
|
55
|
+
stageResults: [...stageResults],
|
|
56
|
+
startedAt,
|
|
57
|
+
};
|
|
58
|
+
this.executions.set(executionId, inProgress);
|
|
59
|
+
const result = await (0, pipeline_executors_1.executeStage)(stage, lastOutput);
|
|
60
|
+
stageResults.push(result);
|
|
61
|
+
if (result.status === 'failed') {
|
|
62
|
+
return {
|
|
63
|
+
id: executionId,
|
|
64
|
+
pipelineId: definition.id,
|
|
65
|
+
status: 'failed',
|
|
66
|
+
currentStageIndex: i,
|
|
67
|
+
stageResults,
|
|
68
|
+
startedAt,
|
|
69
|
+
completedAt: new Date().toISOString(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
lastOutput = result.output?.trim();
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
id: executionId,
|
|
76
|
+
pipelineId: definition.id,
|
|
77
|
+
status: 'completed',
|
|
78
|
+
currentStageIndex: definition.stages.length - 1,
|
|
79
|
+
stageResults,
|
|
80
|
+
startedAt,
|
|
81
|
+
completedAt: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.PipelineService = PipelineService;
|
|
86
|
+
exports.PipelineService = PipelineService = __decorate([
|
|
87
|
+
(0, common_1.Injectable)()
|
|
88
|
+
], PipelineService);
|
|
89
|
+
//# sourceMappingURL=pipeline.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.service.js","sourceRoot":"","sources":["../../../src/pipeline/pipeline.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type PipelineStageType = 'command' | 'agent' | 'skill';
|
|
2
|
+
export interface CommandStageConfig {
|
|
3
|
+
readonly command: string;
|
|
4
|
+
}
|
|
5
|
+
export interface AgentStageConfig {
|
|
6
|
+
readonly agentName: string;
|
|
7
|
+
readonly prompt: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SkillStageConfig {
|
|
10
|
+
readonly skillName: string;
|
|
11
|
+
readonly args?: string;
|
|
12
|
+
}
|
|
13
|
+
export type PipelineStageConfig = CommandStageConfig | AgentStageConfig | SkillStageConfig;
|
|
14
|
+
export interface PipelineStage {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly type: PipelineStageType;
|
|
18
|
+
readonly config: PipelineStageConfig;
|
|
19
|
+
}
|
|
20
|
+
export interface PipelineDefinition {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly stages: readonly PipelineStage[];
|
|
24
|
+
}
|
|
25
|
+
export type PipelineStageStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
|
|
26
|
+
export interface PipelineStageResult {
|
|
27
|
+
readonly stageId: string;
|
|
28
|
+
readonly status: PipelineStageStatus;
|
|
29
|
+
readonly output?: string;
|
|
30
|
+
readonly error?: string;
|
|
31
|
+
readonly startedAt: string;
|
|
32
|
+
readonly completedAt?: string;
|
|
33
|
+
readonly durationMs?: number;
|
|
34
|
+
}
|
|
35
|
+
export type PipelineExecutionStatus = 'running' | 'completed' | 'failed' | 'paused';
|
|
36
|
+
export interface PipelineExecution {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly pipelineId: string;
|
|
39
|
+
readonly status: PipelineExecutionStatus;
|
|
40
|
+
readonly currentStageIndex: number;
|
|
41
|
+
readonly stageResults: readonly PipelineStageResult[];
|
|
42
|
+
readonly startedAt: string;
|
|
43
|
+
readonly completedAt?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare function isValidStageType(value: unknown): value is PipelineStageType;
|
|
46
|
+
export declare function isValidPipelineStage(value: unknown): value is PipelineStage;
|
|
47
|
+
export declare function isValidPipelineDefinition(value: unknown): value is PipelineDefinition;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidStageType = isValidStageType;
|
|
4
|
+
exports.isValidPipelineStage = isValidPipelineStage;
|
|
5
|
+
exports.isValidPipelineDefinition = isValidPipelineDefinition;
|
|
6
|
+
const VALID_STAGE_TYPES = ['command', 'agent', 'skill'];
|
|
7
|
+
function isValidStageType(value) {
|
|
8
|
+
return typeof value === 'string' && VALID_STAGE_TYPES.includes(value);
|
|
9
|
+
}
|
|
10
|
+
function isValidPipelineStage(value) {
|
|
11
|
+
if (typeof value !== 'object' || value === null)
|
|
12
|
+
return false;
|
|
13
|
+
const obj = value;
|
|
14
|
+
return (typeof obj.id === 'string' &&
|
|
15
|
+
obj.id.length > 0 &&
|
|
16
|
+
typeof obj.name === 'string' &&
|
|
17
|
+
obj.name.length > 0 &&
|
|
18
|
+
isValidStageType(obj.type) &&
|
|
19
|
+
typeof obj.config === 'object' &&
|
|
20
|
+
obj.config !== null);
|
|
21
|
+
}
|
|
22
|
+
function isValidPipelineDefinition(value) {
|
|
23
|
+
if (typeof value !== 'object' || value === null)
|
|
24
|
+
return false;
|
|
25
|
+
const obj = value;
|
|
26
|
+
return (typeof obj.id === 'string' &&
|
|
27
|
+
obj.id.length > 0 &&
|
|
28
|
+
typeof obj.name === 'string' &&
|
|
29
|
+
obj.name.length > 0 &&
|
|
30
|
+
Array.isArray(obj.stages) &&
|
|
31
|
+
obj.stages.every((stage) => isValidPipelineStage(stage)));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pipeline.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.types.js","sourceRoot":"","sources":["../../../src/pipeline/pipeline.types.ts"],"names":[],"mappings":";;AA0HA,4CAEC;AAKD,oDAYC;AAKD,8DAWC;AAxCD,MAAM,iBAAiB,GAAiC,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAKtF,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,CAAC,KAA0B,CAAC,CAAC;AAC7F,CAAC;AAKD,SAAgB,oBAAoB,CAAC,KAAc;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;QACjB,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QACnB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,GAAG,CAAC,MAAM,KAAK,IAAI,CACpB,CAAC;AACJ,CAAC;AAKD,SAAgB,yBAAyB,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ;QAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;QACjB,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QACnB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAClE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface RuleStats {
|
|
2
|
+
count: number;
|
|
3
|
+
lastUsed: number;
|
|
4
|
+
}
|
|
5
|
+
export interface RuleEffectivenessReport {
|
|
6
|
+
totalRulesTracked: number;
|
|
7
|
+
generatedAt: number;
|
|
8
|
+
entries: Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
count: number;
|
|
11
|
+
lastUsed: number;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare class RuleTracker {
|
|
15
|
+
private readonly statsPath;
|
|
16
|
+
private stats;
|
|
17
|
+
constructor(statsPath: string);
|
|
18
|
+
static fromFile(statsPath: string): Promise<RuleTracker>;
|
|
19
|
+
trackRuleUsage(ruleNames: string[]): void;
|
|
20
|
+
getStats(): Record<string, RuleStats>;
|
|
21
|
+
detectUnusedRules(allRuleNames: string[], thresholdDays: number): string[];
|
|
22
|
+
generateReport(): RuleEffectivenessReport;
|
|
23
|
+
save(): Promise<void>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RuleTracker = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
class RuleTracker {
|
|
8
|
+
constructor(statsPath) {
|
|
9
|
+
this.statsPath = statsPath;
|
|
10
|
+
this.stats = {};
|
|
11
|
+
}
|
|
12
|
+
static async fromFile(statsPath) {
|
|
13
|
+
const tracker = new RuleTracker(statsPath);
|
|
14
|
+
try {
|
|
15
|
+
const raw = await (0, promises_1.readFile)(statsPath, 'utf-8');
|
|
16
|
+
tracker.stats = JSON.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
}
|
|
20
|
+
return tracker;
|
|
21
|
+
}
|
|
22
|
+
trackRuleUsage(ruleNames) {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
for (const name of ruleNames) {
|
|
25
|
+
if (!name)
|
|
26
|
+
continue;
|
|
27
|
+
if (this.stats[name]) {
|
|
28
|
+
this.stats[name].count += 1;
|
|
29
|
+
this.stats[name].lastUsed = now;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.stats[name] = { count: 1, lastUsed: now };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getStats() {
|
|
37
|
+
return JSON.parse(JSON.stringify(this.stats));
|
|
38
|
+
}
|
|
39
|
+
detectUnusedRules(allRuleNames, thresholdDays) {
|
|
40
|
+
const thresholdMs = thresholdDays * 24 * 60 * 60 * 1000;
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const unused = [];
|
|
43
|
+
for (const name of allRuleNames) {
|
|
44
|
+
const stat = this.stats[name];
|
|
45
|
+
if (!stat || now - stat.lastUsed > thresholdMs) {
|
|
46
|
+
unused.push(name);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return unused;
|
|
50
|
+
}
|
|
51
|
+
generateReport() {
|
|
52
|
+
const entries = Object.entries(this.stats)
|
|
53
|
+
.map(([name, stat]) => ({
|
|
54
|
+
name,
|
|
55
|
+
count: stat.count,
|
|
56
|
+
lastUsed: stat.lastUsed,
|
|
57
|
+
}))
|
|
58
|
+
.sort((a, b) => b.count - a.count);
|
|
59
|
+
return {
|
|
60
|
+
totalRulesTracked: entries.length,
|
|
61
|
+
generatedAt: Date.now(),
|
|
62
|
+
entries,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async save() {
|
|
66
|
+
const dir = (0, path_1.dirname)(this.statsPath);
|
|
67
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
68
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
await (0, promises_1.writeFile)(this.statsPath, JSON.stringify(this.stats, null, 2), 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.RuleTracker = RuleTracker;
|
|
74
|
+
//# sourceMappingURL=rule-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tracker.js","sourceRoot":"","sources":["../../../src/rules/rule-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const EVENT_TYPES: readonly ["tool_call", "session_start", "session_end", "pattern_detected", "rule_suggested"];
|
|
2
|
+
export type EventType = (typeof EVENT_TYPES)[number];
|
|
3
|
+
export interface BridgeEvent {
|
|
4
|
+
ts: string;
|
|
5
|
+
type: EventType;
|
|
6
|
+
session_id: string;
|
|
7
|
+
payload: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare class EventBridgeReader {
|
|
10
|
+
readonly eventsDir: string;
|
|
11
|
+
private readonly sessionId;
|
|
12
|
+
private offset;
|
|
13
|
+
constructor(sessionId: string, eventsDir?: string);
|
|
14
|
+
private get filePath();
|
|
15
|
+
readNewEvents(): Promise<BridgeEvent[]>;
|
|
16
|
+
cleanup(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventBridgeReader = exports.EVENT_TYPES = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
exports.EVENT_TYPES = [
|
|
8
|
+
'tool_call',
|
|
9
|
+
'session_start',
|
|
10
|
+
'session_end',
|
|
11
|
+
'pattern_detected',
|
|
12
|
+
'rule_suggested',
|
|
13
|
+
];
|
|
14
|
+
class EventBridgeReader {
|
|
15
|
+
constructor(sessionId, eventsDir) {
|
|
16
|
+
this.offset = 0;
|
|
17
|
+
this.sessionId = sessionId;
|
|
18
|
+
this.eventsDir = eventsDir ?? (0, path_1.join)((0, os_1.homedir)(), '.codingbuddy', 'events');
|
|
19
|
+
}
|
|
20
|
+
get filePath() {
|
|
21
|
+
return (0, path_1.join)(this.eventsDir, `${this.sessionId}.jsonl`);
|
|
22
|
+
}
|
|
23
|
+
async readNewEvents() {
|
|
24
|
+
let content;
|
|
25
|
+
try {
|
|
26
|
+
const buffer = await fs_1.promises.readFile(this.filePath, 'utf-8');
|
|
27
|
+
content = buffer.slice(this.offset);
|
|
28
|
+
this.offset = buffer.length;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
if (!content) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const events = [];
|
|
37
|
+
const lines = content.split('\n').filter(line => line.trim().length > 0);
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
try {
|
|
40
|
+
events.push(JSON.parse(line));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return events;
|
|
46
|
+
}
|
|
47
|
+
async cleanup() {
|
|
48
|
+
try {
|
|
49
|
+
await fs_1.promises.unlink(this.filePath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.EventBridgeReader = EventBridgeReader;
|
|
56
|
+
//# sourceMappingURL=event-bridge-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bridge-reader.js","sourceRoot":"","sources":["../../../src/shared/event-bridge-reader.ts"],"names":[],"mappings":";;;AAMA,2BAAoC;AACpC,+BAA4B;AAC5B,2BAA6B;AAGhB,QAAA,WAAW,GAAG;IACzB,WAAW;IACX,eAAe;IACf,aAAa;IACb,kBAAkB;IAClB,gBAAgB;CACR,CAAC;AAgBX,MAAa,iBAAiB;IAK5B,YAAY,SAAiB,EAAE,SAAkB;QAFzC,WAAM,GAAG,CAAC,CAAC;QAGjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC;IACzD,CAAC;IAOD,KAAK,CAAC,aAAa;QACjB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEzE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;YAET,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAGD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;CACF;AAvDD,8CAuDC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { DiscussionRound } from '../../collaboration/types';
|
|
3
|
+
export interface AgentDiscussionPanelProps {
|
|
4
|
+
rounds: readonly DiscussionRound[];
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function AgentDiscussionPanel({ rounds, width, height, }: AgentDiscussionPanelProps): React.ReactElement;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentDiscussionPanel = AgentDiscussionPanel;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ink_1 = require("ink");
|
|
6
|
+
const theme_1 = require("../utils/theme");
|
|
7
|
+
const agent_discussion_panel_pure_1 = require("./agent-discussion-panel.pure");
|
|
8
|
+
const LINE_COLORS = {
|
|
9
|
+
opinion: 'white',
|
|
10
|
+
'cross-review': 'cyan',
|
|
11
|
+
consensus: 'green',
|
|
12
|
+
header: 'magenta',
|
|
13
|
+
empty: 'gray',
|
|
14
|
+
};
|
|
15
|
+
function AgentDiscussionPanel({ rounds, width, height, }) {
|
|
16
|
+
const lines = (0, react_1.useMemo)(() => (0, agent_discussion_panel_pure_1.renderDiscussionPanel)(rounds, width), [rounds, width]);
|
|
17
|
+
const maxLines = Math.max(0, height - 2);
|
|
18
|
+
const visibleLines = lines.slice(0, maxLines);
|
|
19
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", width: width, height: height, borderStyle: "round", borderColor: theme_1.BORDER_COLORS.panel }, visibleLines.map((line, i) => (react_1.default.createElement(ink_1.Text, { key: i, color: LINE_COLORS[line.type], bold: line.type === 'header' || line.type === 'consensus', dimColor: line.type === 'empty', wrap: "truncate" }, line.text)))));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=AgentDiscussionPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDiscussionPanel.js","sourceRoot":"","sources":["../../../../src/tui/components/AgentDiscussionPanel.tsx"],"names":[],"mappings":";;AA+BA,oDAmCC;AA5DD,iCAAuC;AACvC,6BAAgC;AAEhC,0CAA+C;AAC/C,+EAA2F;AAS3F,MAAM,WAAW,GAA2C;IAC1D,OAAO,EAAE,OAAO;IAChB,cAAc,EAAE,MAAM;IACtB,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,MAAM;CACd,CAAC;AAMF,SAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,KAAK,EACL,MAAM,GACoB;IAC1B,MAAM,KAAK,GAAG,IAAA,eAAO,EACnB,GAAG,EAAE,CAAC,IAAA,mDAAqB,EAAC,MAAM,EAAE,KAAK,CAAC,EAC1C,CAAC,MAAM,EAAE,KAAK,CAAC,CAChB,CAAC;IAGF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE9C,OAAO,CACL,8BAAC,SAAG,IACF,aAAa,EAAC,QAAQ,EACtB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,qBAAa,CAAC,KAAK,IAE/B,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC7B,8BAAC,UAAI,IACH,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EACzD,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,EAC/B,IAAI,EAAC,UAAU,IAEd,IAAI,CAAC,IAAI,CACL,CACR,CAAC,CACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const ink_testing_library_1 = require("ink-testing-library");
|
|
6
|
+
const AgentDiscussionPanel_1 = require("./AgentDiscussionPanel");
|
|
7
|
+
const types_1 = require("../../collaboration/types");
|
|
8
|
+
function makeRound() {
|
|
9
|
+
return {
|
|
10
|
+
roundNumber: 1,
|
|
11
|
+
opinions: [
|
|
12
|
+
(0, types_1.createAgentOpinion)({
|
|
13
|
+
agentId: 'arch-1',
|
|
14
|
+
agentName: 'architecture',
|
|
15
|
+
stance: 'approve',
|
|
16
|
+
reasoning: 'Clean design',
|
|
17
|
+
}),
|
|
18
|
+
(0, types_1.createAgentOpinion)({
|
|
19
|
+
agentId: 'sec-1',
|
|
20
|
+
agentName: 'security',
|
|
21
|
+
stance: 'concern',
|
|
22
|
+
reasoning: 'Auth needs review',
|
|
23
|
+
}),
|
|
24
|
+
(0, types_1.createAgentOpinion)({
|
|
25
|
+
agentId: 'test-1',
|
|
26
|
+
agentName: 'test-strategy',
|
|
27
|
+
stance: 'approve',
|
|
28
|
+
reasoning: 'Good testability',
|
|
29
|
+
}),
|
|
30
|
+
],
|
|
31
|
+
crossReviews: [
|
|
32
|
+
(0, types_1.createCrossReview)({
|
|
33
|
+
fromAgentId: 'arch-1',
|
|
34
|
+
toAgentId: 'sec-1',
|
|
35
|
+
stance: 'approve',
|
|
36
|
+
comment: 'Middleware pattern solves it',
|
|
37
|
+
}),
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
(0, vitest_1.describe)('tui/components/AgentDiscussionPanel', () => {
|
|
42
|
+
(0, vitest_1.it)('should render discussion with agent opinions', () => {
|
|
43
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(AgentDiscussionPanel_1.AgentDiscussionPanel, { rounds: [makeRound()], width: 80, height: 20 }));
|
|
44
|
+
const frame = lastFrame() ?? '';
|
|
45
|
+
(0, vitest_1.expect)(frame).toContain('Agent Discussion');
|
|
46
|
+
(0, vitest_1.expect)(frame).toContain('architecture');
|
|
47
|
+
(0, vitest_1.expect)(frame).toContain('security');
|
|
48
|
+
(0, vitest_1.expect)(frame).toContain('test-strategy');
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('should render consensus line', () => {
|
|
51
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(AgentDiscussionPanel_1.AgentDiscussionPanel, { rounds: [makeRound()], width: 80, height: 20 }));
|
|
52
|
+
const frame = lastFrame() ?? '';
|
|
53
|
+
(0, vitest_1.expect)(frame).toContain('Consensus');
|
|
54
|
+
(0, vitest_1.expect)(frame).toContain('2/3');
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('should render cross-review with arrow', () => {
|
|
57
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(AgentDiscussionPanel_1.AgentDiscussionPanel, { rounds: [makeRound()], width: 80, height: 20 }));
|
|
58
|
+
const frame = lastFrame() ?? '';
|
|
59
|
+
(0, vitest_1.expect)(frame).toContain('→');
|
|
60
|
+
(0, vitest_1.expect)(frame).toContain('agrees');
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)('should render empty state when no rounds', () => {
|
|
63
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(AgentDiscussionPanel_1.AgentDiscussionPanel, { rounds: [], width: 80, height: 10 }));
|
|
64
|
+
const frame = lastFrame() ?? '';
|
|
65
|
+
(0, vitest_1.expect)(frame).toContain('No agent discussion yet');
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('should truncate lines to fit height', () => {
|
|
68
|
+
const manyOpinions = Array.from({ length: 20 }, (_, i) => (0, types_1.createAgentOpinion)({
|
|
69
|
+
agentId: `a${i}`,
|
|
70
|
+
agentName: `agent-${i}`,
|
|
71
|
+
stance: 'approve',
|
|
72
|
+
reasoning: `Reason ${i}`,
|
|
73
|
+
}));
|
|
74
|
+
const round = {
|
|
75
|
+
roundNumber: 1,
|
|
76
|
+
opinions: manyOpinions,
|
|
77
|
+
crossReviews: [],
|
|
78
|
+
};
|
|
79
|
+
const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(AgentDiscussionPanel_1.AgentDiscussionPanel, { rounds: [round], width: 80, height: 8 }));
|
|
80
|
+
const frame = lastFrame() ?? '';
|
|
81
|
+
const lines = frame.split('\n');
|
|
82
|
+
(0, vitest_1.expect)(lines.length).toBeLessThanOrEqual(10);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=AgentDiscussionPanel.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDiscussionPanel.spec.js","sourceRoot":"","sources":["../../../../src/tui/components/AgentDiscussionPanel.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentOpinion, CrossReview, ConsensusResult, DiscussionRound, Stance } from '../../collaboration/types';
|
|
2
|
+
export interface DiscussionLine {
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly type: 'opinion' | 'cross-review' | 'consensus' | 'header' | 'empty';
|
|
5
|
+
}
|
|
6
|
+
export declare function renderStanceHistory(stances: Stance[]): string;
|
|
7
|
+
export declare function renderOpinionLine(opinion: AgentOpinion, stanceHistory?: Stance[]): DiscussionLine;
|
|
8
|
+
export declare function renderCrossReviewLine(review: CrossReview, agentNames: Record<string, string>): DiscussionLine;
|
|
9
|
+
export declare function renderConsensusLine(consensus: ConsensusResult): DiscussionLine;
|
|
10
|
+
export declare function renderDiscussionPanel(rounds: readonly DiscussionRound[], _width: number): DiscussionLine[];
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderStanceHistory = renderStanceHistory;
|
|
4
|
+
exports.renderOpinionLine = renderOpinionLine;
|
|
5
|
+
exports.renderCrossReviewLine = renderCrossReviewLine;
|
|
6
|
+
exports.renderConsensusLine = renderConsensusLine;
|
|
7
|
+
exports.renderDiscussionPanel = renderDiscussionPanel;
|
|
8
|
+
const types_1 = require("../../collaboration/types");
|
|
9
|
+
const theme_1 = require("../utils/theme");
|
|
10
|
+
const CROSS_REVIEW_VERBS = {
|
|
11
|
+
approve: 'agrees',
|
|
12
|
+
concern: 'notes',
|
|
13
|
+
reject: 'disagrees',
|
|
14
|
+
};
|
|
15
|
+
function renderStanceHistory(stances) {
|
|
16
|
+
if (stances.length <= 1)
|
|
17
|
+
return '';
|
|
18
|
+
return stances.map(s => types_1.STANCE_ICONS[s]).join(' → ');
|
|
19
|
+
}
|
|
20
|
+
function renderOpinionLine(opinion, stanceHistory) {
|
|
21
|
+
const avatar = (0, theme_1.getAgentAvatar)(opinion.agentName);
|
|
22
|
+
const icon = types_1.STANCE_ICONS[opinion.stance];
|
|
23
|
+
let suffix = '';
|
|
24
|
+
if (stanceHistory && stanceHistory.length > 1) {
|
|
25
|
+
const lastStance = stanceHistory[stanceHistory.length - 1];
|
|
26
|
+
const prevStance = stanceHistory[stanceHistory.length - 2];
|
|
27
|
+
if (lastStance !== prevStance) {
|
|
28
|
+
suffix = ` (${prevStance === 'reject' || prevStance === 'concern' ? 'revised' : 'alt'})`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
text: `${avatar} ${opinion.agentName} ${icon} ${opinion.stance}${suffix}: "${opinion.reasoning}"`,
|
|
33
|
+
type: 'opinion',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function renderCrossReviewLine(review, agentNames) {
|
|
37
|
+
const fromAvatar = (0, theme_1.getAgentAvatar)(agentNames[review.fromAgentId] ?? 'unknown');
|
|
38
|
+
const fromName = agentNames[review.fromAgentId] ?? review.fromAgentId;
|
|
39
|
+
const toAvatar = (0, theme_1.getAgentAvatar)(agentNames[review.toAgentId] ?? 'unknown');
|
|
40
|
+
const toName = agentNames[review.toAgentId] ?? review.toAgentId;
|
|
41
|
+
const verb = CROSS_REVIEW_VERBS[review.stance];
|
|
42
|
+
return {
|
|
43
|
+
text: `${fromAvatar} ${fromName} → ${toAvatar} ${toName} ${verb}: "${review.comment}"`,
|
|
44
|
+
type: 'cross-review',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function renderConsensusLine(consensus) {
|
|
48
|
+
const icon = consensus.reached ? '✅' : '❌';
|
|
49
|
+
return {
|
|
50
|
+
text: `${icon} Consensus: ${consensus.approveCount}/${consensus.totalAgents} | Critical: ${consensus.criticalCount}`,
|
|
51
|
+
type: 'consensus',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function buildAgentNameMap(rounds) {
|
|
55
|
+
const map = {};
|
|
56
|
+
for (const round of rounds) {
|
|
57
|
+
for (const opinion of round.opinions) {
|
|
58
|
+
map[opinion.agentId] = opinion.agentName;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return map;
|
|
62
|
+
}
|
|
63
|
+
function buildStanceHistories(rounds) {
|
|
64
|
+
const histories = {};
|
|
65
|
+
for (const round of rounds) {
|
|
66
|
+
for (const opinion of round.opinions) {
|
|
67
|
+
if (!histories[opinion.agentId]) {
|
|
68
|
+
histories[opinion.agentId] = [];
|
|
69
|
+
}
|
|
70
|
+
histories[opinion.agentId].push(opinion.stance);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return histories;
|
|
74
|
+
}
|
|
75
|
+
function renderDiscussionPanel(rounds, _width) {
|
|
76
|
+
if (rounds.length === 0) {
|
|
77
|
+
return [{ text: 'No agent discussion yet', type: 'empty' }];
|
|
78
|
+
}
|
|
79
|
+
const lines = [];
|
|
80
|
+
const agentNames = buildAgentNameMap(rounds);
|
|
81
|
+
const stanceHistories = buildStanceHistories(rounds);
|
|
82
|
+
const latestRound = rounds[rounds.length - 1];
|
|
83
|
+
lines.push({ text: `── Agent Discussion ──`, type: 'header' });
|
|
84
|
+
for (const opinion of latestRound.opinions) {
|
|
85
|
+
lines.push(renderOpinionLine(opinion, stanceHistories[opinion.agentId]));
|
|
86
|
+
}
|
|
87
|
+
for (const review of latestRound.crossReviews) {
|
|
88
|
+
lines.push(renderCrossReviewLine(review, agentNames));
|
|
89
|
+
}
|
|
90
|
+
const consensus = (0, types_1.calculateConsensus)(latestRound.opinions);
|
|
91
|
+
lines.push(renderConsensusLine(consensus));
|
|
92
|
+
return lines;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=agent-discussion-panel.pure.js.map
|