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.
Files changed (247) hide show
  1. package/dist/commands/doctor.d.ts +1 -0
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +30 -1
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/ide.d.ts +2 -1
  6. package/dist/commands/ide.d.ts.map +1 -1
  7. package/dist/commands/ide.js +60 -1
  8. package/dist/commands/ide.js.map +1 -1
  9. package/dist/commands/init-from-service.d.ts +15 -0
  10. package/dist/commands/init-from-service.d.ts.map +1 -0
  11. package/dist/commands/init-from-service.js +541 -0
  12. package/dist/commands/init-from-service.js.map +1 -0
  13. package/dist/commands/init.d.ts +1 -0
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +32 -1
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/kanban.d.ts.map +1 -1
  18. package/dist/commands/kanban.js +13 -4
  19. package/dist/commands/kanban.js.map +1 -1
  20. package/dist/commands/linear.d.ts +41 -0
  21. package/dist/commands/linear.d.ts.map +1 -0
  22. package/dist/commands/linear.js +715 -0
  23. package/dist/commands/linear.js.map +1 -0
  24. package/dist/commands/peter.d.ts.map +1 -1
  25. package/dist/commands/peter.js +232 -25
  26. package/dist/commands/peter.js.map +1 -1
  27. package/dist/commands/services.d.ts.map +1 -1
  28. package/dist/commands/services.js +146 -0
  29. package/dist/commands/services.js.map +1 -1
  30. package/dist/commands/setup.d.ts.map +1 -1
  31. package/dist/commands/setup.js +173 -13
  32. package/dist/commands/setup.js.map +1 -1
  33. package/dist/commands/telemetry-monitor.d.ts +11 -0
  34. package/dist/commands/telemetry-monitor.d.ts.map +1 -0
  35. package/dist/commands/telemetry-monitor.js +224 -0
  36. package/dist/commands/telemetry-monitor.js.map +1 -0
  37. package/dist/commands/telemetry-test.d.ts +11 -0
  38. package/dist/commands/telemetry-test.d.ts.map +1 -0
  39. package/dist/commands/telemetry-test.js +67 -0
  40. package/dist/commands/telemetry-test.js.map +1 -0
  41. package/dist/commands/tenet-agents.d.ts +13 -0
  42. package/dist/commands/tenet-agents.d.ts.map +1 -0
  43. package/dist/commands/tenet-agents.js +191 -0
  44. package/dist/commands/tenet-agents.js.map +1 -0
  45. package/dist/commands/tenet-setup.d.ts +19 -0
  46. package/dist/commands/tenet-setup.d.ts.map +1 -0
  47. package/dist/commands/tenet-setup.js +131 -0
  48. package/dist/commands/tenet-setup.js.map +1 -0
  49. package/dist/commands/train.d.ts +18 -0
  50. package/dist/commands/train.d.ts.map +1 -1
  51. package/dist/commands/train.js +182 -0
  52. package/dist/commands/train.js.map +1 -1
  53. package/dist/commands/whoami.d.ts +2 -0
  54. package/dist/commands/whoami.d.ts.map +1 -0
  55. package/dist/commands/whoami.js +24 -0
  56. package/dist/commands/whoami.js.map +1 -0
  57. package/dist/index.js +159 -10
  58. package/dist/index.js.map +1 -1
  59. package/dist/lib/advanced-setup.d.ts +78 -0
  60. package/dist/lib/advanced-setup.d.ts.map +1 -0
  61. package/dist/lib/advanced-setup.js +433 -0
  62. package/dist/lib/advanced-setup.js.map +1 -0
  63. package/dist/lib/agent-config.d.ts +33 -0
  64. package/dist/lib/agent-config.d.ts.map +1 -1
  65. package/dist/lib/agent-config.js +26 -0
  66. package/dist/lib/agent-config.js.map +1 -1
  67. package/dist/lib/counterfactual-training-bridge.d.ts +114 -0
  68. package/dist/lib/counterfactual-training-bridge.d.ts.map +1 -0
  69. package/dist/lib/counterfactual-training-bridge.js +322 -0
  70. package/dist/lib/counterfactual-training-bridge.js.map +1 -0
  71. package/dist/lib/discovery-agent.d.ts +48 -0
  72. package/dist/lib/discovery-agent.d.ts.map +1 -0
  73. package/dist/lib/discovery-agent.js +111 -0
  74. package/dist/lib/discovery-agent.js.map +1 -0
  75. package/dist/lib/flow-engine.d.ts.map +1 -1
  76. package/dist/lib/flow-engine.js +46 -8
  77. package/dist/lib/flow-engine.js.map +1 -1
  78. package/dist/lib/gtm-generator.d.ts +29 -0
  79. package/dist/lib/gtm-generator.d.ts.map +1 -0
  80. package/dist/lib/gtm-generator.js +252 -0
  81. package/dist/lib/gtm-generator.js.map +1 -0
  82. package/dist/lib/hub-health.d.ts +40 -0
  83. package/dist/lib/hub-health.d.ts.map +1 -0
  84. package/dist/lib/hub-health.js +89 -0
  85. package/dist/lib/hub-health.js.map +1 -0
  86. package/dist/lib/invariant-monitor.d.ts +6 -2
  87. package/dist/lib/invariant-monitor.d.ts.map +1 -1
  88. package/dist/lib/invariant-monitor.js +89 -2
  89. package/dist/lib/invariant-monitor.js.map +1 -1
  90. package/dist/lib/journal-analyzer.d.ts +71 -0
  91. package/dist/lib/journal-analyzer.d.ts.map +1 -0
  92. package/dist/lib/journal-analyzer.js +306 -0
  93. package/dist/lib/journal-analyzer.js.map +1 -0
  94. package/dist/lib/linear-client.d.ts +73 -0
  95. package/dist/lib/linear-client.d.ts.map +1 -0
  96. package/dist/lib/linear-client.js +112 -0
  97. package/dist/lib/linear-client.js.map +1 -0
  98. package/dist/lib/linear-id-map.d.ts +20 -0
  99. package/dist/lib/linear-id-map.d.ts.map +1 -0
  100. package/dist/lib/linear-id-map.js +57 -0
  101. package/dist/lib/linear-id-map.js.map +1 -0
  102. package/dist/lib/linear-kanban.d.ts +66 -0
  103. package/dist/lib/linear-kanban.d.ts.map +1 -0
  104. package/dist/lib/linear-kanban.js +175 -0
  105. package/dist/lib/linear-kanban.js.map +1 -0
  106. package/dist/lib/onboarding.d.ts +40 -0
  107. package/dist/lib/onboarding.d.ts.map +1 -0
  108. package/dist/lib/onboarding.js +213 -0
  109. package/dist/lib/onboarding.js.map +1 -0
  110. package/dist/lib/physical-world-model.d.ts +50 -0
  111. package/dist/lib/physical-world-model.d.ts.map +1 -0
  112. package/dist/lib/physical-world-model.js +251 -0
  113. package/dist/lib/physical-world-model.js.map +1 -0
  114. package/dist/lib/planning-loop.d.ts +157 -0
  115. package/dist/lib/planning-loop.d.ts.map +1 -0
  116. package/dist/lib/planning-loop.js +537 -0
  117. package/dist/lib/planning-loop.js.map +1 -0
  118. package/dist/lib/policy-head.d.ts +13 -0
  119. package/dist/lib/policy-head.d.ts.map +1 -1
  120. package/dist/lib/policy-head.js +168 -2
  121. package/dist/lib/policy-head.js.map +1 -1
  122. package/dist/lib/resource-optimizer-middleware.d.ts +39 -0
  123. package/dist/lib/resource-optimizer-middleware.d.ts.map +1 -0
  124. package/dist/lib/resource-optimizer-middleware.js +222 -0
  125. package/dist/lib/resource-optimizer-middleware.js.map +1 -0
  126. package/dist/lib/resource-optimizer.d.ts +71 -0
  127. package/dist/lib/resource-optimizer.d.ts.map +1 -0
  128. package/dist/lib/resource-optimizer.js +228 -0
  129. package/dist/lib/resource-optimizer.js.map +1 -0
  130. package/dist/lib/rl-manager.d.ts +74 -0
  131. package/dist/lib/rl-manager.d.ts.map +1 -0
  132. package/dist/lib/rl-manager.js +244 -0
  133. package/dist/lib/rl-manager.js.map +1 -0
  134. package/dist/lib/service-analyzer.d.ts +76 -0
  135. package/dist/lib/service-analyzer.d.ts.map +1 -0
  136. package/dist/lib/service-analyzer.js +704 -0
  137. package/dist/lib/service-analyzer.js.map +1 -0
  138. package/dist/lib/service-gtm.js +2 -2
  139. package/dist/lib/service-gtm.js.map +1 -1
  140. package/dist/lib/service-questionnaire.d.ts +11 -0
  141. package/dist/lib/service-questionnaire.d.ts.map +1 -0
  142. package/dist/lib/service-questionnaire.js +89 -0
  143. package/dist/lib/service-questionnaire.js.map +1 -0
  144. package/dist/lib/setup/agent-generator.d.ts +2 -0
  145. package/dist/lib/setup/agent-generator.d.ts.map +1 -1
  146. package/dist/lib/setup/agent-generator.js +128 -4
  147. package/dist/lib/setup/agent-generator.js.map +1 -1
  148. package/dist/lib/setup/flow-generator.d.ts +10 -0
  149. package/dist/lib/setup/flow-generator.d.ts.map +1 -0
  150. package/dist/lib/setup/flow-generator.js +113 -0
  151. package/dist/lib/setup/flow-generator.js.map +1 -0
  152. package/dist/lib/setup/invariant-bridge.d.ts +91 -0
  153. package/dist/lib/setup/invariant-bridge.d.ts.map +1 -0
  154. package/dist/lib/setup/invariant-bridge.js +384 -0
  155. package/dist/lib/setup/invariant-bridge.js.map +1 -0
  156. package/dist/lib/setup/spec-generator.d.ts +41 -5
  157. package/dist/lib/setup/spec-generator.d.ts.map +1 -1
  158. package/dist/lib/setup/spec-generator.js +503 -29
  159. package/dist/lib/setup/spec-generator.js.map +1 -1
  160. package/dist/lib/stratus-client.js +1 -1
  161. package/dist/lib/stratus-client.js.map +1 -1
  162. package/dist/lib/surface-agent.d.ts +78 -0
  163. package/dist/lib/surface-agent.d.ts.map +1 -0
  164. package/dist/lib/surface-agent.js +105 -0
  165. package/dist/lib/surface-agent.js.map +1 -0
  166. package/dist/lib/surface-coordination-example.d.ts +30 -0
  167. package/dist/lib/surface-coordination-example.d.ts.map +1 -0
  168. package/dist/lib/surface-coordination-example.js +164 -0
  169. package/dist/lib/surface-coordination-example.js.map +1 -0
  170. package/dist/lib/telemetry/physical-world-collector.d.ts +15 -0
  171. package/dist/lib/telemetry/physical-world-collector.d.ts.map +1 -0
  172. package/dist/lib/telemetry/physical-world-collector.js +177 -0
  173. package/dist/lib/telemetry/physical-world-collector.js.map +1 -0
  174. package/dist/lib/telemetry/training-bridge.d.ts +51 -0
  175. package/dist/lib/telemetry/training-bridge.d.ts.map +1 -0
  176. package/dist/lib/telemetry/training-bridge.js +185 -0
  177. package/dist/lib/telemetry/training-bridge.js.map +1 -0
  178. package/dist/lib/telemetry.d.ts +2 -1
  179. package/dist/lib/telemetry.d.ts.map +1 -1
  180. package/dist/lib/telemetry.js +23 -2
  181. package/dist/lib/telemetry.js.map +1 -1
  182. package/dist/lib/tenet-board-agent.d.ts +52 -0
  183. package/dist/lib/tenet-board-agent.d.ts.map +1 -0
  184. package/dist/lib/tenet-board-agent.js +226 -0
  185. package/dist/lib/tenet-board-agent.js.map +1 -0
  186. package/dist/lib/tenet-ide-agent.d.ts +40 -0
  187. package/dist/lib/tenet-ide-agent.d.ts.map +1 -0
  188. package/dist/lib/tenet-ide-agent.js +199 -0
  189. package/dist/lib/tenet-ide-agent.js.map +1 -0
  190. package/dist/lib/workspace/data-pipeline.d.ts.map +1 -1
  191. package/dist/lib/workspace/data-pipeline.js +27 -5
  192. package/dist/lib/workspace/data-pipeline.js.map +1 -1
  193. package/dist/lib/workspace/sidebar-runner.d.ts +13 -0
  194. package/dist/lib/workspace/sidebar-runner.d.ts.map +1 -0
  195. package/dist/lib/workspace/sidebar-runner.js +419 -0
  196. package/dist/lib/workspace/sidebar-runner.js.map +1 -0
  197. package/dist/lib/workspace/surface-registry.d.ts.map +1 -1
  198. package/dist/lib/workspace/surface-registry.js +4 -1
  199. package/dist/lib/workspace/surface-registry.js.map +1 -1
  200. package/dist/lib/workspace/surfaces/agent-overview.d.ts +3 -3
  201. package/dist/lib/workspace/surfaces/agent-overview.d.ts.map +1 -1
  202. package/dist/lib/workspace/surfaces/agent-overview.js +3 -3
  203. package/dist/lib/workspace/surfaces/agent-overview.js.map +1 -1
  204. package/dist/lib/workspace/surfaces/index.d.ts +3 -0
  205. package/dist/lib/workspace/surfaces/index.d.ts.map +1 -1
  206. package/dist/lib/workspace/surfaces/index.js +3 -0
  207. package/dist/lib/workspace/surfaces/index.js.map +1 -1
  208. package/dist/lib/workspace/surfaces/kanban.d.ts +15 -0
  209. package/dist/lib/workspace/surfaces/kanban.d.ts.map +1 -0
  210. package/dist/lib/workspace/surfaces/kanban.js +43 -0
  211. package/dist/lib/workspace/surfaces/kanban.js.map +1 -0
  212. package/dist/lib/workspace/surfaces/physical-world.d.ts +15 -0
  213. package/dist/lib/workspace/surfaces/physical-world.d.ts.map +1 -0
  214. package/dist/lib/workspace/surfaces/physical-world.js +37 -0
  215. package/dist/lib/workspace/surfaces/physical-world.js.map +1 -0
  216. package/dist/lib/workspace/surfaces/sidebar.d.ts +22 -0
  217. package/dist/lib/workspace/surfaces/sidebar.d.ts.map +1 -0
  218. package/dist/lib/workspace/surfaces/sidebar.js +90 -0
  219. package/dist/lib/workspace/surfaces/sidebar.js.map +1 -0
  220. package/dist/types/flows.d.ts +2 -1
  221. package/dist/types/flows.d.ts.map +1 -1
  222. package/dist/types/physical-world-model.d.ts +65 -0
  223. package/dist/types/physical-world-model.d.ts.map +1 -0
  224. package/dist/types/physical-world-model.js +43 -0
  225. package/dist/types/physical-world-model.js.map +1 -0
  226. package/dist/types/telemetry.d.ts +37 -0
  227. package/dist/types/telemetry.d.ts.map +1 -1
  228. package/dist/types/world-model.d.ts.map +1 -1
  229. package/dist/types/world-model.js +14 -7
  230. package/dist/types/world-model.js.map +1 -1
  231. package/dist/utils/context-hub-port.d.ts.map +1 -1
  232. package/dist/utils/context-hub-port.js +6 -1
  233. package/dist/utils/context-hub-port.js.map +1 -1
  234. package/package.json +3 -2
  235. package/packages/pi/extensions/index.ts +34 -6
  236. package/scripts/telemetry-dashboard.sh +44 -0
  237. package/scripts/test-planning-loop-e2e.ts +181 -0
  238. package/scripts/test-server-inference.ts +49 -0
  239. package/scripts/test-state-sensitivity.ts +32 -0
  240. package/scripts/train/v2/benchmark.py +661 -0
  241. package/scripts/train/v2/generate_balanced.py +439 -0
  242. package/scripts/train/v2/generate_hard_negatives.py +219 -0
  243. package/scripts/train/v2/infer.py +149 -36
  244. package/scripts/train/v2/infer_server.py +224 -0
  245. package/scripts/train/v2/online_train.py +576 -0
  246. package/scripts/train/v2/precompute.py +24 -6
  247. 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;YAkEH,WAAW;YA6GX,aAAa;IAqL3B,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;IAoBpB,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"}
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"}