jfl 0.8.1 → 0.9.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/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +30 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ide.d.ts +2 -1
- package/dist/commands/ide.d.ts.map +1 -1
- package/dist/commands/ide.js +60 -1
- package/dist/commands/ide.js.map +1 -1
- package/dist/commands/init-from-service.d.ts +15 -0
- package/dist/commands/init-from-service.d.ts.map +1 -0
- package/dist/commands/init-from-service.js +541 -0
- package/dist/commands/init-from-service.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/kanban.d.ts.map +1 -1
- package/dist/commands/kanban.js +13 -4
- package/dist/commands/kanban.js.map +1 -1
- package/dist/commands/linear.d.ts +41 -0
- package/dist/commands/linear.d.ts.map +1 -0
- package/dist/commands/linear.js +715 -0
- package/dist/commands/linear.js.map +1 -0
- package/dist/commands/peter.d.ts.map +1 -1
- package/dist/commands/peter.js +232 -25
- package/dist/commands/peter.js.map +1 -1
- package/dist/commands/services.d.ts.map +1 -1
- package/dist/commands/services.js +146 -0
- package/dist/commands/services.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +173 -13
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/telemetry-monitor.d.ts +11 -0
- package/dist/commands/telemetry-monitor.d.ts.map +1 -0
- package/dist/commands/telemetry-monitor.js +224 -0
- package/dist/commands/telemetry-monitor.js.map +1 -0
- package/dist/commands/telemetry-test.d.ts +11 -0
- package/dist/commands/telemetry-test.d.ts.map +1 -0
- package/dist/commands/telemetry-test.js +67 -0
- package/dist/commands/telemetry-test.js.map +1 -0
- package/dist/commands/tenet-agents.d.ts +13 -0
- package/dist/commands/tenet-agents.d.ts.map +1 -0
- package/dist/commands/tenet-agents.js +191 -0
- package/dist/commands/tenet-agents.js.map +1 -0
- package/dist/commands/tenet-setup.d.ts +19 -0
- package/dist/commands/tenet-setup.d.ts.map +1 -0
- package/dist/commands/tenet-setup.js +131 -0
- package/dist/commands/tenet-setup.js.map +1 -0
- package/dist/commands/train.d.ts +18 -0
- package/dist/commands/train.d.ts.map +1 -1
- package/dist/commands/train.js +182 -0
- package/dist/commands/train.js.map +1 -1
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +24 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.js +159 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/advanced-setup.d.ts +78 -0
- package/dist/lib/advanced-setup.d.ts.map +1 -0
- package/dist/lib/advanced-setup.js +433 -0
- package/dist/lib/advanced-setup.js.map +1 -0
- package/dist/lib/agent-config.d.ts +33 -0
- package/dist/lib/agent-config.d.ts.map +1 -1
- package/dist/lib/agent-config.js +26 -0
- package/dist/lib/agent-config.js.map +1 -1
- package/dist/lib/counterfactual-training-bridge.d.ts +114 -0
- package/dist/lib/counterfactual-training-bridge.d.ts.map +1 -0
- package/dist/lib/counterfactual-training-bridge.js +322 -0
- package/dist/lib/counterfactual-training-bridge.js.map +1 -0
- package/dist/lib/discovery-agent.d.ts +48 -0
- package/dist/lib/discovery-agent.d.ts.map +1 -0
- package/dist/lib/discovery-agent.js +111 -0
- package/dist/lib/discovery-agent.js.map +1 -0
- package/dist/lib/flow-engine.d.ts.map +1 -1
- package/dist/lib/flow-engine.js +46 -8
- package/dist/lib/flow-engine.js.map +1 -1
- package/dist/lib/gtm-generator.d.ts +29 -0
- package/dist/lib/gtm-generator.d.ts.map +1 -0
- package/dist/lib/gtm-generator.js +252 -0
- package/dist/lib/gtm-generator.js.map +1 -0
- package/dist/lib/hub-health.d.ts +40 -0
- package/dist/lib/hub-health.d.ts.map +1 -0
- package/dist/lib/hub-health.js +89 -0
- package/dist/lib/hub-health.js.map +1 -0
- package/dist/lib/invariant-monitor.d.ts +6 -2
- package/dist/lib/invariant-monitor.d.ts.map +1 -1
- package/dist/lib/invariant-monitor.js +89 -2
- package/dist/lib/invariant-monitor.js.map +1 -1
- package/dist/lib/journal-analyzer.d.ts +71 -0
- package/dist/lib/journal-analyzer.d.ts.map +1 -0
- package/dist/lib/journal-analyzer.js +306 -0
- package/dist/lib/journal-analyzer.js.map +1 -0
- package/dist/lib/linear-client.d.ts +73 -0
- package/dist/lib/linear-client.d.ts.map +1 -0
- package/dist/lib/linear-client.js +112 -0
- package/dist/lib/linear-client.js.map +1 -0
- package/dist/lib/linear-id-map.d.ts +20 -0
- package/dist/lib/linear-id-map.d.ts.map +1 -0
- package/dist/lib/linear-id-map.js +57 -0
- package/dist/lib/linear-id-map.js.map +1 -0
- package/dist/lib/linear-kanban.d.ts +66 -0
- package/dist/lib/linear-kanban.d.ts.map +1 -0
- package/dist/lib/linear-kanban.js +175 -0
- package/dist/lib/linear-kanban.js.map +1 -0
- package/dist/lib/onboarding.d.ts +40 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +213 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/physical-world-model.d.ts +50 -0
- package/dist/lib/physical-world-model.d.ts.map +1 -0
- package/dist/lib/physical-world-model.js +251 -0
- package/dist/lib/physical-world-model.js.map +1 -0
- package/dist/lib/planning-loop.d.ts +157 -0
- package/dist/lib/planning-loop.d.ts.map +1 -0
- package/dist/lib/planning-loop.js +537 -0
- package/dist/lib/planning-loop.js.map +1 -0
- package/dist/lib/policy-head.d.ts +13 -0
- package/dist/lib/policy-head.d.ts.map +1 -1
- package/dist/lib/policy-head.js +168 -2
- package/dist/lib/policy-head.js.map +1 -1
- package/dist/lib/resource-optimizer-middleware.d.ts +39 -0
- package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -0
- package/dist/lib/resource-optimizer-middleware.js +222 -0
- package/dist/lib/resource-optimizer-middleware.js.map +1 -0
- package/dist/lib/resource-optimizer.d.ts +71 -0
- package/dist/lib/resource-optimizer.d.ts.map +1 -0
- package/dist/lib/resource-optimizer.js +228 -0
- package/dist/lib/resource-optimizer.js.map +1 -0
- package/dist/lib/rl-manager.d.ts +74 -0
- package/dist/lib/rl-manager.d.ts.map +1 -0
- package/dist/lib/rl-manager.js +244 -0
- package/dist/lib/rl-manager.js.map +1 -0
- package/dist/lib/service-analyzer.d.ts +76 -0
- package/dist/lib/service-analyzer.d.ts.map +1 -0
- package/dist/lib/service-analyzer.js +704 -0
- package/dist/lib/service-analyzer.js.map +1 -0
- package/dist/lib/service-gtm.js +2 -2
- package/dist/lib/service-gtm.js.map +1 -1
- package/dist/lib/service-questionnaire.d.ts +11 -0
- package/dist/lib/service-questionnaire.d.ts.map +1 -0
- package/dist/lib/service-questionnaire.js +89 -0
- package/dist/lib/service-questionnaire.js.map +1 -0
- package/dist/lib/setup/agent-generator.d.ts +2 -0
- package/dist/lib/setup/agent-generator.d.ts.map +1 -1
- package/dist/lib/setup/agent-generator.js +128 -4
- package/dist/lib/setup/agent-generator.js.map +1 -1
- package/dist/lib/setup/flow-generator.d.ts +10 -0
- package/dist/lib/setup/flow-generator.d.ts.map +1 -0
- package/dist/lib/setup/flow-generator.js +113 -0
- package/dist/lib/setup/flow-generator.js.map +1 -0
- package/dist/lib/setup/invariant-bridge.d.ts +91 -0
- package/dist/lib/setup/invariant-bridge.d.ts.map +1 -0
- package/dist/lib/setup/invariant-bridge.js +384 -0
- package/dist/lib/setup/invariant-bridge.js.map +1 -0
- package/dist/lib/setup/spec-generator.d.ts +41 -5
- package/dist/lib/setup/spec-generator.d.ts.map +1 -1
- package/dist/lib/setup/spec-generator.js +503 -29
- package/dist/lib/setup/spec-generator.js.map +1 -1
- package/dist/lib/stratus-client.js +1 -1
- package/dist/lib/stratus-client.js.map +1 -1
- package/dist/lib/surface-agent.d.ts +78 -0
- package/dist/lib/surface-agent.d.ts.map +1 -0
- package/dist/lib/surface-agent.js +105 -0
- package/dist/lib/surface-agent.js.map +1 -0
- package/dist/lib/surface-coordination-example.d.ts +30 -0
- package/dist/lib/surface-coordination-example.d.ts.map +1 -0
- package/dist/lib/surface-coordination-example.js +164 -0
- package/dist/lib/surface-coordination-example.js.map +1 -0
- package/dist/lib/telemetry/physical-world-collector.d.ts +15 -0
- package/dist/lib/telemetry/physical-world-collector.d.ts.map +1 -0
- package/dist/lib/telemetry/physical-world-collector.js +177 -0
- package/dist/lib/telemetry/physical-world-collector.js.map +1 -0
- package/dist/lib/telemetry/training-bridge.d.ts +51 -0
- package/dist/lib/telemetry/training-bridge.d.ts.map +1 -0
- package/dist/lib/telemetry/training-bridge.js +185 -0
- package/dist/lib/telemetry/training-bridge.js.map +1 -0
- package/dist/lib/telemetry.d.ts +2 -1
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +23 -2
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/tenet-board-agent.d.ts +52 -0
- package/dist/lib/tenet-board-agent.d.ts.map +1 -0
- package/dist/lib/tenet-board-agent.js +226 -0
- package/dist/lib/tenet-board-agent.js.map +1 -0
- package/dist/lib/tenet-ide-agent.d.ts +40 -0
- package/dist/lib/tenet-ide-agent.d.ts.map +1 -0
- package/dist/lib/tenet-ide-agent.js +199 -0
- package/dist/lib/tenet-ide-agent.js.map +1 -0
- package/dist/lib/workspace/data-pipeline.d.ts.map +1 -1
- package/dist/lib/workspace/data-pipeline.js +27 -5
- package/dist/lib/workspace/data-pipeline.js.map +1 -1
- package/dist/lib/workspace/sidebar-runner.d.ts +13 -0
- package/dist/lib/workspace/sidebar-runner.d.ts.map +1 -0
- package/dist/lib/workspace/sidebar-runner.js +419 -0
- package/dist/lib/workspace/sidebar-runner.js.map +1 -0
- package/dist/lib/workspace/surface-registry.d.ts.map +1 -1
- package/dist/lib/workspace/surface-registry.js +4 -1
- package/dist/lib/workspace/surface-registry.js.map +1 -1
- package/dist/lib/workspace/surfaces/agent-overview.d.ts +3 -3
- package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -1
- package/dist/lib/workspace/surfaces/agent-overview.js +3 -3
- package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -1
- package/dist/lib/workspace/surfaces/index.d.ts +3 -0
- package/dist/lib/workspace/surfaces/index.d.ts.map +1 -1
- package/dist/lib/workspace/surfaces/index.js +3 -0
- package/dist/lib/workspace/surfaces/index.js.map +1 -1
- package/dist/lib/workspace/surfaces/kanban.d.ts +15 -0
- package/dist/lib/workspace/surfaces/kanban.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/kanban.js +43 -0
- package/dist/lib/workspace/surfaces/kanban.js.map +1 -0
- package/dist/lib/workspace/surfaces/physical-world.d.ts +15 -0
- package/dist/lib/workspace/surfaces/physical-world.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/physical-world.js +37 -0
- package/dist/lib/workspace/surfaces/physical-world.js.map +1 -0
- package/dist/lib/workspace/surfaces/sidebar.d.ts +22 -0
- package/dist/lib/workspace/surfaces/sidebar.d.ts.map +1 -0
- package/dist/lib/workspace/surfaces/sidebar.js +90 -0
- package/dist/lib/workspace/surfaces/sidebar.js.map +1 -0
- package/dist/types/flows.d.ts +2 -1
- package/dist/types/flows.d.ts.map +1 -1
- package/dist/types/physical-world-model.d.ts +65 -0
- package/dist/types/physical-world-model.d.ts.map +1 -0
- package/dist/types/physical-world-model.js +43 -0
- package/dist/types/physical-world-model.js.map +1 -0
- package/dist/types/telemetry.d.ts +37 -0
- package/dist/types/telemetry.d.ts.map +1 -1
- package/dist/types/world-model.d.ts.map +1 -1
- package/dist/types/world-model.js +14 -7
- package/dist/types/world-model.js.map +1 -1
- package/dist/utils/context-hub-port.d.ts.map +1 -1
- package/dist/utils/context-hub-port.js +6 -1
- package/dist/utils/context-hub-port.js.map +1 -1
- package/package.json +3 -2
- package/packages/pi/extensions/index.ts +34 -6
- package/scripts/telemetry-dashboard.sh +44 -0
- package/scripts/test-planning-loop-e2e.ts +181 -0
- package/scripts/test-server-inference.ts +49 -0
- package/scripts/test-state-sensitivity.ts +32 -0
- package/scripts/train/v2/benchmark.py +661 -0
- package/scripts/train/v2/generate_balanced.py +439 -0
- package/scripts/train/v2/generate_hard_negatives.py +219 -0
- package/scripts/train/v2/infer.py +149 -36
- package/scripts/train/v2/infer_server.py +224 -0
- package/scripts/train/v2/online_train.py +576 -0
- package/scripts/train/v2/precompute.py +24 -6
- package/template/CLAUDE.md +74 -132
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counterfactual Training Bridge
|
|
3
|
+
*
|
|
4
|
+
* Transforms CounterfactualScenario outputs into v2 training tuples
|
|
5
|
+
* and mixes them into the training buffer at Drew's recommended 70/30 ratio.
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Read stored counterfactuals from WorldModelStore
|
|
9
|
+
* 2. For each counterfactual, create a synthetic training tuple:
|
|
10
|
+
* - state = base transition's prior state
|
|
11
|
+
* - action = counterfactual's alternative action
|
|
12
|
+
* - reward = counterfactual's predicted outcome
|
|
13
|
+
* - source = "counterfactual" (tagged for 70/30 mix tracking)
|
|
14
|
+
* 3. Write to training buffer with counterfactual metadata
|
|
15
|
+
* 4. Optionally generate v2 format for direct PolicyHead training
|
|
16
|
+
*
|
|
17
|
+
* Drew's recommendation (section 8.2):
|
|
18
|
+
* - 70% real transitions + 30% synthetic counterfactuals in training batches
|
|
19
|
+
* - Counterfactuals provide: paths not taken, diverse scenarios, faster convergence
|
|
20
|
+
* - Weight real transitions higher than counterfactuals
|
|
21
|
+
*
|
|
22
|
+
* @purpose Bridge counterfactual scenarios to PolicyHead training data
|
|
23
|
+
* @spec knowledge/DREW-RESPONSE-ANSWERS.md
|
|
24
|
+
* @decision drew-counterfactual-training
|
|
25
|
+
*/
|
|
26
|
+
export interface CounterfactualBridgeConfig {
|
|
27
|
+
/** Target ratio of real to synthetic in training buffer (default: 0.3 = 30% synthetic) */
|
|
28
|
+
syntheticRatio: number;
|
|
29
|
+
/** Minimum probability mass to include a counterfactual (default: 0.2) */
|
|
30
|
+
minProbabilityMass: number;
|
|
31
|
+
/** Minimum confidence in counterfactual prediction (default: 0.3) */
|
|
32
|
+
minPredictionConfidence: number;
|
|
33
|
+
/** Whether to deduplicate against existing buffer entries (default: true) */
|
|
34
|
+
deduplicateAgainstBuffer: boolean;
|
|
35
|
+
/** Maximum synthetic entries to add per run (default: 500) */
|
|
36
|
+
maxSyntheticPerRun: number;
|
|
37
|
+
/** Whether to generate v2 format files for direct training (default: true) */
|
|
38
|
+
generateV2Format: boolean;
|
|
39
|
+
/** Output directory for v2 format data (default: .jfl/v2-data) */
|
|
40
|
+
v2OutputDir: string;
|
|
41
|
+
}
|
|
42
|
+
export interface BridgeResult {
|
|
43
|
+
/** Total counterfactuals processed */
|
|
44
|
+
counterfactualsProcessed: number;
|
|
45
|
+
/** Counterfactuals that passed quality filters */
|
|
46
|
+
passedFilters: number;
|
|
47
|
+
/** New tuples added to training buffer */
|
|
48
|
+
tuplesAdded: number;
|
|
49
|
+
/** Tuples skipped (duplicates) */
|
|
50
|
+
duplicatesSkipped: number;
|
|
51
|
+
/** Current buffer composition */
|
|
52
|
+
bufferComposition: {
|
|
53
|
+
totalEntries: number;
|
|
54
|
+
realEntries: number;
|
|
55
|
+
syntheticEntries: number;
|
|
56
|
+
syntheticRatio: number;
|
|
57
|
+
targetRatio: number;
|
|
58
|
+
};
|
|
59
|
+
/** V2 format files generated (if enabled) */
|
|
60
|
+
v2FilesGenerated: string[];
|
|
61
|
+
}
|
|
62
|
+
export declare class CounterfactualTrainingBridge {
|
|
63
|
+
private store;
|
|
64
|
+
private trainingBuffer;
|
|
65
|
+
private config;
|
|
66
|
+
private projectRoot;
|
|
67
|
+
constructor(projectRoot?: string, config?: Partial<CounterfactualBridgeConfig>);
|
|
68
|
+
/**
|
|
69
|
+
* Main pipeline: read counterfactuals → filter → transform → write to buffer
|
|
70
|
+
*
|
|
71
|
+
* @param since - Only process counterfactuals generated after this timestamp
|
|
72
|
+
* @returns Summary of what was processed
|
|
73
|
+
*/
|
|
74
|
+
run(since?: number): Promise<BridgeResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Transform a counterfactual scenario into a training buffer entry
|
|
77
|
+
*/
|
|
78
|
+
private counterfactualToTuple;
|
|
79
|
+
/**
|
|
80
|
+
* Score a synthetic tuple for quality/priority ranking
|
|
81
|
+
* Higher = better quality, more informative for training
|
|
82
|
+
*/
|
|
83
|
+
private scoreSyntheticTuple;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a training buffer entry is synthetic (counterfactual-derived)
|
|
86
|
+
*/
|
|
87
|
+
private isSynthetic;
|
|
88
|
+
/**
|
|
89
|
+
* Generate v2 format data file for direct PolicyHead training
|
|
90
|
+
* Outputs JSONL with {current_state, goal, correct_tool, source} format
|
|
91
|
+
*/
|
|
92
|
+
private generateV2Data;
|
|
93
|
+
/**
|
|
94
|
+
* Format RLState as text for v2 training format (matches transform_buffer.py)
|
|
95
|
+
*/
|
|
96
|
+
private formatStateForV2;
|
|
97
|
+
/**
|
|
98
|
+
* Derive a goal string from a training tuple
|
|
99
|
+
*/
|
|
100
|
+
private deriveGoal;
|
|
101
|
+
/**
|
|
102
|
+
* Get current buffer composition stats
|
|
103
|
+
*/
|
|
104
|
+
getBufferStats(): {
|
|
105
|
+
total: number;
|
|
106
|
+
real: number;
|
|
107
|
+
synthetic: number;
|
|
108
|
+
ratio: number;
|
|
109
|
+
targetRatio: number;
|
|
110
|
+
needsMore: boolean;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export declare function createCounterfactualBridge(projectRoot?: string, config?: Partial<CounterfactualBridgeConfig>): CounterfactualTrainingBridge;
|
|
114
|
+
//# sourceMappingURL=counterfactual-training-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counterfactual-training-bridge.d.ts","sourceRoot":"","sources":["../../src/lib/counterfactual-training-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAoBH,MAAM,WAAW,0BAA0B;IACzC,0FAA0F;IAC1F,cAAc,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,kBAAkB,EAAE,MAAM,CAAA;IAC1B,qEAAqE;IACrE,uBAAuB,EAAE,MAAM,CAAA;IAC/B,6EAA6E;IAC7E,wBAAwB,EAAE,OAAO,CAAA;IACjC,8DAA8D;IAC9D,kBAAkB,EAAE,MAAM,CAAA;IAC1B,8EAA8E;IAC9E,gBAAgB,EAAE,OAAO,CAAA;IACzB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAA;CACpB;AAgBD,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,wBAAwB,EAAE,MAAM,CAAA;IAChC,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,iBAAiB,EAAE,MAAM,CAAA;IACzB,iCAAiC;IACjC,iBAAiB,EAAE;QACjB,YAAY,EAAE,MAAM,CAAA;QACpB,WAAW,EAAE,MAAM,CAAA;QACnB,gBAAgB,EAAE,MAAM,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC3B;AAyBD,qBAAa,4BAA4B;IACvC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAQ;gBAEf,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAO9E;;;;;OAKG;IACG,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAyGhD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAqC7B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;OAGG;YACW,cAAc;IAkC5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,cAAc,IAAI;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,OAAO,CAAA;KACnB;CAeF;AAMD,wBAAgB,0BAA0B,CACxC,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,4BAA4B,CAE9B"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counterfactual Training Bridge
|
|
3
|
+
*
|
|
4
|
+
* Transforms CounterfactualScenario outputs into v2 training tuples
|
|
5
|
+
* and mixes them into the training buffer at Drew's recommended 70/30 ratio.
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Read stored counterfactuals from WorldModelStore
|
|
9
|
+
* 2. For each counterfactual, create a synthetic training tuple:
|
|
10
|
+
* - state = base transition's prior state
|
|
11
|
+
* - action = counterfactual's alternative action
|
|
12
|
+
* - reward = counterfactual's predicted outcome
|
|
13
|
+
* - source = "counterfactual" (tagged for 70/30 mix tracking)
|
|
14
|
+
* 3. Write to training buffer with counterfactual metadata
|
|
15
|
+
* 4. Optionally generate v2 format for direct PolicyHead training
|
|
16
|
+
*
|
|
17
|
+
* Drew's recommendation (section 8.2):
|
|
18
|
+
* - 70% real transitions + 30% synthetic counterfactuals in training batches
|
|
19
|
+
* - Counterfactuals provide: paths not taken, diverse scenarios, faster convergence
|
|
20
|
+
* - Weight real transitions higher than counterfactuals
|
|
21
|
+
*
|
|
22
|
+
* @purpose Bridge counterfactual scenarios to PolicyHead training data
|
|
23
|
+
* @spec knowledge/DREW-RESPONSE-ANSWERS.md
|
|
24
|
+
* @decision drew-counterfactual-training
|
|
25
|
+
*/
|
|
26
|
+
import { writeFileSync, mkdirSync } from "fs";
|
|
27
|
+
import { join } from "path";
|
|
28
|
+
import { worldStateToRLState, agentActionToRLAction } from "../types/world-model.js";
|
|
29
|
+
import { WorldModelStore } from "./world-model-store.js";
|
|
30
|
+
import { TrainingBuffer } from "./training-buffer.js";
|
|
31
|
+
const DEFAULT_CONFIG = {
|
|
32
|
+
syntheticRatio: 0.3,
|
|
33
|
+
minProbabilityMass: 0.2,
|
|
34
|
+
minPredictionConfidence: 0.3,
|
|
35
|
+
deduplicateAgainstBuffer: true,
|
|
36
|
+
maxSyntheticPerRun: 500,
|
|
37
|
+
generateV2Format: true,
|
|
38
|
+
v2OutputDir: ".jfl/v2-data",
|
|
39
|
+
};
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Action Type Mapping (matches domain.json + transform_buffer.py)
|
|
42
|
+
// ============================================================================
|
|
43
|
+
const AGENT_ACTION_TO_TOOL = {
|
|
44
|
+
"fix": "fix_bug",
|
|
45
|
+
"refactor": "refactor_code",
|
|
46
|
+
"feature": "add_feature",
|
|
47
|
+
"test": "add_tests",
|
|
48
|
+
"config": "update_config",
|
|
49
|
+
"experiment": "run_experiment",
|
|
50
|
+
"eval": "run_eval",
|
|
51
|
+
"autoresearch": "run_experiment",
|
|
52
|
+
"research": "Read",
|
|
53
|
+
"skip": "skip",
|
|
54
|
+
"commit": "update_config",
|
|
55
|
+
"scheduled": "run_experiment",
|
|
56
|
+
};
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Counterfactual Training Bridge
|
|
59
|
+
// ============================================================================
|
|
60
|
+
export class CounterfactualTrainingBridge {
|
|
61
|
+
store;
|
|
62
|
+
trainingBuffer;
|
|
63
|
+
config;
|
|
64
|
+
projectRoot;
|
|
65
|
+
constructor(projectRoot, config) {
|
|
66
|
+
this.projectRoot = projectRoot || process.cwd();
|
|
67
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
68
|
+
this.store = new WorldModelStore(this.projectRoot);
|
|
69
|
+
this.trainingBuffer = new TrainingBuffer(this.projectRoot);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Main pipeline: read counterfactuals → filter → transform → write to buffer
|
|
73
|
+
*
|
|
74
|
+
* @param since - Only process counterfactuals generated after this timestamp
|
|
75
|
+
* @returns Summary of what was processed
|
|
76
|
+
*/
|
|
77
|
+
async run(since) {
|
|
78
|
+
// Step 1: Read all counterfactuals
|
|
79
|
+
const allCounterfactuals = this.store.getAllCounterfactuals();
|
|
80
|
+
const counterfactuals = since
|
|
81
|
+
? allCounterfactuals.filter(cf => cf.generatedAt > since)
|
|
82
|
+
: allCounterfactuals;
|
|
83
|
+
// Step 2: Get current buffer composition for ratio targeting
|
|
84
|
+
const existingBuffer = this.trainingBuffer.read();
|
|
85
|
+
const realEntries = existingBuffer.filter(e => e.metadata.source !== "mined" || !this.isSynthetic(e));
|
|
86
|
+
const syntheticEntries = existingBuffer.filter(e => this.isSynthetic(e));
|
|
87
|
+
const existingIds = new Set(existingBuffer.map(e => e.id));
|
|
88
|
+
// Calculate how many synthetic entries we need to hit target ratio
|
|
89
|
+
const currentTotal = existingBuffer.length;
|
|
90
|
+
const targetSynthetic = Math.floor(currentTotal * this.config.syntheticRatio / (1 - this.config.syntheticRatio));
|
|
91
|
+
const syntheticDeficit = Math.max(0, targetSynthetic - syntheticEntries.length);
|
|
92
|
+
// Step 3: Filter counterfactuals by quality
|
|
93
|
+
const qualityFiltered = counterfactuals.filter(cf => cf.probabilityMass >= this.config.minProbabilityMass);
|
|
94
|
+
// Step 4: Get base transitions for context
|
|
95
|
+
const transitionMap = new Map();
|
|
96
|
+
const transitions = this.store.getTransitions({ limit: 10000 });
|
|
97
|
+
for (const t of transitions) {
|
|
98
|
+
transitionMap.set(t.id, t);
|
|
99
|
+
}
|
|
100
|
+
// Step 5: Transform counterfactuals into training tuples
|
|
101
|
+
const syntheticTuples = [];
|
|
102
|
+
for (const cf of qualityFiltered) {
|
|
103
|
+
const baseTransition = transitionMap.get(cf.baseTransitionId);
|
|
104
|
+
if (!baseTransition)
|
|
105
|
+
continue;
|
|
106
|
+
const tuple = this.counterfactualToTuple(cf, baseTransition);
|
|
107
|
+
if (!tuple)
|
|
108
|
+
continue;
|
|
109
|
+
// Score for prioritization (higher = better quality)
|
|
110
|
+
const score = this.scoreSyntheticTuple(cf, baseTransition);
|
|
111
|
+
syntheticTuples.push({ tuple, score });
|
|
112
|
+
}
|
|
113
|
+
// Step 6: Rank by quality and cap at limits
|
|
114
|
+
syntheticTuples.sort((a, b) => b.score - a.score);
|
|
115
|
+
const maxToAdd = Math.min(syntheticTuples.length, this.config.maxSyntheticPerRun, syntheticDeficit > 0 ? syntheticDeficit : this.config.maxSyntheticPerRun);
|
|
116
|
+
// Step 7: Write to training buffer
|
|
117
|
+
let added = 0;
|
|
118
|
+
let duplicates = 0;
|
|
119
|
+
for (let i = 0; i < maxToAdd; i++) {
|
|
120
|
+
const { tuple } = syntheticTuples[i];
|
|
121
|
+
// Deduplication check
|
|
122
|
+
if (this.config.deduplicateAgainstBuffer) {
|
|
123
|
+
const candidateId = `tb_cf_${cf_hash(tuple)}`;
|
|
124
|
+
if (existingIds.has(candidateId)) {
|
|
125
|
+
duplicates++;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
this.trainingBuffer.append(tuple);
|
|
130
|
+
added++;
|
|
131
|
+
}
|
|
132
|
+
// Step 8: Generate v2 format if enabled
|
|
133
|
+
const v2Files = [];
|
|
134
|
+
if (this.config.generateV2Format && added > 0) {
|
|
135
|
+
const v2Path = await this.generateV2Data(syntheticTuples.slice(0, maxToAdd).map(s => s.tuple));
|
|
136
|
+
if (v2Path)
|
|
137
|
+
v2Files.push(v2Path);
|
|
138
|
+
}
|
|
139
|
+
// Step 9: Compute final buffer composition
|
|
140
|
+
const finalBuffer = this.trainingBuffer.read();
|
|
141
|
+
const finalReal = finalBuffer.filter(e => !this.isSynthetic(e));
|
|
142
|
+
const finalSynthetic = finalBuffer.filter(e => this.isSynthetic(e));
|
|
143
|
+
return {
|
|
144
|
+
counterfactualsProcessed: counterfactuals.length,
|
|
145
|
+
passedFilters: qualityFiltered.length,
|
|
146
|
+
tuplesAdded: added,
|
|
147
|
+
duplicatesSkipped: duplicates,
|
|
148
|
+
bufferComposition: {
|
|
149
|
+
totalEntries: finalBuffer.length,
|
|
150
|
+
realEntries: finalReal.length,
|
|
151
|
+
syntheticEntries: finalSynthetic.length,
|
|
152
|
+
syntheticRatio: finalBuffer.length > 0 ? finalSynthetic.length / finalBuffer.length : 0,
|
|
153
|
+
targetRatio: this.config.syntheticRatio,
|
|
154
|
+
},
|
|
155
|
+
v2FilesGenerated: v2Files,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Transform a counterfactual scenario into a training buffer entry
|
|
160
|
+
*/
|
|
161
|
+
counterfactualToTuple(cf, baseTransition) {
|
|
162
|
+
const rlState = worldStateToRLState(baseTransition.priorState);
|
|
163
|
+
const rlAction = agentActionToRLAction(cf.alternativeAction);
|
|
164
|
+
// Compute reward from counterfactual predicted outcome
|
|
165
|
+
const predictedDelta = cf.predictedOutcome.immediate.evalScoreChange ?? 0;
|
|
166
|
+
const actualDelta = baseTransition.outcome.immediate.evalScoreChange ?? 0;
|
|
167
|
+
// The counterfactual tells us: "if you'd done X instead of Y, the outcome would be Z"
|
|
168
|
+
// For training: the action is X, the reward signal is the predicted delta
|
|
169
|
+
const improved = predictedDelta > actualDelta;
|
|
170
|
+
return {
|
|
171
|
+
agent: cf.alternativeAction.agentId,
|
|
172
|
+
state: rlState,
|
|
173
|
+
action: rlAction,
|
|
174
|
+
reward: {
|
|
175
|
+
composite_delta: predictedDelta,
|
|
176
|
+
dimension_deltas: {},
|
|
177
|
+
tests_added: 0,
|
|
178
|
+
quality_score: improved ? 1 : 0,
|
|
179
|
+
improved,
|
|
180
|
+
prediction_error: undefined,
|
|
181
|
+
},
|
|
182
|
+
metadata: {
|
|
183
|
+
branch: "counterfactual",
|
|
184
|
+
source: "mined", // Use "mined" since TrainingBufferEntry requires specific sources
|
|
185
|
+
mine_source: "counterfactual_engine",
|
|
186
|
+
prediction_id: cf.baseTransitionId,
|
|
187
|
+
hypothesis: `Counterfactual ${cf.counterfactualType}: ${cf.alternativeAction.actionType} instead of original (prob=${cf.probabilityMass.toFixed(2)})`,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Score a synthetic tuple for quality/priority ranking
|
|
193
|
+
* Higher = better quality, more informative for training
|
|
194
|
+
*/
|
|
195
|
+
scoreSyntheticTuple(cf, baseTransition) {
|
|
196
|
+
let score = 0;
|
|
197
|
+
// Higher probability mass = more confident prediction
|
|
198
|
+
score += cf.probabilityMass * 3;
|
|
199
|
+
// Larger difference from actual outcome = more informative
|
|
200
|
+
const actualDelta = baseTransition.outcome.immediate.evalScoreChange ?? 0;
|
|
201
|
+
const cfDelta = cf.predictedOutcome.immediate.evalScoreChange ?? 0;
|
|
202
|
+
const deltaGap = Math.abs(cfDelta - actualDelta);
|
|
203
|
+
score += Math.min(deltaGap * 10, 3); // Cap at 3
|
|
204
|
+
// Action type diversity bonus
|
|
205
|
+
if (cf.alternativeAction.actionType !== baseTransition.action.actionType) {
|
|
206
|
+
score += 1;
|
|
207
|
+
}
|
|
208
|
+
// Agent diversity bonus (scheduling counterfactuals)
|
|
209
|
+
if (cf.alternativeAction.agentId !== baseTransition.action.agentId) {
|
|
210
|
+
score += 0.5;
|
|
211
|
+
}
|
|
212
|
+
// Baseline (skip) counterfactuals are always valuable
|
|
213
|
+
if (cf.counterfactualType === "baseline") {
|
|
214
|
+
score += 1;
|
|
215
|
+
}
|
|
216
|
+
// Penalize very low probability mass
|
|
217
|
+
if (cf.probabilityMass < 0.3) {
|
|
218
|
+
score -= 1;
|
|
219
|
+
}
|
|
220
|
+
return score;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if a training buffer entry is synthetic (counterfactual-derived)
|
|
224
|
+
*/
|
|
225
|
+
isSynthetic(entry) {
|
|
226
|
+
return (entry.metadata.mine_source === "counterfactual_engine" ||
|
|
227
|
+
entry.metadata.branch === "counterfactual" ||
|
|
228
|
+
entry.metadata.hypothesis?.includes("Counterfactual") === true);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Generate v2 format data file for direct PolicyHead training
|
|
232
|
+
* Outputs JSONL with {current_state, goal, correct_tool, source} format
|
|
233
|
+
*/
|
|
234
|
+
async generateV2Data(tuples) {
|
|
235
|
+
if (tuples.length === 0)
|
|
236
|
+
return null;
|
|
237
|
+
const outputDir = join(this.projectRoot, this.config.v2OutputDir);
|
|
238
|
+
mkdirSync(outputDir, { recursive: true });
|
|
239
|
+
const outputPath = join(outputDir, "counterfactual.jsonl");
|
|
240
|
+
// Transform to v2 format
|
|
241
|
+
const v2Lines = [];
|
|
242
|
+
for (const tuple of tuples) {
|
|
243
|
+
const toolName = AGENT_ACTION_TO_TOOL[tuple.action.type] || "run_experiment";
|
|
244
|
+
const v2Entry = {
|
|
245
|
+
current_state: this.formatStateForV2(tuple.state),
|
|
246
|
+
goal: this.deriveGoal(tuple),
|
|
247
|
+
correct_tool: toolName,
|
|
248
|
+
source: "counterfactual",
|
|
249
|
+
agent: tuple.agent,
|
|
250
|
+
improved: tuple.reward.improved,
|
|
251
|
+
reward_delta: tuple.reward.composite_delta,
|
|
252
|
+
counterfactual_type: tuple.metadata.hypothesis?.match(/Counterfactual (\w+)/)?.[1] || "unknown",
|
|
253
|
+
probability_mass: parseFloat(tuple.metadata.hypothesis?.match(/prob=([\d.]+)/)?.[1] || "0"),
|
|
254
|
+
};
|
|
255
|
+
v2Lines.push(JSON.stringify(v2Entry));
|
|
256
|
+
}
|
|
257
|
+
writeFileSync(outputPath, v2Lines.join("\n") + "\n");
|
|
258
|
+
return outputPath;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Format RLState as text for v2 training format (matches transform_buffer.py)
|
|
262
|
+
*/
|
|
263
|
+
formatStateForV2(state) {
|
|
264
|
+
const dims = state.dimension_scores;
|
|
265
|
+
const dimsStr = Object.entries(dims)
|
|
266
|
+
.map(([k, v]) => `${k}=${v.toFixed(4)}`)
|
|
267
|
+
.join(", ") || "none";
|
|
268
|
+
const deltasStr = state.recent_deltas
|
|
269
|
+
.map(d => `${d >= 0 ? "+" : ""}${d.toFixed(4)}`)
|
|
270
|
+
.join(", ") || "none";
|
|
271
|
+
return [
|
|
272
|
+
`Agent: ${state.agent}`,
|
|
273
|
+
`Composite: ${state.composite_score.toFixed(4)}`,
|
|
274
|
+
`Tests: ${state.tests_passing}/${state.tests_total}`,
|
|
275
|
+
`Trajectory: ${state.trajectory_length}`,
|
|
276
|
+
`Dimensions: ${dimsStr}`,
|
|
277
|
+
`Recent deltas: ${deltasStr}`,
|
|
278
|
+
].join("\n");
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Derive a goal string from a training tuple
|
|
282
|
+
*/
|
|
283
|
+
deriveGoal(tuple) {
|
|
284
|
+
const actionDesc = tuple.action.description;
|
|
285
|
+
if (actionDesc && actionDesc.length > 10) {
|
|
286
|
+
return actionDesc.slice(0, 200);
|
|
287
|
+
}
|
|
288
|
+
return `Improve codebase quality via ${tuple.action.type}`;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Get current buffer composition stats
|
|
292
|
+
*/
|
|
293
|
+
getBufferStats() {
|
|
294
|
+
const buffer = this.trainingBuffer.read();
|
|
295
|
+
const synthetic = buffer.filter(e => this.isSynthetic(e));
|
|
296
|
+
const real = buffer.filter(e => !this.isSynthetic(e));
|
|
297
|
+
const ratio = buffer.length > 0 ? synthetic.length / buffer.length : 0;
|
|
298
|
+
return {
|
|
299
|
+
total: buffer.length,
|
|
300
|
+
real: real.length,
|
|
301
|
+
synthetic: synthetic.length,
|
|
302
|
+
ratio,
|
|
303
|
+
targetRatio: this.config.syntheticRatio,
|
|
304
|
+
needsMore: ratio < this.config.syntheticRatio,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// Factory
|
|
310
|
+
// ============================================================================
|
|
311
|
+
export function createCounterfactualBridge(projectRoot, config) {
|
|
312
|
+
return new CounterfactualTrainingBridge(projectRoot, config);
|
|
313
|
+
}
|
|
314
|
+
// ============================================================================
|
|
315
|
+
// Helpers
|
|
316
|
+
// ============================================================================
|
|
317
|
+
function cf_hash(tuple) {
|
|
318
|
+
const { createHash } = require("crypto");
|
|
319
|
+
const key = `cf-${tuple.agent}-${tuple.action.type}-${tuple.action.description.slice(0, 50)}-${tuple.reward.composite_delta}`;
|
|
320
|
+
return createHash("sha256").update(key).digest("hex").slice(0, 12);
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=counterfactual-training-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counterfactual-training-bridge.js","sourceRoot":"","sources":["../../src/lib/counterfactual-training-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Discovery Agent - Manages progressive feature disclosure in Tenet IDE
|
|
3
|
+
*
|
|
4
|
+
* This agent decides when and how to reveal advanced capabilities to users.
|
|
5
|
+
* Goal: Gradually introduce powerful features without overwhelming users.
|
|
6
|
+
*/
|
|
7
|
+
export interface UserEngagement {
|
|
8
|
+
sessionsCount: number;
|
|
9
|
+
totalTimeMinutes: number;
|
|
10
|
+
featuresUsed: string[];
|
|
11
|
+
positiveSignals: string[];
|
|
12
|
+
confusionSignals: string[];
|
|
13
|
+
lastSeen: Date;
|
|
14
|
+
installDate: Date;
|
|
15
|
+
}
|
|
16
|
+
export interface FeatureReveal {
|
|
17
|
+
feature: string;
|
|
18
|
+
trigger: 'time_based' | 'usage_based' | 'engagement_based';
|
|
19
|
+
message: string;
|
|
20
|
+
subtitle?: string;
|
|
21
|
+
demoCommand?: string;
|
|
22
|
+
urgency: 'low' | 'normal' | 'high';
|
|
23
|
+
}
|
|
24
|
+
export declare class DiscoveryAgent {
|
|
25
|
+
private engagement;
|
|
26
|
+
constructor(engagement: UserEngagement);
|
|
27
|
+
/**
|
|
28
|
+
* Decide what feature to reveal next based on user readiness
|
|
29
|
+
*/
|
|
30
|
+
decideNextReveal(): FeatureReveal | null;
|
|
31
|
+
/**
|
|
32
|
+
* Adjust revelation timeline based on user response
|
|
33
|
+
*/
|
|
34
|
+
adjustTimeline(feature: string, response: 'positive' | 'negative' | 'confused'): void;
|
|
35
|
+
/**
|
|
36
|
+
* Check if user has been introduced to a feature
|
|
37
|
+
*/
|
|
38
|
+
private hasSeenFeature;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate days since a date
|
|
41
|
+
*/
|
|
42
|
+
private daysSince;
|
|
43
|
+
/**
|
|
44
|
+
* User archetype detection for timeline customization
|
|
45
|
+
*/
|
|
46
|
+
getUserArchetype(): 'power_user' | 'casual' | 'enterprise' | 'beginner';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=discovery-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-agent.d.ts","sourceRoot":"","sources":["../../src/lib/discovery-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,QAAQ,EAAE,IAAI,CAAA;IACd,WAAW,EAAE,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,YAAY,GAAG,aAAa,GAAG,kBAAkB,CAAA;IAC1D,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;CACnC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAgB;gBAEtB,UAAU,EAAE,cAAc;IAItC;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAkExC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI;IAQrF;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,gBAAgB,IAAI,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU;CAQxE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @purpose Discovery Agent - Manages progressive feature disclosure in Tenet IDE
|
|
3
|
+
*
|
|
4
|
+
* This agent decides when and how to reveal advanced capabilities to users.
|
|
5
|
+
* Goal: Gradually introduce powerful features without overwhelming users.
|
|
6
|
+
*/
|
|
7
|
+
export class DiscoveryAgent {
|
|
8
|
+
engagement;
|
|
9
|
+
constructor(engagement) {
|
|
10
|
+
this.engagement = engagement;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Decide what feature to reveal next based on user readiness
|
|
14
|
+
*/
|
|
15
|
+
decideNextReveal() {
|
|
16
|
+
const daysSinceInstall = this.daysSince(this.engagement.installDate);
|
|
17
|
+
const sessionCount = this.engagement.sessionsCount;
|
|
18
|
+
const isEngaged = this.engagement.positiveSignals.length > this.engagement.confusionSignals.length;
|
|
19
|
+
// Week 1: Basic automation hints
|
|
20
|
+
if (daysSinceInstall >= 1 && daysSinceInstall < 7 && sessionCount >= 3) {
|
|
21
|
+
return {
|
|
22
|
+
feature: 'automation_hints',
|
|
23
|
+
trigger: 'time_based',
|
|
24
|
+
message: 'I noticed some patterns in your workflow...',
|
|
25
|
+
subtitle: 'Want me to automate these repeated tasks?',
|
|
26
|
+
urgency: 'normal'
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Week 2: Show automation opportunities
|
|
30
|
+
if (daysSinceInstall >= 7 && isEngaged && !this.hasSeenFeature('automation_hints')) {
|
|
31
|
+
return {
|
|
32
|
+
feature: 'automation_hints',
|
|
33
|
+
trigger: 'engagement_based',
|
|
34
|
+
message: 'I\'ve been analyzing your workflow patterns...',
|
|
35
|
+
subtitle: 'Want to set up automated testing and optimization?',
|
|
36
|
+
demoCommand: 'tenet setup --advanced',
|
|
37
|
+
urgency: 'normal'
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Week 3: Show self-driving capabilities
|
|
41
|
+
if (daysSinceInstall >= 14 && isEngaged && !this.hasSeenFeature('self_driving')) {
|
|
42
|
+
return {
|
|
43
|
+
feature: 'self_driving',
|
|
44
|
+
trigger: 'engagement_based',
|
|
45
|
+
message: 'Your project has active AI assistants working',
|
|
46
|
+
subtitle: 'Check the Project Automation panel to see what they\'re doing',
|
|
47
|
+
demoCommand: 'tenet ide add agents',
|
|
48
|
+
urgency: 'normal'
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Month 1: Advanced platform revelation
|
|
52
|
+
if (daysSinceInstall >= 21 && isEngaged && !this.hasSeenFeature('advanced_reveal')) {
|
|
53
|
+
return {
|
|
54
|
+
feature: 'advanced_reveal',
|
|
55
|
+
trigger: 'time_based',
|
|
56
|
+
message: 'Ready for the full intelligent development platform?',
|
|
57
|
+
subtitle: 'TLA+ verification, RL optimization, and CI automation await...',
|
|
58
|
+
demoCommand: 'tenet setup --full',
|
|
59
|
+
urgency: 'high'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Month 2: Full revelation - you have an agentic platform
|
|
63
|
+
if (daysSinceInstall >= 30 && isEngaged && !this.hasSeenFeature('full_reveal')) {
|
|
64
|
+
return {
|
|
65
|
+
feature: 'full_reveal',
|
|
66
|
+
trigger: 'time_based',
|
|
67
|
+
message: 'You\'ve been using an agentic platform this whole time',
|
|
68
|
+
subtitle: 'Here\'s how the AI agents have been learning your workflow...',
|
|
69
|
+
urgency: 'high'
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Adjust revelation timeline based on user response
|
|
76
|
+
*/
|
|
77
|
+
adjustTimeline(feature, response) {
|
|
78
|
+
if (response === 'positive') {
|
|
79
|
+
this.engagement.positiveSignals.push(`feature_${feature}_accepted`);
|
|
80
|
+
}
|
|
81
|
+
else if (response === 'confused') {
|
|
82
|
+
this.engagement.confusionSignals.push(`feature_${feature}_rejected`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if user has been introduced to a feature
|
|
87
|
+
*/
|
|
88
|
+
hasSeenFeature(feature) {
|
|
89
|
+
return this.engagement.featuresUsed.includes(feature);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Calculate days since a date
|
|
93
|
+
*/
|
|
94
|
+
daysSince(date) {
|
|
95
|
+
return Math.floor((Date.now() - date.getTime()) / (1000 * 60 * 60 * 24));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* User archetype detection for timeline customization
|
|
99
|
+
*/
|
|
100
|
+
getUserArchetype() {
|
|
101
|
+
const { sessionsCount, totalTimeMinutes, featuresUsed } = this.engagement;
|
|
102
|
+
if (sessionsCount > 20 && featuresUsed.length > 8)
|
|
103
|
+
return 'power_user';
|
|
104
|
+
if (totalTimeMinutes > 300 && featuresUsed.includes('portfolio'))
|
|
105
|
+
return 'enterprise';
|
|
106
|
+
if (sessionsCount < 5 && totalTimeMinutes < 60)
|
|
107
|
+
return 'beginner';
|
|
108
|
+
return 'casual';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=discovery-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-agent.js","sourceRoot":"","sources":["../../src/lib/discovery-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-engine.d.ts","sourceRoot":"","sources":["../../src/lib/flow-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAA2B,aAAa,EAAY,MAAM,mBAAmB,CAAA;AAGzG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,YAAY,CAA2E;IAC/F,OAAO,CAAC,aAAa,CAA4B;gBAErC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM;IAKtD,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAIrC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAuB9B,IAAI,IAAI,IAAI;IAeZ,QAAQ,IAAI,cAAc,EAAE;IAI5B,aAAa,IAAI,aAAa,EAAE;IAIhC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI;IA2B5D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAsD3F,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,iBAAiB;YAQX,gBAAgB;IAkD9B,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"flow-engine.d.ts","sourceRoot":"","sources":["../../src/lib/flow-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAA2B,aAAa,EAAY,MAAM,mBAAmB,CAAA;AAGzG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,YAAY,CAA2E;IAC/F,OAAO,CAAC,aAAa,CAA4B;gBAErC,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM;IAKtD,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAIrC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAuB9B,IAAI,IAAI,IAAI;IAeZ,QAAQ,IAAI,cAAc,EAAE;IAI5B,aAAa,IAAI,aAAa,EAAE;IAIhC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI;IA2B5D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAsD3F,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,iBAAiB;YAQX,gBAAgB;IAkD9B,OAAO,CAAC,SAAS;YA8EH,WAAW;YA6GX,aAAa;IAmM3B,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,YAAY;IA+BpB,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrF,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,iBAAiB;IA0BzB,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAOhF"}
|