codehere 0.2.2 → 0.3.0-rc.10
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 +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +261 -1224
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/conductor-adapter.js +340 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +278 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/probe-port.js +36 -0
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/presentation/cli/repl.js +474 -0
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: Telemetry Service
|
|
3
|
-
* Privacy-first, opt-in telemetry for understanding usage patterns
|
|
4
|
-
*
|
|
5
|
-
* Principles:
|
|
6
|
-
* - Opt-in only (CODEHERE_TELEMETRY_ENABLED=true)
|
|
7
|
-
* - No code/content transmitted
|
|
8
|
-
* - Anonymized data only
|
|
9
|
-
* - Local-first (stores locally, syncs if enabled)
|
|
10
|
-
*
|
|
11
|
-
* Clean Architecture: Infrastructure Layer
|
|
12
|
-
*/
|
|
13
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, appendFileSync } from 'fs';
|
|
14
|
-
import { join, dirname } from 'path';
|
|
15
|
-
import { fileURLToPath } from 'url';
|
|
16
|
-
import { randomUUID } from 'crypto';
|
|
17
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
-
const __dirname = dirname(__filename);
|
|
19
|
-
export class TelemetryService {
|
|
20
|
-
telemetryDir;
|
|
21
|
-
eventsFile;
|
|
22
|
-
configFile;
|
|
23
|
-
enabled = false;
|
|
24
|
-
anonymousId = '';
|
|
25
|
-
sessionId = '';
|
|
26
|
-
constructor() {
|
|
27
|
-
// Find codebase root
|
|
28
|
-
const codebaseRoot = this.findCodebaseRoot();
|
|
29
|
-
this.telemetryDir = join(codebaseRoot, '.codehere', 'telemetry');
|
|
30
|
-
this.eventsFile = join(this.telemetryDir, 'events.jsonl');
|
|
31
|
-
this.configFile = join(this.telemetryDir, 'config.json');
|
|
32
|
-
this.sessionId = randomUUID();
|
|
33
|
-
this.loadConfig();
|
|
34
|
-
}
|
|
35
|
-
findCodebaseRoot() {
|
|
36
|
-
let current = process.cwd();
|
|
37
|
-
while (current !== '/') {
|
|
38
|
-
if (existsSync(join(current, '.codehere'))) {
|
|
39
|
-
return current;
|
|
40
|
-
}
|
|
41
|
-
current = join(current, '..');
|
|
42
|
-
}
|
|
43
|
-
return process.cwd();
|
|
44
|
-
}
|
|
45
|
-
loadConfig() {
|
|
46
|
-
// Check environment variable first
|
|
47
|
-
const envEnabled = process.env.CODEHERE_TELEMETRY_ENABLED === 'true';
|
|
48
|
-
if (existsSync(this.configFile)) {
|
|
49
|
-
try {
|
|
50
|
-
const config = JSON.parse(readFileSync(this.configFile, 'utf-8'));
|
|
51
|
-
this.enabled = config.enabled || envEnabled;
|
|
52
|
-
this.anonymousId = config.anonymousId || this.generateAnonymousId();
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
this.enabled = envEnabled;
|
|
56
|
-
this.anonymousId = this.generateAnonymousId();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
this.enabled = envEnabled;
|
|
61
|
-
this.anonymousId = this.generateAnonymousId();
|
|
62
|
-
}
|
|
63
|
-
// Save config
|
|
64
|
-
this.saveConfig();
|
|
65
|
-
}
|
|
66
|
-
generateAnonymousId() {
|
|
67
|
-
// Generate a persistent anonymous ID (not tied to user identity)
|
|
68
|
-
return randomUUID();
|
|
69
|
-
}
|
|
70
|
-
saveConfig() {
|
|
71
|
-
if (!existsSync(this.telemetryDir)) {
|
|
72
|
-
mkdirSync(this.telemetryDir, { recursive: true });
|
|
73
|
-
}
|
|
74
|
-
writeFileSync(this.configFile, JSON.stringify({
|
|
75
|
-
enabled: this.enabled,
|
|
76
|
-
anonymousId: this.anonymousId,
|
|
77
|
-
enabledAt: this.enabled ? Date.now() : null,
|
|
78
|
-
}, null, 2));
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Check if telemetry is enabled
|
|
82
|
-
*/
|
|
83
|
-
isEnabled() {
|
|
84
|
-
return this.enabled;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Enable telemetry (opt-in)
|
|
88
|
-
*/
|
|
89
|
-
enable() {
|
|
90
|
-
this.enabled = true;
|
|
91
|
-
this.saveConfig();
|
|
92
|
-
this.track('install', {
|
|
93
|
-
version: process.env.npm_package_version || 'unknown',
|
|
94
|
-
os: process.platform,
|
|
95
|
-
nodeVersion: process.version,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Disable telemetry
|
|
100
|
-
*/
|
|
101
|
-
disable() {
|
|
102
|
-
this.enabled = false;
|
|
103
|
-
this.saveConfig();
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Track an event
|
|
107
|
-
*/
|
|
108
|
-
track(eventType, data = {}) {
|
|
109
|
-
if (!this.enabled) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
const event = {
|
|
113
|
-
id: randomUUID(),
|
|
114
|
-
timestamp: Date.now(),
|
|
115
|
-
eventType,
|
|
116
|
-
data: {
|
|
117
|
-
...data,
|
|
118
|
-
version: data.version || process.env.npm_package_version || 'unknown',
|
|
119
|
-
os: data.os || process.platform,
|
|
120
|
-
nodeVersion: data.nodeVersion || process.version,
|
|
121
|
-
},
|
|
122
|
-
sessionId: this.sessionId,
|
|
123
|
-
anonymousId: this.anonymousId,
|
|
124
|
-
};
|
|
125
|
-
// Write to local file
|
|
126
|
-
if (!existsSync(this.telemetryDir)) {
|
|
127
|
-
mkdirSync(this.telemetryDir, { recursive: true });
|
|
128
|
-
}
|
|
129
|
-
appendFileSync(this.eventsFile, JSON.stringify(event) + '\n');
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Track command usage
|
|
133
|
-
*/
|
|
134
|
-
trackCommand(command) {
|
|
135
|
-
this.track('command', { command });
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Track error
|
|
139
|
-
*/
|
|
140
|
-
trackError(errorType) {
|
|
141
|
-
this.track('error', { errorType });
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Track feature usage
|
|
145
|
-
*/
|
|
146
|
-
trackFeature(feature) {
|
|
147
|
-
this.track('feature_use', { feature });
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get telemetry status message
|
|
151
|
-
*/
|
|
152
|
-
getStatusMessage() {
|
|
153
|
-
if (this.enabled) {
|
|
154
|
-
return 'Telemetry: Enabled (opt-in)';
|
|
155
|
-
}
|
|
156
|
-
return 'Telemetry: Disabled (set CODEHERE_TELEMETRY_ENABLED=true to enable)';
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Singleton instance
|
|
160
|
-
let telemetryService = null;
|
|
161
|
-
export function getTelemetryService() {
|
|
162
|
-
if (!telemetryService) {
|
|
163
|
-
telemetryService = new TelemetryService();
|
|
164
|
-
}
|
|
165
|
-
return telemetryService;
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=telemetry-service.js.map
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Infrastructure: Appropriate Friction System
|
|
3
|
-
*
|
|
4
|
-
* Intentionally inserts slowdowns at critical junctures to encourage human review
|
|
5
|
-
* Research: Appropriate friction at high-risk moments prevents rubber-stamp reviews
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Risk-based friction points
|
|
9
|
-
* - Review checkpoints before critical operations
|
|
10
|
-
* - Pause for reflection on high-risk changes
|
|
11
|
-
* - Confirmation dialogs for destructive actions
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Appropriate Friction System
|
|
15
|
-
* Manages friction points to ensure human review at critical moments
|
|
16
|
-
*/
|
|
17
|
-
export class AppropriateFriction {
|
|
18
|
-
frictionPoints = new Map();
|
|
19
|
-
frictionHistory = [];
|
|
20
|
-
constructor() {
|
|
21
|
-
this.initializeDefaultFrictionPoints();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Check if friction is needed for an operation
|
|
25
|
-
*/
|
|
26
|
-
needsFriction(operation, context) {
|
|
27
|
-
const { riskLevel = 'medium', isDestructive = false, affectsMultipleFiles = false, modifiesSecuritySensitiveCode = false, uncertainty = 0.5, } = context;
|
|
28
|
-
// Critical operations always need friction
|
|
29
|
-
if (riskLevel === 'critical') {
|
|
30
|
-
return this.createFrictionPoint({
|
|
31
|
-
id: `${operation}-critical`,
|
|
32
|
-
type: 'review_checkpoint',
|
|
33
|
-
level: 'heavy',
|
|
34
|
-
operation,
|
|
35
|
-
message: '⚠️ CRITICAL OPERATION: This requires mandatory human review before proceeding.',
|
|
36
|
-
requiresExplicitConfirmation: true,
|
|
37
|
-
options: ['review', 'cancel'],
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
// Destructive operations need confirmation
|
|
41
|
-
if (isDestructive) {
|
|
42
|
-
return this.createFrictionPoint({
|
|
43
|
-
id: `${operation}-destructive`,
|
|
44
|
-
type: 'confirmation',
|
|
45
|
-
level: 'moderate',
|
|
46
|
-
operation,
|
|
47
|
-
message: '⚠️ Destructive operation detected. This action cannot be easily undone. Please confirm.',
|
|
48
|
-
requiresExplicitConfirmation: true,
|
|
49
|
-
options: ['proceed', 'cancel'],
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
// High-risk operations need pause
|
|
53
|
-
if (riskLevel === 'high') {
|
|
54
|
-
return this.createFrictionPoint({
|
|
55
|
-
id: `${operation}-high-risk`,
|
|
56
|
-
type: 'pause',
|
|
57
|
-
level: 'moderate',
|
|
58
|
-
operation,
|
|
59
|
-
message: '⏸️ High-risk operation detected. Pausing for review (3 seconds)...',
|
|
60
|
-
requiresExplicitConfirmation: false,
|
|
61
|
-
timeout: 3000,
|
|
62
|
-
options: ['proceed', 'review'],
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// Multi-file operations need review checkpoint
|
|
66
|
-
if (affectsMultipleFiles && riskLevel !== 'low') {
|
|
67
|
-
return this.createFrictionPoint({
|
|
68
|
-
id: `${operation}-multi-file`,
|
|
69
|
-
type: 'review_checkpoint',
|
|
70
|
-
level: 'moderate',
|
|
71
|
-
operation,
|
|
72
|
-
message: '📝 Multi-file operation detected. Review the plan before proceeding.',
|
|
73
|
-
requiresExplicitConfirmation: true,
|
|
74
|
-
options: ['proceed', 'review', 'cancel'],
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
// Security-sensitive operations need heavy friction
|
|
78
|
-
if (modifiesSecuritySensitiveCode) {
|
|
79
|
-
return this.createFrictionPoint({
|
|
80
|
-
id: `${operation}-security`,
|
|
81
|
-
type: 'review_checkpoint',
|
|
82
|
-
level: 'heavy',
|
|
83
|
-
operation,
|
|
84
|
-
message: '🔒 Security-sensitive code modification. Mandatory review required.',
|
|
85
|
-
requiresExplicitConfirmation: true,
|
|
86
|
-
options: ['review', 'cancel'],
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
// High uncertainty needs warning
|
|
90
|
-
if (uncertainty > 0.7 && riskLevel !== 'low') {
|
|
91
|
-
return this.createFrictionPoint({
|
|
92
|
-
id: `${operation}-uncertainty`,
|
|
93
|
-
type: 'warning_display',
|
|
94
|
-
level: 'light',
|
|
95
|
-
operation,
|
|
96
|
-
message: '⚠️ High uncertainty detected. Verify output carefully.',
|
|
97
|
-
requiresExplicitConfirmation: false,
|
|
98
|
-
timeout: 2000,
|
|
99
|
-
options: ['proceed'],
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return null; // No friction needed
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Apply friction point (in real implementation, this would be UI-based)
|
|
106
|
-
* For CLI, we simulate with prompts and pauses
|
|
107
|
-
*/
|
|
108
|
-
async applyFriction(frictionPoint, autoProceed = false) {
|
|
109
|
-
// In production, this would:
|
|
110
|
-
// - Display UI dialog for confirmation
|
|
111
|
-
// - Show review checkpoint
|
|
112
|
-
// - Pause execution
|
|
113
|
-
// - Wait for user input
|
|
114
|
-
// For CLI/simulation, we log and return decision
|
|
115
|
-
const result = {
|
|
116
|
-
proceed: autoProceed || frictionPoint.type === 'warning_display',
|
|
117
|
-
action: autoProceed ? 'auto-proceed' : 'pending',
|
|
118
|
-
timestamp: Date.now(),
|
|
119
|
-
};
|
|
120
|
-
// Store in history
|
|
121
|
-
this.frictionHistory.push({
|
|
122
|
-
point: frictionPoint,
|
|
123
|
-
result,
|
|
124
|
-
});
|
|
125
|
-
// Store friction point
|
|
126
|
-
this.frictionPoints.set(frictionPoint.id, frictionPoint);
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Format friction point for display
|
|
131
|
-
*/
|
|
132
|
-
formatFrictionPoint(frictionPoint) {
|
|
133
|
-
let output = '';
|
|
134
|
-
output += `\n${'═'.repeat(80)}\n`;
|
|
135
|
-
output += `${frictionPoint.message}\n`;
|
|
136
|
-
output += `${'═'.repeat(80)}\n`;
|
|
137
|
-
if (frictionPoint.options && frictionPoint.options.length > 1) {
|
|
138
|
-
output += `\nAvailable actions: ${frictionPoint.options.join(', ')}\n`;
|
|
139
|
-
}
|
|
140
|
-
if (frictionPoint.timeout) {
|
|
141
|
-
output += `(Auto-proceeding in ${frictionPoint.timeout / 1000}s if no response)\n`;
|
|
142
|
-
}
|
|
143
|
-
if (frictionPoint.requiresExplicitConfirmation) {
|
|
144
|
-
output += `⚠️ Explicit confirmation required\n`;
|
|
145
|
-
}
|
|
146
|
-
output += `${'═'.repeat(80)}\n`;
|
|
147
|
-
return output;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get friction history for audit
|
|
151
|
-
*/
|
|
152
|
-
getFrictionHistory(filter) {
|
|
153
|
-
let filtered = [...this.frictionHistory];
|
|
154
|
-
if (filter?.operation) {
|
|
155
|
-
filtered = filtered.filter(item => item.point.operation === filter.operation);
|
|
156
|
-
}
|
|
157
|
-
if (filter?.type) {
|
|
158
|
-
filtered = filtered.filter(item => item.point.type === filter.type);
|
|
159
|
-
}
|
|
160
|
-
if (filter?.startTime) {
|
|
161
|
-
filtered = filtered.filter(item => item.result.timestamp >= filter.startTime);
|
|
162
|
-
}
|
|
163
|
-
if (filter?.endTime) {
|
|
164
|
-
filtered = filtered.filter(item => item.result.timestamp <= filter.endTime);
|
|
165
|
-
}
|
|
166
|
-
return filtered.sort((a, b) => b.result.timestamp - a.result.timestamp);
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Register custom friction point
|
|
170
|
-
*/
|
|
171
|
-
registerFrictionPoint(point) {
|
|
172
|
-
this.frictionPoints.set(point.id, point);
|
|
173
|
-
}
|
|
174
|
-
// Private helpers
|
|
175
|
-
createFrictionPoint(point) {
|
|
176
|
-
return {
|
|
177
|
-
...point,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
initializeDefaultFrictionPoints() {
|
|
181
|
-
// Critical operations
|
|
182
|
-
this.registerFrictionPoint({
|
|
183
|
-
id: 'default-critical',
|
|
184
|
-
type: 'review_checkpoint',
|
|
185
|
-
level: 'heavy',
|
|
186
|
-
operation: 'critical',
|
|
187
|
-
message: 'Critical operation detected - human review required',
|
|
188
|
-
requiresExplicitConfirmation: true,
|
|
189
|
-
options: ['review', 'cancel'],
|
|
190
|
-
});
|
|
191
|
-
// Destructive operations
|
|
192
|
-
this.registerFrictionPoint({
|
|
193
|
-
id: 'default-destructive',
|
|
194
|
-
type: 'confirmation',
|
|
195
|
-
level: 'moderate',
|
|
196
|
-
operation: 'destructive',
|
|
197
|
-
message: 'Destructive operation - cannot be easily undone',
|
|
198
|
-
requiresExplicitConfirmation: true,
|
|
199
|
-
options: ['proceed', 'cancel'],
|
|
200
|
-
});
|
|
201
|
-
// Security modifications
|
|
202
|
-
this.registerFrictionPoint({
|
|
203
|
-
id: 'default-security',
|
|
204
|
-
type: 'review_checkpoint',
|
|
205
|
-
level: 'heavy',
|
|
206
|
-
operation: 'security',
|
|
207
|
-
message: 'Security-sensitive code modification - mandatory review',
|
|
208
|
-
requiresExplicitConfirmation: true,
|
|
209
|
-
options: ['review', 'cancel'],
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=appropriate-friction.js.map
|